s3-libsmb: rename cli_query_secdesc() to cli_query_secdesc_old()
[kai/samba.git] / source3 / utils / smbcacls.c
index f4307e3870509b10362152696516b03cb6712c6d..618314676234ced33adfc08a26ef08ecd0e8fae9 100644 (file)
@@ -1,30 +1,35 @@
-/* 
+/*
    Unix SMB/CIFS implementation.
    ACL get/set utility
-   
+
    Copyright (C) Andrew Tridgell 2000
    Copyright (C) Tim Potter      2000
    Copyright (C) Jeremy Allison  2000
    Copyright (C) Jelmer Vernooij 2003
-   
+
    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
    the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
-   
+
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
-   
+
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
+#include "popt_common.h"
+#include "rpc_client/cli_pipe.h"
 #include "../librpc/gen_ndr/ndr_lsa.h"
-
-extern bool AllowDebugChange;
+#include "rpc_client/cli_lsarpc.h"
+#include "../libcli/security/security.h"
+#include "libsmb/libsmb.h"
+#include "libsmb/clirap.h"
+#include "passdb/machine_sid.h"
 
 static int test_args;
 
@@ -67,12 +72,12 @@ static const struct perm_value standard_values[] = {
 /* Open cli connection and policy handle */
 
 static NTSTATUS cli_lsa_lookup_sid(struct cli_state *cli,
-                                  const DOM_SID *sid,
+                                  const struct dom_sid *sid,
                                   TALLOC_CTX *mem_ctx,
                                   enum lsa_SidType *type,
                                   char **domain, char **name)
 {
-       uint16 orig_cnum = cli->cnum;
+       uint16 orig_cnum = cli_state_get_tid(cli);
        struct rpc_pipe_client *p = NULL;
        struct policy_handle handle;
        NTSTATUS status;
@@ -112,7 +117,7 @@ static NTSTATUS cli_lsa_lookup_sid(struct cli_state *cli,
  fail:
        TALLOC_FREE(p);
        cli_tdis(cli);
-       cli->cnum = orig_cnum;
+       cli_state_set_tid(cli, orig_cnum);
        TALLOC_FREE(frame);
        return status;
 }
@@ -120,14 +125,14 @@ static NTSTATUS cli_lsa_lookup_sid(struct cli_state *cli,
 static NTSTATUS cli_lsa_lookup_name(struct cli_state *cli,
                                    const char *name,
                                    enum lsa_SidType *type,
-                                   DOM_SID *sid)
+                                   struct dom_sid *sid)
 {
-       uint16 orig_cnum = cli->cnum;
+       uint16 orig_cnum = cli_state_get_tid(cli);
        struct rpc_pipe_client *p;
        struct policy_handle handle;
        NTSTATUS status;
        TALLOC_CTX *frame = talloc_stackframe();
-       DOM_SID *sids;
+       struct dom_sid *sids;
        enum lsa_SidType *types;
 
        status = cli_tcon_andx(cli, "IPC$", "?????", "", 0);
@@ -160,13 +165,13 @@ static NTSTATUS cli_lsa_lookup_name(struct cli_state *cli,
  fail:
        TALLOC_FREE(p);
        cli_tdis(cli);
-       cli->cnum = orig_cnum;
+       cli_state_set_tid(cli, orig_cnum);
        TALLOC_FREE(frame);
        return status;
 }
 
 /* convert a SID to a string, either numeric or username/group */
-static void SidToString(struct cli_state *cli, fstring str, const DOM_SID *sid)
+static void SidToString(struct cli_state *cli, fstring str, const struct dom_sid *sid)
 {
        char *domain = NULL;
        char *name = NULL;
@@ -195,12 +200,12 @@ static void SidToString(struct cli_state *cli, fstring str, const DOM_SID *sid)
 }
 
 /* convert a string to a SID, either numeric or username/group */
-static bool StringToSid(struct cli_state *cli, DOM_SID *sid, const char *str)
+static bool StringToSid(struct cli_state *cli, struct dom_sid *sid, const char *str)
 {
        enum lsa_SidType type;
 
-       if (strncmp(str, "S-", 2) == 0) {
-               return string_to_sid(sid, str);
+       if (string_to_sid(sid, str)) {
+               return true;
        }
 
        return NT_STATUS_IS_OK(cli_lsa_lookup_name(cli, str, &type, sid));
@@ -355,7 +360,12 @@ static bool parse_ace_flags(const char *str, unsigned int *pflags)
                        return false;
                }
 
-               if (*p != '|' && *p != '\0') {
+               switch (*p) {
+               case '|':
+                       p++;
+               case '\0':
+                       continue;
+               default:
                        return false;
                }
        }
@@ -372,7 +382,7 @@ static bool parse_ace(struct cli_state *cli, struct security_ace *ace,
        unsigned int atype = 0;
        unsigned int aflags = 0;
        unsigned int amask = 0;
-       DOM_SID sid;
+       struct dom_sid sid;
        uint32_t mask;
        const struct perm_value *v;
        char *str = SMB_STRDUP(orig_str);
@@ -552,13 +562,13 @@ static bool add_ace(struct security_acl **the_acl, struct security_ace *ace)
 }
 
 /* parse a ascii version of a security descriptor */
-static SEC_DESC *sec_desc_parse(TALLOC_CTX *ctx, struct cli_state *cli, char *str)
+static struct security_descriptor *sec_desc_parse(TALLOC_CTX *ctx, struct cli_state *cli, char *str)
 {
        const char *p = str;
        char *tok;
-       SEC_DESC *ret = NULL;
+       struct security_descriptor *ret = NULL;
        size_t sd_size;
-       DOM_SID *grp_sid=NULL, *owner_sid=NULL;
+       struct dom_sid *grp_sid=NULL, *owner_sid=NULL;
        struct security_acl *dacl=NULL;
        int revision=1;
 
@@ -573,7 +583,7 @@ static SEC_DESC *sec_desc_parse(TALLOC_CTX *ctx, struct cli_state *cli, char *st
                                printf("Only specify owner once\n");
                                goto done;
                        }
-                       owner_sid = SMB_CALLOC_ARRAY(DOM_SID, 1);
+                       owner_sid = SMB_CALLOC_ARRAY(struct dom_sid, 1);
                        if (!owner_sid ||
                            !StringToSid(cli, owner_sid, tok+6)) {
                                printf("Failed to parse owner sid\n");
@@ -587,7 +597,7 @@ static SEC_DESC *sec_desc_parse(TALLOC_CTX *ctx, struct cli_state *cli, char *st
                                printf("Only specify group once\n");
                                goto done;
                        }
-                       grp_sid = SMB_CALLOC_ARRAY(DOM_SID, 1);
+                       grp_sid = SMB_CALLOC_ARRAY(struct dom_sid, 1);
                        if (!grp_sid ||
                            !StringToSid(cli, grp_sid, tok+6)) {
                                printf("Failed to parse group sid\n");
@@ -624,7 +634,7 @@ static SEC_DESC *sec_desc_parse(TALLOC_CTX *ctx, struct cli_state *cli, char *st
 
 
 /* print a ascii version of a security descriptor on a FILE handle */
-static void sec_desc_print(struct cli_state *cli, FILE *f, SEC_DESC *sd)
+static void sec_desc_print(struct cli_state *cli, FILE *f, struct security_descriptor *sd)
 {
        fstring sidstr;
        uint32 i;
@@ -666,21 +676,25 @@ get fileinfo for filename
 static uint16 get_fileinfo(struct cli_state *cli, const char *filename)
 {
        uint16_t fnum = (uint16_t)-1;
-       uint16 mode;
+       uint16 mode = 0;
+       NTSTATUS status;
 
        /* The desired access below is the only one I could find that works
           with NT4, W2KP and Samba */
 
-       if (!NT_STATUS_IS_OK(cli_ntcreate(cli, filename, 0, CREATE_ACCESS_READ,
-                                          0, FILE_SHARE_READ|FILE_SHARE_WRITE,
-                                          FILE_OPEN, 0x0, 0x0, &fnum))) {
-               printf("Failed to open %s: %s\n", filename, cli_errstr(cli));
+       status = cli_ntcreate(cli, filename, 0, CREATE_ACCESS_READ,
+                             0, FILE_SHARE_READ|FILE_SHARE_WRITE,
+                             FILE_OPEN, 0x0, 0x0, &fnum);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("Failed to open %s: %s\n", filename, nt_errstr(status));
+               return 0;
        }
 
-       if (!cli_qfileinfo(cli, fnum, &mode, NULL, NULL, NULL,
-                                             NULL, NULL, NULL)) {
+       status = cli_qfileinfo_basic(cli, fnum, &mode, NULL, NULL, NULL,
+                                    NULL, NULL, NULL);
+       if (!NT_STATUS_IS_OK(status)) {
                printf("Failed to file info %s: %s\n", filename,
-                                                       cli_errstr(cli));
+                      nt_errstr(status));
         }
 
        cli_close(cli, fnum);
@@ -691,22 +705,24 @@ static uint16 get_fileinfo(struct cli_state *cli, const char *filename)
 /*****************************************************
 get sec desc for filename
 *******************************************************/
-static SEC_DESC *get_secdesc(struct cli_state *cli, const char *filename)
+static struct security_descriptor *get_secdesc(struct cli_state *cli, const char *filename)
 {
        uint16_t fnum = (uint16_t)-1;
-       SEC_DESC *sd;
+       struct security_descriptor *sd;
+       NTSTATUS status;
 
        /* The desired access below is the only one I could find that works
           with NT4, W2KP and Samba */
 
-       if (!NT_STATUS_IS_OK(cli_ntcreate(cli, filename, 0, CREATE_ACCESS_READ,
-                                          0, FILE_SHARE_READ|FILE_SHARE_WRITE,
-                                          FILE_OPEN, 0x0, 0x0, &fnum))) {
-               printf("Failed to open %s: %s\n", filename, cli_errstr(cli));
+       status = cli_ntcreate(cli, filename, 0, CREATE_ACCESS_READ,
+                             0, FILE_SHARE_READ|FILE_SHARE_WRITE,
+                             FILE_OPEN, 0x0, 0x0, &fnum);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("Failed to open %s: %s\n", filename, nt_errstr(status));
                return NULL;
        }
 
-       sd = cli_query_secdesc(cli, fnum, talloc_tos());
+       sd = cli_query_secdesc_old(cli, fnum, talloc_tos());
 
        cli_close(cli, fnum);
 
@@ -721,25 +737,28 @@ static SEC_DESC *get_secdesc(struct cli_state *cli, const char *filename)
 set sec desc for filename
 *******************************************************/
 static bool set_secdesc(struct cli_state *cli, const char *filename,
-                        SEC_DESC *sd)
+                        struct security_descriptor *sd)
 {
        uint16_t fnum = (uint16_t)-1;
         bool result=true;
+       NTSTATUS status;
 
        /* The desired access below is the only one I could find that works
           with NT4, W2KP and Samba */
 
-       if (!NT_STATUS_IS_OK(cli_ntcreate(cli, filename, 0,
-                                          WRITE_DAC_ACCESS|WRITE_OWNER_ACCESS,
-                                          0, FILE_SHARE_READ|FILE_SHARE_WRITE,
-                                          FILE_OPEN, 0x0, 0x0, &fnum))) {
-               printf("Failed to open %s: %s\n", filename, cli_errstr(cli));
+       status = cli_ntcreate(cli, filename, 0,
+                             WRITE_DAC_ACCESS|WRITE_OWNER_ACCESS,
+                             0, FILE_SHARE_READ|FILE_SHARE_WRITE,
+                             FILE_OPEN, 0x0, 0x0, &fnum);
+       if (!NT_STATUS_IS_OK(status)) {
+               printf("Failed to open %s: %s\n", filename, nt_errstr(status));
                return false;
        }
 
-       if (!cli_set_secdesc(cli, fnum, sd)) {
+       status = cli_set_secdesc(cli, fnum, sd);
+       if (!NT_STATUS_IS_OK(status)) {
                printf("ERROR: security description set failed: %s\n",
-                       cli_errstr(cli));
+                       nt_errstr(status));
                result=false;
        }
 
@@ -753,7 +772,7 @@ dump the acls for a file
 static int cacl_dump(struct cli_state *cli, const char *filename)
 {
        int result = EXIT_FAILED;
-       SEC_DESC *sd;
+       struct security_descriptor *sd;
 
        if (test_args)
                return EXIT_OK;
@@ -781,8 +800,8 @@ because the NT docs say this can't be done :-). JRA.
 static int owner_set(struct cli_state *cli, enum chown_mode change_mode, 
                        const char *filename, const char *new_username)
 {
-       DOM_SID sid;
-       SEC_DESC *sd, *old;
+       struct dom_sid sid;
+       struct security_descriptor *sd, *old;
        size_t sd_size;
 
        if (!StringToSid(cli, &sid, new_username))
@@ -833,8 +852,8 @@ static int ace_compare(struct security_ace *ace1, struct security_ace *ace2)
        if (ace1->type != ace2->type)
                return ace2->type - ace1->type;
 
-       if (sid_compare(&ace1->trustee, &ace2->trustee))
-               return sid_compare(&ace1->trustee, &ace2->trustee);
+       if (dom_sid_compare(&ace1->trustee, &ace2->trustee))
+               return dom_sid_compare(&ace1->trustee, &ace2->trustee);
 
        if (ace1->flags != ace2->flags)
                return ace1->flags - ace2->flags;
@@ -875,7 +894,7 @@ set the ACLs on a file given an ascii description
 static int cacl_set(struct cli_state *cli, const char *filename,
                    char *the_acl, enum acl_mode mode)
 {
-       SEC_DESC *sd, *old;
+       struct security_descriptor *sd, *old;
        uint32 i, j;
        size_t sd_size;
        int result = EXIT_OK;
@@ -927,7 +946,7 @@ static int cacl_set(struct cli_state *cli, const char *filename,
                        bool found = False;
 
                        for (j=0;old->dacl && j<old->dacl->num_aces;j++) {
-                               if (sid_equal(&sd->dacl->aces[i].trustee,
+                               if (dom_sid_equal(&sd->dacl->aces[i].trustee,
                                              &old->dacl->aces[j].trustee)) {
                                        old->dacl->aces[j] = sd->dacl->aces[i];
                                        found = True;
@@ -993,7 +1012,7 @@ set the inherit on a file
 static int inherit(struct cli_state *cli, const char *filename,
                    const char *type)
 {
-       SEC_DESC *old,*sd;
+       struct security_descriptor *old,*sd;
        uint32 oldattr;
        size_t sd_size;
        int result = EXIT_OK;
@@ -1011,7 +1030,7 @@ static int inherit(struct cli_state *cli, const char *filename,
                     SEC_DESC_DACL_PROTECTED) {
                        int i;
                        char *parentname,*temp;
-                       SEC_DESC *parent;
+                       struct security_descriptor *parent;
                        temp = talloc_strdup(talloc_tos(), filename);
 
                        old->type=old->type & (~SEC_DESC_DACL_PROTECTED);
@@ -1023,9 +1042,15 @@ static int inherit(struct cli_state *cli, const char *filename,
                        }
                        string_replace(parentname, '/', '\\');
                        parent = get_secdesc(cli,parentname);
+                       if (parent == NULL) {
+                               return EXIT_FAILED;
+                       }
                        for (i=0;i<parent->dacl->num_aces;i++) {
                                struct security_ace *ace=&parent->dacl->aces[i];
-                               if ((oldattr & aDIR) == aDIR) {
+                               /* Add inherited flag to all aces */
+                               ace->flags=ace->flags|
+                                          SEC_ACE_FLAG_INHERITED_ACE;
+                               if ((oldattr & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) {
                                        if ((ace->flags & SEC_ACE_FLAG_CONTAINER_INHERIT) ==
                                            SEC_ACE_FLAG_CONTAINER_INHERIT) {
                                                add_ace(&old->dacl, ace);
@@ -1033,6 +1058,8 @@ static int inherit(struct cli_state *cli, const char *filename,
                                } else {
                                        if ((ace->flags & SEC_ACE_FLAG_OBJECT_INHERIT) ==
                                            SEC_ACE_FLAG_OBJECT_INHERIT) {
+                                               /* clear flags for files */
+                                               ace->flags=0;
                                                add_ace(&old->dacl, ace);
                                        }
                                }
@@ -1105,12 +1132,9 @@ static struct cli_state *connect_one(struct user_auth_info *auth_info,
                                     const char *server, const char *share)
 {
        struct cli_state *c = NULL;
-       struct sockaddr_storage ss;
        NTSTATUS nt_status;
        uint32_t flags = 0;
 
-       zero_sockaddr(&ss);
-
        if (get_cmdline_auth_info_use_kerberos(auth_info)) {
                flags |= CLI_FULL_CONNECTION_USE_KERBEROS |
                         CLI_FULL_CONNECTION_FALLBACK_AFTER_KERBEROS;
@@ -1123,15 +1147,14 @@ static struct cli_state *connect_one(struct user_auth_info *auth_info,
 
        set_cmdline_auth_info_getpass(auth_info);
 
-       nt_status = cli_full_connection(&c, global_myname(), server, 
-                               &ss, 0,
+       nt_status = cli_full_connection(&c, lp_netbios_name(), server,
+                               NULL, 0,
                                share, "?????",
                                get_cmdline_auth_info_username(auth_info),
                                lp_workgroup(),
                                get_cmdline_auth_info_password(auth_info),
                                flags,
-                               get_cmdline_auth_info_signing_state(auth_info),
-                               NULL);
+                               get_cmdline_auth_info_signing_state(auth_info));
        if (!NT_STATUS_IS_OK(nt_status)) {
                DEBUG(0,("cli_full_connection failed! (%s)\n", nt_errstr(nt_status)));
                return NULL;
@@ -1192,13 +1215,9 @@ static struct cli_state *connect_one(struct user_auth_info *auth_info,
 
        load_case_tables();
 
-
        /* set default debug level to 1 regardless of what smb.conf sets */
-       setup_logging( "smbcacls", True );
-       DEBUGLEVEL_CLASS[DBGC_ALL] = 1;
-       dbf = x_stderr;
-       x_setbuf( x_stderr, NULL );
-       AllowDebugChange = false;
+       setup_logging( "smbcacls", DEBUG_STDERR);
+       lp_set_cmdline("log level", "1");
 
        setlinebuf(stdout);