diff options
7 files changed, 48 insertions, 12 deletions
diff --git a/src/main/java/de/pixart/messenger/entities/Conversation.java b/src/main/java/de/pixart/messenger/entities/Conversation.java index 52525e481..922ba614f 100644 --- a/src/main/java/de/pixart/messenger/entities/Conversation.java +++ b/src/main/java/de/pixart/messenger/entities/Conversation.java @@ -1057,6 +1057,18 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl } } + public int receivedMessagesCount() { + int count = 0; + synchronized (this.messages) { + for (Message message : messages) { + if (message.getStatus() == Message.STATUS_RECEIVED) { + ++count; + } + } + } + return count; + } + private int sentMessagesCount() { int count = 0; synchronized (this.messages) { diff --git a/src/main/java/de/pixart/messenger/http/HttpDownloadConnection.java b/src/main/java/de/pixart/messenger/http/HttpDownloadConnection.java index d49111dbf..722c1dea9 100644 --- a/src/main/java/de/pixart/messenger/http/HttpDownloadConnection.java +++ b/src/main/java/de/pixart/messenger/http/HttpDownloadConnection.java @@ -75,9 +75,9 @@ public class HttpDownloadConnection implements Transferable { this.message.setTransferable(this); try { if (message.hasFileOnRemoteHost()) { - mUrl = message.getFileParams().url; + mUrl = CryptoHelper.toHttpsUrl(message.getFileParams().url); } else { - mUrl = new URL(message.getBody()); + mUrl = CryptoHelper.toHttpsUrl(new URL(message.getBody())); } String[] parts = mUrl.getPath().toLowerCase().split("\\."); String lastPart = parts.length >= 1 ? parts[parts.length - 1] : null; @@ -97,8 +97,8 @@ public class HttpDownloadConnection implements Transferable { String filename = fileDateFormat.format(new Date(message.getTimeSent())) + "_" + message.getUuid().substring(0, 4); message.setRelativeFilePath(filename + "." + extension); this.file = mXmppConnectionService.getFileBackend().getFile(message, false); - String reference = mUrl.getRef(); - if (reference != null && reference.length() == 96) { + final String reference = mUrl.getRef(); + if (reference != null && reference.matches("([A-Fa-f0-9]{2}){48}")) { this.file.setKeyAndIv(CryptoHelper.hexToBytes(reference)); } @@ -342,7 +342,14 @@ public class HttpDownloadConnection implements Transferable { private void updateImageBounds() { message.setType(Message.TYPE_FILE); - mXmppConnectionService.getFileBackend().updateFileParams(message, mUrl); + final URL url; + final String ref = mUrl.getRef(); + if (ref != null && ref.matches("([A-Fa-f0-9]{2}){48}")) { + url = CryptoHelper.toAesGcmUrl(mUrl); + } else { + url = mUrl; + } + mXmppConnectionService.getFileBackend().updateFileParams(message, url); mXmppConnectionService.updateMessage(message); } diff --git a/src/main/java/de/pixart/messenger/parser/PresenceParser.java b/src/main/java/de/pixart/messenger/parser/PresenceParser.java index f87353ac7..cabac0d0a 100644 --- a/src/main/java/de/pixart/messenger/parser/PresenceParser.java +++ b/src/main/java/de/pixart/messenger/parser/PresenceParser.java @@ -53,6 +53,7 @@ public class PresenceParser extends AbstractParser implements private void processConferencePresence(PresencePacket packet, Conversation conversation) { MucOptions mucOptions = conversation.getMucOptions(); + final Jid jid = conversation.getAccount().getJid(); final Jid from = packet.getFrom(); if (!from.isBareJid()) { final String type = packet.getAttribute("type"); @@ -65,7 +66,7 @@ public class PresenceParser extends AbstractParser implements if (item != null && !from.isBareJid()) { mucOptions.setError(MucOptions.Error.NONE); MucOptions.User user = parseItem(conversation, item, from); - if (codes.contains(MucOptions.STATUS_CODE_SELF_PRESENCE)) { + if (codes.contains(MucOptions.STATUS_CODE_SELF_PRESENCE) || (codes.isEmpty() && jid.equals(item.getAttributeAsJid("jid")))) { mucOptions.setOnline(); mucOptions.setSelf(user); if (mucOptions.onRenameListener != null) { @@ -107,10 +108,8 @@ public class PresenceParser extends AbstractParser implements } } } else if (type.equals("unavailable")) { - if (codes.contains(MucOptions.STATUS_CODE_SELF_PRESENCE) || - packet.getFrom().equals(mucOptions.getConversation().getJid())) { + if (codes.contains(MucOptions.STATUS_CODE_SELF_PRESENCE)) { if (codes.contains(MucOptions.STATUS_CODE_KICKED)) { - } else if (codes.contains(MucOptions.STATUS_CODE_KICKED)) { mucOptions.setError(MucOptions.Error.KICKED); } else if (codes.contains(MucOptions.STATUS_CODE_BANNED)) { mucOptions.setError(MucOptions.Error.BANNED); diff --git a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java index 2a0aa62dd..02f9273c7 100644 --- a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java +++ b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java @@ -2450,6 +2450,7 @@ public class XmppConnectionService extends Service { public void onFetchFailed(final Conversation conversation, Element error) { if (error != null && "remote-server-not-found".equals(error.getName())) { conversation.getMucOptions().setError(MucOptions.Error.SERVER_NOT_FOUND); + updateConversationUi(); } else { join(conversation); fetchConferenceConfiguration(conversation); diff --git a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java index d8eb6eac2..5976bde02 100644 --- a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java +++ b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java @@ -1072,7 +1072,11 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa showSnackbar(R.string.joining_conference, 0, null); break; case SERVER_NOT_FOUND: - showSnackbar(R.string.remote_server_not_found, R.string.leave, leaveMuc); + if (conversation.receivedMessagesCount() > 0) { + showSnackbar(R.string.remote_server_not_found, R.string.try_again, joinMuc); + } else { + showSnackbar(R.string.remote_server_not_found, R.string.leave, leaveMuc); + } break; case PASSWORD_REQUIRED: showSnackbar(R.string.conference_requires_password, R.string.enter_password, enterPassword); @@ -1094,6 +1098,7 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa showSnackbar(R.string.conference_shutdown, R.string.join, joinMuc); break; default: + hideSnackbar(); break; } } else if (account.hasPendingPgpIntent(conversation)) { diff --git a/src/main/java/de/pixart/messenger/utils/CryptoHelper.java b/src/main/java/de/pixart/messenger/utils/CryptoHelper.java index 06fda4163..d15f4bef5 100644 --- a/src/main/java/de/pixart/messenger/utils/CryptoHelper.java +++ b/src/main/java/de/pixart/messenger/utils/CryptoHelper.java @@ -29,6 +29,7 @@ import de.pixart.messenger.Config; import de.pixart.messenger.R; import de.pixart.messenger.entities.Account; import de.pixart.messenger.entities.Message; +import de.pixart.messenger.http.AesGcmURLStreamHandler; import de.pixart.messenger.xmpp.jid.InvalidJidException; import de.pixart.messenger.xmpp.jid.Jid; @@ -238,7 +239,18 @@ public final class CryptoHelper { return url; } try { - return new URL("aesgcm" + url.toString().substring(url.getProtocol().length())); + return new URL(AesGcmURLStreamHandler.PROTOCOL_NAME + url.toString().substring(url.getProtocol().length())); + } catch (MalformedURLException e) { + return url; + } + } + + public static URL toHttpsUrl(URL url) { + if (!url.getProtocol().equalsIgnoreCase(AesGcmURLStreamHandler.PROTOCOL_NAME)) { + return url; + } + try { + return new URL("https" + url.toString().substring(url.getProtocol().length())); } catch (MalformedURLException e) { return url; } diff --git a/src/main/java/de/pixart/messenger/utils/UIHelper.java b/src/main/java/de/pixart/messenger/utils/UIHelper.java index 4f2c5a349..53727b8ee 100644 --- a/src/main/java/de/pixart/messenger/utils/UIHelper.java +++ b/src/main/java/de/pixart/messenger/utils/UIHelper.java @@ -253,7 +253,7 @@ public class UIHelper { } else if (previousWasNumber && (c == '.' || c == ',')) { previousWasNumber = false; } else { - return Character.isWhitespace(c) && previousWasNumber; + return (Character.isWhitespace(c) || c == '%' || c == '+') && previousWasNumber; } } return previousWasNumber; |