private void LogoutImpl() { ClearGlobalClient(); this.IsLogined = false; this.encryptedPassword = null; InboxList.Clear(); System.Diagnostics.Debug.WriteLine("Logout invoke"); }
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(); }
//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); }
//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; } }); } }
//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); }
//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; }