public void onRequest(byte[] recipient_address) { try { if (Address.validateChecksum(recipient_address) == false) { displaySpixiAlert("Invalid checksum", "Please make sure you typed the address correctly.", "OK"); return; } if (recipient_address.SequenceEqual(Node.walletStorage.getPrimaryAddress())) { displaySpixiAlert("Cannot add yourself", "The address you have entered is your own address.", "OK"); return; } if (FriendList.getFriend(recipient_address) != null) { displaySpixiAlert("Already exists", "This contact is already in your contacts list.", "OK"); return; } Friend friend = FriendList.addFriend(recipient_address, null, Base58Check.Base58CheckEncoding.EncodePlain(recipient_address), null, null, 0); FriendList.saveToStorage(); StreamProcessor.sendContactRequest(friend); }catch (Exception) { } Navigation.PopAsync(Config.defaultXamarinAnimations); }
private static void handleAcceptAdd(byte[] sender_wallet, byte[] aes_key) { // Retrieve the corresponding contact Friend friend = FriendList.getFriend(sender_wallet); if (friend == null) { byte[] pub_k = FriendList.findContactPubkey(sender_wallet); if (pub_k == null) { Console.WriteLine("Contact {0} not found in presence list!", Base58Check.Base58CheckEncoding.EncodePlain(sender_wallet)); return; } friend = FriendList.addFriend(sender_wallet, pub_k, Base58Check.Base58CheckEncoding.EncodePlain(sender_wallet), aes_key, null, 0); } else { friend.aesKey = aes_key; } friend.handshakeStatus = 2; friend.generateKeys(); friend.sendKeys(2); requestNickname(friend); sendNickname(friend); FriendList.addMessage(null, friend.walletAddress, friend.nickname + " has accepted your friend request."); }
private static void handleRequestAdd(byte[] id, byte[] sender_wallet, byte[] pub_key) { if (!(new Address(pub_key)).address.SequenceEqual(sender_wallet)) { Logging.error("Received invalid pubkey in handleRequestAdd for {0}", Base58Check.Base58CheckEncoding.EncodePlain(sender_wallet)); return; } Friend new_friend = FriendList.addFriend(sender_wallet, pub_key, Base58Check.Base58CheckEncoding.EncodePlain(sender_wallet), null, null, 0, false); if (new_friend != null) { new_friend.handshakeStatus = 1; FriendList.addMessageWithType(id, FriendMessageType.requestAdd, sender_wallet, ""); requestNickname(new_friend); } else { Friend friend = FriendList.getFriend(sender_wallet); friend.handshakeStatus = 1; if (friend.approved) { sendAcceptAdd(friend); } } }
public void onCreateAccount(string nick, string pass) { // Generate the account on a different thread new Thread(() => { Thread.CurrentThread.IsBackground = true; // Aquire the wake lock bool wake_lock = DependencyService.Get <IPowerManager>().AquireLock(); if (Node.generateWallet(pass)) { Node.start(); Node.localStorage.nickname = nick; Node.localStorage.writeAccountFile(); // TODO: encrypt the password Application.Current.Properties["walletpass"] = pass; Application.Current.SavePropertiesAsync(); // Force-save properties for compatibility with WPF // Release the wake lock if (wake_lock) { DependencyService.Get <IPowerManager>().ReleaseLock(); } Device.BeginInvokeOnMainThread(() => { Navigation.PushAsync(HomePage.Instance(), Config.defaultXamarinAnimations); Navigation.RemovePage(this); }); Friend friend = FriendList.addFriend(Base58Check.Base58CheckEncoding.DecodePlain("419jmKRKVFcsjmwpDF1XSZ7j1fez6KWaekpiawHvrpyZ8TPVmH1v6bhT2wFc1uddV"), null, "Spixi Group Chat", null, null, 0); FriendList.saveToStorage(); StreamProcessor.sendContactRequest(friend); } else { // Release the wake lock if (wake_lock) { DependencyService.Get <IPowerManager>().ReleaseLock(); } Device.BeginInvokeOnMainThread(() => { displaySpixiAlert("Error", "Cannot generate new wallet. Please try again.", "Ok"); }); return; } }).Start(); }
// Sends the nickname back to the sender, detects if it should fetch the sender's nickname and fetches it automatically private static void handleGetNick(byte[] sender_wallet, string text) { Friend friend = FriendList.getFriend(sender_wallet); if (friend == null) { byte[] pub_k = FriendList.findContactPubkey(sender_wallet); if (pub_k == null) { Console.WriteLine("Contact {0} not found in presence list!", Base58Check.Base58CheckEncoding.EncodePlain(sender_wallet)); foreach (Presence pr in PresenceList.presences) { Console.WriteLine("Presence: {0}", Base58Check.Base58CheckEncoding.EncodePlain(pr.wallet)); } return; } friend = new Friend(sender_wallet, pub_k, "Unknown"); FriendList.addFriend(sender_wallet, pub_k, "Unknown"); SpixiMessage spixi_message = new SpixiMessage(SpixiMessageCode.getNick, new byte[1]); // Also request the nickname of the sender // Prepare the message and send to the S2 nodes StreamMessage message = new StreamMessage(); message.type = StreamMessageCode.info; message.recipient = sender_wallet; message.sender = Node.walletStorage.getPrimaryAddress(); message.transaction = new byte[1]; message.sigdata = new byte[1]; message.data = spixi_message.getBytes(); string relayip = friend.searchForRelay(); StreamProcessor.sendMessage(message, relayip); } SpixiMessage reply_spixi_message = new SpixiMessage(SpixiMessageCode.nick, Encoding.UTF8.GetBytes(Node.localStorage.nickname)); // Send the nickname message to the S2 nodes StreamMessage reply_message = new StreamMessage(); reply_message.type = StreamMessageCode.info; reply_message.recipient = friend.walletAddress; reply_message.sender = Node.walletStorage.getPrimaryAddress(); reply_message.transaction = new byte[1]; reply_message.sigdata = new byte[1]; reply_message.data = reply_spixi_message.getBytes(); StreamProcessor.sendMessage(reply_message, friend.searchForRelay()); return; }
private static void handleRequestAdd(byte[] sender_wallet) { byte[] pub_k = FriendList.findContactPubkey(sender_wallet); if (pub_k == null) { Console.WriteLine("Contact {0} not found in presence list!", Base58Check.Base58CheckEncoding.EncodePlain(sender_wallet)); foreach (Presence pr in PresenceList.presences) { Console.WriteLine("Presence: {0}", Base58Check.Base58CheckEncoding.EncodePlain(pr.wallet)); } return; } FriendList.addFriend(sender_wallet, pub_k, "New Contact", false); FriendList.addMessageWithType(FriendMessageType.requestAdd, sender_wallet, ""); }
public void onRequest(byte[] recipient_address) { try { if (Address.validateChecksum(recipient_address) == false) { displaySpixiAlert(SpixiLocalization._SL("global-invalid-address-title"), SpixiLocalization._SL("global-invalid-address-text"), SpixiLocalization._SL("global-dialog-ok")); return; } if (recipient_address.SequenceEqual(Node.walletStorage.getPrimaryAddress())) { displaySpixiAlert(SpixiLocalization._SL("global-invalid-address-title"), SpixiLocalization._SL("contact-new-invalid-address-self-text"), SpixiLocalization._SL("global-dialog-ok")); return; } Friend old_friend = FriendList.getFriend(recipient_address); if (old_friend != null) { if (old_friend.pendingDeletion) { FriendList.removeFriend(old_friend); } else { displaySpixiAlert(SpixiLocalization._SL("global-invalid-address-title"), SpixiLocalization._SL("contact-new-invalid-address-exists-text"), SpixiLocalization._SL("global-dialog-ok")); return; } } Friend friend = FriendList.addFriend(recipient_address, null, Base58Check.Base58CheckEncoding.EncodePlain(recipient_address), null, null, 0); if (friend != null) { friend.save(); StreamProcessor.sendContactRequest(friend); } }catch (Exception) { } Navigation.PopAsync(Config.defaultXamarinAnimations); }
private void onNavigating(object sender, WebNavigatingEventArgs e) { string current_url = HttpUtility.UrlDecode(e.Url); if (onNavigatingGlobal(current_url)) { e.Cancel = true; return; } if (current_url.Equals("ixian:onload", StringComparison.Ordinal)) { onLoaded(); } else if (current_url.Equals("ixian:wallet", StringComparison.Ordinal)) { // Deprecated } else if (current_url.Equals("ixian:quickscan", StringComparison.Ordinal)) { ICustomQRScanner scanner = DependencyService.Get <ICustomQRScanner>(); if (scanner != null && scanner.useCustomQRScanner()) { Logging.error("Custom scanner not implemented"); e.Cancel = true; return; } quickScan(); } else if (current_url.Contains("ixian:qrresult:")) { string[] split = current_url.Split(new string[] { "ixian:qrresult:" }, StringSplitOptions.None); string result = split[1]; processQRResult(result); e.Cancel = true; return; } else if (current_url.Equals("ixian:newchat", StringComparison.Ordinal)) { newChat(); } else if (current_url.Equals("ixian:newcontact", StringComparison.Ordinal)) { Navigation.PushAsync(new ContactNewPage(), Config.defaultXamarinAnimations); } else if (current_url.Equals("ixian:sendixi", StringComparison.Ordinal)) { Navigation.PushAsync(new WalletSendPage(), Config.defaultXamarinAnimations); } else if (current_url.Equals("ixian:receiveixi", StringComparison.Ordinal)) { Navigation.PushAsync(new WalletReceivePage(), Config.defaultXamarinAnimations); } else if (current_url.Equals("ixian:wixi", StringComparison.Ordinal)) { Navigation.PushAsync(new WIXISendPage(), Config.defaultXamarinAnimations); } else if (current_url.Equals("ixian:avatar", StringComparison.Ordinal)) { //onChangeAvatarAsync(sender, e); } else if (current_url.Equals("ixian:settings", StringComparison.Ordinal)) { onSettings(sender, e); } else if (current_url.Equals("ixian:address", StringComparison.Ordinal)) { Navigation.PushAsync(new MyAddressPage(), Config.defaultXamarinAnimations); } else if (current_url.Equals("ixian:lock", StringComparison.Ordinal)) { // prepBackground(); Navigation.PushAsync(new SetLockPage(), Config.defaultXamarinAnimations); } else if (current_url.Equals("ixian:activity", StringComparison.Ordinal)) { // TODO show wallet activity screen } else if (current_url.Equals("ixian:about", StringComparison.Ordinal)) { #pragma warning disable CS0618 // Type or member is obsolete Device.OpenUri(new Uri(Config.aboutUrl)); #pragma warning restore CS0618 // Type or member is obsolete } else if (current_url.Equals("ixian:guide", StringComparison.Ordinal)) { #pragma warning disable CS0618 // Type or member is obsolete Device.OpenUri(new Uri(Config.guideUrl)); #pragma warning restore CS0618 // Type or member is obsolete } else if (current_url.Equals("ixian:backup", StringComparison.Ordinal)) { Navigation.PushAsync(new BackupPage(), Config.defaultXamarinAnimations); } else if (current_url.Equals("ixian:encpass", StringComparison.Ordinal)) { Navigation.PushAsync(new EncryptionPassword(), Config.defaultXamarinAnimations); } else if (current_url.Contains("ixian:chat:")) { string[] split = current_url.Split(new string[] { "ixian:chat:" }, StringSplitOptions.None); string id = split[1]; onChat(id, e); } else if (current_url.Contains("ixian:details:")) { string[] split = current_url.Split(new string[] { "ixian:details:" }, StringSplitOptions.None); string id = split[1]; // TODO: handle exceptions byte[] id_bytes = Base58Check.Base58CheckEncoding.DecodePlain(id); Friend friend = FriendList.getFriend(id_bytes); if (friend == null) { e.Cancel = true; return; } Navigation.PushAsync(new ContactDetails(friend), Config.defaultXamarinAnimations); } else if (current_url.Contains("ixian:txdetails:")) { string[] split = current_url.Split(new string[] { "ixian:txdetails:" }, StringSplitOptions.None); string id = split[1]; byte[] b_txid = Transaction.txIdLegacyToV8(id); Transaction transaction = null; foreach (Transaction tx in TransactionCache.transactions) { if (tx.id.SequenceEqual(b_txid)) { transaction = tx; break; } } if (transaction == null) { foreach (Transaction tx in TransactionCache.unconfirmedTransactions) { if (tx.id.SequenceEqual(b_txid)) { transaction = tx; break; } } if (transaction == null) { e.Cancel = true; return; } } Navigation.PushAsync(new WalletSentPage(transaction), Config.defaultXamarinAnimations); } else if (current_url.Contains("ixian:tab:")) { currentTab = current_url.Split(new string[] { "ixian:tab:" }, StringSplitOptions.None)[1]; } else if (current_url.Equals("ixian:apps", StringComparison.Ordinal)) { // prepBackground(); Navigation.PushAsync(new AppsPage(), Config.defaultXamarinAnimations); } else if (current_url.Equals("ixian:downloads", StringComparison.Ordinal)) { // prepBackground(); Navigation.PushAsync(new DownloadsPage(), Config.defaultXamarinAnimations); } else if (current_url.StartsWith("ixian:viewLog")) { // TODO perhaps move this whole functionality to Logging class and delete spixi.log.zip on start if exists if (File.Exists(Path.Combine(Config.spixiUserFolder, "spixi.log.zip"))) { File.Delete(Path.Combine(Config.spixiUserFolder, "spixi.log.zip")); } if (File.Exists(Path.Combine(Config.spixiUserFolder, "ixian.log.tmp"))) { File.Delete(Path.Combine(Config.spixiUserFolder, "ixian.log.tmp")); } File.Copy(Path.Combine(Config.spixiUserFolder, "ixian.log"), Path.Combine(Config.spixiUserFolder, "ixian.log.tmp")); using (ZipArchive archive = ZipFile.Open(Path.Combine(Config.spixiUserFolder, "spixi.log.zip"), ZipArchiveMode.Create)) { archive.CreateEntryFromFile(Path.Combine(Config.spixiUserFolder, "ixian.log.tmp"), "ixian.log"); if (File.Exists(Path.Combine(Config.spixiUserFolder, "ixian.0.log"))) { archive.CreateEntryFromFile(Path.Combine(Config.spixiUserFolder, "ixian.0.log"), "ixian.0.log"); } } if (File.Exists(Path.Combine(Config.spixiUserFolder, "ixian.log.tmp"))) { File.Delete(Path.Combine(Config.spixiUserFolder, "ixian.log.tmp")); } DependencyService.Get <IFileOperations>().share(Path.Combine(Config.spixiUserFolder, "spixi.log.zip"), "Share Spixi Log File"); } else if (current_url.StartsWith("ixian:onboardingComplete")) { Application.Current.Properties["onboardingComplete"] = true; Application.Current.SavePropertiesAsync(); // Force-save properties for compatibility with WPF SpixiLocalization.addCustomString("OnboardingComplete", "true"); generatePage("index.html"); } else if (current_url.StartsWith("ixian:joinBot")) { Friend friend = FriendList.addFriend(Base58Check.Base58CheckEncoding.DecodePlain("419jmKRKVFcsjmwpDF1XSZ7j1fez6KWaekpiawHvrpyZ8TPVmH1v6bhT2wFc1uddV"), null, "Spixi Group Chat", null, null, 0); if (friend != null) { friend.save(); StreamProcessor.sendContactRequest(friend); } } else { // Otherwise it's just normal navigation e.Cancel = false; return; } e.Cancel = true; }