summaryrefslogtreecommitdiff
path: root/source/lsarpcd
diff options
context:
space:
mode:
authorLuke Leighton <lkcl@samba.org>2000-02-10 09:58:37 +0000
committerLuke Leighton <lkcl@samba.org>2000-02-10 09:58:37 +0000
commit8e8ea67de8f5d9a37e98477f03bc7fa392162546 (patch)
treecd539c6a84072edc4932a2dcce42c83735fdad9b /source/lsarpcd
parent0cac988d687857db0cb9b00e7cd602668bce0b63 (diff)
downloadsamba-8e8ea67de8f5d9a37e98477f03bc7fa392162546.tar.gz
added _lsa_create_secret implementation.
Diffstat (limited to 'source/lsarpcd')
-rw-r--r--source/lsarpcd/secret_db.c15
-rw-r--r--source/lsarpcd/srv_lsa.c4
-rw-r--r--source/lsarpcd/srv_lsa_samdb.c66
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,