Exemple #1
0
        static void Main(string[] args)
        {
            // Take all the arguments and parse them into Flags class
            Flags flags = new Flags();

            flags.Parse(args);

            string certPath = "/opt/helvegr/certs/";

            try {
                string isInteractive;

                int port;

                // Check if the port is a valid integer
                if (!int.TryParse(flags.arguments["Port"], out port))
                {
                    Console.WriteLine("--port must be a valid integer");
                    flags.ShowHelpMessage(flags.command, 1);
                }

                // If smtp are set && --interactive are not set, else if check if hpop are set
                if (flags.command == "smtp" && !flags.arguments.TryGetValue("--interactive", out isInteractive))
                {
                    // Create an instance of SMTP client and send the email
                    SMTPClient smtp = new SMTPClient(flags, port, certPath, QueryType.MX);
                    // Start the client
                    smtp.Start();
                }
                else if (flags.command == "hpop" && !flags.arguments.TryGetValue("--interactive", out isInteractive))
                {
                    string username = flags.arguments["Username"];

                    // Regex email address
                    var   regex = "(?:[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+\\/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";
                    Match match = Regex.Match(username, regex, RegexOptions.IgnoreCase);

                    // if regex match is successful
                    if (!match.Success)
                    {
                        Console.WriteLine("--username must be a valid email address");
                        flags.ShowHelpMessage(flags.command, 1);
                    }

                    // Start hpop server
                    POPClient hpop = new POPClient(flags, port, certPath, QueryType.MX);
                    hpop.Start();
                }
                else if (flags.arguments.TryGetValue("--interactive", out isInteractive))
                {
                    // INTERACTIVE MODE, ONLY FOR SHOWCASING THE PROTOCOLS AND MAIL SERVER... ;))))))))

                    Console.Write("Enter hostname: ");
                    flags.arguments.Add("Username", "noone@" + Console.ReadLine());

                    Console.Write("Enter port number: ");
                    if (!int.TryParse(Console.ReadLine(), out port))
                    {
                        Console.WriteLine("Port number is not a valid integer");
                        Environment.Exit(1);
                    }

                    if (flags.command == "smtp")
                    {
                        flags.arguments.Add("To", flags.arguments["Username"]);
                        flags.arguments.Add("From", "-1");
                        flags.arguments.Add("Subject", "-1");

                        // Create an instance of SMTP client and send the email
                        SMTPClient smtp = new SMTPClient(flags, port, certPath, QueryType.MX);
                        // Start the client
                        smtp.Start();
                    }
                    else if (flags.command == "hpop")
                    {
                        POPClient hpop = new POPClient(flags, port, certPath, QueryType.MX);

                        hpop.Start();
                    }
                }
            } catch (Exception ex) {
                Console.WriteLine(ex);
            }
        }
Exemple #2
0
        protected override void StartClient(SslStream stream)
        {
            string isInteractive;

            // Check if --interactive are set
            if (flags.arguments.TryGetValue("--interactive", out isInteractive))
            {
                Interactive(stream);
                stream.Close();
                Environment.Exit(0);
            }

            // Check if start message is sent
            if (!StreamRead(stream).Contains("+OK HPOP"))
            {
                Console.WriteLine("Missing server greeting");
                Environment.Exit(1);
            }

            // Authenticate
            StreamWrite(stream, "APOP " + flags.arguments["Username"] + " " + flags.arguments["Password"]);

            // Check if successful
            if (!StreamRead(stream).Contains("+OK maildrop"))
            {
                Console.WriteLine("Authentication failed");
                flags.ShowHelpMessage(flags.command, 1);
            }

            string argumentValue;

            string startIndex, endIndex;

            string memberName;

            string action = "";

            //Find the action operation
            foreach (KeyValuePair <string, Flag> pair in flags.flags)
            {
                memberName = pair.Key.Substring(2, 1).ToUpper() + pair.Key.Substring(3);

                if (pair.Value.isAction && flags.arguments.TryGetValue(memberName, out argumentValue))
                {
                    if (memberName == "List")
                    {
                        if (flags.arguments.TryGetValue("Start", out startIndex))
                        {
                            endIndex = flags.arguments["End"];

                            action = memberName.Substring(0, 4).ToUpper() + " " + argumentValue + " " + startIndex + " " + endIndex;
                            break;
                        }
                        else
                        {
                            action = memberName.Substring(0, 4).ToUpper() + " " + argumentValue;
                            break;
                        }
                    }
                    else
                    {
                        action = memberName.Substring(0, 4).ToUpper() + " " + argumentValue;
                        break;
                    }
                }
            }
            // Execute action operation
            StreamWrite(stream, action);

            // Read response
            string output = StreamRead(stream);

            // Check if error
            if (output.Contains("-ERR"))
            {
                Console.Write(output);
                StreamWrite(stream, "QUIT");
                Environment.Exit(1);
            }

            // Read all lines until +DONE
            while (!output.Contains("+DONE"))
            {
                output += StreamRead(stream);
            }

            Console.Write(output);

            // Quit
            StreamWrite(stream, "QUIT");
        }