]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/back-ldap.h
pool privileged connections (ITS#4791)
[openldap] / servers / slapd / back-ldap / back-ldap.h
index 6fbabaec5e2ace1ee58ea104a61f4a194893b1a1..12cc7fa41430d894be4aa1ac46041b6c1569c853 100644 (file)
@@ -44,22 +44,57 @@ typedef struct ldap_monitor_info_t {
        struct berval           lmi_more_filter;
 } ldap_monitor_info_t;
 
+enum {
+       /* even numbers are connection types */
+       LDAP_BACK_PCONN_FIRST = 0,
+       LDAP_BACK_PCONN_ROOTDN = LDAP_BACK_PCONN_FIRST,
+       LDAP_BACK_PCONN_ANON = 2,
+       LDAP_BACK_PCONN_BIND = 4,
+
+       /* add the TLS bit */
+       LDAP_BACK_PCONN_TLS = 0x1U,
+
+       LDAP_BACK_PCONN_ROOTDN_TLS = (LDAP_BACK_PCONN_ROOTDN|LDAP_BACK_PCONN_TLS),
+       LDAP_BACK_PCONN_ANON_TLS = (LDAP_BACK_PCONN_ANON|LDAP_BACK_PCONN_TLS),
+       LDAP_BACK_PCONN_BIND_TLS = (LDAP_BACK_PCONN_BIND|LDAP_BACK_PCONN_TLS),
+
+       LDAP_BACK_PCONN_LAST
+};
+
 typedef struct ldapconn_t {
        Connection              *lc_conn;
-#define        LDAP_BACK_PCONN                 ((void *)0x0)
-#define        LDAP_BACK_PCONN_TLS             ((void *)0x1)
-#define        LDAP_BACK_PCONN_BIND            ((void *)0x2)
-#define        LDAP_BACK_PCONN_BIND_TLS        ((void *)0x3)
-#define        LDAP_BACK_PCONN_LAST            ((void *)0x4)
-#define LDAP_BACK_PCONN_ISPRIV(lc)     ((void *)(lc)->lc_conn < LDAP_BACK_PCONN_LAST)
-#define        LDAP_BACK_PCONN_ID(lc)          (LDAP_BACK_PCONN_ISPRIV((lc)) ? ( -1 - (long)(lc)->lc_conn ): (lc)->lc_conn->c_connid )
+#define        LDAP_BACK_CONN2PRIV(lc)         ((unsigned long)(lc)->lc_conn)
+#define LDAP_BACK_PCONN_ISPRIV(lc)     ((void *)(lc)->lc_conn >= (void *)LDAP_BACK_PCONN_FIRST \
+                                               && (void *)(lc)->lc_conn < (void *)LDAP_BACK_PCONN_LAST)
+#define LDAP_BACK_PCONN_ISROOTDN(lc)   (LDAP_BACK_PCONN_ISPRIV((lc)) \
+                                               && (LDAP_BACK_CONN2PRIV((lc)) < LDAP_BACK_PCONN_ANON))
+#define LDAP_BACK_PCONN_ISANON(lc)     (LDAP_BACK_PCONN_ISPRIV((lc)) \
+                                               && (LDAP_BACK_CONN2PRIV((lc)) < LDAP_BACK_PCONN_BIND) \
+                                               && (LDAP_BACK_CONN2PRIV((lc)) >= LDAP_BACK_PCONN_ANON))
+#define LDAP_BACK_PCONN_ISBIND(lc)     (LDAP_BACK_PCONN_ISPRIV((lc)) \
+                                               && (LDAP_BACK_CONN2PRIV((lc)) >= LDAP_BACK_PCONN_BIND))
+#define LDAP_BACK_PCONN_ISTLS(lc)      (LDAP_BACK_PCONN_ISPRIV((lc)) \
+                                               && (LDAP_BACK_CONN2PRIV((lc)) & LDAP_BACK_PCONN_TLS))
+#define        LDAP_BACK_PCONN_ID(lc)          (LDAP_BACK_PCONN_ISPRIV((lc)) ? \
+                                               ( -1 - (long)(lc)->lc_conn ) : (lc)->lc_conn->c_connid )
 #ifdef HAVE_TLS
-#define        LDAP_BACK_PCONN_SET(op)         ((op)->o_conn->c_is_tls ? LDAP_BACK_PCONN_TLS : LDAP_BACK_PCONN)
-#define        LDAP_BACK_PCONN_BIND_SET(op)    ((op)->o_conn->c_is_tls ? LDAP_BACK_PCONN_BIND_TLS : LDAP_BACK_PCONN_BIND)
+#define        LDAP_BACK_PCONN_ROOTDN_SET(lc, op) \
+       ((lc)->lc_conn = (void *)((op)->o_conn->c_is_tls ? LDAP_BACK_PCONN_ROOTDN_TLS : LDAP_BACK_PCONN_ROOTDN))
+#define        LDAP_BACK_PCONN_ANON_SET(lc, op) \
+       ((lc)->lc_conn = (void *)((op)->o_conn->c_is_tls ? LDAP_BACK_PCONN_ANON_TLS : LDAP_BACK_PCONN_ANON))
+#define        LDAP_BACK_PCONN_BIND_SET(lc, op) \
+       ((lc)->lc_conn = (void *)((op)->o_conn->c_is_tls ? LDAP_BACK_PCONN_BIND_TLS : LDAP_BACK_PCONN_BIND))
 #else /* ! HAVE_TLS */
-#define        LDAP_BACK_PCONN_SET(op)         (LDAP_BACK_PCONN)
-#define        LDAP_BACK_PCONN_BIND_SET(op)    (LDAP_BACK_PCONN_BIND)
+#define        LDAP_BACK_PCONN_ROOTDN_SET(lc, op) \
+       ((lc)->lc_conn = (void *)LDAP_BACK_PCONN_ROOTDN)
+#define        LDAP_BACK_PCONN_ANON_SET(lc, op) \
+       ((lc)->lc_conn = (void *)LDAP_BACK_PCONN_ANON)
+#define        LDAP_BACK_PCONN_BIND_SET(lc, op) \
+       ((lc)->lc_conn = (void *)LDAP_BACK_PCONN_BIND)
 #endif /* ! HAVE_TLS */
+#define        LDAP_BACK_PCONN_SET(lc, op) \
+       (BER_BVISEMPTY(&(op)->o_ndn) ? \
+               LDAP_BACK_PCONN_ANON_SET((lc), (op)) : LDAP_BACK_PCONN_ROOTDN_SET((lc), (op)))
 
        LDAP                    *lc_ld;
        struct berval           lc_cred;
@@ -93,6 +128,7 @@ typedef struct ldapconn_t {
 #define        LDAP_BACK_FCONN_BINDING (0x00000010U)
 #define        LDAP_BACK_FCONN_TAINTED (0x00000020U)
 #define        LDAP_BACK_FCONN_ISIDASR (0x00000040U)
+#define        LDAP_BACK_FCONN_CACHED  (0x00000080U)
 
 #define        LDAP_BACK_CONN_ISBOUND(lc)              LDAP_BACK_CONN_ISSET((lc), LDAP_BACK_FCONN_ISBOUND)
 #define        LDAP_BACK_CONN_ISBOUND_SET(lc)          LDAP_BACK_CONN_SET((lc), LDAP_BACK_FCONN_ISBOUND)
@@ -120,12 +156,17 @@ typedef struct ldapconn_t {
 #define        LDAP_BACK_CONN_ISIDASSERT_SET(lc)       LDAP_BACK_CONN_SET((lc), LDAP_BACK_FCONN_ISIDASR)
 #define        LDAP_BACK_CONN_ISIDASSERT_CLEAR(lc)     LDAP_BACK_CONN_CLEAR((lc), LDAP_BACK_FCONN_ISIDASR)
 #define        LDAP_BACK_CONN_ISIDASSERT_CPY(lc, mlc)  LDAP_BACK_CONN_CPY((lc), LDAP_BACK_FCONN_ISIDASR, (mlc))
+#define        LDAP_BACK_CONN_CACHED(lc)               LDAP_BACK_CONN_ISSET((lc), LDAP_BACK_FCONN_CACHED)
+#define        LDAP_BACK_CONN_CACHED_SET(lc)           LDAP_BACK_CONN_SET((lc), LDAP_BACK_FCONN_CACHED)
+#define        LDAP_BACK_CONN_CACHED_CLEAR(lc)         LDAP_BACK_CONN_CLEAR((lc), LDAP_BACK_FCONN_CACHED)
 
        unsigned                lc_refcnt;
        unsigned                lc_binding;
        unsigned                lc_flags;
        time_t                  lc_create_time;
        time_t                  lc_time;
+
+       LDAP_TAILQ_ENTRY(ldapconn_t)    lc_q;
 } ldapconn_t;
 
 typedef struct ldap_avl_info_t {
@@ -259,8 +300,11 @@ typedef struct ldapinfo_t {
 #define        LDAP_BACK_F_CANCEL_MASK         (LDAP_BACK_F_CANCEL_IGNORE|LDAP_BACK_F_CANCEL_EXOP)
 #define        LDAP_BACK_F_CANCEL_MASK2        (LDAP_BACK_F_CANCEL_MASK|LDAP_BACK_F_CANCEL_EXOP_DISCOVER)
 
-#define        LDAP_BACK_ISSET(li,f)           ( ( (li)->li_flags & (f) ) == (f) )
-#define        LDAP_BACK_ISMASK(li,m,f)        ( ( (li)->li_flags & (m) ) == (f) )
+#define        LDAP_BACK_ISSET_F(ff,f)         ( ( (ff) & (f) ) == (f) )
+#define        LDAP_BACK_ISMASK_F(ff,m,f)      ( ( (ff) & (m) ) == (f) )
+
+#define        LDAP_BACK_ISSET(li,f)           LDAP_BACK_ISSET_F( (li)->li_flags, (f) )
+#define        LDAP_BACK_ISMASK(li,m,f)        LDAP_BACK_ISMASK_F( (li)->li_flags, (m), (f) )
 
 #define LDAP_BACK_SAVECRED(li)         LDAP_BACK_ISSET( (li), LDAP_BACK_F_SAVECRED )
 #define LDAP_BACK_USE_TLS(li)          LDAP_BACK_ISSET( (li), LDAP_BACK_F_USE_TLS )
@@ -269,6 +313,10 @@ typedef struct ldapinfo_t {
 #define LDAP_BACK_CHASE_REFERRALS(li)  LDAP_BACK_ISSET( (li), LDAP_BACK_F_CHASE_REFERRALS )
 #define LDAP_BACK_PROXY_WHOAMI(li)     LDAP_BACK_ISSET( (li), LDAP_BACK_F_PROXY_WHOAMI )
 
+#define LDAP_BACK_USE_TLS_F(ff)                LDAP_BACK_ISSET_F( (ff), LDAP_BACK_F_USE_TLS )
+#define LDAP_BACK_PROPAGATE_TLS_F(ff)  LDAP_BACK_ISSET_F( (ff), LDAP_BACK_F_PROPAGATE_TLS )
+#define LDAP_BACK_TLS_CRITICAL_F(ff)   LDAP_BACK_ISSET_F( (ff), LDAP_BACK_F_TLS_CRITICAL )
+
 #define        LDAP_BACK_T_F(li)               LDAP_BACK_ISMASK( (li), LDAP_BACK_F_T_F_MASK, LDAP_BACK_F_T_F )
 #define        LDAP_BACK_T_F_DISCOVER(li)      LDAP_BACK_ISMASK( (li), LDAP_BACK_F_T_F_MASK2, LDAP_BACK_F_T_F_DISCOVER )
 
@@ -285,10 +333,23 @@ typedef struct ldapinfo_t {
 
        int             li_version;
 
+       /* cached connections; 
+        * special conns are in tailq rather than in tree */
        ldap_avl_info_t li_conninfo;
 
        ldap_monitor_info_t     li_monitor_info;
 
+       struct {
+               int                                             lic_num;
+               LDAP_TAILQ_HEAD(lc_conn_priv_q, ldapconn_t)     lic_priv;
+       }               li_conn_priv[ LDAP_BACK_PCONN_LAST ];
+       int             li_conn_priv_max;
+#define        LDAP_BACK_CONN_PRIV_MIN         (1)
+#define        LDAP_BACK_CONN_PRIV_MAX         (256)
+       /* must be between LDAP_BACK_CONN_PRIV_MIN
+        * and LDAP_BACK_CONN_PRIV_MAX ! */
+#define        LDAP_BACK_CONN_PRIV_DEFAULT     (16)
+
        sig_atomic_t            li_isquarantined;
 #define        LDAP_BACK_FQ_NO         (0)
 #define        LDAP_BACK_FQ_YES        (1)