mirror of
https://github.com/M66B/FairEmail.git
synced 2026-04-02 23:26:12 +02:00
Check fingerprint server certificates
This commit is contained in:
@@ -127,6 +127,7 @@ public class FragmentAccount extends FragmentBase {
|
||||
private ContentLoadingProgressBar pbSave;
|
||||
private CheckBox cbIdentity;
|
||||
private TextView tvError;
|
||||
private CheckBox cbTrust;
|
||||
private Button btnHelp;
|
||||
private Button btnSupport;
|
||||
private TextView tvInstructions;
|
||||
@@ -229,6 +230,7 @@ public class FragmentAccount extends FragmentBase {
|
||||
cbIdentity = view.findViewById(R.id.cbIdentity);
|
||||
|
||||
tvError = view.findViewById(R.id.tvError);
|
||||
cbTrust = view.findViewById(R.id.cbTrust);
|
||||
btnHelp = view.findViewById(R.id.btnHelp);
|
||||
btnSupport = view.findViewById(R.id.btnSupport);
|
||||
tvInstructions = view.findViewById(R.id.tvInstructions);
|
||||
@@ -271,6 +273,7 @@ public class FragmentAccount extends FragmentBase {
|
||||
etUser.setText(null);
|
||||
tilPassword.getEditText().setText(null);
|
||||
etRealm.setText(null);
|
||||
cbTrust.setChecked(false);
|
||||
|
||||
etName.setText(position > 1 ? provider.name : null);
|
||||
etInterval.setText(provider.keepalive > 0 ? Integer.toString(provider.keepalive) : null);
|
||||
@@ -432,6 +435,7 @@ public class FragmentAccount extends FragmentBase {
|
||||
pbSave.setVisibility(View.GONE);
|
||||
cbIdentity.setVisibility(View.GONE);
|
||||
|
||||
cbTrust.setVisibility(View.GONE);
|
||||
btnHelp.setVisibility(View.GONE);
|
||||
btnSupport.setVisibility(View.GONE);
|
||||
tvInstructions.setVisibility(View.GONE);
|
||||
@@ -499,6 +503,7 @@ public class FragmentAccount extends FragmentBase {
|
||||
args.putString("user", etUser.getText().toString());
|
||||
args.putString("password", tilPassword.getEditText().getText().toString());
|
||||
args.putString("realm", etRealm.getText().toString());
|
||||
args.putString("fingerprint", cbTrust.isChecked() ? (String) cbTrust.getTag() : null);
|
||||
|
||||
new SimpleTask<CheckResult>() {
|
||||
@Override
|
||||
@@ -535,6 +540,7 @@ public class FragmentAccount extends FragmentBase {
|
||||
String user = args.getString("user");
|
||||
String password = args.getString("password");
|
||||
String realm = args.getString("realm");
|
||||
String fingerprint = args.getString("fingerprint");
|
||||
|
||||
if (host.contains(":")) {
|
||||
Uri h = Uri.parse(host);
|
||||
@@ -562,7 +568,7 @@ public class FragmentAccount extends FragmentBase {
|
||||
// Check IMAP server / get folders
|
||||
String protocol = "imap" + (starttls ? "" : "s");
|
||||
try (MailService iservice = new MailService(context, protocol, realm, insecure, true, true)) {
|
||||
iservice.connect(host, Integer.parseInt(port), auth, user, password);
|
||||
iservice.connect(host, Integer.parseInt(port), auth, user, password, fingerprint);
|
||||
|
||||
result.idle = iservice.hasCapability("IDLE");
|
||||
|
||||
@@ -639,6 +645,9 @@ public class FragmentAccount extends FragmentBase {
|
||||
|
||||
setFolders(result.folders, result.account);
|
||||
|
||||
if (!cbTrust.isChecked())
|
||||
cbTrust.setVisibility(View.GONE);
|
||||
|
||||
new Handler().post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@@ -701,6 +710,7 @@ public class FragmentAccount extends FragmentBase {
|
||||
args.putString("user", etUser.getText().toString());
|
||||
args.putString("password", tilPassword.getEditText().getText().toString());
|
||||
args.putString("realm", etRealm.getText().toString());
|
||||
args.putString("fingerprint", cbTrust.isChecked() ? (String) cbTrust.getTag() : null);
|
||||
|
||||
args.putString("name", etName.getText().toString());
|
||||
args.putInt("color", btnColor.getColor());
|
||||
@@ -760,6 +770,7 @@ public class FragmentAccount extends FragmentBase {
|
||||
String user = args.getString("user").trim();
|
||||
String password = args.getString("password");
|
||||
String realm = args.getString("realm");
|
||||
String fingerprint = args.getString("fingerprint");
|
||||
|
||||
String name = args.getString("name");
|
||||
Integer color = args.getInt("color");
|
||||
@@ -846,6 +857,8 @@ public class FragmentAccount extends FragmentBase {
|
||||
return true;
|
||||
if (!Objects.equals(account.realm, realm))
|
||||
return true;
|
||||
if (!Objects.equals(account.fingerprint, fingerprint))
|
||||
return true;
|
||||
if (!Objects.equals(account.name, name))
|
||||
return true;
|
||||
if (!Objects.equals(account.color, color))
|
||||
@@ -916,7 +929,8 @@ public class FragmentAccount extends FragmentBase {
|
||||
!account.port.equals(Integer.parseInt(port)) ||
|
||||
!account.user.equals(user) ||
|
||||
!account.password.equals(password) ||
|
||||
!Objects.equals(realm, accountRealm)));
|
||||
!Objects.equals(realm, accountRealm) ||
|
||||
!Objects.equals(account.fingerprint, fingerprint)));
|
||||
Log.i("Account check=" + check);
|
||||
|
||||
Long last_connected = null;
|
||||
@@ -928,7 +942,7 @@ public class FragmentAccount extends FragmentBase {
|
||||
if (check) {
|
||||
String protocol = "imap" + (starttls ? "" : "s");
|
||||
try (MailService iservice = new MailService(context, protocol, realm, insecure, true, true)) {
|
||||
iservice.connect(host, Integer.parseInt(port), auth, user, password);
|
||||
iservice.connect(host, Integer.parseInt(port), auth, user, password, fingerprint);
|
||||
|
||||
for (Folder ifolder : iservice.getStore().getDefaultFolder().list("*")) {
|
||||
// Check folder attributes
|
||||
@@ -976,6 +990,7 @@ public class FragmentAccount extends FragmentBase {
|
||||
account.password = password;
|
||||
}
|
||||
account.realm = realm;
|
||||
account.fingerprint = fingerprint;
|
||||
|
||||
account.name = name;
|
||||
account.color = color;
|
||||
@@ -1160,6 +1175,13 @@ public class FragmentAccount extends FragmentBase {
|
||||
tvError.setText(Log.formatThrowable(ex, false));
|
||||
grpError.setVisibility(View.VISIBLE);
|
||||
|
||||
if (ex instanceof MailService.UntrustedException) {
|
||||
MailService.UntrustedException e = (MailService.UntrustedException) ex;
|
||||
cbTrust.setTag(e.getFingerprint());
|
||||
cbTrust.setText(getString(R.string.title_trust, e.getFingerprint()));
|
||||
cbTrust.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
final EmailProvider provider = (EmailProvider) spProvider.getSelectedItem();
|
||||
if (provider != null && provider.link != null) {
|
||||
Uri uri = Uri.parse(provider.link);
|
||||
@@ -1251,6 +1273,15 @@ public class FragmentAccount extends FragmentBase {
|
||||
tilPassword.getEditText().setText(account == null ? null : account.password);
|
||||
etRealm.setText(account == null ? null : account.realm);
|
||||
|
||||
if (account == null || account.fingerprint == null) {
|
||||
cbTrust.setTag(null);
|
||||
cbTrust.setChecked(false);
|
||||
} else {
|
||||
cbTrust.setTag(account.fingerprint);
|
||||
cbTrust.setChecked(true);
|
||||
cbTrust.setText(getString(R.string.title_trust, account.fingerprint));
|
||||
}
|
||||
|
||||
etName.setText(account == null ? null : account.name);
|
||||
btnColor.setColor(account == null ? null : account.color);
|
||||
|
||||
@@ -1556,10 +1587,14 @@ public class FragmentAccount extends FragmentBase {
|
||||
}
|
||||
}
|
||||
|
||||
cbIdentity.setChecked(account == null);
|
||||
|
||||
grpFolders.setVisibility(View.VISIBLE);
|
||||
btnSave.setVisibility(View.VISIBLE);
|
||||
cbIdentity.setVisibility(View.VISIBLE);
|
||||
cbIdentity.setChecked(account == null);
|
||||
|
||||
if (cbTrust.isChecked())
|
||||
cbTrust.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
private class CheckResult {
|
||||
|
||||
Reference in New Issue
Block a user