mirror of
https://github.com/TalAloni/SMBLibrary.git
synced 2025-04-29 18:27:48 +02:00
Added ConnectionManager class
This commit is contained in:
parent
644e7d87d5
commit
30627e72d4
5 changed files with 57 additions and 1 deletions
|
@ -182,6 +182,7 @@
|
|||
<Compile Include="RPC\Structures\ResultElement.cs" />
|
||||
<Compile Include="RPC\Structures\ResultList.cs" />
|
||||
<Compile Include="RPC\Structures\SyntaxID.cs" />
|
||||
<Compile Include="Server\ConnectionManager.cs" />
|
||||
<Compile Include="Server\ConnectionState\ConnectionState.cs" />
|
||||
<Compile Include="Server\ConnectionState\OpenFileObject.cs" />
|
||||
<Compile Include="Server\ConnectionState\OpenSearch.cs" />
|
||||
|
|
45
SMBLibrary/Server/ConnectionManager.cs
Normal file
45
SMBLibrary/Server/ConnectionManager.cs
Normal file
|
@ -0,0 +1,45 @@
|
|||
/* Copyright (C) 2017 Tal Aloni <tal.aloni.il@gmail.com>. All rights reserved.
|
||||
*
|
||||
* You can redistribute this program and/or modify it under the terms of
|
||||
* the GNU Lesser Public License as published by the Free Software Foundation,
|
||||
* either version 3 of the License, or (at your option) any later version.
|
||||
*/
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Utilities;
|
||||
|
||||
namespace SMBLibrary.Server
|
||||
{
|
||||
internal class ConnectionManager
|
||||
{
|
||||
private List<ConnectionState> m_activeConnections = new List<ConnectionState>();
|
||||
|
||||
public void AddConnection(ConnectionState connection)
|
||||
{
|
||||
lock (m_activeConnections)
|
||||
{
|
||||
m_activeConnections.Add(connection);
|
||||
}
|
||||
}
|
||||
|
||||
public bool RemoveConnection(ConnectionState connection)
|
||||
{
|
||||
lock (m_activeConnections)
|
||||
{
|
||||
int connectionIndex = m_activeConnections.IndexOf(connection);
|
||||
if (connectionIndex >= 0)
|
||||
{
|
||||
m_activeConnections.RemoveAt(connectionIndex);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public void ReleaseConnection(ConnectionState connection)
|
||||
{
|
||||
SocketUtils.ReleaseSocket(connection.ClientSocket);
|
||||
RemoveConnection(connection);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -76,6 +76,7 @@ namespace SMBLibrary.Server
|
|||
{
|
||||
state = new SMB1ConnectionState(state);
|
||||
state.Dialect = SMBDialect.NTLM012;
|
||||
m_connectionManager.AddConnection(state);
|
||||
if (EnableExtendedSecurity && header.ExtendedSecurityFlag)
|
||||
{
|
||||
return NegotiateHelper.GetNegotiateResponseExtended(request, m_serverGuid);
|
||||
|
|
|
@ -78,6 +78,7 @@ namespace SMBLibrary.Server
|
|||
if (state.Dialect != SMBDialect.NotSet)
|
||||
{
|
||||
state = new SMB2ConnectionState(state, AllocatePersistentFileID);
|
||||
m_connectionManager.AddConnection(state);
|
||||
}
|
||||
return response;
|
||||
}
|
||||
|
|
|
@ -29,6 +29,8 @@ namespace SMBLibrary.Server
|
|||
private NamedPipeShare m_services; // Named pipes
|
||||
private Guid m_serverGuid;
|
||||
|
||||
private ConnectionManager m_connectionManager;
|
||||
|
||||
private IPAddress m_serverAddress;
|
||||
private SMBTransportType m_transport;
|
||||
private bool m_enableSMB1;
|
||||
|
@ -45,6 +47,7 @@ namespace SMBLibrary.Server
|
|||
m_securityProvider = securityProvider;
|
||||
m_services = new NamedPipeShare(shares.ListShares());
|
||||
m_serverGuid = Guid.NewGuid();
|
||||
m_connectionManager = new ConnectionManager();
|
||||
}
|
||||
|
||||
public void Start(IPAddress serverAddress, SMBTransportType transport)
|
||||
|
@ -147,10 +150,12 @@ namespace SMBLibrary.Server
|
|||
}
|
||||
catch (ObjectDisposedException)
|
||||
{
|
||||
m_connectionManager.ReleaseConnection(state);
|
||||
return;
|
||||
}
|
||||
catch (SocketException)
|
||||
{
|
||||
m_connectionManager.ReleaseConnection(state);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -158,7 +163,7 @@ namespace SMBLibrary.Server
|
|||
{
|
||||
// The other side has closed the connection
|
||||
state.LogToServer(Severity.Debug, "The other side closed the connection");
|
||||
clientSocket.Close();
|
||||
m_connectionManager.ReleaseConnection(state);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -174,9 +179,11 @@ namespace SMBLibrary.Server
|
|||
}
|
||||
catch (ObjectDisposedException)
|
||||
{
|
||||
m_connectionManager.ReleaseConnection(state);
|
||||
}
|
||||
catch (SocketException)
|
||||
{
|
||||
m_connectionManager.ReleaseConnection(state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -256,6 +263,7 @@ namespace SMBLibrary.Server
|
|||
if (state.Dialect != SMBDialect.NotSet)
|
||||
{
|
||||
state = new SMB2ConnectionState(state, AllocatePersistentFileID);
|
||||
m_connectionManager.AddConnection(state);
|
||||
}
|
||||
TrySendResponse(state, response);
|
||||
return;
|
||||
|
|
Loading…
Add table
Reference in a new issue