| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389 | 
							- // This code is derived from jcifs smb client library <jcifs at samba dot org>
 
- // Ported by J. Arturo <webmaster at komodosoft dot net>
 
- //  
 
- // This library is free software; you can redistribute it and/or
 
- // modify it under the terms of the GNU Lesser General Public
 
- // License as published by the Free Software Foundation; either
 
- // version 2.1 of the License, or (at your option) any later version.
 
- // 
 
- // This library is distributed in the hope that it will be useful,
 
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
 
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
- // Lesser General Public License for more details.
 
- // 
 
- // You should have received a copy of the GNU Lesser General Public
 
- // License along with this library; if not, write to the Free Software
 
- // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
- using System.IO;
 
- using SharpCifs.Util;
 
- using SharpCifs.Util.Sharpen;
 
- namespace SharpCifs.Smb
 
- {
 
- 	public class Dfs
 
- 	{
 
- 		internal class CacheEntry
 
- 		{
 
- 			internal long Expiration;
 
- 			internal Hashtable Map;
 
- 			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 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 bool Disabled = Config.GetBoolean("jcifs.smb.client.dfs.disabled"
 
- 			, false);
 
- 		internal static CacheEntry FalseEntry = new CacheEntry(0L);
 
- 		internal CacheEntry Domains;
 
- 		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 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 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);
 
-                             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
 
-                                         //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);
 
-                                 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);
 
-                     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;
 
- 			}
 
- 		}
 
- 		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);
 
- 			}
 
- 		}
 
- 	}
 
- }
 
 
  |