aboutsummaryrefslogtreecommitdiff
path: root/Emby.Common.Implementations/IO/SharpCifs/Smb/Dfs.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Emby.Common.Implementations/IO/SharpCifs/Smb/Dfs.cs')
-rw-r--r--Emby.Common.Implementations/IO/SharpCifs/Smb/Dfs.cs694
1 files changed, 349 insertions, 345 deletions
diff --git a/Emby.Common.Implementations/IO/SharpCifs/Smb/Dfs.cs b/Emby.Common.Implementations/IO/SharpCifs/Smb/Dfs.cs
index 2f62e5b8d..304747b54 100644
--- a/Emby.Common.Implementations/IO/SharpCifs/Smb/Dfs.cs
+++ b/Emby.Common.Implementations/IO/SharpCifs/Smb/Dfs.cs
@@ -20,370 +20,374 @@ using SharpCifs.Util.Sharpen;
namespace SharpCifs.Smb
{
- public class Dfs
- {
- internal class CacheEntry
- {
- internal long Expiration;
+ public class Dfs
+ {
+ internal class CacheEntry
+ {
+ internal long Expiration;
- internal Hashtable Map;
+ internal Hashtable Map;
- internal CacheEntry(long ttl)
- {
- if (ttl == 0)
- {
- ttl = Ttl;
- }
- Expiration = Runtime.CurrentTimeMillis() + ttl * 1000L;
- Map = new Hashtable();
- }
- }
+ internal CacheEntry(long ttl)
+ {
+ if (ttl == 0)
+ {
+ ttl = Ttl;
+ }
+ Expiration = Runtime.CurrentTimeMillis() + ttl * 1000L;
+ Map = new Hashtable();
+ }
+ }
- internal static LogStream Log = LogStream.GetInstance();
+ internal static LogStream Log = LogStream.GetInstance();
- internal static readonly bool StrictView = Config.GetBoolean("jcifs.smb.client.dfs.strictView"
- , false);
+ internal static readonly bool StrictView
+ = Config.GetBoolean("jcifs.smb.client.dfs.strictView", false);
- internal static readonly long Ttl = Config.GetLong("jcifs.smb.client.dfs.ttl", 300
- );
+ internal static readonly long Ttl
+ = Config.GetLong("jcifs.smb.client.dfs.ttl", 300);
- internal static readonly bool Disabled = Config.GetBoolean("jcifs.smb.client.dfs.disabled"
- , false);
+ internal static readonly bool Disabled
+ = Config.GetBoolean("jcifs.smb.client.dfs.disabled", false);
- internal static CacheEntry FalseEntry = new CacheEntry(0L);
+ internal static CacheEntry FalseEntry = new CacheEntry(0L);
- internal CacheEntry Domains;
+ internal CacheEntry Domains;
- internal CacheEntry Referrals;
+ internal CacheEntry Referrals;
- /// <exception cref="SharpCifs.Smb.SmbAuthException"></exception>
- public virtual Hashtable GetTrustedDomains(NtlmPasswordAuthentication auth)
- {
- if (Disabled || auth.Domain == "?")
- {
- return null;
- }
- if (Domains != null && Runtime.CurrentTimeMillis() > Domains.Expiration)
- {
- Domains = null;
- }
- if (Domains != null)
- {
- return Domains.Map;
- }
- try
- {
- UniAddress addr = UniAddress.GetByName(auth.Domain, true);
- SmbTransport trans = SmbTransport.GetSmbTransport(addr, 0);
- CacheEntry entry = new CacheEntry(Ttl * 10L);
- DfsReferral dr = trans.GetDfsReferrals(auth, string.Empty, 0);
- if (dr != null)
- {
- DfsReferral start = dr;
- do
- {
- string domain = dr.Server.ToLower();
- entry.Map.Put(domain, new Hashtable());
- dr = dr.Next;
- }
- while (dr != start);
- Domains = entry;
- return Domains.Map;
- }
- }
- catch (IOException ioe)
- {
- if (Log.Level >= 3)
- {
- Runtime.PrintStackTrace(ioe, Log);
- }
- if (StrictView && ioe is SmbAuthException)
- {
- throw (SmbAuthException)ioe;
- }
- }
- return null;
- }
+ /// <exception cref="SharpCifs.Smb.SmbAuthException"></exception>
+ public virtual Hashtable GetTrustedDomains(NtlmPasswordAuthentication auth)
+ {
+ if (Disabled || auth.Domain == "?")
+ {
+ return null;
+ }
+ if (Domains != null && Runtime.CurrentTimeMillis() > Domains.Expiration)
+ {
+ Domains = null;
+ }
+ if (Domains != null)
+ {
+ return Domains.Map;
+ }
+ try
+ {
+ UniAddress addr = UniAddress.GetByName(auth.Domain, true);
+ SmbTransport trans = SmbTransport.GetSmbTransport(addr, 0);
+ CacheEntry entry = new CacheEntry(Ttl * 10L);
+ DfsReferral dr = trans.GetDfsReferrals(auth, string.Empty, 0);
+ if (dr != null)
+ {
+ DfsReferral start = dr;
+ do
+ {
+ string domain = dr.Server.ToLower();
+ entry.Map.Put(domain, new Hashtable());
+ dr = dr.Next;
+ }
+ while (dr != start);
+ Domains = entry;
+ return Domains.Map;
+ }
+ }
+ catch (IOException ioe)
+ {
+ if (Log.Level >= 3)
+ {
+ Runtime.PrintStackTrace(ioe, Log);
+ }
+ if (StrictView && ioe is SmbAuthException)
+ {
+ throw (SmbAuthException)ioe;
+ }
+ }
+ return null;
+ }
- /// <exception cref="SharpCifs.Smb.SmbAuthException"></exception>
- public virtual bool IsTrustedDomain(string domain, NtlmPasswordAuthentication auth
- )
- {
- Hashtable domains = GetTrustedDomains(auth);
- if (domains == null)
- {
- return false;
- }
- domain = domain.ToLower();
- return domains.Get(domain) != null;
- }
+ /// <exception cref="SharpCifs.Smb.SmbAuthException"></exception>
+ public virtual bool IsTrustedDomain(string domain, NtlmPasswordAuthentication auth)
+ {
+ Hashtable domains = GetTrustedDomains(auth);
+ if (domains == null)
+ {
+ return false;
+ }
+ domain = domain.ToLower();
+ return domains.Get(domain) != null;
+ }
- /// <exception cref="SharpCifs.Smb.SmbAuthException"></exception>
- public virtual SmbTransport GetDc(string domain, NtlmPasswordAuthentication auth)
- {
- if (Disabled)
- {
- return null;
- }
- try
- {
- UniAddress addr = UniAddress.GetByName(domain, true);
- SmbTransport trans = SmbTransport.GetSmbTransport(addr, 0);
- DfsReferral dr = trans.GetDfsReferrals(auth, "\\" + domain, 1);
- if (dr != null)
- {
- DfsReferral start = dr;
- IOException e = null;
- do
- {
- try
- {
- addr = UniAddress.GetByName(dr.Server);
- return SmbTransport.GetSmbTransport(addr, 0);
- }
- catch (IOException ioe)
- {
- e = ioe;
- }
- dr = dr.Next;
- }
- while (dr != start);
- throw e;
- }
- }
- catch (IOException ioe)
- {
- if (Log.Level >= 3)
- {
- Runtime.PrintStackTrace(ioe, Log);
- }
- if (StrictView && ioe is SmbAuthException)
- {
- throw (SmbAuthException)ioe;
- }
- }
- return null;
- }
+ /// <exception cref="SharpCifs.Smb.SmbAuthException"></exception>
+ public virtual SmbTransport GetDc(string domain, NtlmPasswordAuthentication auth)
+ {
+ if (Disabled)
+ {
+ return null;
+ }
+ try
+ {
+ UniAddress addr = UniAddress.GetByName(domain, true);
+ SmbTransport trans = SmbTransport.GetSmbTransport(addr, 0);
+ DfsReferral dr = trans.GetDfsReferrals(auth, "\\" + domain, 1);
+ if (dr != null)
+ {
+ DfsReferral start = dr;
+ IOException e = null;
+ do
+ {
+ try
+ {
+ addr = UniAddress.GetByName(dr.Server);
+ return SmbTransport.GetSmbTransport(addr, 0);
+ }
+ catch (IOException ioe)
+ {
+ e = ioe;
+ }
+ dr = dr.Next;
+ }
+ while (dr != start);
+ throw e;
+ }
+ }
+ catch (IOException ioe)
+ {
+ if (Log.Level >= 3)
+ {
+ Runtime.PrintStackTrace(ioe, Log);
+ }
+ if (StrictView && ioe is SmbAuthException)
+ {
+ throw (SmbAuthException)ioe;
+ }
+ }
+ return null;
+ }
- /// <exception cref="SharpCifs.Smb.SmbAuthException"></exception>
- public virtual DfsReferral GetReferral(SmbTransport trans, string domain, string
- root, string path, NtlmPasswordAuthentication auth)
- {
- if (Disabled)
- {
- return null;
- }
- try
- {
- string p = "\\" + domain + "\\" + root;
- if (path != null)
- {
- p += path;
- }
- DfsReferral dr = trans.GetDfsReferrals(auth, p, 0);
- if (dr != null)
- {
- return dr;
- }
- }
- catch (IOException ioe)
- {
- if (Log.Level >= 4)
- {
- Runtime.PrintStackTrace(ioe, Log);
- }
- if (StrictView && ioe is SmbAuthException)
- {
- throw (SmbAuthException)ioe;
- }
- }
- return null;
- }
+ /// <exception cref="SharpCifs.Smb.SmbAuthException"></exception>
+ public virtual DfsReferral GetReferral(SmbTransport trans,
+ string domain,
+ string root,
+ string path,
+ NtlmPasswordAuthentication auth)
+ {
+ if (Disabled)
+ {
+ return null;
+ }
+ try
+ {
+ string p = "\\" + domain + "\\" + root;
+ if (path != null)
+ {
+ p += path;
+ }
+ DfsReferral dr = trans.GetDfsReferrals(auth, p, 0);
+ if (dr != null)
+ {
+ return dr;
+ }
+ }
+ catch (IOException ioe)
+ {
+ if (Log.Level >= 4)
+ {
+ Runtime.PrintStackTrace(ioe, Log);
+ }
+ if (StrictView && ioe is SmbAuthException)
+ {
+ throw (SmbAuthException)ioe;
+ }
+ }
+ return null;
+ }
- /// <exception cref="SharpCifs.Smb.SmbAuthException"></exception>
- public virtual DfsReferral Resolve(string domain, string root, string path, NtlmPasswordAuthentication
- auth)
- {
- lock (this)
- {
- DfsReferral dr = null;
- long now = Runtime.CurrentTimeMillis();
- if (Disabled || root.Equals("IPC$"))
- {
- return null;
- }
- Hashtable domains = GetTrustedDomains(auth);
- if (domains != null)
- {
- domain = domain.ToLower();
- Hashtable roots = (Hashtable)domains.Get(domain);
- if (roots != null)
- {
- SmbTransport trans = null;
- root = root.ToLower();
- CacheEntry links = (CacheEntry)roots.Get(root);
- if (links != null && now > links.Expiration)
- {
- //Sharpen.Collections.Remove(roots, root);
+ /// <exception cref="SharpCifs.Smb.SmbAuthException"></exception>
+ public virtual DfsReferral Resolve(string domain,
+ string root,
+ string path,
+ NtlmPasswordAuthentication auth)
+ {
+ lock (this)
+ {
+ DfsReferral dr = null;
+ long now = Runtime.CurrentTimeMillis();
+ if (Disabled || root.Equals("IPC$"))
+ {
+ return null;
+ }
+ Hashtable domains = GetTrustedDomains(auth);
+ if (domains != null)
+ {
+ domain = domain.ToLower();
+ Hashtable roots = (Hashtable)domains.Get(domain);
+ if (roots != null)
+ {
+ SmbTransport trans = null;
+ root = root.ToLower();
+ CacheEntry links = (CacheEntry)roots.Get(root);
+ if (links != null && now > links.Expiration)
+ {
+ //Sharpen.Collections.Remove(roots, root);
roots.Remove(root);
- links = null;
- }
- if (links == null)
- {
- if ((trans = GetDc(domain, auth)) == null)
- {
- return null;
- }
- dr = GetReferral(trans, domain, root, path, auth);
- if (dr != null)
- {
- int len = 1 + domain.Length + 1 + root.Length;
- links = new CacheEntry(0L);
- DfsReferral tmp = dr;
- do
- {
- if (path == null)
- {
- // TODO: fix this
+ links = null;
+ }
+ if (links == null)
+ {
+ if ((trans = GetDc(domain, auth)) == null)
+ {
+ return null;
+ }
+ dr = GetReferral(trans, domain, root, path, auth);
+ if (dr != null)
+ {
+ int len = 1 + domain.Length + 1 + root.Length;
+ links = new CacheEntry(0L);
+ DfsReferral tmp = dr;
+ do
+ {
+ if (path == null)
+ {
+ // TODO: fix this
//tmp.map = links.map;
- tmp.Key = "\\";
- }
- tmp.PathConsumed -= len;
- tmp = tmp.Next;
- }
- while (tmp != dr);
- if (dr.Key != null)
- {
- links.Map.Put(dr.Key, dr);
- }
- roots.Put(root, links);
- }
- else
- {
- if (path == null)
- {
- roots.Put(root, FalseEntry);
- }
- }
- }
- else
- {
- if (links == FalseEntry)
- {
- links = null;
- }
- }
- if (links != null)
- {
- string link = "\\";
- dr = (DfsReferral)links.Map.Get(link);
- if (dr != null && now > dr.Expiration)
- {
- //Sharpen.Collections.Remove(links.map, link);
+ tmp.Key = "\\";
+ }
+ tmp.PathConsumed -= len;
+ tmp = tmp.Next;
+ }
+ while (tmp != dr);
+ if (dr.Key != null)
+ {
+ links.Map.Put(dr.Key, dr);
+ }
+ roots.Put(root, links);
+ }
+ else
+ {
+ if (path == null)
+ {
+ roots.Put(root, FalseEntry);
+ }
+ }
+ }
+ else
+ {
+ if (links == FalseEntry)
+ {
+ links = null;
+ }
+ }
+ if (links != null)
+ {
+ string link = "\\";
+ dr = (DfsReferral)links.Map.Get(link);
+ if (dr != null && now > dr.Expiration)
+ {
+ //Sharpen.Collections.Remove(links.map, link);
links.Map.Remove(link);
- dr = null;
- }
- if (dr == null)
- {
- if (trans == null)
- {
- if ((trans = GetDc(domain, auth)) == null)
- {
- return null;
- }
- }
- dr = GetReferral(trans, domain, root, path, auth);
- if (dr != null)
- {
- dr.PathConsumed -= 1 + domain.Length + 1 + root.Length;
- dr.Link = link;
- links.Map.Put(link, dr);
- }
- }
- }
- }
- }
- if (dr == null && path != null)
- {
- if (Referrals != null && now > Referrals.Expiration)
- {
- Referrals = null;
- }
- if (Referrals == null)
- {
- Referrals = new CacheEntry(0);
- }
- string key = "\\" + domain + "\\" + root;
- if (path.Equals("\\") == false)
- {
- key += path;
- }
- key = key.ToLower();
- //ListIterator<object> iter = new ListIterator<object>(referrals.map.Keys.GetEnumerator(), 0);
+ dr = null;
+ }
+ if (dr == null)
+ {
+ if (trans == null)
+ {
+ if ((trans = GetDc(domain, auth)) == null)
+ {
+ return null;
+ }
+ }
+ dr = GetReferral(trans, domain, root, path, auth);
+ if (dr != null)
+ {
+ dr.PathConsumed -= 1 + domain.Length + 1 + root.Length;
+ dr.Link = link;
+ links.Map.Put(link, dr);
+ }
+ }
+ }
+ }
+ }
+ if (dr == null && path != null)
+ {
+ if (Referrals != null && now > Referrals.Expiration)
+ {
+ Referrals = null;
+ }
+ if (Referrals == null)
+ {
+ Referrals = new CacheEntry(0);
+ }
+ string key = "\\" + domain + "\\" + root;
+ if (path.Equals("\\") == false)
+ {
+ key += path;
+ }
+ key = key.ToLower();
+ //ListIterator<object> iter = new ListIterator<object>(referrals.map.Keys.GetEnumerator(), 0);
foreach (var current in Referrals.Map.Keys)
{
string _key = (string)current;
- int klen = _key.Length;
- bool match = false;
- if (klen == key.Length)
- {
- match = _key.Equals(key);
- }
- else
- {
- if (klen < key.Length)
- {
- match = _key.RegionMatches(false, 0, key, 0, klen) && key[klen] == '\\';
- }
- }
- if (match)
- {
- dr = (DfsReferral)Referrals.Map.Get(_key);
- }
- }
- }
- return dr;
- }
- }
+ int klen = _key.Length;
+ bool match = false;
+ if (klen == key.Length)
+ {
+ match = _key.Equals(key);
+ }
+ else
+ {
+ if (klen < key.Length)
+ {
+ match = _key.RegionMatches(false, 0, key, 0, klen) && key[klen] == '\\';
+ }
+ }
+ if (match)
+ {
+ dr = (DfsReferral)Referrals.Map.Get(_key);
+ }
+ }
+ }
+ return dr;
+ }
+ }
- internal virtual void Insert(string path, DfsReferral dr)
- {
- lock (this)
- {
- int s1;
- int s2;
- string server;
- string share;
- string key;
- if (Disabled)
- {
- return;
- }
- s1 = path.IndexOf('\\', 1);
- s2 = path.IndexOf('\\', s1 + 1);
- server = Runtime.Substring(path, 1, s1);
- share = Runtime.Substring(path, s1 + 1, s2);
- key = Runtime.Substring(path, 0, dr.PathConsumed).ToLower();
- int ki = key.Length;
- while (ki > 1 && key[ki - 1] == '\\')
- {
- ki--;
- }
- if (ki < key.Length)
- {
- key = Runtime.Substring(key, 0, ki);
- }
- dr.PathConsumed -= 1 + server.Length + 1 + share.Length;
- if (Referrals != null && (Runtime.CurrentTimeMillis() + 10000) > Referrals.Expiration)
- {
- Referrals = null;
- }
- if (Referrals == null)
- {
- Referrals = new CacheEntry(0);
- }
- Referrals.Map.Put(key, dr);
- }
- }
- }
+ internal virtual void Insert(string path, DfsReferral dr)
+ {
+ lock (this)
+ {
+ int s1;
+ int s2;
+ string server;
+ string share;
+ string key;
+ if (Disabled)
+ {
+ return;
+ }
+ s1 = path.IndexOf('\\', 1);
+ s2 = path.IndexOf('\\', s1 + 1);
+ server = Runtime.Substring(path, 1, s1);
+ share = Runtime.Substring(path, s1 + 1, s2);
+ key = Runtime.Substring(path, 0, dr.PathConsumed).ToLower();
+ int ki = key.Length;
+ while (ki > 1 && key[ki - 1] == '\\')
+ {
+ ki--;
+ }
+ if (ki < key.Length)
+ {
+ key = Runtime.Substring(key, 0, ki);
+ }
+ dr.PathConsumed -= 1 + server.Length + 1 + share.Length;
+ if (Referrals != null && (Runtime.CurrentTimeMillis() + 10000) > Referrals.Expiration)
+ {
+ Referrals = null;
+ }
+ if (Referrals == null)
+ {
+ Referrals = new CacheEntry(0);
+ }
+ Referrals.Map.Put(key, dr);
+ }
+ }
+ }
}