s3: Always cache idmapping results of pdb backend.
authorAlexander Werth <alexander.werth@de.ibm.com>
Fri, 25 Apr 2014 11:53:48 +0000 (13:53 +0200)
committerMichael Adam <obnox@samba.org>
Sat, 3 May 2014 02:14:05 +0000 (04:14 +0200)
And don't cache in the pdb_ldap module on the id_to_sid calls.

Signed-off-by: Alexander Werth <alexander.werth@de.ibm.com>
Reviewed-by: Alexander Bokovoy <ab@samba.org>
Reviewed-by: Michael Adam <obnox@samba.org>
Autobuild-User(master): Michael Adam <obnox@samba.org>
Autobuild-Date(master): Sat May  3 04:14:05 CEST 2014 on sn-devel-104

source3/passdb/pdb_interface.c
source3/passdb/pdb_ldap.c

index 7a0a824ba211437598ff1b189455e89ea1f146b7..a984fcb0b34e4d93815a6c4efa9ff025490ee527 100644 (file)
@@ -35,6 +35,7 @@
 #include "../lib/util/util_pw.h"
 #include "passdb/pdb_secrets.h"
 #include "lib/util_sid_passdb.h"
+#include "idmap_cache.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_PASSDB
@@ -1206,25 +1207,54 @@ bool pdb_get_seq_num(time_t *seq_num)
 bool pdb_uid_to_sid(uid_t uid, struct dom_sid *sid)
 {
        struct pdb_methods *pdb = pdb_get_methods();
-       return pdb->uid_to_sid(pdb, uid, sid);
+       bool ret;
+
+       ret = pdb->uid_to_sid(pdb, uid, sid);
+
+       if (ret == true) {
+               struct unixid id;
+               id.id = uid;
+               id.type = ID_TYPE_UID;
+               idmap_cache_set_sid2unixid(sid, &id);
+       }
+
+       return ret;
 }
 
 bool pdb_gid_to_sid(gid_t gid, struct dom_sid *sid)
 {
        struct pdb_methods *pdb = pdb_get_methods();
-       return pdb->gid_to_sid(pdb, gid, sid);
+       bool ret;
+
+       ret = pdb->gid_to_sid(pdb, gid, sid);
+
+       if (ret == true) {
+               struct unixid id;
+               id.id = gid;
+               id.type = ID_TYPE_GID;
+               idmap_cache_set_sid2unixid(sid, &id);
+       }
+
+       return ret;
 }
 
 bool pdb_sid_to_id(const struct dom_sid *sid, struct unixid *id)
 {
        struct pdb_methods *pdb = pdb_get_methods();
+       bool ret;
 
        /* only ask the backend if it is responsible */
        if (!sid_check_object_is_for_passdb(sid)) {
                return false;
        }
 
-       return pdb->sid_to_id(pdb, sid, id);
+       ret = pdb->sid_to_id(pdb, sid, id);
+
+       if (ret == true) {
+               idmap_cache_set_sid2unixid(sid, id);
+       }
+
+       return ret;
 }
 
 uint32_t pdb_capabilities(void)
index cea8627d7cc74a3913c9e573f912bd855fc81af0..7dccc03709406d82261d61814076d02d06161232 100644 (file)
@@ -4970,7 +4970,6 @@ static bool ldapsam_sid_to_id(struct pdb_methods *methods,
 
                id->id = strtoul(gid_str, NULL, 10);
                id->type = ID_TYPE_GID;
-               idmap_cache_set_sid2unixid(sid, id);
                ret = True;
                goto done;
        }
@@ -4987,7 +4986,6 @@ static bool ldapsam_sid_to_id(struct pdb_methods *methods,
 
        id->id = strtoul(value, NULL, 10);
        id->type = ID_TYPE_UID;
-       idmap_cache_set_sid2unixid(sid, id);
 
        ret = True;
  done:
@@ -5013,7 +5011,6 @@ static bool ldapsam_uid_to_sid(struct pdb_methods *methods, uid_t uid,
        struct dom_sid user_sid;
        int rc;
        TALLOC_CTX *tmp_ctx = talloc_stackframe();
-       struct unixid id;
 
        filter = talloc_asprintf(tmp_ctx,
                                 "(&(uidNumber=%u)"
@@ -5058,11 +5055,6 @@ static bool ldapsam_uid_to_sid(struct pdb_methods *methods, uid_t uid,
 
        sid_copy(sid, &user_sid);
 
-       id.id = uid;
-       id.type = ID_TYPE_UID;
-
-       idmap_cache_set_sid2unixid(sid, &id);
-
        ret = true;
 
  done:
@@ -5088,7 +5080,6 @@ static bool ldapsam_gid_to_sid(struct pdb_methods *methods, gid_t gid,
        struct dom_sid group_sid;
        int rc;
        TALLOC_CTX *tmp_ctx = talloc_stackframe();
-       struct unixid id;
 
        filter = talloc_asprintf(tmp_ctx,
                                 "(&(gidNumber=%u)"
@@ -5131,11 +5122,6 @@ static bool ldapsam_gid_to_sid(struct pdb_methods *methods, gid_t gid,
 
        sid_copy(sid, &group_sid);
 
-       id.id = gid;
-       id.type = ID_TYPE_GID;
-
-       idmap_cache_set_sid2unixid(sid, &id);
-
        ret = true;
 
  done: