From fa351734ecf1f3219f8a83603368e36636926951 Mon Sep 17 00:00:00 2001 From: Christian Schneppe Date: Sat, 16 Dec 2017 22:38:45 +0100 Subject: try to detect invalid nick (w/ emoji) in MUCs --- .../de/pixart/messenger/entities/MucOptions.java | 1 + .../de/pixart/messenger/parser/PresenceParser.java | 45 ++++++++++++++++------ .../pixart/messenger/ui/ConversationFragment.java | 2 + src/main/res/values/strings.xml | 1 + 4 files changed, 37 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/main/java/de/pixart/messenger/entities/MucOptions.java b/src/main/java/de/pixart/messenger/entities/MucOptions.java index 67c02b543..f1c3aa9e8 100644 --- a/src/main/java/de/pixart/messenger/entities/MucOptions.java +++ b/src/main/java/de/pixart/messenger/entities/MucOptions.java @@ -140,6 +140,7 @@ public class MucOptions { MEMBERS_ONLY, KICKED, SHUTDOWN, + INVALID_NICK, UNKNOWN } diff --git a/src/main/java/de/pixart/messenger/parser/PresenceParser.java b/src/main/java/de/pixart/messenger/parser/PresenceParser.java index 2bb7e6aac..f020c314a 100644 --- a/src/main/java/de/pixart/messenger/parser/PresenceParser.java +++ b/src/main/java/de/pixart/messenger/parser/PresenceParser.java @@ -70,10 +70,7 @@ public class PresenceParser extends AbstractParser implements || ((codes.isEmpty() || codes.contains(MucOptions.STATUS_CODE_ROOM_CREATED)) && jid.equals(item.getAttributeAsJid("jid")))) { mucOptions.setOnline(); mucOptions.setSelf(user); - if (mucOptions.onRenameListener != null) { - mucOptions.onRenameListener.onSuccess(); - mucOptions.onRenameListener = null; - } + invokeRenameListener(mucOptions, true); } boolean isNew = mucOptions.updateUser(user); final AxolotlService axolotlService = conversation.getAccount().getAxolotlService(); @@ -141,26 +138,50 @@ public class PresenceParser extends AbstractParser implements } } } else if (type.equals("error")) { - Element error = packet.findChild("error"); - if (error != null && error.hasChild("conflict")) { + final Element error = packet.findChild("error"); + if (error == null) { + return; + } + if (error.hasChild("conflict")) { if (mucOptions.online()) { - if (mucOptions.onRenameListener != null) { - mucOptions.onRenameListener = null; - } + invokeRenameListener(mucOptions, false); } else { mucOptions.setError(MucOptions.Error.NICK_IN_USE); } - } else if (error != null && error.hasChild("not-authorized")) { + } else if (error.hasChild("not-authorized")) { mucOptions.setError(MucOptions.Error.PASSWORD_REQUIRED); - } else if (error != null && error.hasChild("forbidden")) { + } else if (error.hasChild("forbidden")) { mucOptions.setError(MucOptions.Error.BANNED); - } else if (error != null && error.hasChild("registration-required")) { + } else if (error.hasChild("registration-required")) { mucOptions.setError(MucOptions.Error.MEMBERS_ONLY); + } else { + final String text = error.findChildContent("text"); + if (text != null && text.contains("attribute 'to'")) { + if (mucOptions.online()) { + invokeRenameListener(mucOptions, false); + } else { + mucOptions.setError(MucOptions.Error.INVALID_NICK); + } + } else { + mucOptions.setError(MucOptions.Error.UNKNOWN); + Log.d(Config.LOGTAG, "unknown error in conference: " + packet); + } } } } } + private static void invokeRenameListener(final MucOptions options, boolean success) { + if (options.onRenameListener != null) { + if (success) { + options.onRenameListener.onSuccess(); + } else { + options.onRenameListener.onFailure(); + } + options.onRenameListener = null; + } + } + private static List getStatusCodes(Element x) { List codes = new ArrayList<>(); if (x != null) { diff --git a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java index 5413dcf6f..c37c5cee7 100644 --- a/src/main/java/de/pixart/messenger/ui/ConversationFragment.java +++ b/src/main/java/de/pixart/messenger/ui/ConversationFragment.java @@ -1144,6 +1144,8 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa activity.xmppConnectionService.joinMuc(conversation); //showSnackbar(R.string.conference_unknown_error, R.string.try_again, joinMuc); break; + case INVALID_NICK: + showSnackbar(R.string.invalid_muc_nick, R.string.edit, clickToMuc); case SHUTDOWN: showSnackbar(R.string.conference_shutdown, R.string.try_again, joinMuc); break; diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 05420f06e..84e4e0d51 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -746,4 +746,5 @@ If message encryption is available, you should use it. If you don\'t use message encryption, show a warning message inside the chat. Use integrated emojis Use the integrated emoji library instead of using your devices ones. Changes will be available after reopening the app. + Invalid nickname -- cgit v1.2.3