diff --git a/MailServer/DataBase/MysqlConnector.cs b/MailServer/DataBase/MysqlConnector.cs index 23f6493..b1b2def 100644 --- a/MailServer/DataBase/MysqlConnector.cs +++ b/MailServer/DataBase/MysqlConnector.cs @@ -41,5 +41,13 @@ namespace MailServer.DataBase MySqlDataReader reader = command.ExecuteReader(); return reader; } + + internal void write(string sql) + { + Console.WriteLine(sql); + MySqlCommand command = connection.CreateCommand(); + command.CommandText = sql; + command.ExecuteNonQuery(); + } } } diff --git a/MailServer/DataBase/MysqlImap.cs b/MailServer/DataBase/MysqlImap.cs index 7dbc784..5909436 100644 --- a/MailServer/DataBase/MysqlImap.cs +++ b/MailServer/DataBase/MysqlImap.cs @@ -1,15 +1,24 @@ using System; using System.Security.Cryptography; using System.Text; -/*using System.Collections.Generic; -using System.Linq; +using System.Collections.Generic; +using System.Text.RegularExpressions; +/*using System.Linq; using System.Text;*/ -using System.Text.RegularExpressions; using MySql.Data.MySqlClient; +using LumiSoft.IMAP.Server; namespace MailServer.DataBase { + public struct IMAP_Message_ret + { + public string id; + public long uid; + public DateTime internalDate; + public long size; + public IMAP_MessageFlags flags; + } class MysqlImap { private MysqlConnector mysql; @@ -27,7 +36,7 @@ namespace MailServer.DataBase return false; } while(reader.Read()) { - if (reader.GetString(0).ToLower() == pass.ToLower()) + if (reader.GetString("pass").ToLower() == pass.ToLower()) { reader.Close(); return true; @@ -48,6 +57,10 @@ namespace MailServer.DataBase return ""; } } + private string escape(int num) + { + return escape(num.ToString()); + } static string getMd5Hash(string input) { @@ -60,5 +73,78 @@ namespace MailServer.DataBase } return sBuilder.ToString(); } + + internal void setSessionID(string p,string p_2) + { + MySqlDataReader reader1 = mysql.read("SELECT `id` FROM `users` WHERE `user` = '"+escape(p_2)+"'"); + int user_id = 0; + if (reader1.HasRows) + { + while (reader1.Read()) + { + user_id = reader1.GetInt32("id"); + } + } + reader1.Close(); + MySqlDataReader reader2 = mysql.read("SELECT `userID` FROM `session` WHERE `userID` = '"+escape(user_id)+"'"); + if (reader2.HasRows) + { + reader2.Close(); + mysql.write("UPDATE `session` SET `sessionID` = '" + escape(p) + "' WHERE `userID` = '" + escape(user_id) + "'"); + } + else + { + reader2.Close(); + mysql.write("INSERT INTO `session` (`sessionID`,`userID`) VALUES ('" + escape(p) + "','" + escape(user_id) + "')"); + } + } + + internal int getUserIdFromSessionId(string p) + { + MySqlDataReader reader = mysql.read("SELECT `userID` FROM `session` WHERE `sessionID` = '" + escape(p) + "'"); + int ret = 0; + while (reader.Read()) + { + ret = reader.GetInt32("userID"); + } + reader.Close(); + return ret; + } + + internal int getFolderId(int user_id, string p) + { + MySqlDataReader reader = mysql.read("SELECT `id` FROM `folder` WHERE `userID` = '" + escape(user_id) + "' AND `name` = '"+escape(p)+"'"); + int ret = 0; + while (reader.Read()) + { + ret = reader.GetInt32("id"); + } + reader.Close(); + return ret; + } + + internal List getMailWithFolderId(int folder_id) + { + List ret = new List(); + + MySqlDataReader reader = mysql.read("SELECT `id`,`messageid`,`date`,`size`,`flags` FROM `mails` WHERE `folder` = '"+escape(folder_id)+"'"); + while (reader.Read()) + { + IMAP_Message_ret mail = new IMAP_Message_ret(); + mail.uid = reader.GetInt32("id"); + mail.id = reader.GetString("messageid"); + mail.internalDate = reader.GetDateTime("date"); + mail.size = reader.GetUInt32("size"); + mail.flags = getFlags(reader.GetInt32("flags")); + ret.Add(mail); + } + reader.Close(); + return ret; + } + + private IMAP_MessageFlags getFlags(int p) + { + return (IMAP_MessageFlags)p; + } } } diff --git a/MailServer/LumiSoft/IMAP/Server/IMAP_SelectedFolder/IMAP_SelectedFolder.cs b/MailServer/LumiSoft/IMAP/Server/IMAP_SelectedFolder/IMAP_SelectedFolder.cs index e45929a..637495e 100644 --- a/MailServer/LumiSoft/IMAP/Server/IMAP_SelectedFolder/IMAP_SelectedFolder.cs +++ b/MailServer/LumiSoft/IMAP/Server/IMAP_SelectedFolder/IMAP_SelectedFolder.cs @@ -127,6 +127,8 @@ namespace LumiSoft.IMAP.Server public IMAP_MessageCollection Messages { get { return m_pMessages; } + ///MYCHANGE 1 + //set { m_pMessages = value; } } /// diff --git a/MailServer/LumiSoft/IMAP/Server/IMAP_Server/IMAP_Server.cs b/MailServer/LumiSoft/IMAP/Server/IMAP_Server/IMAP_Server.cs index e62b1bb..e8f256a 100644 --- a/MailServer/LumiSoft/IMAP/Server/IMAP_Server/IMAP_Server.cs +++ b/MailServer/LumiSoft/IMAP/Server/IMAP_Server/IMAP_Server.cs @@ -2,6 +2,7 @@ using LumiSoft.Misc.Auth; using LumiSoft.Misc; using System.Net; +using System.Security.Cryptography.X509Certificates; namespace LumiSoft.IMAP.Server { @@ -17,9 +18,9 @@ namespace LumiSoft.IMAP.Server /// /// Defalut constructor. /// - public IMAP_Server() : base() + public IMAP_Server(int port, SslMode mode ,X509Certificate2 sslcert) : base() { - this.BindInfo = new IPBindInfo[]{new IPBindInfo("",IPAddress.Any,143,SslMode.None,null)}; + this.BindInfo = new IPBindInfo[]{new IPBindInfo("",IPAddress.Any,port,mode,sslcert)}; } } } diff --git a/MailServer/Program.cs b/MailServer/Program.cs index acb935f..c546f5b 100644 --- a/MailServer/Program.cs +++ b/MailServer/Program.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.ServiceProcess; using System.Text; +using System.Security.Cryptography.X509Certificates; using MailServer.Services; using MailServer.Logger; @@ -22,13 +23,13 @@ namespace MailServer ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { - new IMAP_Service(logger) + new IMAP_Service(logger,false) }; ServiceBase.Run(ServicesToRun); } else if (args.Length == 1 || args[0] == "-r") { - IMAP_Service imap_s = new IMAP_Service(logger); + IMAP_Service imap_s = new IMAP_Service(logger,false); imap_s.Start(args); while (true) { diff --git a/MailServer/Services/IMAP/Server/IMAP_Service.Designer.cs b/MailServer/Services/IMAP/Server/IMAP_Service.Designer.cs index 3bc5e4b..2275a58 100644 --- a/MailServer/Services/IMAP/Server/IMAP_Service.Designer.cs +++ b/MailServer/Services/IMAP/Server/IMAP_Service.Designer.cs @@ -1,4 +1,6 @@ using LumiSoft.IMAP.Server; +using System.Security.Cryptography.X509Certificates; +using LumiSoft.Misc; namespace MailServer.Services { @@ -32,7 +34,15 @@ namespace MailServer.Services { components = new System.ComponentModel.Container(); this.ServiceName = "IMAP_Server"; - this.server = new IMAP_Server(); + if (ssl) + { + X509Certificate2 cert = new X509Certificate2("cert\\server.pfx"); + this.server = new IMAP_Server(993, SslMode.SSL, cert); + } + else + { + this.server = new IMAP_Server(143, SslMode.None, null); + } } #endregion diff --git a/MailServer/Services/IMAP/Server/IMAP_Service.Events.cs b/MailServer/Services/IMAP/Server/IMAP_Service.Events.cs index a493ba1..7217b83 100644 --- a/MailServer/Services/IMAP/Server/IMAP_Service.Events.cs +++ b/MailServer/Services/IMAP/Server/IMAP_Service.Events.cs @@ -7,6 +7,7 @@ using LumiSoft.Misc; using LumiSoft.Misc.SocketServer; using LumiSoft.IMAP.Server; using MailServer.Logger; +using MailServer.DataBase; namespace MailServer.Services { @@ -16,6 +17,8 @@ namespace MailServer.Services { this.logger.add(EventType.Info, "IMAP", "Auth user: " + e.UserName); e.Validated = database.checkUser(e.UserName, e.PasswData); + if(e.Validated) + database.setSessionID(e.Session.SessionID, e.UserName); if (!e.Validated) this.logger.add(EventType.Warning, "IMAP", "Auth User Failed: " + e.UserName); //Console.WriteLine(e.ToString()); @@ -55,21 +58,39 @@ namespace MailServer.Services void server_GetFolders(object sender, IMAP_Folders e) { Console.WriteLine(e.ToString()); + e.Add("Inbox/test", true); + e.Add("Inbox/asd", false); + //e.Folders = new IMAP_Folder[] {new IMAP_Folder("Inbox/test",true),new IMAP_Folder("Inbox/asd",false)}; } void server_GetMessageItems(object sender, IMAP_eArgs_MessageItems e) { Console.WriteLine(e.ToString()); + //a003 } void server_GetMessagesInfo(object sender, IMAP_eArgs_GetMessagesInfo e) { Console.WriteLine(e.ToString()); + int user_id = database.getUserIdFromSessionId(e.Session.SessionID); + int folder_id = database.getFolderId(user_id, e.FolderInfo.Folder); + if (folder_id == 0) + e.ErrorText = "Folder not Exist"; + else + { + List mails = database.getMailWithFolderId(folder_id); + foreach (IMAP_Message_ret mail in mails) + { + e.FolderInfo.Messages.Add(mail.id, mail.uid, mail.internalDate, mail.size, mail.flags); + } + e.FolderInfo.FolderUID = folder_id; + } } void server_GetSharedRootFolders(object sender, SharedRootFolders_EventArgs e) { Console.WriteLine(e.ToString()); + e.PublicRootFolders = new string[] { "Inbox" }; } void server_GetSubscribedFolders(object sender, IMAP_Folders e) @@ -130,7 +151,7 @@ namespace MailServer.Services void server_ValidateIPAddress(object sender, ValidateIP_EventArgs e) { - logger.add(EventType.Info, "IMAP", "ValidateIP: " + e.ConnectedIP); + logger.add(EventType.Info, "IMAP", "ValidateIP: " + e.ConnectedIP + " " + e.SessionTag); //Console.WriteLine(e.ToString()); } } diff --git a/MailServer/Services/IMAP/Server/IMAP_Service.cs b/MailServer/Services/IMAP/Server/IMAP_Service.cs index ad42553..14b04d6 100644 --- a/MailServer/Services/IMAP/Server/IMAP_Service.cs +++ b/MailServer/Services/IMAP/Server/IMAP_Service.cs @@ -18,10 +18,12 @@ namespace MailServer.Services private IMAP_Server server; private MysqlImap database; private EventLogger logger; + private bool ssl; - public IMAP_Service(EventLogger log) + public IMAP_Service(EventLogger log, bool usessl) { this.logger = log; + this.ssl = usessl; InitializeComponent(); database = new MysqlImap(); putEvents();