From b50658c2a2759e6bfc0eebd2f2158f5e411536d4 Mon Sep 17 00:00:00 2001 From: gaionim Date: Sun, 6 Sep 2015 10:05:58 +0200 Subject: [PATCH] If selected, send client certificate before password auth Changes seems harmless to me except userInfo pack and unpack. widget for client certificate is always visible all auth type ( I've tested only plain) sends cliantCertificateAlias for me works both with certificate ( my server) and without cert ( gmail) userInfo pack and unpack seems weak, but I lack skills to fix --- .../java/com/fsck/k9/mail/store/imap/ImapStore.java | 10 +++++++--- .../java/com/fsck/k9/mail/transport/SmtpTransport.java | 9 +++++++-- .../fsck/k9/activity/setup/AccountSetupIncoming.java | 6 ++++-- .../fsck/k9/activity/setup/AccountSetupOutgoing.java | 5 +++-- 4 files changed, 21 insertions(+), 9 deletions(-) diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStore.java b/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStore.java index 554a4a243e9..abf4247c9ce 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStore.java +++ b/k9mail-library/src/main/java/com/fsck/k9/mail/store/imap/ImapStore.java @@ -167,8 +167,7 @@ public static ImapStoreSettings decodeUri(String uri) { if (imapUri.getUserInfo() != null) { String userinfo = imapUri.getUserInfo(); String[] userInfoParts = userinfo.split(":"); - - if (userinfo.endsWith(":")) { + if (userinfo.endsWith("::")) { // Password is empty. This can only happen after an account was imported. authenticationType = AuthType.valueOf(userInfoParts[0]); username = decodeUtf8(userInfoParts[1]); @@ -185,6 +184,11 @@ public static ImapStoreSettings decodeUri(String uri) { } else { password = decodeUtf8(userInfoParts[2]); } + } else if (userInfoParts.length == 4) { + authenticationType = AuthType.valueOf(userInfoParts[0]); + username = decodeUtf8(userInfoParts[1]); + password = decodeUtf8(userInfoParts[2]); + clientCertificateAlias = decodeUtf8(userInfoParts[3]); } } @@ -247,7 +251,7 @@ public static String createUri(ServerSettings server) { if (authType == AuthType.EXTERNAL) { userInfo = authType.name() + ":" + userEnc + ":" + clientCertificateAliasEnc; } else { - userInfo = authType.name() + ":" + userEnc + ":" + passwordEnc; + userInfo = authType.name() + ":" + userEnc + ":" + passwordEnc + ":" + clientCertificateAliasEnc; } try { Map extra = server.getExtra(); diff --git a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/SmtpTransport.java b/k9mail-library/src/main/java/com/fsck/k9/mail/transport/SmtpTransport.java index 1e2ccec6a16..bc923bc7cf6 100644 --- a/k9mail-library/src/main/java/com/fsck/k9/mail/transport/SmtpTransport.java +++ b/k9mail-library/src/main/java/com/fsck/k9/mail/transport/SmtpTransport.java @@ -110,7 +110,12 @@ public static ServerSettings decodeUri(String uri) { } else { password = decodeUtf8(userInfoParts[1]); } - } + } else if (userInfoParts.length == 4) { + authType = AuthType.valueOf(userInfoParts[2]); + username = decodeUtf8(userInfoParts[0]); + password = decodeUtf8(userInfoParts[1]); + clientCertificateAlias = decodeUtf8(userInfoParts[3]); + } } return new ServerSettings(ServerSettings.Type.SMTP, host, port, connectionSecurity, @@ -157,7 +162,7 @@ public static String createUri(ServerSettings server) { if (AuthType.EXTERNAL == authType) { userInfo = userEnc + ":" + clientCertificateAliasEnc + ":" + authType.name(); } else { - userInfo = userEnc + ":" + passwordEnc + ":" + authType.name(); + userInfo = userEnc + ":" + passwordEnc + ":" + authType.name() + ":" + clientCertificateAliasEnc; } } else { userInfo = userEnc + ":" + passwordEnc; diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupIncoming.java b/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupIncoming.java index ca5013ad9d8..f4e5a726690 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupIncoming.java +++ b/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupIncoming.java @@ -397,8 +397,8 @@ private void updateViewFromAuthType() { // show password fields, hide client certificate fields mPasswordView.setVisibility(View.VISIBLE); mPasswordLabelView.setVisibility(View.VISIBLE); - mClientCertificateLabelView.setVisibility(View.GONE); - mClientCertificateSpinner.setVisibility(View.GONE); + mClientCertificateLabelView.setVisibility(View.VISIBLE); + mClientCertificateSpinner.setVisibility(View.VISIBLE); } } @@ -515,6 +515,7 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if (AuthType.EXTERNAL == authType) { clientCertificateAlias = mClientCertificateSpinner.getAlias(); } else { + clientCertificateAlias = mClientCertificateSpinner.getAlias(); password = mPasswordView.getText().toString(); } @@ -549,6 +550,7 @@ protected void onNext() { if (authType == AuthType.EXTERNAL) { clientCertificateAlias = mClientCertificateSpinner.getAlias(); } else { + clientCertificateAlias = mClientCertificateSpinner.getAlias(); password = mPasswordView.getText().toString(); } String host = mServerView.getText().toString(); diff --git a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupOutgoing.java b/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupOutgoing.java index 6380d3e5328..182b88068bd 100644 --- a/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupOutgoing.java +++ b/k9mail/src/main/java/com/fsck/k9/activity/setup/AccountSetupOutgoing.java @@ -343,8 +343,8 @@ private void updateViewFromAuthType() { // show password fields, hide client certificate fields mPasswordView.setVisibility(View.VISIBLE); mPasswordLabelView.setVisibility(View.VISIBLE); - mClientCertificateLabelView.setVisibility(View.GONE); - mClientCertificateSpinner.setVisibility(View.GONE); + mClientCertificateLabelView.setVisibility(View.VISIBLE); + mClientCertificateSpinner.setVisibility(View.VISIBLE); } } @@ -460,6 +460,7 @@ protected void onNext() { if (AuthType.EXTERNAL == authType) { clientCertificateAlias = mClientCertificateSpinner.getAlias(); } else { + clientCertificateAlias = mClientCertificateSpinner.getAlias(); password = mPasswordView.getText().toString(); } }