Author: mimir
Date: 2004-08-17 10:19:02 +0000 (Tue, 17 Aug 2004)
New Revision: 1852

WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/&rev=1852&nolog=1

Log:
Interdomain trust passwords migration to passdb.
Completely untested, though doesn't break the build.


rafal


Modified:
   trunk/source/libsmb/trusts_util.c


Changeset:
Modified: trunk/source/libsmb/trusts_util.c
===================================================================
--- trunk/source/libsmb/trusts_util.c   2004-08-17 10:04:25 UTC (rev 1851)
+++ trunk/source/libsmb/trusts_util.c   2004-08-17 10:19:02 UTC (rev 1852)
@@ -199,16 +199,24 @@
 
 int migrate_trust_passwords(struct pdb_context *pdb_ctx)
 {
-       int migrated = 0;
+       int migrated = 0, i;
        NTSTATUS nt_status;
        SAM_TRUST_PASSWD trust;
        const size_t max_name_len = sizeof(trust.private.uni_name)/2;
+       time_t lct;
        /* nt workstation trust */
        const char* dom_name = lp_workgroup();
        uint8 wks_pass[16];
-       time_t lct;
        uint32 chan = 0;
        DOM_SID dom_sid;
+       /* nt domain trust */
+       TALLOC_CTX *mem_ctx = NULL;
+       const unsigned int max_trusts = 10;
+       int enum_ctx = 0, num_trusts;
+       TRUSTDOM **trusts;
+       char *trust_name = NULL, *pass;
+       size_t trust_name_len = 0;
+       DOM_SID sid;
 
        /* sanity-check */
        if (!pdb_ctx) return 0;
@@ -218,6 +226,10 @@
 
        /* NT Workstation trust passwords */
        if (secrets_fetch_trust_account_password(dom_name, wks_pass, &lct, &chan)) {
+               memset(&trust, 0, sizeof(trust));
+
+               /* TODO: put a lock on trust wks password */
+
                /* flags */
                trust.private.flags = PASS_TRUST_NT;
                switch (chan) {
@@ -251,8 +263,35 @@
        }
 
        /* NT Domain trust passwords */
+       mem_ctx = talloc_init("trust password migration");
+       do {
+               nt_status = secrets_get_trusted_domains(mem_ctx, &enum_ctx, max_trusts,
+                                                       &num_trusts, &trusts);
+               for (i = 0; i < (num_trusts - enum_ctx); i++) {
+                       memset(&trust, 0, sizeof(trust));
+                       trust.private.flags = PASS_TRUST_NT | PASS_TRUST_DOMAIN;
+                       pull_ucs2_allocate(&trust_name, trusts[i]->name);
+                       trust_name_len = strlen_w(trusts[i]->name);
 
+                       if (secrets_fetch_trusted_domain_password(trust_name, &pass, 
&sid, &lct)) {
+                               strncpy_w(trust.private.uni_name, trusts[i]->name, 
trust_name_len);
+                               trust.private.uni_name_len = trust_name_len;
+                               sid_copy(&trust.private.domain_sid, &sid);
+                               trust.private.mod_time = lct;
+                       }
+
+                       nt_status = pdb_ctx->pdb_add_trust_passwd(pdb_ctx, &trust);
+                       migrated++;
+
+                       SAFE_FREE(trust_name);
+               }
+
+       } while (NT_STATUS_EQUAL(nt_status, NT_STATUS_NO_MORE_ENTRIES));
+       talloc_destroy(mem_ctx);
+
        /* ADS Workstation trust passwords */
+       memset(&trust, 0, sizeof(trust));
+       
 
        /* We're done with migration */
        secrets_passwords_migrated(True);

Reply via email to