[SCM] Samba Shared Repository - branch v3-2-stable updated -
release-3-2-0pre2-411-g2075ce2
Karolin Seeger
kseeger at samba.org
Fri Apr 4 07:38:29 GMT 2008
The branch, v3-2-stable has been updated
via 2075ce26d4f6dcb70c125e87a10d752681aa6150 (commit)
via d79b519cab977df5ad78fe44b05b12da0af347f3 (commit)
via fff7893c02de9781f6b57683f0515ce2532a12e8 (commit)
via 137f24760861838a098ca31c8f5004efb7411e67 (commit)
via 1b7af6fbfa77432aa53c46d5961135ee463c0f2b (commit)
via d098105b51f05dc43f778e3ecc55abe242ec6ffe (commit)
via 2ce81928df761eaa173ed164bdb672ef513f2ced (commit)
from c4e59eb66d493ab41e873f8aaeb8293a188905b6 (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-2-stable
- Log -----------------------------------------------------------------
commit 2075ce26d4f6dcb70c125e87a10d752681aa6150
Author: Günther Deschner <gd at samba.org>
Date: Thu Apr 3 00:23:50 2008 +0200
Fix rpccli_lsa_lookup_sids_noalloc.
When looking up e.g. a trusted doamin account, there is just no name.
Michael, please check.
Guenther
(cherry picked from commit ea3cfadc2504c891b4784719bd8e6debcc38c879)
commit d79b519cab977df5ad78fe44b05b12da0af347f3
Author: Günther Deschner <gd at samba.org>
Date: Wed Apr 2 15:26:27 2008 +0200
Add NT_STATUS_RPC_CANNOT_SUPPORT.
Guenther
(cherry picked from commit 9e15ce03ca66a0b5ffdb39dd2faaad6e0f967e31)
commit fff7893c02de9781f6b57683f0515ce2532a12e8
Author: Günther Deschner <gd at samba.org>
Date: Wed Apr 2 12:29:24 2008 +0200
Fix "net rpc trustdom establish" for win2k8 trusts.
When establishing trusts to a windows 2008 dc, the NetServerEnum2 RAP call fails
with some exotic RAP failure. Let's just try a netlogon getdcname call in
that case to convince ourselve we're talking to a proper machine.
Rafael, looks ok?
Guenther
(cherry picked from commit b12edbeffee1f7d1fd971cde9189e5137ddeb35b)
commit 137f24760861838a098ca31c8f5004efb7411e67
Author: Günther Deschner <gd at samba.org>
Date: Wed Apr 2 12:23:07 2008 +0200
Apply some const in clirap.
Guenther
(cherry picked from commit 8a1a9f967db25d3928f19e46d60af249f934f323)
commit 1b7af6fbfa77432aa53c46d5961135ee463c0f2b
Author: Günther Deschner <gd at samba.org>
Date: Wed Apr 2 11:18:10 2008 +0200
Some fixes for netdomjoin-gui and support for browsing/joining OUs.
Guenther
(cherry picked from commit 4714bae0dbbb2ad010c2929f83de6bca84cfac46)
commit d098105b51f05dc43f778e3ecc55abe242ec6ffe
Author: Günther Deschner <gd at samba.org>
Date: Wed Apr 2 11:14:15 2008 +0200
Make sure to hand down the domain name in libnetapi NetUnjoinDomain.
Guenther
(cherry picked from commit 0058ab30de943f134792e3d66051206086987110)
commit 2ce81928df761eaa173ed164bdb672ef513f2ced
Author: Günther Deschner <gd at samba.org>
Date: Wed Apr 2 02:29:48 2008 +0200
Fix NETLOGON credential chain with Windows 2008 all over the place.
In order to avoid receiving NT_STATUS_DOWNGRADE_DETECTED from a w2k8
netr_ServerAuthenticate2 reply, we need to start with the AD netlogon negotiate
flags everywhere (not only when running in security=ads). Only for NT4 we need
to do a downgrade to the returned negotiate flags.
Tested with w2k8, w2ksp4, w2k3r2 and nt4sp6.
Guenther
(cherry picked from commit 0970369ca0cb9ae465cff40e5c75739824daf1d0)
-----------------------------------------------------------------------
Summary of changes:
source/auth/auth_domain.c | 2 +-
source/include/nterr.h | 1 +
source/include/rpc_dce.h | 44 ++-
.../examples/netdomjoin-gui/netdomjoin-gui.c | 547 ++++++++++++++------
source/lib/netapi/joindomain.c | 18 +-
source/libnet/libnet_join.c | 3 +-
source/libsmb/clirap2.c | 2 +-
source/libsmb/nterr.c | 1 +
source/libsmb/trusts_util.c | 2 +-
source/rpc_client/cli_lsarpc.c | 14 +-
source/rpc_client/cli_netlogon.c | 11 +
source/rpc_client/cli_pipe.c | 4 +-
source/rpcclient/rpcclient.c | 2 +-
source/utils/net_rpc.c | 66 ++-
source/utils/net_rpc_join.c | 4 +-
source/utils/net_rpc_samsync.c | 2 +-
source/winbindd/winbindd_cm.c | 6 +-
17 files changed, 528 insertions(+), 201 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source/auth/auth_domain.c b/source/auth/auth_domain.c
index c9aa064..f526677 100644
--- a/source/auth/auth_domain.c
+++ b/source/auth/auth_domain.c
@@ -126,7 +126,7 @@ machine %s. Error was : %s.\n", dc_name, nt_errstr(result)));
if (!lp_client_schannel()) {
/* We need to set up a creds chain on an unauthenticated netlogon pipe. */
- uint32 neg_flags = NETLOGON_NEG_SELECT_AUTH2_FLAGS;
+ uint32_t neg_flags = NETLOGON_NEG_AUTH2_ADS_FLAGS;
uint32 sec_chan_type = 0;
unsigned char machine_pwd[16];
const char *account_name;
diff --git a/source/include/nterr.h b/source/include/nterr.h
index 5749c4e..612cf6e 100644
--- a/source/include/nterr.h
+++ b/source/include/nterr.h
@@ -566,5 +566,6 @@
#define NT_STATUS_DOWNGRADE_DETECTED NT_STATUS(0xC0000000 | 0x0388)
#define NT_STATUS_NO_SUCH_JOB NT_STATUS(0xC0000000 | 0xEDE) /* scheduler */
#define NT_STATUS_RPC_PROTSEQ_NOT_SUPPORTED NT_STATUS(0xC0000000 | 0x20004)
+#define NT_STATUS_RPC_CANNOT_SUPPORT NT_STATUS(0xC0000000 | 0x20041)
#endif /* _NTERR_H */
diff --git a/source/include/rpc_dce.h b/source/include/rpc_dce.h
index ec08eb5..33ab365 100644
--- a/source/include/rpc_dce.h
+++ b/source/include/rpc_dce.h
@@ -101,12 +101,48 @@ enum RPC_PKT_TYPE {
/* The 7 here seems to be required to get Win2k not to downgrade us
to NT4. Actually, anything other than 1ff would seem to do... */
#define NETLOGON_NEG_AUTH2_FLAGS 0x000701ff
+/*
+ (NETLOGON_NEG_ACCOUNT_LOCKOUT |
+ NETLOGON_NEG_PERSISTENT_SAMREPL |
+ NETLOGON_NEG_ARCFOUR |
+ NETLOGON_NEG_PROMOTION_COUNT |
+ NETLOGON_NEG_CHANGELOG_BDC |
+ NETLOGON_NEG_FULL_SYNC_REPL |
+ NETLOGON_NEG_MULTIPLE_SIDS |
+ NETLOGON_NEG_REDO |
+ NETLOGON_NEG_PASSWORD_CHANGE_REFUSAL |
+ NETLOGON_NEG_DNS_DOMAIN_TRUSTS |
+ NETLOGON_NEG_PASSWORD_SET2 |
+ NETLOGON_NEG_GETDOMAININFO)
+*/
#define NETLOGON_NEG_DOMAIN_TRUST_ACCOUNT 0x2010b000
-
-/* these are the flags that ADS clients use */
-#define NETLOGON_NEG_AUTH2_ADS_FLAGS (0x200fbffb | NETLOGON_NEG_ARCFOUR | NETLOGON_NEG_128BIT | NETLOGON_NEG_SCHANNEL)
-#define NETLOGON_NEG_SELECT_AUTH2_FLAGS ((lp_security() == SEC_ADS) ? NETLOGON_NEG_AUTH2_ADS_FLAGS : NETLOGON_NEG_AUTH2_FLAGS)
+/* these are the flags that ADS clients use */
+#define NETLOGON_NEG_AUTH2_ADS_FLAGS 0x600fffff
+/*
+ (NETLOGON_NEG_ACCOUNT_LOCKOUT |
+ NETLOGON_NEG_PERSISTENT_SAMREPL |
+ NETLOGON_NEG_ARCFOUR |
+ NETLOGON_NEG_PROMOTION_COUNT |
+ NETLOGON_NEG_CHANGELOG_BDC |
+ NETLOGON_NEG_FULL_SYNC_REPL |
+ NETLOGON_NEG_MULTIPLE_SIDS |
+ NETLOGON_NEG_REDO |
+ NETLOGON_NEG_PASSWORD_CHANGE_REFUSAL |
+ NETLOGON_NEG_SEND_PASSWORD_INFO_PDC |
+ NETLOGON_NEG_GENERIC_PASSTHROUGH |
+ NETLOGON_NEG_CONCURRENT_RPC |
+ NETLOGON_NEG_AVOID_ACCOUNT_DB_REPL |
+ NETLOGON_NEG_AVOID_SECURITYAUTH_DB_REPL |
+ NETLOGON_NEG_128BIT |
+ NETLOGON_NEG_TRANSITIVE_TRUSTS |
+ NETLOGON_NEG_DNS_DOMAIN_TRUSTS |
+ NETLOGON_NEG_PASSWORD_SET2 |
+ NETLOGON_NEG_GETDOMAININFO |
+ NETLOGON_NEG_CROSS_FOREST_TRUSTS |
+ NETLOGON_NEG_AUTHENTICATED_RPC_LSASS |
+ NETLOGON_NEG_SCHANNEL)
+*/
enum schannel_direction {
SENDER_IS_INITIATOR,
diff --git a/source/lib/netapi/examples/netdomjoin-gui/netdomjoin-gui.c b/source/lib/netapi/examples/netdomjoin-gui/netdomjoin-gui.c
index a3719c7..a4daf4f 100644
--- a/source/lib/netapi/examples/netdomjoin-gui/netdomjoin-gui.c
+++ b/source/lib/netapi/examples/netdomjoin-gui/netdomjoin-gui.c
@@ -63,14 +63,17 @@ typedef struct join_state {
GtkWidget *entry_account;
GtkWidget *entry_password;
GtkWidget *entry_domain;
+ GtkWidget *entry_ou_list;
GtkWidget *entry_workgroup;
GtkWidget *button_ok;
GtkWidget *button_apply;
GtkWidget *button_ok_creds;
+ GtkWidget *button_get_ous;
GtkWidget *label_reboot;
GtkWidget *label_current_name_buffer;
GtkWidget *label_current_name_type;
GtkWidget *label_full_computer_name;
+ GtkWidget *label_winbind;
uint16_t name_type_initial;
uint16_t name_type_new;
char *name_buffer_initial;
@@ -111,10 +114,40 @@ static gboolean callback_delete_event(GtkWidget *widget,
static void callback_do_close(GtkWidget *widget,
gpointer data)
{
- debug("Closing now...\n");
+ debug("callback_do_close called\n");
+
gtk_widget_destroy(data);
}
+static void callback_do_freeauth(GtkWidget *widget,
+ gpointer data)
+{
+ struct join_state *state = (struct join_state *)data;
+
+ debug("callback_do_freeauth called\n");
+
+ SAFE_FREE(state->account);
+ SAFE_FREE(state->password);
+
+ if (state->window_creds_prompt) {
+ gtk_widget_destroy(state->window_creds_prompt);
+ }
+}
+
+static void callback_do_freeauth_and_close(GtkWidget *widget,
+ gpointer data)
+{
+ struct join_state *state = (struct join_state *)data;
+
+ debug("callback_do_freeauth_and_close called\n");
+
+ SAFE_FREE(state->account);
+ SAFE_FREE(state->password);
+
+ gtk_widget_destroy(state->window_creds_prompt);
+ gtk_widget_destroy(state->window_do_change);
+}
+
static void free_join_state(struct join_state *s)
{
SAFE_FREE(s->name_buffer_initial);
@@ -155,6 +188,8 @@ static void callback_apply_description_change(GtkWidget *widget,
GTK_BUTTONS_OK,
"Failed to change computer description: %s.",
libnetapi_get_error_string(state->ctx, status));
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
+
g_signal_connect_swapped(dialog, "response",
G_CALLBACK(gtk_widget_destroy),
dialog);
@@ -183,6 +218,7 @@ static void callback_do_exit(GtkWidget *widget,
GTK_MESSAGE_QUESTION,
GTK_BUTTONS_YES_NO,
"You must restart your computer before the new settings will take effect.");
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
result = gtk_dialog_run(GTK_DIALOG(dialog));
switch (result) {
case GTK_RESPONSE_YES:
@@ -214,6 +250,7 @@ static void callback_do_reboot(GtkWidget *widget,
GTK_MESSAGE_INFO,
GTK_BUTTONS_OK,
"You must restart this computer for the changes to take effect.");
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
#if 0
g_signal_connect_swapped(dialog, "response",
G_CALLBACK(gtk_widget_destroy),
@@ -269,10 +306,14 @@ static void callback_return_username(GtkWidget *widget,
{
const gchar *entry_text;
struct join_state *state = (struct join_state *)data;
+ debug("callback_return_username called\n");
if (!widget) {
return;
}
entry_text = gtk_entry_get_text(GTK_ENTRY(widget));
+ if (!entry_text) {
+ return;
+ }
debug("callback_return_username: %s\n", entry_text);
SAFE_FREE(state->account);
state->account = strdup(entry_text);
@@ -287,7 +328,10 @@ static void callback_return_username_and_enter(GtkWidget *widget,
return;
}
entry_text = gtk_entry_get_text(GTK_ENTRY(widget));
- debug("callback_return_username: %s\n", entry_text);
+ if (!entry_text) {
+ return;
+ }
+ debug("callback_return_username_and_enter: %s\n", entry_text);
SAFE_FREE(state->account);
state->account = strdup(entry_text);
g_signal_emit_by_name(state->button_ok_creds, "clicked");
@@ -298,10 +342,14 @@ static void callback_return_password(GtkWidget *widget,
{
const gchar *entry_text;
struct join_state *state = (struct join_state *)data;
+ debug("callback_return_password called\n");
if (!widget) {
return;
}
entry_text = gtk_entry_get_text(GTK_ENTRY(widget));
+ if (!entry_text) {
+ return;
+ }
#ifdef DEBUG_PASSWORD
debug("callback_return_password: %s\n", entry_text);
#else
@@ -320,16 +368,59 @@ static void callback_return_password_and_enter(GtkWidget *widget,
return;
}
entry_text = gtk_entry_get_text(GTK_ENTRY(widget));
+ if (!entry_text) {
+ return;
+ }
#ifdef DEBUG_PASSWORD
- debug("callback_return_password: %s\n", entry_text);
+ debug("callback_return_password_and_enter: %s\n", entry_text);
#else
- debug("callback_return_password: (not printed)\n");
+ debug("callback_return_password_and_enter: (not printed)\n");
#endif
SAFE_FREE(state->password);
state->password = strdup(entry_text);
g_signal_emit_by_name(state->button_ok_creds, "clicked");
}
+static void callback_do_storeauth(GtkWidget *widget,
+ gpointer data)
+{
+ struct join_state *state = (struct join_state *)data;
+
+ debug("callback_do_storeauth called\n");
+
+ SAFE_FREE(state->account);
+ SAFE_FREE(state->password);
+
+ callback_return_username(state->entry_account, state);
+ callback_return_password(state->entry_password, state);
+
+ gtk_widget_destroy(state->window_creds_prompt);
+}
+
+static void callback_continue(GtkWidget *widget,
+ gpointer data)
+{
+ struct join_state *state = (struct join_state *)data;
+
+ gtk_widget_grab_focus(GTK_WIDGET(state->button_ok));
+ g_signal_emit_by_name(state->button_ok, "clicked");
+}
+
+static void callback_do_storeauth_and_continue(GtkWidget *widget,
+ gpointer data)
+{
+ callback_do_storeauth(widget, data);
+ callback_continue(NULL, data);
+}
+
+static void callback_do_storeauth_and_scan(GtkWidget *widget,
+ gpointer data)
+{
+ struct join_state *state = (struct join_state *)data;
+ callback_do_storeauth(widget, data);
+ g_signal_emit_by_name(state->button_get_ous, "clicked");
+}
+
static void callback_do_hostname_change(GtkWidget *widget,
gpointer data)
{
@@ -355,12 +446,112 @@ static void callback_do_hostname_change(GtkWidget *widget,
GTK_BUTTONS_CLOSE,
str);
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
g_signal_connect_swapped(dialog, "response",
G_CALLBACK(gtk_widget_destroy),
dialog);
gtk_widget_show(dialog);
}
+static void callback_creds_prompt(GtkWidget *widget,
+ gpointer data,
+ const char *label_string,
+ gpointer cont_fn)
+{
+ GtkWidget *window;
+ GtkWidget *box1;
+ GtkWidget *bbox;
+ GtkWidget *button;
+ GtkWidget *label;
+
+ struct join_state *state = (struct join_state *)data;
+
+ debug("callback_creds_prompt\n");
+
+ window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_modal(GTK_WINDOW(window), TRUE);
+
+ gtk_window_set_title(GTK_WINDOW(window), "Computer Name Changes");
+ gtk_window_set_resizable(GTK_WINDOW(window), FALSE);
+ gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
+ gtk_widget_set_size_request(GTK_WIDGET(window), 380, 280);
+ gtk_window_set_icon_from_file(GTK_WINDOW(window), SAMBA_ICON_PATH, NULL);
+
+ g_signal_connect(G_OBJECT(window), "delete_event",
+ G_CALLBACK(callback_do_close), window);
+
+ state->window_creds_prompt = window;
+ gtk_container_set_border_width(GTK_CONTAINER(window), 10);
+
+ box1 = gtk_vbox_new(FALSE, 0);
+
+ gtk_container_add(GTK_CONTAINER(window), box1);
+
+ label = gtk_label_new(label_string);
+ gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
+ gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
+
+ gtk_box_pack_start(GTK_BOX(box1), label, FALSE, FALSE, 0);
+
+ gtk_widget_show(label);
+
+ /* USER NAME */
+ label = gtk_label_new("User name:");
+ gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
+ gtk_box_pack_start(GTK_BOX(box1), label, FALSE, FALSE, 0);
+ gtk_widget_show(label);
+
+ state->entry_account = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(state->entry_account), MAX_CRED_LEN);
+ g_signal_connect(G_OBJECT(state->entry_account), "activate",
+ G_CALLBACK(callback_return_username_and_enter),
+ (gpointer)state);
+ gtk_editable_select_region(GTK_EDITABLE(state->entry_account),
+ 0, GTK_ENTRY(state->entry_account)->text_length);
+ gtk_box_pack_start(GTK_BOX(box1), state->entry_account, TRUE, TRUE, 0);
+ gtk_widget_show(state->entry_account);
+
+ /* PASSWORD */
+ label = gtk_label_new("Password:");
+ gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
+ gtk_box_pack_start(GTK_BOX(box1), label, FALSE, FALSE, 0);
+ gtk_widget_show(label);
+
+ state->entry_password = gtk_entry_new();
+ gtk_entry_set_max_length(GTK_ENTRY(state->entry_password), MAX_CRED_LEN);
+ gtk_entry_set_visibility(GTK_ENTRY(state->entry_password), FALSE);
+ g_signal_connect(G_OBJECT(state->entry_password), "activate",
+ G_CALLBACK(callback_return_password_and_enter),
+ (gpointer)state);
+ gtk_editable_set_editable(GTK_EDITABLE(state->entry_password), TRUE);
+ gtk_editable_select_region(GTK_EDITABLE(state->entry_password),
+ 0, GTK_ENTRY(state->entry_password)->text_length);
+ gtk_box_pack_start(GTK_BOX(box1), state->entry_password, TRUE, TRUE, 0);
+ gtk_widget_show(state->entry_password);
+
+ /* BUTTONS */
+ bbox = gtk_hbutton_box_new();
+ gtk_container_set_border_width(GTK_CONTAINER(bbox), 5);
+ gtk_container_add(GTK_CONTAINER(box1), bbox);
+ gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
+ gtk_box_set_spacing(GTK_BOX(bbox), 10);
+
+ state->button_ok_creds = gtk_button_new_from_stock(GTK_STOCK_OK);
+ gtk_widget_grab_focus(GTK_WIDGET(state->button_ok_creds));
+ gtk_container_add(GTK_CONTAINER(bbox), state->button_ok_creds);
+ g_signal_connect(G_OBJECT(state->button_ok_creds), "clicked",
+ G_CALLBACK(cont_fn),
+ (gpointer)state);
+ gtk_widget_show(state->button_ok_creds);
+
+ button = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+ gtk_container_add(GTK_CONTAINER(bbox), button);
+ g_signal_connect(G_OBJECT(button), "clicked",
+ G_CALLBACK(callback_do_freeauth),
+ (gpointer)state);
+ gtk_widget_show_all(window);
+}
+
static void callback_do_join(GtkWidget *widget,
gpointer data)
{
@@ -372,16 +563,17 @@ static void callback_do_join(GtkWidget *widget,
uint32_t unjoin_flags = 0;
gboolean domain_join = FALSE;
gboolean try_unjoin = FALSE;
+ gboolean join_creds_required = TRUE;
+ gboolean unjoin_creds_required = TRUE;
const char *new_workgroup_type = NULL;
const char *initial_workgroup_type = NULL;
+ const char *account_ou = NULL;
struct join_state *state = (struct join_state *)data;
- callback_return_username(state->entry_account, state);
- callback_return_password(state->entry_password, state);
-
- if (state->window_creds_prompt) {
- gtk_widget_destroy(GTK_WIDGET(state->window_creds_prompt));
+ if (state->hostname_changed) {
+ callback_do_hostname_change(NULL, state);
+ return;
}
switch (state->name_type_initial) {
@@ -406,8 +598,20 @@ static void callback_do_join(GtkWidget *widget,
break;
}
+ account_ou = gtk_combo_box_get_active_text(GTK_COMBO_BOX(state->entry_ou_list));
+ if (account_ou && strlen(account_ou) == 0) {
+ account_ou = NULL;
+ }
+
+ if ((state->name_type_initial != NetSetupDomainName) &&
+ (state->name_type_new != NetSetupDomainName)) {
+ join_creds_required = FALSE;
+ unjoin_creds_required = FALSE;
+ }
+
if (state->name_type_new == NetSetupDomainName) {
domain_join = TRUE;
+ join_creds_required = TRUE;
join_flags = WKSSVC_JOIN_FLAGS_JOIN_TYPE |
WKSSVC_JOIN_FLAGS_ACCOUNT_CREATE |
WKSSVC_JOIN_FLAGS_DOMAIN_JOIN_IF_JOINED; /* for testing */
@@ -416,30 +620,36 @@ static void callback_do_join(GtkWidget *widget,
if ((state->name_type_initial == NetSetupDomainName) &&
(state->name_type_new == NetSetupWorkgroupName)) {
try_unjoin = TRUE;
+ unjoin_creds_required = TRUE;
+ join_creds_required = FALSE;
unjoin_flags = WKSSVC_JOIN_FLAGS_JOIN_TYPE |
WKSSVC_JOIN_FLAGS_ACCOUNT_DELETE;
}
- debug("callback_do_join: Joining a %s named %s using join_flags 0x%08x ",
- new_workgroup_type,
- state->name_buffer_new,
- join_flags);
- if (domain_join) {
- debug("as %s ", state->account);
-#ifdef DEBUG_PASSWORD
- debug("with %s ", state->password);
-#endif
- }
- debug("\n");
if (try_unjoin) {
debug("callback_do_join: Unjoining\n");
+ if (unjoin_creds_required) {
+ if (!state->account || !state->password) {
+ debug("callback_do_join: no creds yet\n");
+ callback_creds_prompt(NULL, state,
+ "Enter the name and password of an account with permission to leave the domain.",
+ callback_do_storeauth_and_continue);
+ }
+
+ if (!state->account || !state->password) {
+ debug("callback_do_join: still no creds???\n");
+ return;
+ }
+ }
+
status = NetUnjoinDomain(NULL,
state->account,
state->password,
unjoin_flags);
if (status != 0) {
+ callback_do_freeauth(NULL, state);
err_str = libnetapi_get_error_string(state->ctx, status);
g_print("callback_do_join: failed to unjoin (%s)\n",
err_str);
@@ -452,18 +662,47 @@ static void callback_do_join(GtkWidget *widget,
initial_workgroup_type,
state->name_buffer_initial,
err_str);
+ gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);
gtk_dialog_run(GTK_DIALOG(dialog));
gtk_widget_destroy(dialog);
}
}
+
+ if (join_creds_required) {
+ if (!state->account || !state->password) {
+ debug("callback_do_join: no creds yet\n");
+ callback_creds_prompt(NULL, state,
+ "Enter the name and password of an account with permission to leave the domain.",
+ callback_do_storeauth_and_continue);
+ }
+
+ if (!state->account || !state->password) {
+ debug("callback_do_join: still no creds???\n");
--
Samba Shared Repository
More information about the samba-cvs
mailing list