diff options
-rw-r--r-- | src/main/java/eu/siacs/conversations/entities/Account.java | 8 | ||||
-rw-r--r-- | src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java | 28 | ||||
-rw-r--r-- | src/main/res/values/strings.xml | 4 |
3 files changed, 35 insertions, 5 deletions
diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java index 1707a6a95..8eb555331 100644 --- a/src/main/java/eu/siacs/conversations/entities/Account.java +++ b/src/main/java/eu/siacs/conversations/entities/Account.java @@ -107,7 +107,9 @@ public class Account extends AbstractEntity { TOR_NOT_AVAILABLE(true), BIND_FAILURE(true), HOST_UNKNOWN(true), - REGISTRATION_PLEASE_WAIT(true); + REGISTRATION_PLEASE_WAIT(true), + STREAM_ERROR(true), + POLICY_VIOLATION(true); private final boolean isError; @@ -157,8 +159,12 @@ public class Account extends AbstractEntity { return R.string.account_status_bind_failure; case HOST_UNKNOWN: return R.string.account_status_host_unknown; + case POLICY_VIOLATION: + return R.string.account_status_policy_violation; case REGISTRATION_PLEASE_WAIT: return R.string.registration_please_wait; + case STREAM_ERROR: + return R.string.account_status_stream_error; default: return R.string.account_status_unknown; } diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index 88765c147..a4476c052 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -374,6 +374,12 @@ public class XmppConnection implements Runnable { this.changeStatus(Account.State.SERVER_NOT_FOUND); } catch (final SocksSocketFactory.SocksProxyNotFoundException e) { this.changeStatus(Account.State.TOR_NOT_AVAILABLE); + } catch(final StreamErrorHostUnknown e) { + this.changeStatus(Account.State.HOST_UNKNOWN); + } catch(final StreamErrorPolicyViolation e) { + this.changeStatus(Account.State.POLICY_VIOLATION); + } catch(final StreamError e) { + this.changeStatus(Account.State.STREAM_ERROR); } catch (final IOException | XmlPullParserException | NoSuchAlgorithmException e) { Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": " + e.getMessage()); this.changeStatus(Account.State.OFFLINE); @@ -1189,17 +1195,21 @@ public class XmppConnection implements Runnable { if (streamError == null) { return; } - Log.d(Config.LOGTAG,account.getJid().toBareJid()+": stream error "+streamError.toString()); if (streamError.hasChild("conflict")) { final String resource = account.getResource().split("\\.")[0]; account.setResource(resource + "." + nextRandomId()); Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": switching resource due to conflict (" + account.getResource() + ")"); + throw new IOException(); } else if (streamError.hasChild("host-unknown")) { - changeStatus(Account.State.HOST_UNKNOWN); + throw new StreamErrorHostUnknown(); + } else if (streamError.hasChild("policy-violation")) { + throw new StreamErrorPolicyViolation(); + } else { + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": stream error "+streamError.toString()); + throw new StreamError(); } - forceCloseSocket(); } private void sendStartStream() throws IOException { @@ -1498,6 +1508,18 @@ public class XmppConnection implements Runnable { } + private class StreamErrorHostUnknown extends StreamError { + + } + + private class StreamErrorPolicyViolation extends StreamError { + + } + + private class StreamError extends IOException { + + } + public enum Identity { FACEBOOK, SLACK, diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 08c8b7fbf..da4cb8069 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -153,7 +153,9 @@ <string name="account_status_regis_success">Registration completed</string> <string name="account_status_regis_not_sup">Server does not support registration</string> <string name="account_status_security_error">Security error</string> + <string name="account_status_policy_violation">Policy violation</string> <string name="account_status_incompatible_server">Incompatible server</string> + <string name="account_status_stream_error">Stream error</string> <string name="encryption_choice_unencrypted">Unencrypted</string> <string name="encryption_choice_otr">OTR</string> <string name="encryption_choice_pgp">OpenPGP</string> @@ -529,7 +531,7 @@ <string name="download_started">Download started</string> <string name="account_status_tor_unavailable">Tor network unavailable</string> <string name="account_status_bind_failure">Bind failure</string> - <string name="account_status_host_unknown">Host unknown</string> + <string name="account_status_host_unknown">Server not responsible for domain</string> <string name="server_info_broken">Broken</string> <string name="pref_presence_settings">Presence</string> <string name="pref_away_when_screen_off">Away when screen is off</string> |