aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/eu/siacs/conversations/crypto/PgpDecryptionService.java
diff options
context:
space:
mode:
authorlookshe <github@lookshe.org>2016-02-11 10:45:27 +0100
committerlookshe <github@lookshe.org>2016-02-11 10:45:27 +0100
commit3824eb172ba9a4a6b9ea84b0d1045591bc4fa0e3 (patch)
tree0286423f053440a5900732032e35810d6cc076c6 /src/main/java/eu/siacs/conversations/crypto/PgpDecryptionService.java
parentcec1b0f1f8d3976ab6a437ff4584ac039b64fa9a (diff)
parentae83efe4a6c1b3349147904eee200f0b617741c3 (diff)
Merge tag '1.9.3' into trz/merge_1.9.3
Conflicts: .travis.yml CHANGELOG.md README.md art/render.rb build.gradle libs/openpgp-api-lib/build.gradle settings.gradle src/main/AndroidManifest.xml src/main/java/eu/siacs/conversations/Config.java src/main/java/eu/siacs/conversations/crypto/OtrService.java src/main/java/eu/siacs/conversations/crypto/PgpEngine.java src/main/java/eu/siacs/conversations/entities/Account.java src/main/java/eu/siacs/conversations/entities/Contact.java src/main/java/eu/siacs/conversations/entities/Conversation.java src/main/java/eu/siacs/conversations/entities/DownloadableFile.java src/main/java/eu/siacs/conversations/entities/Message.java src/main/java/eu/siacs/conversations/entities/MucOptions.java src/main/java/eu/siacs/conversations/entities/Transferable.java src/main/java/eu/siacs/conversations/generator/AbstractGenerator.java src/main/java/eu/siacs/conversations/generator/IqGenerator.java src/main/java/eu/siacs/conversations/generator/MessageGenerator.java src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java src/main/java/eu/siacs/conversations/http/HttpConnectionManager.java src/main/java/eu/siacs/conversations/http/HttpDownloadConnection.java src/main/java/eu/siacs/conversations/http/HttpUploadConnection.java src/main/java/eu/siacs/conversations/parser/AbstractParser.java src/main/java/eu/siacs/conversations/parser/IqParser.java src/main/java/eu/siacs/conversations/parser/MessageParser.java src/main/java/eu/siacs/conversations/parser/PresenceParser.java src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java src/main/java/eu/siacs/conversations/persistance/FileBackend.java src/main/java/eu/siacs/conversations/services/AbstractConnectionManager.java src/main/java/eu/siacs/conversations/services/AvatarService.java src/main/java/eu/siacs/conversations/services/MessageArchiveService.java src/main/java/eu/siacs/conversations/services/NotificationService.java src/main/java/eu/siacs/conversations/services/XmppConnectionService.java src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java src/main/java/eu/siacs/conversations/ui/ConversationActivity.java src/main/java/eu/siacs/conversations/ui/ConversationFragment.java src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java src/main/java/eu/siacs/conversations/ui/SettingsActivity.java src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java src/main/java/eu/siacs/conversations/ui/XmppActivity.java src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java src/main/java/eu/siacs/conversations/utils/CryptoHelper.java src/main/java/eu/siacs/conversations/utils/DNSHelper.java src/main/java/eu/siacs/conversations/utils/ExceptionHelper.java src/main/java/eu/siacs/conversations/utils/MimeUtils.java src/main/java/eu/siacs/conversations/utils/PhoneHelper.java src/main/java/eu/siacs/conversations/utils/UIHelper.java src/main/java/eu/siacs/conversations/utils/Xmlns.java src/main/java/eu/siacs/conversations/xml/XmlReader.java src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java src/main/java/eu/siacs/conversations/xmpp/jingle/JingleSocks5Transport.java src/main/java/eu/siacs/conversations/xmpp/stanzas/MessagePacket.java src/main/res/drawable-hdpi/ic_launcher.png src/main/res/drawable-hdpi/ic_notification.png src/main/res/drawable-mdpi/ic_launcher.png src/main/res/drawable-mdpi/ic_notification.png src/main/res/drawable-xhdpi/ic_launcher.png src/main/res/drawable-xhdpi/ic_notification.png src/main/res/drawable-xxhdpi/ic_launcher.png src/main/res/drawable-xxhdpi/ic_notification.png src/main/res/drawable-xxxhdpi/ic_launcher.png src/main/res/drawable-xxxhdpi/ic_notification.png src/main/res/layout/account_row.xml src/main/res/layout/activity_about.xml src/main/res/layout/activity_change_password.xml src/main/res/layout/activity_contact_details.xml src/main/res/layout/activity_edit_account.xml src/main/res/layout/activity_muc_details.xml src/main/res/layout/activity_publish_profile_picture.xml src/main/res/layout/activity_verify_otr.xml src/main/res/layout/contact.xml src/main/res/layout/contact_key.xml src/main/res/layout/conversation_list_row.xml src/main/res/layout/enter_jid_dialog.xml src/main/res/layout/fragment_conversation.xml src/main/res/layout/join_conference_dialog.xml src/main/res/layout/message_received.xml src/main/res/layout/message_sent.xml src/main/res/layout/message_status.xml src/main/res/layout/quickedit.xml src/main/res/values-ar-rEG/strings.xml src/main/res/values-bg/strings.xml src/main/res/values-ca/strings.xml src/main/res/values-cs/strings.xml src/main/res/values-de/strings.xml src/main/res/values-el/strings.xml src/main/res/values-es/strings.xml src/main/res/values-eu/strings.xml src/main/res/values-fa-rIR/strings.xml src/main/res/values-fr/strings.xml src/main/res/values-id/strings.xml src/main/res/values-it/strings.xml src/main/res/values-iw/strings.xml src/main/res/values-ja/strings.xml src/main/res/values-ko/strings.xml src/main/res/values-nl/strings.xml src/main/res/values-pl/strings.xml src/main/res/values-pt/strings.xml src/main/res/values-ru/strings.xml src/main/res/values-sk/strings.xml src/main/res/values-sr/strings.xml src/main/res/values-sv/strings.xml src/main/res/values-v21/themes.xml src/main/res/values-zh-rCN/strings.xml src/main/res/values/arrays.xml src/main/res/values/colors.xml src/main/res/values/dimens.xml src/main/res/values/strings.xml src/main/res/values/themes.xml src/main/res/xml/preferences.xml
Diffstat (limited to 'src/main/java/eu/siacs/conversations/crypto/PgpDecryptionService.java')
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/PgpDecryptionService.java162
1 files changed, 162 insertions, 0 deletions
diff --git a/src/main/java/eu/siacs/conversations/crypto/PgpDecryptionService.java b/src/main/java/eu/siacs/conversations/crypto/PgpDecryptionService.java
new file mode 100644
index 00000000..ed67dc65
--- /dev/null
+++ b/src/main/java/eu/siacs/conversations/crypto/PgpDecryptionService.java
@@ -0,0 +1,162 @@
+package eu.siacs.conversations.crypto;
+
+import android.app.PendingIntent;
+
+import eu.siacs.conversations.entities.Message;
+import eu.siacs.conversations.services.XmppConnectionService;
+import eu.siacs.conversations.ui.UiCallback;
+
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class PgpDecryptionService {
+
+ private final XmppConnectionService xmppConnectionService;
+ private final ConcurrentHashMap<String, List<Message>> messages = new ConcurrentHashMap<>();
+ private final ConcurrentHashMap<String, Boolean> decryptingMessages = new ConcurrentHashMap<>();
+ private Boolean keychainLocked = false;
+ private final Object keychainLockedLock = new Object();
+
+ public PgpDecryptionService(XmppConnectionService xmppConnectionService) {
+ this.xmppConnectionService = xmppConnectionService;
+ }
+
+ public void add(Message message) {
+ if (isRunning()) {
+ decryptDirectly(message);
+ } else {
+ store(message);
+ }
+ }
+
+ public void addAll(List<Message> messagesList) {
+ if (!messagesList.isEmpty()) {
+ String conversationUuid = messagesList.get(0).getConversation().getUuid();
+ if (!messages.containsKey(conversationUuid)) {
+ List<Message> list = Collections.synchronizedList(new LinkedList<Message>());
+ messages.put(conversationUuid, list);
+ }
+ synchronized (messages.get(conversationUuid)) {
+ messages.get(conversationUuid).addAll(messagesList);
+ }
+ decryptAllMessages();
+ }
+ }
+
+ public void onKeychainUnlocked() {
+ synchronized (keychainLockedLock) {
+ keychainLocked = false;
+ }
+ decryptAllMessages();
+ }
+
+ public void onKeychainLocked() {
+ synchronized (keychainLockedLock) {
+ keychainLocked = true;
+ }
+ xmppConnectionService.updateConversationUi();
+ }
+
+ public void onOpenPgpServiceBound() {
+ decryptAllMessages();
+ }
+
+ public boolean isRunning() {
+ synchronized (keychainLockedLock) {
+ return !keychainLocked;
+ }
+ }
+
+ private void store(Message message) {
+ if (messages.containsKey(message.getConversation().getUuid())) {
+ messages.get(message.getConversation().getUuid()).add(message);
+ } else {
+ List<Message> messageList = Collections.synchronizedList(new LinkedList<Message>());
+ messageList.add(message);
+ messages.put(message.getConversation().getUuid(), messageList);
+ }
+ }
+
+ private void decryptAllMessages() {
+ for (String uuid : messages.keySet()) {
+ decryptMessages(uuid);
+ }
+ }
+
+ private void decryptMessages(final String uuid) {
+ synchronized (decryptingMessages) {
+ Boolean decrypting = decryptingMessages.get(uuid);
+ if ((decrypting != null && !decrypting) || decrypting == null) {
+ decryptingMessages.put(uuid, true);
+ decryptMessage(uuid);
+ }
+ }
+ }
+
+ private void decryptMessage(final String uuid) {
+ Message message = null;
+ synchronized (messages.get(uuid)) {
+ while (!messages.get(uuid).isEmpty()) {
+ if (messages.get(uuid).get(0).getEncryption() == Message.ENCRYPTION_PGP) {
+ if (isRunning()) {
+ message = messages.get(uuid).remove(0);
+ }
+ break;
+ } else {
+ messages.get(uuid).remove(0);
+ }
+ }
+ if (message != null && xmppConnectionService.getPgpEngine() != null) {
+ xmppConnectionService.getPgpEngine().decrypt(message, new UiCallback<Message>() {
+
+ @Override
+ public void userInputRequried(PendingIntent pi, Message message) {
+ messages.get(uuid).add(0, message);
+ decryptingMessages.put(uuid, false);
+ }
+
+ @Override
+ public void success(Message message) {
+ xmppConnectionService.updateConversationUi();
+ decryptMessage(uuid);
+ }
+
+ @Override
+ public void error(int error, Message message) {
+ message.setEncryption(Message.ENCRYPTION_DECRYPTION_FAILED);
+ xmppConnectionService.updateConversationUi();
+ decryptMessage(uuid);
+ }
+ });
+ } else {
+ decryptingMessages.put(uuid, false);
+ }
+ }
+ }
+
+ private void decryptDirectly(final Message message) {
+ if (message.getEncryption() == Message.ENCRYPTION_PGP && xmppConnectionService.getPgpEngine() != null) {
+ xmppConnectionService.getPgpEngine().decrypt(message, new UiCallback<Message>() {
+
+ @Override
+ public void userInputRequried(PendingIntent pi, Message message) {
+ store(message);
+ }
+
+ @Override
+ public void success(Message message) {
+ xmppConnectionService.updateConversationUi();
+ xmppConnectionService.getNotificationService().updateNotification(false);
+ }
+
+ @Override
+ public void error(int error, Message message) {
+ message.setEncryption(Message.ENCRYPTION_DECRYPTION_FAILED);
+ xmppConnectionService.updateConversationUi();
+ }
+ });
+ }
+ }
+}