예제 #1
0
        private void showLetter()
        {
            try
            {
                // Заполнение полей из заголовка
                StringBuilder from_toStr = new StringBuilder("От " + CurrentData.curLetter.From.Mailboxes.First().Name
                                                             + " <" + CurrentData.curLetter.From.Mailboxes.First().Address + "> для ");
                //заполняем для кого
                foreach (MailboxAddress receiver in CurrentData.curLetter.To)
                {
                    from_toStr.Append(receiver.Name + " <" + receiver.Address + ">, ");
                }
                //удаляем запятую и пробел
                from_toStr.Remove(from_toStr.Length - 2, 2);
                if (CurrentData.curLetter.Cc.Count > 0)
                {
                    from_toStr.Append("; Копии: ");
                    foreach (MailboxAddress receiver in CurrentData.curLetter.Cc)
                    {
                        from_toStr.Append(receiver.Name + " <" + receiver.Address + ">, ");
                    }
                    from_toStr.Remove(from_toStr.Length - 2, 2);
                }
                lbl_send.Content = lbl_send.ToolTip = from_toStr;

                lbl_subj.Content = lbl_subj.ToolTip = CurrentData.curLetter.Subject;
                lbl_date.Content = lbl_date.ToolTip = CurrentData.curLetter.Date;
                string body = CurrentData.curLetter.HtmlBody != null?CurrentData.curLetter.HtmlBody.Trim() : CurrentData.curLetter.TextBody;

                if (CurrentData.curLetter.Headers.Contains(Cryptography.SIGNATURE_ID_HEADER))
                // Если письмо подписано
                {
                    List <CryptoKey> results = CurrentData.curAcc.Keys.Where(k => k.Id.Equals(CurrentData.curLetter.
                                                                                              Headers[Cryptography.SIGNATURE_ID_HEADER])).ToList();
                    if (results.Count > 0)
                    {
                        CryptoKey key = results.First();
                        if (Cryptography.Verify(body, CurrentData.curLetter.Headers[Cryptography.SIGNATURE_HEADER], key))
                        {
                            lbl_ecp.Content = lbl_ecp.ToolTip =
                                "Верифицировано с помощью \"" + key + "\"";
                            if (CurrentData.curLetter.From.Mailboxes.First().Address.Equals(key.OwnerAddress))
                            {
                                lbl_ecp.Foreground = Brushes.Green;
                            }
                            else
                            {
                                lbl_ecp.Content = lbl_ecp.ToolTip +=
                                    " (отправитель не совпадает)";
                                lbl_ecp.Foreground = Brushes.DarkOrange;
                            }
                        }
                        else
                        {
                            lbl_ecp.Content = lbl_ecp.ToolTip =
                                "Подпись распознана с помощью\"" + key +
                                "\", однако целостность письма нарушена";
                            lbl_ecp.Foreground = Brushes.DarkRed;
                        }
                    }
                    else
                    {
                        lbl_ecp.Content = lbl_ecp.ToolTip =
                            "Письмо подписано, но нет подходящего ключа для верификации";
                        lbl_ecp.Foreground = Brushes.Black;
                    }
                }
                else
                {
                    lbl_ecp.Content = lbl_ecp.ToolTip =
                        "Письмо не подписано";
                    lbl_ecp.Foreground = Brushes.Black;
                }

                if (CurrentData.curLetter.Headers.Contains(Cryptography.ENCRYPTION_ID_HEADER))
                // Если письмо зашифровано
                {
                    List <CryptoKey> results = CurrentData.curAcc.Keys.Where(k => k.Id.Equals(CurrentData.curLetter.
                                                                                              Headers[Cryptography.ENCRYPTION_ID_HEADER]) && !k.PublicOnly).ToList();
                    if (results.Count > 0)
                    {
                        CryptoKey key = results.First();
                        // TODO: обработать неудачу
                        body = Cryptography.Decrypt(body, key);

                        lbl_encr.Content = lbl_encr.ToolTip =
                            "Расшифровано с помощью \"" + key + "\"";
                        lbl_encr.Foreground = Brushes.Green;
                    }
                    else
                    {
                        lbl_encr.Content = lbl_encr.ToolTip =
                            "Письмо зашифровано, ключ не найден";
                        lbl_encr.Foreground = Brushes.DarkRed;
                    }
                }
                else
                {
                    lbl_encr.Content = lbl_encr.ToolTip =
                        "Письмо не зашифровано";
                    lbl_encr.Foreground = Brushes.Black;
                }

                // Отображение тела письма
                int index = body.IndexOf("<html>", StringComparison.OrdinalIgnoreCase);
                if (index < 0)
                {
                    body = "<html><meta charset=\"" + Utility.HTML_CHARSET + "\"><body>" + body + "</body></html>";
                }
                else
                {
                    body = body.Insert(index + 6, "<meta charset=\"" + Utility.HTML_CHARSET + "\">");
                }
                // TODO: превратить переносы строк в <br>, если письмо не HTML

                wbBrwsr.NavigateToString(body);

                if (CurrentData.curLetter.Headers.Contains(Cryptography.KEY_DELIVERY_HEADER))
                // Если это письмо - доставка ключа
                {
                    // Получить объект ключа
                    var tempparts = CurrentData.curLetter.HtmlBody.Split('$');

                    dynamic temp = new JavaScriptSerializer().DeserializeObject(tempparts[1]);

                    CurrentData.curKey = new CryptoKey(temp["PublicKey"], temp["PrivateKey"],
                                                       temp["Name"], temp["OwnerAddress"], temp["EncrOrSign"], temp["Id"], (DateTime)temp["DateTime"]);

                    if (CurrentData.curKey != null)
                    {
                        if (Utility.ShowConfirmation("Данное письмо содержит ключ. Вы хотите добавить его в библиотеку ключей?") == MessageBoxResult.Yes)
                        {
                            if (CurrentData.curAcc.AddKey())
                            {
                                CurrentData.curAcc.Srlz();
                                Utility.MsgBox("Ключ успешно добавлен", "Уведомление", this);
                            }
                            else
                            {
                                Utility.MsgBox("Такой ключ уже есть в библиотеке ключей", "Уведомление", this);
                            }
                        }
                    }
                }
                //else
                //// Если это письмо обыкновенное
                //{
                // Отображение прикреплений
                attachPanel.Items.Clear();
                foreach (MimeEntity attachment in CurrentData.curLetter.Attachments)
                {
                    attachPanel.Items.Add(attachment);
                }
                //}
                //replyBtn.IsEnabled = true;
            }
            catch (Exception ex)
            {
                Utility.MsgBox(ex.Message, "Ошибка", this);
            }
        }