android:onClick="onCheckClick"\r
android:text="@string/oauth_check_onoff"\r
android:textAppearance="?android:attr/textAppearanceSmall"\r
- android:visibility="gone" />\r
+ />\r
\r
<EditText\r
android:id="@+id/oAuthEntryPoint_1"\r
android:layout_width="match_parent"\r
android:layout_height="wrap_content"\r
android:ems="10"\r
- android:inputType="textUri"\r
- android:singleLine="true"\r
+ android:enabled="false"\r
android:text="@string/oauth2_url_endpoint_auth"\r
+ android:singleLine="true"\r
+ android:inputType="textUri"\r
android:visibility="gone" >\r
</EditText>\r
\r
android:layout_width="match_parent"\r
android:layout_height="wrap_content"\r
android:ems="10"\r
- android:inputType="textUri"\r
- android:singleLine="true"\r
+ android:enabled="false"\r
android:text="@string/oauth2_url_endpoint_access"\r
+ android:singleLine="true"\r
+ android:inputType="textUri"\r
+ android:visibility="gone" />\r
+\r
+ <EditText\r
+ android:id="@+id/account_name"\r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
+ android:ems="10"\r
+ android:hint="@string/auth_account_name"\r
+ android:inputType="textNoSuggestions" \r
+ android:visibility="gone" />\r
+ \r
+ <WebView\r
+ android:id="@+id/web_sso_view" \r
+ android:layout_width="match_parent"\r
+ android:layout_height="wrap_content"\r
android:visibility="gone" />\r
\r
<EditText\r
android:layout_height="wrap_content"\r
android:ems="10"\r
android:hint="@string/auth_username"\r
- android:inputType="textNoSuggestions" />\r
+ android:inputType="textNoSuggestions" \r
+ />\r
\r
<EditText\r
android:id="@+id/account_password"\r
android:drawablePadding="5dp"\r
android:ems="10"\r
android:hint="@string/auth_password"\r
- android:inputType="textPassword" />\r
+ android:inputType="textPassword" \r
+ />\r
\r
<TextView\r
android:id="@+id/auth_status_text"\r
import android.view.View.OnTouchListener;\r
import android.view.Window;\r
import android.view.inputmethod.EditorInfo;\r
+import android.webkit.WebView;\r
import android.widget.CheckBox;\r
import android.widget.EditText;\r
import android.widget.Button;\r
private static final String KEY_SERVER_STATUS_ICON = "SERVER_STATUS_ICON";\r
private static final String KEY_IS_SSL_CONN = "IS_SSL_CONN";\r
private static final String KEY_PASSWORD_VISIBLE = "PASSWORD_VISIBLE";\r
+ private static final String KEY_AUTH_METHOD = "AUTH_METHOD";\r
private static final String KEY_AUTH_STATUS_TEXT = "AUTH_STATUS_TEXT";\r
private static final String KEY_AUTH_STATUS_ICON = "AUTH_STATUS_ICON";\r
private static final String KEY_REFRESH_BUTTON_ENABLED = "KEY_REFRESH_BUTTON_ENABLED";\r
\r
- private static final String OAUTH_MODE_ON = "on";\r
- private static final String OAUTH_MODE_OFF = "off";\r
- private static final String OAUTH_MODE_OPTIONAL = "optional";\r
+ private static final String AUTH_ON = "on";\r
+ private static final String AUTH_OFF = "off";\r
+ private static final String AUTH_OPTIONAL = "optional";\r
+ \r
+ private static final int AUTH_METHOD_BASIC_HTTP = 0;\r
+ private static final int AUTH_METHOD_OAUTH2 = 1;\r
+ private static final int AUTH_METHOD_SAML_WEB_SSO = 2;\r
\r
private static final int DIALOG_LOGIN_PROGRESS = 0;\r
private static final int DIALOG_SSL_VALIDATOR = 1;\r
private int mServerStatusText, mServerStatusIcon;\r
private boolean mServerIsChecked, mServerIsValid, mIsSslConn;\r
private int mAuthStatusText, mAuthStatusIcon; \r
+ private TextView mAuthStatusLayout;\r
\r
private final Handler mHandler = new Handler();\r
private Thread mOperationThread;\r
private Account mAccount;\r
\r
private EditText mHostUrlInput;\r
+ private boolean mHostUrlInputEnabled;\r
private View mRefreshButton;\r
+\r
+ private int mCurrentAuthorizationMethod; \r
+ \r
private EditText mUsernameInput;\r
private EditText mPasswordInput;\r
+ \r
private CheckBox mOAuth2Check;\r
private String mOAuthAccessToken;\r
- private View mOkButton;\r
- private TextView mAuthStatusLayout;\r
-\r
+ \r
private TextView mOAuthAuthEndpointText;\r
private TextView mOAuthTokenEndpointText;\r
\r
- private boolean mRefreshButtonEnabled;\r
+ private TextView mAccountNameInput;\r
+ private WebView mWebSsoView;\r
\r
- private boolean mHostUrlInputEnabled;\r
+ private View mOkButton;\r
\r
\r
/**\r
mOAuthAuthEndpointText = (TextView)findViewById(R.id.oAuthEntryPoint_1);\r
mOAuthTokenEndpointText = (TextView)findViewById(R.id.oAuthEntryPoint_2);\r
mOAuth2Check = (CheckBox) findViewById(R.id.oauth_onOff_check);\r
+ mAccountNameInput = (EditText) findViewById(R.id.account_name);\r
+ mWebSsoView = (WebView) findViewById(R.id.web_sso_view);\r
mOkButton = findViewById(R.id.buttonOK);\r
mAuthStatusLayout = (TextView) findViewById(R.id.auth_status_text); \r
\r
mAuthStatusText = mAuthStatusIcon = 0;\r
\r
/// retrieve extras from intent\r
- String tokenType = getIntent().getExtras().getString(AccountAuthenticator.KEY_AUTH_TOKEN_TYPE);\r
- boolean oAuthRequired = AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN.equals(tokenType) || OAUTH_MODE_ON.equals(getString(R.string.oauth2_mode));\r
-\r
mAccount = getIntent().getExtras().getParcelable(EXTRA_ACCOUNT);\r
if (mAccount != null) {\r
String ocVersion = mAccountMgr.getUserData(mAccount, AccountAuthenticator.KEY_OC_VERSION);\r
}\r
mHostBaseUrl = normalizeUrl(mAccountMgr.getUserData(mAccount, AccountAuthenticator.KEY_OC_BASE_URL));\r
mHostUrlInput.setText(mHostBaseUrl);\r
- String userName = mAccount.name.substring(0, mAccount.name.lastIndexOf('@'));\r
- mUsernameInput.setText(userName);\r
- oAuthRequired = (mAccountMgr.getUserData(mAccount, AccountAuthenticator.KEY_SUPPORTS_OAUTH2) != null);\r
}\r
- mOAuth2Check.setChecked(oAuthRequired);\r
- changeViewByOAuth2Check(oAuthRequired);\r
+ initAuthorizationMethod(); // checks intent and setup.xml to determine mCurrentAuthorizationMethod\r
+ mOAuth2Check.setChecked(mCurrentAuthorizationMethod == AUTH_METHOD_OAUTH2);\r
mJustCreated = true;\r
\r
if (mAction == ACTION_UPDATE_TOKEN || !mHostUrlInputEnabled) {\r
\r
// account data, if updating\r
mAccount = savedInstanceState.getParcelable(KEY_ACCOUNT);\r
+ mCurrentAuthorizationMethod = savedInstanceState.getInt(KEY_AUTH_METHOD, AUTH_METHOD_BASIC_HTTP);\r
\r
// check if server check was interrupted by a configuration change\r
if (savedInstanceState.getBoolean(KEY_SERVER_CHECK_IN_PROGRESS, false)) {\r
\r
}\r
\r
+ adaptViewAccordingToAuthenticationMethod();\r
showServerStatus();\r
showAuthStatus();\r
-\r
+ \r
if (mAction == ACTION_UPDATE_TOKEN) {\r
/// lock things that should not change\r
mHostUrlInput.setEnabled(false);\r
if (mServerIsChecked && !mServerIsValid && refreshButtonEnabled) showRefreshButton();\r
mOkButton.setEnabled(mServerIsValid); // state not automatically recovered in configuration changes\r
\r
- if (!OAUTH_MODE_OPTIONAL.equals(getString(R.string.oauth2_mode))) {\r
+ if (mCurrentAuthorizationMethod == AUTH_METHOD_SAML_WEB_SSO || !AUTH_OPTIONAL.equals(getString(R.string.auth_method_oauth2))) {\r
mOAuth2Check.setVisibility(View.GONE);\r
}\r
\r
});
}\r
\r
+ private void initAuthorizationMethod() {\r
+ boolean oAuthRequired = false;\r
+ boolean samlWebSsoRequired = false;\r
+\r
+ String tokenType = getIntent().getExtras().getString(AccountAuthenticator.KEY_AUTH_TOKEN_TYPE);\r
+ mAccount = getIntent().getExtras().getParcelable(EXTRA_ACCOUNT);\r
+ \r
+ if (tokenType != null) {\r
+ /// use the authentication method requested by caller \r
+ oAuthRequired = AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN.equals(tokenType);\r
+ samlWebSsoRequired = AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(tokenType);\r
+ \r
+ } else if (mAccount != null) {\r
+ /// same authentication method than the one used to create the account to update\r
+ oAuthRequired = (mAccountMgr.getUserData(mAccount, AccountAuthenticator.KEY_SUPPORTS_OAUTH2) != null);\r
+ samlWebSsoRequired = (mAccountMgr.getUserData(mAccount, AccountAuthenticator.KEY_SUPPORTS_SAML_WEB_SSO) != null);\r
+ \r
+ } else {\r
+ /// use the one set in setup.xml\r
+ oAuthRequired = AUTH_ON.equals(getString(R.string.auth_method_oauth2));\r
+ samlWebSsoRequired = AUTH_ON.equals(getString(R.string.auth_method_saml_web_sso)); \r
+ }\r
+ \r
+ if (oAuthRequired) {\r
+ mCurrentAuthorizationMethod = AUTH_METHOD_OAUTH2; \r
+ } else if (samlWebSsoRequired) {\r
+ mCurrentAuthorizationMethod = AUTH_METHOD_SAML_WEB_SSO;\r
+ } else {\r
+ mCurrentAuthorizationMethod = AUTH_METHOD_BASIC_HTTP;\r
+ }\r
+\r
+ if (mAccount != null) {\r
+ String userName = mAccount.name.substring(0, mAccount.name.lastIndexOf('@'));\r
+ mUsernameInput.setText(userName);\r
+ }\r
+ }\r
+\r
/**\r
* Saves relevant state before {@link #onPause()}\r
* \r
if (mAccount != null) {\r
outState.putParcelable(KEY_ACCOUNT, mAccount);\r
}\r
+ outState.putInt(KEY_AUTH_METHOD, mCurrentAuthorizationMethod);\r
\r
// refresh button enabled\r
- //outState.putBoolean(KEY_REFRESH_BUTTON_ENABLED, mRefreshButtonEnabled);\r
outState.putBoolean(KEY_REFRESH_BUTTON_ENABLED, (mRefreshButton.getVisibility() == View.VISIBLE));\r
\r
}\r
@Override\r
protected void onResume() {\r
super.onResume();\r
- // the state of mOAuth2Check is automatically recovered between configuration changes, but not before onCreate() finishes; so keep the next lines here\r
- changeViewByOAuth2Check(mOAuth2Check.isChecked()); \r
if (mAction == ACTION_UPDATE_TOKEN && mJustCreated && getIntent().getBooleanExtra(EXTRA_ENFORCED_UPDATE, false)) {\r
if (mOAuth2Check.isChecked())\r
Toast.makeText(this, R.string.auth_expired_oauth_token_toast, Toast.LENGTH_LONG).show();\r
* @param view 'View password' 'button'\r
*/\r
public void onCheckClick(View view) {\r
- CheckBox oAuth2Check = (CheckBox)view; \r
- changeViewByOAuth2Check(oAuth2Check.isChecked());\r
-\r
+ CheckBox oAuth2Check = (CheckBox)view;\r
+ if (oAuth2Check.isChecked()) {\r
+ mCurrentAuthorizationMethod = AUTH_METHOD_OAUTH2;\r
+ } else {\r
+ mCurrentAuthorizationMethod = AUTH_METHOD_BASIC_HTTP;\r
+ }\r
+ adaptViewAccordingToAuthenticationMethod();\r
}\r
\r
+ \r
/**\r
- * Changes the visibility of input elements depending upon the kind of authorization\r
- * chosen by the user: basic or OAuth\r
- * \r
- * @param checked 'True' when OAuth is selected.\r
+ * Changes the visibility of input elements depending on\r
+ * the current authorization method.\r
*/\r
- public void changeViewByOAuth2Check(Boolean checked) {\r
-\r
- if (checked) {\r
- mOAuthAuthEndpointText.setVisibility(View.VISIBLE);\r
- mOAuthTokenEndpointText.setVisibility(View.VISIBLE);\r
- mUsernameInput.setVisibility(View.GONE);\r
- mPasswordInput.setVisibility(View.GONE);\r
- } else {\r
- mOAuthAuthEndpointText.setVisibility(View.GONE);\r
- mOAuthTokenEndpointText.setVisibility(View.GONE);\r
- mUsernameInput.setVisibility(View.VISIBLE);\r
- mPasswordInput.setVisibility(View.VISIBLE);\r
- } \r
-\r
- } \r
-\r
+ private void adaptViewAccordingToAuthenticationMethod () {\r
+ switch (mCurrentAuthorizationMethod) { \r
+ case AUTH_METHOD_OAUTH2:\r
+ // OAuth 2 authorization\r
+ mOAuthAuthEndpointText.setVisibility(View.VISIBLE);\r
+ mOAuthTokenEndpointText.setVisibility(View.VISIBLE);\r
+ mUsernameInput.setVisibility(View.GONE);\r
+ mPasswordInput.setVisibility(View.GONE);\r
+ mAccountNameInput.setVisibility(View.GONE);\r
+ mWebSsoView.setVisibility(View.GONE);\r
+ break;\r
+ \r
+ case AUTH_METHOD_SAML_WEB_SSO:\r
+ // SAML-based web Single Sign On\r
+ mOAuthAuthEndpointText.setVisibility(View.GONE);\r
+ mOAuthTokenEndpointText.setVisibility(View.GONE);\r
+ mUsernameInput.setVisibility(View.GONE);\r
+ mPasswordInput.setVisibility(View.GONE);\r
+ mAccountNameInput.setVisibility(View.VISIBLE);\r
+ mWebSsoView.setVisibility(View.VISIBLE);\r
+ break;\r
+ \r
+ case AUTH_METHOD_BASIC_HTTP:\r
+ default:\r
+ // basic HTTP authorization\r
+ mOAuthAuthEndpointText.setVisibility(View.GONE);\r
+ mOAuthTokenEndpointText.setVisibility(View.GONE);\r
+ mUsernameInput.setVisibility(View.VISIBLE);\r
+ mPasswordInput.setVisibility(View.VISIBLE);\r
+ mAccountNameInput.setVisibility(View.GONE);\r
+ mWebSsoView.setVisibility(View.GONE);\r
+ }\r
+ }\r
+ \r
/**\r
* Called from SslValidatorDialog when a new server certificate was correctly saved.\r
*/\r