예제 #1
0
 private void LogoutImpl()
 {
     ClearGlobalClient();
     this.IsLogined         = false;
     this.encryptedPassword = null;
     InboxList.Clear();
     System.Diagnostics.Debug.WriteLine("Logout invoke");
 }
예제 #2
0
        private async Task DeserializeInboxMails(int mailCount)
        {
            var index  = 1;
            var emails = await PhantasmaService.GetAllInboxMessages(mailCount);

            try
            {
                //deserialization
                foreach (var email in emails)
                {
                    if (email.StartsWith("{") || email.StartsWith("["))
                    {
                        var mailObject =
                            JsonConvert.DeserializeObject <Message>(email, AppSettings.JsonSettings());
                        if (mailObject?.TextContent != null)
                        {
                            if (MessageUtils.IsHex(mailObject.TextContent.ToCharArray()))
                            {
                                var encryptedText = mailObject.TextContent.HexToBytes();
                                var remotePub     = await PhantasmaService.GetMailboxPublicKey(mailObject.FromInbox);

                                var decryptedText = EncryptionUtils.Decrypt(encryptedText,
                                                                            AuthenticationService.AuthenticatedUser.GetPrivateKey(), remotePub.HexToBytes());
                                mailObject.TextContent = decryptedText;
                            }

                            mailObject.ID = index;
                            InboxList.Add(mailObject);
                        }
                    }
                    index++;
                }
            }
            catch (Exception e)
            {
                Debug.WriteLine(e);
            }

            InboxList = new ObservableCollection <Message>(InboxList.OrderByDescending(p => p.Date)
                                                           .ThenByDescending(p => p.Date.Hour).ToList());
            _fullInboxList = InboxList.ToList();
        }
예제 #3
0
 //Update client settings
 private void UpdateSettings(bool useImap)
 {
     ClearGlobalClient();
     if (IsLogined)
     {
         IsLogined = false;
     }
     if (IsRequesting)
     {
         IsRequesting = false;
     }
     InboxList.Clear();
     if (useImap)
     {
         settings      = AppSettings.Default.ImapSettings;
         clientCreator = CreateImapClient;
     }
     else
     {
         settings      = AppSettings.Default.Pop3Settings;
         clientCreator = CreatePOP3Client;
     }
     System.Diagnostics.Debug.WriteLine("UpdateSettings " + useImap);
 }
예제 #4
0
        //Delete inbox mail by client
        private void DeleteInboxMail(object o)
        {
            var mail = o as MailMsgBase;

            if (mail != null && !string.IsNullOrEmpty(mail.UID))
            {
                Messenger.Default.Send(new DisplayMessage("Are you sure?", "The mail will delete and not exist.Ensure delete this mail.")
                {
                    OnOk = async() =>
                    {
                        System.Diagnostics.Debug.WriteLine("On ok click.");
                        IsRequesting = true;
                        await Task.Run(() =>
                        {
                            try
                            {
                                System.Diagnostics.Debug.WriteLine("Delete mail action invoked.");
                                if (EnsureLoginFetchMessage() && globalClient.DeleteMessage(mail.UID))
                                {
                                    Messenger.Default.Send(new DisplayMessage("Delete Successful!", DisplayType.Toast));
                                    Application.Current.Dispatcher.Invoke(() =>
                                    {
                                        InboxList.Remove(mail);
                                    });
                                }
                            }
                            catch (Exception e)
                            {
                                Messenger.Default.Send(new DisplayMessage("Delete Fail!", e.Message));
                            }
                        });
                        IsRequesting = false;
                    }
                });
            }
        }
예제 #5
0
        //Ensure login and fetch new messages
        private bool EnsureLoginFetchMessage()
        {
            bool isSuccessful = false;

            try
            {
                var newMsgs = new List <MailMsgBase>();
                //Login
                EnsureLogin(msg =>
                {
                    newMsgs.Add(msg);
                });
                System.Diagnostics.Debug.WriteLine("Get new mail message succuessed.");
                System.Diagnostics.Debug.WriteLine($"newMsgs.Count : {newMsgs.Count}");
                var addList    = new List <MailMsgBase>();
                var removeList = new List <MailMsgBase>();
                //Remove messages not exist from InboxList
                //Remove messages exist in InboxList from NewMsgs
                for (int i = 0; i < InboxList.Count; i++)
                {
                    var msg   = InboxList[i];
                    var index = newMsgs.FindIndex(obj => obj.UID == msg.UID);
                    if (index < 0)
                    {
                        removeList.Add(msg);
                    }
                    else
                    {
                        var newer = newMsgs[index];
                        msg.UpdateOrigin(newer);
                        newMsgs.RemoveAt(index);
                    }
                }
                //Update it
                Application.Current.Dispatcher.Invoke(() =>
                {
                    for (int i = 0; i < removeList.Count; i++)
                    {
                        InboxList.Remove(removeList[i]);
                        if (removeList[i] == null)
                        {
                            continue;
                        }
                        System.Diagnostics.Debug.WriteLine($"Remvoe {removeList[i].UID}");
                    }
                    for (int i = 0; i < newMsgs.Count; i++)
                    {
                        if (newMsgs[i] == null)
                        {
                            continue;
                        }
                        InboxList.Insert(0, newMsgs[i]);
                        Messenger.Default.Send(new DisplayMessage("New Mail",
                                                                  newMsgs[i].From[i].ToString() + "\n" + newMsgs[i].Subject,
                                                                  DisplayType.Toast));
                        System.Diagnostics.Debug.WriteLine($"Add {newMsgs[i].UID}");
                    }
                });
                isSuccessful = true;
            }
            catch (Exception e)
            {
                Messenger.Default.Send(new DisplayMessage("Error on get mail.", e.Message));
                isSuccessful = false;
            }
            return(isSuccessful);
        }
예제 #6
0
        //Implement login function
        private async void LoginImpl(string psw, bool logIt)
        {
            if (string.IsNullOrEmpty(psw))
            {
                return;
            }
            //Update client settings
            UpdateSettings(UseImap);
            this.encryptedPassword = null;
            IsRequesting           = true;
            //TODO Login
            await Task.Run(() =>
            {
                try
                {
                    //Ensure client created.
                    if (globalClient == null)
                    {
                        globalClient = clientCreator.Invoke();
                    }
                    if (globalClient.IsConnected)
                    {
                        globalClient.Disconnect();
                    }
                    Application.Current.Dispatcher.Invoke(() =>
                    {
                        InboxList.Clear();
                    });
                    //Connect
                    string userAddress = UserAddress;
                    IsLandingIn        = true;
                    //Connect to server.
                    globalClient.Connect(settings.Host, settings.Port, settings.EnableSsl);
                    //Login
                    if (!globalClient.Login(userAddress, psw, () =>
                    {
                        IsLandingIn = false;
                        this.encryptedPassword = psw.Protect();
                        this.IsLogined = true;
                        //Notify login state
                        Messenger.Default.Send(new NavigationMessage(), Tokens.Login);
                        Messenger.Default.Send(new DisplayMessage("Login Successful!", DisplayType.Toast));
                        //Delete old inbox folder
                        var dir = new DirectoryInfo(InboxFolder);
                        if (dir.Exists)
                        {
                            dir.Delete(true);
                        }
                        //Do on logined
                        AppSettings.Default.LastLogUser = userAddress;
                        if (logIt)
                        {
                            //Log to local.
                            userAssistant.StoreUserLocal(userAddress, psw);
                            AppSettings.Default.LastLogUser = userAddress;
                            AppSettings.Default.AutoLogin = true;
                        }
                        AppSettings.Default.Save();
                        DisplayName = userAssistant.GetUserDisplayName(userAddress);
                        userAssistant.SaveToRecent(userAddress, DisplayName);
                        //End
                    }, msg =>
                    {
                        Application.Current.Dispatcher.Invoke(() => { InboxList.Add(msg); });
                    }))
                    {
                        Messenger.Default.Send(new DisplayMessage("Login Error, authenticate fail."));
                    }
                    IsLandingIn = false;
                }
                catch (Exception e)
                {
                    string tips =
                        globalClient == null ? "Create client fail."
                    : (globalClient.IsConnected ? (globalClient.IsAuthenticated ? "Fetch messages fail."
                    : "Login Error, authenticate fail.")
                    : "Connect to service fail.");
                    Messenger.Default.Send(new DisplayMessage(tips, e.Message));
                }
            });

            IsRequesting = false;
            IsLandingIn  = false;
        }