Added support for username values

This commit is contained in:
M66B 2021-10-09 08:23:53 +02:00
parent 46714477bc
commit d8d972f6fd
2 changed files with 56 additions and 49 deletions

View File

@ -85,11 +85,12 @@ public class EmailProvider implements Parcelable {
public Server smtp = new Server(); public Server smtp = new Server();
public OAuth oauth; public OAuth oauth;
public UserType user = UserType.EMAIL; public UserType user = UserType.EMAIL;
public String username;
public StringBuilder documentation; // html public StringBuilder documentation; // html
enum Discover {ALL, IMAP, SMTP} enum Discover {ALL, IMAP, SMTP}
enum UserType {LOCAL, EMAIL} enum UserType {LOCAL, EMAIL, VALUE}
private static final int SCAN_TIMEOUT = 5 * 1000; // milliseconds private static final int SCAN_TIMEOUT = 5 * 1000; // milliseconds
private static final int ISPDB_TIMEOUT = 15 * 1000; // milliseconds private static final int ISPDB_TIMEOUT = 15 * 1000; // milliseconds
@ -182,6 +183,12 @@ public class EmailProvider implements Parcelable {
provider.user = UserType.LOCAL; provider.user = UserType.LOCAL;
else if ("email".equals(user)) else if ("email".equals(user))
provider.user = UserType.EMAIL; provider.user = UserType.EMAIL;
else {
if (!TextUtils.isEmpty(user)) {
provider.user = UserType.VALUE;
provider.username = user;
}
}
} else if ("imap".equals(name)) { } else if ("imap".equals(name)) {
provider.imap.score = 100; provider.imap.score = 100;
provider.imap.host = xml.getAttributeValue(null, "host"); provider.imap.host = xml.getAttributeValue(null, "host");
@ -585,8 +592,12 @@ public class EmailProvider implements Parcelable {
provider.user = UserType.EMAIL; provider.user = UserType.EMAIL;
else if ("%EMAILLOCALPART%".equals(username)) else if ("%EMAILLOCALPART%".equals(username))
provider.user = UserType.LOCAL; provider.user = UserType.LOCAL;
else else {
Log.w("Unknown username type=" + username); if (!TextUtils.isEmpty(username)) {
provider.user = UserType.VALUE;
provider.username = username;
}
}
} }
continue; continue;

View File

@ -54,6 +54,7 @@ import com.google.android.material.textfield.TextInputLayout;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.security.cert.X509Certificate; import java.security.cert.X509Certificate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@ -296,8 +297,15 @@ public class FragmentQuickSetup extends FragmentBase {
if (fail == null) if (fail == null)
args.putParcelable("provider", provider); args.putParcelable("provider", provider);
String user = (provider.user == EmailProvider.UserType.EMAIL ? email : username); List<String> users;
Log.i("User type=" + provider.user + " name=" + user); if (provider.user == EmailProvider.UserType.LOCAL)
users = Arrays.asList(username, email);
else if (provider.user == EmailProvider.UserType.VALUE)
users = Arrays.asList(provider.username, email, username);
else
users = Arrays.asList(email, username);
Log.i("User type=" + provider.user +
" users=" + TextUtils.join(", ", users));
List<EntityFolder> folders; List<EntityFolder> folders;
String imap_fingerprint = null; String imap_fingerprint = null;
@ -305,55 +313,43 @@ public class FragmentQuickSetup extends FragmentBase {
X509Certificate imap_certificate = null; X509Certificate imap_certificate = null;
X509Certificate smtp_certificate = null; X509Certificate smtp_certificate = null;
String user = null;
String aprotocol = (provider.imap.starttls ? "imap" : "imaps"); String aprotocol = (provider.imap.starttls ? "imap" : "imaps");
int aencryption = (provider.imap.starttls ? EmailService.ENCRYPTION_STARTTLS : EmailService.ENCRYPTION_SSL); int aencryption = (provider.imap.starttls ? EmailService.ENCRYPTION_STARTTLS : EmailService.ENCRYPTION_SSL);
try (EmailService iservice = new EmailService( try (EmailService iservice = new EmailService(
context, aprotocol, null, aencryption, false, EmailService.PURPOSE_CHECK, true)) { context, aprotocol, null, aencryption, false, EmailService.PURPOSE_CHECK, true)) {
try { List<Throwable> exceptions = new ArrayList<>();
iservice.connect( for (int i = 0; i < users.size(); i++) {
provider.imap.host, provider.imap.port, user = users.get(i);
AUTH_TYPE_PASSWORD, null, Log.i("Trying with user=" + user);
user, password, try {
null, null); iservice.connect(
} catch (EmailService.UntrustedException ex) { provider.imap.host, provider.imap.port,
imap_certificate = ex.getCertificate(); AUTH_TYPE_PASSWORD, null,
imap_fingerprint = EntityCertificate.getKeyFingerprint(imap_certificate); user, password,
iservice.connect( null, null);
provider.imap.host, provider.imap.port, break;
AUTH_TYPE_PASSWORD, null, } catch (EmailService.UntrustedException ex) {
user, password, imap_certificate = ex.getCertificate();
null, imap_fingerprint); imap_fingerprint = EntityCertificate.getKeyFingerprint(imap_certificate);
} catch (Throwable ex) { iservice.connect(
Log.w(ex); provider.imap.host, provider.imap.port,
// Why not AuthenticationFailedException? AUTH_TYPE_PASSWORD, null,
// Some providers terminate the connection with an invalid username user, password,
if (user.equals(username)) null, imap_fingerprint);
throw ex; break;
else } catch (Throwable ex) {
try { Log.w(ex);
user = username; // Why not AuthenticationFailedException?
Log.i("Retry with user=" + user); // Some providers terminate the connection with an invalid username
iservice.connect( exceptions.add(ex);
provider.imap.host, provider.imap.port, if (i + 1 == users.size()) {
AUTH_TYPE_PASSWORD, null, for (Throwable e : exceptions)
user, password, if (e instanceof AuthenticationFailedException)
null, null); throw ex;
} catch (EmailService.UntrustedException ex1) { throw exceptions.get(0);
imap_certificate = ex1.getCertificate();
imap_fingerprint = EntityCertificate.getKeyFingerprint(imap_certificate);
iservice.connect(
provider.imap.host, provider.imap.port,
AUTH_TYPE_PASSWORD, null,
user, password,
null, imap_fingerprint);
} catch (Throwable ex1) {
Log.w(ex1);
if (!(ex instanceof AuthenticationFailedException) &&
ex1 instanceof AuthenticationFailedException)
throw ex1;
else
throw ex;
} }
}
} }
folders = iservice.getFolders(); folders = iservice.getFolders();