\r
package com.owncloud.android.authentication;\r
\r
-import com.owncloud.android.AccountUtils;\r
import com.owncloud.android.Log_OC;\r
import com.owncloud.android.ui.dialog.SslValidatorDialog;\r
import com.owncloud.android.ui.dialog.SslValidatorDialog.OnSslValidatorListener;\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 View mOkButton;\r
\r
\r
/**\r
/// set view and get references to view elements\r
setContentView(R.layout.account_setup);\r
mHostUrlInput = (EditText) findViewById(R.id.hostUrlInput);\r
+ mHostUrlInput.setText(getString(R.string.server_url)); // valid although R.string.server_url is an empty string\r
mUsernameInput = (EditText) findViewById(R.id.account_username);\r
mPasswordInput = (EditText) findViewById(R.id.account_password);\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
+ /// set Host Url Input Enabled\r
+ mHostUrlInputEnabled = getResources().getBoolean(R.bool.show_server_url_input);\r
+ \r
\r
/// complete label for 'register account' button\r
Button b = (Button) findViewById(R.id.account_register);\r
mAction = getIntent().getByteExtra(EXTRA_ACTION, ACTION_CREATE); \r
mAccount = null;\r
mHostBaseUrl = "";\r
+ boolean refreshButtonEnabled = false;\r
+ \r
+ // URL input configuration applied\r
+ if (!mHostUrlInputEnabled)\r
+ {\r
+ findViewById(R.id.hostUrlFrame).setVisibility(View.GONE);\r
+ mRefreshButton = findViewById(R.id.centeredRefreshButton);\r
+\r
+ } else {\r
+ mRefreshButton = findViewById(R.id.embeddedRefreshButton);\r
+ }\r
\r
if (savedInstanceState == null) {\r
/// connection state and info\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
+ checkOcServer(); \r
+ }\r
\r
} else {\r
/// connection state and info\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
// refresh button enabled\r
- mRefreshButtonEnabled = savedInstanceState.getBoolean(KEY_REFRESH_BUTTON_ENABLED);\r
+ refreshButtonEnabled = savedInstanceState.getBoolean(KEY_REFRESH_BUTTON_ENABLED);\r
+ \r
\r
}\r
\r
+ adaptViewAccordingToAuthenticationMethod();\r
showServerStatus();\r
showAuthStatus();\r
- if (mServerIsChecked && !mServerIsValid && mRefreshButtonEnabled) 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
- mOAuth2Check.setVisibility(View.GONE);\r
- }\r
-\r
+ \r
if (mAction == ACTION_UPDATE_TOKEN) {\r
/// lock things that should not change\r
mHostUrlInput.setEnabled(false);\r
+ mHostUrlInput.setFocusable(false);\r
mUsernameInput.setEnabled(false);\r
+ mUsernameInput.setFocusable(false);\r
+ mOAuth2Check.setVisibility(View.GONE);\r
+ }\r
+ \r
+ //if (mServerIsChecked && !mServerIsValid && mRefreshButtonEnabled) showRefreshButton();\r
+ if (mServerIsChecked && !mServerIsValid && refreshButtonEnabled) showRefreshButton();\r
+ mOkButton.setEnabled(mServerIsValid); // state not automatically recovered in configuration changes\r
+\r
+ if (mCurrentAuthorizationMethod == AUTH_METHOD_SAML_WEB_SSO || !AUTH_OPTIONAL.equals(getString(R.string.auth_method_oauth2))) {\r
mOAuth2Check.setVisibility(View.GONE);\r
- if (!mServerIsValid && mOcServerChkOperation == null) {\r
- checkOcServer(); \r
- }\r
}\r
\r
mPasswordInput.setText(""); // clean password to avoid social hacking (disadvantage: password in removed if the device is turned aside)\r
\r
/// bind view elements to listeners\r
mHostUrlInput.setOnFocusChangeListener(this);\r
- mHostUrlInput.setOnTouchListener(new RightDrawableOnTouchListener() {\r
- @Override\r
- public boolean onDrawableTouch(final MotionEvent event) {\r
- if (event.getAction() == MotionEvent.ACTION_UP) {\r
- AuthenticatorActivity.this.onRefreshClick();\r
- }\r
- return true;\r
- }\r
- });\r
mHostUrlInput.addTextChangedListener(new TextWatcher() {\r
\r
@Override\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
\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
if (view.getId() == R.id.hostUrlInput) { \r
if (!hasFocus) {\r
onUrlInputFocusLost((TextView) view);\r
- if (!mServerIsValid) {\r
- showRefreshButton();\r
- }\r
}\r
else {\r
hideRefreshButton();\r
checkOcServer();\r
} else {\r
mOkButton.setEnabled(mServerIsValid);\r
+ if (!mServerIsValid) {\r
+ showRefreshButton();\r
+ }\r
}\r
}\r
\r
\r
private void checkOcServer() {\r
String uri = trimUrlWebdav(mHostUrlInput.getText().toString().trim());\r
+ \r
+ if (!mHostUrlInputEnabled){\r
+ uri = getString(R.string.server_url);\r
+ }\r
+ \r
mServerIsValid = false;\r
mServerIsChecked = false;\r
mOkButton.setEnabled(false);\r
\r
\r
private void showRefreshButton() {\r
- mHostUrlInput.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.ic_action_refresh_black, 0);\r
- mRefreshButtonEnabled = true;\r
+ mRefreshButton.setVisibility(View.VISIBLE);\r
}\r
\r
private void hideRefreshButton() {\r
- mHostUrlInput.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);\r
- mRefreshButtonEnabled = false;\r
+ mRefreshButton.setVisibility(View.GONE);\r
}\r
\r
/**\r
* \r
* @param view Refresh 'button'\r
*/\r
- public void onRefreshClick() {\r
+ public void onRefreshClick(View view) {\r
checkOcServer();\r
}\r
\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
public void onSavedCertificate() {\r
- mOperationThread = mOcServerChkOperation.retry(this, mHandler); \r
+ checkOcServer();\r
}\r
\r
/**\r