add more error states for stream errors

This commit is contained in:
Daniel Gultsch 2016-07-14 17:05:43 +02:00
parent 2803d342e1
commit 1db85e582e
3 changed files with 35 additions and 5 deletions

View file

@ -108,7 +108,9 @@ public class Account extends AbstractEntity {
TOR_NOT_AVAILABLE(true), TOR_NOT_AVAILABLE(true),
BIND_FAILURE(true), BIND_FAILURE(true),
HOST_UNKNOWN(true), HOST_UNKNOWN(true),
REGISTRATION_PLEASE_WAIT(true); REGISTRATION_PLEASE_WAIT(true),
STREAM_ERROR(true),
POLICY_VIOLATION(true);
private final boolean isError; private final boolean isError;
@ -158,8 +160,12 @@ public class Account extends AbstractEntity {
return R.string.account_status_bind_failure; return R.string.account_status_bind_failure;
case HOST_UNKNOWN: case HOST_UNKNOWN:
return R.string.account_status_host_unknown; return R.string.account_status_host_unknown;
case POLICY_VIOLATION:
return R.string.account_status_policy_violation;
case REGISTRATION_PLEASE_WAIT: case REGISTRATION_PLEASE_WAIT:
return R.string.registration_please_wait; return R.string.registration_please_wait;
case STREAM_ERROR:
return R.string.account_status_stream_error;
default: default:
return R.string.account_status_unknown; return R.string.account_status_unknown;
} }

View file

@ -361,6 +361,12 @@ public class XmppConnection implements Runnable {
this.changeStatus(Account.State.SERVER_NOT_FOUND); this.changeStatus(Account.State.SERVER_NOT_FOUND);
} catch (final SocksSocketFactory.SocksProxyNotFoundException e) { } catch (final SocksSocketFactory.SocksProxyNotFoundException e) {
this.changeStatus(Account.State.TOR_NOT_AVAILABLE); 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) { } catch (final IOException | XmlPullParserException | NoSuchAlgorithmException e) {
Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": " + e.getMessage()); Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": " + e.getMessage());
this.changeStatus(Account.State.OFFLINE); this.changeStatus(Account.State.OFFLINE);
@ -1176,17 +1182,21 @@ public class XmppConnection implements Runnable {
if (streamError == null) { if (streamError == null) {
return; return;
} }
Log.d(Config.LOGTAG,account.getJid().toBareJid()+": stream error "+streamError.toString());
if (streamError.hasChild("conflict")) { if (streamError.hasChild("conflict")) {
final String resource = account.getResource().split("\\.")[0]; final String resource = account.getResource().split("\\.")[0];
account.setResource(resource + "." + nextRandomId()); account.setResource(resource + "." + nextRandomId());
Log.d(Config.LOGTAG, Log.d(Config.LOGTAG,
account.getJid().toBareJid() + ": switching resource due to conflict (" account.getJid().toBareJid() + ": switching resource due to conflict ("
+ account.getResource() + ")"); + account.getResource() + ")");
throw new IOException();
} else if (streamError.hasChild("host-unknown")) { } 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 { 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 { public enum Identity {
FACEBOOK, FACEBOOK,
SLACK, SLACK,

View file

@ -158,7 +158,9 @@
<string name="account_status_regis_success">Registration completed</string> <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_regis_not_sup">Server does not support registration</string>
<string name="account_status_security_error">Security error</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_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_unencrypted">Unencrypted</string>
<string name="encryption_choice_otr">OTR</string> <string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string> <string name="encryption_choice_pgp">OpenPGP</string>
@ -546,7 +548,7 @@
<string name="pref_use_white_background_summary">Show received messages as black text on a white background</string> <string name="pref_use_white_background_summary">Show received messages as black text on a white background</string>
<string name="account_status_tor_unavailable">Tor network unavailable</string> <string name="account_status_tor_unavailable">Tor network unavailable</string>
<string name="account_status_bind_failure">Bind failure</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="server_info_broken">Broken</string>
<string name="pref_presence_settings">Presence</string> <string name="pref_presence_settings">Presence</string>
<string name="pref_away_when_screen_off">Away when screen is off</string> <string name="pref_away_when_screen_off">Away when screen is off</string>