fixed some issues with jid escaping

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/ui/MagicCreateActivity.java       | 24 
src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java |  2 
src/main/java/eu/siacs/conversations/xml/Element.java                  |  3 
src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java          |  2 
4 files changed, 15 insertions(+), 16 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/ui/MagicCreateActivity.java 🔗

@@ -58,14 +58,14 @@ public class MagicCreateActivity extends XmppActivity implements TextWatcher {
 		mRandom = new SecureRandom();
 		Button next = findViewById(R.id.create_account);
 		next.setOnClickListener(v -> {
-			String username = mUsername.getText().toString();
-			if (username.contains("@") || username.length() < 3) {
-				mUsername.setError(getString(R.string.invalid_username));
-				mUsername.requestFocus();
-			} else {
-				mUsername.setError(null);
-				try {
-					Jid jid = Jid.of(username.toLowerCase(), Config.MAGIC_CREATE_DOMAIN, null);
+			try {
+				String username = mUsername.getText().toString();
+				Jid jid = Jid.of(username.toLowerCase(), Config.MAGIC_CREATE_DOMAIN, null);
+				if (!jid.getEscapedLocal().equals(jid.getLocal())|| username.length() < 3) {
+					mUsername.setError(getString(R.string.invalid_username));
+					mUsername.requestFocus();
+				} else {
+					mUsername.setError(null);
 					Account account = xmppConnectionService.findAccountByJid(jid);
 					if (account == null) {
 						account = new Account(jid, createPassword());
@@ -81,10 +81,10 @@ public class MagicCreateActivity extends XmppActivity implements TextWatcher {
 					Toast.makeText(MagicCreateActivity.this, R.string.secure_password_generated, Toast.LENGTH_SHORT).show();
 					WelcomeActivity.addInviteUri(intent, getIntent());
 					startActivity(intent);
-				} catch (IllegalArgumentException e) {
-					mUsername.setError(getString(R.string.invalid_username));
-					mUsername.requestFocus();
 				}
+			} catch (IllegalArgumentException e) {
+				mUsername.setError(getString(R.string.invalid_username));
+				mUsername.requestFocus();
 			}
 		});
 		mUsername.addTextChangedListener(this);
@@ -114,7 +114,7 @@ public class MagicCreateActivity extends XmppActivity implements TextWatcher {
 			try {
 				mFullJidDisplay.setVisibility(View.VISIBLE);
 				Jid jid = Jid.of(s.toString().toLowerCase(), Config.MAGIC_CREATE_DOMAIN, null);
-				mFullJidDisplay.setText(getString(R.string.your_full_jid_will_be, jid.toString()));
+				mFullJidDisplay.setText(getString(R.string.your_full_jid_will_be, jid.toEscapedString()));
 			} catch (IllegalArgumentException e) {
 				mFullJidDisplay.setVisibility(View.INVISIBLE);
 			}

src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java 🔗

@@ -369,7 +369,7 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU
 		Bookmark bookmark = (Bookmark) conferences.get(position);
 		Intent shareIntent = new Intent();
 		shareIntent.setAction(Intent.ACTION_SEND);
-		shareIntent.putExtra(Intent.EXTRA_TEXT, "xmpp:" + bookmark.getJid().asBareJid().toString() + "?join");
+		shareIntent.putExtra(Intent.EXTRA_TEXT, "xmpp:" + bookmark.getJid().asBareJid().toEscapedString() + "?join");
 		shareIntent.setType("text/plain");
 		try {
 			startActivity(Intent.createChooser(shareIntent, getText(R.string.share_uri_with)));

src/main/java/eu/siacs/conversations/xml/Element.java 🔗

@@ -151,9 +151,8 @@ public class Element {
 		final String jid = this.getAttribute(name);
 		if (jid != null && !jid.isEmpty()) {
 			try {
-				return Jid.of(jid);
+				return Jid.ofEscaped(jid);
 			} catch (final IllegalArgumentException e) {
-				Log.e(Config.LOGTAG, "could not parse jid " + jid);
 				return null;
 			}
 		}

src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java 🔗

@@ -1020,7 +1020,7 @@ public class XmppConnection implements Runnable {
 				final Element jid = bind.findChild("jid");
 				if (jid != null && jid.getContent() != null) {
 					try {
-						Jid assignedJid = Jid.of(jid.getContent());
+						Jid assignedJid = Jid.ofEscaped(jid.getContent());
 						if (!account.getJid().getDomain().equals(assignedJid.getDomain())) {
 							Log.d(Config.LOGTAG,account.getJid().asBareJid()+": server tried to re-assign domain to "+assignedJid.getDomain());
 							throw new StateChangingError(Account.State.BIND_FAILURE);