public static void LogOffRequest(ModelConnectionId connectionId, ModelSessionId sessionId) { VerifyConnection(connectionId); Condition.IsNull(ConnectionList[connectionId].Request); // Reduce states Combination.NWise(1, connectionId, sessionId); // If no session exists before, then any session id is invalid Condition.IfThen(ConnectionList[connectionId].Session == null, sessionId == ModelSessionId.InvalidSessionId); // If the session id in LogOff request is different from the existing one, then the id is invalid. Condition.IfThen(ConnectionList[connectionId].Session != null && ConnectionList[connectionId].Session.SessionId != sessionId, sessionId == ModelSessionId.InvalidSessionId); if (ConnectionList[connectionId].Session == null && ConnectionList[connectionId].ConstrainedConnection) { ModelHelper.Log(LogType.Requirement, "3.3.5.2.9: The server MUST look up the Session in Connection.SessionTable by using the SessionId in the SMB2 header of the request. " + "If Connection.SessionTable is empty and Connection.ConstrainedConnection is TRUE, the server SHOULD<210> disconnect the connection. "); ModelHelper.Log(LogType.TestInfo, "Connection.SessionTable is empty and Connection.ConstrainedConnection is TRUE"); ModelHelper.Log(LogType.TestTag, TestTag.Compatibility); // server SHOULD disconnect the connection ConnectionList[connectionId].ConnectionState = ModelState.Disconnected; return; } ConnectionList[connectionId].Request = new ModelLogOffRequest(connectionId, sessionId); }
public static void SessionSetupRequest( ModelConnectionId connectionId, ModelSessionId sessionId, ModelSessionId previousSessionId, ModelSigned signed, ModelFlags flags, ModelUser user, ModelAllowReauthentication ReAuthentication) { VerifyConnection(connectionId); Condition.IsNull(ConnectionList[connectionId].Request); #region Combinations Combination.NWise(1, connectionId, sessionId, previousSessionId, signed, flags, user); #endregion #region Other contraints // Do not estabilish 2nd session if no session exist yet Condition.IfThen(GlobalSessionTable.Count == 0, sessionId != ModelSessionId.AlternativeSessionId && user == ModelUser.DefaultUser); // Do not establish new session if there's one in the requested connection Condition.IfThen(ConnectionList[connectionId].Session != null, sessionId != ModelSessionId.ZeroSessionId); // Do not establish new session if 2 sessions exist Condition.IfThen(GlobalSessionTable.Count == 2, sessionId != ModelSessionId.ZeroSessionId); // Do not set previousSessionId to session1 if currently establish session1 Condition.IfThen(GlobalSessionTable.Count == 0 && sessionId == ModelSessionId.ZeroSessionId, previousSessionId != ModelSessionId.MainSessionId); // If session id is zero, it's the same that the binding flag is set or not. Condition.IfThen(sessionId == ModelSessionId.ZeroSessionId, flags == ModelFlags.NotBinding); // Restrict the condition to no session exist yet as we only simulate one session in this Model Condition.IsNull(ConnectionList[connectionId].Session); // If we need to skip SessionSetup when it's re-auth an existing one if (ReAuthentication == ModelAllowReauthentication.NotAllowReauthentication) { Condition.IsTrue(ConnectionList[connectionId].Session == null || ConnectionList[connectionId].Session.State != ModelSessionState.Valid); } #endregion ConnectionList[connectionId].Request = new ModelSessionSetupRequest( connectionId, sessionId, previousSessionId, signed == ModelSigned.SignFlagSet, flags, user); }
public void LogOffRequest(ModelConnectionId connectionId, ModelSessionId sessionId) { ulong adapterSessionId; #region sessionId if (sessionTable.ContainsKey(sessionId)) { adapterSessionId = sessionTable[sessionId]; } else { Random r = new Random(); adapterSessionId = (ulong)r.Next(1, int.MaxValue); } #endregion PrintCurrentSessionTable("Before LogOff Request"); #region Send Request try { uint status; // Use desired explored sessionId ulong oldSessionId = connectionList[connectionId].SessionId; connectionList[connectionId].SessionId = adapterSessionId; status = connectionList[connectionId].LogOff( (header, response) => { // do nothing, avoid exception when status != status_success }); // Restore original sessionId connectionList[connectionId].SessionId = oldSessionId; if (status == Smb2Status.STATUS_SUCCESS) { sessionTable.Remove(sessionId); } PrintCurrentSessionTable("After LogOff Request"); LogOffResponse((ModelSmb2Status)status, connectionId, sessionMgmtConfig); return; } catch { } Site.Assert.IsTrue(connectionList[connectionId].Smb2Client.IsServerDisconnected, "Logoff failure should be caused by transport connection termination"); ExpectDisconnect(connectionId, sessionMgmtConfig); sessionTable.Remove(sessionId); connectionList.Remove(connectionId); #endregion }
public ModelSessionSetupRequest( ModelConnectionId connectionId, ModelSessionId sessionId, ModelSessionId previousSessionId, bool isSigned, ModelFlags flags, ModelUser user ) : base(0) { this.connectionId = connectionId; this.sessionId = sessionId; this.previousSessionId = previousSessionId; this.isSigned = isSigned; this.flags = flags; this.user = user; }
public ModelLogOffRequest(ModelConnectionId connectionId, ModelSessionId sessionId) : base(0) { this.connectionId = connectionId; this.sessionId = sessionId; }
public void SessionSetupRequest( ModelConnectionId connectionId, ModelSessionId sessionId, ModelSessionId previousSessionId, ModelSigned signed, ModelFlags flags, ModelUser user, ModelAllowReauthentication ReAuthentication) { ulong adapterSessionId; ulong adapterPreviousSessionId; Packet_Header_Flags_Values headerFlags; SESSION_SETUP_Request_Flags sessionSetupFlags; AccountCredential credential; #region sessionId if (sessionTable.ContainsKey(sessionId)) { adapterSessionId = sessionTable[sessionId]; // For sessionId is 0 which indicates session creation // assign a new one if (sessionId == ModelSessionId.ZeroSessionId) { if (!sessionTable.ContainsKey(ModelSessionId.MainSessionId)) { sessionId = ModelSessionId.MainSessionId; } else if (!sessionTable.ContainsKey(ModelSessionId.AlternativeSessionId)) { sessionId = ModelSessionId.AlternativeSessionId; } } } else { Random r = new Random(); adapterSessionId = (ulong)r.Next(1, int.MaxValue); } Site.Log.Add( LogEntryKind.Debug, "ModelSessionId: {0}, AdapterSessionId: 0x{1:x8}", sessionId, adapterSessionId); #endregion #region previousSessionId if (sessionTable.ContainsKey(previousSessionId)) { adapterPreviousSessionId = sessionTable[previousSessionId]; } else { Random r = new Random(); adapterPreviousSessionId = (ulong)r.Next(1, int.MaxValue); } Site.Log.Add( LogEntryKind.Debug, "ModelSessionId: {0}, adapterPreviousSessionId: 0x{1:x8}", sessionId, adapterPreviousSessionId); #endregion #region isSigned headerFlags = (signed == ModelSigned.SignFlagSet) ? Packet_Header_Flags_Values.FLAGS_SIGNED : Packet_Header_Flags_Values.NONE; #endregion #region flags switch (flags) { case ModelFlags.Binding: { sessionSetupFlags = SESSION_SETUP_Request_Flags.SESSION_FLAG_BINDING; break; } case ModelFlags.NotBinding: { sessionSetupFlags = SESSION_SETUP_Request_Flags.NONE; break; } default: throw new ArgumentException("flags"); } #endregion #region user switch (user) { case ModelUser.DefaultUser: { credential = testConfig.AccountCredential; break; } case ModelUser.DiffUser: { credential = testConfig.NonAdminAccountCredential; break; } default: throw new ArgumentException("user"); } #endregion #region MultipleChannel // Multiple Channel only takes affect when Connection.Dialect belongs to the SMB 3.x dialect family bool isMultipleChannelSupported = sessionMgmtConfig.IsMultiChannelCapable && ModelUtility.IsSmb3xFamily(connectionList[connectionId].Dialect); #endregion PrintCurrentSessionTable("Before SessionSetup Request"); #region Send Request uint status; SESSION_SETUP_Response? sessionSetupResponse = null; string serverName = testConfig.SutComputerName; SecurityPackageType securityPackageType = testConfig.DefaultSecurityPackage; bool useServerGssToken = testConfig.UseServerGssToken; // Use desired explored sessionId ulong oldSessionId = connectionList[connectionId].SessionId; connectionList[connectionId].SessionId = adapterSessionId; // alternative connection and never session setup if (connectionId == ModelConnectionId.AlternativeConnection && sessionId == ModelSessionId.MainSessionId && connectionList[connectionId].SessionKey == null && connectionList.ContainsKey(ModelConnectionId.MainConnection)) { connectionList[connectionId].GenerateCryptoKeys(testConfig.SendSignedRequest, false, connectionList[ModelConnectionId.MainConnection], true); } status = connectionList[connectionId].SessionSetup( headerFlags, sessionSetupFlags, adapterPreviousSessionId, securityPackageType, serverName, credential, useServerGssToken, isMultipleChannelSupported, (header, response) => { sessionSetupResponse = response; }); if (status != Smb2Status.STATUS_SUCCESS && status != Smb2Status.STATUS_MORE_PROCESSING_REQUIRED) { // Restore original sessionId if request failed connectionList[connectionId].SessionId = oldSessionId; } #endregion // Insert session to session table if (!sessionTable.ContainsKey(sessionId) && (status == Smb2Status.STATUS_SUCCESS || status == Smb2Status.STATUS_MORE_PROCESSING_REQUIRED)) { sessionTable.Add(sessionId, connectionList[connectionId].SessionId); } PrintCurrentSessionTable("After SessionSetup Request"); SessionSetupResponse((ModelSmb2Status)status, connectionId, sessionMgmtConfig); }
public void SessionSetupRequest( ModelConnectionId connectionId, ModelSessionId sessionId, ModelSessionId previousSessionId, ModelSigned signed, ModelFlags flags, ModelUser user, ModelAllowReauthentication ReAuthentication) { ulong adapterSessionId; ulong adapterPreviousSessionId; Packet_Header_Flags_Values headerFlags; SESSION_SETUP_Request_Flags sessionSetupFlags; AccountCredential credential; #region sessionId if (sessionTable.ContainsKey(sessionId)) { adapterSessionId = sessionTable[sessionId]; // For sessionId is 0 which indicates session creation // assign a new one if (sessionId == ModelSessionId.ZeroSessionId) { if (!sessionTable.ContainsKey(ModelSessionId.MainSessionId)) { sessionId = ModelSessionId.MainSessionId; } else if (!sessionTable.ContainsKey(ModelSessionId.AlternativeSessionId)) { sessionId = ModelSessionId.AlternativeSessionId; } } } else { Random r = new Random(); adapterSessionId = (ulong)r.Next(1, int.MaxValue); } Site.Log.Add( LogEntryKind.Debug, "ModelSessionId: {0}, AdapterSessionId: 0x{1:x8}", sessionId, adapterSessionId); #endregion #region previousSessionId if (sessionTable.ContainsKey(previousSessionId)) { adapterPreviousSessionId = sessionTable[previousSessionId]; } else { Random r = new Random(); adapterPreviousSessionId = (ulong)r.Next(1, int.MaxValue); } Site.Log.Add( LogEntryKind.Debug, "ModelSessionId: {0}, adapterPreviousSessionId: 0x{1:x8}", sessionId, adapterPreviousSessionId); #endregion #region isSigned headerFlags = (signed == ModelSigned.SignFlagSet) ? Packet_Header_Flags_Values.FLAGS_SIGNED : Packet_Header_Flags_Values.NONE; #endregion #region flags switch (flags) { case ModelFlags.Binding: { sessionSetupFlags = SESSION_SETUP_Request_Flags.SESSION_FLAG_BINDING; break; } case ModelFlags.NotBinding: { sessionSetupFlags = SESSION_SETUP_Request_Flags.NONE; break; } default: throw new ArgumentException("flags"); } #endregion #region user switch (user) { case ModelUser.DefaultUser: { credential = testConfig.AccountCredential; break; } case ModelUser.DiffUser: { credential = testConfig.NonAdminAccountCredential; break; } default: throw new ArgumentException("user"); } #endregion #region MultipleChannel // Multiple Channel only takes affect when Connection.Dialect belongs to the SMB 3.x dialect family bool isMultipleChannelSupported = sessionMgmtConfig.IsMultiChannelCapable && ModelUtility.IsSmb3xFamily(connectionList[connectionId].Dialect); #endregion PrintCurrentSessionTable("Before SessionSetup Request"); #region Send Request uint status; SESSION_SETUP_Response?sessionSetupResponse = null; string serverName = testConfig.SutComputerName; SecurityPackageType securityPackageType = testConfig.DefaultSecurityPackage; bool useServerGssToken = testConfig.UseServerGssToken; // Use desired explored sessionId ulong oldSessionId = connectionList[connectionId].SessionId; connectionList[connectionId].SessionId = adapterSessionId; // alternative connection and never session setup if (connectionId == ModelConnectionId.AlternativeConnection && sessionId == ModelSessionId.MainSessionId && connectionList[connectionId].SessionKey == null && connectionList.ContainsKey(ModelConnectionId.MainConnection)) { connectionList[connectionId].GenerateCryptoKeys(testConfig.SendSignedRequest, false, connectionList[ModelConnectionId.MainConnection], true); } status = connectionList[connectionId].SessionSetup( headerFlags, sessionSetupFlags, adapterPreviousSessionId, securityPackageType, serverName, credential, useServerGssToken, isMultipleChannelSupported, (header, response) => { sessionSetupResponse = response; }); if (status != Smb2Status.STATUS_SUCCESS && status != Smb2Status.STATUS_MORE_PROCESSING_REQUIRED) { // Restore original sessionId if request failed connectionList[connectionId].SessionId = oldSessionId; } #endregion // Insert session to session table if (!sessionTable.ContainsKey(sessionId) && (status == Smb2Status.STATUS_SUCCESS || status == Smb2Status.STATUS_MORE_PROCESSING_REQUIRED)) { sessionTable.Add(sessionId, connectionList[connectionId].SessionId); } PrintCurrentSessionTable("After SessionSetup Request"); SessionSetupResponse((ModelSmb2Status)status, connectionId, sessionMgmtConfig); }