aboutsummaryrefslogtreecommitdiff
path: root/Emby.Common.Implementations/IO/SharpCifs/Smb/SmbTransport.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Common.Implementations/IO/SharpCifs/Smb/SmbTransport.cs')
-rw-r--r--Emby.Common.Implementations/IO/SharpCifs/Smb/SmbTransport.cs199
1 files changed, 68 insertions, 131 deletions
diff --git a/Emby.Common.Implementations/IO/SharpCifs/Smb/SmbTransport.cs b/Emby.Common.Implementations/IO/SharpCifs/Smb/SmbTransport.cs
index 912b209a7..800d6d9bc 100644
--- a/Emby.Common.Implementations/IO/SharpCifs/Smb/SmbTransport.cs
+++ b/Emby.Common.Implementations/IO/SharpCifs/Smb/SmbTransport.cs
@@ -31,30 +31,25 @@ namespace SharpCifs.Smb
{
internal static readonly byte[] Buf = new byte[0xFFFF];
- internal static readonly SmbComNegotiate NegotiateRequest = new SmbComNegotiate();
+ internal static readonly SmbComNegotiate NegotiateRequest = new SmbComNegotiate(
+ );
internal static LogStream LogStatic = LogStream.GetInstance();
internal static Hashtable DfsRoots = null;
- internal static SmbTransport GetSmbTransport(UniAddress address, int port)
+ internal static SmbTransport GetSmbTransport(UniAddress address, int port
+ )
{
lock (typeof(SmbTransport))
{
- return GetSmbTransport(address,
- port,
- SmbConstants.Laddr,
- SmbConstants.Lport,
- null);
+ return GetSmbTransport(address, port, SmbConstants.Laddr, SmbConstants.Lport, null);
}
}
- internal static SmbTransport GetSmbTransport(UniAddress address,
- int port,
- IPAddress localAddr,
- int localPort,
- string hostName)
+ internal static SmbTransport GetSmbTransport(UniAddress address, int port
+ , IPAddress localAddr, int localPort, string hostName)
{
lock (typeof(SmbTransport))
{
@@ -64,19 +59,18 @@ namespace SharpCifs.Smb
{
if (SmbConstants.SsnLimit != 1)
{
- conn = SmbConstants.Connections
- .FirstOrDefault(c => c.Matches(address,
- port,
- localAddr,
- localPort,
- hostName)
- && (SmbConstants.SsnLimit == 0
- || c.Sessions.Count < SmbConstants.SsnLimit));
+ conn =
+ SmbConstants.Connections.FirstOrDefault(
+ c =>
+ c.Matches(address, port, localAddr, localPort, hostName) &&
+ (SmbConstants.SsnLimit ==
+ 0 || c.Sessions.Count < SmbConstants.SsnLimit));
if (conn != null)
{
return conn;
}
+
}
conn = new SmbTransport(address, port, localAddr, localPort);
@@ -86,26 +80,6 @@ namespace SharpCifs.Smb
}
}
-
- /// <summary>
- /// Clear All Cached Transport-Connections
- /// </summary>
- public static void ClearCachedConnections()
- {
- lock (typeof(SmbTransport))
- lock (SmbConstants.Connections)
- {
- foreach (var transport in SmbConstants.Connections)
- {
- try { transport.Disconnect(true); }
- catch (Exception) {}
- }
-
- SmbConstants.Connections.Clear();
- }
- }
-
-
internal class ServerData
{
internal byte Flags;
@@ -200,10 +174,8 @@ namespace SharpCifs.Smb
internal string TconHostName;
- internal SmbTransport(UniAddress address,
- int port,
- IPAddress localAddr,
- int localPort)
+ internal SmbTransport(UniAddress address, int port, IPAddress localAddr, int localPort
+ )
{
Server = new ServerData(this);
this.Address = address;
@@ -234,8 +206,7 @@ namespace SharpCifs.Smb
return ssn;
}
- if (SmbConstants.SoTimeout > 0
- && SessionExpiration < (now = Runtime.CurrentTimeMillis()))
+ if (SmbConstants.SoTimeout > 0 && SessionExpiration < (now = Runtime.CurrentTimeMillis()))
{
SessionExpiration = now + SmbConstants.SoTimeout;
@@ -251,25 +222,16 @@ namespace SharpCifs.Smb
}
}
- internal virtual bool Matches(UniAddress address,
- int port,
- IPAddress localAddr,
- int localPort,
- string hostName)
+ internal virtual bool Matches(UniAddress address, int port, IPAddress localAddr,
+ int localPort, string hostName)
{
if (hostName == null)
{
hostName = address.GetHostName();
}
- return (TconHostName == null
- || Runtime.EqualsIgnoreCase(hostName, TconHostName))
- && address.Equals(this.Address)
- && (port == -1
- || port == this.Port
- || (port == 445 && this.Port == 139))
- && (localAddr == this.LocalAddr
- || (localAddr != null && localAddr.Equals(this.LocalAddr)))
- && localPort == this.LocalPort;
+ return (TconHostName == null || Runtime.EqualsIgnoreCase(hostName, TconHostName)) && address.Equals(this.Address) && (port == -1 || port == this.Port
+ || (port == 445 && this.Port == 139)) && (localAddr == this.LocalAddr || (localAddr
+ != null && localAddr.Equals(this.LocalAddr))) && localPort == this.LocalPort;
}
/// <exception cref="SharpCifs.Smb.SmbException"></exception>
@@ -288,36 +250,31 @@ namespace SharpCifs.Smb
internal virtual bool IsSignatureSetupRequired(NtlmPasswordAuthentication auth)
{
- return (Flags2 & SmbConstants.Flags2SecuritySignatures) != 0
- && Digest == null
- && auth != NtlmPasswordAuthentication.Null
- && NtlmPasswordAuthentication.Null.Equals(auth) == false;
+ return (Flags2 & SmbConstants.Flags2SecuritySignatures) != 0 && Digest ==
+ null && auth != NtlmPasswordAuthentication.Null && NtlmPasswordAuthentication.Null
+ .Equals(auth) == false;
}
/// <exception cref="System.IO.IOException"></exception>
internal virtual void Ssn139()
{
- Name calledName = new Name(Address.FirstCalledName(), 0x20, null);
+ Name calledName = new Name(Address.FirstCalledName(), 0x20, null
+ );
do
{
- Socket = new SocketEx(AddressFamily.InterNetwork,
- SocketType.Stream,
- ProtocolType.Tcp);
-
- //TCPローカルポートは、毎回空いているものを使う。
- //https://blogs.msdn.microsoft.com/dgorti/2005/09/18/only-one-usage-of-each-socket-address-protocolnetwork-addressport-is-normally-permitted/
- Socket.Bind(new IPEndPoint(LocalAddr, 0));
-
- Socket.Connect(new IPEndPoint(IPAddress.Parse(Address.GetHostAddress()),
- 139),
- SmbConstants.ConnTimeout);
-
+ Socket = new SocketEx(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+ if (LocalAddr != null)
+ {
+ Socket.Bind2(new IPEndPoint(LocalAddr, LocalPort));
+ }
+
+ Socket.Connect(new IPEndPoint(IPAddress.Parse(Address.GetHostAddress()), 139), SmbConstants.ConnTimeout);
Socket.SoTimeOut = SmbConstants.SoTimeout;
Out = Socket.GetOutputStream();
In = Socket.GetInputStream();
- SessionServicePacket ssp = new SessionRequestPacket(calledName,
- NbtAddress.GetLocalName());
+ SessionServicePacket ssp = new SessionRequestPacket(calledName, NbtAddress.GetLocalName
+ ());
Out.Write(Sbuf, 0, ssp.WriteWireFormat(Sbuf, 0));
if (Readn(In, Sbuf, 0, 4) < 4)
{
@@ -360,8 +317,7 @@ namespace SharpCifs.Smb
default:
{
Disconnect(true);
- throw new NbtException(NbtException.ErrSsnSrvc,
- errorCode);
+ throw new NbtException(NbtException.ErrSsnSrvc, errorCode);
}
}
break;
@@ -370,8 +326,8 @@ namespace SharpCifs.Smb
case -1:
{
Disconnect(true);
- throw new NbtException(NbtException.ErrSsnSrvc,
- NbtException.ConnectionRefused);
+ throw new NbtException(NbtException.ErrSsnSrvc, NbtException.ConnectionRefused
+ );
}
default:
@@ -401,18 +357,13 @@ namespace SharpCifs.Smb
port = SmbConstants.DefaultPort;
}
// 445
- Socket = new SocketEx(AddressFamily.InterNetwork,
- SocketType.Stream,
- ProtocolType.Tcp);
-
- //TCPローカルポートは、毎回空いているものを使う。
- //https://blogs.msdn.microsoft.com/dgorti/2005/09/18/only-one-usage-of-each-socket-address-protocolnetwork-addressport-is-normally-permitted/
- Socket.Bind(new IPEndPoint(LocalAddr, 0));
-
- Socket.Connect(new IPEndPoint(IPAddress.Parse(Address.GetHostAddress()),
- port), // <- 445
- SmbConstants.ConnTimeout);
+ Socket = new SocketEx(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+ if (LocalAddr != null)
+ {
+ Socket.Bind2(new IPEndPoint(LocalAddr, LocalPort));
+ }
+ Socket.Connect(new IPEndPoint(IPAddress.Parse(Address.GetHostAddress()), port), SmbConstants.ConnTimeout);
Socket.SoTimeOut = SmbConstants.SoTimeout;
Out = Socket.GetOutputStream();
In = Socket.GetInputStream();
@@ -479,28 +430,21 @@ namespace SharpCifs.Smb
}
catch (ConnectException)
{
- Port = (Port == -1 || Port == SmbConstants.DefaultPort)
- ? 139
- : SmbConstants.DefaultPort;
+ Port = (Port == -1 || Port == SmbConstants.DefaultPort) ? 139 : SmbConstants.DefaultPort;
Negotiate(Port, resp);
}
if (resp.DialectIndex > 10)
{
throw new SmbException("This client does not support the negotiated dialect.");
}
- if (
- (Server.Capabilities & SmbConstants.CapExtendedSecurity)
- != SmbConstants.CapExtendedSecurity
- && Server.EncryptionKeyLength != 8
- && SmbConstants.LmCompatibility == 0
- )
+ if ((Server.Capabilities & SmbConstants.CapExtendedSecurity) != SmbConstants.CapExtendedSecurity && Server
+ .EncryptionKeyLength != 8 && SmbConstants.LmCompatibility == 0)
{
- throw new SmbException("Unexpected encryption key length: "
- + Server.EncryptionKeyLength);
+ throw new SmbException("Unexpected encryption key length: " + Server.EncryptionKeyLength
+ );
}
TconHostName = Address.GetHostName();
- if (Server.SignaturesRequired
- || (Server.SignaturesEnabled && SmbConstants.Signpref))
+ if (Server.SignaturesRequired || (Server.SignaturesEnabled && SmbConstants.Signpref))
{
Flags2 |= SmbConstants.Flags2SecuritySignatures;
}
@@ -515,8 +459,7 @@ namespace SharpCifs.Smb
}
SndBufSize = Math.Min(SndBufSize, Server.MaxBufferSize);
Capabilities &= Server.Capabilities;
- if ((Server.Capabilities & SmbConstants.CapExtendedSecurity)
- == SmbConstants.CapExtendedSecurity)
+ if ((Server.Capabilities & SmbConstants.CapExtendedSecurity) == SmbConstants.CapExtendedSecurity)
{
Capabilities |= SmbConstants.CapExtendedSecurity;
}
@@ -551,7 +494,6 @@ namespace SharpCifs.Smb
//Socket.`Close` method deleted
//Socket.Close();
- Socket.Shutdown(SocketShutdown.Both);
Socket.Dispose();
}
finally
@@ -594,7 +536,7 @@ namespace SharpCifs.Smb
Log.WriteLine("New data read: " + this);
Hexdump.ToHexdump(Log, Sbuf, 4, 32);
}
- for (;;)
+ for (; ; )
{
if (Sbuf[0] == 0x00 && Sbuf[1] == 0x00 &&
Sbuf[4] == 0xFF &&
@@ -633,8 +575,8 @@ namespace SharpCifs.Smb
{
Log.WriteLine(smb);
}
- while (smb is AndXServerMessageBlock
- && (smb = ((AndXServerMessageBlock)smb).Andx) != null);
+ while (smb is AndXServerMessageBlock && (smb = ((AndXServerMessageBlock)smb).Andx
+ ) != null);
if (Log.Level >= 6)
{
Hexdump.ToHexdump(Log, Buf, 4, n);
@@ -674,9 +616,7 @@ namespace SharpCifs.Smb
{
ServerMessageBlock resp = (ServerMessageBlock)response;
resp.UseUnicode = UseUnicode;
- resp.ExtendedSecurity
- = (Capabilities & SmbConstants.CapExtendedSecurity)
- == SmbConstants.CapExtendedSecurity;
+ resp.ExtendedSecurity = (Capabilities & SmbConstants.CapExtendedSecurity) == SmbConstants.CapExtendedSecurity;
lock (Buf)
{
Array.Copy(Sbuf, 0, Buf, 0, 4 + SmbConstants.HeaderLength);
@@ -686,10 +626,8 @@ namespace SharpCifs.Smb
throw new IOException("Invalid payload size: " + size);
}
int errorCode = Encdec.Dec_uint32le(Buf, 9) & unchecked((int)(0xFFFFFFFF));
- if (resp.Command == ServerMessageBlock.SmbComReadAndx
- && (errorCode == 0
- || errorCode == unchecked((int)(0x80000005)))
- )
+ if (resp.Command == ServerMessageBlock.SmbComReadAndx && (errorCode == 0 || errorCode
+ == unchecked((int)(0x80000005))))
{
// overflow indicator normal for pipe
SmbComReadAndXResponse r = (SmbComReadAndXResponse)resp;
@@ -746,7 +684,8 @@ namespace SharpCifs.Smb
}
/// <exception cref="SharpCifs.Smb.SmbException"></exception>
- internal virtual void CheckStatus(ServerMessageBlock req, ServerMessageBlock resp)
+ internal virtual void CheckStatus(ServerMessageBlock req, ServerMessageBlock resp
+ )
{
resp.ErrorCode = SmbException.GetStatusByCode(resp.ErrorCode);
switch (resp.ErrorCode)
@@ -807,7 +746,8 @@ namespace SharpCifs.Smb
}
/// <exception cref="SharpCifs.Smb.SmbException"></exception>
- internal virtual void Send(ServerMessageBlock request, ServerMessageBlock response)
+ internal virtual void Send(ServerMessageBlock request, ServerMessageBlock response
+ )
{
Connect();
request.Flags2 |= Flags2;
@@ -869,8 +809,7 @@ namespace SharpCifs.Smb
timeout = resp.Expiration - Runtime.CurrentTimeMillis();
if (timeout <= 0)
{
- throw new TransportException(
- this + " timedout waiting for response to " + req);
+ throw new TransportException(this + " timedout waiting for response to " + req);
}
}
if (response.ErrorCode != 0)
@@ -886,7 +825,7 @@ namespace SharpCifs.Smb
}
else
{
- throw new TransportException(ie);
+ throw new TransportException(ie);
}
}
finally
@@ -952,9 +891,8 @@ namespace SharpCifs.Smb
}
/// <exception cref="SharpCifs.Smb.SmbException"></exception>
- internal virtual DfsReferral GetDfsReferrals(NtlmPasswordAuthentication auth,
- string path,
- int rn)
+ internal virtual DfsReferral GetDfsReferrals(NtlmPasswordAuthentication auth, string
+ path, int rn)
{
SmbTree ipc = GetSmbSession(auth).GetSmbTree("IPC$", null);
Trans2GetDfsReferralResponse resp = new Trans2GetDfsReferralResponse();
@@ -971,7 +909,7 @@ namespace SharpCifs.Smb
string[] arr = new string[4];
long expiration = Runtime.CurrentTimeMillis() + Dfs.Ttl * 1000;
int di = 0;
- for (;;)
+ for (; ; )
{
dr.ResolveHashes = auth.HashesExternal;
dr.Ttl = resp.Referrals[di].Ttl;
@@ -1001,8 +939,7 @@ namespace SharpCifs.Smb
/// <exception cref="SharpCifs.Smb.SmbException"></exception>
internal virtual DfsReferral[] __getDfsReferrals(NtlmPasswordAuthentication auth,
- string path,
- int rn)
+ string path, int rn)
{
SmbTree ipc = GetSmbSession(auth).GetSmbTree("IPC$", null);
Trans2GetDfsReferralResponse resp = new Trans2GetDfsReferralResponse();