Try to make NTLMSSP less fussy for unimportant messages.
[kai/samba.git] / source4 / auth / ntlmssp / ntlmssp_client.c
index bff9fc0b8a7e62627a1ff72bb368be6b676e16e7..891761860c591b68c1a02ed675d37dad5aa1ca80 100644 (file)
@@ -49,6 +49,17 @@ NTSTATUS ntlmssp_client_initial(struct gensec_security *gensec_security,
                                DATA_BLOB in, DATA_BLOB *out) 
 {
        struct gensec_ntlmssp_state *gensec_ntlmssp_state = (struct gensec_ntlmssp_state *)gensec_security->private_data;
+       const char *domain = gensec_ntlmssp_state->domain;
+       const char *workstation = cli_credentials_get_workstation(gensec_security->credentials);
+
+       /* These don't really matter in the initial packet, so don't panic if they are not set */
+       if (!domain) {
+               domain = "";
+       }
+
+       if (!workstation) {
+               workstation = "";
+       }
 
        if (gensec_ntlmssp_state->unicode) {
                gensec_ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_UNICODE;
@@ -62,12 +73,13 @@ NTSTATUS ntlmssp_client_initial(struct gensec_security *gensec_security,
 
        /* generate the ntlmssp negotiate packet */
        msrpc_gen(out_mem_ctx, 
+                 lp_iconv_convenience(gensec_security->lp_ctx),
                  out, "CddAA",
                  "NTLMSSP",
                  NTLMSSP_NEGOTIATE,
                  gensec_ntlmssp_state->neg_flags,
-                 gensec_ntlmssp_state->domain, 
-                 cli_credentials_get_workstation(gensec_security->credentials));
+                 domain, 
+                 workstation);
 
        gensec_ntlmssp_state->expected_state = NTLMSSP_CHALLENGE;
 
@@ -111,6 +123,7 @@ NTSTATUS ntlmssp_client_challenge(struct gensec_security *gensec_security,
        }
 
        if (!msrpc_parse(mem_ctx,
+                        lp_iconv_convenience(gensec_security->lp_ctx),
                         &in, "CdBd",
                         "NTLMSSP",
                         &ntlmssp_command, 
@@ -148,6 +161,7 @@ NTSTATUS ntlmssp_client_challenge(struct gensec_security *gensec_security,
        }
 
        if (!msrpc_parse(mem_ctx,
+                        lp_iconv_convenience(gensec_security->lp_ctx),
                         &in, chal_parse_string,
                         "NTLMSSP",
                         &ntlmssp_command, 
@@ -181,7 +195,7 @@ NTSTATUS ntlmssp_client_challenge(struct gensec_security *gensec_security,
        if (gensec_ntlmssp_state->use_nt_response) {
                flags |= CLI_CRED_NTLM_AUTH;
        }
-       if (lp_client_lanman_auth(global_loadparm)) {
+       if (lp_client_lanman_auth(gensec_security->lp_ctx)) {
                flags |= CLI_CRED_LANMAN_AUTH;
        }
 
@@ -206,7 +220,7 @@ NTSTATUS ntlmssp_client_challenge(struct gensec_security *gensec_security,
        }
        
        if ((gensec_ntlmssp_state->neg_flags & NTLMSSP_NEGOTIATE_LM_KEY) 
-           && lp_client_lanman_auth(global_loadparm) && lm_session_key.length == 16) {
+           && lp_client_lanman_auth(gensec_security->lp_ctx) && lm_session_key.length == 16) {
                DATA_BLOB new_session_key = data_blob_talloc(mem_ctx, NULL, 16);
                if (lm_response.length == 24) {
                        SMBsesskeygen_lm_sess_key(lm_session_key.data, lm_response.data, 
@@ -244,6 +258,7 @@ NTSTATUS ntlmssp_client_challenge(struct gensec_security *gensec_security,
 
        /* this generates the actual auth packet */
        if (!msrpc_gen(mem_ctx, 
+                      lp_iconv_convenience(gensec_security->lp_ctx),
                       out, auth_gen_string, 
                       "NTLMSSP", 
                       NTLMSSP_AUTH, 
@@ -297,17 +312,17 @@ NTSTATUS gensec_ntlmssp_client_start(struct gensec_security *gensec_security)
 
        gensec_ntlmssp_state->role = NTLMSSP_CLIENT;
 
-       gensec_ntlmssp_state->domain = lp_workgroup(global_loadparm);
+       gensec_ntlmssp_state->domain = lp_workgroup(gensec_security->lp_ctx);
 
-       gensec_ntlmssp_state->unicode = lp_parm_bool(global_loadparm, NULL, "ntlmssp_client", "unicode", true);
+       gensec_ntlmssp_state->unicode = lp_parm_bool(gensec_security->lp_ctx, NULL, "ntlmssp_client", "unicode", true);
 
-       gensec_ntlmssp_state->use_nt_response = lp_parm_bool(global_loadparm, NULL, "ntlmssp_client", "send_nt_reponse", true);
+       gensec_ntlmssp_state->use_nt_response = lp_parm_bool(gensec_security->lp_ctx, NULL, "ntlmssp_client", "send_nt_reponse", true);
 
-       gensec_ntlmssp_state->allow_lm_key = (lp_client_lanman_auth(global_loadparm
-                                             && (lp_parm_bool(global_loadparm, NULL, "ntlmssp_client", "allow_lm_key", false)
-                                                 || lp_parm_bool(global_loadparm, NULL, "ntlmssp_client", "lm_key", false)));
+       gensec_ntlmssp_state->allow_lm_key = (lp_client_lanman_auth(gensec_security->lp_ctx
+                                             && (lp_parm_bool(gensec_security->lp_ctx, NULL, "ntlmssp_client", "allow_lm_key", false)
+                                                 || lp_parm_bool(gensec_security->lp_ctx, NULL, "ntlmssp_client", "lm_key", false)));
 
-       gensec_ntlmssp_state->use_ntlmv2 = lp_client_ntlmv2_auth(global_loadparm);
+       gensec_ntlmssp_state->use_ntlmv2 = lp_client_ntlmv2_auth(gensec_security->lp_ctx);
 
        gensec_ntlmssp_state->expected_state = NTLMSSP_INITIAL;
 
@@ -315,27 +330,27 @@ NTSTATUS gensec_ntlmssp_client_start(struct gensec_security *gensec_security)
                NTLMSSP_NEGOTIATE_NTLM |
                NTLMSSP_REQUEST_TARGET;
 
-       if (lp_parm_bool(global_loadparm, NULL, "ntlmssp_client", "128bit", true)) {
+       if (lp_parm_bool(gensec_security->lp_ctx, NULL, "ntlmssp_client", "128bit", true)) {
                gensec_ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_128;               
        }
 
-       if (lp_parm_bool(global_loadparm, NULL, "ntlmssp_client", "56bit", false)) {
+       if (lp_parm_bool(gensec_security->lp_ctx, NULL, "ntlmssp_client", "56bit", false)) {
                gensec_ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_56;                
        }
 
-       if (lp_parm_bool(global_loadparm, NULL, "ntlmssp_client", "lm_key", false)) {
+       if (lp_parm_bool(gensec_security->lp_ctx, NULL, "ntlmssp_client", "lm_key", false)) {
                gensec_ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_LM_KEY;
        }
 
-       if (lp_parm_bool(global_loadparm, NULL, "ntlmssp_client", "keyexchange", true)) {
+       if (lp_parm_bool(gensec_security->lp_ctx, NULL, "ntlmssp_client", "keyexchange", true)) {
                gensec_ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_KEY_EXCH;          
        }
 
-       if (lp_parm_bool(global_loadparm, NULL, "ntlmssp_client", "alwayssign", true)) {
+       if (lp_parm_bool(gensec_security->lp_ctx, NULL, "ntlmssp_client", "alwayssign", true)) {
                gensec_ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_ALWAYS_SIGN;               
        }
 
-       if (lp_parm_bool(global_loadparm, NULL, "ntlmssp_client", "ntlm2", true)) {
+       if (lp_parm_bool(gensec_security->lp_ctx, NULL, "ntlmssp_client", "ntlm2", true)) {
                gensec_ntlmssp_state->neg_flags |= NTLMSSP_NEGOTIATE_NTLM2;             
        } else {
                /* apparently we can't do ntlmv2 if we don't do ntlm2 */