Add _wkssvc_NetrJoinDomain2() server.
authorGünther Deschner <gd@samba.org>
Wed, 12 Dec 2007 15:12:14 +0000 (16:12 +0100)
committerGünther Deschner <gd@samba.org>
Fri, 21 Dec 2007 14:29:10 +0000 (15:29 +0100)
Guenther
(This used to be commit 9b0423e7d918b7b3837ca4ebf997edd80d4da6de)

source3/Makefile.in
source3/rpc_server/srv_wkssvc_nt.c

index 1b482c1d46954e9d376e390de8eb5125bdb8f0cb..765c705d8616199639f7895f88cc9e1e7094c71d 100644 (file)
@@ -558,7 +558,7 @@ SMBD_OBJ_BASE = $(PARAM_WITHOUT_REG_OBJ) $(SMBD_OBJ_SRV) $(LIBSMB_OBJ) \
                $(LIBMSRPC_OBJ) $(LIBMSRPC_GEN_OBJ) \
                $(LIBADS_OBJ) $(KRBCLIENT_OBJ) $(LIBADS_SERVER_OBJ) \
                $(REGISTRY_OBJ) $(POPT_LIB_OBJ) \
-               $(BUILDOPT_OBJ) $(SMBLDAP_OBJ) $(LDB_OBJ)
+               $(BUILDOPT_OBJ) $(SMBLDAP_OBJ) $(LDB_OBJ) $(LIBNET_OBJ)
 
 PRINTING_OBJ = printing/pcap.o printing/print_svid.o printing/print_aix.o \
                printing/print_cups.o printing/print_generic.o \
index d9d2df344a16dd2da299e1ec12825c6ae769ba53..e60dca61c7ee502f3b4a57d7259202e61df91588 100644 (file)
@@ -22,6 +22,8 @@
 /* This is the implementation of the wks interface. */
 
 #include "includes.h"
+#include "libnet/libnet_join.h"
+#include "libnet/libnet_proto.h"
 
 #undef DBGC_CLASS
 #define DBGC_CLASS DBGC_RPC_SRV
@@ -284,9 +286,70 @@ WERROR _wkssvc_NetrGetJoinableOus(pipes_struct *p, struct wkssvc_NetrGetJoinable
 
 WERROR _wkssvc_NetrJoinDomain2(pipes_struct *p, struct wkssvc_NetrJoinDomain2 *r)
 {
-       /* FIXME: Add implementation code here */
-       p->rng_fault_state = True;
-       return WERR_NOT_SUPPORTED;
+       struct libnet_JoinCtx *j = NULL;
+       char *pwd = NULL;
+       char *admin_domain = NULL;
+       char *admin_account = NULL;
+       WERROR werr;
+       NTSTATUS status;
+       struct nt_user_token *token = p->pipe_user.nt_user_token;
+       struct DS_DOMAIN_CONTROLLER_INFO *info = NULL;
+
+       if (!r->in.domain_name) {
+               return WERR_INVALID_PARAM;
+       }
+
+       if (!user_has_privileges(token, &se_machine_account) &&
+           !nt_token_check_domain_rid(token, DOMAIN_GROUP_RID_ADMINS) &&
+           !nt_token_check_domain_rid(token, BUILTIN_ALIAS_RID_ADMINS)) {
+               return WERR_ACCESS_DENIED;
+       }
+
+       werr = decode_wkssvc_join_password_buffer(p->mem_ctx,
+                                                 r->in.encrypted_password,
+                                                 &p->session_key,
+                                                 &pwd);
+       if (!W_ERROR_IS_OK(werr)) {
+               return werr;
+       }
+
+       werr = libnet_init_JoinCtx(p->mem_ctx, &j);
+       if (!W_ERROR_IS_OK(werr)) {
+               return werr;
+       }
+
+       split_domain_user(p->mem_ctx,
+                         r->in.admin_account,
+                         &admin_domain,
+                         &admin_account);
+
+       status = DsGetDcName(p->mem_ctx,
+                            NULL,
+                            r->in.domain_name,
+                            NULL,
+                            NULL,
+                            DS_DIRECTORY_SERVICE_REQUIRED |
+                            DS_WRITABLE_REQUIRED |
+                            DS_RETURN_DNS_NAME,
+                            &info);
+       if (!NT_STATUS_IS_OK(status)) {
+               return ntstatus_to_werror(status);
+       }
+
+       j->in.server_name       = info->domain_controller_name;
+       j->in.domain_name       = r->in.domain_name;
+       j->in.account_ou        = r->in.account_ou;
+       j->in.join_flags        = r->in.join_flags;
+
+       j->in.admin_account = admin_account;
+       j->in.password = pwd;
+       j->in.modify_config = true;
+
+       become_root();
+       werr = libnet_Join(p->mem_ctx, j);
+       unbecome_root();
+
+       return werr;
 }
 
 /********************************************************************