コード例 #1
0
ファイル: CheckMail.cs プロジェクト: briancullinan/life.net
        private bool Connect(ImapParams client)
        {
            try
            {
                if (_connected)
                {
                    return(true);
                }

                _connection = new TcpClient(client.Host, client.Port);
                _stream     = _connection.GetStream();
                if (client.Ssl)
                {
                    _stream = new SslStream(
                        _stream,
                        false,
                        client.Validate
                            ? null
                            : new RemoteCertificateValidationCallback((sender, cert, chain, err) => true));
                    ((SslStream)_stream).AuthenticateAsClient(client.Host);
                }

                var response = _stream.ReadLine();
                _connected = response.StartsWith("* OK");
                return(_connected);
            }
            catch (Exception ex)
            {
                Log.Error("There was an error connecting to the mail server.", ex);
                _connected = false;
                return(_connected);
            }
        }
コード例 #2
0
ファイル: CheckMail.cs プロジェクト: briancullinan/life.net
        public override void Execute(object context, ActivityQueue queue, Trigger trigger)
        {
            // get the login information out of the credential store
            int    count;
            IntPtr pCredentials;
            var    ret = AdvApi32.CredEnumerate(null, 0, out count, out pCredentials);

            if (!ret)
            {
                throw new Win32Exception();
            }
            var credentials = new IntPtr[count];

            // convert pointer to array to array of pointers
            for (var n = 0; n < count; n++)
            {
                credentials[n] = Marshal.ReadIntPtr(pCredentials,
                                                    n * Marshal.SizeOf(typeof(IntPtr)));
            }

            var login = credentials
                        // convert each pointer to a structure
                        .Select(ptr => (WinCred.Credential)Marshal.PtrToStructure(ptr, typeof(WinCred.Credential)))
                        // select the structure with the matching credential name
                        .FirstOrDefault(cred => cred.targetName.StartsWith(_credential));

            // get the password
            var currentPass = Marshal.PtrToStringUni(login.credentialBlob, (int)login.credentialBlobSize / 2);
            var lastError   = Marshal.GetLastWin32Error();

            if (lastError != 0)
            {
                throw new Win32Exception(lastError);
            }

            // finally try to log in
            var hostArr = login.targetName.Substring(_credential.Length + 1).Split(':');
            var host    = hostArr[0];
            var port    = hostArr.Length > 1 ? int.Parse(hostArr[1]) : 143;
            var @params = new ImapParams
            {
                Host     = host,
                Username = login.userName,
                Password = currentPass,
                Port     = port,
                Validate = false,
                Ssl      = port == 993 || port == 995,
                Queue    = queue
            };

            // start a thread to check for e-mail
            ThreadPool.QueueUserWorkItem(MailPoller, @params);
        }
コード例 #3
0
ファイル: CheckMail.cs プロジェクト: briancullinan/life.net
        private void InsertMessage(Message message, ImapParams client)
        {
            using (var data = new DatalayerDataContext())
            {
                // check if the message is already added
                if (data.Emails.Any(x => x.Uid == message.Uid && x.Folder == message.Folder))
                {
                    return;
                }

                try
                {
                    // store important information in the database for later searching
                    var newMail = new Email
                    {
                        Body     = message.Body,
                        Folder   = message.Folder,
                        Uid      = message.Uid,
                        Headers  = message.RawHeaders,
                        Host     = client.Username + "@" + client.Host,
                        Raw      = message.Raw,
                        Subject  = message.Subject,
                        To       = string.Join(";", message.To),
                        From     = string.Join(";", message.From),
                        Received = message.Received
                    };
                    data.Emails.InsertOnSubmit(newMail);

                    data.SubmitChanges();
                }
                catch (Exception ex)
                {
                    Log.Error(
                        string.Format("Error caching e-mail {0} {1}", message.Uid,
                                      message.Folder), ex);
                }
            }
        }
コード例 #4
0
ファイル: CheckMail.cs プロジェクト: briancullinan/life.net
        private bool Login(ImapParams client)
        {
            try
            {
                if (_authenticated)
                {
                    return(true);
                }

                var    tag = GetTag();
                string result;

                switch (_method)
                {
                case AuthMethods.CRAMMD5:
                    result = _stream.SendCommand(tag + "AUTHENTICATE CRAM-MD5")
                             .ReadLine();
                    // retrieve server key
                    var key = result.Replace("+ ", "");
                    key = Encoding.Default.GetString(Convert.FromBase64String(key));
                    // calcul hash
                    using (var kMd5 = new HMACMD5(Encoding.ASCII.GetBytes(client.Password)))
                    {
                        var hash1 = kMd5.ComputeHash(Encoding.ASCII.GetBytes(key));
                        key    = BitConverter.ToString(hash1).ToLower().Replace("-", "");
                        result =
                            _stream.SendCommand(
                                Convert.ToBase64String(Encoding.ASCII.GetBytes(client.Username + " " + key)))
                            .ReadLine();
                    }
                    break;

                case AuthMethods.Login:
                    result =
                        _stream.SendCommand(tag + "LOGIN " + client.Username.QuoteString() + " " +
                                            client.Password.QuoteString())
                        .ReadLine();
                    break;

                case AuthMethods.SaslOAuth:
                    result = _stream.SendCommand(tag + "AUTHENTICATE XOAUTH " + client.Password)
                             .ReadLine();
                    break;

                default:
                    throw new NotSupportedException();
                }

                if (result.StartsWith("* CAPABILITY "))
                {
                    _capabilities = result.Substring(13).Trim().Split(' ');
                    result        = _stream.ReadLine();
                }

                if (!result.StartsWith(tag + "OK"))
                {
                    throw new Exception(result);
                }

                _authenticated = true;
                return(_authenticated);
            }
            catch (Exception ex)
            {
                if (ex is IOException)
                {
                    _connected = false;
                }
                Log.Error("There was an error logging in.", ex);
                _authenticated = false;
                return(_authenticated);
            }
        }