s3: include smbd/smbd.h where needed.
[amitay/samba.git] / source3 / smbd / smb2_sesssetup.c
index 4e31952f207a4ab1ddf329105104c2e102485faf..2b7a860b017d84944a3a999db4033afa2a9ba1e5 100644 (file)
 */
 
 #include "includes.h"
+#include "smbd/smbd.h"
 #include "smbd/globals.h"
 #include "../libcli/smb/smb_common.h"
 #include "../libcli/auth/spnego.h"
-#include "ntlmssp.h"
+#include "../libcli/auth/ntlmssp.h"
+#include "ntlmssp_wrap.h"
+#include "../librpc/gen_ndr/krb5pac.h"
+#include "libads/kerberos_proto.h"
+#include "../lib/util/asn1.h"
 
 static NTSTATUS smbd_smb2_session_setup(struct smbd_smb2_request *smb2req,
                                        uint64_t in_session_id,
@@ -143,19 +148,241 @@ static int smbd_smb2_session_destructor(struct smbd_smb2_session *session)
        return 0;
 }
 
+static NTSTATUS setup_ntlmssp_session_info(struct smbd_smb2_session *session,
+                               NTSTATUS status)
+{
+       if (NT_STATUS_IS_OK(status)) {
+               status = auth_ntlmssp_steal_session_info(session,
+                               session->auth_ntlmssp_state,
+                               &session->session_info);
+       } else {
+               /* Note that this session_info won't have a session
+                * key.  But for map to guest, that's exactly the right
+                * thing - we can't reasonably guess the key the
+                * client wants, as the password was wrong */
+               status = do_map_to_guest(status,
+                       &session->session_info,
+                       auth_ntlmssp_get_username(session->auth_ntlmssp_state),
+                       auth_ntlmssp_get_domain(session->auth_ntlmssp_state));
+       }
+       return status;
+}
+
+#ifdef HAVE_KRB5
 static NTSTATUS smbd_smb2_session_setup_krb5(struct smbd_smb2_session *session,
                                        struct smbd_smb2_request *smb2req,
-                                       const DATA_BLOB *psecblob_in,
-                                       const char *kerb_mech,
+                                       uint8_t in_security_mode,
+                                       const DATA_BLOB *secblob,
+                                       const char *mechOID,
                                        uint16_t *out_session_flags,
                                        DATA_BLOB *out_security_buffer,
                                        uint64_t *out_session_id)
 {
-       return NT_STATUS_NOT_IMPLEMENTED;
+       DATA_BLOB ap_rep = data_blob_null;
+       DATA_BLOB ap_rep_wrapped = data_blob_null;
+       DATA_BLOB ticket = data_blob_null;
+       DATA_BLOB session_key = data_blob_null;
+       DATA_BLOB secblob_out = data_blob_null;
+       uint8 tok_id[2];
+       struct PAC_LOGON_INFO *logon_info = NULL;
+       char *principal = NULL;
+       char *user = NULL;
+       char *domain = NULL;
+       struct passwd *pw = NULL;
+       NTSTATUS status;
+       char *real_username;
+       fstring tmp;
+       bool username_was_mapped = false;
+       bool map_domainuser_to_guest = false;
+
+       if (!spnego_parse_krb5_wrap(talloc_tos(), *secblob, &ticket, tok_id)) {
+               status = NT_STATUS_LOGON_FAILURE;
+               goto fail;
+       }
+
+       status = ads_verify_ticket(smb2req, lp_realm(), 0, &ticket,
+                                  &principal, &logon_info, &ap_rep,
+                                  &session_key, true);
+
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(1,("smb2: Failed to verify incoming ticket with error %s!\n",
+                       nt_errstr(status)));
+               if (!NT_STATUS_EQUAL(status, NT_STATUS_TIME_DIFFERENCE_AT_DC)) {
+                       status = NT_STATUS_LOGON_FAILURE;
+               }
+               goto fail;
+       }
+
+       status = get_user_from_kerberos_info(talloc_tos(),
+                                            smb2req->sconn->client_id.name,
+                                            principal, logon_info,
+                                            &username_was_mapped,
+                                            &map_domainuser_to_guest,
+                                            &user, &domain,
+                                            &real_username, &pw);
+       if (!NT_STATUS_IS_OK(status)) {
+               goto fail;
+       }
+
+       /* save the PAC data if we have it */
+       if (logon_info) {
+               netsamlogon_cache_store(user, &logon_info->info3);
+       }
+
+       /* setup the string used by %U */
+       sub_set_smb_name(real_username);
+
+       /* reload services so that the new %U is taken into account */
+       reload_services(smb2req->sconn->msg_ctx, smb2req->sconn->sock, true);
+
+       status = make_server_info_krb5(session,
+                                       user, domain, real_username, pw,
+                                       logon_info, map_domainuser_to_guest,
+                                       &session->session_info);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(1, ("smb2: make_server_info_krb5 failed\n"));
+               goto fail;
+       }
+
+
+       session->session_info->nss_token |= username_was_mapped;
+
+       /* we need to build the token for the user. make_session_info_guest()
+          already does this */
+
+       if (!session->session_info->security_token ) {
+               status = create_local_token(session->session_info);
+               if (!NT_STATUS_IS_OK(status)) {
+                       DEBUG(10,("smb2: failed to create local token: %s\n",
+                               nt_errstr(status)));
+                       goto fail;
+               }
+       }
+
+       if ((in_security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED) ||
+            lp_server_signing() == Required) {
+               session->do_signing = true;
+       }
+
+       if (session->session_info->guest) {
+               /* we map anonymous to guest internally */
+               *out_session_flags |= SMB2_SESSION_FLAG_IS_GUEST;
+               *out_session_flags |= SMB2_SESSION_FLAG_IS_NULL;
+               /* force no signing */
+               session->do_signing = false;
+       }
+
+       data_blob_free(&session->session_info->user_session_key);
+       session->session_info->user_session_key =
+                       data_blob_talloc(
+                               session->session_info,
+                               session_key.data,
+                               session_key.length);
+        if (session_key.length > 0) {
+               if (session->session_info->user_session_key.data == NULL) {
+                       status = NT_STATUS_NO_MEMORY;
+                       goto fail;
+               }
+       }
+       session->session_key = session->session_info->user_session_key;
+
+       session->compat_vuser = talloc_zero(session, user_struct);
+       if (session->compat_vuser == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto fail;
+       }
+       session->compat_vuser->auth_ntlmssp_state = NULL;
+       session->compat_vuser->homes_snum = -1;
+       session->compat_vuser->session_info = session->session_info;
+       session->compat_vuser->session_keystr = NULL;
+       session->compat_vuser->vuid = session->vuid;
+       DLIST_ADD(session->sconn->smb1.sessions.validated_users, session->compat_vuser);
+
+       /* This is a potentially untrusted username */
+       alpha_strcpy(tmp, user, ". _-$", sizeof(tmp));
+       session->session_info->sanitized_username =
+                               talloc_strdup(session->session_info, tmp);
+
+       if (!session->session_info->guest) {
+               session->compat_vuser->homes_snum =
+                       register_homes_share(session->session_info->unix_name);
+       }
+
+       if (!session_claim(session->sconn, session->compat_vuser)) {
+               DEBUG(1, ("smb2: Failed to claim session "
+                       "for vuid=%d\n",
+                       session->compat_vuser->vuid));
+               goto fail;
+       }
+
+       session->status = NT_STATUS_OK;
+
+       /*
+        * we attach the session to the request
+        * so that the response can be signed
+        */
+       smb2req->session = session;
+       if (session->do_signing) {
+               smb2req->do_signing = true;
+       }
+
+       global_client_caps |= (CAP_LEVEL_II_OPLOCKS|CAP_STATUS32);
+        status = NT_STATUS_OK;
+
+       /* wrap that up in a nice GSS-API wrapping */
+       ap_rep_wrapped = spnego_gen_krb5_wrap(talloc_tos(), ap_rep,
+                               TOK_ID_KRB_AP_REP);
+
+       secblob_out = spnego_gen_auth_response(
+                                       talloc_tos(),
+                                       &ap_rep_wrapped,
+                                       status,
+                                       mechOID);
+
+       *out_security_buffer = data_blob_talloc(smb2req,
+                                               secblob_out.data,
+                                               secblob_out.length);
+       if (secblob_out.data && out_security_buffer->data == NULL) {
+               status = NT_STATUS_NO_MEMORY;
+               goto fail;
+       }
+
+       data_blob_free(&ap_rep);
+       data_blob_free(&ap_rep_wrapped);
+       data_blob_free(&ticket);
+       data_blob_free(&session_key);
+       data_blob_free(&secblob_out);
+
+       *out_session_id = session->vuid;
+
+       return NT_STATUS_OK;
+
+  fail:
+
+       data_blob_free(&ap_rep);
+       data_blob_free(&ap_rep_wrapped);
+       data_blob_free(&ticket);
+       data_blob_free(&session_key);
+       data_blob_free(&secblob_out);
+
+       ap_rep_wrapped = data_blob_null;
+       secblob_out = spnego_gen_auth_response(
+                                       talloc_tos(),
+                                       &ap_rep_wrapped,
+                                       status,
+                                       mechOID);
+
+       *out_security_buffer = data_blob_talloc(smb2req,
+                                               secblob_out.data,
+                                               secblob_out.length);
+       data_blob_free(&secblob_out);
+       return status;
 }
+#endif
 
 static NTSTATUS smbd_smb2_spnego_negotiate(struct smbd_smb2_session *session,
                                        struct smbd_smb2_request *smb2req,
+                                       uint8_t in_security_mode,
                                        DATA_BLOB in_security_buffer,
                                        uint16_t *out_session_flags,
                                        DATA_BLOB *out_security_buffer,
@@ -163,14 +390,13 @@ static NTSTATUS smbd_smb2_spnego_negotiate(struct smbd_smb2_session *session,
 {
        DATA_BLOB secblob_in = data_blob_null;
        DATA_BLOB chal_out = data_blob_null;
-       DATA_BLOB secblob_out = data_blob_null;
        char *kerb_mech = NULL;
        NTSTATUS status;
 
        /* Ensure we have no old NTLM state around. */
-       auth_ntlmssp_end(&session->auth_ntlmssp_state);
+       TALLOC_FREE(session->auth_ntlmssp_state);
 
-       status = parse_spnego_mechanisms(in_security_buffer,
+       status = parse_spnego_mechanisms(talloc_tos(), in_security_buffer,
                        &secblob_in, &kerb_mech);
        if (!NT_STATUS_IS_OK(status)) {
                goto out;
@@ -181,6 +407,7 @@ static NTSTATUS smbd_smb2_spnego_negotiate(struct smbd_smb2_session *session,
                                USE_KERBEROS_KEYTAB) ) {
                status = smbd_smb2_session_setup_krb5(session,
                                smb2req,
+                               in_security_mode,
                                &secblob_in,
                                kerb_mech,
                                out_session_flags,
@@ -191,14 +418,25 @@ static NTSTATUS smbd_smb2_spnego_negotiate(struct smbd_smb2_session *session,
        }
 #endif
 
-       status = auth_ntlmssp_start(&session->auth_ntlmssp_state);
-       if (!NT_STATUS_IS_OK(status)) {
-               goto out;
-       }
+       if (kerb_mech) {
+               /* The mechtoken is a krb5 ticket, but
+                * we need to fall back to NTLM. */
 
-       status = auth_ntlmssp_update(session->auth_ntlmssp_state,
-                                    secblob_in,
-                                    &chal_out);
+               DEBUG(3,("smb2: Got krb5 ticket in SPNEGO "
+                       "but set to downgrade to NTLMSSP\n"));
+
+               status = NT_STATUS_MORE_PROCESSING_REQUIRED;
+       } else {
+               /* Fall back to NTLMSSP. */
+               status = auth_ntlmssp_start(&session->auth_ntlmssp_state);
+               if (!NT_STATUS_IS_OK(status)) {
+                       goto out;
+               }
+
+               status = auth_ntlmssp_update(session->auth_ntlmssp_state,
+                                            secblob_in,
+                                            &chal_out);
+       }
 
        if (!NT_STATUS_IS_OK(status) &&
                        !NT_STATUS_EQUAL(status,
@@ -206,12 +444,10 @@ static NTSTATUS smbd_smb2_spnego_negotiate(struct smbd_smb2_session *session,
                goto out;
        }
 
-       secblob_out = spnego_gen_auth_response(&chal_out,
+       *out_security_buffer = spnego_gen_auth_response(smb2req,
+                                               &chal_out,
                                                status,
                                                OID_NTLMSSP);
-       *out_security_buffer = data_blob_talloc(smb2req,
-                                               secblob_out.data,
-                                               secblob_out.length);
        if (out_security_buffer->data == NULL) {
                status = NT_STATUS_NO_MEMORY;
                goto out;
@@ -221,13 +457,12 @@ static NTSTATUS smbd_smb2_spnego_negotiate(struct smbd_smb2_session *session,
   out:
 
        data_blob_free(&secblob_in);
-       data_blob_free(&secblob_out);
        data_blob_free(&chal_out);
-       SAFE_FREE(kerb_mech);
+       TALLOC_FREE(kerb_mech);
        if (!NT_STATUS_IS_OK(status) &&
                        !NT_STATUS_EQUAL(status,
                                NT_STATUS_MORE_PROCESSING_REQUIRED)) {
-               auth_ntlmssp_end(&session->auth_ntlmssp_state);
+               TALLOC_FREE(session->auth_ntlmssp_state);
                TALLOC_FREE(session);
        }
        return status;
@@ -237,14 +472,17 @@ static NTSTATUS smbd_smb2_common_ntlmssp_auth_return(struct smbd_smb2_session *s
                                        struct smbd_smb2_request *smb2req,
                                        uint8_t in_security_mode,
                                        DATA_BLOB in_security_buffer,
-                                       uint16_t *out_session_flags)
+                                       uint16_t *out_session_flags,
+                                       uint64_t *out_session_id)
 {
+       fstring tmp;
+
        if ((in_security_mode & SMB2_NEGOTIATE_SIGNING_REQUIRED) ||
            lp_server_signing() == Required) {
                session->do_signing = true;
        }
 
-       if (session->auth_ntlmssp_state->server_info->guest) {
+       if (session->session_info->guest) {
                /* we map anonymous to guest internally */
                *out_session_flags |= SMB2_SESSION_FLAG_IS_GUEST;
                *out_session_flags |= SMB2_SESSION_FLAG_IS_NULL;
@@ -252,35 +490,44 @@ static NTSTATUS smbd_smb2_common_ntlmssp_auth_return(struct smbd_smb2_session *s
                session->do_signing = false;
        }
 
-       session->server_info = session->auth_ntlmssp_state->server_info;
-       data_blob_free(&session->server_info->user_session_key);
-       session->server_info->user_session_key =
-                       data_blob_talloc(
-                       session->server_info,
-                       session->auth_ntlmssp_state->ntlmssp_state->session_key.data,
-                       session->auth_ntlmssp_state->ntlmssp_state->session_key.length);
-       if (session->auth_ntlmssp_state->ntlmssp_state->session_key.length > 0) {
-               if (session->server_info->user_session_key.data == NULL) {
-                       auth_ntlmssp_end(&session->auth_ntlmssp_state);
-                       TALLOC_FREE(session);
-                       return NT_STATUS_NO_MEMORY;
-               }
-       }
-       session->session_key = session->server_info->user_session_key;
+       session->session_key = session->session_info->user_session_key;
 
        session->compat_vuser = talloc_zero(session, user_struct);
        if (session->compat_vuser == NULL) {
-               auth_ntlmssp_end(&session->auth_ntlmssp_state);
+               TALLOC_FREE(session->auth_ntlmssp_state);
                TALLOC_FREE(session);
                return NT_STATUS_NO_MEMORY;
        }
        session->compat_vuser->auth_ntlmssp_state = session->auth_ntlmssp_state;
        session->compat_vuser->homes_snum = -1;
-       session->compat_vuser->server_info = session->server_info;
+       session->compat_vuser->session_info = session->session_info;
        session->compat_vuser->session_keystr = NULL;
        session->compat_vuser->vuid = session->vuid;
        DLIST_ADD(session->sconn->smb1.sessions.validated_users, session->compat_vuser);
 
+       /* This is a potentially untrusted username */
+       alpha_strcpy(tmp,
+                    auth_ntlmssp_get_username(session->auth_ntlmssp_state),
+                    ". _-$",
+                    sizeof(tmp));
+       session->session_info->sanitized_username = talloc_strdup(
+               session->session_info, tmp);
+
+       if (!session->compat_vuser->session_info->guest) {
+               session->compat_vuser->homes_snum =
+                       register_homes_share(session->session_info->unix_name);
+       }
+
+       if (!session_claim(session->sconn, session->compat_vuser)) {
+               DEBUG(1, ("smb2: Failed to claim session "
+                       "for vuid=%d\n",
+                       session->compat_vuser->vuid));
+               TALLOC_FREE(session->auth_ntlmssp_state);
+               TALLOC_FREE(session);
+               return NT_STATUS_LOGON_FAILURE;
+       }
+
+
        session->status = NT_STATUS_OK;
 
        /*
@@ -293,6 +540,9 @@ static NTSTATUS smbd_smb2_common_ntlmssp_auth_return(struct smbd_smb2_session *s
        }
 
        global_client_caps |= (CAP_LEVEL_II_OPLOCKS|CAP_STATUS32);
+
+       *out_session_id = session->vuid;
+
        return NT_STATUS_OK;
 }
 
@@ -306,19 +556,86 @@ static NTSTATUS smbd_smb2_spnego_auth(struct smbd_smb2_session *session,
 {
        DATA_BLOB auth = data_blob_null;
        DATA_BLOB auth_out = data_blob_null;
-       DATA_BLOB secblob_out = data_blob_null;
        NTSTATUS status;
 
-       if (!spnego_parse_auth(in_security_buffer, &auth)) {
+       if (!spnego_parse_auth(talloc_tos(), in_security_buffer, &auth)) {
                TALLOC_FREE(session);
                return NT_STATUS_LOGON_FAILURE;
        }
 
+       if (auth.data[0] == ASN1_APPLICATION(0)) {
+               /* Might be a second negTokenTarg packet */
+               DATA_BLOB secblob_in = data_blob_null;
+               char *kerb_mech = NULL;
+
+               status = parse_spnego_mechanisms(talloc_tos(),
+                               in_security_buffer,
+                               &secblob_in, &kerb_mech);
+               if (!NT_STATUS_IS_OK(status)) {
+                       TALLOC_FREE(session);
+                       return status;
+               }
+
+#ifdef HAVE_KRB5
+               if (kerb_mech && ((lp_security()==SEC_ADS) ||
+                                       USE_KERBEROS_KEYTAB) ) {
+                       status = smbd_smb2_session_setup_krb5(session,
+                                       smb2req,
+                                       in_security_mode,
+                                       &secblob_in,
+                                       kerb_mech,
+                                       out_session_flags,
+                                       out_security_buffer,
+                                       out_session_id);
+
+                       data_blob_free(&secblob_in);
+                       TALLOC_FREE(kerb_mech);
+                       if (!NT_STATUS_IS_OK(status)) {
+                               TALLOC_FREE(session);
+                       }
+                       return status;
+               }
+#endif
+
+               /* Can't blunder into NTLMSSP auth if we have
+                * a krb5 ticket. */
+
+               if (kerb_mech) {
+                       DEBUG(3,("smb2: network "
+                               "misconfiguration, client sent us a "
+                               "krb5 ticket and kerberos security "
+                               "not enabled\n"));
+                       TALLOC_FREE(session);
+                       data_blob_free(&secblob_in);
+                       TALLOC_FREE(kerb_mech);
+                       return NT_STATUS_LOGON_FAILURE;
+               }
+
+               data_blob_free(&secblob_in);
+       }
+
+       if (session->auth_ntlmssp_state == NULL) {
+               status = auth_ntlmssp_start(&session->auth_ntlmssp_state);
+               if (!NT_STATUS_IS_OK(status)) {
+                       data_blob_free(&auth);
+                       TALLOC_FREE(session);
+                       return status;
+               }
+       }
+
        status = auth_ntlmssp_update(session->auth_ntlmssp_state,
                                     auth,
                                     &auth_out);
-       if (!NT_STATUS_IS_OK(status)) {
-               auth_ntlmssp_end(&session->auth_ntlmssp_state);
+       /* We need to call setup_ntlmssp_session_info() if status==NT_STATUS_OK,
+          or if status is anything except NT_STATUS_MORE_PROCESSING_REQUIRED,
+          as this can trigger map to guest. */
+       if (!NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
+               status = setup_ntlmssp_session_info(session, status);
+       }
+
+       if (!NT_STATUS_IS_OK(status) &&
+                       !NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
+               TALLOC_FREE(session->auth_ntlmssp_state);
                data_blob_free(&auth);
                TALLOC_FREE(session);
                return status;
@@ -326,25 +643,28 @@ static NTSTATUS smbd_smb2_spnego_auth(struct smbd_smb2_session *session,
 
        data_blob_free(&auth);
 
-       secblob_out = spnego_gen_auth_response(&auth_out,
-                               status, NULL);
+       *out_security_buffer = spnego_gen_auth_response(smb2req,
+                               &auth_out, status, NULL);
 
-       *out_security_buffer = data_blob_talloc(smb2req,
-                                               secblob_out.data,
-                                               secblob_out.length);
        if (out_security_buffer->data == NULL) {
-               auth_ntlmssp_end(&session->auth_ntlmssp_state);
+               TALLOC_FREE(session->auth_ntlmssp_state);
                TALLOC_FREE(session);
                return NT_STATUS_NO_MEMORY;
        }
 
        *out_session_id = session->vuid;
 
+       if (NT_STATUS_EQUAL(status, NT_STATUS_MORE_PROCESSING_REQUIRED)) {
+               return NT_STATUS_MORE_PROCESSING_REQUIRED;
+       }
+
+       /* We're done - claim the session. */
        return smbd_smb2_common_ntlmssp_auth_return(session,
                                                smb2req,
                                                in_security_mode,
                                                in_security_buffer,
-                                               out_session_flags);
+                                               out_session_flags,
+                                               out_session_id);
 }
 
 static NTSTATUS smbd_smb2_raw_ntlmssp_auth(struct smbd_smb2_session *session,
@@ -376,8 +696,8 @@ static NTSTATUS smbd_smb2_raw_ntlmssp_auth(struct smbd_smb2_session *session,
                *out_security_buffer = data_blob_talloc(smb2req,
                                                secblob_out.data,
                                                secblob_out.length);
-               if (out_security_buffer->data == NULL) {
-                       auth_ntlmssp_end(&session->auth_ntlmssp_state);
+               if (secblob_out.data && out_security_buffer->data == NULL) {
+                       TALLOC_FREE(session->auth_ntlmssp_state);
                        TALLOC_FREE(session);
                        return NT_STATUS_NO_MEMORY;
                }
@@ -387,8 +707,11 @@ static NTSTATUS smbd_smb2_raw_ntlmssp_auth(struct smbd_smb2_session *session,
                *out_session_id = session->vuid;
                return status;
        }
+
+       status = setup_ntlmssp_session_info(session, status);
+
        if (!NT_STATUS_IS_OK(status)) {
-               auth_ntlmssp_end(&session->auth_ntlmssp_state);
+               TALLOC_FREE(session->auth_ntlmssp_state);
                TALLOC_FREE(session);
                return status;
        }
@@ -398,7 +721,8 @@ static NTSTATUS smbd_smb2_raw_ntlmssp_auth(struct smbd_smb2_session *session,
                                                smb2req,
                                                in_security_mode,
                                                in_security_buffer,
-                                               out_session_flags);
+                                               out_session_flags,
+                                               out_session_id);
 }
 
 static NTSTATUS smbd_smb2_session_setup(struct smbd_smb2_request *smb2req,
@@ -460,6 +784,7 @@ static NTSTATUS smbd_smb2_session_setup(struct smbd_smb2_request *smb2req,
        if (in_security_buffer.data[0] == ASN1_APPLICATION(0)) {
                return smbd_smb2_spnego_negotiate(session,
                                                smb2req,
+                                               in_security_mode,
                                                in_security_buffer,
                                                out_session_flags,
                                                out_security_buffer,
@@ -485,7 +810,7 @@ static NTSTATUS smbd_smb2_session_setup(struct smbd_smb2_request *smb2req,
        /* Unknown packet type. */
        DEBUG(1,("Unknown packet type %u in smb2 sessionsetup\n",
                (unsigned int)in_security_buffer.data[0] ));
-       auth_ntlmssp_end(&session->auth_ntlmssp_state);
+       TALLOC_FREE(session->auth_ntlmssp_state);
        TALLOC_FREE(session);
        return NT_STATUS_LOGON_FAILURE;
 }
@@ -534,9 +859,9 @@ NTSTATUS smbd_smb2_request_check_session(struct smbd_smb2_request *req)
                return NT_STATUS_ACCESS_DENIED;
        }
 
-       set_current_user_info(session->server_info->sanitized_username,
-                             session->server_info->unix_name,
-                             pdb_get_domain(session->server_info->sam_account));
+       set_current_user_info(session->session_info->sanitized_username,
+                             session->session_info->unix_name,
+                             session->session_info->info3->base.domain.string);
 
        req->session = session;