r6601: fixing query and set alias info calls (level 1 from the
authorGerald Carter <jerry@samba.org>
Tue, 3 May 2005 14:01:39 +0000 (14:01 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 15:56:46 +0000 (10:56 -0500)
MMC manage computer plugin.

source/include/rpc_samr.h
source/rpc_client/cli_samr.c
source/rpc_parse/parse_samr.c
source/rpc_server/srv_samr_nt.c
source/utils/net_rpc.c

index 6559127df11fe26acb102c7f0a59fe81337e8e36..adf410188090865c5de8e091a6f2ecf32a372295 100644 (file)
@@ -1180,74 +1180,52 @@ typedef struct r_samr_create_dom_alias_info
 
 } SAMR_R_CREATE_DOM_ALIAS;
 
-/* SAMR_Q_QUERY_ALIASINFO - SAM Alias Info */
-typedef struct q_samr_query_alias_info
-{
-       POLICY_HND pol;        /* policy handle */
 
-       uint16 switch_level;    /* 0x0003 seen */
+/********************************************************/
 
-} SAMR_Q_QUERY_ALIASINFO;
-
-typedef struct samr_alias_info1
-{
-       UNIHDR hdr_acct_name;
-       UNIHDR hdr_acct_desc;
+typedef struct {
+       UNISTR4 name;
+       UNISTR4 description;
        uint32 num_member;
-       UNISTR2 uni_acct_name;
-       UNISTR2 uni_acct_desc;
-
 } ALIAS_INFO1;
 
-typedef struct samr_alias_info3
-{
-       UNIHDR hdr_acct_desc;
-       UNISTR2 uni_acct_desc;
-
+typedef struct {
+       UNISTR4 description;
 } ALIAS_INFO3;
 
-/* ALIAS_INFO_CTR */
-typedef struct alias_info_ctr
-{
-       uint16 switch_value1;
-       uint16 switch_value2;
+typedef struct {
+       POLICY_HND pol;        /* policy handle */
+       uint16 level;    /* 0x0003 seen */
+} SAMR_Q_QUERY_ALIASINFO;
 
-       union
-       {
+typedef struct {
+       uint16 level;
+       union {
                ALIAS_INFO1 info1;
                ALIAS_INFO3 info3;
-
        } alias;
-
 } ALIAS_INFO_CTR;
 
-/* SAMR_R_QUERY_ALIASINFO - SAM alias info */
-typedef struct r_samr_query_aliasinfo_info
-{
-       uint32 ptr;        
-       ALIAS_INFO_CTR ctr;
-
+typedef struct {
+       ALIAS_INFO_CTR *ctr;
        NTSTATUS status;
-
 } SAMR_R_QUERY_ALIASINFO;
 
 
-/* SAMR_Q_SET_ALIASINFO - SAM Alias Info */
-typedef struct q_samr_set_alias_info
-{
+/********************************************************/
+
+typedef struct {
        POLICY_HND alias_pol;        /* policy handle */
        ALIAS_INFO_CTR ctr;
-
 } SAMR_Q_SET_ALIASINFO;
 
-/* SAMR_R_SET_ALIASINFO - SAM alias info */
-typedef struct r_samr_set_aliasinfo_info
-{
+typedef struct {
        NTSTATUS status;
-
 } SAMR_R_SET_ALIASINFO;
 
 
+/********************************************************/
+
 /* SAMR_Q_QUERY_USERGROUPS - */
 typedef struct q_samr_query_usergroup_info
 {
index 75751dbcbd63e2913a1b6a682429baa6dee03426..45f9bd67a5ce7b3abb6c8f0deac024cdb4fcc3b0 100644 (file)
@@ -1357,7 +1357,7 @@ NTSTATUS cli_samr_query_alias_info(struct cli_state *cli, TALLOC_CTX *mem_ctx,
                goto done;
        }
 
-       *ctr = r.ctr;
+       *ctr = *r.ctr;
 
  done:
        prs_mem_free(&qbuf);
index d3f709c352c839add06f539115b64b6693b75f2f..ba8b367a425414d4b4edebd2fe0d4a9859a5b0f7 100644 (file)
@@ -3472,13 +3472,9 @@ void init_samr_alias_info1(ALIAS_INFO1 * al1, char *acct_name, uint32 num_member
 {
        DEBUG(5, ("init_samr_alias_info1\n"));
 
-       init_unistr2(&al1->uni_acct_name, acct_name, UNI_FLAGS_NONE);
-       init_uni_hdr(&al1->hdr_acct_name, &al1->uni_acct_name);
-
-       al1->num_member=num_member;
-
-       init_unistr2(&al1->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
-       init_uni_hdr(&al1->hdr_acct_desc, &al1->uni_acct_name);
+       init_unistr4(&al1->name, acct_name, UNI_FLAGS_NONE);
+       al1->num_member = num_member;
+       init_unistr4(&al1->description, acct_desc, UNI_FLAGS_NONE);
 }
 
 /*******************************************************************
@@ -3497,22 +3493,20 @@ BOOL samr_io_alias_info1(const char *desc, ALIAS_INFO1 * al1,
        if(!prs_align(ps))
                return False;
 
-       if(!smb_io_unihdr("hdr_acct_name", &al1->hdr_acct_name, ps, depth))
+       if ( !prs_unistr4_hdr("name", ps, depth, &al1->name) )
                return False;
-       if(!prs_uint32("num_member", ps, depth, &al1->num_member))
+       if ( !prs_uint32("num_member", ps, depth, &al1->num_member) )
                return False;
-       if(!smb_io_unihdr("hdr_acct_desc", &al1->hdr_acct_desc, ps, depth))
+       if ( !prs_unistr4_hdr("description", ps, depth, &al1->description) )
                return False;
 
-       if(!smb_io_unistr2("uni_acct_name", &al1->uni_acct_name,
-                      al1->hdr_acct_name.buffer, ps, depth))
+       if ( !prs_unistr4_str("name", ps, depth, &al1->name) )
                return False;
-
-       if(!prs_align(ps))
+       if ( !prs_align(ps) )
                return False;
-
-       if(!smb_io_unistr2("uni_acct_desc", &al1->uni_acct_desc,
-                      al1->hdr_acct_desc.buffer, ps, depth))
+       if ( !prs_unistr4_str("description", ps, depth, &al1->description) )
+               return False;
+       if ( !prs_align(ps) )
                return False;
 
        return True;
@@ -3526,15 +3520,14 @@ void init_samr_alias_info3(ALIAS_INFO3 * al3, const char *acct_desc)
 {
        DEBUG(5, ("init_samr_alias_info3\n"));
 
-       init_unistr2(&al3->uni_acct_desc, acct_desc, UNI_FLAGS_NONE);
-       init_uni_hdr(&al3->hdr_acct_desc, &al3->uni_acct_desc);
+       init_unistr4(&al3->description, acct_desc, UNI_FLAGS_NONE);
 }
 
 /*******************************************************************
 reads or writes a structure.
 ********************************************************************/
 
-BOOL samr_io_alias_info3(const char *desc, ALIAS_INFO3 * al3,
+BOOL samr_io_alias_info3(const char *desc, ALIAS_INFO3 *al3,
                         prs_struct *ps, int depth)
 {
        if (al3 == NULL)
@@ -3546,10 +3539,7 @@ BOOL samr_io_alias_info3(const char *desc, ALIAS_INFO3 * al3,
        if(!prs_align(ps))
                return False;
 
-       if(!smb_io_unihdr("hdr_acct_desc", &al3->hdr_acct_desc, ps, depth))
-               return False;
-       if(!smb_io_unistr2("uni_acct_desc", &al3->uni_acct_desc,
-                      al3->hdr_acct_desc.buffer, ps, depth))
+       if (!prs_unistr4("description", ps, depth, &al3->description))
                return False;
 
        return True;
@@ -3559,21 +3549,20 @@ BOOL samr_io_alias_info3(const char *desc, ALIAS_INFO3 * al3,
 reads or writes a structure.
 ********************************************************************/
 
-BOOL samr_alias_info_ctr(const char *desc, ALIAS_INFO_CTR * ctr,
-                        prs_struct *ps, int depth)
+BOOL samr_alias_info_ctr(const char *desc, prs_struct *ps, int depth, ALIAS_INFO_CTR * ctr)
 {
-       if (ctr == NULL)
+       if ( !ctr )
                return False;
 
        prs_debug(ps, depth, desc, "samr_alias_info_ctr");
        depth++;
 
-       if(!prs_uint16("switch_value1", ps, depth, &ctr->switch_value1))
-               return False;
-       if(!prs_uint16("switch_value2", ps, depth, &ctr->switch_value2))
+       if ( !prs_uint16("level", ps, depth, &ctr->level) )
                return False;
 
-       switch (ctr->switch_value1) {
+       if(!prs_align(ps))
+               return False;
+       switch (ctr->level) {
        case 1: 
                if(!samr_io_alias_info1("alias_info1", &ctr->alias.info1, ps, depth))
                        return False;
@@ -3595,22 +3584,22 @@ inits a SAMR_Q_QUERY_ALIASINFO structure.
 ********************************************************************/
 
 void init_samr_q_query_aliasinfo(SAMR_Q_QUERY_ALIASINFO * q_e,
-                                POLICY_HND *pol, uint16 switch_level)
+                                POLICY_HND *pol, uint32 switch_level)
 {
        DEBUG(5, ("init_samr_q_query_aliasinfo\n"));
 
        q_e->pol = *pol;
-       q_e->switch_level = switch_level;
+       q_e->level = switch_level;
 }
 
 /*******************************************************************
 reads or writes a structure.
 ********************************************************************/
 
-BOOL samr_io_q_query_aliasinfo(const char *desc, SAMR_Q_QUERY_ALIASINFO * q_e,
+BOOL samr_io_q_query_aliasinfo(const char *desc, SAMR_Q_QUERY_ALIASINFO *in,
                               prs_struct *ps, int depth)
 {
-       if (q_e == NULL)
+       if ( !in )
                return False;
 
        prs_debug(ps, depth, desc, "samr_io_q_query_aliasinfo");
@@ -3619,10 +3608,10 @@ BOOL samr_io_q_query_aliasinfo(const char *desc, SAMR_Q_QUERY_ALIASINFO * q_e,
        if(!prs_align(ps))
                return False;
 
-       if(!smb_io_pol_hnd("pol", &(q_e->pol), ps, depth))
+       if ( !smb_io_pol_hnd("pol", &(in->pol), ps, depth) )
                return False;
 
-       if(!prs_uint16("switch_level", ps, depth, &q_e->switch_level))
+       if ( !prs_uint16("level", ps, depth, &in->level) )
                return False;
 
        return True;
@@ -3632,24 +3621,23 @@ BOOL samr_io_q_query_aliasinfo(const char *desc, SAMR_Q_QUERY_ALIASINFO * q_e,
 inits a SAMR_R_QUERY_ALIASINFO structure.
 ********************************************************************/
 
-void init_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO * r_u,
+void init_samr_r_query_aliasinfo(SAMR_R_QUERY_ALIASINFO *out,
                                 ALIAS_INFO_CTR * ctr, NTSTATUS status)
 {
        DEBUG(5, ("init_samr_r_query_aliasinfo\n"));
 
-       r_u->ptr = (NT_STATUS_IS_OK(status) && ctr != NULL) ? 1 : 0;
-       r_u->ctr = *ctr;
-       r_u->status = status;
+       out->ctr = ctr;
+       out->status = status;
 }
 
 /*******************************************************************
 reads or writes a structure.
 ********************************************************************/
 
-BOOL samr_io_r_query_aliasinfo(const char *desc, SAMR_R_QUERY_ALIASINFO * r_u,
+BOOL samr_io_r_query_aliasinfo(const char *desc, SAMR_R_QUERY_ALIASINFO *out,
                               prs_struct *ps, int depth)
 {
-       if (r_u == NULL)
+       if ( !out )
                return False;
 
        prs_debug(ps, depth, desc, "samr_io_r_query_aliasinfo");
@@ -3658,17 +3646,12 @@ BOOL samr_io_r_query_aliasinfo(const char *desc, SAMR_R_QUERY_ALIASINFO * r_u,
        if(!prs_align(ps))
                return False;
 
-       if(!prs_uint32("ptr", ps, depth, &r_u->ptr))
+       if ( !prs_pointer("alias", ps, depth, (void**)&out->ctr, sizeof(ALIAS_INFO_CTR), (PRS_POINTER_CAST)samr_alias_info_ctr))
                return False;
-
-       if (r_u->ptr != 0) {
-               if(!samr_alias_info_ctr("ctr", &r_u->ctr, ps, depth))
-                       return False;
-       }
-
        if(!prs_align(ps))
                return False;
-       if(!prs_ntstatus("status", ps, depth, &r_u->status))
+
+       if(!prs_ntstatus("status", ps, depth, &out->status))
                return False;
 
        return True;
@@ -3705,7 +3688,7 @@ BOOL samr_io_q_set_aliasinfo(const char *desc, SAMR_Q_SET_ALIASINFO * q_u,
 
        if(!smb_io_pol_hnd("alias_pol", &q_u->alias_pol, ps, depth))
                return False;
-       if(!samr_alias_info_ctr("ctr", &q_u->ctr, ps, depth))
+       if(!samr_alias_info_ctr("ctr", ps, depth, &q_u->ctr))
                return False;
 
        return True;
index 040d4e7dea7bc44246ee40cdf2aa2625fde4fabc..54012d57a9e8f3af5b5e53c0f481c5398c47e518 100644 (file)
@@ -985,17 +985,18 @@ NTSTATUS _samr_query_aliasinfo(pipes_struct *p, SAMR_Q_QUERY_ALIASINFO *q_u, SAM
        if ( !ret )
                return NT_STATUS_NO_SUCH_ALIAS;
 
-       switch (q_u->switch_level) {
+       if ( !(r_u->ctr = TALLOC_ZERO_P( p->mem_ctx, ALIAS_INFO_CTR )) ) 
+               return NT_STATUS_NO_MEMORY;
+
+
+       switch (q_u->level ) {
        case 1:
-               r_u->ptr = 1;
-               r_u->ctr.switch_value1 = 1;
-               init_samr_alias_info1(&r_u->ctr.alias.info1,
-                                     info.acct_name, 1, info.acct_desc);
+               r_u->ctr->level = 1;
+               init_samr_alias_info1(&r_u->ctr->alias.info1, info.acct_name, 1, info.acct_desc);
                break;
        case 3:
-               r_u->ptr = 1;
-               r_u->ctr.switch_value1 = 3;
-               init_samr_alias_info3(&r_u->ctr.alias.info3, info.acct_desc);
+               r_u->ctr->level = 3;
+               init_samr_alias_info3(&r_u->ctr->alias.info3, info.acct_desc);
                break;
        default:
                return NT_STATUS_INVALID_INFO_CLASS;
@@ -3984,11 +3985,13 @@ NTSTATUS _samr_set_aliasinfo(pipes_struct *p, SAMR_Q_SET_ALIASINFO *q_u, SAMR_R_
                
        ctr=&q_u->ctr;
 
-       switch (ctr->switch_value1) {
+       switch (ctr->level) {
                case 3:
-                       unistr2_to_ascii(info.acct_desc,
-                                        &(ctr->alias.info3.uni_acct_desc),
-                                        sizeof(info.acct_desc)-1);
+                       if ( ctr->alias.info3.description.string ) {
+                               unistr2_to_ascii( info.acct_desc, 
+                                       ctr->alias.info3.description.string, 
+                                       sizeof(info.acct_desc)-1 );
+                       }
                        break;
                default:
                        return NT_STATUS_INVALID_INFO_CLASS;
index 6e884c24dfbd33ce0ecfb96028ad81ab1549d88a..e982186835a87eb9ae3f18603ac990335b9aa804 100644 (file)
@@ -1459,8 +1459,7 @@ rpc_alias_add_internals(const DOM_SID *domain_sid, const char *domain_name,
 
        /* We've got a comment to set */
 
-       alias_info.switch_value1 = 3;
-       alias_info.switch_value2 = 3;
+       alias_info.level = 3;
        init_samr_alias_info3(&alias_info.alias.info3, opt_comment);
 
        result = cli_samr_set_aliasinfo(cli, mem_ctx, &alias_pol, &alias_info);
@@ -2026,7 +2025,7 @@ rpc_group_list_internals(const DOM_SID *domain_sid, const char *domain_name,
                                    (NT_STATUS_IS_OK(cli_samr_close(cli, mem_ctx,
                                                                    &alias_pol)))) {
                                        description = unistr2_tdup(mem_ctx,
-                                                                  &ctr.alias.info3.uni_acct_desc);
+                                                                  ctr.alias.info3.description.string);
                                }
                        }
                        
@@ -2081,7 +2080,7 @@ rpc_group_list_internals(const DOM_SID *domain_sid, const char *domain_name,
                                    (NT_STATUS_IS_OK(cli_samr_close(cli, mem_ctx,
                                                                    &alias_pol)))) {
                                        description = unistr2_tdup(mem_ctx,
-                                                                  &ctr.alias.info3.uni_acct_desc);
+                                                                  ctr.alias.info3.description.string);
                                }
                        }