added samr_UserInfo2 and samr_UserInfo3
authorAndrew Tridgell <tridge@samba.org>
Sat, 15 Nov 2003 10:58:29 +0000 (10:58 +0000)
committerAndrew Tridgell <tridge@samba.org>
Sat, 15 Nov 2003 10:58:29 +0000 (10:58 +0000)
(This used to be commit 5e852f694c039ae8bde3490be9e0c4959c1e93f0)

source4/librpc/idl/samr.idl
source4/librpc/ndr/libndr.h
source4/librpc/ndr/ndr_basic.c
source4/librpc/ndr/ndr_samr.c
source4/librpc/ndr/ndr_samr.h
source4/torture/rpc/samr.c

index c703f99817f01404c5df91d6868050820226cbba..eed1f342a675ef314d93973e5aa808cbd26bd1ad 100644 (file)
                samr_Name comment;
        } samr_UserInfo1;
 
+       typedef struct {
+               samr_Name comment;
+               uint32 foo1;
+               uint32 foo2;
+               uint16 country_code;
+               uint16 code_page;
+       } samr_UserInfo2;
+
+       typedef struct {
+               samr_Name username;
+               samr_Name full_name;
+               uint32 Rid;
+               uint32 primary_group_rid;
+               samr_Name home_directory;
+               samr_Name home_drive;
+               samr_Name logon_script;
+               samr_Name profile;
+               samr_Name workstations;
+               NTTIME last_logon;
+               NTTIME last_logoff;
+               NTTIME last_pwd_change;
+               NTTIME allow_pwd_change;
+               NTTIME force_pwd_change; /* uncertain about this one */
+               uint32 units_per_week;
+               [size_is(1260), length_is(units_per_week/8)] uint8 *logon_hours;
+               uint16 bad_pwd_count;
+               uint16 num_logons;
+               uint32 acct_flags;
+       } samr_UserInfo3;
+
        typedef union {
                case(1) samr_UserInfo1 info1;
+               case(2) samr_UserInfo2 info2;
+               case(3) samr_UserInfo3 info3;
        } samr_UserInfo;
 
        NTSTATUS samr_QueryUserInfo(
index 25ed1fc6f1279dc2671265642d9dac4f3b4dcabd..8347aa8f28733de8b2145f559fa48b60d94529a1 100644 (file)
@@ -79,7 +79,9 @@ struct ndr_print {
 enum ndr_err_code {
        NDR_ERR_CONFORMANT_SIZE,
        NDR_ERR_ARRAY_SIZE,
-       NDR_ERR_BAD_SWITCH
+       NDR_ERR_BAD_SWITCH,
+       NDR_ERR_OFFSET,
+       NDR_ERR_LENGTH
 };
 
 /*
index 89c16ca76ae8afa4bdebb0829408799a1faf1fd0..6239e56b3fc47a872f0d054c981c6b1c286d9024 100644 (file)
@@ -483,6 +483,24 @@ void ndr_print_array_uint32(struct ndr_print *ndr, const char *name,
        ndr->depth--;   
 }
 
+void ndr_print_array_uint8(struct ndr_print *ndr, const char *name, 
+                          uint8 *data, uint32 count)
+{
+       int i;
+
+       ndr->print(ndr, "%s: ARRAY(%d)", name, count);
+       ndr->depth++;
+       for (i=0;i<count;i++) {
+               char *idx=NULL;
+               asprintf(&idx, "[%d]", i);
+               if (idx) {
+                       ndr_print_uint8(ndr, idx, data[i]);
+                       free(idx);
+               }
+       }
+       ndr->depth--;   
+}
+
 void ndr_print_GUID(struct ndr_print *ndr, const char *name, struct GUID *guid)
 {
        ndr->print(ndr, "%-25s: %08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x", 
index 95c38e70c1871805a7b5c74e7f72595b70ebd4d1..e592a65de19e0b6f09f8b95bbb71791b1dcf9bc4 100644 (file)
@@ -1159,6 +1159,80 @@ done:
        return NT_STATUS_OK;
 }
 
+static NTSTATUS ndr_pull_samr_UserInfo2(struct ndr_pull *ndr, int ndr_flags, struct samr_UserInfo2 *r)
+{
+       if (!(ndr_flags & NDR_SCALARS)) goto buffers;
+       NDR_CHECK(ndr_pull_align(ndr, 4));
+       NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_SCALARS, &r->comment));
+       NDR_CHECK(ndr_pull_uint32(ndr, &r->foo1));
+       NDR_CHECK(ndr_pull_uint32(ndr, &r->foo2));
+       NDR_CHECK(ndr_pull_uint16(ndr, &r->country_code));
+       NDR_CHECK(ndr_pull_uint16(ndr, &r->code_page));
+buffers:
+       if (!(ndr_flags & NDR_BUFFERS)) goto done;
+               NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_BUFFERS, &r->comment));
+done:
+       return NT_STATUS_OK;
+}
+
+static NTSTATUS ndr_pull_samr_UserInfo3(struct ndr_pull *ndr, int ndr_flags, struct samr_UserInfo3 *r)
+{
+       uint32 _ptr_logon_hours;
+       if (!(ndr_flags & NDR_SCALARS)) goto buffers;
+       NDR_CHECK(ndr_pull_align(ndr, 4));
+       NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_SCALARS, &r->username));
+       NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_SCALARS, &r->full_name));
+       NDR_CHECK(ndr_pull_uint32(ndr, &r->Rid));
+       NDR_CHECK(ndr_pull_uint32(ndr, &r->primary_group_rid));
+       NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_SCALARS, &r->home_directory));
+       NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_SCALARS, &r->home_drive));
+       NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_SCALARS, &r->logon_script));
+       NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_SCALARS, &r->profile));
+       NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_SCALARS, &r->workstations));
+       NDR_CHECK(ndr_pull_NTTIME(ndr, &r->last_logon));
+       NDR_CHECK(ndr_pull_NTTIME(ndr, &r->last_logoff));
+       NDR_CHECK(ndr_pull_NTTIME(ndr, &r->last_pwd_change));
+       NDR_CHECK(ndr_pull_NTTIME(ndr, &r->allow_pwd_change));
+       NDR_CHECK(ndr_pull_NTTIME(ndr, &r->max_storage));
+       NDR_CHECK(ndr_pull_uint32(ndr, &r->units_per_week));
+       NDR_CHECK(ndr_pull_uint32(ndr, &_ptr_logon_hours));
+       if (_ptr_logon_hours) {
+               NDR_ALLOC(ndr, r->logon_hours);
+       } else {
+               r->logon_hours = NULL;
+       }
+       NDR_CHECK(ndr_pull_uint16(ndr, &r->bad_pwd_count));
+       NDR_CHECK(ndr_pull_uint16(ndr, &r->num_logons));
+       NDR_CHECK(ndr_pull_uint32(ndr, &r->acct_flags));
+buffers:
+       if (!(ndr_flags & NDR_BUFFERS)) goto done;
+               NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_BUFFERS, &r->username));
+               NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_BUFFERS, &r->full_name));
+               NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_BUFFERS, &r->home_directory));
+               NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_BUFFERS, &r->home_drive));
+               NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_BUFFERS, &r->logon_script));
+               NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_BUFFERS, &r->profile));
+               NDR_CHECK(ndr_pull_samr_Name(ndr, NDR_BUFFERS, &r->workstations));
+       if (r->logon_hours) {
+       {
+               uint32 _array_size;
+               NDR_CHECK(ndr_pull_uint32(ndr, &_array_size));
+               if (1260 > _array_size) {
+                       return ndr_pull_error(ndr, NDR_ERR_ARRAY_SIZE, "Bad array size %u should be %u", _array_size, 1260);
+               }
+       }
+               NDR_ALLOC_N_SIZE(ndr, r->logon_hours, 1260, sizeof(r->logon_hours[0]));
+               uint32 _offset, _length;
+               NDR_CHECK(ndr_pull_uint32(ndr, &_offset));
+               NDR_CHECK(ndr_pull_uint32(ndr, &_length));
+               if (_offset != 0) return ndr_pull_error(ndr, NDR_ERR_OFFSET, "Bad array offset 0x%08x", _offset);
+               if (_length > 1260 || _length != r->units_per_week/8) return ndr_pull_error(ndr, NDR_ERR_LENGTH, "Bad array length 0x%08x > size 0x%08x", _offset, 1260);
+               NDR_CHECK(ndr_pull_array_uint8(ndr, r->logon_hours, _length));
+       }
+done:
+       return NT_STATUS_OK;
+}
+
 static NTSTATUS ndr_pull_samr_UserInfo(struct ndr_pull *ndr, int ndr_flags, uint16 *level, union samr_UserInfo *r)
 {
        if (!(ndr_flags & NDR_SCALARS)) goto buffers;
@@ -1168,6 +1242,14 @@ static NTSTATUS ndr_pull_samr_UserInfo(struct ndr_pull *ndr, int ndr_flags, uint
        NDR_CHECK(ndr_pull_samr_UserInfo1(ndr, NDR_SCALARS, &r->info1));
        break; }
 
+       case 2: {
+       NDR_CHECK(ndr_pull_samr_UserInfo2(ndr, NDR_SCALARS, &r->info2));
+       break; }
+
+       case 3: {
+       NDR_CHECK(ndr_pull_samr_UserInfo3(ndr, NDR_SCALARS, &r->info3));
+       break; }
+
        default:
                return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", *level);
        }
@@ -1178,6 +1260,14 @@ buffers:
                NDR_CHECK(ndr_pull_samr_UserInfo1(ndr, NDR_BUFFERS, &r->info1));
        break;
 
+       case 2:
+               NDR_CHECK(ndr_pull_samr_UserInfo2(ndr, NDR_BUFFERS, &r->info2));
+       break;
+
+       case 3:
+               NDR_CHECK(ndr_pull_samr_UserInfo3(ndr, NDR_BUFFERS, &r->info3));
+       break;
+
        default:
                return ndr_pull_error(ndr, NDR_ERR_BAD_SWITCH, "Bad switch value %u", *level);
        }
@@ -1659,6 +1749,49 @@ void ndr_print_samr_UserInfo1(struct ndr_print *ndr, const char *name, struct sa
        ndr->depth--;
 }
 
+void ndr_print_samr_UserInfo2(struct ndr_print *ndr, const char *name, struct samr_UserInfo2 *r)
+{
+       ndr_print_struct(ndr, name, "samr_UserInfo2");
+       ndr->depth++;
+       ndr_print_samr_Name(ndr, "comment", &r->comment);
+       ndr_print_uint32(ndr, "foo1", r->foo1);
+       ndr_print_uint32(ndr, "foo2", r->foo2);
+       ndr_print_uint16(ndr, "country_code", r->country_code);
+       ndr_print_uint16(ndr, "code_page", r->code_page);
+       ndr->depth--;
+}
+
+void ndr_print_samr_UserInfo3(struct ndr_print *ndr, const char *name, struct samr_UserInfo3 *r)
+{
+       ndr_print_struct(ndr, name, "samr_UserInfo3");
+       ndr->depth++;
+       ndr_print_samr_Name(ndr, "username", &r->username);
+       ndr_print_samr_Name(ndr, "full_name", &r->full_name);
+       ndr_print_uint32(ndr, "Rid", r->Rid);
+       ndr_print_uint32(ndr, "primary_group_rid", r->primary_group_rid);
+       ndr_print_samr_Name(ndr, "home_directory", &r->home_directory);
+       ndr_print_samr_Name(ndr, "home_drive", &r->home_drive);
+       ndr_print_samr_Name(ndr, "logon_script", &r->logon_script);
+       ndr_print_samr_Name(ndr, "profile", &r->profile);
+       ndr_print_samr_Name(ndr, "workstations", &r->workstations);
+       ndr_print_NTTIME(ndr, "last_logon", r->last_logon);
+       ndr_print_NTTIME(ndr, "last_logoff", r->last_logoff);
+       ndr_print_NTTIME(ndr, "last_pwd_change", r->last_pwd_change);
+       ndr_print_NTTIME(ndr, "allow_pwd_change", r->allow_pwd_change);
+       ndr_print_NTTIME(ndr, "max_storage", r->max_storage);
+       ndr_print_uint32(ndr, "units_per_week", r->units_per_week);
+       ndr_print_ptr(ndr, "logon_hours", r->logon_hours);
+       ndr->depth++;
+       if (r->logon_hours) {
+               ndr_print_array_uint8(ndr, "logon_hours", r->logon_hours, r->units_per_week/8);
+       }
+       ndr->depth--;
+       ndr_print_uint16(ndr, "bad_pwd_count", r->bad_pwd_count);
+       ndr_print_uint16(ndr, "num_logons", r->num_logons);
+       ndr_print_uint32(ndr, "acct_flags", r->acct_flags);
+       ndr->depth--;
+}
+
 void ndr_print_samr_UserInfo(struct ndr_print *ndr, const char *name, uint16 level, union samr_UserInfo *r)
 {
        ndr_print_union(ndr, name, level, "samr_UserInfo");
@@ -1667,6 +1800,14 @@ void ndr_print_samr_UserInfo(struct ndr_print *ndr, const char *name, uint16 lev
        ndr_print_samr_UserInfo1(ndr, "info1", &r->info1);
        break;
 
+       case 2:
+       ndr_print_samr_UserInfo2(ndr, "info2", &r->info2);
+       break;
+
+       case 3:
+       ndr_print_samr_UserInfo3(ndr, "info3", &r->info3);
+       break;
+
        default:
                ndr_print_bad_level(ndr, name, level);
        }
index 79dcc861e117df58f95536e1400e894e2c8c3499..49103078fe7da7de271ef2eb6a11c52e85f09c25 100644 (file)
@@ -522,8 +522,40 @@ struct samr_UserInfo1 {
        struct samr_Name comment;
 };
 
+struct samr_UserInfo2 {
+       struct samr_Name comment;
+       uint32 foo1;
+       uint32 foo2;
+       uint16 country_code;
+       uint16 code_page;
+};
+
+struct samr_UserInfo3 {
+       struct samr_Name username;
+       struct samr_Name full_name;
+       uint32 Rid;
+       uint32 primary_group_rid;
+       struct samr_Name home_directory;
+       struct samr_Name home_drive;
+       struct samr_Name logon_script;
+       struct samr_Name profile;
+       struct samr_Name workstations;
+       NTTIME last_logon;
+       NTTIME last_logoff;
+       NTTIME last_pwd_change;
+       NTTIME allow_pwd_change;
+       NTTIME max_storage;
+       uint32 units_per_week;
+       uint8 *logon_hours;
+       uint16 bad_pwd_count;
+       uint16 num_logons;
+       uint32 acct_flags;
+};
+
 union samr_UserInfo {
 /* [case(1)] */ struct samr_UserInfo1 info1;
+/* [case(2)] */ struct samr_UserInfo2 info2;
+/* [case(3)] */ struct samr_UserInfo3 info3;
 };
 
 struct samr_QueryUserInfo {
index 21e2005d960f3a3c7850f6578b1880de0165c949..8cafb4a2f5e8389e9fbbd892c8354fe81b7bb7c0 100644 (file)
@@ -26,21 +26,27 @@ static BOOL test_QueryUserInfo(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 {
        NTSTATUS status;
        struct samr_QueryUserInfo r;
+       uint16 levels[] = {1, 2, 3};
+       int i;
+       BOOL ret = True;
 
-       printf("Testing QueryUserInfo\n");
+       for (i=0;i<ARRAY_SIZE(levels);i++) {
+               printf("Testing QueryUserInfo level %u\n", levels[i]);
 
-       r.in.handle = handle;
-       r.in.level = 1;
+               r.in.handle = handle;
+               r.in.level = levels[i];
 
-       status = dcerpc_samr_QueryUserInfo(p, mem_ctx, &r);
-       if (!NT_STATUS_IS_OK(status)) {
-               printf("QueryUserInfo failed - %s\n", nt_errstr(status));
-               return False;
-       }
+               status = dcerpc_samr_QueryUserInfo(p, mem_ctx, &r);
+               if (!NT_STATUS_IS_OK(status)) {
+                       printf("QueryUserInfo level %u failed - %s\n", 
+                              levels[i], nt_errstr(status));
+                       ret = False;
+               }
 
-       NDR_PRINT_UNION_DEBUG(samr_UserInfo, r.in.level, r.out.info);
+               NDR_PRINT_UNION_DEBUG(samr_UserInfo, r.in.level, r.out.info);
+       }
 
-       return True;
+       return ret;
 }
 
 static BOOL test_OpenUser(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,