diff --git a/res/layout/account_setup_outgoing.xml b/res/layout/account_setup_outgoing.xml
index 2dc4aefb9..853a16c25 100644
--- a/res/layout/account_setup_outgoing.xml
+++ b/res/layout/account_setup_outgoing.xml
@@ -61,6 +61,16 @@
android:layout_height="fill_parent"
android:orientation="vertical"
android:visibility="gone">
+
+
Require sign-in.
Username
Password
-
Authentication type
+
Username & password
Username
Password
diff --git a/src/com/fsck/k9/activity/setup/AccountSetupOutgoing.java b/src/com/fsck/k9/activity/setup/AccountSetupOutgoing.java
index 76fb4493d..83474091e 100644
--- a/src/com/fsck/k9/activity/setup/AccountSetupOutgoing.java
+++ b/src/com/fsck/k9/activity/setup/AccountSetupOutgoing.java
@@ -43,6 +43,10 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
"webdav", "webdav+ssl", "webdav+ssl+", "webdav+tls", "webdav+tls+"
};
+ private static final String authTypes[] =
+ {
+ "PLAIN", "CRAM_MD5"
+ };
private EditText mUsernameView;
private EditText mPasswordView;
private EditText mServerView;
@@ -50,6 +54,7 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
private CheckBox mRequireLoginView;
private ViewGroup mRequireLoginSettingsView;
private Spinner mSecurityTypeView;
+ private Spinner mAuthTypeView;
private Button mNextButton;
private Account mAccount;
private boolean mMakeDefault;
@@ -100,6 +105,7 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
mRequireLoginView = (CheckBox)findViewById(R.id.account_require_login);
mRequireLoginSettingsView = (ViewGroup)findViewById(R.id.account_require_login_settings);
mSecurityTypeView = (Spinner)findViewById(R.id.account_security_type);
+ mAuthTypeView = (Spinner)findViewById(R.id.account_auth_type);
mNextButton = (Button)findViewById(R.id.next);
mNextButton.setOnClickListener(this);
@@ -116,11 +122,26 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
new SpinnerOption(4, getString(R.string.account_setup_incoming_security_tls_label)),
};
+ // This needs to be kept in sync with the list at the top of the file.
+ // that makes me somewhat unhappy
+ SpinnerOption authTypeSpinnerOptions[] =
+ {
+ new SpinnerOption(0, "PLAIN"),
+ new SpinnerOption(1, "CRAM_MD5")
+ };
+
+
+
ArrayAdapter securityTypesAdapter = new ArrayAdapter(this,
android.R.layout.simple_spinner_item, securityTypes);
securityTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
mSecurityTypeView.setAdapter(securityTypesAdapter);
+ ArrayAdapter authTypesAdapter = new ArrayAdapter(this,
+ android.R.layout.simple_spinner_item, authTypeSpinnerOptions);
+ authTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
+ mAuthTypeView.setAdapter(authTypesAdapter);
+
/*
* Updates the port when the user changes the security type. This allows
* us to show a reasonable default which the user can change.
@@ -183,14 +204,18 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
URI uri = new URI(mAccount.getTransportUri());
String username = null;
String password = null;
+ String authType = null;
if (uri.getUserInfo() != null)
{
- String[] userInfoParts = uri.getUserInfo().split(":", 2);
+ String[] userInfoParts = uri.getUserInfo().split(":");
username = userInfoParts[0];
- if (userInfoParts.length > 1)
- {
- password = userInfoParts[1];
- }
+ if (userInfoParts.length > 1)
+ {
+ password = userInfoParts[1];
+ }
+ if (userInfoParts.length > 2) {
+ authType = userInfoParts[2];
+ }
}
if (username != null)
@@ -204,6 +229,18 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
mPasswordView.setText(password);
}
+ if (authType != null)
+ {
+ for (int i = 0; i < authTypes.length; i++)
+ {
+ if (authTypes[i].equals(authType))
+ {
+ SpinnerOption.setSpinnerOptionValue(mAuthTypeView, i);
+ }
+ }
+ }
+
+
for (int i = 0; i < smtpSchemes.length; i++)
{
if (smtpSchemes[i].equals(uri.getScheme()))
@@ -288,10 +325,11 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
try
{
String userInfo = null;
+ String authType = ((SpinnerOption)mAuthTypeView.getSelectedItem()).label;
if (mRequireLoginView.isChecked())
{
userInfo = mUsernameView.getText().toString() + ":"
- + mPasswordView.getText().toString();
+ + mPasswordView.getText().toString() + ":" + authType;
}
uri = new URI(smtpSchemes[securityType], userInfo, mServerView.getText().toString(),
Integer.parseInt(mPortView.getText().toString()), null, null, null);
diff --git a/src/com/fsck/k9/mail/transport/SmtpTransport.java b/src/com/fsck/k9/mail/transport/SmtpTransport.java
index 48a3812a0..35df3d2d3 100644
--- a/src/com/fsck/k9/mail/transport/SmtpTransport.java
+++ b/src/com/fsck/k9/mail/transport/SmtpTransport.java
@@ -45,6 +45,8 @@ public class SmtpTransport extends Transport
String mPassword;
+ String mAuthType;
+
int mConnectionSecurity;
boolean mSecure;
@@ -116,12 +118,15 @@ public class SmtpTransport extends Transport
if (uri.getUserInfo() != null)
{
- String[] userInfoParts = uri.getUserInfo().split(":", 2);
+ String[] userInfoParts = uri.getUserInfo().split(":");
mUsername = userInfoParts[0];
if (userInfoParts.length > 1)
{
mPassword = userInfoParts[1];
}
+ if (userInfoParts.length > 2) {
+ mAuthType = userInfoParts[2];
+ }
}
}
@@ -234,7 +239,7 @@ public class SmtpTransport extends Transport
{
authPlainSupported = true;
}
- if (result.matches(".*AUTH.*CRAM-MD5.*$") == true)
+ if (result.matches(".*AUTH.*CRAM-MD5.*$") == true && mAuthType != null && mAuthType.equals("CRAM_MD5"))
{
authCramMD5Supported = true;
}