da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The contents of this file are subject to the terms of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Common Development and Distribution License (the "License").
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You may not use this file except in compliance with the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or http://www.opensolaris.org/os/licensing.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When distributing Covered Code, include this CDDL HEADER in each
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If applicable, add the following below this CDDL HEADER, with the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fields enclosed by brackets "[]" replaced with your own identifying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * information: Portions Copyright [yyyy] [name of copyright owner]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <sys/types.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <sys/sid.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <sys/priv_names.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <sys/socket.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <netinet/in.h>
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright#include <smbsrv/smb_idmap.h>
bbf6f00c25b6a2bed23c35eac6d62998ecdb338cJordan Brown#include <smbsrv/smb_kproto.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/smb_token.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
7b59d02d2a384be9a08087b14defadd214b3c1ddjbsmb_sdrc_t
faa1795a28a5c712eed6d0a3f84d98c368a316c6jbsmb_pre_session_setup_andx(smb_request_t *sr)
faa1795a28a5c712eed6d0a3f84d98c368a316c6jb{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_arg_sessionsetup_t *sinfo;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright char *native_os;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright char *native_lm;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int rc = 0;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright sinfo = smb_srm_zalloc(sr, sizeof (smb_arg_sessionsetup_t));
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright sr->sr_ssetup = sinfo;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /*
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Enforce the minimum word count seen in the old protocol,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * to make sure we have enough to decode the common stuff.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Further wcnt checks below.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (sr->smb_wct < 10) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = -1;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross goto done;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /*
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Parse common part of SMB session setup.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * skip: vcnumber(2), sesskey(4)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = smbsr_decode_vwv(sr, "b.www6.",
12b65585e720714b31036daaa2b30eb76014048eGordon Ross &sr->andx_com, &sr->andx_off,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross &sinfo->ssi_maxbufsize, &sinfo->ssi_maxmpxcount);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (rc != 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross goto done;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (sr->session->dialect < NT_LM_0_12) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_type = SMB_SSNSETUP_PRE_NTLM012;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_capabilities = 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = smbsr_decode_vwv(sr, "w4.",
12b65585e720714b31036daaa2b30eb76014048eGordon Ross &sinfo->ssi_lmpwlen);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (rc != 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross goto done;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_lmpwd = smb_srm_zalloc(sr, sinfo->ssi_lmpwlen + 1);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = smbsr_decode_data(sr, "%#c", sr, sinfo->ssi_lmpwlen,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_lmpwd);
9fb67ea305c66b6a297583b9b0db6796b0dfe497afshin salek ardakani - Sun Microsystems - Irvine United States if (rc != 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross goto done;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_lmpwd[sinfo->ssi_lmpwlen] = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbsr_decode_data(sr, "%u", sr, &sinfo->ssi_user) != 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright sinfo->ssi_user = "";
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright if (smbsr_decode_data(sr, "%u", sr, &sinfo->ssi_domain) != 0)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright sinfo->ssi_domain = "";
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross goto part2;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /*
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * We have dialect >= NT_LM_0_12
12b65585e720714b31036daaa2b30eb76014048eGordon Ross */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (sr->smb_wct == 13) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /* Old style (non-extended) request. */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_type = SMB_SSNSETUP_NTLM012_NOEXT;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = smbsr_decode_vwv(sr, "ww4.l",
12b65585e720714b31036daaa2b30eb76014048eGordon Ross &sinfo->ssi_lmpwlen,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross &sinfo->ssi_ntpwlen,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross &sinfo->ssi_capabilities);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (rc != 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross goto done;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /* paranoid: ignore cap. ext. sec. here */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_capabilities &= ~CAP_EXTENDED_SECURITY;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_lmpwd = smb_srm_zalloc(sr, sinfo->ssi_lmpwlen + 1);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_ntpwd = smb_srm_zalloc(sr, sinfo->ssi_ntpwlen + 1);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = smbsr_decode_data(sr, "%#c#cuu", sr,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_lmpwlen, sinfo->ssi_lmpwd,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_ntpwlen, sinfo->ssi_ntpwd,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross &sinfo->ssi_user, &sinfo->ssi_domain);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (rc != 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross goto done;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_lmpwd[sinfo->ssi_lmpwlen] = 0;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_ntpwd[sinfo->ssi_ntpwlen] = 0;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross goto part2;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (sr->smb_wct == 12) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /* New style (extended) request. */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_type = SMB_SSNSETUP_NTLM012_EXTSEC;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = smbsr_decode_vwv(sr, "w4.l",
12b65585e720714b31036daaa2b30eb76014048eGordon Ross &sinfo->ssi_iseclen,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross &sinfo->ssi_capabilities);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (rc != 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross goto done;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if ((sinfo->ssi_capabilities & CAP_EXTENDED_SECURITY) == 0) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = -1;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross goto done;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_isecblob = smb_srm_zalloc(sr, sinfo->ssi_iseclen);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = smbsr_decode_data(sr, "%#c", sr,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_iseclen, sinfo->ssi_isecblob);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (rc != 0)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross goto done;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross goto part2;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /* Invalid message */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = -1;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross goto done;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Rosspart2:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /*
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Get the "Native OS" and "Native LanMan" strings.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * These are not critical to protocol function, so
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * if we can't parse them, just guess "NT".
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * These strings are free'd with the sr.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross *
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * In NTLM 0.12, the padding between the Native OS and Native LM
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * is a bit strange. On NT4.0, there is a 2 byte pad between the
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * OS (Windows NT 1381) and LM (Windows NT 4.0). On Windows 2000,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * there is no padding between the OS (Windows 2000 2195) and LM
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * (Windows 2000 5.0). If the padding is removed from the decode
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * string the NT4.0 LM comes out as an empty string. So if the
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * client's native OS is Win NT, assume extra padding.
12b65585e720714b31036daaa2b30eb76014048eGordon Ross */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = smbsr_decode_data(sr, "%u", sr, &native_os);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (rc != 0 || native_os == NULL)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_native_os = NATIVE_OS_WINNT;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross else
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_native_os = smbnative_os_value(native_os);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (sinfo->ssi_native_os == NATIVE_OS_WINNT)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = smbsr_decode_data(sr, "%,u", sr, &native_lm);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross else
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = smbsr_decode_data(sr, "%u", sr, &native_lm);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (rc != 0 || native_lm == NULL)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_native_lm = NATIVE_LM_NT;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross else
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_native_lm = smbnative_lm_value(native_lm);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = 0;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Rossdone:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (rc != 0) {
12b65585e720714b31036daaa2b30eb76014048eGordon Ross cmn_err(CE_NOTE,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross "SmbSessonSetupX: client %s invalid request",
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->session->ip_addr_str);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright DTRACE_SMB_2(op__SessionSetupX__start, smb_request_t *, sr,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_arg_sessionsetup_t, sinfo);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightvoid
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmb_post_session_setup_andx(smb_request_t *sr)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_arg_sessionsetup_t *sinfo = sr->sr_ssetup;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright DTRACE_SMB_2(op__SessionSetupX__done, smb_request_t *, sr,
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_arg_sessionsetup_t, sinfo);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (sinfo->ssi_lmpwd != NULL)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross bzero(sinfo->ssi_lmpwd, sinfo->ssi_lmpwlen);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (sinfo->ssi_ntpwd != NULL)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross bzero(sinfo->ssi_ntpwd, sinfo->ssi_ntpwlen);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright}
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright/*
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * NT systems use different native OS and native LanMan values dependent on
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * whether they are acting as a client or a server. NT 4.0 server responds
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * with the following values:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright *
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * NativeOS: Windows NT 4.0
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright * NativeLM: NT LAN Manager 4.0
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright */
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmb_sdrc_t
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wrightsmb_com_session_setup_andx(smb_request_t *sr)
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright{
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright smb_arg_sessionsetup_t *sinfo = sr->sr_ssetup;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross uint32_t status;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross uint16_t action;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright int rc;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego /*
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * Some stuff we do only in the first in a (possible)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * sequence of session setup requests.
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (sinfo->ssi_type != SMB_SSNSETUP_NTLM012_EXTSEC ||
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->smb_uid == 0 || sr->smb_uid == 0xFFFF) {
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
12b65585e720714b31036daaa2b30eb76014048eGordon Ross /* This is a first (or only) call */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->session->smb_msg_size = sinfo->ssi_maxbufsize;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->session->smb_max_mpx = sinfo->ssi_maxmpxcount;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->session->capabilities = sinfo->ssi_capabilities;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (!smb_oplock_levelII)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->session->capabilities &= ~CAP_LEVEL_II_OPLOCKS;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->session->native_os = sinfo->ssi_native_os;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->session->native_lm = sinfo->ssi_native_lm;
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /*
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * The "meat" of authentication happens here.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross if (sinfo->ssi_type == SMB_SSNSETUP_NTLM012_EXTSEC)
12b65585e720714b31036daaa2b30eb76014048eGordon Ross status = smb_authenticate_ext(sr);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross else
12b65585e720714b31036daaa2b30eb76014048eGordon Ross status = smb_authenticate_old(sr);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross switch (status) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case NT_STATUS_SUCCESS:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
961125f22fcbbcf361c897aaf3f8be5b1dbceefeGordon Ross /*
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * This is not really an error, but tells the client
12b65585e720714b31036daaa2b30eb76014048eGordon Ross * it should send another session setup request.
961125f22fcbbcf361c897aaf3f8be5b1dbceefeGordon Ross */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case NT_STATUS_MORE_PROCESSING_REQUIRED:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smbsr_error(sr, status, 0, 0);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross break;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case NT_STATUS_ACCESS_DENIED:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smbsr_error(sr, status, ERRDOS, ERROR_ACCESS_DENIED);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (SDRC_ERROR);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case NT_STATUS_TOO_MANY_SESSIONS:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smbsr_error(sr, status, ERRSRV, ERRtoomanyuids);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (SDRC_ERROR);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case NT_STATUS_NO_LOGON_SERVERS:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smbsr_error(sr, status, ERRDOS, ERROR_NO_LOGON_SERVERS);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (SDRC_ERROR);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case NT_STATUS_NETLOGON_NOT_STARTED:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smbsr_error(sr, status, ERRDOS, ERROR_NETLOGON_NOT_STARTED);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (SDRC_ERROR);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case NT_STATUS_USER_SESSION_DELETED:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smbsr_error(sr, status, ERRSRV, ERRbaduid);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (SDRC_ERROR);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case NT_STATUS_INSUFF_SERVER_RESOURCES:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smbsr_error(sr, status, ERRSRV, ERRnoresource);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (SDRC_ERROR);
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case NT_STATUS_INTERNAL_ERROR:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross default:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross smbsr_error(sr, status, ERRSRV, ERRsrverror);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return (SDRC_ERROR);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross action = SMB_USER_IS_GUEST(sr->uid_user) ? 1 : 0;
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross switch (sinfo->ssi_type) {
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross default:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case SMB_SSNSETUP_PRE_NTLM012:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case SMB_SSNSETUP_NTLM012_NOEXT:
148c5f43199ca0b43fc8e3b643aab11cd66ea327Alan Wright
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = smbsr_encode_result(sr, 3, VAR_BCC, "bb.www%uuu",
12b65585e720714b31036daaa2b30eb76014048eGordon Ross 3,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->andx_com,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross -1, /* andx_off */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross action,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross VAR_BCC,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->sr_cfg->skc_native_os,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->sr_cfg->skc_native_lm,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->sr_cfg->skc_nbdomain);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross break;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross case SMB_SSNSETUP_NTLM012_EXTSEC:
12b65585e720714b31036daaa2b30eb76014048eGordon Ross
12b65585e720714b31036daaa2b30eb76014048eGordon Ross rc = smbsr_encode_result(sr, 4, VAR_BCC, "bb.wwww%#cuuu",
12b65585e720714b31036daaa2b30eb76014048eGordon Ross 4,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->andx_com,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross -1, /* andx_off */
12b65585e720714b31036daaa2b30eb76014048eGordon Ross action,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_oseclen,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross VAR_BCC,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_oseclen,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sinfo->ssi_osecblob,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->sr_cfg->skc_native_os,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->sr_cfg->skc_native_lm,
12b65585e720714b31036daaa2b30eb76014048eGordon Ross sr->sr_cfg->skc_nbdomain);
12b65585e720714b31036daaa2b30eb76014048eGordon Ross break;
12b65585e720714b31036daaa2b30eb76014048eGordon Ross }
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego
12b65585e720714b31036daaa2b30eb76014048eGordon Ross return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
7f667e74610492ddbce8ce60f52ece95d2401949jose borrego}