s3: Try to avoid dns searches with an empty site
[ira/wip.git] / source3 / libsmb / samlogon_cache.c
index 235880910cdaca423de4a261d73674fb3ecb0988..c96f5dad8316fe8ec713aa2796f34e58408d8db5 100644 (file)
@@ -22,6 +22,7 @@
 */
 
 #include "includes.h"
+#include "librpc/gen_ndr/ndr_krb5pac.h"
 
 #define NETSAMLOGON_TDB        "netsamlogon_cache.tdb"
 
@@ -34,7 +35,7 @@ static TDB_CONTEXT *netsamlogon_tdb = NULL;
 bool netsamlogon_cache_init(void)
 {
        if (!netsamlogon_tdb) {
-               netsamlogon_tdb = tdb_open_log(lock_path(NETSAMLOGON_TDB), 0,
+               netsamlogon_tdb = tdb_open_log(cache_path(NETSAMLOGON_TDB), 0,
                                               TDB_DEFAULT, O_RDWR | O_CREAT, 0600);
        }
 
@@ -59,48 +60,30 @@ bool netsamlogon_cache_shutdown(void)
  Clear cache getpwnam and getgroups entries from the winbindd cache
 ***********************************************************************/
 
-void netsamlogon_clear_cached_user(TDB_CONTEXT *tdb, struct netr_SamInfo3 *info3)
+void netsamlogon_clear_cached_user(struct netr_SamInfo3 *info3)
 {
-       bool got_tdb = false;
-       DOM_SID sid;
-       fstring key_str, sid_string;
-
-       /* We may need to call this function from smbd which will not have
-          winbindd_cache.tdb open.  Open the tdb if a NULL is passed. */
-
-       if (!tdb) {
-               tdb = tdb_open_log(lock_path("winbindd_cache.tdb"),
-                                  WINBINDD_CACHE_TDB_DEFAULT_HASH_SIZE,
-                                  TDB_DEFAULT, O_RDWR, 0600);
-               if (!tdb) {
-                       DEBUG(5, ("netsamlogon_clear_cached_user: failed to open cache\n"));
-                       return;
-               }
-               got_tdb = true;
-       }
-
-       sid_copy(&sid, info3->base.domain_sid);
-       sid_append_rid(&sid, info3->base.rid);
-
-       /* Clear U/SID cache entry */
-
-       fstr_sprintf(key_str, "U/%s", sid_to_fstring(sid_string, &sid));
-
-       DEBUG(10, ("netsamlogon_clear_cached_user: clearing %s\n", key_str));
-
-       tdb_delete(tdb, string_tdb_data(key_str));
+       DOM_SID user_sid;
+       fstring keystr, tmp;
 
-       /* Clear UG/SID cache entry */
+       if (!info3) {
+               return;
+       }
 
-       fstr_sprintf(key_str, "UG/%s", sid_to_fstring(sid_string, &sid));
+       if (!netsamlogon_cache_init()) {
+               DEBUG(0,("netsamlogon_clear_cached_user: cannot open "
+                       "%s for write!\n",
+                       NETSAMLOGON_TDB));
+               return;
+       }
+       sid_copy(&user_sid, info3->base.domain_sid);
+       sid_append_rid(&user_sid, info3->base.rid);
 
-       DEBUG(10, ("netsamlogon_clear_cached_user: clearing %s\n", key_str));
+       /* Prepare key as DOMAIN-SID/USER-RID string */
+       slprintf(keystr, sizeof(keystr), "%s", sid_to_fstring(tmp, &user_sid));
 
-       tdb_delete(tdb, string_tdb_data(key_str));
+       DEBUG(10,("netsamlogon_clear_cached_user: SID [%s]\n", keystr));
 
-       if (got_tdb) {
-               tdb_close(tdb);
-       }
+       tdb_delete_bystring(netsamlogon_tdb, keystr);
 }
 
 /***********************************************************************
@@ -159,7 +142,7 @@ bool netsamlogon_cache_store(const char *username, struct netr_SamInfo3 *info3)
                NDR_PRINT_DEBUG(netsamlogoncache_entry, &r);
        }
 
-       ndr_err = ndr_push_struct_blob(&blob, mem_ctx, &r,
+       ndr_err = ndr_push_struct_blob(&blob, mem_ctx, NULL, &r,
                                       (ndr_push_flags_fn_t)ndr_push_netsamlogoncache_entry);
        if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
                DEBUG(0,("netsamlogon_cache_store: failed to push entry to cache\n"));
@@ -213,10 +196,9 @@ struct netr_SamInfo3 *netsamlogon_cache_get(TALLOC_CTX *mem_ctx, const DOM_SID *
                goto done;
        }
 
-       blob.data = (uint8 *)data.dptr;
-       blob.length = data.dsize;
+       blob = data_blob_const(data.dptr, data.dsize);
 
-       ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, &r,
+       ndr_err = ndr_pull_struct_blob(&blob, mem_ctx, NULL, &r,
                                      (ndr_pull_flags_fn_t)ndr_pull_netsamlogoncache_entry);
 
        if (DEBUGLEVEL >= 10) {