libnet: Make UserInfo accept a SID as input as well, fix wb_cmd_getpwuid
authorKai Blin <kai@samba.org>
Sat, 19 Apr 2008 12:09:18 +0000 (14:09 +0200)
committerKai Blin <kai@samba.org>
Thu, 24 Apr 2008 09:17:23 +0000 (11:17 +0200)
(This used to be commit 5f3a70f285ad8a412105c0e498e486f93fc279bc)

source4/libnet/libnet_user.c
source4/libnet/libnet_user.h
source4/scripting/ejs/ejsnet/net_user.c
source4/torture/libnet/libnet_user.c
source4/winbind/wb_cmd_getpwnam.c
source4/winbind/wb_cmd_getpwuid.c

index 678c7a226e601ce96f1c21913bcceb500b18156f..dce7320c736061980e7340463254e0bbad73a825 100644 (file)
@@ -597,7 +597,9 @@ NTSTATUS libnet_ModifyUser(struct libnet_context *ctx, TALLOC_CTX *mem_ctx,
 struct user_info_state {
        struct libnet_context *ctx;
        const char *domain_name;
+       enum libnet_UserInfo_level level;
        const char *user_name;
+       const char *sid_string;
        struct libnet_LookupName lookup;
        struct libnet_DomainOpen domopen;
        struct libnet_rpc_userinfo userinfo;
@@ -628,7 +630,7 @@ struct composite_context* libnet_UserInfo_send(struct libnet_context *ctx,
 {
        struct composite_context *c;
        struct user_info_state *s;
-       struct composite_context *lookup_req;
+       struct composite_context *lookup_req, *info_req;
        bool prereq_met = false;
 
        /* composite context allocation and setup */
@@ -644,23 +646,54 @@ struct composite_context* libnet_UserInfo_send(struct libnet_context *ctx,
        s->monitor_fn = monitor;
        s->ctx = ctx;
        s->domain_name = talloc_strdup(c, r->in.domain_name);
-       s->user_name = talloc_strdup(c, r->in.user_name);
+       s->level = r->in.level;
+       switch (s->level) {
+       case USER_INFO_BY_NAME:
+               s->user_name = talloc_strdup(c, r->in.data.user_name);
+               s->sid_string = NULL;
+               break;
+       case USER_INFO_BY_SID:
+               s->user_name = NULL;
+               s->sid_string = dom_sid_string(c, r->in.data.user_sid);
+               break;
+       }
 
        /* prerequisite: make sure the domain is opened */
        prereq_met = samr_domain_opened(ctx, s->domain_name, &c, &s->domopen,
                                        continue_domain_open_info, monitor);
        if (!prereq_met) return c;
 
-       /* prepare arguments for LookupName call */
-       s->lookup.in.domain_name = s->domain_name;
-       s->lookup.in.name        = s->user_name;
-
-       /* send the request */
-       lookup_req = libnet_LookupName_send(ctx, c, &s->lookup, s->monitor_fn);
-       if (composite_nomem(lookup_req, c)) return c;
+       switch (s->level) {
+       case USER_INFO_BY_NAME:
+               /* prepare arguments for LookupName call */
+               s->lookup.in.domain_name = s->domain_name;
+               s->lookup.in.name        = s->user_name;
+
+               /* send the request */
+               lookup_req = libnet_LookupName_send(ctx, c, &s->lookup,
+                                                   s->monitor_fn);
+               if (composite_nomem(lookup_req, c)) return c;
+
+               /* set the next stage */
+               composite_continue(c, lookup_req, continue_name_found, c);
+               break;
+       case USER_INFO_BY_SID:
+               /* prepare arguments for UserInfo call */
+               s->userinfo.in.domain_handle = s->ctx->samr.handle;
+               s->userinfo.in.sid = s->sid_string;
+               s->userinfo.in.level = 21;
+
+               /* send the request */
+               info_req = libnet_rpc_userinfo_send(s->ctx->samr.pipe,
+                                                   &s->userinfo,
+                                                   s->monitor_fn);
+               if (composite_nomem(info_req, c)) return c;
+
+               /* set the next stage */
+               composite_continue(c, info_req, continue_info_received, c);
+               break;
+       }
 
-       /* set the next stage */
-       composite_continue(c, lookup_req, continue_name_found, c);
        return c;
 }
 
@@ -673,7 +706,7 @@ static void continue_domain_open_info(struct composite_context *ctx)
 {
        struct composite_context *c;
        struct user_info_state *s;
-       struct composite_context *lookup_req;
+       struct composite_context *lookup_req, *info_req;
        struct monitor_msg msg;
 
        c = talloc_get_type(ctx->async.private_data, struct composite_context);
@@ -686,16 +719,36 @@ static void continue_domain_open_info(struct composite_context *ctx)
        /* send monitor message */
        if (s->monitor_fn) s->monitor_fn(&msg);
 
-       /* prepare arguments for LookupName call */
-       s->lookup.in.domain_name = s->domain_name;
-       s->lookup.in.name        = s->user_name;
-       
-       /* send the request */
-       lookup_req = libnet_LookupName_send(s->ctx, c, &s->lookup, s->monitor_fn);
-       if (composite_nomem(lookup_req, c)) return;
-
-       /* set the next stage */
-       composite_continue(c, lookup_req, continue_name_found, c);
+       switch (s->level) {
+       case USER_INFO_BY_NAME:
+               /* prepare arguments for LookupName call */
+               s->lookup.in.domain_name = s->domain_name;
+               s->lookup.in.name        = s->user_name;
+
+               /* send the request */
+               lookup_req = libnet_LookupName_send(s->ctx, c, &s->lookup, s->monitor_fn);
+               if (composite_nomem(lookup_req, c)) return;
+
+               /* set the next stage */
+               composite_continue(c, lookup_req, continue_name_found, c);
+               break;
+
+       case USER_INFO_BY_SID:
+               /* prepare arguments for UserInfo call */
+               s->userinfo.in.domain_handle = s->ctx->samr.handle;
+               s->userinfo.in.sid = s->sid_string;
+               s->userinfo.in.level = 21;
+
+               /* send the request */
+               info_req = libnet_rpc_userinfo_send(s->ctx->samr.pipe,
+                                                   &s->userinfo,
+                                                   s->monitor_fn);
+               if (composite_nomem(info_req, c)) return;
+
+               /* set the next stage */
+               composite_continue(c, info_req, continue_info_received, c);
+               break;
+       }
 }
 
 
index 94aa38464f649eaf982599d7fe97132ce9381e19..7095160004541c6da79d4087bb95035559c7abf5 100644 (file)
@@ -99,11 +99,19 @@ struct libnet_ModifyUser {
                }                                       \
        }
 
+enum libnet_UserInfo_level {
+       USER_INFO_BY_NAME=0,
+       USER_INFO_BY_SID
+};
 
 struct libnet_UserInfo {
        struct {
-               const char *user_name;
                const char *domain_name;
+               enum libnet_UserInfo_level level;
+               union {
+                       const char *user_name;
+                       const struct dom_sid *user_sid;
+               } data;
        } in;
        struct {
                struct dom_sid *user_sid;
@@ -123,7 +131,6 @@ struct libnet_UserInfo {
                struct timeval *last_logoff;
                struct timeval *last_password_change;
                uint32_t acct_flags;
-               
                const char *error_string;
        } out;
 };
index 57e538d3b4de725b0476f506defa9c14200fc61a..0c32035c6cb827259ef8b291438047a08540ccb9 100644 (file)
@@ -268,8 +268,9 @@ static int ejs_net_userinfo(MprVarHandle eid, int argc, char **argv)
 
        /* call the libnet function */
        req.in.domain_name = userman_domain;
-       req.in.user_name   = username;
-       
+       req.in.data.user_name   = username;
+       req.in.level = USER_INFO_BY_NAME;
+
        status = libnet_UserInfo(ctx, mem_ctx, &req);
        if (!NT_STATUS_IS_OK(status)) {
                ejsSetErrorMsg(eid, "%s", req.out.error_string);
index 15e3f035065d11eeffbb323ff64cf1125925bf8e..6d3e682976f3cceb2c69be68acd6f315d5f1ce9a 100644 (file)
@@ -530,7 +530,8 @@ bool torture_modifyuser(struct torture_context *torture)
 
                ZERO_STRUCT(user_req);
                user_req.in.domain_name = lp_workgroup(torture->lp_ctx);
-               user_req.in.user_name = name;
+               user_req.in.data.user_name = name;
+               user_req.in.level = USER_INFO_BY_NAME;
 
                status = libnet_UserInfo(ctx, torture, &user_req);
                if (!NT_STATUS_IS_OK(status)) {
@@ -642,7 +643,8 @@ bool torture_userinfo_api(struct torture_context *torture)
        ZERO_STRUCT(req);
        
        req.in.domain_name = domain_name.string;
-       req.in.user_name   = name;
+       req.in.data.user_name   = name;
+       req.in.level = USER_INFO_BY_NAME;
 
        status = libnet_UserInfo(ctx, mem_ctx, &req);
        if (!NT_STATUS_IS_OK(status)) {
index fb2dc197c9edfc4e1367e08c0861ed8e6973b4eb..7d821537f04d117d604abaf542b3879023c44cc7 100644 (file)
@@ -92,7 +92,8 @@ static void cmd_getpwnam_recv_domain(struct composite_context *ctx)
                return;
        }
 
-       user_info->in.user_name = user_name;
+       user_info->in.level = USER_INFO_BY_NAME;
+       user_info->in.data.user_name = user_name;
        user_info->in.domain_name = domain->libnet_ctx->samr.name;
        state->workgroup_name = talloc_strdup(state,
                        domain->libnet_ctx->samr.name);
index c250af1b5650e8745ad9141a9fdc8999ad48d570..15cc592cf69b7c74ed917a7665533aada9272e63 100644 (file)
@@ -34,6 +34,7 @@ struct cmd_getpwuid_state {
        struct composite_context *ctx;
        struct wbsrv_service *service;
        uid_t uid;
+       struct dom_sid *sid;
        char *workgroup;
        struct wbsrv_domain *domain;
 
@@ -81,14 +82,13 @@ static void cmd_getpwuid_recv_sid(struct composite_context *ctx)
        struct cmd_getpwuid_state *state =
                talloc_get_type(ctx->async.private_data,
                                struct cmd_getpwuid_state);
-       struct dom_sid *sid;
 
        DEBUG(5, ("cmd_getpwuid_recv_sid called %p\n", ctx->private_data));
 
-       state->ctx->status = wb_uid2sid_recv(ctx, state, &sid);
+       state->ctx->status = wb_uid2sid_recv(ctx, state, &state->sid);
        if (!composite_is_ok(state->ctx)) return;
 
-       ctx = wb_sid2domain_send(state, state->service, sid);
+       ctx = wb_sid2domain_send(state, state->service, state->sid);
 
        composite_continue(state->ctx, ctx, cmd_getpwuid_recv_domain, state);
 }
@@ -110,7 +110,8 @@ static void cmd_getpwuid_recv_domain(struct composite_context *ctx)
        user_info = talloc(state, struct libnet_UserInfo);
        if (composite_nomem(user_info, state->ctx)) return;
 
-       user_info->in.user_name = state->domain->libnet_ctx->cred->username;
+       user_info->in.level = USER_INFO_BY_SID;
+       user_info->in.data.user_sid = state->sid;
        user_info->in.domain_name = state->domain->libnet_ctx->samr.name;
 
        /* We need the workgroup later, so copy it  */