Added Yandex OAuth

pull/172/head
M66B 6 years ago
parent d5198043e6
commit 26a244ff15

@ -136,6 +136,7 @@ public class EmailProvider {
} else if ("oauth".equals(name)) { } else if ("oauth".equals(name)) {
provider.oauth = new OAuth(); provider.oauth = new OAuth();
provider.oauth.enabled = xml.getAttributeBooleanValue(null, "enabled", false); provider.oauth.enabled = xml.getAttributeBooleanValue(null, "enabled", false);
provider.oauth.askAccount = xml.getAttributeBooleanValue(null, "askAccount", false);
provider.oauth.clientId = xml.getAttributeValue(null, "clientId"); provider.oauth.clientId = xml.getAttributeValue(null, "clientId");
provider.oauth.clientSecret = xml.getAttributeValue(null, "clientSecret"); provider.oauth.clientSecret = xml.getAttributeValue(null, "clientSecret");
provider.oauth.scopes = xml.getAttributeValue(null, "scopes").split(","); provider.oauth.scopes = xml.getAttributeValue(null, "scopes").split(",");
@ -674,6 +675,7 @@ public class EmailProvider {
public static class OAuth { public static class OAuth {
boolean enabled; boolean enabled;
boolean askAccount;
String clientId; String clientId;
String clientSecret; String clientSecret;
String[] scopes; String[] scopes;

@ -28,6 +28,7 @@ import android.os.Bundle;
import android.os.Handler; import android.os.Handler;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Pair; import android.util.Pair;
import android.util.Patterns;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
@ -35,6 +36,7 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
@ -78,11 +80,14 @@ import static android.app.Activity.RESULT_OK;
public class FragmentOAuth extends FragmentBase { public class FragmentOAuth extends FragmentBase {
private String id; private String id;
private String name; private String name;
private boolean askAccount;
private ViewGroup view; private ViewGroup view;
private ScrollView scroll; private ScrollView scroll;
private TextView tvGrantHint; private TextView tvGrantHint;
private EditText etName;
private EditText etEmail;
private Button btnOAuth; private Button btnOAuth;
private ContentLoadingProgressBar pbOAuth; private ContentLoadingProgressBar pbOAuth;
private TextView tvAuthorized; private TextView tvAuthorized;
@ -103,6 +108,7 @@ public class FragmentOAuth extends FragmentBase {
Bundle args = getArguments(); Bundle args = getArguments();
id = args.getString("id"); id = args.getString("id");
name = args.getString("name"); name = args.getString("name");
askAccount = args.getBoolean("askAccount", false);
} }
@Override @Override
@ -116,6 +122,8 @@ public class FragmentOAuth extends FragmentBase {
// Get controls // Get controls
tvGrantHint = view.findViewById(R.id.tvGrantHint); tvGrantHint = view.findViewById(R.id.tvGrantHint);
etName = view.findViewById(R.id.etName);
etEmail = view.findViewById(R.id.etEmail);
btnOAuth = view.findViewById(R.id.btnOAuth); btnOAuth = view.findViewById(R.id.btnOAuth);
pbOAuth = view.findViewById(R.id.pbOAuth); pbOAuth = view.findViewById(R.id.pbOAuth);
tvAuthorized = view.findViewById(R.id.tvAuthorized); tvAuthorized = view.findViewById(R.id.tvAuthorized);
@ -145,6 +153,8 @@ public class FragmentOAuth extends FragmentBase {
// Initialize // Initialize
tvGrantHint.setText(getString(R.string.title_setup_oauth_rationale, name)); tvGrantHint.setText(getString(R.string.title_setup_oauth_rationale, name));
etName.setVisibility(askAccount ? View.VISIBLE : View.GONE);
etEmail.setVisibility(askAccount ? View.VISIBLE : View.GONE);
pbOAuth.setVisibility(View.GONE); pbOAuth.setVisibility(View.GONE);
tvAuthorized.setVisibility(View.GONE); tvAuthorized.setVisibility(View.GONE);
tvGmailHint.setVisibility("gmail".equals(id) ? View.VISIBLE : View.GONE); tvGmailHint.setVisibility("gmail".equals(id) ? View.VISIBLE : View.GONE);
@ -198,6 +208,19 @@ public class FragmentOAuth extends FragmentBase {
private void onAuthorize() { private void onAuthorize() {
try { try {
if (askAccount) {
String name = etName.getText().toString().trim();
String email = etEmail.getText().toString().trim();
if (TextUtils.isEmpty(name))
throw new IllegalArgumentException(getString(R.string.title_no_name));
if (TextUtils.isEmpty(email))
throw new IllegalArgumentException(getString(R.string.title_no_email));
if (!Patterns.EMAIL_ADDRESS.matcher(email).matches())
throw new IllegalArgumentException(getString(R.string.title_email_invalid, email));
}
btnOAuth.setEnabled(false); btnOAuth.setEnabled(false);
pbOAuth.setVisibility(View.VISIBLE); pbOAuth.setVisibility(View.VISIBLE);
hideError(); hideError();
@ -243,6 +266,9 @@ public class FragmentOAuth extends FragmentBase {
.setState(provider.id) .setState(provider.id)
.setAdditionalParameters(params); .setAdditionalParameters(params);
if (askAccount)
authRequestBuilder.setLoginHint(etEmail.getText().toString().trim());
// For offline access // For offline access
if ("gmail".equals(provider.id)) if ("gmail".equals(provider.id))
authRequestBuilder.setPrompt("consent"); authRequestBuilder.setPrompt("consent");
@ -326,6 +352,8 @@ public class FragmentOAuth extends FragmentBase {
args.putString("name", name); args.putString("name", name);
args.putString("token", accessToken); args.putString("token", accessToken);
args.putString("state", state.jsonSerializeString()); args.putString("state", state.jsonSerializeString());
args.putString("personal", etName.getText().toString().trim());
args.putString("address", etEmail.getText().toString().trim());
new SimpleTask<Void>() { new SimpleTask<Void>() {
@Override @Override
@ -334,6 +362,8 @@ public class FragmentOAuth extends FragmentBase {
String name = args.getString("name"); String name = args.getString("name");
String token = args.getString("token"); String token = args.getString("token");
String state = args.getString("state"); String state = args.getString("state");
String personal = args.getString("personal");
String address = args.getString("address");
String primaryEmail = null; String primaryEmail = null;
List<Pair<String, String>> identities = new ArrayList<>(); List<Pair<String, String>> identities = new ArrayList<>();
@ -413,6 +443,9 @@ public class FragmentOAuth extends FragmentBase {
identities.add(new Pair<>(email, displayName)); identities.add(new Pair<>(email, displayName));
} }
} }
} else if ("yandex".equals(id)) {
primaryEmail = address;
identities.add(new Pair<>(address, personal));
} else } else
throw new IllegalArgumentException("Unknown provider=" + id); throw new IllegalArgumentException("Unknown provider=" + id);

@ -176,7 +176,8 @@ public class FragmentSetup extends FragmentBase {
.add(Menu.NONE, -1, order++, getString(R.string.title_setup_oauth, provider.name)) .add(Menu.NONE, -1, order++, getString(R.string.title_setup_oauth, provider.name))
.setIntent(new Intent(ActivitySetup.ACTION_QUICK_OAUTH) .setIntent(new Intent(ActivitySetup.ACTION_QUICK_OAUTH)
.putExtra("id", provider.id) .putExtra("id", provider.id)
.putExtra("name", provider.name)); .putExtra("name", provider.name)
.putExtra("askAccount", provider.oauth.askAccount));
popupMenu.getMenu().add(Menu.NONE, R.string.title_setup_activesync, order++, R.string.title_setup_activesync); popupMenu.getMenu().add(Menu.NONE, R.string.title_setup_activesync, order++, R.string.title_setup_activesync);
popupMenu.getMenu().add(Menu.NONE, R.string.title_setup_other, order++, R.string.title_setup_other); popupMenu.getMenu().add(Menu.NONE, R.string.title_setup_other, order++, R.string.title_setup_other);

@ -23,6 +23,35 @@
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/etName"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:autofillHints="name"
android:hint="@string/title_identity_name"
android:imeOptions="actionNext"
android:inputType="textPersonName|textCapWords"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvGrantHint">
<requestFocus />
</EditText>
<EditText
android:id="@+id/etEmail"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:autofillHints="emailAddress"
android:hint="@string/title_identity_email"
android:imeOptions="actionNext"
android:inputType="textEmailAddress"
android:textAppearance="@style/TextAppearance.AppCompat.Medium"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/etName" />
<Button <Button
android:id="@+id/btnOAuth" android:id="@+id/btnOAuth"
android:layout_width="wrap_content" android:layout_width="wrap_content"
@ -31,7 +60,7 @@
android:tag="disable" android:tag="disable"
android:text="@string/title_setup_oauth_authorize" android:text="@string/title_setup_oauth_authorize"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tvGrantHint" /> app:layout_constraintTop_toBottomOf="@id/etEmail" />
<eu.faircode.email.ContentLoadingProgressBar <eu.faircode.email.ContentLoadingProgressBar
android:id="@+id/pbOAuth" android:id="@+id/pbOAuth"

@ -201,6 +201,7 @@
</provider> </provider>
<provider <provider
name="Yandex" name="Yandex"
id="yandex"
link="https://yandex.com/support/mail/mail-clients.html#imap"> link="https://yandex.com/support/mail/mail-clients.html#imap">
<imap <imap
host="imap.yandex.com" host="imap.yandex.com"
@ -211,10 +212,11 @@
port="465" port="465"
starttls="false" /> starttls="false" />
<oauth <oauth
askAccount="true"
authorizationEndpoint="https://oauth.yandex.com/authorize" authorizationEndpoint="https://oauth.yandex.com/authorize"
clientId="" clientId="a41b1a433d5041c39edebda5b866d2fc"
clientSecret="" clientSecret="03e6fb9c27374d5b81c612add522f6a0"
enabled="false" enabled="true"
redirectUri="https://oauth.faircode.eu/" redirectUri="https://oauth.faircode.eu/"
scopes="mail:imap_full,mail:smtp" scopes="mail:imap_full,mail:smtp"
tokenEndpoint="https://oauth.yandex.com/token" /> tokenEndpoint="https://oauth.yandex.com/token" />

Loading…
Cancel
Save