From 716f7245d99d17b7b3e6bda05dc2edf7334463a5 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Sat, 9 Sep 2006 22:27:06 +0000 Subject: [PATCH] r18313: Nobody said "no" (yet.... gd?), so commit it: Remove the account_policy_migrated() thingy, and make cache_account_policy_set use gencache. Account policies are now handled like groups and users are with respect to "passdb backend". Volker (This used to be commit fa8b2e2a585ab0c00a5fbde7aa790043261caf2e) --- source3/lib/account_pol.c | 167 ++++++++++---------------------------- source3/passdb/pdb_ldap.c | 10 --- source3/utils/pdbedit.c | 12 --- 3 files changed, 42 insertions(+), 147 deletions(-) diff --git a/source3/lib/account_pol.c b/source3/lib/account_pol.c index e6ef8dbbe4b..4cb0b77e746 100644 --- a/source3/lib/account_pol.c +++ b/source3/lib/account_pol.c @@ -28,7 +28,6 @@ static TDB_CONTEXT *tdb; * ldap directly) - gd */ #define DATABASE_VERSION 3 -#define AP_LASTSET "LAST_CACHE_UPDATE" #define AP_TTL 60 @@ -168,50 +167,6 @@ int account_policy_name_to_fieldnum(const char *name) return 0; } -/***************************************************************************** -Update LAST-Set counter inside the cache -*****************************************************************************/ - -static BOOL account_policy_cache_timestamp(uint32 *value, BOOL update, - const char *ap_name) -{ - pstring key; - uint32 val = 0; - time_t now; - - if (ap_name == NULL) - return False; - - slprintf(key, sizeof(key)-1, "%s/%s", ap_name, AP_LASTSET); - - if (!init_account_policy()) { - return False; - } - - if (!tdb_fetch_uint32(tdb, key, &val) && !update) { - DEBUG(10,("failed to get last set timestamp of cache\n")); - return False; - } - - *value = val; - - DEBUG(10, ("account policy cache lastset was: %s\n", http_timestring(val))); - - if (update) { - - now = time(NULL); - - if (!tdb_store_uint32(tdb, key, (uint32)now)) { - DEBUG(1, ("tdb_store_uint32 failed for %s\n", key)); - return False; - } - DEBUG(10, ("account policy cache lastset now: %s\n", http_timestring(now))); - *value = now; - } - - return True; -} - /***************************************************************************** Get default value for account policy *****************************************************************************/ @@ -269,11 +224,6 @@ BOOL init_account_policy(void) DEBUG(0,("Failed to open account policy database\n")); return False; } - /* creation was successful */ - /* add AP_MIGRATED_TO_PASSDB speacial key */ - /* so that you do not need to migrate policies */ - /* on brand new servers as it does not make sense */ - account_policy_migrated(True); } /* handle a Samba upgrade */ @@ -319,7 +269,7 @@ Get an account policy (from tdb) BOOL account_policy_get(int field, uint32 *value) { - fstring name; + const char *name; uint32 regval; if (!init_account_policy()) { @@ -330,8 +280,8 @@ BOOL account_policy_get(int field, uint32 *value) *value = 0; } - fstrcpy(name, decode_account_policy_name(field)); - if (!*name) { + name = decode_account_policy_name(field); + if (name == NULL) { DEBUG(1, ("account_policy_get: Field %d is not a valid account policy type! Cannot get, returning 0.\n", field)); return False; } @@ -356,14 +306,14 @@ Set an account policy (in tdb) BOOL account_policy_set(int field, uint32 value) { - fstring name; + const char *name; if (!init_account_policy()) { return False; } - fstrcpy(name, decode_account_policy_name(field)); - if (!*name) { + name = decode_account_policy_name(field); + if (name == NULL) { DEBUG(1, ("Field %d is not a valid account policy type! Cannot set.\n", field)); return False; } @@ -384,8 +334,10 @@ Set an account policy in the cache BOOL cache_account_policy_set(int field, uint32 value) { - uint32 lastset; const char *policy_name = NULL; + char *cache_key = NULL; + char *cache_value = NULL; + BOOL ret = False; policy_name = decode_account_policy_name(field); if (policy_name == NULL) { @@ -393,94 +345,59 @@ BOOL cache_account_policy_set(int field, uint32 value) return False; } - DEBUG(10,("cache_account_policy_set: updating account pol cache\n")); - - if (!account_policy_set(field, value)) { - return False; - } - - if (!account_policy_cache_timestamp(&lastset, True, policy_name)) - { - DEBUG(10,("cache_account_policy_set: failed to get lastest cache update timestamp\n")); - return False; - } - - DEBUG(10,("cache_account_policy_set: cache valid until: %s\n", http_timestring(lastset+AP_TTL))); - - return True; -} - -/***************************************************************************** -Check whether account policies have been migrated to passdb -*****************************************************************************/ - -BOOL account_policy_migrated(BOOL init) -{ - pstring key; - uint32 val; - time_t now; - - slprintf(key, sizeof(key)-1, "AP_MIGRATED_TO_PASSDB"); - - if (!init_account_policy()) { - return False; - } - - if (init) { - now = time(NULL); - - if (!tdb_store_uint32(tdb, key, (uint32)now)) { - DEBUG(1, ("tdb_store_uint32 failed for %s\n", key)); - return False; - } - - return True; + if (asprintf(&cache_key, "ACCT_POL/%s", policy_name) < 0) { + DEBUG(0, ("asprintf failed\n")); + goto done; } - if (!tdb_fetch_uint32(tdb, key, &val)) { - return False; + if (asprintf(&cache_value, "%lu\n", (unsigned long)value) < 0) { + DEBUG(0, ("asprintf failed\n")); + goto done; } - return True; -} + DEBUG(10,("cache_account_policy_set: updating account pol cache\n")); -/***************************************************************************** - Remove marker that informs that account policies have been migrated to passdb -*****************************************************************************/ + ret = gencache_set(cache_key, cache_value, time(NULL)+AP_TTL); -BOOL remove_account_policy_migrated(void) -{ - if (!init_account_policy()) { - return False; - } - - return tdb_delete_bystring(tdb, "AP_MIGRATED_TO_PASSDB"); + done: + SAFE_FREE(cache_key); + SAFE_FREE(cache_value); + return ret; } - /***************************************************************************** Get an account policy from the cache *****************************************************************************/ BOOL cache_account_policy_get(int field, uint32 *value) { - uint32 lastset; + const char *policy_name = NULL; + char *cache_key = NULL; + char *cache_value = NULL; + BOOL ret = False; - if (!account_policy_cache_timestamp(&lastset, False, - decode_account_policy_name(field))) - { - DEBUG(10,("cache_account_policy_get: failed to get latest cache update timestamp\n")); + policy_name = decode_account_policy_name(field); + if (policy_name == NULL) { + DEBUG(0,("cache_account_policy_set: no policy found\n")); return False; } - if ((lastset + AP_TTL) < (uint32)time(NULL) ) { - DEBUG(10,("cache_account_policy_get: no valid cache entry (cache expired)\n")); - return False; - } + if (asprintf(&cache_key, "ACCT_POL/%s", policy_name) < 0) { + DEBUG(0, ("asprintf failed\n")); + goto done; + } - return account_policy_get(field, value); -} + if (gencache_get(cache_key, &cache_value, NULL)) { + uint32 tmp = strtoul(cache_value, NULL, 10); + *value = tmp; + ret = True; + } + done: + SAFE_FREE(cache_key); + SAFE_FREE(cache_value); + return ret; +} /**************************************************************************** ****************************************************************************/ diff --git a/source3/passdb/pdb_ldap.c b/source3/passdb/pdb_ldap.c index 865bcdfc9fe..e0f79c140dd 100644 --- a/source3/passdb/pdb_ldap.c +++ b/source3/passdb/pdb_ldap.c @@ -3495,11 +3495,6 @@ static NTSTATUS ldapsam_set_account_policy_in_ldap(struct pdb_methods *methods, static NTSTATUS ldapsam_set_account_policy(struct pdb_methods *methods, int policy_index, uint32 value) { - if (!account_policy_migrated(False)) { - return (account_policy_set(policy_index, value)) ? - NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; - } - return ldapsam_set_account_policy_in_ldap(methods, policy_index, value); } @@ -3588,11 +3583,6 @@ static NTSTATUS ldapsam_get_account_policy(struct pdb_methods *methods, { NTSTATUS ntstatus = NT_STATUS_UNSUCCESSFUL; - if (!account_policy_migrated(False)) { - return (account_policy_get(policy_index, value)) - ? NT_STATUS_OK : NT_STATUS_UNSUCCESSFUL; - } - if (cache_account_policy_get(policy_index, value)) { DEBUG(11,("ldapsam_get_account_policy: got valid value from " "cache\n")); diff --git a/source3/utils/pdbedit.c b/source3/utils/pdbedit.c index 0a6fb7e8bec..0ebe022e18a 100644 --- a/source3/utils/pdbedit.c +++ b/source3/utils/pdbedit.c @@ -176,11 +176,6 @@ static int reinit_account_policies (void) } } - if (!remove_account_policy_migrated()) { - fprintf(stderr, "Can't remove marker from tdb\n"); - return -1; - } - return 0; } @@ -193,11 +188,6 @@ static int export_account_policies (struct pdb_methods *in, struct pdb_methods * { int i; - if (!account_policy_migrated(True)) { - fprintf(stderr, "Unable to set account policy marker in tdb\n"); - return -1; - } - for ( i=1; decode_account_policy_name(i) != NULL; i++ ) { uint32 policy_value; NTSTATUS status; @@ -206,7 +196,6 @@ static int export_account_policies (struct pdb_methods *in, struct pdb_methods * if ( NT_STATUS_IS_ERR(status) ) { fprintf(stderr, "Unable to get account policy from %s\n", in->name); - remove_account_policy_migrated(); return -1; } @@ -214,7 +203,6 @@ static int export_account_policies (struct pdb_methods *in, struct pdb_methods * if ( NT_STATUS_IS_ERR(status) ) { fprintf(stderr, "Unable to migrate account policy to %s\n", out->name); - remove_account_policy_migrated(); return -1; } } -- 2.34.1