/// <summary> /// Handle re-authenticate event /// </summary> /// <param name="packet">The session setup response packet</param> /// <param name="connectionId">Used to find the connection</param> private void HandleReAuthenticateEvent(Smb2SessionSetupResponsePacket packet, int connectionId) { if (packet.Header.Status == 0) { globalSessionTable[packet.GetSessionId()].state = SessionState.Valid; } }
/// <summary> /// Handle the event of authenticate /// </summary> /// <param name="packet">The session setup response packet</param> /// <param name="connectionId">Used to find the connection</param> private void HandleNewAuthenticateEvent(Smb2SessionSetupResponsePacket packet, int connectionId) { if (!globalSessionTable.ContainsKey(packet.GetSessionId())) { Smb2ServerSession session = new Smb2ServerSession(); session.connection = connectionList[connectionId]; session.state = SessionState.InProgress; session.securityContext = null; session.sessionId = packet.GetSessionId(); session.openTable = new Dictionary<FILEID, Smb2ServerOpen>(); session.treeConnectTable = new Dictionary<uint, Smb2ServerTreeConnect>(); globalSessionTable.Add(session.sessionId, session); } Smb2SessionSetupRequestPacket requestPacket = FindRequestPacket(connectionId, packet.Header.MessageId) as Smb2SessionSetupRequestPacket; if (packet.Header.Status == 0) { if (connectionList[connectionId].clientCapabilities == 0) { connectionList[connectionId].clientCapabilities = requestPacket.PayLoad.Capabilities; } if (((packet.PayLoad.SessionFlags & SessionFlags_Values.SESSION_FLAG_IS_GUEST) == SessionFlags_Values.SESSION_FLAG_IS_GUEST) || ((packet.PayLoad.SessionFlags & SessionFlags_Values.SESSION_FLAG_IS_NULL) == SessionFlags_Values.SESSION_FLAG_IS_NULL)) { //should sign set to false. do not need to set it manually. } else { if (((requestPacket.PayLoad.SecurityMode & SESSION_SETUP_Request_SecurityMode_Values.NEGOTIATE_SIGNING_REQUIRED) == SESSION_SETUP_Request_SecurityMode_Values.NEGOTIATE_SIGNING_REQUIRED) && (this.requireMessageSigning || connectionList[connectionId].shouldSign)) { globalSessionTable[packet.GetSessionId()].shouldSign = true; } } globalSessionTable[packet.GetSessionId()].sessionKey = connectionList[connectionId].gss.SessionKey; globalSessionTable[packet.GetSessionId()].state = SessionState.Valid; //Set it to null because if another authentiate request arrives, gss must be //set to a new one. set to null as a flag to indicate gss must re-construct. //release gss, set to null connectionList[connectionId].ReleaseSspiServer(); } }