svn commit: samba r6414 - in branches/SAMBA_4_0/source: include
libnet
mimir at samba.org
mimir at samba.org
Thu Apr 21 07:24:17 GMT 2005
Author: mimir
Date: 2005-04-21 07:24:16 +0000 (Thu, 21 Apr 2005)
New Revision: 6414
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=6414
Log:
Added composite user del function. Slightly broken still, but I don't
want it to hang around not commited.
rafal
Modified:
branches/SAMBA_4_0/source/include/structs.h
branches/SAMBA_4_0/source/libnet/composite.h
branches/SAMBA_4_0/source/libnet/userman.c
Changeset:
Modified: branches/SAMBA_4_0/source/include/structs.h
===================================================================
--- branches/SAMBA_4_0/source/include/structs.h 2005-04-21 05:47:02 UTC (rev 6413)
+++ branches/SAMBA_4_0/source/include/structs.h 2005-04-21 07:24:16 UTC (rev 6414)
@@ -162,6 +162,7 @@
struct smb_composite_fsinfo;
struct rpc_composite_userinfo;
struct rpc_composite_useradd;
+struct rpc_composite_userdel;
struct nbt_name;
struct nbt_name_packet;
Modified: branches/SAMBA_4_0/source/libnet/composite.h
===================================================================
--- branches/SAMBA_4_0/source/libnet/composite.h 2005-04-21 05:47:02 UTC (rev 6413)
+++ branches/SAMBA_4_0/source/libnet/composite.h 2005-04-21 07:24:16 UTC (rev 6414)
@@ -43,3 +43,14 @@
struct policy_handle user_handle;
} out;
};
+
+
+struct rpc_composite_userdel {
+ struct {
+ struct policy_handle domain_handle;
+ const char *username;
+ } in;
+ struct {
+ struct policy_handle user_handle;
+ } out;
+};
Modified: branches/SAMBA_4_0/source/libnet/userman.c
===================================================================
--- branches/SAMBA_4_0/source/libnet/userman.c 2005-04-21 05:47:02 UTC (rev 6413)
+++ branches/SAMBA_4_0/source/libnet/userman.c 2005-04-21 07:24:16 UTC (rev 6414)
@@ -28,8 +28,12 @@
#include "librpc/gen_ndr/ndr_samr.h"
#include "libnet/composite.h"
-static void useradd_handler(struct rpc_request *req);
+/*
+ * Composite user add function
+ */
+static void useradd_handler(struct rpc_request*);
+
enum useradd_stage { USERADD_CREATE };
struct useradd_state {
@@ -178,3 +182,184 @@
struct composite_context *c = rpc_composite_useradd_send(pipe, io);
return rpc_composite_useradd_recv(c, mem_ctx, io);
}
+
+
+/*
+ * Composite user del function
+ */
+
+static void userdel_handler(struct rpc_request*);
+
+enum userdel_stage { USERDEL_LOOKUP, USERDEL_OPEN, USERDEL_DELETE };
+
+struct userdel_state {
+ enum userdel_stage stage;
+ struct dcerpc_pipe *pipe;
+ struct rpc_request *req;
+ struct policy_handle domain_handle;
+ struct policy_handle user_handle;
+ struct samr_LookupNames lookupname;
+ struct samr_OpenUser openuser;
+ struct samr_DeleteUser deleteuser;
+};
+
+
+static NTSTATUS userdel_lookup(struct composite_context *c,
+ struct userdel_state *s)
+{
+ NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
+
+ c->status = dcerpc_ndr_request_recv(s->req);
+ NT_STATUS_NOT_OK_RETURN(c->status);
+
+ if (!s->lookupname.out.rids.count) {
+ /* TODO: no such user */
+ status = NT_STATUS_NO_SUCH_USER;
+
+ } else if (!s->lookupname.out.rids.count > 1) {
+ /* TODO: ambiguous username */
+ status = NT_STATUS_INVALID_ACCOUNT_NAME;
+ }
+
+ s->openuser.in.domain_handle = &s->domain_handle;
+ s->openuser.in.rid = s->lookupname.out.rids.ids[0];
+ s->openuser.in.access_mask = SEC_FLAG_MAXIMUM_ALLOWED;
+ s->openuser.out.user_handle = &s->user_handle;
+
+ s->req = dcerpc_samr_OpenUser_send(s->pipe, c, &s->openuser);
+
+ s->req->async.callback = userdel_handler;
+ s->req->async.private = c;
+ s->stage = USERDEL_OPEN;
+
+ return NT_STATUS_OK;
+failure:
+ talloc_free(c);
+ return status;
+}
+
+
+static NTSTATUS userdel_open(struct composite_context *c,
+ struct userdel_state *s)
+{
+ NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
+
+ c->status = dcerpc_ndr_request_recv(s->req);
+ NT_STATUS_NOT_OK_RETURN(c->status);
+
+ s->deleteuser.in.user_handle = &s->user_handle;
+ s->deleteuser.out.user_handle = &s->user_handle;
+
+ s->req = dcerpc_samr_DeleteUser_send(s->pipe, c, &s->deleteuser);
+
+ s->req->async.callback = userdel_handler;
+ s->req->async.private = c;
+ s->stage = USERDEL_DELETE;
+
+ return NT_STATUS_OK;
+}
+
+
+static NTSTATUS userdel_delete(struct composite_context *c,
+ struct userdel_state *s)
+{
+ NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
+
+ c->status = dcerpc_ndr_request_recv(s->req);
+ NT_STATUS_NOT_OK_RETURN(c->status);
+
+ c->state = SMBCLI_REQUEST_DONE;
+
+ return NT_STATUS_OK;
+}
+
+
+static void userdel_handler(struct rpc_request *req)
+{
+ struct composite_context *c = req->async.private;
+ struct userdel_state *s = talloc_get_type(c->private, struct userdel_state);
+
+ switch (s->stage) {
+ case USERDEL_LOOKUP:
+ c->status = userdel_lookup(c, s);
+ break;
+ case USERDEL_OPEN:
+ c->status = userdel_open(c, s);
+ break;
+ case USERDEL_DELETE:
+ c->status = userdel_delete(c, s);
+ break;
+ }
+
+ if (!NT_STATUS_IS_OK(c->status)) {
+ c->state = SMBCLI_REQUEST_ERROR;
+ }
+
+ if (c->state >= SMBCLI_REQUEST_DONE &&
+ c->async.fn) {
+ c->async.fn(c);
+ }
+}
+
+
+struct composite_context *rpc_composite_userdel_send(struct dcerpc_pipe *p,
+ struct rpc_composite_userdel *io)
+{
+ struct composite_context *c;
+ struct userdel_state *s;
+
+ c = talloc_zero(p, struct composite_context);
+ if (c == NULL) goto failure;
+
+ s = talloc_zero(c, struct userdel_state);
+ if (s == NULL) goto failure;
+
+ s->pipe = p;
+ c->state = SMBCLI_REQUEST_SEND;
+ c->private = s;
+ c->event_ctx = dcerpc_event_context(p);
+
+ s->lookupname.in.domain_handle = &io->in.domain_handle;
+ s->lookupname.in.num_names = 1;
+ s->lookupname.in.names = talloc_zero(s, struct samr_String);
+ s->lookupname.in.names->string = io->in.username;
+
+ s->req = dcerpc_samr_LookupNames_send(p, c, &s->lookupname);
+
+ s->req->async.callback = userdel_handler;
+ s->req->async.private = c;
+ s->stage = USERDEL_LOOKUP;
+
+ return c;
+
+failure:
+ talloc_free(c);
+ return NULL;
+}
+
+
+NTSTATUS rpc_composite_userdel_recv(struct composite_context *c, TALLOC_CTX *mem_ctx,
+ struct rpc_composite_userdel *io)
+{
+ NTSTATUS status;
+ struct userdel_state *s;
+
+ status = composite_wait(c);
+
+ if (NT_STATUS_IS_OK(status) && io) {
+ s = talloc_get_type(c->private, struct userdel_state);
+ io->out.user_handle = s->user_handle;
+ }
+
+ talloc_free(c);
+ return status;
+}
+
+
+NTSTATUS rpc_composite_userdel(struct dcerpc_pipe *pipe,
+ TALLOC_CTX *mem_ctx,
+ struct rpc_composite_userdel *io)
+{
+ struct composite_context *c = rpc_composite_userdel_send(pipe, io);
+ return rpc_composite_userdel_recv(c, mem_ctx, io);
+}
More information about the samba-cvs
mailing list