diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java
index 62c78cb6..446c2e0c 100644
--- a/src/main/java/eu/siacs/conversations/entities/Account.java
+++ b/src/main/java/eu/siacs/conversations/entities/Account.java
@@ -108,7 +108,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;
@@ -158,8 +160,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 a256e019..ba1482fe 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
@@ -361,6 +361,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);
@@ -1176,17 +1182,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 {
@@ -1485,6 +1495,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 f5a7675d..40e64b8b 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -158,7 +158,9 @@
Registration completed
Server does not support registration
Security error
+ Policy violation
Incompatible server
+ Stream error
Unencrypted
OTR
OpenPGP
@@ -546,7 +548,7 @@
Show received messages as black text on a white background
Tor network unavailable
Bind failure
- Host unknown
+ Server not responsible for domain
Broken
Presence
Away when screen is off