winbindd: add rids and other_sids arrays in WBFLAG_PAM_INFO3_TEXT mode
authorStefan Metzmacher <metze@samba.org>
Fri, 18 Jan 2008 07:43:45 +0000 (08:43 +0100)
committerStefan Metzmacher <metze@samba.org>
Wed, 13 Feb 2008 12:30:15 +0000 (13:30 +0100)
metze
(This used to be commit c5e6dd1ca9611e2830ff773875998c01bf779a64)

source3/winbindd/winbindd_pam.c

index dd27ad62f366a3bcb558a0569593846bbd5c4ad2..e3574bbcd6daf41d75c4e0c2e3d05e0e022074a4 100644 (file)
@@ -31,6 +31,10 @@ static NTSTATUS append_info3_as_txt(TALLOC_CTX *mem_ctx,
                                    struct winbindd_cli_state *state,
                                    NET_USER_INFO_3 *info3)
 {
+       char *ex;
+       size_t size;
+       uint32_t i;
+
        state->response.data.auth.info3.logon_time =
                nt_time_to_unix(info3->logon_time);
        state->response.data.auth.info3.logoff_time =
@@ -83,6 +87,42 @@ static NTSTATUS append_info3_as_txt(TALLOC_CTX *mem_ctx,
                &info3->uni_logon_dom,
                sizeof(state->response.data.auth.info3.logon_dom));
 
+       ex = talloc_strdup(mem_ctx, "");
+       NT_STATUS_HAVE_NO_MEMORY(ex);
+
+       for (i=0; i < info3->num_groups; i++) {
+               ex = talloc_asprintf_append_buffer(ex, "0x%08X:0x%08X\n",
+                                                  info3->gids[i].g_rid,
+                                                  info3->gids[i].attr);
+               NT_STATUS_HAVE_NO_MEMORY(ex);
+       }
+
+       for (i=0; i < info3->num_other_sids; i++) {
+               char *sid;
+
+               sid = dom_sid_string(mem_ctx, &info3->other_sids[i].sid);
+               NT_STATUS_HAVE_NO_MEMORY(sid);
+
+               ex = talloc_asprintf_append_buffer(ex, "%s:0x%08X\n",
+                                                  sid,
+                                                  info3->other_sids_attrib[i]);
+               NT_STATUS_HAVE_NO_MEMORY(ex);
+
+               talloc_free(sid);
+       }
+
+       size = talloc_get_size(ex);
+
+       SAFE_FREE(state->response.extra_data.data);
+       state->response.extra_data.data = SMB_MALLOC(size);
+       if (!state->response.extra_data.data) {
+               return NT_STATUS_NO_MEMORY;
+       }
+       memcpy(state->response.extra_data.data, ex, size);
+       talloc_free(ex);
+
+       state->response.length += size;
+
        return NT_STATUS_OK;
 }
 
@@ -703,16 +743,18 @@ static bool check_request_flags(uint32_t flags)
 {
        uint32_t flags_edata = WBFLAG_PAM_AFS_TOKEN |
                               WBFLAG_PAM_UNIX_NAME |
+                              WBFLAG_PAM_INFO3_TEXT |
                               WBFLAG_PAM_INFO3_NDR;
 
        if ( ( (flags & flags_edata) == WBFLAG_PAM_AFS_TOKEN) ||
             ( (flags & flags_edata) == WBFLAG_PAM_INFO3_NDR) ||
+            ( (flags & flags_edata) == WBFLAG_PAM_INFO3_TEXT)||
             ( (flags & flags_edata) == WBFLAG_PAM_UNIX_NAME) ||
              !(flags & flags_edata) ) {
                return True;
        }
 
-       DEBUG(1,("check_request_flags: invalid request flags\n"));
+       DEBUG(1,("check_request_flags: invalid request flags[0x%08X]\n",flags));
 
        return False;
 }