BOOL secrets_store_trusted_domain_password(const char* domain, smb_ucs2_t *uni_dom_name, size_t uni_name_len, const char* pwd, DOM_SID sid) { /* packing structures */ pstring pass_buf; int pass_len = 0; int pass_buf_len = sizeof(pass_buf); struct trusted_dom_pass pass; ZERO_STRUCT(pass); /* unicode domain name and its length */ if (!uni_dom_name) return False; strncpy_w(pass.uni_name, uni_dom_name, sizeof(pass.uni_name) - 1); pass.uni_name_len = uni_name_len; /* last change time */ pass.mod_time = time(NULL); /* password of the trust */ pass.pass_len = strlen(pwd); fstrcpy(pass.pass, pwd); /* domain sid */ sid_copy(&pass.domain_sid, &sid); pass_len = tdb_trusted_dom_pass_pack(pass_buf, pass_buf_len, &pass); return secrets_store(trustdom_keystr(domain), (void *)&pass_buf, pass_len); }
bool secrets_store_trusted_domain_password(const char* domain, const char* pwd, const DOM_SID *sid) { smb_ucs2_t *uni_dom_name; bool ret; /* packing structures */ uint8 *pass_buf = NULL; int pass_len = 0; struct trusted_dom_pass pass; ZERO_STRUCT(pass); if (push_ucs2_allocate(&uni_dom_name, domain) == (size_t)-1) { DEBUG(0, ("Could not convert domain name %s to unicode\n", domain)); return False; } strncpy_w(pass.uni_name, uni_dom_name, sizeof(pass.uni_name) - 1); pass.uni_name_len = strlen_w(uni_dom_name)+1; SAFE_FREE(uni_dom_name); /* last change time */ pass.mod_time = time(NULL); /* password of the trust */ pass.pass_len = strlen(pwd); fstrcpy(pass.pass, pwd); /* domain sid */ sid_copy(&pass.domain_sid, sid); /* Calculate the length. */ pass_len = tdb_trusted_dom_pass_pack(NULL, 0, &pass); pass_buf = SMB_MALLOC_ARRAY(uint8, pass_len); if (!pass_buf) { return false; } pass_len = tdb_trusted_dom_pass_pack(pass_buf, pass_len, &pass); ret = secrets_store(trustdom_keystr(domain), (void *)pass_buf, pass_len); SAFE_FREE(pass_buf); return ret; }
bool secrets_fetch_trusted_domain_password(const char *domain, char** pwd, DOM_SID *sid, time_t *pass_last_set_time) { struct trusted_dom_pass pass; size_t size = 0; /* unpacking structures */ uint8 *pass_buf; int pass_len = 0; ZERO_STRUCT(pass); /* fetching trusted domain password structure */ if (!(pass_buf = (uint8 *)secrets_fetch(trustdom_keystr(domain), &size))) { DEBUG(5, ("secrets_fetch failed!\n")); return False; } /* unpack trusted domain password */ pass_len = tdb_trusted_dom_pass_unpack(pass_buf, size, &pass); SAFE_FREE(pass_buf); if (pass_len != size) { DEBUG(5, ("Invalid secrets size. Unpacked data doesn't match trusted_dom_pass structure.\n")); return False; } /* the trust's password */ if (pwd) { *pwd = SMB_STRDUP(pass.pass); if (!*pwd) { return False; } } /* last change time */ if (pass_last_set_time) *pass_last_set_time = pass.mod_time; /* domain sid */ if (sid != NULL) sid_copy(sid, &pass.domain_sid); return True; }
bool secrets_fetch_trusted_domain_password(const char *domain, char** pwd, struct dom_sid *sid, time_t *pass_last_set_time) { struct TRUSTED_DOM_PASS pass; enum ndr_err_code ndr_err; /* unpacking structures */ DATA_BLOB blob; /* fetching trusted domain password structure */ if (!(blob.data = (uint8_t *)secrets_fetch(trustdom_keystr(domain), &blob.length))) { DEBUG(5, ("secrets_fetch failed!\n")); return False; } /* unpack trusted domain password */ ndr_err = ndr_pull_struct_blob(&blob, talloc_tos(), &pass, (ndr_pull_flags_fn_t)ndr_pull_TRUSTED_DOM_PASS); SAFE_FREE(blob.data); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { return false; } /* the trust's password */ if (pwd) { *pwd = SMB_STRDUP(pass.pass); if (!*pwd) { return False; } } /* last change time */ if (pass_last_set_time) *pass_last_set_time = pass.mod_time; /* domain sid */ if (sid != NULL) sid_copy(sid, &pass.domain_sid); return True; }
bool secrets_store_trusted_domain_password(const char* domain, const char* pwd, const struct dom_sid *sid) { bool ret; /* packing structures */ DATA_BLOB blob; enum ndr_err_code ndr_err; struct TRUSTED_DOM_PASS pass; ZERO_STRUCT(pass); pass.uni_name = domain; pass.uni_name_len = strlen(domain)+1; /* last change time */ pass.mod_time = time(NULL); /* password of the trust */ pass.pass_len = strlen(pwd); pass.pass = pwd; /* domain sid */ sid_copy(&pass.domain_sid, sid); ndr_err = ndr_push_struct_blob(&blob, talloc_tos(), &pass, (ndr_push_flags_fn_t)ndr_push_TRUSTED_DOM_PASS); if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) { return false; } ret = secrets_store(trustdom_keystr(domain), blob.data, blob.length); data_blob_free(&blob); return ret; }
bool trusted_domain_password_delete(const char *domain) { return secrets_delete(trustdom_keystr(domain)); }