ServerAPI.cs
上传用户:horngjaan
上传日期:2009-12-12
资源大小:2882k
文件大小:75k
源码类别:

Email服务器

开发平台:

C#

  1. using System;
  2. using System.IO;
  3. using System.Data;
  4. using System.Text;
  5. using System.Text.RegularExpressions;
  6. using System.Security.Cryptography;
  7. using LumiSoft.MailServer;
  8. namespace LumiSoft.MailServer
  9. {
  10. /// <summary>
  11. /// Specifies server database type.
  12. /// </summary>
  13. public enum DB_Type
  14. {
  15. /// <summary>
  16. /// Data will be stored to XML.
  17. /// </summary>
  18. XML   = 1,
  19. /// <summary>
  20. /// Data will be stored to MS SQL.
  21. /// </summary>
  22. MSSQL = 2,
  23. }
  24. /// <summary>
  25. /// Summary Description for ServerAPI.
  26. /// </summary>
  27. public class ServerAPI
  28. {
  29. private string  m_DataPath      = "";
  30. private string  m_MailStorePath = "";
  31. private string  m_ConStr        = "";
  32. private DataSet dsUsers         = null;
  33. private DataSet dsAliases       = null;
  34. private DataSet dsDomains       = null;
  35. private DataSet dsRouting       = null;
  36. private DataSet dsSecurity      = null;
  37. private DB_Type m_DB_Type  = DB_Type.XML;
  38. /// <summary>
  39. /// Defaul constructor.
  40. /// </summary>
  41. /// <param name="dataPath">xml files location.</param>
  42. /// <param name="mailStorePath">MailStore path.</param>
  43. /// <param name="conStr">Connection string.</param>
  44. /// <param name="dbType">Database type.</param>
  45. public ServerAPI(string dataPath,string mailStorePath,string conStr,DB_Type dbType)
  46. {
  47. m_DataPath      = dataPath;
  48. m_MailStorePath = mailStorePath;
  49. m_ConStr        = conStr;
  50. m_DB_Type       = dbType;
  51. dsUsers    = new DataSet();
  52. dsAliases  = new DataSet();
  53. dsDomains  = new DataSet();
  54. dsRouting  = new DataSet();
  55. dsSecurity = new DataSet();
  56. CreateUsersSchema(dsUsers);
  57. CreateAliasesSchema(dsAliases);
  58. CreateDomainsSchema(dsDomains);
  59. CreateSecuritySchema(dsSecurity);
  60. CreateRoutingsSchema(dsRouting);
  61. // We need to load all stuff to memory for XML
  62. if(dbType == DB_Type.XML){
  63. LoadUsers();
  64. LoadAliases();
  65. LoadRouting();
  66. LoadDomains();
  67. LoadSecurity();
  68. }
  69. }
  70. #region DomainName related
  71. #region function GetDomainList
  72. /// <summary>
  73. /// Gets DomainName list.
  74. /// </summary>
  75. /// <returns></returns>
  76. public DataView GetDomainList()
  77. {
  78. DataView retVal = null;
  79. switch(m_DB_Type)
  80. {
  81. #region DB_Type.XML
  82. case DB_Type.XML:
  83. retVal = dsDomains.Tables["DOMAINS"].DefaultView;
  84. break;
  85. #endregion
  86. #region DB_Type.MSSQL
  87. case DB_Type.MSSQL:
  88. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_GetDomainList")){
  89. DataSet ds = sqlCmd.Execute();
  90. ds.Tables[0].TableName = "Domains";
  91. return ds.Tables["Domains"].DefaultView;
  92. }
  93. #endregion
  94. }
  95. return retVal;
  96. }
  97. #endregion
  98. #region function AddDomain
  99. /// <summary>
  100. /// Adds new DomainName.
  101. /// </summary>
  102. /// <param name="domainName"></param>
  103. /// <param name="Description"></param>
  104. /// <returns>If successful returns DomainName ID, otherwise null.</returns>
  105. public DataRow AddDomain(string domainName,string Description)
  106. {
  107. DataRow retVal = null;
  108. try
  109. {
  110. switch(m_DB_Type)
  111. {
  112. #region DB_Type.XML
  113. case DB_Type.XML:
  114. DataSet dsDomainsCopy = dsDomains.Copy();
  115. DataRow dr = dsDomainsCopy.Tables["Domains"].NewRow();
  116. dr["DomainID"]   = Guid.NewGuid().ToString();
  117. dr["DomainName"]      = domainName;
  118. dr["Description"] = Description;
  119. dsDomainsCopy.Tables["Domains"].Rows.Add(dr);
  120. dsDomainsCopy.WriteXml(m_DataPath + "Domains.xml",XmlWriteMode.IgnoreSchema);
  121. retVal = dr;
  122. break;
  123. #endregion
  124. #region DB_Type.MSSQL
  125. case DB_Type.MSSQL:
  126. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddDomain")){
  127. sqlCmd.AddParameter("@DomainName" ,SqlDbType.NVarChar,domainName);
  128. sqlCmd.AddParameter("@Description",SqlDbType.NVarChar,Description);
  129. DataSet ds = sqlCmd.Execute();
  130. ds.Tables[0].TableName = "Domains";
  131. if(ds.Tables["Domains"].Rows.Count > 0){
  132. return ds.Tables["Domains"].Rows[0];
  133. }
  134. }
  135. break;
  136. #endregion
  137. }
  138. }
  139. catch(Exception x)
  140. {
  141. retVal = null;
  142. }
  143. return retVal;
  144. }
  145. #endregion
  146. #region function DeleteDomain
  147. /// <summary>
  148. /// Deletes specified DomainName.
  149. /// </summary>
  150. /// <param name="domainID"></param>
  151. /// <returns>Returns true if DomainName deleted successfully.</returns>
  152. public bool DeleteDomain(string domainID)
  153. {
  154. try
  155. {
  156. switch(m_DB_Type)
  157. {
  158. #region DB_Type.XML
  159. case DB_Type.XML:
  160. // 1) delete specified DomainName users
  161. // 2) delete specified DomainName aliases
  162. // 3) delete specified DomainName routing
  163. // 4) delete specified DomainName
  164. DataSet dsUsersCopy   = dsUsers.Copy();
  165. DataSet dsAliasesCopy = dsAliases.Copy();
  166. DataSet dsRoutingCopy = dsRouting.Copy();
  167. DataSet dsDomainsCopy = dsDomains.Copy();
  168. //---- Delete specified DomainName users ----------------------------//
  169. using(DataView dv = new DataView(dsUsersCopy.Tables["Users"])){
  170. dv.RowFilter = "DomainID='" + domainID + "'";
  171. if(dv.Count > 0){
  172. foreach(DataRowView drv in dv){
  173. drv.Row.Delete();
  174. }
  175. }
  176. }
  177. //----------------------------------------------------------------//
  178. //---- Delete specified DomainName aliases ---------------------------//
  179. using(DataView dvA = new DataView(dsAliasesCopy.Tables["Aliases"])){
  180. dvA.RowFilter = "DomainID='" + domainID + "'";
  181. if(dvA.Count > 0){
  182. foreach(DataRowView drv in dvA){
  183. drv.Row.Delete();
  184. }
  185. }
  186. }
  187. //----------------------------------------------------------------//
  188. //---- Delete specified DomainName routing ---------------------------//
  189. using(DataView dvR = new DataView(dsRoutingCopy.Tables["Routing"])){
  190. dvR.RowFilter = "DomainID='" + domainID + "'";
  191. if(dvR.Count > 0){
  192. foreach(DataRowView drv in dvR){
  193. drv.Row.Delete();
  194. }
  195. }
  196. }
  197. //----------------------------------------------------------------//
  198. //---- Delete DomainName itself --------------------------------------//
  199. using(DataView dv = new DataView(dsDomainsCopy.Tables["Domains"])){
  200. dv.RowFilter = "DomainID='" + domainID + "'";
  201. if(dv.Count > 0){
  202. dsDomainsCopy.Tables["Domains"].Rows.Remove(dv[0].Row);
  203. }
  204. }
  205. //----------------------------------------------------------------//
  206. dsDomainsCopy.WriteXml(m_DataPath + "Domains.xml",XmlWriteMode.IgnoreSchema);
  207. dsUsersCopy.WriteXml  (m_DataPath + "Users.xml"  ,XmlWriteMode.IgnoreSchema);
  208. dsAliasesCopy.WriteXml(m_DataPath + "Aliases.xml",XmlWriteMode.IgnoreSchema);
  209. dsRoutingCopy.WriteXml(m_DataPath + "Routing.xml",XmlWriteMode.IgnoreSchema);
  210. LoadUsers();
  211. LoadAliases();
  212. LoadRouting();
  213. return true;
  214. #endregion
  215. #region DB_Type.MSSQL
  216. case DB_Type.MSSQL:
  217. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_DeleteDomain")){
  218. sqlCmd.AddParameter("@DomainID" ,SqlDbType.NVarChar,domainID);
  219. DataSet ds = sqlCmd.Execute();
  220. return true;
  221. }
  222. #endregion
  223. }
  224. }
  225. catch(Exception x)
  226. {
  227. // System.Windows.Forms.MessageBox.Show(x.Message);
  228. }
  229. return false;
  230. }
  231. #endregion
  232. #region function DomainExists
  233. /// <summary>
  234. /// Checks if specified DomainName exists.
  235. /// </summary>
  236. /// <param name="source">DomainName or Emails address.</param>
  237. /// <returns></returns>
  238. public bool DomainExists(string source)
  239. {
  240. bool retVal = false;
  241. // Source is Emails
  242. if(source.IndexOf("@") > -1){
  243. source = source.Substring(source.IndexOf("@")+1);
  244. }
  245. switch(m_DB_Type)
  246. {
  247. #region DB_Type.XML
  248. case DB_Type.XML:
  249. using(DataView dv = new DataView(dsDomains.Tables["Domains"])){
  250. dv.RowFilter = "DomainName='" + source + "'";
  251. if(dv.Count > 0){
  252. retVal = true;
  253. }
  254. }
  255. break;
  256. #endregion
  257. #region DB_Type.MSSQL
  258. case DB_Type.MSSQL:
  259. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_DomainExists")){
  260. sqlCmd.AddParameter("@DomainName",SqlDbType.NVarChar,source);
  261. DataSet ds = sqlCmd.Execute();
  262. ds.Tables[0].TableName = "Domains";
  263. if(ds.Tables["Domains"].Rows.Count > 0){
  264. return true;
  265. }
  266. else{
  267. return false;
  268. }
  269. }
  270. #endregion
  271. }
  272. return retVal;
  273. }
  274. #endregion
  275. #endregion
  276. #region User related
  277. #region function GetUserList
  278. /// <summary>
  279. /// Gets user list in specified DomainName.
  280. /// </summary>
  281. /// <param name="domainID">DomainID of Domain which user list to retrieve.To get all use value 'ALL'.</param>
  282. /// <returns></returns>
  283. public DataView GetUserList(string domainID)
  284. {
  285. DataView retVal = null;
  286. switch(m_DB_Type)
  287. {
  288. #region DB_Type.XML
  289. case DB_Type.XML:
  290. DataView dv = new DataView(dsUsers.Tables["Users"]);
  291. if(domainID != "ALL"){
  292. dv.RowFilter = "DomainID='" + domainID + "'";
  293. }
  294. retVal = dv;
  295. break;
  296. #endregion
  297. #region DB_Type.MSSQL
  298. case DB_Type.MSSQL:
  299. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_GetUserList")){
  300. if(domainID != "ALL"){
  301. sqlCmd.AddParameter("@DomainID",SqlDbType.UniqueIdentifier,domainID);
  302. }
  303. DataSet ds = sqlCmd.Execute();
  304. ds.Tables[0].TableName = "Users";
  305. return ds.Tables["Users"].DefaultView;
  306. }
  307. #endregion
  308. }
  309. return retVal;
  310. }
  311. #endregion
  312. #region function AddUser
  313. /// <summary>
  314. /// Adds new user to specified DomainName.
  315. /// </summary>
  316. /// <param name="fullName">User full name.</param>
  317. /// <param name="userName">User login name.</param>
  318. /// <param name="password">User login password.</param>
  319. /// <param name="Description">User Description.</param>
  320. /// <param name="emails">User Emails addresses.</param>
  321. /// <param name="domainID">DomainName ID of DomainName where to add user.</param>
  322. /// <param name="mailboxSize">Maximum mailbox size.</param>
  323. /// <returns></returns>
  324. public DataRow AddUser(string fullName,string userName,string password,string Description,string emails,string domainID,int mailboxSize)
  325. {
  326. DataRow retVal = null;
  327. switch(m_DB_Type)
  328. {
  329. #region DB_Type.XML
  330. case DB_Type.XML:
  331. DataSet dsUsersCopy = dsUsers.Copy();
  332. DataRow dr = dsUsersCopy.Tables["Users"].NewRow();
  333. dr["UserID"]      = Guid.NewGuid().ToString();
  334. dr["DomainID"]    = domainID;
  335. // dr["DomainName"]       = domainName;
  336. dr["FULLNAME"]     = fullName;
  337. dr["USERNAME"]     = userName;
  338. dr["PASSWORD"]     = password;
  339. dr["Description"]  = Description;
  340. dr["Emails"]        = emails;
  341. dr["Mailbox_Size"] = mailboxSize;
  342. dsUsersCopy.Tables["Users"].Rows.Add(dr);
  343. dsUsersCopy.WriteXml(m_DataPath + "Users.xml",XmlWriteMode.IgnoreSchema);
  344. return dr;
  345. #endregion
  346. #region DB_Type.MSSQL
  347. case DB_Type.MSSQL:
  348. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddUser")){
  349. sqlCmd.AddParameter("@FullName"    ,SqlDbType.NVarChar,fullName);
  350. sqlCmd.AddParameter("@UserName"    ,SqlDbType.NVarChar,userName);
  351. sqlCmd.AddParameter("@Password"    ,SqlDbType.NVarChar,password);
  352. sqlCmd.AddParameter("@Description" ,SqlDbType.NVarChar,Description);
  353. sqlCmd.AddParameter("@Emails"      ,SqlDbType.NVarChar,emails);
  354. sqlCmd.AddParameter("@DomainID"    ,SqlDbType.NVarChar,domainID);
  355. sqlCmd.AddParameter("@MailboxSize" ,SqlDbType.NVarChar,mailboxSize);
  356. DataSet ds = sqlCmd.Execute();
  357. ds.Tables[0].TableName = "Users";
  358. if(ds.Tables["Users"].Rows.Count > 0){
  359. return ds.Tables["Users"].Rows[0];
  360. }
  361. }
  362. break;
  363. #endregion
  364. }
  365. return retVal;
  366. }
  367. #endregion
  368. #region function DeleteUser
  369. /// <summary>
  370. /// Deletes user.
  371. /// </summary>
  372. /// <param name="userID">UserID of the user which to delete.</param>
  373. public void DeleteUser(string userID)
  374. {
  375. switch(m_DB_Type)
  376. {
  377. #region DB_Type.XML
  378. case DB_Type.XML:
  379.                     DataSet dsUsersCopy = dsUsers.Copy();
  380. using(DataView dv = new DataView(dsUsersCopy.Tables["Users"])){
  381. dv.RowFilter = "UserID='" + userID + "'";
  382. if(dv.Count > 0){
  383. dsUsersCopy.Tables["Users"].Rows.Remove(dv[0].Row);
  384. }
  385. dsUsersCopy.WriteXml(m_DataPath + "Users.xml",XmlWriteMode.IgnoreSchema);
  386. // ToDo delete user folders
  387. }
  388. break;
  389. #endregion
  390. #region DB_Type.MSSQL
  391. case DB_Type.MSSQL:
  392. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_DeleteUser")){
  393. sqlCmd.AddParameter("@UserID" ,SqlDbType.NVarChar,userID);
  394. DataSet ds = sqlCmd.Execute();
  395. }
  396. break;
  397. #endregion
  398. }
  399. }
  400. #endregion
  401. #region function UpdateUser
  402. /// <summary>
  403. /// Updates new user to specified DomainName.
  404. /// </summary>
  405. /// <param name="userID"></param>
  406. /// <param name="fullName">User full name.</param>
  407. /// <param name="password">User login password.</param>
  408. /// <param name="Description">User Description.</param>
  409. /// <param name="emails">User Emails addresses.</param>
  410. /// <param name="domainID">DomainName ID of DomainName where to add user.</param>
  411. /// <param name="mailboxSize">Maximum mailbox size.</param>
  412. public void UpdateUser(string userID,string fullName,string password,string Description,string emails,string domainID,int mailboxSize)
  413. {
  414. switch(m_DB_Type)
  415. {
  416. #region DB_Type.XML
  417. case DB_Type.XML:
  418. DataSet dsUsersCopy = dsUsers.Copy();
  419. using(DataView dv = new DataView(dsUsersCopy.Tables["Users"])){
  420. dv.RowFilter = "UserID='" + userID + "'";
  421. if(dv.Count > 0){
  422. dv[0]["FULLNAME"]     = fullName;
  423. dv[0]["PASSWORD"]     = password;
  424. dv[0]["Description"]  = Description;
  425. dv[0]["Emails"]       = emails;
  426. dv[0]["DomainID"]     = domainID;
  427. dv[0]["Mailbox_Size"] = mailboxSize;
  428. }
  429. dsUsersCopy.WriteXml(m_DataPath + "Users.xml",XmlWriteMode.IgnoreSchema);
  430. }
  431. break;
  432. #endregion
  433. #region DB_Type.MSSQL
  434. case DB_Type.MSSQL:
  435. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_UpdateUser")){
  436. sqlCmd.AddParameter("@UserID"      ,SqlDbType.NVarChar,userID);
  437. sqlCmd.AddParameter("@FullName"    ,SqlDbType.NVarChar,fullName);
  438. sqlCmd.AddParameter("@Password"    ,SqlDbType.NVarChar,password);
  439. sqlCmd.AddParameter("@Description" ,SqlDbType.NVarChar,Description);
  440. sqlCmd.AddParameter("@Emails"      ,SqlDbType.NVarChar,emails);
  441. sqlCmd.AddParameter("@DomainID"    ,SqlDbType.NVarChar,domainID);
  442. sqlCmd.AddParameter("@MailboxSize" ,SqlDbType.NVarChar,mailboxSize);
  443. DataSet ds = sqlCmd.Execute();
  444. }
  445. break;
  446. #endregion
  447. }
  448. }
  449. #endregion
  450. #region function MailboxExists
  451. /// <summary>
  452. /// Checks if mailbox exists.
  453. /// </summary>
  454. /// <param name="userName">User name.</param>
  455. /// <returns></returns>
  456. public bool MailboxExists(string userName)
  457. {
  458. bool retVal = false;
  459. switch(m_DB_Type)
  460. {
  461. #region DB_Type.XML
  462. case DB_Type.XML:
  463. using(DataView dv = new DataView(dsUsers.Tables["Users"])){
  464. dv.RowFilter = "USERNAME='" + userName + "'";
  465. if(dv.Count > 0){
  466. retVal = true;
  467. }
  468. }
  469. break;
  470. #endregion
  471. #region DB_Type.MSSQL
  472. case DB_Type.MSSQL:
  473. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_UserExists")){
  474. sqlCmd.AddParameter("@UserName",SqlDbType.NVarChar,userName);
  475. DataSet ds = sqlCmd.Execute();
  476. ds.Tables[0].TableName = "Users";
  477. if(ds.Tables["Users"].Rows.Count > 0){
  478. return true;
  479. }
  480. else{
  481. return false;
  482. }
  483. }
  484. #endregion
  485. }
  486. return retVal;
  487. }
  488. #endregion
  489. #region function AuthUser
  490. /// <summary>
  491. /// Authenticates user.
  492. /// </summary>
  493. /// <param name="userName">User name.</param>
  494. /// <param name="passwData">Password data.</param>
  495. /// <param name="authData">Authentication specific data(as tag).</param>
  496. /// <param name="authType">Authentication type.</param>
  497. /// <returns></returns>
  498. public bool AuthUser(string userName,string passwData,string authData,AuthType authType)
  499. {
  500. bool retVal = false;
  501. switch(m_DB_Type)
  502. {
  503. #region DB_Type.XML
  504. case DB_Type.XML:
  505. using(DataView dv = new DataView(dsUsers.Tables["Users"])){
  506. dv.RowFilter = "USERNAME='" + userName + "'";
  507. // User exists, try to authenticate user.
  508. if(dv.Count > 0){
  509. switch(authType)
  510. {
  511. case AuthType.APOP:
  512. string password = dv[0]["PASSWORD"].ToString().ToLower();
  513. byte[] data = System.Text.Encoding.ASCII.GetBytes(authData + password);
  514. MD5 md5 = new MD5CryptoServiceProvider();
  515. byte[] hash = md5.ComputeHash(data);
  516. string hexHash = BitConverter.ToString(hash).ToLower().Replace("-","");
  517. if(hexHash == passwData){
  518. retVal = true;
  519. }
  520. break;
  521. case AuthType.Plain:
  522. if(dv[0]["PASSWORD"].ToString().ToLower() == passwData.ToLower()){
  523. retVal = true;
  524. }
  525. break;
  526. }
  527. }
  528. }
  529. break;
  530. #endregion
  531. #region DB_Type.MSSQL
  532. case DB_Type.MSSQL:
  533. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_UserExists")){
  534. sqlCmd.AddParameter("@UserName",SqlDbType.NVarChar,userName);
  535. DataSet ds = sqlCmd.Execute();
  536. ds.Tables[0].TableName = "Users";
  537. if(ds.Tables["Users"].Rows.Count > 0){
  538. switch(authType)
  539. {
  540. case AuthType.APOP:
  541. string password = ds.Tables["Users"].Rows[0]["PASSWORD"].ToString().ToLower();
  542. byte[] data = System.Text.Encoding.ASCII.GetBytes(authData + password);
  543. MD5 md5 = new MD5CryptoServiceProvider();
  544. byte[] hash = md5.ComputeHash(data);
  545. string hexHash = BitConverter.ToString(hash).ToLower().Replace("-","");
  546. if(hexHash == passwData){
  547. return true;
  548. }
  549. break;
  550. case AuthType.Plain:
  551. if(ds.Tables["Users"].Rows[0]["PASSWORD"].ToString().ToLower() == passwData.ToLower()){
  552. return true;
  553. }
  554. break;
  555. }
  556. }
  557. break;
  558. }
  559. #endregion
  560. }
  561. return retVal;
  562. }
  563. #endregion
  564. #region function EmailAddressExists
  565. /// <summary>
  566. /// Checks if specifeid Emails address belongs to somebody in this server.
  567. /// </summary>
  568. /// <param name="emailAddress">Emails address which to check.</param>
  569. /// <returns>Returns true if Emails address is found.</returns>
  570. public bool EmailAddressExists(string emailAddress)
  571. {
  572. bool retVal = false;
  573. switch(m_DB_Type)
  574. {
  575. #region DB_Type.XML
  576. case DB_Type.XML:
  577. using(DataView dv = new DataView(dsUsers.Tables["Users"])){
  578. dv.RowFilter = "Emails LIKE '*[<]" + emailAddress + "[>]*'";
  579. if(dv.Count > 0){
  580. retVal = true;
  581. }
  582. }
  583. break;
  584. #endregion
  585. #region DB_Type.MSSQL
  586. case DB_Type.MSSQL:
  587. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_EmailAddressExists")){
  588. sqlCmd.AddParameter("@EmailAddress",SqlDbType.NVarChar,emailAddress);
  589. DataSet ds = sqlCmd.Execute();
  590. ds.Tables[0].TableName = "Users";
  591. if(ds.Tables["Users"].Rows.Count > 0){
  592. return true;
  593. }
  594. else{
  595. return false;
  596. }
  597. }
  598. #endregion
  599. }
  600. return retVal;
  601. }
  602. #endregion
  603. #region function MapUser
  604. /// <summary>
  605. /// Maps Emails address to mailbox.
  606. /// </summary>
  607. /// <param name="emailAddress"></param>
  608. /// <returns>Returns mailbox or null if map failed.</returns>
  609. public string MapUser(string emailAddress)
  610. {
  611. string retVal = null;
  612. /* RFC 2821 3.6
  613. NOTE:
  614. The reserved mailbox name "postmaster" may be used in a RCPT
  615. command without DomainName qualification (see section 4.1.1.3) and
  616. MUST be accepted if so used.
  617. */
  618. //--- Check if postmaster eAddress -----------------//
  619. if(emailAddress.ToUpper().IndexOf("postmaster") > 0){
  620. return "postmaster";
  621. }
  622. //--------------------------------------------------//
  623. switch(m_DB_Type)
  624. {
  625. #region DB_Type.XML
  626. case DB_Type.XML:
  627. using(DataView dv = new DataView(dsUsers.Tables["Users"])){
  628. dv.RowFilter = "Emails LIKE '*[<]" + emailAddress + "[>]*'";
  629. if(dv.Count > 0){
  630. // UserName == MailBoxName, return MailBoxName
  631. retVal = dv[0].Row["USERNAME"].ToString();
  632. }
  633. }
  634. break;
  635. #endregion
  636. #region DB_Type.MSSQL
  637. case DB_Type.MSSQL:
  638. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_EmailAddressExists")){
  639. sqlCmd.AddParameter("@EmailAddress",SqlDbType.NVarChar,emailAddress);
  640. DataSet ds = sqlCmd.Execute();
  641. ds.Tables[0].TableName = "Users";
  642. if(ds.Tables["Users"].Rows.Count > 0){
  643. return ds.Tables["Users"].Rows[0]["USERNAME"].ToString();
  644. }
  645. }
  646. break;
  647. #endregion
  648. }
  649. return retVal;
  650. }
  651. #endregion
  652. #region function ValidateMailboxSize
  653. /// <summary>
  654. /// Checks if specified mailbox size is exceeded.
  655. /// </summary>
  656. /// <param name="mailbox"></param>
  657. /// <returns>Returns true if exceeded.</returns>
  658. public bool ValidateMailboxSize(string mailbox)
  659. {
  660. switch(m_DB_Type)
  661. {
  662. #region DB_Type.XML
  663. case DB_Type.XML:
  664. using(DataView dv = new DataView(dsUsers.Tables["Users"])){
  665. dv.RowFilter = "USERNAME='" + mailbox + "'";
  666. //--- Check if user directory exists ----//
  667. if(!Directory.Exists(m_MailStorePath + "Mailboxes\" + mailbox)){
  668. Directory.CreateDirectory(m_MailStorePath + "Mailboxes\" + mailbox);
  669. }
  670. //---------------------------------------//
  671. if(dv.Count > 0){
  672. string[] files = Directory.GetFiles(m_MailStorePath + "Mailboxes\" + mailbox);
  673. //*********************************************************
  674. // Note, code below speed is bull... when big count of files
  675. int maxSize       = Convert.ToInt32(dv[0]["Mailbox_Size"]);
  676. decimal sizeTotal = 0;
  677. foreach(string file in files){
  678. using(FileStream strm = File.OpenRead(file)){
  679. sizeTotal += strm.Length;
  680. }
  681. // If maximum size exceeded, return
  682. if(sizeTotal > maxSize*1000000){
  683. return true;
  684. }
  685. }
  686. }
  687. }
  688. break;
  689. #endregion
  690. #region DB_Type.MSSQL
  691. case DB_Type.MSSQL:
  692. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_ValidateMailboxSize")){
  693. sqlCmd.AddParameter("@MailBox",SqlDbType.NVarChar,mailbox);
  694. DataSet ds = sqlCmd.Execute();
  695. ds.Tables[0].TableName = "Detail";
  696. if(ds.Tables["Detail"].Rows.Count > 0){
  697. return !Convert.ToBoolean(ds.Tables["Detail"].Rows[0]["VALIDATED"]);
  698. }
  699. }
  700. break;
  701. #endregion
  702. }
  703. return false;
  704. }
  705. #endregion
  706. #endregion
  707. #region AliasName related
  708. #region function GetAliasesList
  709. /// <summary>
  710. /// Gets aliases.
  711. /// </summary>
  712. /// <param name="DomainName"></param>
  713. /// <returns></returns>
  714. public DataView GetAliasesList(string DomainName)
  715. {
  716. DataView retVal = null;
  717. switch(m_DB_Type)
  718. {
  719. #region DB_Type.XML
  720. case DB_Type.XML:
  721. retVal = dsAliases.Tables["Aliases"].DefaultView;
  722. break;
  723. #endregion
  724. #region DB_Type.MSSQL
  725. case DB_Type.MSSQL:
  726. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_GetAliasesList")){
  727. // sqlCmd.AddParameter("@DomainName",SqlDbType.NVarChar,source);
  728. DataSet ds = sqlCmd.Execute();
  729. ds.Tables[0].TableName = "Aliases";
  730. return ds.Tables["Aliases"].DefaultView;
  731. }
  732. #endregion
  733. }
  734. return retVal;
  735. }
  736. #endregion
  737. #region function AddAlias
  738. /// <summary>
  739. /// Adds AliasName(mailing list).
  740. /// </summary>
  741. /// <param name="aliasName">AliasName name. eg. all@lumisoft.ee</param>
  742. /// <param name="Description">AliasName Description.</param>
  743. /// <param name="AliasMembers">AliasName AliasMembers.</param>
  744. /// <param name="domainID">DomainID where AliasName belongs.</param>
  745. /// <returns></returns>
  746. public DataRow AddAlias(string aliasName,string Description,string AliasMembers,string domainID)
  747. {
  748. DataRow retVal = null;
  749. switch(m_DB_Type)
  750. {
  751. #region DB_Type.XML
  752. case DB_Type.XML:
  753. DataSet dsAliasesCopy = dsAliases.Copy();
  754. DataRow dr = dsAliasesCopy.Tables["Aliases"].NewRow();
  755. dr["AliasID"]      = Guid.NewGuid().ToString();
  756. dr["AliasName"]    = aliasName;
  757. dr["Description"]  = Description;
  758. dr["AliasMembers"] = AliasMembers;
  759. dr["DomainID"]     = domainID;
  760. dsAliasesCopy.Tables["Aliases"].Rows.Add(dr);
  761. dsAliasesCopy.WriteXml(m_DataPath + "Aliases.xml",XmlWriteMode.IgnoreSchema);
  762. retVal = dr;
  763. break;
  764. #endregion
  765. #region DB_Type.MSSQL
  766. case DB_Type.MSSQL:
  767. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddAlias")){
  768. sqlCmd.AddParameter("@AliasName"   ,SqlDbType.NVarChar,aliasName);
  769. sqlCmd.AddParameter("@Description" ,SqlDbType.NVarChar,Description);
  770. sqlCmd.AddParameter("@AliasMembers"     ,SqlDbType.NVarChar,AliasMembers);
  771. sqlCmd.AddParameter("@DomainID"    ,SqlDbType.UniqueIdentifier,domainID);
  772. DataSet ds = sqlCmd.Execute();
  773. ds.Tables[0].TableName = "Aliases";
  774. if(ds.Tables["Aliases"].Rows.Count > 0){
  775. return ds.Tables["Aliases"].Rows[0];
  776. }
  777. }
  778. break;
  779. #endregion
  780. }
  781. return retVal;
  782. }
  783. #endregion
  784. #region function DeleteAlias
  785. /// <summary>
  786. /// Deletes specified AliasName.
  787. /// </summary>
  788. /// <param name="aliasID"></param>
  789. /// <returns></returns>
  790. public void DeleteAlias(string aliasID)
  791. {
  792. switch(m_DB_Type)
  793. {
  794. #region DB_Type.XML
  795. case DB_Type.XML:
  796. DataSet dsAliasesCopy = dsAliases.Copy();
  797. using(DataView dv = new DataView(dsAliasesCopy.Tables["Aliases"])){
  798. dv.RowFilter = "AliasID='" + aliasID + "'";
  799. if(dv.Count > 0){
  800. dsAliasesCopy.Tables["Aliases"].Rows.Remove(dv[0].Row);
  801. }
  802. dsAliasesCopy.WriteXml(m_DataPath + "Aliases.xml",XmlWriteMode.IgnoreSchema);
  803. }
  804. break;
  805. #endregion
  806. #region DB_Type.MSSQL
  807. case DB_Type.MSSQL:
  808. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_DeleteAlias")){
  809. sqlCmd.AddParameter("@AliasID" ,SqlDbType.UniqueIdentifier,aliasID);
  810. DataSet ds = sqlCmd.Execute();
  811. }
  812. break;
  813. #endregion
  814. }
  815. }
  816. #endregion
  817. #region function UpdateAlias
  818. /// <summary>
  819. /// Updates AliasName.
  820. /// </summary>
  821. /// <param name="aliasID"></param>
  822. /// <param name="aliasName"></param>
  823. /// <param name="Description"></param>
  824. /// <param name="AliasMembers"></param>
  825. /// <param name="domainID"></param>
  826. public void UpdateAlias(string aliasID,string aliasName,string Description,string AliasMembers,string domainID)
  827. switch(m_DB_Type)
  828. {
  829. #region DB_Type.XML
  830. case DB_Type.XML:
  831. DataSet dsAliasesCopy = dsAliases.Copy();
  832. using(DataView dv = new DataView(dsAliasesCopy.Tables["Aliases"])){
  833. dv.RowFilter = "AliasID='" + aliasID + "'";
  834. if(dv.Count > 0){
  835. dv[0]["AliasName"]       = aliasName;
  836. dv[0]["Description"] = Description;
  837. dv[0]["AliasMembers"]     = AliasMembers;
  838. dv[0]["DomainID"]   = domainID;
  839. }
  840. dsAliasesCopy.WriteXml(m_DataPath + "Aliases.xml",XmlWriteMode.IgnoreSchema);
  841. }
  842. break;
  843. #endregion
  844. #region DB_Type.MSSQL
  845. case DB_Type.MSSQL:
  846. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_UpdateAlias")){
  847. sqlCmd.AddParameter("@AliasID"     ,SqlDbType.UniqueIdentifier,aliasID);
  848. sqlCmd.AddParameter("@AliasName"   ,SqlDbType.NVarChar,aliasName);
  849. sqlCmd.AddParameter("@Description" ,SqlDbType.NVarChar,Description);
  850. sqlCmd.AddParameter("@AliasMembers"     ,SqlDbType.NVarChar,AliasMembers);
  851. sqlCmd.AddParameter("@DomainID"    ,SqlDbType.UniqueIdentifier,domainID);
  852. DataSet ds = sqlCmd.Execute();
  853. }
  854. break;
  855. #endregion
  856. }
  857. }
  858. #endregion
  859. #region function GetAliasMembers
  860. /// <summary>
  861. /// Gets AliasName AliasMembers.
  862. /// </summary>
  863. /// <param name="emailAddress"></param>
  864. /// <returns>Return null, if AliasName not found.</returns>
  865. public string[] GetAliasMembers(string emailAddress)
  866. {
  867. string[] retVal = null;
  868. switch(m_DB_Type)
  869. {
  870. #region DB_Type.XML
  871. case DB_Type.XML:                
  872. using(DataView dv = new DataView(dsAliases.Tables["Aliases"])){
  873. dv.RowFilter = "AliasName = '" + emailAddress + "'";
  874. if(dv.Count > 0){
  875. string AliasMembers = dv[0]["AliasMembers"].ToString();
  876. retVal = AliasMembers.Split(new char[]{';'});
  877. }
  878. }
  879. break;
  880. #endregion
  881. #region DB_Type.MSSQL
  882. case DB_Type.MSSQL:
  883. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_GetAliasMembers")){
  884. sqlCmd.AddParameter("@AliasName",SqlDbType.NVarChar,emailAddress);
  885. DataSet ds = sqlCmd.Execute();
  886. ds.Tables[0].TableName = "Aliases";
  887. if(ds.Tables["Aliases"].Rows.Count > 0){
  888. string AliasMembers = ds.Tables["Aliases"].Rows[0]["AliasMembers"].ToString();
  889. return AliasMembers.Split(new char[]{';'});
  890. }
  891. }
  892. break;
  893. #endregion
  894. }
  895. return retVal;
  896. }
  897. #endregion
  898. #endregion
  899. #region Routing related
  900. #region function GetRouteList
  901. /// <summary>
  902. /// Gets Emails address routes.
  903. /// </summary>
  904. /// <returns></returns>
  905. public DataView GetRouteList()
  906. {
  907. switch(m_DB_Type)
  908. {
  909. #region DB_Type.XML
  910. case DB_Type.XML:
  911. if(!dsRouting.Tables["Routing"].Columns.Contains("Length")){
  912. dsRouting.Tables["Routing"].Columns.Add("Length",Type.GetType("System.Int32"),"Len(Pattern)");
  913. }
  914. DataView dv = new DataView(dsRouting.Tables["Routing"]);
  915. dv.Sort = "DomainID ASC,Length DESC,PATTERN DESC";
  916. return dv;
  917. #endregion
  918. #region DB_Type.MSSQL
  919. case DB_Type.MSSQL:
  920. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_GetRouteList")){
  921. // sqlCmd.AddParameter("@DomainName",SqlDbType.NVarChar,source);
  922. DataSet ds = sqlCmd.Execute();
  923. ds.Tables[0].TableName = "Routing";
  924. if(!ds.Tables["Routing"].Columns.Contains("Length")){
  925. ds.Tables["Routing"].Columns.Add("Length",Type.GetType("System.Int32"),"Len(Pattern)");
  926. }
  927. ds.Tables["Routing"].DefaultView.Sort = "DomainName DESC,Length DESC,PATTERN DESC";
  928. return ds.Tables["Routing"].DefaultView;
  929. }
  930. #endregion
  931. }
  932. return null;
  933. }
  934. #endregion
  935. #region function AddRoute
  936. /// <summary>
  937. /// Adds new Emails route.
  938. /// </summary>
  939. /// <param name="pattern">Match pattern.</param>
  940. /// <param name="mailbox">Mailbox to route.</param>
  941. /// <param name="Description">Description.</param>
  942. /// <param name="domainID">DomainName ID.</param>
  943. /// <returns></returns>
  944. public DataRow AddRoute(string pattern,string mailbox,string Description,string domainID)
  945. {
  946. DataRow retVal = null;
  947. switch(m_DB_Type)
  948. {
  949. #region DB_Type.XML
  950. case DB_Type.XML:
  951. //-- Find domainName from domainID ---------------------------//
  952. string domainName = "";
  953. foreach(DataRowView drV in this.GetDomainList()){
  954. if(drV["DomainID"].ToString().ToUpper() == domainID.ToUpper()){
  955. domainName = drV["DomainName"].ToString();
  956. }
  957. }
  958. DataSet dsRoutingCopy = dsRouting.Copy();
  959. DataRow dr = dsRoutingCopy.Tables["Routing"].NewRow();
  960. dr["RouteID"]     = Guid.NewGuid().ToString();
  961. dr["Pattern"]     = pattern;
  962. dr["Mailbox"]     = mailbox;
  963. dr["Description"] = Description;
  964. dr["DomainID"]    = domainID;
  965. dr["DomainName"]  = domainName;
  966. dsRoutingCopy.Tables["Routing"].Rows.Add(dr);
  967. dsRoutingCopy.Tables["Routing"].Columns.Remove("Length");
  968. dsRoutingCopy.WriteXml(m_DataPath + "Routing.xml",XmlWriteMode.IgnoreSchema);
  969. retVal = dr;
  970. break;
  971. #endregion
  972. #region DB_Type.MSSQL
  973. case DB_Type.MSSQL:
  974. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddRoute")){
  975. sqlCmd.AddParameter("@Pattern"     ,SqlDbType.NVarChar         ,pattern);
  976. sqlCmd.AddParameter("@Mailbox"     ,SqlDbType.NVarChar         ,mailbox);
  977. sqlCmd.AddParameter("@Description" ,SqlDbType.NVarChar         ,Description);
  978. sqlCmd.AddParameter("@DomainID"    ,SqlDbType.UniqueIdentifier ,domainID);
  979. DataSet ds = sqlCmd.Execute();
  980. ds.Tables[0].TableName = "Routing";
  981. if(ds.Tables["Routing"].Rows.Count > 0){
  982. return ds.Tables["Routing"].Rows[0];
  983. }
  984. }
  985. break;
  986. #endregion
  987. }
  988. return retVal;
  989. }
  990. #endregion
  991. #region function DeleteRoute
  992. /// <summary>
  993. /// Deletes route.
  994. /// </summary>
  995. /// <param name="routeID"></param>
  996. public void DeleteRoute(string routeID)
  997. {
  998. switch(m_DB_Type)
  999. {
  1000. #region DB_Type.XML
  1001. case DB_Type.XML:
  1002. DataSet dsRoutingCopy = dsRouting.Copy();
  1003. using(DataView dv = new DataView(dsRoutingCopy.Tables["Routing"])){
  1004. dv.RowFilter = "RouteID='" + routeID + "'";
  1005. if(dv.Count > 0){
  1006. dsRoutingCopy.Tables["Routing"].Rows.Remove(dv[0].Row);
  1007. }
  1008. dsRoutingCopy.Tables["Routing"].Columns.Remove("Length");
  1009. dsRoutingCopy.WriteXml(m_DataPath + "Routing.xml",XmlWriteMode.IgnoreSchema);
  1010. }
  1011. break;
  1012. #endregion
  1013. #region DB_Type.MSSQL
  1014. case DB_Type.MSSQL:
  1015. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_DeleteRoute")){
  1016. sqlCmd.AddParameter("@RouteID" ,SqlDbType.UniqueIdentifier,routeID);
  1017. DataSet ds = sqlCmd.Execute();
  1018. }
  1019. break;
  1020. #endregion
  1021. }
  1022. }
  1023. #endregion
  1024. #region function UpdateRoute
  1025. /// <summary>
  1026. /// Updates Emails route.
  1027. /// </summary>
  1028. /// <param name="routeID"></param>
  1029. /// <param name="pattern"></param>
  1030. /// <param name="mailbox"></param>
  1031. /// <param name="Description"></param>
  1032. /// <param name="domainID"></param>
  1033. public void UpdateRoute(string routeID,string pattern,string mailbox,string Description,string domainID)
  1034. {
  1035. switch(m_DB_Type)
  1036. {
  1037. #region DB_Type.XML
  1038. case DB_Type.XML:
  1039. //-- Find domainName from domainID ---------------------------//
  1040. string domainName = "";
  1041. foreach(DataRow drx in dsDomains.Tables["Domains"].Rows){
  1042. if(drx["DomainID"].ToString() == domainID){
  1043. domainName = drx["DomainName"].ToString();
  1044. }
  1045. }
  1046. DataSet dsRoutingCopy = dsRouting.Copy();
  1047. using(DataView dv = new DataView(dsRoutingCopy.Tables["Routing"])){
  1048. dv.RowFilter = "RouteID='" + routeID + "'";
  1049. if(dv.Count > 0){
  1050. dv[0]["Pattern"]     = pattern;
  1051. dv[0]["Mailbox"]     = mailbox;
  1052. dv[0]["Description"] = Description;
  1053. dv[0]["DomainID"]    = domainID;
  1054. dv[0]["DomainName"]  = domainName;
  1055. }
  1056. dsRoutingCopy.Tables["Routing"].Columns.Remove("Length");
  1057. dsRoutingCopy.WriteXml(m_DataPath + "Routing.xml",XmlWriteMode.IgnoreSchema);
  1058. }
  1059. break;
  1060. #endregion
  1061. #region DB_Type.MSSQL
  1062. case DB_Type.MSSQL:
  1063. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_UpdateRoute")){
  1064. sqlCmd.AddParameter("@RouteID"     ,SqlDbType.UniqueIdentifier,routeID);
  1065. sqlCmd.AddParameter("@Pattern"     ,SqlDbType.NVarChar,pattern);
  1066. sqlCmd.AddParameter("@Mailbox"     ,SqlDbType.NVarChar,mailbox);
  1067. sqlCmd.AddParameter("@Description" ,SqlDbType.NVarChar,Description);
  1068. sqlCmd.AddParameter("@DomainID"    ,SqlDbType.UniqueIdentifier,domainID);
  1069. DataSet ds = sqlCmd.Execute();
  1070. }
  1071. break;
  1072. #endregion
  1073. }
  1074. }
  1075. #endregion
  1076. #region function GetMailboxFromPattern
  1077. /// <summary>
  1078. /// Gets mailbox from pattern.
  1079. /// </summary>
  1080. /// <param name="emailAddress"></param>
  1081. /// <returns>Returns mailbox,if any match or null for no match.</returns>
  1082. public string GetMailboxFromPattern(string emailAddress)
  1083. {
  1084. string localPart = "";
  1085.     string DomainName    = "";
  1086. if(emailAddress.IndexOf("@") > -1){
  1087. localPart = emailAddress.Substring(0,emailAddress.IndexOf("@"));
  1088. DomainName    = emailAddress.Substring(emailAddress.IndexOf("@")+1);
  1089. }
  1090. else{
  1091. return null; // Emails address is invalid.
  1092. }
  1093. switch(m_DB_Type)
  1094. {
  1095. #region DB_Type.XML
  1096. case DB_Type.XML:
  1097. //-- Find domainID for domainName ---------------------------//
  1098. string domainID = null;
  1099. foreach(DataRow dr in dsDomains.Tables["Domains"].Rows){
  1100. if(dr["DomainName"].ToString().ToUpper() == DomainName.ToUpper()){
  1101. domainID = dr["DomainID"].ToString();
  1102. }
  1103. }
  1104. // we didin't find any suitable domin
  1105. if(domainID == null){
  1106. return null;
  1107. }
  1108. //----------------------------------------------------------//
  1109. // Find routing patterns for this DomainName
  1110. using(DataView dv  = this.GetRouteList()){
  1111. dv.RowFilter = "DomainID='" + domainID + "'";
  1112. // Start tring patterns from  0 to ++ ...
  1113. foreach(DataRowView vDr in dv){
  1114. string pattern = vDr["PATTERN"].ToString();
  1115. string mailbox = vDr["MAILBOX"].ToString();
  1116. if(pattern.StartsWith("*")){
  1117. if(pattern.EndsWith("*")){
  1118. if(localPart.ToUpper().IndexOf(pattern.Replace("*","").ToUpper()) > -1){
  1119. return mailbox;
  1120. }
  1121. }
  1122. else{
  1123. if(localPart.ToUpper().EndsWith(pattern.Replace("*","").ToUpper())){
  1124. return mailbox;
  1125. }
  1126. }
  1127. }
  1128. else if(pattern.EndsWith("*")){
  1129. if(localPart.ToUpper().StartsWith(pattern.Replace("*","").ToUpper())){
  1130. return mailbox;
  1131. }
  1132. }
  1133. }
  1134. }
  1135. break;
  1136. #endregion
  1137. #region DB_Type.XML
  1138. case DB_Type.MSSQL:
  1139. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_GetMailboxFromPattern")){
  1140. sqlCmd.AddParameter("@DomainName",SqlDbType.NVarChar,DomainName);
  1141. sqlCmd.AddParameter("@LocalPart" ,SqlDbType.NVarChar,localPart);
  1142. DataSet ds = sqlCmd.Execute();
  1143. ds.Tables[0].TableName = "Detail";
  1144. if(ds.Tables["Detail"].Rows.Count > 0 && !ds.Tables["Detail"].Rows[0].IsNull("Mailbox")){
  1145. return ds.Tables["Detail"].Rows[0]["Mailbox"].ToString();
  1146. }
  1147. }
  1148. break;
  1149. #endregion
  1150. }
  1151. return null;
  1152. }
  1153. #endregion
  1154. #endregion
  1155. #region MailStore related
  1156. #region function GetMessageList
  1157. /// <summary>
  1158. /// 
  1159. /// </summary>
  1160. /// <param name="mailBox"></param>
  1161. /// <param name="msgs"></param>
  1162. public void GetMessageList(string mailBox,LumiSoft.MailServer.POP3.POP3_Messages msgs)
  1163. {
  1164. switch(m_DB_Type)
  1165. {
  1166. #region DB_Type.XML
  1167. case DB_Type.XML:
  1168. string path = m_MailStorePath + "Mailboxes\" + mailBox + "\";
  1169. // Check if Directory exists, if not Create
  1170. if(!Directory.Exists(path)){
  1171. Directory.CreateDirectory(path);
  1172. }
  1173. string[] files = Directory.GetFiles(path,"*.eml");
  1174. foreach(string file in files){
  1175. int messageSize = 0;
  1176. using(FileStream fStream = File.OpenRead(file)){
  1177. messageSize = (int)fStream.Length;
  1178. }
  1179. msgs.AddMessage(Path.GetFileNameWithoutExtension(file),messageSize);
  1180. }
  1181. break;
  1182. #endregion
  1183. #region DB_Type.MSSQL
  1184. case DB_Type.MSSQL:
  1185. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_GetMessageList")){
  1186. sqlCmd.AddParameter("@Mailbox",SqlDbType.NVarChar,mailBox);
  1187. DataSet ds = sqlCmd.Execute();
  1188. ds.Tables[0].TableName = "lsMailStore";
  1189. foreach(DataRow dr in ds.Tables["lsMailStore"].Rows){
  1190. string messageID = dr["MessageID"].ToString();
  1191. int    size      = Convert.ToInt32(dr["Size"]);
  1192. msgs.AddMessage(messageID,size);
  1193. }
  1194. }
  1195. break;
  1196. #endregion
  1197. }
  1198. }
  1199. #endregion
  1200. #region function StoreMessage
  1201. /// <summary>
  1202. /// Stores message to specified mailbox.
  1203. /// </summary>
  1204. /// <param name="mailbox">Mailbox name.</param>
  1205. /// <param name="msgStream">Stream where message has stored.</param>
  1206. public void StoreMessage(string mailbox,MemoryStream msgStream)
  1207. {
  1208. switch(m_DB_Type)
  1209. {
  1210. #region DB_Type.XML
  1211. case DB_Type.XML:
  1212. // Create dummy file name
  1213. string filename = Guid.NewGuid().ToString();
  1214.    filename = filename.Substring(0,22);
  1215.            filename = filename.Replace("-","_");
  1216. string path = m_MailStorePath + "MailBoxes\" + mailbox;
  1217. // Check if Directory exists, if not Create
  1218. if(!Directory.Exists(path)){
  1219. Directory.CreateDirectory(path);
  1220. }
  1221. //---- Write message data to file -------------------------------//
  1222. using(FileStream fStream = File.Create(path + "\" + filename + ".eml",(int)msgStream.Length)){
  1223. msgStream.WriteTo(fStream);
  1224. // // Write message
  1225. // fStream.Write(msg,0,msg.Length);
  1226. }
  1227. //---------------------------------------------------------------//
  1228. break;
  1229. #endregion
  1230. #region DB_Type.MSSQL
  1231. case DB_Type.MSSQL:
  1232. byte[] topLines = null;
  1233. topLines = GetTopLines(msgStream,50);
  1234. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_StoreMessage")){
  1235. sqlCmd.AddParameter("@MailBox"  ,SqlDbType.NVarChar,mailbox);
  1236. sqlCmd.AddParameter("@Data"     ,SqlDbType.Image   ,msgStream.ToArray());
  1237. sqlCmd.AddParameter("@Size"     ,SqlDbType.BigInt  ,msgStream.Length);
  1238. sqlCmd.AddParameter("@TopLines" ,SqlDbType.Image   ,topLines);
  1239. DataSet ds = sqlCmd.Execute();
  1240. }
  1241. break;
  1242. #endregion
  1243. }
  1244. }
  1245. #endregion
  1246. #region function DeleteMessage
  1247. /// <summary>
  1248. /// Deletes message from mailbox.
  1249. /// </summary>
  1250. /// <param name="mailbox">MailBox name.</param>
  1251. /// <param name="msgID">MessageID.</param>
  1252. public void DeleteMessage(string mailbox,string msgID)
  1253. {
  1254. switch(m_DB_Type)
  1255. {
  1256. #region DB_Type.XML
  1257. case DB_Type.XML:
  1258. string msgFile = m_MailStorePath + "Mailboxes\" + mailbox + "\" + msgID + ".eml";
  1259. // Check if file exists
  1260. if(File.Exists(msgFile)){
  1261. File.Delete(msgFile);
  1262. }
  1263. break;
  1264. #endregion
  1265. #region DB_Type.MSSQL
  1266. case DB_Type.MSSQL:
  1267. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_DeleteMessage")){
  1268. sqlCmd.AddParameter("@MessageID",SqlDbType.NVarChar,msgID);
  1269. DataSet ds = sqlCmd.Execute();
  1270. }
  1271. break;
  1272. #endregion
  1273. }
  1274. }
  1275. #endregion
  1276. #region function GetMessage
  1277. /// <summary>
  1278. /// Gets message from mailbox.
  1279. /// </summary>
  1280. /// <param name="mailbox">Mailbox name.</param>
  1281. /// <param name="msgID">MessageID</param>
  1282. public byte[] GetMessage(string mailbox,string msgID)
  1283. {
  1284. byte[] retVal = null;
  1285. switch(m_DB_Type)
  1286. {
  1287. #region DB_Type.XML
  1288. case DB_Type.XML:
  1289. string msgFile = m_MailStorePath + "Mailboxes\" + mailbox + "\" + msgID + ".eml";
  1290. // Check if file exists
  1291. if(File.Exists(msgFile)){
  1292. //---- Read message from file -----------//
  1293. using(FileStream fStrm = File.OpenRead(msgFile)){
  1294. retVal = new byte[fStrm.Length];
  1295. fStrm.Read(retVal,0,(int)fStrm.Length);
  1296. }
  1297. //---------------------------------------//
  1298. }
  1299. break;
  1300. #endregion
  1301. #region DB_Type.MSSQL
  1302. case DB_Type.MSSQL:
  1303. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_GetMessage")){
  1304. sqlCmd.AddParameter("@MessageID",SqlDbType.NVarChar,msgID);
  1305. DataSet ds = sqlCmd.Execute();
  1306. ds.Tables[0].TableName = "lsMailStore";
  1307. return (byte[])ds.Tables["lsMailStore"].Rows[0]["Data"];
  1308. }
  1309. #endregion
  1310. }
  1311. return retVal;
  1312. }
  1313. #endregion
  1314. #region function GetMessageTopLines
  1315. /// <summary>
  1316. /// Gets message header + number of specified lines.
  1317. /// </summary>
  1318. /// <param name="mailbox">Mailbox.</param>
  1319. /// <param name="msgID">MessageID.</param>
  1320. /// <param name="nrLines">Number of lines to retrieve. NOTE: line counting starts at theend of header.</param>
  1321. /// <returns>Returns message header + number of specified lines.</returns>
  1322. public byte[] GetMessageTopLines(string mailbox,string msgID,int nrLines)
  1323. {
  1324. switch(m_DB_Type)
  1325. {
  1326. #region DB_Type.XML
  1327. case DB_Type.XML:
  1328. string msgFile = m_MailStorePath + "Mailboxes\" + mailbox + "\" + msgID + ".eml";
  1329. using(FileStream strm = File.OpenRead(msgFile)){
  1330. return GetTopLines(strm,nrLines);
  1331. }
  1332. #endregion
  1333. #region DB_Type.MSSQL
  1334. case DB_Type.MSSQL:
  1335. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_GetMessageTopLines")){
  1336. sqlCmd.AddParameter("@MessageID",SqlDbType.NVarChar,msgID);
  1337. DataSet ds = sqlCmd.Execute();
  1338. ds.Tables[0].TableName = "lsMailStore";
  1339. return (byte[])ds.Tables["lsMailStore"].Rows[0]["TopLines"];
  1340. }
  1341. #endregion
  1342. }
  1343. return null;
  1344. }
  1345. #endregion
  1346. #endregion
  1347. #region Security related
  1348. #region function GetSecurity
  1349. /// <summary>
  1350. /// Gets security entries list.
  1351. /// </summary>
  1352. public DataView GetSecurityList()
  1353. {
  1354. DataView retVal = null;
  1355. switch(m_DB_Type)
  1356. {
  1357. #region DB_Type.XML
  1358. case DB_Type.XML:
  1359. retVal = dsSecurity.Tables["Security_List"].DefaultView;
  1360. break;
  1361. #endregion
  1362. #region DB_Type.MSSQL
  1363. case DB_Type.MSSQL:
  1364. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_GetSecurityList")){
  1365. // sqlCmd.AddParameter("@DomainName",SqlDbType.NVarChar,source);
  1366. DataSet ds = sqlCmd.Execute();
  1367. ds.Tables[0].TableName = "Security_List";
  1368. return ds.Tables["Security_List"].DefaultView;
  1369. }
  1370. #endregion
  1371. }
  1372. return retVal;
  1373. }
  1374. #endregion
  1375. #region function AddSecurityEntry
  1376. /// <summary>
  1377. /// Adds secuity entry.
  1378. /// </summary>
  1379. /// <param name="Description"></param>
  1380. /// <param name="protocol"></param>
  1381. /// <param name="type"></param>
  1382. /// <param name="action"></param>
  1383. /// <param name="content"></param>
  1384. /// <param name="startIP"></param>
  1385. /// <param name="endIP"></param>
  1386. /// <returns></returns>
  1387. public DataRow AddSecurityEntry(string Description,string protocol,string type,string action,string content,long startIP,long endIP)
  1388. {
  1389. DataRow retVal = null;
  1390. switch(m_DB_Type)
  1391. {
  1392. #region DB_Type.XML
  1393. case DB_Type.XML:
  1394. DataSet dsSecurityCopy = dsAliases.Copy();
  1395. DataRow dr = dsSecurityCopy.Tables["Security_List"].NewRow();
  1396. dr["SecurityID"]  = Guid.NewGuid().ToString();
  1397. dr["Description"] = Description;
  1398. dr["Protocol"]    = protocol;
  1399. dr["Type"]        = type;
  1400. dr["Action"]      = action;
  1401. dsSecurityCopy.Tables["Security_List"].Rows.Add(dr);
  1402. dsSecurityCopy.WriteXml(m_DataPath + "Security.xml",XmlWriteMode.IgnoreSchema);
  1403. retVal = dr;
  1404. break;
  1405. #endregion
  1406. #region DB_Type.MSSQL
  1407. case DB_Type.MSSQL:
  1408. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddSecurityEntry")){
  1409. sqlCmd.AddParameter("@Description" ,SqlDbType.NVarChar,Description);
  1410. sqlCmd.AddParameter("@Protocol"    ,SqlDbType.NVarChar,protocol);
  1411. sqlCmd.AddParameter("@Type"        ,SqlDbType.NVarChar,type);
  1412. sqlCmd.AddParameter("@Action"      ,SqlDbType.NVarChar,action);
  1413. sqlCmd.AddParameter("@Content"     ,SqlDbType.NVarChar,content);
  1414. sqlCmd.AddParameter("@StartIP"     ,SqlDbType.NVarChar,startIP);
  1415. sqlCmd.AddParameter("@EndIP"       ,SqlDbType.NVarChar,endIP);
  1416. DataSet ds = sqlCmd.Execute();
  1417. ds.Tables[0].TableName = "Security_List";
  1418. if(ds.Tables["Security_List"].Rows.Count > 0){
  1419. return ds.Tables["Security_List"].Rows[0];
  1420. }
  1421. }
  1422. break;
  1423. #endregion
  1424. }
  1425. return retVal;
  1426. }
  1427. #endregion
  1428. #region function DeleteSecurityEntry
  1429. /// <summary>
  1430. /// Deletes security entry.
  1431. /// </summary>
  1432. /// <param name="securityID"></param>
  1433. public void DeleteSecurityEntry(string securityID)
  1434. {
  1435. switch(m_DB_Type)
  1436. {
  1437. #region DB_Type.XML
  1438. case DB_Type.XML:
  1439. using(DataView dv = new DataView(dsSecurity.Tables["Security_List"])){
  1440. dv.RowFilter = "SecurityID='" + securityID + "'";
  1441. if(dv.Count > 0){
  1442. dsSecurity.Tables["Aliases"].Rows.Remove(dv[0].Row);
  1443. }
  1444. dsSecurity.WriteXml(m_DataPath + "Security.xml",XmlWriteMode.IgnoreSchema);
  1445. }
  1446. break;
  1447. #endregion
  1448. #region DB_Type.MSSQL
  1449. case DB_Type.MSSQL:
  1450. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_DeleteSecurityEntry")){
  1451. sqlCmd.AddParameter("@SecurityID" ,SqlDbType.UniqueIdentifier,securityID);
  1452. DataSet ds = sqlCmd.Execute();
  1453. }
  1454. break;
  1455. #endregion
  1456. }
  1457. }
  1458. #endregion
  1459. #region function UpdateSecurityEntry
  1460. /// <summary>
  1461. /// Updates security entry.
  1462. /// </summary>
  1463. /// <param name="securityID"></param>
  1464. /// <param name="Description"></param>
  1465. /// <param name="protocol"></param>
  1466. /// <param name="type"></param>
  1467. /// <param name="action"></param>
  1468. /// <param name="content"></param>
  1469. /// <param name="startIP"></param>
  1470. /// <param name="endIP"></param>
  1471. /// <returns></returns>
  1472. public void UpdateSecurityEntry(string securityID,string Description,string protocol,string type,string action,string content,long startIP,long endIP)
  1473. {
  1474. switch(m_DB_Type)
  1475. {
  1476. #region DB_Type.XML
  1477. case DB_Type.XML:
  1478. DataSet dsSecurityCopy = dsAliases.Copy();
  1479. DataRow dr = dsSecurityCopy.Tables["Security_List"].NewRow();
  1480. dr["SecurityID"]  = Guid.NewGuid().ToString();
  1481. dr["Description"] = Description;
  1482. dr["Protocol"]    = protocol;
  1483. dr["Type"]        = type;
  1484. dr["Action"]      = action;
  1485. dsSecurityCopy.Tables["Security_List"].Rows.Add(dr);
  1486. dsSecurityCopy.WriteXml(m_DataPath + "Security.xml",XmlWriteMode.IgnoreSchema);
  1487. break;
  1488. #endregion
  1489. #region DB_Type.MSSQL
  1490. case DB_Type.MSSQL:
  1491. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_UpdateSecurityEntry")){
  1492. sqlCmd.AddParameter("@SecurityID"  ,SqlDbType.UniqueIdentifier,securityID);
  1493. sqlCmd.AddParameter("@Description" ,SqlDbType.NVarChar        ,Description);
  1494. sqlCmd.AddParameter("@Protocol"    ,SqlDbType.NVarChar        ,protocol);
  1495. sqlCmd.AddParameter("@Type"        ,SqlDbType.NVarChar        ,type);
  1496. sqlCmd.AddParameter("@Action"      ,SqlDbType.NVarChar        ,action);
  1497. sqlCmd.AddParameter("@Content"     ,SqlDbType.NVarChar        ,content);
  1498. sqlCmd.AddParameter("@StartIP"     ,SqlDbType.BigInt          ,startIP);
  1499. sqlCmd.AddParameter("@EndIP"       ,SqlDbType.BigInt          ,endIP);
  1500. DataSet ds = sqlCmd.Execute();
  1501. }
  1502. break;
  1503. #endregion
  1504. }
  1505. }
  1506. #endregion
  1507. #region function IsRelayAllowed
  1508. /// <summary>
  1509. /// Checks if relay is allowed to specified IP.
  1510. /// </summary>
  1511. /// <param name="ip"></param>
  1512. /// <returns>Returns true if relay is allowed.</returns>
  1513. public bool IsRelayAllowed(string ip)
  1514. {
  1515. switch(m_DB_Type)
  1516. {
  1517. #region DB_Type.XML
  1518. case DB_Type.XML:
  1519. //---------------------------------------------------------//
  1520. // First Check if ip is denied, if not check if is allowed
  1521. using(DataView dv = new DataView(dsSecurity.Tables["Security_List"])){
  1522. dv.RowFilter = "Protocol='SMTP' AND Action='Deny Relay' AND SartIP <= " + ip + " AND EndIP >= " + ip;
  1523. if(dv.Count > 0){
  1524. return false;
  1525. }
  1526. // Check if ip is allowed
  1527. dv.RowFilter = "Protocol='SMTP' AND Action='Allow Relay' AND SartIP <= " + ip + " AND EndIP >= " + ip;
  1528. if(dv.Count > 0){
  1529. return true;
  1530. }
  1531. }
  1532. break;
  1533. #endregion
  1534. #region DB_Type.MSSQL
  1535. case DB_Type.MSSQL:
  1536. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_IsRelayAllowed")){
  1537. sqlCmd.AddParameter("@IP",SqlDbType.BigInt,ip);
  1538. DataSet ds = sqlCmd.Execute();
  1539. ds.Tables[0].TableName = "Detail";
  1540. if(ds.Tables["Detail"].Rows.Count > 0){
  1541. return Convert.ToBoolean(ds.Tables["Detail"].Rows[0]["Allowed"]);
  1542. }
  1543. }
  1544. break;
  1545. #endregion
  1546. }
  1547. return false;
  1548. }
  1549. #endregion
  1550. #region function IsSmtpAccessAllowed
  1551. /// <summary>
  1552. /// Checks if smtp access is allowed for specified IP.
  1553. /// </summary>
  1554. /// <param name="ip"></param>
  1555. /// <returns>Returns true if allowed.</returns>
  1556. public bool IsSmtpAccessAllowed(string ip)
  1557. {
  1558. switch(m_DB_Type)
  1559. {
  1560. #region DB_Type.XML
  1561. case DB_Type.XML:
  1562. using(DataView dv = new DataView(dsSecurity.Tables["Security_List"])){
  1563. //---------------------------------------------------------//
  1564. // First Check if ip is denied, if not check if is allowed
  1565. dv.RowFilter = "Protocol='SMTP' AND Action='Deny' AND SartIP <= " + ip + " AND EndIP >= " + ip;
  1566. if(dv.Count > 0){
  1567. return false;
  1568. }
  1569. // Check if ip is allowed
  1570. dv.RowFilter = "Protocol='SMTP' AND Action='Allow' AND SartIP <= " + ip + " AND EndIP >= " + ip;
  1571. if(dv.Count > 0){
  1572. return true;
  1573. }
  1574. }
  1575. break;
  1576. #endregion
  1577. #region DB_Type.MSSQL
  1578. case DB_Type.MSSQL:
  1579. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_IsSmtpAccessAllowed")){
  1580. sqlCmd.AddParameter("@IP",SqlDbType.BigInt,ip);
  1581. DataSet ds = sqlCmd.Execute();
  1582. ds.Tables[0].TableName = "Detail";
  1583. if(ds.Tables["Detail"].Rows.Count > 0){
  1584. return Convert.ToBoolean(ds.Tables["Detail"].Rows[0]["Allowed"]);
  1585. }
  1586. }
  1587. break;
  1588. #endregion
  1589. }
  1590. return false;
  1591. }
  1592. #endregion
  1593. #region function IsPop3AccessAllowed
  1594. /// <summary>
  1595. /// Checks if pop3 access is allowed for specified IP.
  1596. /// </summary>
  1597. /// <param name="ip"></param>
  1598. /// <returns>Returns true if allowed.</returns>
  1599. public bool IsPop3AccessAllowed(string ip)
  1600. {
  1601. switch(m_DB_Type)
  1602. {
  1603. #region DB_Type.XML
  1604. case DB_Type.XML:
  1605. using(DataView dv = new DataView(dsSecurity.Tables["Security_List"])){
  1606. //---------------------------------------------------------//
  1607. // First Check if ip is denied, if not check if is allowed
  1608. dv.RowFilter = "Protocol='POP3' AND Action='Deny' AND SartIP <= " + ip + " AND EndIP >= " + ip;
  1609. if(dv.Count > 0){
  1610. return false;
  1611. }
  1612. // Check if ip is allowed
  1613. dv.RowFilter = "Protocol='POP3' AND Action='Allow' AND SartIP <= " + ip + " AND EndIP >= " + ip;
  1614. if(dv.Count > 0){
  1615. return true;
  1616. }
  1617. }
  1618. break;
  1619. #endregion
  1620. #region DB_Type.MSSQL
  1621. case DB_Type.MSSQL:
  1622. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_IsPop3AccessAllowed")){
  1623. sqlCmd.AddParameter("@IP",SqlDbType.BigInt,ip);
  1624. DataSet ds = sqlCmd.Execute();
  1625. ds.Tables[0].TableName = "Detail";
  1626. if(ds.Tables["Detail"].Rows.Count > 0){
  1627. return Convert.ToBoolean(ds.Tables["Detail"].Rows[0]["Allowed"]);
  1628. }
  1629. }
  1630. break;
  1631. #endregion
  1632. }
  1633. return false;
  1634. }
  1635. #endregion
  1636. #endregion
  1637. #region BackUp related
  1638. #region function CreateBackUp
  1639. /// <summary>
  1640. /// Backups all server.(settings,users,...).
  1641. /// </summary>
  1642. /// <param name="fileName">File name to which store backup.</param>
  1643. /// <param name="dsSettings"></param>
  1644. public void CreateBackUp(string fileName,DataSet dsSettings)
  1645. {
  1646. DataSet dsAll = new DataSet();
  1647. switch(m_DB_Type)
  1648. {
  1649. #region DB_Type.XML
  1650. case DB_Type.XML:
  1651. dsAll.Merge(dsDomains);
  1652. dsAll.Merge(dsUsers);
  1653. dsAll.Merge(dsAliases);
  1654. dsAll.Merge(dsRouting);
  1655. dsAll.Merge(dsSettings);
  1656. dsAll.Merge(dsSecurity);
  1657. break;
  1658. #endregion
  1659. #region DB_Type.MSSQL
  1660. case DB_Type.MSSQL:
  1661. dsAll.Merge(this.GetDomainList().Table);
  1662. dsAll.Merge(this.GetUserList("").Table);
  1663. dsAll.Merge(this.GetAliasesList("").Table);
  1664. dsAll.Merge(this.GetRouteList().Table);
  1665. dsAll.Merge(dsSettings);
  1666. dsAll.Merge(this.GetSecurityList().Table);
  1667. break;
  1668. #endregion
  1669. }
  1670. dsAll.WriteXml(fileName,XmlWriteMode.IgnoreSchema);
  1671. }
  1672. #endregion
  1673. #region function RestoreBackUp
  1674. /// <summary>
  1675. /// Restores server from backup.(settings,users,...).
  1676. /// </summary>
  1677. /// <param name="fileName">File name from which to restore settings.</param>
  1678. public void RestoreBackUp(string fileName)
  1679. {
  1680. DataSet dsAll = new DataSet();
  1681. dsAll.ReadXml(fileName);
  1682. DB_Type dbType = (DB_Type)Enum.Parse(typeof(DB_Type),dsAll.Tables["Settings"].Rows[0]["DataBaseType"].ToString());
  1683. switch(dbType)
  1684. {
  1685. #region DB_Type.XML
  1686. case DB_Type.XML:
  1687. if(dsAll.Tables.Contains("Domains")){
  1688. DataSet dsX = new DataSet();
  1689. dsX.Merge(dsAll.Tables["Domains"]);
  1690. dsX.WriteXml(m_DataPath + "Domains.xml",XmlWriteMode.IgnoreSchema);
  1691. }
  1692. if(dsAll.Tables.Contains("Users")){
  1693. DataSet dsX = new DataSet();
  1694. dsX.Merge(dsAll.Tables["Users"]);
  1695. dsX.WriteXml(m_DataPath + "Users.xml",XmlWriteMode.IgnoreSchema);
  1696. }
  1697. if(dsAll.Tables.Contains("Aliases")){
  1698. DataSet dsX = new DataSet();
  1699. dsX.Merge(dsAll.Tables["Aliases"]);
  1700. dsX.WriteXml(m_DataPath + "Aliases.xml",XmlWriteMode.IgnoreSchema);
  1701. }
  1702. if(dsAll.Tables.Contains("Routing")){
  1703. DataSet dsX = new DataSet();
  1704. dsX.Merge(dsAll.Tables["Routing"]);
  1705. dsX.WriteXml(m_DataPath + "Routing.xml",XmlWriteMode.IgnoreSchema);
  1706. }
  1707. if(dsAll.Tables.Contains("Settings")){
  1708. DataSet dsX = new DataSet();
  1709. dsX.Merge(dsAll.Tables["Settings"]);
  1710. dsX.WriteXml(m_DataPath + "Settings.xml",XmlWriteMode.IgnoreSchema);
  1711. }
  1712. if(dsAll.Tables.Contains("Security_List")){
  1713. DataSet dsX = new DataSet();
  1714. dsX.Merge(dsAll.Tables["Security_List"]);
  1715. dsX.WriteXml(m_DataPath + "Security.xml",XmlWriteMode.IgnoreSchema);
  1716. }
  1717. break;
  1718. #endregion
  1719. #region DB_Type.MSSQL
  1720. case DB_Type.MSSQL:
  1721. #region Clear old settings
  1722. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_TruncateSettings")){
  1723. DataSet ds = sqlCmd.Execute();
  1724. }
  1725. #endregion
  1726. #region Restore domains
  1727. if(dsAll.Tables.Contains("Domains"))
  1728. {
  1729. foreach(DataRow dr in dsAll.Tables["Domains"].Rows){
  1730. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddDomain")){
  1731. if(dr.Table.Columns.Contains("DomainName")){
  1732. sqlCmd.AddParameter("@DomainName" ,SqlDbType.NVarChar,dr["DomainName"].ToString());
  1733. }
  1734. if(dr.Table.Columns.Contains("Description")){
  1735. sqlCmd.AddParameter("@Description",SqlDbType.NVarChar,dr["Description"].ToString());
  1736. }
  1737. if(dr.Table.Columns.Contains("DomainID")){
  1738. sqlCmd.AddParameter("@DomainID"   ,SqlDbType.NVarChar,dr["DomainID"].ToString());
  1739. }
  1740. DataSet ds = sqlCmd.Execute();
  1741. }
  1742. }
  1743. }
  1744. #endregion
  1745. #region Restore users
  1746. if(dsAll.Tables.Contains("Users")){
  1747. foreach(DataRow dr in dsAll.Tables["Users"].Rows){
  1748. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddUser")){
  1749. if(dr.Table.Columns.Contains("FULLNAME")){
  1750. sqlCmd.AddParameter("@FullName"    ,SqlDbType.NVarChar,dr["FULLNAME"].ToString());
  1751. }
  1752. if(dr.Table.Columns.Contains("USERNAME")){
  1753. sqlCmd.AddParameter("@UserName"    ,SqlDbType.NVarChar,dr["USERNAME"].ToString());
  1754. }
  1755. if(dr.Table.Columns.Contains("PASSWORD")){
  1756. sqlCmd.AddParameter("@Password"    ,SqlDbType.NVarChar,dr["PASSWORD"].ToString());
  1757. }
  1758. if(dr.Table.Columns.Contains("Description")){
  1759. sqlCmd.AddParameter("@Description" ,SqlDbType.NVarChar,dr["Description"].ToString());
  1760. }
  1761. if(dr.Table.Columns.Contains("Emails")){
  1762. sqlCmd.AddParameter("@Emails"      ,SqlDbType.NVarChar,dr["Emails"].ToString());
  1763. }
  1764. if(dr.Table.Columns.Contains("Mailbox_Size")){
  1765. sqlCmd.AddParameter("@MailboxSize" ,SqlDbType.NVarChar,dr["Mailbox_Size"].ToString());
  1766. }
  1767. if(dr.Table.Columns.Contains("DomainID")){
  1768. sqlCmd.AddParameter("@DomainID"    ,SqlDbType.NVarChar,dr["DomainID"].ToString());
  1769. }
  1770. if(dr.Table.Columns.Contains("UserID")){
  1771. sqlCmd.AddParameter("@UserID"      ,SqlDbType.NVarChar,dr["UserID"].ToString());
  1772. }
  1773. DataSet ds = sqlCmd.Execute();
  1774. }
  1775. }
  1776. }
  1777. #endregion
  1778. #region Restore aliases
  1779. if(dsAll.Tables.Contains("Aliases")){
  1780. foreach(DataRow dr in dsAll.Tables["Aliases"].Rows){
  1781. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddAlias")){
  1782. if(dr.Table.Columns.Contains("AliasName")){
  1783. sqlCmd.AddParameter("@AliasName"   ,SqlDbType.NVarChar,dr["AliasName"].ToString());
  1784. }
  1785. if(dr.Table.Columns.Contains("Description")){
  1786. sqlCmd.AddParameter("@Description" ,SqlDbType.NVarChar,dr["Description"].ToString());
  1787. }
  1788. if(dr.Table.Columns.Contains("AliasMembers")){
  1789. sqlCmd.AddParameter("@Members"     ,SqlDbType.NVarChar,dr["AliasMembers"].ToString());
  1790. }
  1791. if(dr.Table.Columns.Contains("DomainID")){
  1792. sqlCmd.AddParameter("@DomainID"    ,SqlDbType.UniqueIdentifier,dr["DomainID"].ToString());
  1793. }
  1794. if(dr.Table.Columns.Contains("AliasID")){
  1795. sqlCmd.AddParameter("@AliasID"    ,SqlDbType.UniqueIdentifier,dr["AliasID"].ToString());
  1796. }
  1797. DataSet ds = sqlCmd.Execute();
  1798. }
  1799. }
  1800. }
  1801. #endregion
  1802. #region Restore routing
  1803. if(dsAll.Tables.Contains("Routing")){
  1804. foreach(DataRow dr in dsAll.Tables["Routing"].Rows){
  1805. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddRoute")){
  1806. if(dr.Table.Columns.Contains("Pattern")){
  1807. sqlCmd.AddParameter("@Pattern"   ,SqlDbType.NVarChar,dr["Pattern"].ToString());
  1808. }
  1809. if(dr.Table.Columns.Contains("Mailbox")){
  1810. sqlCmd.AddParameter("@Mailbox" ,SqlDbType.NVarChar,dr["Mailbox"].ToString());
  1811. }
  1812. if(dr.Table.Columns.Contains("Description")){
  1813. sqlCmd.AddParameter("@Description"     ,SqlDbType.NVarChar,dr["Description"].ToString());
  1814. }
  1815. if(dr.Table.Columns.Contains("DomainID")){
  1816. sqlCmd.AddParameter("@DomainID"    ,SqlDbType.UniqueIdentifier,dr["DomainID"].ToString());
  1817. }
  1818. if(dr.Table.Columns.Contains("AliasID")){
  1819. sqlCmd.AddParameter("@RouteID"    ,SqlDbType.UniqueIdentifier,dr["RouteID"].ToString());
  1820. }
  1821. DataSet ds = sqlCmd.Execute();
  1822. }
  1823. }
  1824. }
  1825. #endregion
  1826. #region Restore settings
  1827. if(dsAll.Tables.Contains("Settings")){
  1828. DataSet dsX = new DataSet();
  1829. dsX.Merge(dsAll.Tables["Settings"]);
  1830. dsX.WriteXml(m_DataPath + "Settings.xml",XmlWriteMode.IgnoreSchema);
  1831. }
  1832. #endregion
  1833. #region Restore security
  1834. if(dsAll.Tables.Contains("Security_List"))
  1835. {
  1836. foreach(DataRow dr in dsAll.Tables["Security_List"].Rows){
  1837. using(WSqlCommand sqlCmd = new WSqlCommand(m_ConStr,"lspr_AddSecurityEntry")){
  1838. if(dr.Table.Columns.Contains("Description")){
  1839. sqlCmd.AddParameter("@Description" ,SqlDbType.NVarChar,dr["Description"].ToString());
  1840. }
  1841. if(dr.Table.Columns.Contains("Protocol")){
  1842. sqlCmd.AddParameter("@Protocol"    ,SqlDbType.NVarChar,dr["Protocol"].ToString());
  1843. }
  1844. if(dr.Table.Columns.Contains("Type")){
  1845. sqlCmd.AddParameter("@Type"        ,SqlDbType.NVarChar,dr["Type"].ToString());
  1846. }
  1847. if(dr.Table.Columns.Contains("Action")){
  1848. sqlCmd.AddParameter("@Action"      ,SqlDbType.NVarChar,dr["Action"].ToString());
  1849. }
  1850. if(dr.Table.Columns.Contains("Content")){
  1851. sqlCmd.AddParameter("@Content"     ,SqlDbType.NVarChar,dr["Content"].ToString());
  1852. }
  1853. if(dr.Table.Columns.Contains("StartIP")){
  1854. sqlCmd.AddParameter("@StartIP"     ,SqlDbType.NVarChar,dr["StartIP"].ToString());
  1855. }
  1856. if(dr.Table.Columns.Contains("EndIP")){
  1857. sqlCmd.AddParameter("@EndIP"       ,SqlDbType.NVarChar,dr["EndIP"].ToString());
  1858. }
  1859. if(dr.Table.Columns.Contains("SecurityID")){
  1860. sqlCmd.AddParameter("@SecurityID"  ,SqlDbType.NVarChar,dr["SecurityID"].ToString());
  1861. }
  1862. DataSet ds = sqlCmd.Execute();
  1863. }
  1864. }
  1865. }
  1866. #endregion
  1867. break;
  1868. #endregion
  1869. }
  1870. }
  1871. #endregion
  1872. #endregion
  1873. #region DB_Type.Xml helpers
  1874. #region Load stuff
  1875. /// <summary>
  1876. /// 
  1877. /// </summary>
  1878. public void LoadUsers()
  1879. {
  1880. dsUsers.Clear();
  1881. dsUsers.ReadXml(m_DataPath + "Users.xml");
  1882. }
  1883. /// <summary>
  1884. /// 
  1885. /// </summary>
  1886. public void LoadAliases()
  1887. {
  1888. dsAliases.Clear();
  1889. dsAliases.ReadXml(m_DataPath + "Aliases.xml");
  1890. }
  1891. /// <summary>
  1892. /// 
  1893. /// </summary>
  1894. public void LoadRouting()
  1895. {
  1896. dsRouting.Clear();
  1897. dsRouting.ReadXml(m_DataPath + "Routing.xml");
  1898. }
  1899. /// <summary>
  1900. /// 
  1901. /// </summary>
  1902. public void LoadDomains()
  1903. {
  1904. dsDomains.Clear();
  1905. dsDomains.ReadXml(m_DataPath + "Domains.xml");
  1906. }
  1907. /// <summary>
  1908. /// 
  1909. /// </summary>
  1910. public void LoadSecurity()
  1911. {
  1912. dsSecurity.Clear();
  1913. dsSecurity.ReadXml(m_DataPath + "Security.xml");
  1914. }
  1915. #endregion
  1916. #region Schema stuff
  1917. #region function CreateDomainsSchema
  1918. private void CreateDomainsSchema(DataSet ds)
  1919. {
  1920. // If table is missing, add it
  1921. if(!ds.Tables.Contains("Domains")){
  1922. ds.Tables.Add("Domains");
  1923. }
  1924. // If DomainName column is missing, add it
  1925. if(!ds.Tables["Domains"].Columns.Contains("DomainID")){
  1926. ds.Tables["Domains"].Columns.Add("DomainID",Type.GetType("System.String"));
  1927. }
  1928. // If DomainName column is missing, add it
  1929. if(!ds.Tables["Domains"].Columns.Contains("DomainName")){
  1930. ds.Tables["Domains"].Columns.Add("DomainName",Type.GetType("System.String"));
  1931. }
  1932. // If Description column is missing, add it
  1933. if(!ds.Tables["Domains"].Columns.Contains("Description")){
  1934. ds.Tables["Domains"].Columns.Add("Description",Type.GetType("System.String"));
  1935. }
  1936. }
  1937. #endregion
  1938. #region function CreateUsersSchema
  1939. private void CreateUsersSchema(DataSet ds)
  1940. {
  1941. // If table is missing, add it
  1942. if(!ds.Tables.Contains("Users")){
  1943. ds.Tables.Add("Users");
  1944. }
  1945. // If UserID column is missing, add it
  1946. if(!ds.Tables["Users"].Columns.Contains("UserID")){
  1947. ds.Tables["Users"].Columns.Add("UserID",Type.GetType("System.String"));
  1948. }
  1949. // If DomainID column is missing, add it
  1950. if(!ds.Tables["Users"].Columns.Contains("DomainID")){
  1951. ds.Tables["Users"].Columns.Add("DomainID",Type.GetType("System.String"));
  1952. }
  1953. // If FullName column is missing, add it
  1954. if(!ds.Tables["Users"].Columns.Contains("FullName")){
  1955. ds.Tables["Users"].Columns.Add("FullName",Type.GetType("System.String"));
  1956. }
  1957. // If USERNAME column is missing, add it
  1958. if(!ds.Tables["Users"].Columns.Contains("UserName")){
  1959. ds.Tables["Users"].Columns.Add("UserName",Type.GetType("System.String"));
  1960. }
  1961. // If Description column is missing, add it
  1962. if(!ds.Tables["Users"].Columns.Contains("Password")){
  1963. ds.Tables["Users"].Columns.Add("Password",Type.GetType("System.String"));
  1964. }
  1965. // If Description column is missing, add it
  1966. if(!ds.Tables["Users"].Columns.Contains("Description")){
  1967. ds.Tables["Users"].Columns.Add("Description",Type.GetType("System.String"));
  1968. }
  1969. // If Emails column is missing, add it
  1970. if(!ds.Tables["Users"].Columns.Contains("Emails")){
  1971. ds.Tables["Users"].Columns.Add("Emails",Type.GetType("System.String"));
  1972. }
  1973. // If DomainName column is missing, add it
  1974. if(!ds.Tables["Users"].Columns.Contains("DomainName")){
  1975. ds.Tables["Users"].Columns.Add("DomainName",Type.GetType("System.String"));
  1976. }
  1977. // If DomainName column is missing, add it
  1978. if(!ds.Tables["Users"].Columns.Contains("Mailbox_Size")){
  1979. ds.Tables["Users"].Columns.Add("Mailbox_Size",Type.GetType("System.Int32"));
  1980. }
  1981. }
  1982. #endregion
  1983. #region function CreateAliasesSchema
  1984. private void CreateAliasesSchema(DataSet ds)
  1985. {
  1986. // If table is missing, add it
  1987. if(!ds.Tables.Contains("Aliases")){
  1988. ds.Tables.Add("Aliases");
  1989. }
  1990. // If AliasID column is missing, add it
  1991. if(!ds.Tables["Aliases"].Columns.Contains("AliasID")){
  1992. ds.Tables["Aliases"].Columns.Add("AliasID",Type.GetType("System.String"));
  1993. }
  1994. // If DomainID column is missing, add it
  1995. if(!ds.Tables["Aliases"].Columns.Contains("DomainID")){
  1996. ds.Tables["Aliases"].Columns.Add("DomainID",Type.GetType("System.String"));
  1997. }
  1998. // If AliasName column is missing, add it
  1999. if(!ds.Tables["Aliases"].Columns.Contains("AliasName")){
  2000. ds.Tables["Aliases"].Columns.Add("AliasName",Type.GetType("System.String"));
  2001. }
  2002. // If Description column is missing, add it
  2003. if(!ds.Tables["Aliases"].Columns.Contains("Description")){
  2004. ds.Tables["Aliases"].Columns.Add("Description",Type.GetType("System.String"));
  2005. }
  2006. // If AliasMembers column is missing, add it
  2007. if(!ds.Tables["Aliases"].Columns.Contains("AliasMembers")){
  2008. ds.Tables["Aliases"].Columns.Add("AliasMembers",Type.GetType("System.String"));
  2009. }
  2010. }
  2011. #endregion
  2012. #region function CreateRoutingsSchema
  2013. private void CreateRoutingsSchema(DataSet ds)
  2014. {
  2015. // If table is missing, add it
  2016. if(!ds.Tables.Contains("Routing")){
  2017. ds.Tables.Add("Routing");
  2018. }
  2019. // If DomainID column is missing, add it
  2020. if(!ds.Tables["Routing"].Columns.Contains("DomainID")){
  2021. ds.Tables["Routing"].Columns.Add("DomainID",Type.GetType("System.String"));
  2022. }
  2023. // If DomainID column is missing, add it
  2024. if(!ds.Tables["Routing"].Columns.Contains("DomainName")){
  2025. ds.Tables["Routing"].Columns.Add("DomainName",Type.GetType("System.String"));
  2026. }
  2027. // If RouteID column is missing, add it
  2028. if(!ds.Tables["Routing"].Columns.Contains("RouteID")){
  2029. ds.Tables["Routing"].Columns.Add("RouteID",Type.GetType("System.String"));
  2030. }
  2031. // If Pattern column is missing, add it
  2032. if(!ds.Tables["Routing"].Columns.Contains("Pattern")){
  2033. ds.Tables["Routing"].Columns.Add("Pattern",Type.GetType("System.String"));
  2034. }
  2035. // If Mailbox column is missing, add it
  2036. if(!ds.Tables["Routing"].Columns.Contains("Mailbox")){
  2037. ds.Tables["Routing"].Columns.Add("Mailbox",Type.GetType("System.String"));
  2038. }
  2039. // If Description column is missing, add it
  2040. if(!ds.Tables["Routing"].Columns.Contains("Description")){
  2041. ds.Tables["Routing"].Columns.Add("Description",Type.GetType("System.String"));
  2042. }
  2043. }
  2044. #endregion
  2045. #region function CreateSecuritySchema
  2046. private void CreateSecuritySchema(DataSet ds)
  2047. {
  2048. // If table is missing, add it
  2049. if(!ds.Tables.Contains("Security_List")){
  2050. ds.Tables.Add("Security_List");
  2051. }
  2052. // If SecurityID column is missing, add it
  2053. if(!ds.Tables["Security_List"].Columns.Contains("SecurityID")){
  2054. ds.Tables["Security_List"].Columns.Add("SecurityID",Type.GetType("System.String"));
  2055. }
  2056. // If Description column is missing, add it
  2057. if(!ds.Tables["Security_List"].Columns.Contains("Description")){
  2058. ds.Tables["Security_List"].Columns.Add("Description",Type.GetType("System.String"));
  2059. }
  2060. // If Protocol column is missing, add it
  2061. if(!ds.Tables["Security_List"].Columns.Contains("Protocol")){
  2062. ds.Tables["Security_List"].Columns.Add("Protocol",Type.GetType("System.String"));
  2063. }
  2064. // If Type column is missing, add it
  2065. if(!ds.Tables["Security_List"].Columns.Contains("Type")){
  2066. ds.Tables["Security_List"].Columns.Add("Type",Type.GetType("System.String"));
  2067. }
  2068. // If Action column is missing, add it
  2069. if(!ds.Tables["Security_List"].Columns.Contains("Action")){
  2070. ds.Tables["Security_List"].Columns.Add("Action",Type.GetType("System.String"));
  2071. }
  2072. // If Content column is missing, add it
  2073. if(!ds.Tables["Security_List"].Columns.Contains("Content")){
  2074. ds.Tables["Security_List"].Columns.Add("Content",Type.GetType("System.String"));
  2075. }
  2076. // If SartIP column is missing, add it
  2077. if(!ds.Tables["Security_List"].Columns.Contains("SartIP")){
  2078. ds.Tables["Security_List"].Columns.Add("SartIP",Type.GetType("System.String"));
  2079. }
  2080. // If EndIP column is missing, add it
  2081. if(!ds.Tables["Security_List"].Columns.Contains("EndIP")){
  2082. ds.Tables["Security_List"].Columns.Add("EndIP",Type.GetType("System.String"));
  2083. }
  2084. }
  2085. #endregion
  2086. #endregion
  2087. #endregion
  2088. #region Helpers
  2089. #region function GetTopLines
  2090. private byte[] GetTopLines(Stream strm,int nrLines)
  2091. {
  2092. TextReader reader = (TextReader)new StreamReader(strm);
  2093. int  lCounter = 0;
  2094. int  msgLine  = -1;
  2095. bool msgLines = false;
  2096. StringBuilder strBuilder = new StringBuilder();
  2097. while(true){
  2098. string line = reader.ReadLine();
  2099. // Reached end of message
  2100. if(line == null){
  2101. break;
  2102. }
  2103. else{
  2104. // End of header reached
  2105. if(!msgLines && line.Length == 0){
  2106. // Set flag, that message lines reading start.
  2107. msgLines = true;
  2108. }
  2109. // Check that wanted message lines count isn't exceeded
  2110. if(msgLines){
  2111. if(msgLine > nrLines){
  2112. break;
  2113. }
  2114. msgLine++;
  2115. }
  2116. strBuilder.Append(line + "rn");
  2117. }
  2118. // Don't allow read more than 150 lines
  2119. if(lCounter > 150){
  2120. break;
  2121. }
  2122. lCounter++;
  2123. }
  2124. return System.Text.Encoding.ASCII.GetBytes(strBuilder.ToString());
  2125. }
  2126. #endregion
  2127. #endregion
  2128. #region static function IsConnection
  2129. /// <summary>
  2130. /// Checks if database connection is ok.
  2131. /// </summary>
  2132. /// <param name="dataPath"></param>
  2133. /// <param name="conStr"></param>
  2134. /// <param name="dbType"></param>
  2135. /// <returns></returns>
  2136. public static bool IsConnection(string dataPath,string conStr,DB_Type dbType)
  2137. {
  2138. try
  2139. {
  2140. switch(dbType)
  2141. {
  2142. case DB_Type.XML:
  2143. return Directory.Exists(dataPath);
  2144. case DB_Type.MSSQL:
  2145. using(WSqlCommand sqlCmd = new WSqlCommand(conStr,"lspr_CheckConnection")){
  2146. sqlCmd.Execute();
  2147. }
  2148. return true;
  2149. }
  2150. }
  2151. catch{
  2152. }
  2153. return false;
  2154. }
  2155. #endregion
  2156. }
  2157. }