r10402: Make the RPC-SAMLOGON test pass against Win2k3 SP0 again.
authorAndrew Bartlett <abartlet@samba.org>
Thu, 22 Sep 2005 01:50:58 +0000 (01:50 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:38:39 +0000 (13:38 -0500)
I still have issues with Win2k3 SP1, and Samba4 doesn't pass it's own
test for the moment, but I'm working on these issues :-)

This required a change to the credentials API, so that the special
case for NTLM logins using a principal was indeed handled as a
special, not general case.

Also don't set the realm from a ccache, as then it overrides --option=realm=.

Andrew Bartlett
(This used to be commit 194e8f07c0cb4685797c5a7a074577c62dfdebe3)

14 files changed:
source4/auth/kerberos/kerberos_util.c
source4/auth/ntlmssp/ntlmssp_client.c
source4/client/client.c
source4/lib/cmdline/credentials.c
source4/lib/credentials.c
source4/lib/messaging/config.mk
source4/libcli/composite/sesssetup.c
source4/librpc/rpc/dcerpc_schannel.c
source4/scripting/ejs/smbcalls_auth.c
source4/scripting/ejs/smbcalls_creds.c
source4/torture/rpc/netlogon.c
source4/torture/rpc/samlogon.c
source4/torture/rpc/schannel.c
source4/utils/net/net_password.c

index d0bb2f4f5213a5f997eb3c0f9270e5a121f1a319..3a6aff9df892deb4a2ae7d83122e809e193de635 100644 (file)
@@ -60,7 +60,7 @@ krb5_error_code salt_principal_from_credentials(TALLOC_CTX *parent_ctx,
                return ENOMEM;
        }
        
-       machine_username = talloc_strdup(mem_ctx, cli_credentials_get_username(machine_account, mem_ctx));
+       machine_username = talloc_strdup(mem_ctx, cli_credentials_get_username(machine_account));
 
        if (!machine_username) {
                talloc_free(mem_ctx);
index feee14a8573dddb6f27d23209f18666a8749eb0a..7801e0208d2145c9c09fc13ead6fb3f696da279b 100644 (file)
@@ -164,8 +164,8 @@ NTSTATUS ntlmssp_client_challenge(struct gensec_security *gensec_security,
                return NT_STATUS_INVALID_PARAMETER;
        }
 
-       user = cli_credentials_get_username(gensec_security->credentials, out_mem_ctx);
-       domain = cli_credentials_get_domain(gensec_security->credentials);
+       cli_credentials_get_ntlm_username_domain(gensec_security->credentials, out_mem_ctx, 
+                                                &user, &domain);
 
        nt_hash = cli_credentials_get_nt_hash(gensec_security->credentials, out_mem_ctx);
 
index 58fb8cc3509d3397a8a7c04bd85cf5ece7531118..b6b95a4ebd883d0e261aca2309a7dc55eeb6c4c5 100644 (file)
@@ -197,7 +197,7 @@ static void send_message(void)
        int total_len = 0;
        int grp_id;
 
-       if (!smbcli_message_start(cli->tree, desthost, cli_credentials_get_username(cmdline_credentials, cmdline_credentials), &grp_id)) {
+       if (!smbcli_message_start(cli->tree, desthost, cli_credentials_get_username(cmdline_credentials), &grp_id)) {
                d_printf("message start: %s\n", smbcli_errstr(cli->tree));
                return;
        }
index f1646631180eb9ef174ad6fe8a4ae2e85bde2cee..a3d4920e6d24936d078f1718dfd7762c40f1464a 100644 (file)
@@ -32,8 +32,7 @@ static const char *cmdline_get_userpassword(struct cli_credentials *credentials)
        const char *username;
        TALLOC_CTX *mem_ctx = talloc_new(NULL);
 
-       domain = cli_credentials_get_domain(credentials);
-       username = cli_credentials_get_username(credentials, mem_ctx);
+       cli_credentials_get_ntlm_username_domain(credentials, mem_ctx, &username, &domain);
        if (domain && domain[0]) {
                prompt = talloc_asprintf(mem_ctx, "Password for [%s\\%s]:", 
                                         domain, username);
index 4650fee1af149896169d7af5372f12140b9f3299..045047d358a9f6728810f6462aaedf6d299c96b3 100644 (file)
@@ -58,23 +58,18 @@ struct cli_credentials *cli_credentials_init(TALLOC_CTX *mem_ctx)
  * @retval The username set on this context.
  * @note Return value will never be NULL except by programmer error.
  */
-const char *cli_credentials_get_username(struct cli_credentials *cred, TALLOC_CTX *mem_ctx)
+const char *cli_credentials_get_username(struct cli_credentials *cred)
 {
        if (cred->machine_account_pending) {
                cli_credentials_set_machine_account(cred);
        }
 
-       /* If we have a principal set on this, we want to login with "" domain and user@realm */
-       if (cred->username_obtained < cred->principal_obtained) {
-               return cli_credentials_get_principal(cred, mem_ctx);
-       }
-
        if (cred->username_obtained == CRED_CALLBACK) {
                cred->username = cred->username_cb(cred);
                cred->username_obtained = CRED_SPECIFIED;
        }
 
-       return talloc_reference(mem_ctx, cred->username);
+       return cred->username;
 }
 
 BOOL cli_credentials_set_username(struct cli_credentials *cred, 
@@ -122,10 +117,12 @@ const char *cli_credentials_get_principal(struct cli_credentials *cred, TALLOC_C
 
        if (cred->principal_obtained < cred->username_obtained) {
                if (cred->domain_obtained > cred->realm_obtained) {
-                       return NULL;
+                       return talloc_asprintf(mem_ctx, "%s@%s", 
+                                              cli_credentials_get_username(cred),
+                                              cli_credentials_get_domain(cred));
                } else {
                        return talloc_asprintf(mem_ctx, "%s@%s", 
-                                              cli_credentials_get_username(cred, mem_ctx),
+                                              cli_credentials_get_username(cred),
                                               cli_credentials_get_realm(cred));
                }
        }
@@ -283,7 +280,6 @@ int cli_credentials_set_from_ccache(struct cli_credentials *cred,
 
        realm = krb5_princ_realm(cred->ccache->smb_krb5_context->krb5_context, princ);
 
-       cli_credentials_set_realm(cred, *realm, obtained);
        cli_credentials_set_principal(cred, name, obtained);
 
        free(name);
@@ -466,11 +462,6 @@ const char *cli_credentials_get_domain(struct cli_credentials *cred)
                cli_credentials_set_machine_account(cred);
        }
 
-       /* If we have a principal set on this, we want to login with "" domain and user@realm */
-       if (cred->domain_obtained < cred->principal_obtained) {
-               return "";
-       }
-
        if (cred->domain_obtained == CRED_CALLBACK) {
                cred->domain = cred->domain_cb(cred);
                cred->domain_obtained = CRED_SPECIFIED;
@@ -505,6 +496,19 @@ BOOL cli_credentials_set_domain_callback(struct cli_credentials *cred,
        return False;
 }
 
+void cli_credentials_get_ntlm_username_domain(struct cli_credentials *cred, TALLOC_CTX *mem_ctx, 
+                                             const char **username, 
+                                             const char **domain) 
+{
+       if (cred->principal_obtained > cred->username_obtained) {
+               *domain = talloc_strdup(mem_ctx, "");
+               *username = cli_credentials_get_principal(cred, mem_ctx);
+       } else {
+               *domain = cli_credentials_get_domain(cred);
+               *username = cli_credentials_get_username(cred);
+       }
+}
+
 /**
  * Obtain the Kerberos realm for this credentials context.
  * @param cred credentials context
@@ -1028,7 +1032,7 @@ void cli_credentials_set_anonymous(struct cli_credentials *cred)
 BOOL cli_credentials_is_anonymous(struct cli_credentials *cred)
 {
        TALLOC_CTX *tmp_ctx = talloc_new(cred);
-       const char *username = cli_credentials_get_username(cred, tmp_ctx);
+       const char *username = cli_credentials_get_username(cred);
        
        /* Yes, it is deliberate that we die if we have a NULL pointer
         * here - anonymous is "", not NULL, which is 'never specified,
index c94d137d3f6a6921e4eaf9be11ea338051f1a20a..2cba66f0a36b74e5496c77a8d264867d68439995 100644 (file)
@@ -4,6 +4,8 @@
 [SUBSYSTEM::MESSAGING]
 INIT_OBJ_FILES = \
                lib/messaging/messaging.o
+# \
+#              lib/messaging/msgutil.o
 NOPROTO = YES
 REQUIRED_SUBSYSTEMS = \
                NDR_IRPC \
index b925f99bed2f8fe017dd55787a6da88b041533ee..3bd9ed285d5a5a14586abaa32200c0bdac958e87 100644 (file)
@@ -174,8 +174,9 @@ static NTSTATUS session_setup_nt1(struct composite_context *c,
        state->setup.nt1.in.capabilities = io->in.capabilities;
        state->setup.nt1.in.os           = "Unix";
        state->setup.nt1.in.lanman       = talloc_asprintf(state, "Samba %s", SAMBA_VERSION_STRING);
-       state->setup.nt1.in.user         = cli_credentials_get_username(io->in.credentials, state);
-       state->setup.nt1.in.domain       = cli_credentials_get_domain(io->in.credentials);
+       cli_credentials_get_ntlm_username_domain(io->in.credentials, state, 
+                                                &state->setup.nt1.in.user,
+                                                &state->setup.nt1.in.domain);
 
        if (!password) {
                state->setup.nt1.in.password1 = data_blob(NULL, 0);
@@ -259,10 +260,11 @@ static NTSTATUS session_setup_old(struct composite_context *c,
        state->setup.old.in.mpx_max = session->transport->options.max_mux;
        state->setup.old.in.vc_num  = 1;
        state->setup.old.in.sesskey = io->in.sesskey;
-       state->setup.old.in.domain  = cli_credentials_get_domain(io->in.credentials);
-       state->setup.old.in.user    = cli_credentials_get_username(io->in.credentials, state);
        state->setup.old.in.os      = "Unix";
        state->setup.old.in.lanman  = talloc_asprintf(state, "Samba %s", SAMBA_VERSION_STRING);
+       cli_credentials_get_ntlm_username_domain(io->in.credentials, state, 
+                                                &state->setup.old.in.user,
+                                                &state->setup.old.in.domain);
        
        if (!password) {
                state->setup.old.in.password = data_blob(NULL, 0);
index 77c8c028af4d0683cbcb204840c0188c9372436d..ae4ce9426923319bce86ec5ba0e76c36a5fd22fa 100644 (file)
@@ -110,7 +110,7 @@ static NTSTATUS dcerpc_schannel_key(TALLOC_CTX *tmp_ctx,
                          negotiate_flags);
 
        a.in.server_name = r.in.server_name;
-       a.in.account_name = cli_credentials_get_username(credentials, tmp_ctx);
+       a.in.account_name = cli_credentials_get_username(credentials);
        a.in.secure_channel_type = 
                cli_credentials_get_secure_channel_type(credentials);
        a.in.computer_name = cli_credentials_get_workstation(credentials);
@@ -153,7 +153,7 @@ NTSTATUS dcerpc_bind_auth_schannel(TALLOC_CTX *tmp_ctx,
 
        if (!NT_STATUS_IS_OK(status)) {
                DEBUG(1, ("Failed to setup credentials for account %s: %s\n",
-                         cli_credentials_get_username(credentials, tmp_ctx), 
+                         cli_credentials_get_username(credentials), 
                          nt_errstr(status)));
                return status;
        }
index e3b48490f6c8d41468c293ff475ec02a88972e28..672694bbc57751ab7bec0ab49d296e07b75c92ae 100644 (file)
@@ -122,7 +122,7 @@ static int ejs_userAuth(MprVarHandle eid, int argc, struct MprVar **argv)
 
        tmp_ctx = talloc_new(mprMemCtx());      
        
-       username    = cli_credentials_get_username(creds, tmp_ctx);
+       username    = cli_credentials_get_username(creds);
        password    = cli_credentials_get_password(creds);
        domain      = cli_credentials_get_domain(creds);
        remote_host = cli_credentials_get_workstation(creds);
index f9d231293ae9be24a6b064436e7573fd024e29a3..cc2ccf8c47455c9aa67519b01e635e6e89e1d8de 100644 (file)
@@ -73,7 +73,7 @@ static int ejs_creds_get_username(MprVarHandle eid, int argc, struct MprVar **ar
 {
        struct cli_credentials *creds = ejs_creds_get_credentials(eid);
 
-       mpr_Return(eid, mprString(cli_credentials_get_username(creds, mprMemCtx())));
+       mpr_Return(eid, mprString(cli_credentials_get_username(creds)));
        return 0;
 }
 
index 2ac5e390844c2a29f2ffd700c5377764774988fa..a8d881f6659daaa62fe8148abf989b2b66e74427 100644 (file)
@@ -38,7 +38,7 @@ static BOOL test_LogonUasLogon(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
        struct netr_LogonUasLogon r;
 
        r.in.server_name = NULL;
-       r.in.account_name = cli_credentials_get_username(cmdline_credentials, mem_ctx);
+       r.in.account_name = cli_credentials_get_username(cmdline_credentials);
        r.in.workstation = TEST_MACHINE_NAME;
 
        printf("Testing LogonUasLogon\n");
@@ -59,7 +59,7 @@ static BOOL test_LogonUasLogoff(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
        struct netr_LogonUasLogoff r;
 
        r.in.server_name = NULL;
-       r.in.account_name = cli_credentials_get_username(cmdline_credentials, mem_ctx);
+       r.in.account_name = cli_credentials_get_username(cmdline_credentials);
        r.in.workstation = TEST_MACHINE_NAME;
 
        printf("Testing LogonUasLogoff\n");
@@ -487,7 +487,7 @@ static BOOL test_SamLogon(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
        struct netr_LogonSamLogon r;
        struct netr_Authenticator auth, auth2;
        struct netr_NetworkInfo ninfo;
-       const char *username = cli_credentials_get_username(cmdline_credentials, mem_ctx);
+       const char *username = cli_credentials_get_username(cmdline_credentials);
        const char *password = cli_credentials_get_password(cmdline_credentials);
        struct creds_CredentialState *creds;
 
index 42051795c8359642d6101ef4316bd31ac105d11e..06dcecb9e75c5dde3d1187c83c2b99de4da853e0 100644 (file)
@@ -52,7 +52,7 @@ struct samlogon_state {
        struct netr_LogonSamLogonWithFlags r_flags;
        struct netr_Authenticator auth, auth2;
        struct creds_CredentialState *creds;
-
+       NTSTATUS expected_error;
        DATA_BLOB chall;
 };
 
@@ -335,12 +335,18 @@ static BOOL test_lm_ntlm_broken(struct samlogon_state *samlogon_state, enum ntlm
                return ((break_which == BREAK_NT) || (break_which == BREAK_BOTH));
        }
 
-       if (!NT_STATUS_IS_OK(nt_status)) {
+       if (!NT_STATUS_EQUAL(samlogon_state->expected_error, nt_status)) {
+               SAFE_FREE(*error_string);
+               asprintf(error_string, "Expected error: %s, got %s", nt_errstr(samlogon_state->expected_error), nt_errstr(nt_status));
+               return False;
+       } else if (NT_STATUS_EQUAL(samlogon_state->expected_error, nt_status) && !NT_STATUS_IS_OK(nt_status)) {
+               return True;
+       } else if (!NT_STATUS_IS_OK(nt_status)) {
                return False;
        }
 
        if (break_which == NO_NT && !lm_good) {
-               printf("LM password is 'long' (> 14 chars and therefore invalid) but login did not fail!");
+               *error_string = strdup("LM password is 'long' (> 14 chars and therefore invalid) but login did not fail!");
                return False;
        }
 
@@ -362,7 +368,7 @@ static BOOL test_lm_ntlm_broken(struct samlogon_state *samlogon_state, enum ntlm
                memset(lm_key_expected+8, '\0', 8);
                if (memcmp(lm_key_expected, user_session_key, 
                           16) != 0) {
-                       printf("NT Session Key does not match expectations (should be first-8 LM hash)!\n");
+                       *error_string = strdup("NT Session Key does not match expectations (should be first-8 LM hash)!\n");
                        printf("user_session_key:\n");
                        dump_data(1, user_session_key, sizeof(user_session_key));
                        printf("expected:\n");
@@ -374,7 +380,7 @@ static BOOL test_lm_ntlm_broken(struct samlogon_state *samlogon_state, enum ntlm
        default:
                if (memcmp(session_key.data, user_session_key, 
                           sizeof(user_session_key)) != 0) {
-                       printf("NT Session Key does not match expectations!\n");
+                       *error_string = strdup("NT Session Key does not match expectations!\n");
                        printf("user_session_key:\n");
                        dump_data(1, user_session_key, 16);
                        printf("expected:\n");
@@ -433,7 +439,13 @@ static BOOL test_ntlm_in_lm(struct samlogon_state *samlogon_state, char **error_
                                   user_session_key,
                                   error_string);
        
-       if (!NT_STATUS_IS_OK(nt_status)) {
+       if (!NT_STATUS_EQUAL(samlogon_state->expected_error, nt_status)) {
+               SAFE_FREE(*error_string);
+               asprintf(error_string, "Expected error: %s, got %s", nt_errstr(samlogon_state->expected_error), nt_errstr(nt_status));
+               return False;
+       } else if (NT_STATUS_EQUAL(samlogon_state->expected_error, nt_status) && !NT_STATUS_IS_OK(nt_status)) {
+               return True;
+       } else if (!NT_STATUS_IS_OK(nt_status)) {
                return False;
        }
 
@@ -503,6 +515,16 @@ static BOOL test_ntlm_in_both(struct samlogon_state *samlogon_state, char **erro
                                   user_session_key,
                                   error_string);
        
+       if (!NT_STATUS_EQUAL(samlogon_state->expected_error, nt_status)) {
+               SAFE_FREE(*error_string);
+               asprintf(error_string, "Expected error: %s, got %s", nt_errstr(samlogon_state->expected_error), nt_errstr(nt_status));
+               return False;
+       } else if (NT_STATUS_EQUAL(samlogon_state->expected_error, nt_status) && !NT_STATUS_IS_OK(nt_status)) {
+               return True;
+       } else if (!NT_STATUS_IS_OK(nt_status)) {
+               return False;
+       }
+
        if (!NT_STATUS_IS_OK(nt_status)) {
                return False;
        }
@@ -601,10 +623,17 @@ static BOOL test_lmv2_ntlmv2_broken(struct samlogon_state *samlogon_state,
                return break_which == BREAK_BOTH;
        }
 
-       if (!NT_STATUS_IS_OK(nt_status)) {
+       if (!NT_STATUS_EQUAL(samlogon_state->expected_error, nt_status)) {
+               SAFE_FREE(*error_string);
+               asprintf(error_string, "Expected error: %s, got %s", nt_errstr(samlogon_state->expected_error), nt_errstr(nt_status));
+               return False;
+       } else if (NT_STATUS_EQUAL(samlogon_state->expected_error, nt_status) && !NT_STATUS_IS_OK(nt_status)) {
+               return True;
+       } else if (!NT_STATUS_IS_OK(nt_status)) {
                return False;
        }
 
+
        switch (break_which) {
        case NO_NT:
                if (memcmp(lmv2_session_key.data, user_session_key,
@@ -752,7 +781,13 @@ static BOOL test_lmv2_ntlm_broken(struct samlogon_state *samlogon_state,
                return ((break_which == BREAK_NT) || (break_which == BREAK_BOTH));
        }
 
-       if (!NT_STATUS_IS_OK(nt_status)) {
+       if (!NT_STATUS_EQUAL(samlogon_state->expected_error, nt_status)) {
+               SAFE_FREE(*error_string);
+               asprintf(error_string, "Expected error: %s, got %s", nt_errstr(samlogon_state->expected_error), nt_errstr(nt_status));
+               return False;
+       } else if (NT_STATUS_EQUAL(samlogon_state->expected_error, nt_status) && !NT_STATUS_IS_OK(nt_status)) {
+               return True;
+       } else if (!NT_STATUS_IS_OK(nt_status)) {
                return False;
        }
 
@@ -1006,7 +1041,13 @@ static BOOL test_ntlm2(struct samlogon_state *samlogon_state, char **error_strin
                                   user_session_key,
                                   error_string);
        
-       if (!NT_STATUS_IS_OK(nt_status)) {
+       if (!NT_STATUS_EQUAL(samlogon_state->expected_error, nt_status)) {
+               SAFE_FREE(*error_string);
+               asprintf(error_string, "Expected error: %s, got %s", nt_errstr(samlogon_state->expected_error), nt_errstr(nt_status));
+               return False;
+       } else if (NT_STATUS_EQUAL(samlogon_state->expected_error, nt_status) && !NT_STATUS_IS_OK(nt_status)) {
+               return True;
+       } else if (!NT_STATUS_IS_OK(nt_status)) {
                return False;
        }
 
@@ -1175,7 +1216,7 @@ static const struct ntlm_tests {
 static BOOL test_SamLogon(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 
                          struct creds_CredentialState *creds, 
                          const char *account_domain, const char *account_name, 
-                         const char *plain_pass,
+                         const char *plain_pass, NTSTATUS expected_error,
                          int n_subtests)
 {
        TALLOC_CTX *fn_ctx = talloc_named(mem_ctx, 0, "test_SamLogon function-level context");
@@ -1196,7 +1237,7 @@ static BOOL test_SamLogon(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
        samlogon_state.password = plain_pass;
        samlogon_state.p = p;
        samlogon_state.creds = creds;
-
+       samlogon_state.expected_error = expected_error;
        samlogon_state.chall = data_blob_talloc(fn_ctx, NULL, 8);
 
        generate_random_buffer(samlogon_state.chall.data, 8);
@@ -1263,7 +1304,7 @@ BOOL test_InteractiveLogon(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
                           struct creds_CredentialState *creds, 
                           const char *workstation_name,
                           const char *account_domain, const char *account_name,
-                          const char *plain_pass)
+                          const char *plain_pass, NTSTATUS expected_error)
 {
        NTSTATUS status;
        TALLOC_CTX *fn_ctx = talloc_named(mem_ctx, 0, "test_InteractiveLogon function-level context");
@@ -1318,9 +1359,9 @@ BOOL test_InteractiveLogon(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx,
 
        talloc_free(fn_ctx);
 
-       if (!NT_STATUS_IS_OK(status)) {
-               printf("[%s]\\[%s] netr_LogonSamLogonWithFlags - %s\n", 
-                      account_name, account_domain, nt_errstr(status));
+       if (!NT_STATUS_EQUAL(expected_error, status)) {
+               printf("[%s]\\[%s] netr_LogonSamLogonWithFlags - expected %s got %s\n", 
+                      account_domain, account_name, nt_errstr(expected_error), nt_errstr(status));
                return False;
        }
 
@@ -1334,7 +1375,7 @@ BOOL torture_rpc_samlogon(void)
         NTSTATUS status;
         struct dcerpc_pipe *p;
        struct dcerpc_binding *b;
-       struct cli_credentials *credentials;
+       struct cli_credentials *machine_credentials;
        TALLOC_CTX *mem_ctx = talloc_init("torture_rpc_netlogon");
        BOOL ret = True;
        struct test_join *join_ctx;
@@ -1358,73 +1399,7 @@ BOOL torture_rpc_samlogon(void)
 
        struct creds_CredentialState *creds;
 
-       struct {
-               const char *domain;
-               const char *username;
-               const char *password;
-               BOOL network_login;
-       } usercreds[] = {
-               {
-                       cli_credentials_get_domain(cmdline_credentials),
-                       cli_credentials_get_username(cmdline_credentials, mem_ctx),
-                       cli_credentials_get_password(cmdline_credentials),
-                       True
-               },
-               {
-                       cli_credentials_get_realm(cmdline_credentials),
-                       cli_credentials_get_username(cmdline_credentials, mem_ctx),
-                       cli_credentials_get_password(cmdline_credentials),
-                       True
-               },
-               {
-                       NULL,
-                       talloc_asprintf(mem_ctx, 
-                                       "%s@%s", 
-                                       cli_credentials_get_username(cmdline_credentials, mem_ctx),
-                                       cli_credentials_get_domain(cmdline_credentials)
-                               ),
-                       cli_credentials_get_password(cmdline_credentials),
-                       False
-               },
-               {
-                       NULL,
-                       talloc_asprintf(mem_ctx, 
-                                       "%s@%s", 
-                                       cli_credentials_get_username(cmdline_credentials, mem_ctx),
-                                       cli_credentials_get_realm(cmdline_credentials)
-                               ),
-                       cli_credentials_get_password(cmdline_credentials),
-                       True
-               },
-#if 0
-               {       
-                       lp_parm_string(-1, "torture", "userdomain"),
-                       TEST_USER_NAME,
-                       NULL,
-                       True
-               },
-               {
-                       NULL,
-                       talloc_asprintf(mem_ctx, 
-                                       "%s@%s", 
-                                       TEST_USER_NAME,
-                                       lp_realm()),
-                       NULL,
-                       True
-               },
-               {
-                       NULL,
-                       talloc_asprintf(mem_ctx, 
-                                       "%s@%s", 
-                                       TEST_USER_NAME,
-                                       lp_parm_string(-1, "torture", "userdomain")),
-                       NULL,
-                       False
-               }
-#endif
-       };
-               
-       credentials = cli_credentials_init(mem_ctx);
+       machine_credentials = cli_credentials_init(mem_ctx);
 
        test_machine_account = talloc_asprintf(mem_ctx, "%s$", TEST_MACHINE_NAME);
        /* We only need to join as a workstation here, and in future,
@@ -1446,9 +1421,6 @@ BOOL torture_rpc_samlogon(void)
                return False;
        }
 
-       usercreds[3].password = user_password;
-       usercreds[4].password = user_password;
-       usercreds[5].password = user_password;
 #endif
 
        status = dcerpc_parse_binding(mem_ctx, binding, &b);
@@ -1464,17 +1436,18 @@ BOOL torture_rpc_samlogon(void)
        b->flags &= ~DCERPC_AUTH_OPTIONS;
        b->flags |= DCERPC_SCHANNEL | DCERPC_SIGN | DCERPC_SCHANNEL_128;
 
-       cli_credentials_set_workstation(credentials, TEST_MACHINE_NAME, CRED_SPECIFIED);
-       cli_credentials_set_domain(credentials, lp_workgroup(), CRED_SPECIFIED);
-       cli_credentials_set_username(credentials, test_machine_account, CRED_SPECIFIED);
-       cli_credentials_set_password(credentials, machine_password, CRED_SPECIFIED);
-       cli_credentials_set_secure_channel_type(credentials,
+       cli_credentials_set_workstation(machine_credentials, TEST_MACHINE_NAME, CRED_SPECIFIED);
+       cli_credentials_set_domain(machine_credentials, lp_workgroup(), CRED_SPECIFIED);
+       cli_credentials_set_realm(machine_credentials, lp_realm(), CRED_SPECIFIED);
+       cli_credentials_set_username(machine_credentials, test_machine_account, CRED_SPECIFIED);
+       cli_credentials_set_password(machine_credentials, machine_password, CRED_SPECIFIED);
+       cli_credentials_set_secure_channel_type(machine_credentials,
                                                SEC_CHAN_WKSTA);
 
        status = dcerpc_pipe_connect_b(mem_ctx, &p, b, 
                                       DCERPC_NETLOGON_UUID,
                                       DCERPC_NETLOGON_VERSION,
-                                      credentials, NULL);
+                                      machine_credentials, NULL);
 
        if (!NT_STATUS_IS_OK(status)) {
                printf("RPC pipe connect as domain member failed: %s\n", nt_errstr(status));
@@ -1488,52 +1461,181 @@ BOOL torture_rpc_samlogon(void)
                goto failed;
        }
 
-       /* Try all the tests for different username forms */
-       for (ci = 0; ci < ARRAY_SIZE(usercreds); ci++) {
+       {
                
-               if (!test_InteractiveLogon(p, mem_ctx, creds,
-                                          TEST_MACHINE_NAME,
-                                          usercreds[ci].domain,
-                                          usercreds[ci].username,
-                                          usercreds[ci].password)) {
-                       ret = False;
-               }
+               struct {
+                       const char *domain;
+                       const char *username;
+                       const char *password;
+                       BOOL network_login;
+                       NTSTATUS expected_interactive_error;
+                       NTSTATUS expected_network_error;
+               } usercreds[] = {
+                       {
+                               cli_credentials_get_domain(cmdline_credentials),
+                               cli_credentials_get_username(cmdline_credentials),
+                               cli_credentials_get_password(cmdline_credentials),
+                               True,
+                               NT_STATUS_OK,
+                               NT_STATUS_OK
+                       },
+                       {
+                               cli_credentials_get_realm(cmdline_credentials),
+                               cli_credentials_get_username(cmdline_credentials),
+                               cli_credentials_get_password(cmdline_credentials),
+                               True,
+                               NT_STATUS_OK,
+                               NT_STATUS_OK
+                       },
+                       {
+                               NULL,
+                               talloc_asprintf(mem_ctx, 
+                                               "%s@%s", 
+                                               cli_credentials_get_username(cmdline_credentials),
+                                               cli_credentials_get_domain(cmdline_credentials)
+                                       ),
+                               cli_credentials_get_password(cmdline_credentials),
+                               False,
+                               NT_STATUS_OK,
+                               NT_STATUS_OK
+                       },
+                       {
+                               NULL,
+                               talloc_asprintf(mem_ctx, 
+                                               "%s@%s", 
+                                               cli_credentials_get_username(cmdline_credentials),
+                                               cli_credentials_get_realm(cmdline_credentials)
+                                       ),
+                               cli_credentials_get_password(cmdline_credentials),
+                               True,
+                               NT_STATUS_OK,
+                               NT_STATUS_OK
+                       },
+                       {
+                               cli_credentials_get_domain(machine_credentials),
+                               cli_credentials_get_username(machine_credentials),
+                               cli_credentials_get_password(machine_credentials),
+                               True,
+                               NT_STATUS_NO_SUCH_USER,
+                               NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT
+                       },
+                       {
+                               cli_credentials_get_realm(machine_credentials),
+                               cli_credentials_get_username(machine_credentials),
+                               cli_credentials_get_password(machine_credentials),
+                               True,
+                               NT_STATUS_NO_SUCH_USER,
+                               NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT
+                       },
+                       {
+                               NULL,
+                               talloc_asprintf(mem_ctx, 
+                                               "%s@%s", 
+                                               cli_credentials_get_username(machine_credentials),
+                                               cli_credentials_get_domain(machine_credentials)
+                                       ),
+                               cli_credentials_get_password(machine_credentials),
+                               False,
+                               NT_STATUS_NO_SUCH_USER,
+                               NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT
+                       },
+                       {
+                               NULL,
+                               talloc_asprintf(mem_ctx, 
+                                               "%s@%s", 
+                                               cli_credentials_get_username(machine_credentials),
+                                               cli_credentials_get_realm(machine_credentials)
+                                       ),
+                               cli_credentials_get_password(machine_credentials),
+                               True,
+                               NT_STATUS_NO_SUCH_USER,
+                               NT_STATUS_NOLOGON_WORKSTATION_TRUST_ACCOUNT
+                       },
+#if 0
+                       {       
+                               lp_parm_string(-1, "torture", "userdomain"),
+                               TEST_USER_NAME,
+                               user_password,
+                               True,
+                               NT_STATUS_OK,
+                               NT_STATUS_OK
+                       },
+                       {
+                               NULL,
+                               talloc_asprintf(mem_ctx, 
+                                               "%s@%s", 
+                                               TEST_USER_NAME,
+                                               lp_realm()),
+                               user_password,
+                               True,
+                               NT_STATUS_OK,
+                               NT_STATUS_OK
+                       },
+                       {
+                               NULL,
+                               talloc_asprintf(mem_ctx, 
+                                               "%s@%s", 
+                                               TEST_USER_NAME,
+                                               lp_parm_string(-1, "torture", "userdomain")),
+                               user_password,
+                               False,
+                               NT_STATUS_OK,
+                               NT_STATUS_OK
+                       }
+#endif
+               };
                
-               if (usercreds[ci].network_login) {
-                       if (!test_SamLogon(p, mem_ctx, creds, 
-                                          usercreds[ci].domain,
-                                          usercreds[ci].username,
-                                          usercreds[ci].password,
-                                          0)) {
+               /* Try all the tests for different username forms */
+               for (ci = 0; ci < ARRAY_SIZE(usercreds); ci++) {
+               
+                       if (!test_InteractiveLogon(p, mem_ctx, creds,
+                                                  TEST_MACHINE_NAME,
+                                                  usercreds[ci].domain,
+                                                  usercreds[ci].username,
+                                                  usercreds[ci].password,
+                                                  usercreds[ci].expected_interactive_error)) {
                                ret = False;
                        }
+               
+                       if (usercreds[ci].network_login) {
+                               if (!test_SamLogon(p, mem_ctx, creds, 
+                                                  usercreds[ci].domain,
+                                                  usercreds[ci].username,
+                                                  usercreds[ci].password,
+                                                  usercreds[ci].expected_network_error,
+                                                  0)) {
+                                       ret = False;
+                               }
+                       }
                }
-       }
 
-       /* Using the first username form, try the different
-        * credentials flag setups, on only one of the tests (checks
-        * session key encryption) */
-
-       for (i=0; i < ARRAY_SIZE(credential_flags); i++) {
-               if (!test_InteractiveLogon(p, mem_ctx, creds,
-                                          TEST_MACHINE_NAME,
-                                          usercreds[0].domain,
-                                          usercreds[0].username,
-                                          usercreds[0].password)) {
-                       ret = False;
-               }
-               
-               if (usercreds[ci].network_login) {
-                       if (!test_SamLogon(p, mem_ctx, creds, 
-                                          usercreds[0].domain,
-                                          usercreds[0].username,
-                                          usercreds[0].password,
-                                          1)) {
+               /* Using the first username form, try the different
+                * credentials flag setups, on only one of the tests (checks
+                * session key encryption) */
+
+               for (i=0; i < ARRAY_SIZE(credential_flags); i++) {
+                       if (!test_InteractiveLogon(p, mem_ctx, creds,
+                                                  TEST_MACHINE_NAME,
+                                                  usercreds[0].domain,
+                                                  usercreds[0].username,
+                                                  usercreds[0].password,
+                                                  usercreds[0].expected_interactive_error)) {
                                ret = False;
                        }
+               
+                       if (usercreds[ci].network_login) {
+                               if (!test_SamLogon(p, mem_ctx, creds, 
+                                                  usercreds[0].domain,
+                                                  usercreds[0].username,
+                                                  usercreds[0].password,
+                                                  usercreds[0].expected_network_error,
+                                                  1)) {
+                                       ret = False;
+                               }
+                       }
                }
-       }
 
+       }
 failed:
        talloc_free(mem_ctx);
 
index 3f02622e1c9234ab97b0df885819fe35a5098549..c10405354e7da54c2ca9f1a82b1817f4cde33e90 100644 (file)
@@ -86,13 +86,13 @@ static BOOL test_samr_ops(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx)
   try a netlogon SamLogon
 */
 static BOOL test_netlogon_ops(struct dcerpc_pipe *p, TALLOC_CTX *mem_ctx, 
-                                 struct creds_CredentialState *creds)
+                             struct creds_CredentialState *creds)
 {
        NTSTATUS status;
        struct netr_LogonSamLogon r;
        struct netr_Authenticator auth, auth2;
        struct netr_NetworkInfo ninfo;
-       const char *username = cli_credentials_get_username(cmdline_credentials, mem_ctx);
+       const char *username = cli_credentials_get_username(cmdline_credentials);
        const char *password = cli_credentials_get_password(cmdline_credentials);
        int i;
        BOOL ret = True;
index 0bfb8a5be8003b75d6dfdbb05eabb58bf7b135b3..1912beeb41b3b03479a13fc3bf0b532961e464fb 100644 (file)
@@ -49,7 +49,7 @@ static int net_password_change(struct net_context *ctx, int argc, const char **a
        } else {
                password_prompt = talloc_asprintf(ctx->mem_ctx, "Enter new password for account [%s\\%s]:", 
                                                        cli_credentials_get_domain(ctx->credentials), 
-                                                       cli_credentials_get_username(ctx->credentials, ctx->mem_ctx));
+                                                       cli_credentials_get_username(ctx->credentials));
                new_password = getpass(password_prompt);
        }
 
@@ -61,7 +61,7 @@ static int net_password_change(struct net_context *ctx, int argc, const char **a
 
        /* prepare password change */
        r.generic.level                 = LIBNET_CHANGE_PASSWORD_GENERIC;
-       r.generic.in.account_name       = cli_credentials_get_username(ctx->credentials, ctx->mem_ctx);
+       r.generic.in.account_name       = cli_credentials_get_username(ctx->credentials);
        r.generic.in.domain_name        = cli_credentials_get_domain(ctx->credentials);
        r.generic.in.oldpassword        = cli_credentials_get_password(ctx->credentials);
        r.generic.in.newpassword        = new_password;