process authorization id in case full jid changes
This commit is contained in:
parent
3fac7d4992
commit
4f92ba880b
|
@ -118,8 +118,7 @@ public interface Jid extends Comparable<Jid>, Serializable, CharSequence {
|
||||||
static Jid ofEscaped(CharSequence jid) {
|
static Jid ofEscaped(CharSequence jid) {
|
||||||
try {
|
try {
|
||||||
return new WrappedJid(JidCreate.from(jid));
|
return new WrappedJid(JidCreate.from(jid));
|
||||||
} catch (XmppStringprepException e) {
|
} catch (final XmppStringprepException e) {
|
||||||
e.printStackTrace();
|
|
||||||
throw new IllegalArgumentException(e);
|
throw new IllegalArgumentException(e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -470,61 +470,10 @@ public class XmppConnection implements Runnable {
|
||||||
switchOverToTls();
|
switchOverToTls();
|
||||||
} else if (nextTag.isStart("success")) {
|
} else if (nextTag.isStart("success")) {
|
||||||
final Element success = tagReader.readElement(nextTag);
|
final Element success = tagReader.readElement(nextTag);
|
||||||
final SaslMechanism.Version version;
|
if (processSuccess(success)) {
|
||||||
try {
|
|
||||||
version = SaslMechanism.Version.of(success);
|
|
||||||
} catch (final IllegalArgumentException e) {
|
|
||||||
throw new StateChangingException(Account.State.INCOMPATIBLE_SERVER);
|
|
||||||
}
|
|
||||||
final String challenge;
|
|
||||||
if (version == SaslMechanism.Version.SASL) {
|
|
||||||
challenge = success.getContent();
|
|
||||||
} else if (version == SaslMechanism.Version.SASL_2) {
|
|
||||||
challenge = success.findChildContent("additional-data");
|
|
||||||
} else {
|
|
||||||
throw new AssertionError("Missing implementation for " + version);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
saslMechanism.getResponse(challenge);
|
|
||||||
} catch (final SaslMechanism.AuthenticationException e) {
|
|
||||||
Log.e(Config.LOGTAG, String.valueOf(e));
|
|
||||||
throw new StateChangingException(Account.State.UNAUTHORIZED);
|
|
||||||
}
|
|
||||||
Log.d(
|
|
||||||
Config.LOGTAG,
|
|
||||||
account.getJid().asBareJid().toString()
|
|
||||||
+ ": logged in (using "
|
|
||||||
+ version
|
|
||||||
+ ")");
|
|
||||||
account.setKey(
|
|
||||||
Account.PINNED_MECHANISM_KEY, String.valueOf(saslMechanism.getPriority()));
|
|
||||||
if (version == SaslMechanism.Version.SASL_2) {
|
|
||||||
final String authorizationIdentifier =
|
|
||||||
success.findChildContent("authorization-identifier");
|
|
||||||
Log.d(
|
|
||||||
Config.LOGTAG,
|
|
||||||
account.getJid().asBareJid()
|
|
||||||
+ ": SASL 2.0 authorization identifier was "
|
|
||||||
+ authorizationIdentifier);
|
|
||||||
final Element resumed = success.findChild("resumed", "urn:xmpp:sm:3");
|
|
||||||
final Element failed = success.findChild("failed", "urn:xmpp:sm:3");
|
|
||||||
if (resumed != null && streamId != null) {
|
|
||||||
processResumed(resumed);
|
|
||||||
} else if (failed != null) {
|
|
||||||
processFailed(failed, false); // wait for new stream features
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (version == SaslMechanism.Version.SASL) {
|
|
||||||
tagReader.reset();
|
|
||||||
sendStartStream();
|
|
||||||
final Tag tag = tagReader.readTag();
|
|
||||||
if (tag != null && tag.isStart("stream")) {
|
|
||||||
processStream();
|
|
||||||
} else {
|
|
||||||
throw new StateChangingException(Account.State.STREAM_OPENING_ERROR);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (nextTag.isStart("failure", Namespace.TLS)) {
|
} else if (nextTag.isStart("failure", Namespace.TLS)) {
|
||||||
throw new StateChangingException(Account.State.TLS_ERROR);
|
throw new StateChangingException(Account.State.TLS_ERROR);
|
||||||
} else if (nextTag.isStart("failure")) {
|
} else if (nextTag.isStart("failure")) {
|
||||||
|
@ -679,6 +628,84 @@ public class XmppConnection implements Runnable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean processSuccess(final Element success) throws IOException, XmlPullParserException {
|
||||||
|
final SaslMechanism.Version version;
|
||||||
|
try {
|
||||||
|
version = SaslMechanism.Version.of(success);
|
||||||
|
} catch (final IllegalArgumentException e) {
|
||||||
|
throw new StateChangingException(Account.State.INCOMPATIBLE_SERVER);
|
||||||
|
}
|
||||||
|
final String challenge;
|
||||||
|
if (version == SaslMechanism.Version.SASL) {
|
||||||
|
challenge = success.getContent();
|
||||||
|
} else if (version == SaslMechanism.Version.SASL_2) {
|
||||||
|
challenge = success.findChildContent("additional-data");
|
||||||
|
} else {
|
||||||
|
throw new AssertionError("Missing implementation for " + version);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
saslMechanism.getResponse(challenge);
|
||||||
|
} catch (final SaslMechanism.AuthenticationException e) {
|
||||||
|
Log.e(Config.LOGTAG, String.valueOf(e));
|
||||||
|
throw new StateChangingException(Account.State.UNAUTHORIZED);
|
||||||
|
}
|
||||||
|
Log.d(
|
||||||
|
Config.LOGTAG,
|
||||||
|
account.getJid().asBareJid().toString()
|
||||||
|
+ ": logged in (using "
|
||||||
|
+ version
|
||||||
|
+ ")");
|
||||||
|
account.setKey(
|
||||||
|
Account.PINNED_MECHANISM_KEY, String.valueOf(saslMechanism.getPriority()));
|
||||||
|
if (version == SaslMechanism.Version.SASL_2) {
|
||||||
|
final String authorizationIdentifier =
|
||||||
|
success.findChildContent("authorization-identifier");
|
||||||
|
final Jid authorizationJid;
|
||||||
|
try {
|
||||||
|
authorizationJid = Strings.isNullOrEmpty(authorizationIdentifier) ? null : Jid.ofEscaped(authorizationIdentifier);
|
||||||
|
} catch (final IllegalArgumentException e) {
|
||||||
|
Log.d(Config.LOGTAG,account.getJid().asBareJid()+": SASL 2.0 authorization identifier was not a valid jid");
|
||||||
|
throw new StateChangingException(Account.State.BIND_FAILURE);
|
||||||
|
}
|
||||||
|
if (authorizationJid == null) {
|
||||||
|
throw new StateChangingException(Account.State.BIND_FAILURE);
|
||||||
|
}
|
||||||
|
Log.d(
|
||||||
|
Config.LOGTAG,
|
||||||
|
account.getJid().asBareJid()
|
||||||
|
+ ": SASL 2.0 authorization identifier was "
|
||||||
|
+ authorizationJid);
|
||||||
|
if (!account.getJid().getDomain().equals(authorizationJid.getDomain())) {
|
||||||
|
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": server tried to re-assign domain to " + authorizationJid.getDomain());
|
||||||
|
throw new StateChangingError(Account.State.BIND_FAILURE);
|
||||||
|
}
|
||||||
|
if (authorizationJid.isFullJid() && account.setJid(authorizationJid)) {
|
||||||
|
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": jid changed during SASL 2.0. updating database");
|
||||||
|
mXmppConnectionService.databaseBackend.updateAccount(account);
|
||||||
|
}
|
||||||
|
final Element resumed = success.findChild("resumed", "urn:xmpp:sm:3");
|
||||||
|
final Element failed = success.findChild("failed", "urn:xmpp:sm:3");
|
||||||
|
if (resumed != null && streamId != null) {
|
||||||
|
processResumed(resumed);
|
||||||
|
} else if (failed != null) {
|
||||||
|
processFailed(failed, false); // wait for new stream features
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (version == SaslMechanism.Version.SASL) {
|
||||||
|
tagReader.reset();
|
||||||
|
sendStartStream();
|
||||||
|
final Tag tag = tagReader.readTag();
|
||||||
|
if (tag != null && tag.isStart("stream")) {
|
||||||
|
processStream();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
throw new StateChangingException(Account.State.STREAM_OPENING_ERROR);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void processResumed(final Element resumed) throws StateChangingException {
|
private void processResumed(final Element resumed) throws StateChangingException {
|
||||||
this.inSmacksSession = true;
|
this.inSmacksSession = true;
|
||||||
this.isBound = true;
|
this.isBound = true;
|
||||||
|
|
Loading…
Reference in a new issue