mirror of https://github.com/M66B/FairEmail.git
Use OAuth unique name as username
This commit is contained in:
parent
5224865375
commit
b770e11365
|
@ -404,12 +404,34 @@ public class FragmentOAuth extends FragmentBase {
|
|||
String aprotocol = (provider.imap.starttls ? "imap" : "imaps");
|
||||
int aencryption = (provider.imap.starttls ? EmailService.ENCRYPTION_STARTTLS : EmailService.ENCRYPTION_SSL);
|
||||
|
||||
String username = address;
|
||||
|
||||
if (accessToken != null) {
|
||||
// https://docs.microsoft.com/en-us/azure/active-directory/develop/access-tokens
|
||||
String[] segments = accessToken.split("\\.");
|
||||
if (segments.length > 1)
|
||||
try {
|
||||
String payload = new String(Base64.decode(segments[1], Base64.DEFAULT));
|
||||
EntityLog.log(context, "token payload=" + payload);
|
||||
JSONObject jpayload = new JSONObject(payload);
|
||||
if (jpayload.has("unique_name")) {
|
||||
String unique_name = jpayload.getString("unique_name");
|
||||
if (!TextUtils.isEmpty(unique_name) && !unique_name.equals(address)) {
|
||||
try (EmailService iservice = new EmailService(
|
||||
context, aprotocol, null, aencryption, false,
|
||||
EmailService.PURPOSE_CHECK, true)) {
|
||||
iservice.connect(
|
||||
provider.imap.host, provider.imap.port,
|
||||
EmailService.AUTH_TYPE_OAUTH, provider.id,
|
||||
unique_name, state,
|
||||
null, null);
|
||||
username = unique_name;
|
||||
Log.i("token unique_name=" + unique_name);
|
||||
} catch (Throwable ex) {
|
||||
Log.w(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Throwable ex) {
|
||||
Log.w(ex);
|
||||
}
|
||||
|
@ -423,57 +445,27 @@ public class FragmentOAuth extends FragmentBase {
|
|||
// https://jwt.ms/
|
||||
String payload = new String(Base64.decode(segments[1], Base64.DEFAULT));
|
||||
EntityLog.log(context, "jwt payload=" + payload);
|
||||
JSONObject jpayload = new JSONObject(payload);
|
||||
if (jpayload.has("email")) {
|
||||
String email = jpayload.getString("email");
|
||||
if (!TextUtils.isEmpty(email) && !email.equals(address)) {
|
||||
try (EmailService iservice = new EmailService(
|
||||
context, aprotocol, null, aencryption, false,
|
||||
EmailService.PURPOSE_CHECK, true)) {
|
||||
iservice.connect(
|
||||
provider.imap.host, provider.imap.port,
|
||||
EmailService.AUTH_TYPE_OAUTH, provider.id,
|
||||
email, state,
|
||||
null, null);
|
||||
address = email;
|
||||
Log.i("jwt email=" + email);
|
||||
} catch (Throwable ex) {
|
||||
Log.w(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (Throwable ex) {
|
||||
Log.e(ex);
|
||||
}
|
||||
}
|
||||
|
||||
String primaryEmail;
|
||||
List<Pair<String, String>> identities = new ArrayList<>();
|
||||
|
||||
if (askAccount) {
|
||||
primaryEmail = address;
|
||||
if (askAccount)
|
||||
identities.add(new Pair<>(address, personal));
|
||||
} else
|
||||
else
|
||||
throw new IllegalArgumentException("Unknown provider=" + id);
|
||||
|
||||
if (TextUtils.isEmpty(primaryEmail) || identities.size() == 0)
|
||||
throw new IllegalArgumentException("Primary email address not found");
|
||||
|
||||
if (!Helper.EMAIL_ADDRESS.matcher(primaryEmail).matches())
|
||||
throw new IllegalArgumentException(context.getString(R.string.title_email_invalid, primaryEmail));
|
||||
|
||||
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
|
||||
NetworkInfo ani = (cm == null ? null : cm.getActiveNetworkInfo());
|
||||
if (ani == null || !ani.isConnected())
|
||||
throw new IllegalArgumentException(context.getString(R.string.title_no_internet));
|
||||
|
||||
Log.i("OAuth email=" + primaryEmail);
|
||||
Log.i("OAuth username=" + username);
|
||||
for (Pair<String, String> identity : identities)
|
||||
Log.i("OAuth identity=" + identity.first + "/" + identity.second);
|
||||
|
||||
int at = primaryEmail.indexOf('@');
|
||||
String username = primaryEmail.substring(0, at);
|
||||
|
||||
List<EntityFolder> folders;
|
||||
|
||||
Log.i("OAuth checking IMAP provider=" + provider.id);
|
||||
|
@ -483,7 +475,7 @@ public class FragmentOAuth extends FragmentBase {
|
|||
iservice.connect(
|
||||
provider.imap.host, provider.imap.port,
|
||||
EmailService.AUTH_TYPE_OAUTH, provider.id,
|
||||
primaryEmail, state,
|
||||
username, state,
|
||||
null, null);
|
||||
|
||||
folders = iservice.getFolders();
|
||||
|
@ -500,7 +492,7 @@ public class FragmentOAuth extends FragmentBase {
|
|||
iservice.connect(
|
||||
provider.smtp.host, provider.smtp.port,
|
||||
EmailService.AUTH_TYPE_OAUTH, provider.id,
|
||||
primaryEmail, state,
|
||||
username, state,
|
||||
null, null);
|
||||
max_size = iservice.getMaxSize();
|
||||
}
|
||||
|
@ -521,10 +513,13 @@ public class FragmentOAuth extends FragmentBase {
|
|||
account.port = provider.imap.port;
|
||||
account.auth_type = EmailService.AUTH_TYPE_OAUTH;
|
||||
account.provider = provider.id;
|
||||
account.user = primaryEmail;
|
||||
account.user = username;
|
||||
account.password = state;
|
||||
|
||||
account.name = provider.name + "/" + username;
|
||||
int at = address.indexOf('@');
|
||||
String user = address.substring(0, at);
|
||||
|
||||
account.name = provider.name + "/" + user;
|
||||
|
||||
account.synchronize = true;
|
||||
account.primary = (primary == null);
|
||||
|
@ -574,7 +569,7 @@ public class FragmentOAuth extends FragmentBase {
|
|||
ident.port = provider.smtp.port;
|
||||
ident.auth_type = EmailService.AUTH_TYPE_OAUTH;
|
||||
ident.provider = provider.id;
|
||||
ident.user = primaryEmail;
|
||||
ident.user = username;
|
||||
ident.password = state;
|
||||
ident.synchronize = true;
|
||||
ident.primary = ident.user.equals(ident.email);
|
||||
|
|
Loading…
Reference in New Issue