Exemplo n.º 1
0
        private static async Task ProcessChallengeAsync(ImapEnvelope envelope, ImapMailbox mailbox)
        {
            var bytes = await mailbox.FetchMessageBodyAsync(envelope.Uid);

            var message = new MailMessageReader(bytes);

            var token     = string.Empty;
            var nonce     = string.Empty;
            var publicKey = string.Empty;

            const string pattern = @"\s|\t|\n|\r";

            var xHeaders = message.Headers.UnknownHeaders;

            for (var i = 0; i < xHeaders.Keys.Count; i++)
            {
                var key = xHeaders.Keys[i];

                var values = xHeaders.GetValues(i);
                if (values == null)
                {
                    throw new NullReferenceException(Resources.ChallengeCorruptException);
                }

                if (string.Compare(key, ParanoiaHeaderKeys.Token, StringComparison.InvariantCultureIgnoreCase) == 0)
                {
                    token = values.FirstOrDefault() ?? string.Empty;
                    token = Regex.Replace(token, pattern, string.Empty);
                    continue;
                }

                if (string.Compare(key, ParanoiaHeaderKeys.Nonce, StringComparison.InvariantCultureIgnoreCase) == 0)
                {
                    nonce = values.FirstOrDefault() ?? string.Empty;
                    nonce = Regex.Replace(nonce, pattern, string.Empty);
                    continue;
                }

                if (string.Compare(key, ParanoiaHeaderKeys.PublicKey, StringComparison.InvariantCultureIgnoreCase) == 0)
                {
                    publicKey = values.FirstOrDefault() ?? string.Empty;
                    publicKey = Regex.Replace(publicKey, pattern, string.Empty);
                }
            }

            if (string.IsNullOrEmpty(token) || string.IsNullOrEmpty(nonce) || string.IsNullOrEmpty(publicKey))
            {
                throw new InvalidDataException(Resources.ChallengeCorruptException);
            }


            var data = App.Context.KeyContainer.DecryptWithPrivateKey(
                Convert.FromBase64String(token),
                Convert.FromBase64String(publicKey),
                Convert.FromBase64String(nonce));

            await RespondToChallengeAsync(Encoding.UTF8.GetString(data));
        }
Exemplo n.º 2
0
 public static MailMessageModel ToMailMessage(this ImapEnvelope envelope, MailType type)
 {
     return(new MailMessageModel {
         EntryDate = envelope.InternalDate.HasValue
             ? envelope.InternalDate.Value
             : DateTime.Now,
         Subject = envelope.Subject,
         Flags = string.Join(";", envelope.Flags),
         Size = envelope.Size,
         Uid = envelope.Uid,
         MessageId = envelope.MessageId,
         FromAddress = envelope.From.Any()
             ? envelope.From.First().Address
             : string.Empty,
         FromName = envelope.From.Any()
             ? envelope.From.First().DisplayName
             : string.Empty,
         Type = type
     });
 }