Helpers.cs
上传用户:xuelanruo
上传日期:2015-04-02
资源大小:163k
文件大小:10k
源码类别:

Ftp服务器

开发平台:

C#

  1. /*
  2. Ftp Dot Net Some static functions used by the FtpServer and FtpSession Classes
  3. Copyright (C) 
  4. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
  5. This program 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 General Public License for more details.
  6. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  7. Last modification : 04/20/2004 by Simon FERQUEL
  8. */
  9. using System;
  10. using System.Collections;
  11. using Microsoft.Win32;
  12. using System.Xml;
  13. using System.Xml.XPath;
  14. namespace FtpServerLibrary
  15. {
  16. public class Helpers
  17. {
  18. public static Hashtable VPaths(string username)
  19. {
  20. System.Collections.Hashtable vpaths=new Hashtable();
  21. try
  22. {
  23. XPathDocument doc = new XPathDocument(System.IO.Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "VPaths.xml"));
  24. XPathNavigator nav=doc.CreateNavigator();
  25. nav.MoveToFirstChild();
  26. nav.MoveToFirstChild();
  27. if(nav.Name.ToLower()=="default")
  28. {
  29. if(nav.MoveToFirstChild())
  30. {
  31. try
  32. {
  33. vpaths.Add(nav.GetAttribute("source","").Trim(),nav.GetAttribute("target","").Trim());
  34. }
  35. catch 
  36. {
  37. vpaths[nav.GetAttribute("source","").Trim()]=nav.GetAttribute("target","").Trim();
  38. }
  39. while(nav.MoveToNext())
  40. {
  41. try
  42. {
  43. vpaths.Add(nav.GetAttribute("source","").Trim(),nav.GetAttribute("target","").Trim());
  44. }
  45. catch 
  46. {
  47. vpaths[nav.GetAttribute("source","").Trim()]=nav.GetAttribute("target","").Trim();
  48. }
  49. }
  50. nav.MoveToParent();
  51. }
  52. }
  53. else if (nav.GetAttribute("user","").ToLower().Trim()==username.ToLower().Trim())
  54. {
  55. if(nav.MoveToFirstChild())
  56. {
  57. try
  58. {
  59. vpaths.Add(nav.GetAttribute("source","").Trim(),nav.GetAttribute("target","").Trim());
  60. }
  61. catch 
  62. {
  63. vpaths[nav.GetAttribute("source","").Trim()]=nav.GetAttribute("target","").Trim();
  64. }
  65. while(nav.MoveToNext())
  66. {
  67. try
  68. {
  69. vpaths.Add(nav.GetAttribute("source","").Trim(),nav.GetAttribute("target","").Trim());
  70. }
  71. catch 
  72. {
  73. vpaths[nav.GetAttribute("source","").Trim()]=nav.GetAttribute("target","").Trim();
  74. }
  75. }
  76. nav.MoveToParent();
  77. }
  78. }
  79. while(nav.MoveToNext())
  80. {
  81. if(nav.Name.ToLower()=="default")
  82. {
  83. if(nav.MoveToFirstChild())
  84. {
  85. try
  86. {
  87. vpaths.Add(nav.GetAttribute("source","").Trim(),nav.GetAttribute("target","").Trim());
  88. }
  89. catch 
  90. {
  91. vpaths[nav.GetAttribute("source","").Trim()]=nav.GetAttribute("target","").Trim();
  92. }
  93. while(nav.MoveToNext())
  94. {
  95. try
  96. {
  97. vpaths.Add(nav.GetAttribute("source","").Trim(),nav.GetAttribute("target","").Trim());
  98. }
  99. catch 
  100. {
  101. vpaths[nav.GetAttribute("source","").Trim()]=nav.GetAttribute("target","").Trim();
  102. }
  103. }
  104. nav.MoveToParent();
  105. }
  106. }
  107. else if (nav.GetAttribute("user","").ToLower().Trim()==username.ToLower().Trim())
  108. {
  109. if(nav.MoveToFirstChild())
  110. {
  111. try
  112. {
  113. vpaths.Add(nav.GetAttribute("source","").Trim(),nav.GetAttribute("target","").Trim());
  114. }
  115. catch 
  116. {
  117. vpaths[nav.GetAttribute("source","").Trim()]=nav.GetAttribute("target","").Trim();
  118. }
  119. while(nav.MoveToNext())
  120. {
  121. try
  122. {
  123. vpaths.Add(nav.GetAttribute("source","").Trim(),nav.GetAttribute("target","").Trim());
  124. }
  125. catch 
  126. {
  127. vpaths[nav.GetAttribute("source","").Trim()]=nav.GetAttribute("target","").Trim();
  128. }
  129. }
  130. nav.MoveToParent();
  131. }
  132. }
  133. }
  134. if (nav.GetAttribute("user","").ToLower().Trim()==username.ToLower().Trim())
  135. {
  136. if(nav.MoveToFirstChild())
  137. {
  138. vpaths[nav.GetAttribute("source","").Trim()]=nav.GetAttribute("target","").Trim();
  139. while(nav.MoveToNext())
  140. {
  141. vpaths[nav.GetAttribute("source","").Trim()]=nav.GetAttribute("target","").Trim();
  142. }
  143. nav.MoveToParent();
  144. }
  145. }
  146. while (nav.MoveToPrevious())
  147. {
  148. if (nav.GetAttribute("user","").ToLower().Trim()==username.ToLower().Trim())
  149. {
  150. if(nav.MoveToFirstChild())
  151. {
  152. vpaths[nav.GetAttribute("source","").Trim()]=nav.GetAttribute("target","").Trim();
  153. while(nav.MoveToNext())
  154. {
  155. vpaths[nav.GetAttribute("source","").Trim()]=nav.GetAttribute("target","").Trim();
  156. }
  157. nav.MoveToParent();
  158. }
  159. }
  160. }
  161. }
  162. catch
  163. {
  164. }
  165. return vpaths;
  166. }
  167. /// <summary>
  168. /// Retourne le r閜ertoire "home" correspondant ?l'utilisateur connect?
  169. /// </summary>
  170. /// <param name="username"></param>
  171. /// <returns></returns>
  172. public static string GetFtpRoot(string username)
  173. {
  174. try
  175. {
  176. string defaultHome="";
  177. System.Collections.Hashtable userHomes=new Hashtable();
  178. XPathDocument doc = new XPathDocument(System.IO.Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "Homes.xml"));
  179. XPathNavigator nav=doc.CreateNavigator();
  180. nav.MoveToFirstChild();
  181. nav.MoveToFirstChild();
  182. if(nav.Name.ToLower()=="default")
  183. {
  184. defaultHome=nav.GetAttribute("home","");
  185. }
  186. else if (nav.Name.ToLower()=="home")
  187. {
  188. userHomes.Add(nav.GetAttribute("user","").ToLower(),nav.GetAttribute("path",""));
  189. }
  190. while(nav.MoveToNext())
  191. {
  192. if(nav.Name.ToLower()=="default")
  193. {
  194. defaultHome=nav.GetAttribute("home","");
  195. }
  196. else if (nav.Name.ToLower()=="home")
  197. {
  198. userHomes.Add(nav.GetAttribute("user","").ToLower(),nav.GetAttribute("path",""));
  199. }
  200. }
  201. if (userHomes.ContainsKey(username.ToLower()))
  202. {
  203. return (string)userHomes[username.ToLower()];
  204. }
  205. else return defaultHome;
  206.                 
  207. }
  208. catch
  209. {
  210. return null;
  211. }
  212. }
  213. public static ArrayList VPathsInDir(string curDir,Hashtable vpaths)
  214. {
  215. ArrayList vdirs=new ArrayList();
  216. if (!curDir.EndsWith("/"))curDir+="/";
  217. foreach (string virdir in vpaths.Keys)
  218. {
  219. string vdir=virdir;
  220. if(!vdir.EndsWith("/"))vdir+="/";
  221. if(!vdir.StartsWith("/"))vdir="/"+vdir;
  222. if((vdir.Split('/').Length==(curDir.Split('/').Length+1)&&vdir.ToLower().StartsWith(curDir.ToLower())))
  223. {
  224. string[] parts=vdir.Split('/');
  225. //string ndir=vdir.Split('/')[vdir.Split('/').Length-2];
  226. //vdirs.Add(ndir);
  227. vdirs.Add(parts[parts.Length-2]);
  228. }
  229. }
  230. return vdirs;
  231. }
  232. /// <summary>
  233. /// Cette m閠hode d閠ermine si l'utilisateur peut acc閐er au chemin "dirToList" (si le chemin se
  234. /// trouve dans l'arborescence du ftp). Elle donne aussi le chemin d'acc鑣 physique au chemin ftp donn?
  235. /// Note : Elle ne v閞ifie pas la pr閟ence du fichier (pour pouvoir 阾re utilis閑 par les fonctions d'uploads etc...)
  236. /// ni les droits d'acc鑣 sur le fichier.
  237. /// </summary>
  238. /// <param name="ftpRoot">Racine du Ftp</param>
  239. /// <param name="curDir">R閜ertoire courrant par rapport ?la racine</param>
  240. /// <param name="path">Chemin ?v閞ifier</param>
  241. /// <param name="physicalPath">Param鑤re en sortie : Chemin physique correspondant au "path"</param>
  242. /// <returns></returns>
  243. public static bool IsValidDir(string ftpRoot,string curDir,string path,Hashtable vpaths,out string physicalPath, out string newCurdir)
  244. {
  245. if(path.Length>0)
  246. {
  247. if(path.StartsWith("/"))
  248. {
  249. string[]parts=path.Split('/');
  250. int depth=0;
  251. foreach(string p in parts)
  252. {
  253. if(p!="")
  254. {
  255. if (p=="..") depth--;
  256. else depth++;
  257. if (depth<0)
  258. {
  259. newCurdir=ResolveComplexUrl(curDir);
  260. physicalPath=String.Empty;
  261. return false;
  262. }
  263. }
  264. }
  265. }
  266. else
  267. {
  268. if (!curDir.EndsWith("/"))curDir+="/";
  269. path=curDir+path;
  270. string[]parts=path.Split('/');
  271. int depth=0;
  272. foreach(string p in parts)
  273. {
  274. if(p!="")
  275. {
  276. if (p=="..") depth--;
  277. else depth++;
  278. if (depth<0)
  279. {
  280. newCurdir=ResolveComplexUrl(curDir);
  281. physicalPath=String.Empty;
  282. return false;
  283. }
  284. }
  285. }
  286. }
  287. if (ftpRoot.EndsWith("\"))
  288. {
  289. ftpRoot.Remove(ftpRoot.Length-1,1);
  290. }
  291. newCurdir=ResolveComplexUrl(path);
  292. physicalPath=GetPhysicalDir(path,ftpRoot,vpaths);
  293. return true;
  294. }
  295. else 
  296. {
  297. if (ftpRoot.EndsWith("\"))
  298. {
  299. ftpRoot.Remove(ftpRoot.Length-1,1);
  300. }
  301. newCurdir=path=ResolveComplexUrl(curDir);
  302. physicalPath=GetPhysicalDir(path,ftpRoot,vpaths);
  303. return true;
  304. }
  305. }
  306. private static string ResolveComplexUrl(string url)
  307. {
  308. string[] parts=url.Split('/');
  309. string rslv="/";
  310. for (int i=0;i<parts.Length-1;i++)
  311. {
  312. if (parts[i]!=".."&&parts[i+1]!=".."&&parts[i]!="")
  313. {
  314. rslv+=parts[i]+"/";
  315. }
  316. }
  317. if(parts[parts.Length-1]!=".."&&parts[parts.Length-1]!="")
  318. rslv+=parts[parts.Length-1];
  319. return rslv;
  320. }
  321. private static string GetPhysicalDir(string path,string ftproot,Hashtable vpaths)
  322. {
  323. if(!path.EndsWith("/"))path+="/";
  324. foreach( string vpath in vpaths.Keys)
  325. {
  326. string v=vpath;
  327. if (!v.EndsWith("/"))v+="/";
  328. if(path.ToLower().StartsWith(v.ToLower()))
  329. {
  330. string rval=(string)vpaths[vpath]+path.Substring(vpath.Length).Replace("/","\");
  331. if (rval.EndsWith("\"))rval=rval.Remove(rval.Length-1,1);
  332. return rval;
  333. }
  334. }
  335. return ftproot+path.Replace("/","\");
  336. }
  337. }
  338. }