diff --git a/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java b/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java index 7726b694f..59fa1d3dc 100644 --- a/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java +++ b/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java @@ -1372,16 +1372,23 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded { return session; } - public XmppAxolotlMessage.XmppAxolotlPlaintextMessage processReceivingPayloadMessage(XmppAxolotlMessage message, boolean postponePreKeyMessageHandling) { + public XmppAxolotlMessage.XmppAxolotlPlaintextMessage processReceivingPayloadMessage(XmppAxolotlMessage message, boolean postponePreKeyMessageHandling) throws NotEncryptedForThisDeviceException { XmppAxolotlMessage.XmppAxolotlPlaintextMessage plaintextMessage = null; XmppAxolotlSession session = getReceivingSession(message); + int ownDeviceId = getOwnDeviceId(); try { - plaintextMessage = message.decrypt(session, getOwnDeviceId()); + plaintextMessage = message.decrypt(session, ownDeviceId); Integer preKeyId = session.getPreKeyIdAndReset(); if (preKeyId != null) { postPreKeyMessageHandling(session, preKeyId, postponePreKeyMessageHandling); } + } catch (NotEncryptedForThisDeviceException e) { + if (account.getJid().asBareJid().equals(message.getFrom().asBareJid()) && message.getSenderDeviceId() == ownDeviceId) { + Log.w(Config.LOGTAG, getLogprefix(account) + "Reflected omemo message received"); + } else { + throw e; + } } catch (CryptoFailedException e) { Log.w(Config.LOGTAG, getLogprefix(account) + "Failed to decrypt message from " + message.getFrom() + ": " + e.getMessage()); } diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java index 5d9f92609..8638cc556 100644 --- a/src/main/java/eu/siacs/conversations/entities/Message.java +++ b/src/main/java/eu/siacs/conversations/entities/Message.java @@ -42,6 +42,7 @@ public class Message extends AbstractEntity { public static final int ENCRYPTION_DECRYPTED = 3; public static final int ENCRYPTION_DECRYPTION_FAILED = 4; public static final int ENCRYPTION_AXOLOTL = 5; + public static final int ENCRYPTION_AXOLOTL_NOT_FOR_THIS_DEVICE = 6; public static final int TYPE_TEXT = 0; public static final int TYPE_IMAGE = 1; @@ -869,6 +870,9 @@ public class Message extends AbstractEntity { if (encryption == ENCRYPTION_DECRYPTED || encryption == ENCRYPTION_DECRYPTION_FAILED) { return ENCRYPTION_PGP; } + if (encryption == ENCRYPTION_AXOLOTL_NOT_FOR_THIS_DEVICE) { + return ENCRYPTION_AXOLOTL; + } return encryption; } } diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index a4f039a4f..44ef7bf83 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -16,6 +16,7 @@ import java.util.UUID; import eu.siacs.conversations.Config; import eu.siacs.conversations.R; import eu.siacs.conversations.crypto.axolotl.AxolotlService; +import eu.siacs.conversations.crypto.axolotl.NotEncryptedForThisDeviceException; import eu.siacs.conversations.crypto.axolotl.XmppAxolotlMessage; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.Bookmark; @@ -114,7 +115,12 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece return null; } if (xmppAxolotlMessage.hasPayload()) { - final XmppAxolotlMessage.XmppAxolotlPlaintextMessage plaintextMessage = service.processReceivingPayloadMessage(xmppAxolotlMessage, postpone); + final XmppAxolotlMessage.XmppAxolotlPlaintextMessage plaintextMessage; + try { + plaintextMessage = service.processReceivingPayloadMessage(xmppAxolotlMessage, postpone); + } catch (NotEncryptedForThisDeviceException e) { + return new Message(conversation, "", Message.ENCRYPTION_AXOLOTL_NOT_FOR_THIS_DEVICE, status); + } if (plaintextMessage != null) { Message finishedMessage = new Message(conversation, plaintextMessage.getPlaintext(), Message.ENCRYPTION_AXOLOTL, status); finishedMessage.setFingerprint(plaintextMessage.getFingerprint()); @@ -545,6 +551,8 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece if (message.getEncryption() == Message.ENCRYPTION_PGP) { notify = conversation.getAccount().getPgpDecryptionService().decrypt(message, notify); + } else if (message.getEncryption() == Message.ENCRYPTION_AXOLOTL_NOT_FOR_THIS_DEVICE) { + notify = false; } if (query == null) { diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 143e93e2d..a12f94ec2 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -1054,6 +1054,10 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke } if (m.getType() != Message.TYPE_STATUS) { + if (m.getEncryption() == Message.ENCRYPTION_AXOLOTL_NOT_FOR_THIS_DEVICE) { + return; + } + final boolean treatAsFile = m.getType() != Message.TYPE_TEXT && m.getType() != Message.TYPE_PRIVATE && !(t instanceof TransferablePlaceholder); diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index bc6d7e21a..b2eccdd69 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -807,16 +807,12 @@ public class MessageAdapter extends ArrayAdapter implements CopyTextVie } } else { displayInfoMessage(viewHolder, activity.getString(R.string.install_openkeychain), darkBackground); - viewHolder.message_box.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - activity.showInstallPgpDialog(); - } - }); + viewHolder.message_box.setOnClickListener(v -> activity.showInstallPgpDialog()); } } else if (message.getEncryption() == Message.ENCRYPTION_DECRYPTION_FAILED) { displayDecryptionFailed(viewHolder, darkBackground); + } else if (message.getEncryption() == Message.ENCRYPTION_AXOLOTL_NOT_FOR_THIS_DEVICE) { + displayInfoMessage(viewHolder, activity.getString(R.string.not_encrypted_for_this_device), darkBackground); } else { if (message.isGeoUri()) { displayLocationMessage(viewHolder, message); diff --git a/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java b/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java index 98ae15953..caecff78b 100644 --- a/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java @@ -241,6 +241,7 @@ public final class CryptoHelper { case Message.ENCRYPTION_OTR: return R.string.encryption_choice_otr; case Message.ENCRYPTION_AXOLOTL: + case Message.ENCRYPTION_AXOLOTL_NOT_FOR_THIS_DEVICE: return R.string.encryption_choice_omemo; case Message.ENCRYPTION_NONE: return R.string.encryption_choice_unencrypted; diff --git a/src/main/java/eu/siacs/conversations/utils/UIHelper.java b/src/main/java/eu/siacs/conversations/utils/UIHelper.java index d05935e88..8bc9e4b7a 100644 --- a/src/main/java/eu/siacs/conversations/utils/UIHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/UIHelper.java @@ -277,6 +277,8 @@ public class UIHelper { return new Pair<>(context.getString(R.string.pgp_message), true); } else if (message.getEncryption() == Message.ENCRYPTION_DECRYPTION_FAILED) { return new Pair<>(context.getString(R.string.decryption_failed), true); + } else if (message.getEncryption() == Message.ENCRYPTION_AXOLOTL_NOT_FOR_THIS_DEVICE) { + return new Pair<>(context.getString(R.string.not_encrypted_for_this_device), true); } else if (message.getType() == Message.TYPE_FILE || message.getType() == Message.TYPE_IMAGE) { if (message.getStatus() == Message.STATUS_RECEIVED) { return new Pair<>(context.getString(R.string.received_x_file, diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 608c8b9ba..62d7bf10a 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -1,751 +1,752 @@ - Settings - New conversation - Manage accounts - End this conversation - Contact details - Group chat details - Secure conversation - Add account - Edit name - Add to address book - Delete from roster - Block contact - Unblock contact - Block domain - Unblock domain - Manage Accounts - Settings - Share with Conversation - Start Conversation - Choose Contact - Share via account - Block list - just now - 1 min ago - %d mins ago - unread Conversations - sending… - Decrypting message. Please wait… - OpenPGP encrypted message - Nickname is already in use - Invalid nickname - Admin - Owner - Moderator - Participant - Visitor - Would you like to remove %s from your roster? The conversation associated with this contact will not be removed. - Would you like to block %s from sending you messages? - Would you like to unblock %s and allow them to send you messages? - Block all contacts from %s? - Unblock all contacts from %s? - Contact blocked - Would you like to remove %s as a bookmark? The conversation associated with this bookmark will not be removed. - Register new account on server - Change password on server - Share with… - Start conversation - Invite contact - Contacts - Contact - Cancel - Set - Add - Edit - Delete - Block - Unblock - Save - OK - Conversations has crashed - By sending in stack traces you are helping the ongoing development of Conversations\nWarning: This will use your XMPP account to send the stack trace to the developer. - Send now - Never ask again - Unable to connect to account - Unable to connect to multiple accounts - Touch here to manage your accounts - Attach file - The contact is not in your roster. Would you like to add it? - Add contact - delivery failed - Preparing image for transmission - Preparing images for transmission - Sharing files. Please wait… - Clear history - Clear Conversation History - Do you want to delete all messages within this Conversation?\n\nWarning: This will not influence messages stored on other devices or servers. - Delete messages - End this conversation afterwards - Choose device - Send unencrypted message - Send message - Send message to %s - Send OTR encrypted message - Send OMEMO encrypted message - Send v\\OMEMO encrypted message - Send OpenPGP encrypted message - Your nickname has been changed - Send unencrypted - Decryption failed. Maybe you don’t have the proper private key. - OpenKeychain - Conversations utilizes a third party app called OpenKeychain to encrypt and decrypt messages and to manage your public keys.\n\nOpenKeychain is licensed under GPLv3 and available on F-Droid and Google Play.\n\n(Please restart Conversations afterwards.) - Restart - Install - Please install OpenKeychain - offering… - waiting… - No OpenPGP Key found - Conversations is unable to encrypt your messages because your contact is not announcing his or hers public key.\n\nPlease ask your contact to setup OpenPGP. - No OpenPGP Keys found - Conversations is unable to encrypt your messages because your contacts are not announcing their public key.\n\nPlease ask your contacts to setup OpenPGP. - General - Accept files - Automatically accept files smaller than… - Attachments - Quick Sharing - Immediately return to previous activity instead of opening the conversation after sharing something - Notification - Notifications - Notify when a new message arrives - Vibrate - Vibrate when a new message arrives - LED Notification - Blink notification light when a new message arrives - Ringtone - Play sound when a new message arrives - Grace Period - The length of time Conversations keeps quiet after seeing activity on another device - Advanced - Never send crash reports - By sending in stack traces you are helping the ongoing development of Conversations - Confirm Messages - Let your contacts know when you have received and read their messages - UI - OpenKeychain reported an error - Accept - An error has occurred - Your account - Send presence updates - Receive presence updates - Ask for presence updates - Choose picture - Take picture - Preemptively grant subscription request - The file you selected is not an image - Error while converting the image file - File not found - General I/O error. Maybe you ran out of storage space? - The app you used to select this image did not provide us with enough permissions to read the file.\n\nUse a different file manager to choose an image - Unknown - Temporarily disabled - Online - Connecting\u2026 - Offline - Unauthorized - Server not found - No connectivity - Registration failed - Username already in use - Registration completed - Server does not support registration - TLS negotiation failed - Policy violation - Incompatible server - Stream error - Unencrypted - OTR - OpenPGP - OMEMO - Delete account - Temporarily disable - Publish avatar - Publish OpenPGP public key - Remove OpenPGP public key - Are you sure you want to remove your OpenPGP public key from your presence announcement?\nYour contacts will no longer be able to send you OpenPGP encrypted messages. - OpenPGP public key has been published. - Enable account - Are you sure? - If you delete your account, your entire conversation history will be lost - Record voice - Jabber ID - Block Jabber ID - Password - username@example.com - Confirm password - Password - This is not a valid Jabber ID - Out of memory. Image is too large - Do you want to add %s to your address book? - Server info - XEP-0313: MAM - XEP-0280: Message Carbons - XEP-0352: Client State Indication - XEP-0191: Blocking Command - XEP-0237: Roster Versioning - XEP-0198: Stream Management - XEP-0163: PEP (Avatars / OMEMO) - XEP-0363: HTTP File Upload - XEP-0357: Push - available - unavailable - Missing public key announcements - last seen just now - last seen 1 minute ago - last seen %d minutes ago - last seen 1 hour ago - last seen %d hours ago - last seen 1 day ago - last seen %d days ago - Encrypted message. Please install OpenKeychain to decrypt. - Unknown OTR fingerprint - OpenPGP encrypted messages found - Your fingerprint - OTR fingerprint - OTR fingerprint of message - OpenPGP Key ID - OMEMO fingerprint - v\\OMEMO fingerprint - OMEMO fingerprint of message - v\\OMEMO fingerprint of message - Other devices - Trust OMEMO Fingerprints - Fetching keys… - Done - Verify - Decrypt - Group chats - Search - Create contact - Create Contact - Enter Contact - Join group chat - Join Group Chat - Delete contact - View contact details - Block contact - Unblock contact - Create - Select - The contact already exists - Join - Group chat address - room@conference.example.com/nick - Save as bookmark - Delete bookmark - This bookmark already exists - Edit group chat subject - The subject of this group chat - Joining group chat… - Leave - Contact added you to contact list - Add back - %s has read up to this point - %s have read up to this point - %1$s +%2$d more have read up to this point - Publish - Touch avatar to select picture from gallery - Publishing… - The server rejected your publication - Something went wrong while converting your picture - Could not save avatar to disk - (Or long press to bring back default) - Your server does not support the publication of avatars - whispered - to %s - Send private message to %s - Connect - This account already exists - Next - Current session established - Skip - Disable notifications - Enable - Group chat requires password - Enter password - Missing presence subscription - Please request presence updates from your contact first.\n\nThis will be used to determine what client(s) your contact is using. - Request now - Delete Fingerprint - Are you sure you would like to delete this fingerprint? - Ignore - Warning: Sending this without mutual presence updates could cause unexpected problems.\n\nGo to contact details to verify your presence subscriptions. - Security - Allow message correction - Allow your contacts to retroactively edit their messages - Expert settings - Please be careful with these - About Conversations - Build and licensing information - Quiet Hours - Start time - End time - Enable quiet hours - Notifications will be silenced during quiet hours - Send button indicates status - Request message receipts - Received messages will be marked with a green tick if supported - Colorize send button to indicate contact status - Other - Group chat name - Use subject instead of JID to identify group chats - Automatically join group chats - Respect the autojoin flag in group chat bookmarks - OTR fingerprint copied to clipboard! - OMEMO fingerprint copied to clipboard! - You are banned from this group chat - This group chat is members only - You have been kicked from this group chat - The group chat was shut down - You are no longer in this group chat - using account %s - Checking %s on HTTP host - You are not connected. Try again later - Check %s size - Check %1$s size on %2$s - Message options - Quote - Copy original URL - Send again - File URL - URL copied to clipboard - Scan 2D Barcode - Show 2D Barcode - Show block list - Account details - Verify OTR - Remote Fingerprint - Hint or Question - Shared Secret - Confirm - In progress - Respond - Secrets do not match - Try again - Finish - Verified! - Contact requested SMP verification - No valid OTR session has been found! - Conversations - Keep service in foreground - Prevents the operating system from killing your connection - Export history - Write conversations history logs to SD card - Writing logs to SD card - Choose file - Receiving %1$s (%2$d%% completed) - Download %s - Delete %s - file - Open %s - sending (%1$d%% completed) - Preparing file for transmission - %s offered for download - Cancel transmission - file transmission failed - The file has been deleted - No application found to open file - No application found to open link - Could not verify fingerprint - Manually verify - Are you sure that you want to verify your contact’s OTR fingerprint? - Dynamic Tags - Display read-only tags underneath contacts - Enable notifications - No group chat server found - Group chat creation failed! - Account avatar - Copy OTR fingerprint to clipboard - Copy OMEMO fingerprint to clipboard - Regenerate OMEMO key - Clear devices - Are you sure you want to clear all other devices from the OMEMO announcement? The next time your devices connect, they will reannounce themselves, but they might not receive messages sent in the meantime. - There are no usable keys available for this contact.\nFetching new keys from the server has been unsuccessful. Maybe there is something wrong with your contact’s server. - There are no usable keys available for this contact.\nMake sure you have mutual presence subscription. - There are no usable keys available for this contact. If you have purged any of their keys, they need to generate new ones. - Something went wrong - Fetching history from server - No more history on server - Updating… - Password changed! - Could not change password - Send a message to start an encrypted chat - Ask question - If you and your contact have a secret in common that no one else knows (like an inside joke or simply what you had for lunch the last time you met) you can use that secret to verify each other’s fingerprints.\n\nYou provide a hint or a question for your contact who will respond with a case-sensitive answer. - Your contact would like to verify your fingerprint by challenging you with a shared secret. Your contact provided the following hint or question for that secret. - Your hint should not be empty - Your shared secret can not be empty - Carefully compare the fingerprint shown below with the fingerprint of your contact.\nYou can use any trusted form of communication like an encrypted e-mail or a telephone call to exchange those. - Change password - Current password - New password - Password should not be empty - Enable all accounts - Disable all accounts - Perform action with - No affiliation - Offline - Outcast - Member - Advanced mode - Grant membership - Revoke membership - Grant admin privileges - Revoke admin privileges - Remove from group chat - Could not change affiliation of %s - Ban from group chat - You are trying to remove %s from a public group chat. The only way to do that is to ban that user for ever. - Ban now - Could not change role of %s - Publicly accessible group chat - Private, members only group chat - Group chat options - Private, members only - Non-anonymous - Moderated - You are not participating - Modified group chat options! - Could not modify group chat options - Never - Until further notice - Snooze - Reply - Mark as read - Input - Enter is send - Use enter key to send message - Show enter key - Change the emoticons key to an enter key - audio - video - image - PDF document - Android App - Contact - Received %s - Disable foreground service - Touch to open Conversations - Avatar has been published! - Sending %s - Offering %s - Hide offline - %s is typing… - %s has stopped typing - %s are typing… - %s have stopped typing - Typing notifications - Let your contacts know when you are writing messages to them - Send location - Show location - No application found to display location - Location - Received location - Conversation closed - Left group chat - Don’t trust system CAs - All certificates must be manually approved - Remove certificates - Delete manually approved certificates - No manually approved certificates - Remove certificates - Delete selection - Cancel - - %d certificate deleted - %d certificates deleted - - - Select %d contact - Select %d contacts - - Replace send button with quick action - Quick Action - None - Most recently used - Choose quick action - Search for contacts or groups - Send private message - %1$s has left the group chat! - Username - Username - This is not a valid username - Download failed: Server not found - Download failed: File not found - Download failed: Could not connect to host - Download failed: Could not write file - Tor network unavailable - Bind failure - Server not responsible for domain - Broken - Availability - Away when screen is off - Marks your resource as away when the screen is turned off - “Do not disturb” in silent mode - Marks your resource as “Do not disturb” when device is in silent mode - Treat vibrate as silent mode - Marks your resource as “Do not disturb” when device is on vibrate - Extended connection settings - Show hostname and port settings when setting up an account - xmpp.example.com - Add account with certificate - Unable to parse certificate - Leave empty to authenticate w/ certificate - Archiving preferences - Server-side archiving preferences - Fetching archiving preferences. Please wait… - Unable to fetch archiving preferences - Captcha required - Enter the text from the image above - Certificate chain is not trusted - Jabber ID does not match certificate - Renew certificate - Error fetching OMEMO key! - Verified OMEMO key with certificate! - Your device does not support the selection of client certificates! - Connection - Connect via Tor - Tunnel all connections through the Tor network. Requires Orbot - Hostname - Port - Server- or .onion-Address - This is not a valid port number - This is not a valid hostname - %1$d of %2$d accounts connected - - %d message - %d messages - - Load more messages - Shared file with %s - Shared image with %s - Shared images with %s - Shared text with %s - Conversations needs access to external storage - Conversations needs access to the camera - Synchronize with contacts - Conversations wants to match your XMPP roster with your contacts to show their full names and avatars.\n\nConversations will only read your contacts and match them locally without uploading them to your server.\n\nYou will now be asked to grant permission to access your contacts. - Certificate Information - Subject - Issuer - Common Name - Organization - SHA-1 - (Not available) - No certificate found - Notify on all messages - Notify only when mentioned - Notifications disabled - Notifications paused - Compress Pictures - Resize and compress pictures - Always - Automatically - Battery optimizations enabled - Your device is doing some heavy battery optimizations on Conversations that might lead to delayed notifications or even message loss.\nIt is recommended to disable those. - Your device is doing some heavy battery optimizations on Conversations that might lead to delayed notifications or even message loss.\n\nYou will now be asked to disable those. - Disable - The selected area is too large - (No activated accounts) - This field is required - Correct message - Send corrected message - You already trust this contact. By selecting \'done\' you are just confirming that %s is part of this group chat. - Select image and crop - You have disabled this account - Security error: Invalid file access - No application found to share URI - Share URI with… - Join the Conversation - Jabber is a provider independent instant messaging network. You can use this client with what ever Jabber server you choose.\nHowever for your convenience we made it easy to create an account on conversations.im¹; a provider specially suited for the use with Conversations. - We will guide you through the process of creating an account on conversations.im.¹\nWhen picking conversations.im as a provider you will be able to communicate with users of other providers by giving them your full Jabber ID. - Your full Jabber ID will be: %s - Create Account - Use my own provider - Pick your username - Manage availability manually - Set your availability when editing your status message. - Change Presence - Status message - Set for all accounts on this device - Free for Chat - Online - Away - Not Available - Busy - A secure password has been generated - Your device does not support opting out of battery optimization - Show password - Registration failed: Try again later - Registration failed: Password too weak - Create group chat - Create Group Chat - Join or create group chat - Subject - Choose participants - Creating group chat… - Invite again - Short - Medium - Long - Broadcast Last User Interaction - Let all your contacts know when you use Conversations - Privacy - Theme - Select the color palette - Light theme - Dark theme - Green Background - Use green background for received messages - Unable to connect to OpenKeychain - This device is no longer in use - Computer - Mobile phone - Tablet - Web browser - Console - Payment required - Missing internet permission - Me - Contact asks for presence subscription - Allow - No permission to access %s - Remote server not found - Unable to update account - Missing presence subscription with %s. - Missing OMEMO keys from %s. - Missing OMEMO keys - This is not a private, non-anonymous group chat. - There are no members in this group chat. - Report this JID as sending unwanted messages. - Delete OMEMO identities - Regenerate your OMEMO keys. All your contacts will have to verify you again. Use this only as a last resort. - Delete selected keys - You need to be connected to publish your avatar. - Show error message - Error Message - Data saver enabled - Your operating system is restricting Conversations from accessing the Internet when in background. To receive notifications of new messages you should allow Conversations unrestricted access when Data saver is on.\nConversations will still make an effort to save data when possible. - Your device does not support disabling Data saver for Conversations. - Unable to create temporary file - This device has been verified - Copy fingerprint - All OMEMO keys have been verified - Barcode does not contain fingerprints for this conversation. - Verified fingerprints - Use the camera to scan a contact’s barcode - Please wait for keys to be fetched - Share as Barcode - Share as XMPP URI - Share as HTTP link - Blind Trust Before Verification - Automatically trust all new devices of contacts that haven’t been verified before, and prompt for manual confirmation each time a verified contact adds a new device. - Blindly trusted OMEMO keys - Untrusted - Invalid 2D barcode - Clean cache folder (used by Camera Application) - Clean cache - Clean private storage - Clean private storage where files are kept (They can be re-downloaded from the server) - I followed this link from a trusted source - You are about to verify the OMEMO keys of %1$s after clicking a link. This is only secure if you followed this link from a trusted source where only %2$s could have published this link. - Verify OMEMO keys - Show inactive - Hide inactive - Distrust device - Are you sure you want to remove the verification for this device?\nThis device and messages coming from that device will be marked as untrusted. - - %d second - %d seconds - - - %d minute - %d minutes - - - %d hour - %d hours - - - %d day - %d days - - - %d week - %d weeks - - - %d month - %d months - - Automatic message deletion - Automatically delete messages from this device that are older than the configured time frame. - Encrypting message - Not fetching messages due to local retention period. - Compressing video - Corresponding conversations closed. - Contact blocked. - Notifications from strangers - Notify for messages received from strangers. - Received message from stranger - Block stranger - Block entire domain - online right now - Retry decryption - Session failure - Downgraded SASL mechanism - Server requires registration on website - Open website - No application found to open website - Heads-up Notifications - Show Heads-up Notifications - Today - Yesterday - Validate hostname with DNSSEC - Server certificates that contain the validated hostname are considered verified - Network is unreachable - Certificate does not contain a Jabber ID - partial + Settings + New conversation + Manage accounts + End this conversation + Contact details + Group chat details + Secure conversation + Add account + Edit name + Add to address book + Delete from roster + Block contact + Unblock contact + Block domain + Unblock domain + Manage Accounts + Settings + Share with Conversation + Start Conversation + Choose Contact + Share via account + Block list + just now + 1 min ago + %d mins ago + unread Conversations + sending… + Decrypting message. Please wait… + OpenPGP encrypted message + Nickname is already in use + Invalid nickname + Admin + Owner + Moderator + Participant + Visitor + Would you like to remove %s from your roster? The conversation associated with this contact will not be removed. + Would you like to block %s from sending you messages? + Would you like to unblock %s and allow them to send you messages? + Block all contacts from %s? + Unblock all contacts from %s? + Contact blocked + Would you like to remove %s as a bookmark? The conversation associated with this bookmark will not be removed. + Register new account on server + Change password on server + Share with… + Start conversation + Invite contact + Contacts + Contact + Cancel + Set + Add + Edit + Delete + Block + Unblock + Save + OK + Conversations has crashed + By sending in stack traces you are helping the ongoing development of Conversations\nWarning: This will use your XMPP account to send the stack trace to the developer. + Send now + Never ask again + Unable to connect to account + Unable to connect to multiple accounts + Touch here to manage your accounts + Attach file + The contact is not in your roster. Would you like to add it? + Add contact + delivery failed + Preparing image for transmission + Preparing images for transmission + Sharing files. Please wait… + Clear history + Clear Conversation History + Do you want to delete all messages within this Conversation?\n\nWarning: This will not influence messages stored on other devices or servers. + Delete messages + End this conversation afterwards + Choose device + Send unencrypted message + Send message + Send message to %s + Send OTR encrypted message + Send OMEMO encrypted message + Send v\\OMEMO encrypted message + Send OpenPGP encrypted message + Your nickname has been changed + Send unencrypted + Decryption failed. Maybe you don’t have the proper private key. + OpenKeychain + Conversations utilizes a third party app called OpenKeychain to encrypt and decrypt messages and to manage your public keys.\n\nOpenKeychain is licensed under GPLv3 and available on F-Droid and Google Play.\n\n(Please restart Conversations afterwards.) + Restart + Install + Please install OpenKeychain + offering… + waiting… + No OpenPGP Key found + Conversations is unable to encrypt your messages because your contact is not announcing his or hers public key.\n\nPlease ask your contact to setup OpenPGP. + No OpenPGP Keys found + Conversations is unable to encrypt your messages because your contacts are not announcing their public key.\n\nPlease ask your contacts to setup OpenPGP. + General + Accept files + Automatically accept files smaller than… + Attachments + Quick Sharing + Immediately return to previous activity instead of opening the conversation after sharing something + Notification + Notifications + Notify when a new message arrives + Vibrate + Vibrate when a new message arrives + LED Notification + Blink notification light when a new message arrives + Ringtone + Play sound when a new message arrives + Grace Period + The length of time Conversations keeps quiet after seeing activity on another device + Advanced + Never send crash reports + By sending in stack traces you are helping the ongoing development of Conversations + Confirm Messages + Let your contacts know when you have received and read their messages + UI + OpenKeychain reported an error + Accept + An error has occurred + Your account + Send presence updates + Receive presence updates + Ask for presence updates + Choose picture + Take picture + Preemptively grant subscription request + The file you selected is not an image + Error while converting the image file + File not found + General I/O error. Maybe you ran out of storage space? + The app you used to select this image did not provide us with enough permissions to read the file.\n\nUse a different file manager to choose an image + Unknown + Temporarily disabled + Online + Connecting\u2026 + Offline + Unauthorized + Server not found + No connectivity + Registration failed + Username already in use + Registration completed + Server does not support registration + TLS negotiation failed + Policy violation + Incompatible server + Stream error + Unencrypted + OTR + OpenPGP + OMEMO + Delete account + Temporarily disable + Publish avatar + Publish OpenPGP public key + Remove OpenPGP public key + Are you sure you want to remove your OpenPGP public key from your presence announcement?\nYour contacts will no longer be able to send you OpenPGP encrypted messages. + OpenPGP public key has been published. + Enable account + Are you sure? + If you delete your account, your entire conversation history will be lost + Record voice + Jabber ID + Block Jabber ID + Password + username@example.com + Confirm password + Password + This is not a valid Jabber ID + Out of memory. Image is too large + Do you want to add %s to your address book? + Server info + XEP-0313: MAM + XEP-0280: Message Carbons + XEP-0352: Client State Indication + XEP-0191: Blocking Command + XEP-0237: Roster Versioning + XEP-0198: Stream Management + XEP-0163: PEP (Avatars / OMEMO) + XEP-0363: HTTP File Upload + XEP-0357: Push + available + unavailable + Missing public key announcements + last seen just now + last seen 1 minute ago + last seen %d minutes ago + last seen 1 hour ago + last seen %d hours ago + last seen 1 day ago + last seen %d days ago + Encrypted message. Please install OpenKeychain to decrypt. + Unknown OTR fingerprint + OpenPGP encrypted messages found + Your fingerprint + OTR fingerprint + OTR fingerprint of message + OpenPGP Key ID + OMEMO fingerprint + v\\OMEMO fingerprint + OMEMO fingerprint of message + v\\OMEMO fingerprint of message + Other devices + Trust OMEMO Fingerprints + Fetching keys… + Done + Verify + Decrypt + Group chats + Search + Create contact + Create Contact + Enter Contact + Join group chat + Join Group Chat + Delete contact + View contact details + Block contact + Unblock contact + Create + Select + The contact already exists + Join + Group chat address + room@conference.example.com/nick + Save as bookmark + Delete bookmark + This bookmark already exists + Edit group chat subject + The subject of this group chat + Joining group chat… + Leave + Contact added you to contact list + Add back + %s has read up to this point + %s have read up to this point + %1$s +%2$d more have read up to this point + Publish + Touch avatar to select picture from gallery + Publishing… + The server rejected your publication + Something went wrong while converting your picture + Could not save avatar to disk + (Or long press to bring back default) + Your server does not support the publication of avatars + whispered + to %s + Send private message to %s + Connect + This account already exists + Next + Current session established + Skip + Disable notifications + Enable + Group chat requires password + Enter password + Missing presence subscription + Please request presence updates from your contact first.\n\nThis will be used to determine what client(s) your contact is using. + Request now + Delete Fingerprint + Are you sure you would like to delete this fingerprint? + Ignore + Warning: Sending this without mutual presence updates could cause unexpected problems.\n\nGo to contact details to verify your presence subscriptions. + Security + Allow message correction + Allow your contacts to retroactively edit their messages + Expert settings + Please be careful with these + About Conversations + Build and licensing information + Quiet Hours + Start time + End time + Enable quiet hours + Notifications will be silenced during quiet hours + Send button indicates status + Request message receipts + Received messages will be marked with a green tick if supported + Colorize send button to indicate contact status + Other + Group chat name + Use subject instead of JID to identify group chats + Automatically join group chats + Respect the autojoin flag in group chat bookmarks + OTR fingerprint copied to clipboard! + OMEMO fingerprint copied to clipboard! + You are banned from this group chat + This group chat is members only + You have been kicked from this group chat + The group chat was shut down + You are no longer in this group chat + using account %s + Checking %s on HTTP host + You are not connected. Try again later + Check %s size + Check %1$s size on %2$s + Message options + Quote + Copy original URL + Send again + File URL + URL copied to clipboard + Scan 2D Barcode + Show 2D Barcode + Show block list + Account details + Verify OTR + Remote Fingerprint + Hint or Question + Shared Secret + Confirm + In progress + Respond + Secrets do not match + Try again + Finish + Verified! + Contact requested SMP verification + No valid OTR session has been found! + Conversations + Keep service in foreground + Prevents the operating system from killing your connection + Export history + Write conversations history logs to SD card + Writing logs to SD card + Choose file + Receiving %1$s (%2$d%% completed) + Download %s + Delete %s + file + Open %s + sending (%1$d%% completed) + Preparing file for transmission + %s offered for download + Cancel transmission + file transmission failed + The file has been deleted + No application found to open file + No application found to open link + Could not verify fingerprint + Manually verify + Are you sure that you want to verify your contact’s OTR fingerprint? + Dynamic Tags + Display read-only tags underneath contacts + Enable notifications + No group chat server found + Group chat creation failed! + Account avatar + Copy OTR fingerprint to clipboard + Copy OMEMO fingerprint to clipboard + Regenerate OMEMO key + Clear devices + Are you sure you want to clear all other devices from the OMEMO announcement? The next time your devices connect, they will reannounce themselves, but they might not receive messages sent in the meantime. + There are no usable keys available for this contact.\nFetching new keys from the server has been unsuccessful. Maybe there is something wrong with your contact’s server. + There are no usable keys available for this contact.\nMake sure you have mutual presence subscription. + There are no usable keys available for this contact. If you have purged any of their keys, they need to generate new ones. + Something went wrong + Fetching history from server + No more history on server + Updating… + Password changed! + Could not change password + Send a message to start an encrypted chat + Ask question + If you and your contact have a secret in common that no one else knows (like an inside joke or simply what you had for lunch the last time you met) you can use that secret to verify each other’s fingerprints.\n\nYou provide a hint or a question for your contact who will respond with a case-sensitive answer. + Your contact would like to verify your fingerprint by challenging you with a shared secret. Your contact provided the following hint or question for that secret. + Your hint should not be empty + Your shared secret can not be empty + Carefully compare the fingerprint shown below with the fingerprint of your contact.\nYou can use any trusted form of communication like an encrypted e-mail or a telephone call to exchange those. + Change password + Current password + New password + Password should not be empty + Enable all accounts + Disable all accounts + Perform action with + No affiliation + Offline + Outcast + Member + Advanced mode + Grant membership + Revoke membership + Grant admin privileges + Revoke admin privileges + Remove from group chat + Could not change affiliation of %s + Ban from group chat + You are trying to remove %s from a public group chat. The only way to do that is to ban that user for ever. + Ban now + Could not change role of %s + Publicly accessible group chat + Private, members only group chat + Group chat options + Private, members only + Non-anonymous + Moderated + You are not participating + Modified group chat options! + Could not modify group chat options + Never + Until further notice + Snooze + Reply + Mark as read + Input + Enter is send + Use enter key to send message + Show enter key + Change the emoticons key to an enter key + audio + video + image + PDF document + Android App + Contact + Received %s + Disable foreground service + Touch to open Conversations + Avatar has been published! + Sending %s + Offering %s + Hide offline + %s is typing… + %s has stopped typing + %s are typing… + %s have stopped typing + Typing notifications + Let your contacts know when you are writing messages to them + Send location + Show location + No application found to display location + Location + Received location + Conversation closed + Left group chat + Don’t trust system CAs + All certificates must be manually approved + Remove certificates + Delete manually approved certificates + No manually approved certificates + Remove certificates + Delete selection + Cancel + + %d certificate deleted + %d certificates deleted + + + Select %d contact + Select %d contacts + + Replace send button with quick action + Quick Action + None + Most recently used + Choose quick action + Search for contacts or groups + Send private message + %1$s has left the group chat! + Username + Username + This is not a valid username + Download failed: Server not found + Download failed: File not found + Download failed: Could not connect to host + Download failed: Could not write file + Tor network unavailable + Bind failure + Server not responsible for domain + Broken + Availability + Away when screen is off + Marks your resource as away when the screen is turned off + “Do not disturb” in silent mode + Marks your resource as “Do not disturb” when device is in silent mode + Treat vibrate as silent mode + Marks your resource as “Do not disturb” when device is on vibrate + Extended connection settings + Show hostname and port settings when setting up an account + xmpp.example.com + Add account with certificate + Unable to parse certificate + Leave empty to authenticate w/ certificate + Archiving preferences + Server-side archiving preferences + Fetching archiving preferences. Please wait… + Unable to fetch archiving preferences + Captcha required + Enter the text from the image above + Certificate chain is not trusted + Jabber ID does not match certificate + Renew certificate + Error fetching OMEMO key! + Verified OMEMO key with certificate! + Your device does not support the selection of client certificates! + Connection + Connect via Tor + Tunnel all connections through the Tor network. Requires Orbot + Hostname + Port + Server- or .onion-Address + This is not a valid port number + This is not a valid hostname + %1$d of %2$d accounts connected + + %d message + %d messages + + Load more messages + Shared file with %s + Shared image with %s + Shared images with %s + Shared text with %s + Conversations needs access to external storage + Conversations needs access to the camera + Synchronize with contacts + Conversations wants to match your XMPP roster with your contacts to show their full names and avatars.\n\nConversations will only read your contacts and match them locally without uploading them to your server.\n\nYou will now be asked to grant permission to access your contacts. + Certificate Information + Subject + Issuer + Common Name + Organization + SHA-1 + (Not available) + No certificate found + Notify on all messages + Notify only when mentioned + Notifications disabled + Notifications paused + Compress Pictures + Resize and compress pictures + Always + Automatically + Battery optimizations enabled + Your device is doing some heavy battery optimizations on Conversations that might lead to delayed notifications or even message loss.\nIt is recommended to disable those. + Your device is doing some heavy battery optimizations on Conversations that might lead to delayed notifications or even message loss.\n\nYou will now be asked to disable those. + Disable + The selected area is too large + (No activated accounts) + This field is required + Correct message + Send corrected message + You already trust this contact. By selecting \'done\' you are just confirming that %s is part of this group chat. + Select image and crop + You have disabled this account + Security error: Invalid file access + No application found to share URI + Share URI with… + Join the Conversation + Jabber is a provider independent instant messaging network. You can use this client with what ever Jabber server you choose.\nHowever for your convenience we made it easy to create an account on conversations.im¹; a provider specially suited for the use with Conversations. + We will guide you through the process of creating an account on conversations.im.¹\nWhen picking conversations.im as a provider you will be able to communicate with users of other providers by giving them your full Jabber ID. + Your full Jabber ID will be: %s + Create Account + Use my own provider + Pick your username + Manage availability manually + Set your availability when editing your status message. + Change Presence + Status message + Set for all accounts on this device + Free for Chat + Online + Away + Not Available + Busy + A secure password has been generated + Your device does not support opting out of battery optimization + Show password + Registration failed: Try again later + Registration failed: Password too weak + Create group chat + Create Group Chat + Join or create group chat + Subject + Choose participants + Creating group chat… + Invite again + Short + Medium + Long + Broadcast Last User Interaction + Let all your contacts know when you use Conversations + Privacy + Theme + Select the color palette + Light theme + Dark theme + Green Background + Use green background for received messages + Unable to connect to OpenKeychain + This device is no longer in use + Computer + Mobile phone + Tablet + Web browser + Console + Payment required + Missing internet permission + Me + Contact asks for presence subscription + Allow + No permission to access %s + Remote server not found + Unable to update account + Missing presence subscription with %s. + Missing OMEMO keys from %s. + Missing OMEMO keys + This is not a private, non-anonymous group chat. + There are no members in this group chat. + Report this JID as sending unwanted messages. + Delete OMEMO identities + Regenerate your OMEMO keys. All your contacts will have to verify you again. Use this only as a last resort. + Delete selected keys + You need to be connected to publish your avatar. + Show error message + Error Message + Data saver enabled + Your operating system is restricting Conversations from accessing the Internet when in background. To receive notifications of new messages you should allow Conversations unrestricted access when Data saver is on.\nConversations will still make an effort to save data when possible. + Your device does not support disabling Data saver for Conversations. + Unable to create temporary file + This device has been verified + Copy fingerprint + All OMEMO keys have been verified + Barcode does not contain fingerprints for this conversation. + Verified fingerprints + Use the camera to scan a contact’s barcode + Please wait for keys to be fetched + Share as Barcode + Share as XMPP URI + Share as HTTP link + Blind Trust Before Verification + Automatically trust all new devices of contacts that haven’t been verified before, and prompt for manual confirmation each time a verified contact adds a new device. + Blindly trusted OMEMO keys + Untrusted + Invalid 2D barcode + Clean cache folder (used by Camera Application) + Clean cache + Clean private storage + Clean private storage where files are kept (They can be re-downloaded from the server) + I followed this link from a trusted source + You are about to verify the OMEMO keys of %1$s after clicking a link. This is only secure if you followed this link from a trusted source where only %2$s could have published this link. + Verify OMEMO keys + Show inactive + Hide inactive + Distrust device + Are you sure you want to remove the verification for this device?\nThis device and messages coming from that device will be marked as untrusted. + + %d second + %d seconds + + + %d minute + %d minutes + + + %d hour + %d hours + + + %d day + %d days + + + %d week + %d weeks + + + %d month + %d months + + Automatic message deletion + Automatically delete messages from this device that are older than the configured time frame. + Encrypting message + Not fetching messages due to local retention period. + Compressing video + Corresponding conversations closed. + Contact blocked. + Notifications from strangers + Notify for messages received from strangers. + Received message from stranger + Block stranger + Block entire domain + online right now + Retry decryption + Session failure + Downgraded SASL mechanism + Server requires registration on website + Open website + No application found to open website + Heads-up Notifications + Show Heads-up Notifications + Today + Yesterday + Validate hostname with DNSSEC + Server certificates that contain the validated hostname are considered verified + Network is unreachable + Certificate does not contain a Jabber ID + partial Record video - Copy to clipboard - Message copied to clipboard - Message - Private messages are disabled - Protected Apps - To keep receiving notifications, even when the screen is turned off, you need to add Conversations to the list of protected apps. - Accept Unknown Certificate? - The server certificate is not signed by a known Certificate Authority. - The server certificate is expired. - Accept Mismatching Server Name? - Server could not authenticate as \"%s\". The certificate is only valid for: - Do you want to connect anyway? - Certificate details: - Certificate Verification - Once + Copy to clipboard + Message copied to clipboard + Message + Private messages are disabled + Protected Apps + To keep receiving notifications, even when the screen is turned off, you need to add Conversations to the list of protected apps. + Accept Unknown Certificate? + The server certificate is not signed by a known Certificate Authority. + The server certificate is expired. + Accept Mismatching Server Name? + Server could not authenticate as \"%s\". The certificate is only valid for: + Do you want to connect anyway? + Certificate details: + Certificate Verification + Once The QR code scanner needs access to the camera Scroll to bottom - Scroll down after sending a message + Scroll down after sending a message Edit Status Message - Edit status message + Edit status message Disable encryption - Conversations is unable to send encrypted messages to %1$s. This may be due to your contact using an outdated server or client that can not handle OMEMO. - Unable to fetch device list - Unable to fetch device bundles - Hint: In some cases this can be fixed by adding each other your contact lists. - Are you sure you want to disable OMEMO encryption for this conversation?\nThis will allow your server administrator to read your messages, but it might be the only way to communicate with people using outdated clients. - Disable now + Conversations is unable to send encrypted messages to %1$s. This may be due to your contact using an outdated server or client that can not handle OMEMO. + Unable to fetch device list + Unable to fetch device bundles + Hint: In some cases this can be fixed by adding each other your contact lists. + Are you sure you want to disable OMEMO encryption for this conversation?\nThis will allow your server administrator to read your messages, but it might be the only way to communicate with people using outdated clients. + Disable now Draft: OMEMO Encryption - OMEMO will always be used for one-on-one and private group chats. - OMEMO will be used by default for new conversations. - OMEMO will have to be turned on explicitly for new conversations. - Create Shortcut - Font Size - The relative font size used within the app. - On by default - Off by default - Small - Medium - Large + OMEMO will always be used for one-on-one and private group chats. + OMEMO will be used by default for new conversations. + OMEMO will have to be turned on explicitly for new conversations. + Create Shortcut + Font Size + The relative font size used within the app. + On by default + Off by default + Small + Medium + Large + Message was not encrypted for this device.