r18313: Nobody said "no" (yet.... gd?), so commit it:
authorVolker Lendecke <vlendec@samba.org>
Sat, 9 Sep 2006 22:27:06 +0000 (22:27 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:51:19 +0000 (11:51 -0500)
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

source/lib/account_pol.c
source/passdb/pdb_ldap.c
source/utils/pdbedit.c

index e6ef8dbbe4b3be3b93bed9d06aae54fc6fd118f2..4cb0b77e74666a35b0c8c10fc9cce7c7fbc31784 100644 (file)
@@ -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;
+}
 
 /****************************************************************************
 ****************************************************************************/
index 865bcdfc9fe4e6401071b998ab35a912850c4a0c..e0f79c140dd6193f9b1f88121fcbb9ae3fd09c93 100644 (file)
@@ -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"));
index 0a6fb7e8bec82fd0020b86e8bf0f3c0a9543a30d..0ebe022e18aa2829250eb9a48afbad68d1769e08 100644 (file)
@@ -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;
                }
        }