Check fingerprint server certificates

This commit is contained in:
M66B
2019-12-16 19:09:49 +01:00
parent 91d6eeada1
commit 500e1b0eef
15 changed files with 2140 additions and 49 deletions

View File

@@ -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 {