summaryrefslogtreecommitdiff
path: root/source3/winbindd
diff options
context:
space:
mode:
authorVolker Lendecke <vl@samba.org>2009-08-04 15:23:13 -0400
committerVolker Lendecke <vl@samba.org>2009-08-05 03:21:22 -0400
commit7077492778dbda30e5f865ae1d0ab0237e00f54f (patch)
treea51af896169011db394654f703665673860442e7 /source3/winbindd
parent360227a0feb443fbbcc420295d5666da5823685a (diff)
downloadsamba-7077492778dbda30e5f865ae1d0ab0237e00f54f.tar.gz
samba-7077492778dbda30e5f865ae1d0ab0237e00f54f.tar.bz2
samba-7077492778dbda30e5f865ae1d0ab0237e00f54f.zip
s3:winbind: Add async wb_queryuser
Diffstat (limited to 'source3/winbindd')
-rw-r--r--source3/winbindd/wb_queryuser.c121
-rw-r--r--source3/winbindd/winbindd_dual_srv.c27
-rw-r--r--source3/winbindd/winbindd_proto.h5
3 files changed, 153 insertions, 0 deletions
diff --git a/source3/winbindd/wb_queryuser.c b/source3/winbindd/wb_queryuser.c
new file mode 100644
index 0000000000..27b8d29951
--- /dev/null
+++ b/source3/winbindd/wb_queryuser.c
@@ -0,0 +1,121 @@
+/*
+ Unix SMB/CIFS implementation.
+ async queryuser
+ Copyright (C) Volker Lendecke 2009
+
+ 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 "winbindd.h"
+#include "librpc/gen_ndr/cli_wbint.h"
+
+struct wb_queryuser_state {
+ struct dom_sid sid;
+ struct wbint_userinfo info;
+};
+
+static void wb_queryuser_done(struct tevent_req *subreq);
+
+struct tevent_req *wb_queryuser_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ const struct dom_sid *user_sid)
+{
+ struct tevent_req *req, *subreq;
+ struct wb_queryuser_state *state;
+ struct winbindd_domain *domain;
+ struct winbind_userinfo info;
+ NTSTATUS status;
+
+ req = tevent_req_create(mem_ctx, &state, struct wb_queryuser_state);
+ if (req == NULL) {
+ return NULL;
+ }
+ sid_copy(&state->sid, user_sid);
+
+ domain = find_domain_from_sid_noinit(user_sid);
+ if (domain == NULL) {
+ tevent_req_nterror(req, NT_STATUS_NO_SUCH_USER);
+ return tevent_req_post(req, ev);
+ }
+
+ status = wcache_query_user(domain, state, &state->sid, &info);
+ if (NT_STATUS_IS_OK(status)) {
+ state->info.acct_name = info.acct_name;
+ state->info.full_name = info.full_name;
+ state->info.homedir = info.homedir;
+ state->info.shell = info.shell;
+ state->info.primary_gid = info.primary_gid;
+ sid_copy(&state->info.user_sid, &info.user_sid);
+ sid_copy(&state->info.group_sid, &info.group_sid);
+ tevent_req_done(req);
+ return tevent_req_post(req, ev);
+ }
+
+ subreq = rpccli_wbint_QueryUser_send(state, ev, domain->child.rpccli,
+ &state->sid, &state->info);
+ if (tevent_req_nomem(subreq, req)) {
+ return tevent_req_post(req, ev);
+ }
+ tevent_req_set_callback(subreq, wb_queryuser_done, req);
+ return req;
+}
+
+static void wb_queryuser_done(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(
+ subreq, struct tevent_req);
+ struct wb_queryuser_state *state = tevent_req_data(
+ req, struct wb_queryuser_state);
+ NTSTATUS status, result;
+
+ status = rpccli_wbint_QueryUser_recv(subreq, state, &result);
+ TALLOC_FREE(subreq);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ return;
+ }
+ if (!NT_STATUS_IS_OK(result)) {
+ tevent_req_nterror(req, result);
+ return;
+ }
+ tevent_req_done(req);
+}
+
+NTSTATUS wb_queryuser_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
+ struct winbind_userinfo **pinfo)
+{
+ struct wb_queryuser_state *state = tevent_req_data(
+ req, struct wb_queryuser_state);
+ struct winbind_userinfo *info;
+ NTSTATUS status;
+
+ if (tevent_req_is_nterror(req, &status)) {
+ return status;
+ }
+
+ info = talloc(mem_ctx, struct winbind_userinfo);
+ if (info == NULL) {
+ return NT_STATUS_NO_MEMORY;
+ }
+ info->acct_name = talloc_move(info, &state->info.acct_name);
+ info->full_name = talloc_move(info, &state->info.full_name);
+ info->homedir = talloc_move(info, &state->info.homedir);
+ info->shell = talloc_move(info, &state->info.shell);
+ info->primary_gid = state->info.primary_gid;
+ sid_copy(&info->user_sid, &state->info.user_sid);
+ sid_copy(&info->group_sid, &state->info.group_sid);
+ *pinfo = info;
+ return NT_STATUS_OK;
+}
diff --git a/source3/winbindd/winbindd_dual_srv.c b/source3/winbindd/winbindd_dual_srv.c
index 35fecbd08e..202cca4434 100644
--- a/source3/winbindd/winbindd_dual_srv.c
+++ b/source3/winbindd/winbindd_dual_srv.c
@@ -117,3 +117,30 @@ NTSTATUS _wbint_Gid2Sid(pipes_struct *p, struct wbint_Gid2Sid *r)
}
return NT_STATUS_OK;
}
+
+NTSTATUS _wbint_QueryUser(pipes_struct *p, struct wbint_QueryUser *r)
+{
+ struct winbindd_domain *domain = wb_child_domain();
+ WINBIND_USERINFO uinfo;
+ NTSTATUS status;
+
+ if (domain == NULL) {
+ return NT_STATUS_REQUEST_NOT_ACCEPTED;
+ }
+
+ status = domain->methods->query_user(domain, p->mem_ctx, r->in.sid,
+ &uinfo);
+ if (!NT_STATUS_IS_OK(status)) {
+ return status;
+ }
+
+ r->out.info->acct_name = uinfo.acct_name;
+ r->out.info->full_name = uinfo.full_name;
+ r->out.info->homedir = uinfo.homedir;
+ r->out.info->shell = uinfo.shell;
+ r->out.info->primary_gid = uinfo.primary_gid;
+ sid_copy(&r->out.info->user_sid, &uinfo.user_sid);
+ sid_copy(&r->out.info->group_sid, &uinfo.group_sid);
+
+ return NT_STATUS_OK;
+}
diff --git a/source3/winbindd/winbindd_proto.h b/source3/winbindd/winbindd_proto.h
index 1f0d5b5d5b..5f93391363 100644
--- a/source3/winbindd/winbindd_proto.h
+++ b/source3/winbindd/winbindd_proto.h
@@ -685,5 +685,10 @@ struct tevent_req *winbindd_gid_to_sid_send(TALLOC_CTX *mem_ctx,
NTSTATUS winbindd_gid_to_sid_recv(struct tevent_req *req,
struct winbindd_response *response);
+struct tevent_req *wb_queryuser_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ const struct dom_sid *user_sid);
+NTSTATUS wb_queryuser_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
+ struct winbind_userinfo **pinfo);
#endif /* _WINBINDD_PROTO_H_ */