Removed version number from file header.
[kai/samba.git] / source3 / passdb / secrets.c
index d8d5c5b64a707596597704432566c0366fefa4b7..89f67cb5b7de9d0c27889ffe69c3539aa4354083 100644 (file)
@@ -1,6 +1,5 @@
 /* 
-   Unix SMB/Netbios implementation.
-   Version 3.0.
+   Unix SMB/CIFS implementation.
    Copyright (C) Andrew Tridgell 1992-2001
    
    This program is free software; you can redistribute it and/or modify
@@ -51,6 +50,7 @@ BOOL secrets_init(void)
 void *secrets_fetch(char *key, size_t *size)
 {
        TDB_DATA kbuf, dbuf;
+       secrets_init();
        if (!tdb)
                return NULL;
        kbuf.dptr = key;
@@ -66,6 +66,7 @@ void *secrets_fetch(char *key, size_t *size)
 BOOL secrets_store(char *key, void *data, size_t size)
 {
        TDB_DATA kbuf, dbuf;
+       secrets_init();
        if (!tdb)
                return False;
        kbuf.dptr = key;
@@ -81,6 +82,7 @@ BOOL secrets_store(char *key, void *data, size_t size)
 BOOL secrets_delete(char *key)
 {
        TDB_DATA kbuf;
+       secrets_init();
        if (!tdb)
                return False;
        kbuf.dptr = key;
@@ -152,9 +154,15 @@ BOOL secrets_fetch_trust_account_password(char *domain, uint8 ret_pwd[16],
                return True;
        }
 
-       if (!(pass = secrets_fetch(trust_keystr(domain), &size)) || 
-           size != sizeof(*pass))
+       if (!(pass = secrets_fetch(trust_keystr(domain), &size))) {
+               DEBUG(5, ("secrets_fetch failed!\n"));
                return False;
+       }
+       
+       if (size != sizeof(*pass)) {
+               DEBUG(0, ("secrets were of incorrect size!\n"));
+               return False;
+       }
 
        if (pass_last_set_time) *pass_last_set_time = pass->mod_time;
        memcpy(ret_pwd, pass->hash, 16);
@@ -216,6 +224,8 @@ void reset_globals_after_fork(void)
 {
        unsigned char dummy;
 
+       secrets_init();
+
        /*
         * Increment the global seed value to ensure every smbd starts
         * with a new random seed.
@@ -223,7 +233,7 @@ void reset_globals_after_fork(void)
 
        if (tdb) {
                uint32 initial_val = sys_getpid();
-               tdb_change_int_atomic(tdb, "INFO/random_seed", (int *)&initial_val, 1);
+               tdb_change_int32_atomic(tdb, "INFO/random_seed", (int *)&initial_val, 1);
                set_rand_reseed_data((unsigned char *)&initial_val, sizeof(initial_val));
        }
 
@@ -234,3 +244,44 @@ void reset_globals_after_fork(void)
         */
        generate_random_buffer( &dummy, 1, True);
 }
+
+BOOL secrets_store_ldap_pw(char* dn, char* pw)
+{
+       fstring key;
+       char *p;
+       
+       pstrcpy(key, dn);
+       for (p=key; *p; p++)
+               if (*p == ',') *p = '/';
+       
+       return secrets_store(key, pw, strlen(pw));
+}
+
+BOOL fetch_ldap_pw(char *dn, char* pw, int len)
+{
+       fstring key;
+       char *p;
+       void *data = NULL;
+       size_t size;
+       
+       pstrcpy(key, dn);
+       for (p=key; *p; p++)
+               if (*p == ',') *p = '/';
+       
+       data=secrets_fetch(key, &size);
+       if (!size) {
+               DEBUG(0,("fetch_ldap_pw: no ldap secret retrieved!\n"));
+               return False;
+       }
+       
+       if (size > len-1)
+       {
+               DEBUG(0,("fetch_ldap_pw: ldap secret is too long (%d > %d)!\n", size, len-1));
+               return False;
+       }
+
+       memcpy(pw, data, size);
+       pw[size] = '\0';
+       
+       return True;
+}