Add ADS_STRUCTs to libnetjoin and -unjoin, with talloc destructors.
authorGünther Deschner <gd@samba.org>
Mon, 7 Jan 2008 17:58:04 +0000 (18:58 +0100)
committerGünther Deschner <gd@samba.org>
Mon, 7 Jan 2008 18:38:59 +0000 (19:38 +0100)
Guenther

source/libnet/libnet_join.c
source/libnet/libnet_join.h

index 95088606a2da65483c191e3ff23e78699f04e6a8..7c8b395cd35aff793fad6e8e57cf9e4d2ae10dfb 100644 (file)
@@ -58,6 +58,103 @@ static void libnet_unjoin_set_error_string(TALLOC_CTX *mem_ctx,
        r->out.error_string = tmp;
 }
 
+/****************************************************************
+****************************************************************/
+
+static ADS_STATUS libnet_connect_ads(const char *dns_domain_name,
+                                    const char *netbios_domain_name,
+                                    const char *dc_name,
+                                    const char *user_name,
+                                    const char *password,
+                                    ADS_STRUCT **ads)
+{
+       ADS_STATUS status;
+       ADS_STRUCT *my_ads = NULL;
+
+       my_ads = ads_init(dns_domain_name,
+                         netbios_domain_name,
+                         dc_name);
+       if (!my_ads) {
+               return ADS_ERROR_LDAP(LDAP_NO_MEMORY);
+       }
+
+       if (user_name) {
+               SAFE_FREE(my_ads->auth.user_name);
+               my_ads->auth.user_name = SMB_STRDUP(user_name);
+       }
+
+       if (password) {
+               SAFE_FREE(my_ads->auth.password);
+               my_ads->auth.password = SMB_STRDUP(password);
+       }
+
+       status = ads_connect(my_ads);
+       if (!ADS_ERR_OK(status)) {
+               ads_destroy(&my_ads);
+               return status;
+       }
+
+       *ads = my_ads;
+       return ADS_SUCCESS;
+}
+
+/****************************************************************
+****************************************************************/
+
+static ADS_STATUS libnet_join_connect_ads(TALLOC_CTX *mem_ctx,
+                                         struct libnet_JoinCtx *r)
+{
+       ADS_STATUS status;
+
+       if (r->in.ads) {
+               ads_destroy(&r->in.ads);
+       }
+
+       status = libnet_connect_ads(r->in.domain_name,
+                                   r->in.domain_name,
+                                   r->in.dc_name,
+                                   r->in.admin_account,
+                                   r->in.admin_password,
+                                   &r->in.ads);
+       if (!ADS_ERR_OK(status)) {
+               libnet_join_set_error_string(mem_ctx, r,
+                       "failed to connect to AD: %s\n",
+                       ads_errstr(status));
+       }
+
+       return status;
+}
+
+/****************************************************************
+****************************************************************/
+
+static ADS_STATUS libnet_unjoin_connect_ads(TALLOC_CTX *mem_ctx,
+                                           struct libnet_UnjoinCtx *r)
+{
+       ADS_STATUS status;
+
+       if (r->in.ads) {
+               ads_destroy(&r->in.ads);
+       }
+
+       status = libnet_connect_ads(r->in.domain_name,
+                                   r->in.domain_name,
+                                   r->in.dc_name,
+                                   r->in.admin_account,
+                                   r->in.admin_password,
+                                   &r->in.ads);
+       if (!ADS_ERR_OK(status)) {
+               libnet_unjoin_set_error_string(mem_ctx, r,
+                       "failed to connect to AD: %s\n",
+                       ads_errstr(status));
+       }
+
+       return status;
+}
+
+/****************************************************************
+****************************************************************/
+
 static bool libnet_join_joindomain_store_secrets(TALLOC_CTX *mem_ctx,
                                                 struct libnet_JoinCtx *r)
 {
@@ -484,6 +581,33 @@ static WERROR do_UnjoinConfig(struct libnet_UnjoinCtx *r)
        return werr;
 }
 
+/****************************************************************
+****************************************************************/
+
+static int libnet_destroy_JoinCtx(struct libnet_JoinCtx *r)
+{
+       if (r->in.ads) {
+               ads_destroy(&r->in.ads);
+       }
+
+       return 0;
+}
+
+/****************************************************************
+****************************************************************/
+
+static int libnet_destroy_UnjoinCtx(struct libnet_UnjoinCtx *r)
+{
+       if (r->in.ads) {
+               ads_destroy(&r->in.ads);
+       }
+
+       return 0;
+}
+
+/****************************************************************
+****************************************************************/
+
 WERROR libnet_init_JoinCtx(TALLOC_CTX *mem_ctx,
                           struct libnet_JoinCtx **r)
 {
@@ -494,11 +618,19 @@ WERROR libnet_init_JoinCtx(TALLOC_CTX *mem_ctx,
                return WERR_NOMEM;
        }
 
+       talloc_set_destructor(ctx, libnet_destroy_JoinCtx);
+
+       ctx->in.machine_name = talloc_strdup(mem_ctx, global_myname());
+       W_ERROR_HAVE_NO_MEMORY(ctx->in.machine_name);
+
        *r = ctx;
 
        return WERR_OK;
 }
 
+/****************************************************************
+****************************************************************/
+
 WERROR libnet_init_UnjoinCtx(TALLOC_CTX *mem_ctx,
                             struct libnet_UnjoinCtx **r)
 {
@@ -509,6 +641,11 @@ WERROR libnet_init_UnjoinCtx(TALLOC_CTX *mem_ctx,
                return WERR_NOMEM;
        }
 
+       talloc_set_destructor(ctx, libnet_destroy_UnjoinCtx);
+
+       ctx->in.machine_name = talloc_strdup(mem_ctx, global_myname());
+       W_ERROR_HAVE_NO_MEMORY(ctx->in.machine_name);
+
        *r = ctx;
 
        return WERR_OK;
index ac1fe6efcb015d7990d7c1409af3e55b6527f323..b2e59b99c9dbe83fb07dc1b6dd2a857a9387e48b 100644 (file)
@@ -34,6 +34,7 @@ struct libnet_JoinCtx {
                const char *os_string;
                const char *upn;
                bool modify_config;
+               struct ads_struct *ads;
        } in;
 
        struct {
@@ -51,12 +52,14 @@ struct libnet_JoinCtx {
 struct libnet_UnjoinCtx {
        struct {
                const char *dc_name;
+               const char *machine_name;
                const char *domain_name;
                const char *admin_account;
                const char *admin_password;
                uint32_t unjoin_flags;
                bool modify_config;
                struct dom_sid *domain_sid;
+               struct ads_struct *ads;
        } in;
 
        struct {