summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/utils/smbcacls.c104
1 files changed, 56 insertions, 48 deletions
diff --git a/source3/utils/smbcacls.c b/source3/utils/smbcacls.c
index 1ffd7495d0..a7f95f5f5e 100644
--- a/source3/utils/smbcacls.c
+++ b/source3/utils/smbcacls.c
@@ -4,6 +4,7 @@
Version 3.0
Copyright (C) Andrew Tridgell 2000
+ Copyright (C) Tim Potter 2000
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -58,72 +59,84 @@ static struct perm_value standard_values[] = {
{ NULL, 0 },
};
+struct cli_state lsa_cli;
+POLICY_HND pol;
+struct ntuser_creds creds;
+BOOL got_policy_hnd;
+
+/* Open cli connection and policy handle */
+
+static BOOL open_policy_hnd(void)
+{
+ creds.pwd.null_pwd = 1;
+
+ /* Initialise cli LSA connection */
+
+ if (!lsa_cli.initialised &&
+ !cli_lsa_initialise(&lsa_cli, server, &creds)) {
+ return False;
+ }
+
+ /* Open policy handle */
+
+ if (!got_policy_hnd) {
+ if (cli_lsa_open_policy(&lsa_cli, True,
+ SEC_RIGHTS_MAXIMUM_ALLOWED, &pol)
+ != NT_STATUS_NOPROBLEMO) {
+ return False;
+ }
+
+ got_policy_hnd = True;
+ }
+
+ return True;
+}
+
/* convert a SID to a string, either numeric or username/group */
static void SidToString(fstring str, DOM_SID *sid)
{
- struct cli_state cli;
- POLICY_HND pol;
- struct ntuser_creds creds;
- char **names;
- uint32 *types;
+ char **names = NULL;
+ uint32 *types = NULL;
int num_names;
- ZERO_STRUCT(creds);
- ZERO_STRUCT(cli);
- ZERO_STRUCT(pol);
+ sid_to_string(str, sid);
- creds.pwd.null_pwd = 1;
+ if (numeric) return;
- if (numeric || !cli_lsa_initialise(&cli, server, &creds) ||
- cli_lsa_open_policy(&cli, True, SEC_RIGHTS_MAXIMUM_ALLOWED,
- &pol) != NT_STATUS_NOPROBLEMO ||
- cli_lsa_lookup_sids(&cli, &pol, 1, sid, &names, &types,
- &num_names) != NT_STATUS_NOPROBLEMO) {
- sid_to_string(str, sid);
- goto done;
- }
+ /* Ask LSA to convert the sid to a name */
- fstrcpy(str, names[0]);
+ if (open_policy_hnd() &&
+ cli_lsa_lookup_sids(&lsa_cli, &pol, 1, sid, &names, &types,
+ &num_names) == NT_STATUS_NOPROBLEMO) {
- safe_free(names[0]);
- safe_free(names);
- safe_free(types);
+ /* Converted OK */
- done:
- if (cli.initialised) {
- cli_lsa_close(&cli, &pol);
- cli_lsa_shutdown(&cli);
+ fstrcpy(str, names[0]);
+
+ safe_free(names[0]);
+ safe_free(names);
+ safe_free(types);
}
}
/* convert a string to a SID, either numeric or username/group */
static BOOL StringToSid(DOM_SID *sid, fstring str)
{
- uint32 *types;
- struct cli_state cli;
- struct ntuser_creds creds;
- POLICY_HND pol;
+ uint32 *types = NULL;
+ DOM_SID *sids = NULL;
int num_sids;
- BOOL result = True;
- DOM_SID *sids;
+ BOOL result = False;
/* Short cut */
if (strncmp(str, "S-", 2) == 0) {
- return string_to_sid(sid, str);
+ result = string_to_sid(sid, str);
+ goto done;
}
- ZERO_STRUCT(creds);
- ZERO_STRUCT(cli);
- ZERO_STRUCT(pol);
-
- creds.pwd.null_pwd = 1;
-
- if (!cli_lsa_initialise(&cli, server, &creds) ||
- cli_lsa_open_policy(&cli, True, SEC_RIGHTS_MAXIMUM_ALLOWED,
- &pol) != NT_STATUS_NOPROBLEMO ||
- cli_lsa_lookup_names(&cli, &pol, 1, &str, &sids, &types,
- &num_sids) != NT_STATUS_NOPROBLEMO) {
+ if (open_policy_hnd() &&
+ cli_lsa_lookup_names(&lsa_cli, &pol, 1, &str, &sids, &types,
+ &num_sids) == NT_STATUS_NOPROBLEMO) {
result = string_to_sid(sid, str);
goto done;
}
@@ -134,11 +147,6 @@ static BOOL StringToSid(DOM_SID *sid, fstring str)
safe_free(types);
done:
- if (cli.initialised) {
- cli_lsa_close(&cli, &pol);
- cli_lsa_shutdown(&cli);
- }
-
return result;
}