diff options
author | Luke Leighton <lkcl@samba.org> | 2000-02-10 09:58:37 +0000 |
---|---|---|
committer | Luke Leighton <lkcl@samba.org> | 2000-02-10 09:58:37 +0000 |
commit | 8e8ea67de8f5d9a37e98477f03bc7fa392162546 (patch) | |
tree | cd539c6a84072edc4932a2dcce42c83735fdad9b /source/lsarpcd | |
parent | 0cac988d687857db0cb9b00e7cd602668bce0b63 (diff) | |
download | samba-8e8ea67de8f5d9a37e98477f03bc7fa392162546.tar.gz |
added _lsa_create_secret implementation.
Diffstat (limited to 'source/lsarpcd')
-rw-r--r-- | source/lsarpcd/secret_db.c | 15 | ||||
-rw-r--r-- | source/lsarpcd/srv_lsa.c | 4 | ||||
-rw-r--r-- | source/lsarpcd/srv_lsa_samdb.c | 66 |
3 files changed, 73 insertions, 12 deletions
diff --git a/source/lsarpcd/secret_db.c b/source/lsarpcd/secret_db.c index 7cff647a613..81eabf98978 100644 --- a/source/lsarpcd/secret_db.c +++ b/source/lsarpcd/secret_db.c @@ -81,6 +81,18 @@ BOOL tdb_lookup_secret( TDB_CONTEXT *tdb, const UNISTR2 *uk, LSA_SECRET **usr) prs_tdb_fetch(tdb, &key, &data); + if (prs_buf_len(&data) == 0x0) + { + if (usr != NULL) + { + safe_free((*usr)); + } + prs_free_data(&key); + prs_free_data(&data); + return False; + } + + if (usr != NULL) { if (!lsa_io_secret("usr", (*usr), &data, 0)) @@ -192,6 +204,9 @@ BOOL secret_init_db(void) SIVAL(sec.curinfo.value.enc_secret.buffer, 4, 0x01); memcpy(sec.curinfo.value.enc_secret.buffer+8, trust_passwd, 16); + sec.oldinfo.ptr_update = 1; + sec.oldinfo.last_update = crt; + sec.curinfo.ptr_update = 1; sec.curinfo.last_update = crt; diff --git a/source/lsarpcd/srv_lsa.c b/source/lsarpcd/srv_lsa.c index 4bf0ba81099..4b3935b2835 100644 --- a/source/lsarpcd/srv_lsa.c +++ b/source/lsarpcd/srv_lsa.c @@ -519,7 +519,7 @@ static void api_lsa_query_secret( rpcsrv_struct *p, prs_struct *data, } /*************************************************************************** - api_lsa_open_secret + api_lsa_create_secret ***************************************************************************/ static void api_lsa_open_secret( rpcsrv_struct *p, prs_struct *data, prs_struct *rdata) @@ -548,8 +548,8 @@ static const struct api_struct api_lsa_cmds[] = { "LSA_ENUMTRUSTDOM" , LSA_ENUMTRUSTDOM , api_lsa_enum_trust_dom }, { "LSA_CLOSE" , LSA_CLOSE , api_lsa_close }, { "LSA_OPENSECRET" , LSA_OPENSECRET , api_lsa_open_secret }, - { "LSA_QUERYSECRET" , LSA_QUERYSECRET , api_lsa_query_secret }, { "LSA_CREATESECRET" , LSA_CREATESECRET , api_lsa_create_secret }, + { "LSA_QUERYSECRET" , LSA_QUERYSECRET , api_lsa_query_secret }, { "LSA_LOOKUPSIDS" , LSA_LOOKUPSIDS , api_lsa_lookup_sids }, { "LSA_LOOKUPNAMES" , LSA_LOOKUPNAMES , api_lsa_lookup_names }, { NULL , 0 , NULL } diff --git a/source/lsarpcd/srv_lsa_samdb.c b/source/lsarpcd/srv_lsa_samdb.c index 12a91539060..908ee2d0970 100644 --- a/source/lsarpcd/srv_lsa_samdb.c +++ b/source/lsarpcd/srv_lsa_samdb.c @@ -543,16 +543,6 @@ uint32 _lsa_close(POLICY_HND *hnd) } /*************************************************************************** - _lsa_create_secret - ***************************************************************************/ -uint32 _lsa_create_secret(const POLICY_HND *hnd, - const UNISTR2 *secret_name, uint32 des_access, - POLICY_HND *hnd_secret) -{ - return NT_STATUS_OBJECT_NAME_NOT_FOUND; -} - -/*************************************************************************** _lsa_query_secret ***************************************************************************/ uint32 _lsa_query_secret(const POLICY_HND *hnd_secret, @@ -622,6 +612,62 @@ uint32 _lsa_query_secret(const POLICY_HND *hnd_secret, } /*************************************************************************** + _lsa_create_secret + ***************************************************************************/ +uint32 _lsa_create_secret(const POLICY_HND *hnd, + const UNISTR2 *secret_name, uint32 des_access, + POLICY_HND *hnd_secret) +{ + TDB_CONTEXT *tdb; + LSA_SECRET sec; + NTTIME ntt; + + ZERO_STRUCT(sec); + + tdb = open_secret_db(O_RDWR); + if (tdb == NULL) + { + return NT_STATUS_ACCESS_DENIED; + } + + if (tdb_lookup_secret(tdb, secret_name, NULL)) + { + DEBUG(10,("_lsa_create_secret: secret exists\n")); + return NT_STATUS_ACCESS_DENIED; + } + + /* get a (unique) handle. open a policy on it. */ + if (!open_policy_hnd_link(get_global_hnd_cache(), + hnd, hnd_secret, des_access)) + { + tdb_close(tdb); + return NT_STATUS_ACCESS_DENIED; + } + + if (!set_tdbsecname(get_global_hnd_cache(), hnd_secret, tdb, secret_name)) + { + close_policy_hnd(get_global_hnd_cache(), hnd_secret); + return NT_STATUS_ACCESS_DENIED; + } + + unix_to_nt_time(&ntt, time(NULL)); + + sec.curinfo.ptr_update = 1; + sec.curinfo.last_update = ntt; + + sec.oldinfo.ptr_update = 1; + sec.oldinfo.last_update = ntt; + + if (!tdb_store_secret(tdb, secret_name, &sec)) + { + close_policy_hnd(get_global_hnd_cache(), hnd_secret); + return NT_STATUS_ACCESS_DENIED; + } + + return NT_STATUS_NOPROBLEMO; +} + +/*************************************************************************** _lsa_open_secret ***************************************************************************/ uint32 _lsa_open_secret(const POLICY_HND *hnd, |