Added handler to trigger server check when the background is touched in login view for SSO login

This commit is contained in:
David A. Velasco 2013-08-23 14:31:17 +02:00
parent b04c3e2398
commit 2b1b98478b
3 changed files with 62 additions and 36 deletions

View file

@ -43,6 +43,7 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:id="@+id/scroll"
android:fillViewport="true"
android:orientation="vertical" >
@ -50,7 +51,6 @@
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:gravity="center"
android:orientation="vertical"
android:padding="8dp" >

View file

@ -22,12 +22,13 @@
android:layout_height="match_parent"
android:layout_gravity="center"
android:fillViewport="true"
android:orientation="vertical" >
android:orientation="vertical"
android:id="@+id/scroll"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:gravity="center"
android:orientation="vertical"
android:padding="8dp" >

View file

@ -144,7 +144,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
private boolean mHostUrlInputEnabled;
private View mRefreshButton;
private String mCurrentAuthTokenType;
private String mAuthTokenType;
private EditText mUsernameInput;
private EditText mPasswordInput;
@ -258,9 +258,9 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
// account data, if updating
mAccount = savedInstanceState.getParcelable(KEY_ACCOUNT);
mCurrentAuthTokenType = savedInstanceState.getString(AccountAuthenticator.KEY_AUTH_TOKEN_TYPE);
if (mCurrentAuthTokenType == null) {
mCurrentAuthTokenType = AccountAuthenticator.AUTH_TOKEN_TYPE_PASSWORD;
mAuthTokenType = savedInstanceState.getString(AccountAuthenticator.KEY_AUTH_TOKEN_TYPE);
if (mAuthTokenType == null) {
mAuthTokenType = AccountAuthenticator.AUTH_TOKEN_TYPE_PASSWORD;
}
@ -292,7 +292,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
if (mServerIsChecked && !mServerIsValid && refreshButtonEnabled) showRefreshButton();
mOkButton.setEnabled(mServerIsValid); // state not automatically recovered in configuration changes
if (AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mCurrentAuthTokenType) ||
if (AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mAuthTokenType) ||
!AUTH_OPTIONAL.equals(getString(R.string.auth_method_oauth2))) {
mOAuth2Check.setVisibility(View.GONE);
}
@ -332,6 +332,18 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
}
});
findViewById(R.id.scroll).setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mAuthTokenType) &&
mHostUrlInput.hasFocus()) {
checkOcServer();
}
}
return false;
}
});
}
@ -340,12 +352,12 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
boolean oAuthRequired = false;
boolean samlWebSsoRequired = false;
mCurrentAuthTokenType = getIntent().getExtras().getString(AccountAuthenticator.KEY_AUTH_TOKEN_TYPE);
mAuthTokenType = getIntent().getExtras().getString(AccountAuthenticator.KEY_AUTH_TOKEN_TYPE);
mAccount = getIntent().getExtras().getParcelable(EXTRA_ACCOUNT);
// TODO could be a good moment to validate the received token type, if not null
if (mCurrentAuthTokenType == null) {
if (mAuthTokenType == null) {
if (mAccount != null) {
/// same authentication method than the one used to create the account to update
oAuthRequired = (mAccountMgr.getUserData(mAccount, AccountAuthenticator.KEY_SUPPORTS_OAUTH2) != null);
@ -357,11 +369,11 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
samlWebSsoRequired = AUTH_ON.equals(getString(R.string.auth_method_saml_web_sso));
}
if (oAuthRequired) {
mCurrentAuthTokenType = AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN;
mAuthTokenType = AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN;
} else if (samlWebSsoRequired) {
mCurrentAuthTokenType = AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE;
mAuthTokenType = AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE;
} else {
mCurrentAuthTokenType = AccountAuthenticator.AUTH_TOKEN_TYPE_PASSWORD;
mAuthTokenType = AccountAuthenticator.AUTH_TOKEN_TYPE_PASSWORD;
}
}
@ -370,7 +382,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
mUsernameInput.setText(userName);
}
mOAuth2Check.setChecked(AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN.equals(mCurrentAuthTokenType));
mOAuth2Check.setChecked(AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN.equals(mAuthTokenType));
}
@ -407,7 +419,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
if (mAccount != null) {
outState.putParcelable(KEY_ACCOUNT, mAccount);
}
outState.putString(AccountAuthenticator.KEY_AUTH_TOKEN_TYPE, mCurrentAuthTokenType);
outState.putString(AccountAuthenticator.KEY_AUTH_TOKEN_TYPE, mAuthTokenType);
// refresh button enabled
outState.putBoolean(KEY_REFRESH_BUTTON_ENABLED, (mRefreshButton.getVisibility() == View.VISIBLE));
@ -638,9 +650,9 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
return;
}
if (AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN.equals(mCurrentAuthTokenType)) {
if (AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN.equals(mAuthTokenType)) {
startOauthorization();
} else if (AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mCurrentAuthTokenType)) {
} else if (AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mAuthTokenType)) {
startSamlBasedFederatedSingleSignOnAuthorization();
} else {
checkBasicAuthorization();
@ -654,7 +666,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
*/
private void checkBasicAuthorization() {
/// get the path to the root folder through WebDAV from the version server
String webdav_path = AccountUtils.getWebdavPath(mDiscoveredVersion, mCurrentAuthTokenType);
String webdav_path = AccountUtils.getWebdavPath(mDiscoveredVersion, mAuthTokenType);
/// get basic credentials entered by user
String username = mUsernameInput.getText().toString();
@ -710,7 +722,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
showDialog(DIALOG_LOGIN_PROGRESS);
/// get the path to the root folder through WebDAV from the version server
String webdav_path = AccountUtils.getWebdavPath(mDiscoveredVersion, mCurrentAuthTokenType);
String webdav_path = AccountUtils.getWebdavPath(mDiscoveredVersion, mAuthTokenType);
/// test credentials accessing the root folder
mAuthCheckOperation = new ExistenceCheckOperation("", this, false);
@ -733,7 +745,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
onGetOAuthAccessTokenFinish((OAuth2GetAccessToken)operation, result);
} else if (operation instanceof ExistenceCheckOperation) {
if (AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mCurrentAuthTokenType)) {
if (AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mAuthTokenType)) {
onSamlBasedFederatedSingleSignOnAuthorizationStart(operation, result);
} else {
@ -752,7 +764,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
if (result.isTemporalRedirection() || result.isIdPRedirection()) {
String url = result.getRedirectedLocation();
String targetUrl = mHostBaseUrl + AccountUtils.getWebdavPath(mDiscoveredVersion, mCurrentAuthTokenType);
String targetUrl = mHostBaseUrl + AccountUtils.getWebdavPath(mDiscoveredVersion, mAuthTokenType);
// Show dialog
mSamlDialog = SamlWebViewDialog.newInstance(url, targetUrl);
@ -832,7 +844,6 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
}
}
Log_OC.d(TAG, "URL Normalize " + url);
return (url != null ? url : "");
}
@ -1020,7 +1031,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
// NOTHING TO DO ; can't find out what situation that leads to the exception in this code, but user logs signal that it happens
}
String webdav_path = AccountUtils.getWebdavPath(mDiscoveredVersion, mCurrentAuthTokenType);
String webdav_path = AccountUtils.getWebdavPath(mDiscoveredVersion, mAuthTokenType);
if (result.isSuccess() && webdav_path != null) {
/// be gentle with the user
showDialog(DIALOG_LOGIN_PROGRESS);
@ -1114,15 +1125,15 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
response.putString(AccountManager.KEY_ACCOUNT_NAME, mAccount.name);
response.putString(AccountManager.KEY_ACCOUNT_TYPE, mAccount.type);
if (AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN.equals(mCurrentAuthTokenType)) {
if (AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN.equals(mAuthTokenType)) {
response.putString(AccountManager.KEY_AUTHTOKEN, mAuthToken);
// the next line is necessary; by now, notifications are calling directly to the AuthenticatorActivity to update, without AccountManager intervention
mAccountMgr.setAuthToken(mAccount, mCurrentAuthTokenType, mAuthToken);
mAccountMgr.setAuthToken(mAccount, mAuthTokenType, mAuthToken);
} else if (AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mCurrentAuthTokenType)) {
} else if (AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mAuthTokenType)) {
response.putString(AccountManager.KEY_AUTHTOKEN, mAuthToken);
// the next line is necessary; by now, notifications are calling directly to the AuthenticatorActivity to update, without AccountManager intervention
mAccountMgr.setAuthToken(mAccount, mCurrentAuthTokenType, mAuthToken);
mAccountMgr.setAuthToken(mAccount, mAuthTokenType, mAuthToken);
} else {
response.putString(AccountManager.KEY_AUTHTOKEN, mPasswordInput.getText().toString());
@ -1141,8 +1152,8 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
*/
private boolean createAccount() {
/// create and save new ownCloud account
boolean isOAuth = AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN.equals(mCurrentAuthTokenType);
boolean isSaml = AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mCurrentAuthTokenType);
boolean isOAuth = AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN.equals(mAuthTokenType);
boolean isSaml = AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mAuthTokenType);
Uri uri = Uri.parse(mHostBaseUrl);
String username = mUsernameInput.getText().toString().trim();
@ -1192,7 +1203,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
intent.putExtra(AccountManager.KEY_AUTHTOKEN, AccountAuthenticator.ACCOUNT_TYPE); */
intent.putExtra(AccountManager.KEY_USERDATA, username);
if (isOAuth || isSaml) {
mAccountMgr.setAuthToken(mAccount, mCurrentAuthTokenType, mAuthToken);
mAccountMgr.setAuthToken(mAccount, mAuthTokenType, mAuthToken);
}
/// add user data to the new account; TODO probably can be done in the last parameter addAccountExplicitly, or in KEY_USERDATA
mAccountMgr.setUserData(mAccount, AccountAuthenticator.KEY_OC_VERSION, mDiscoveredVersion.toString());
@ -1416,9 +1427,9 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
public void onCheckClick(View view) {
CheckBox oAuth2Check = (CheckBox)view;
if (oAuth2Check.isChecked()) {
mCurrentAuthTokenType = AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN;
mAuthTokenType = AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN;
} else {
mCurrentAuthTokenType = AccountAuthenticator.AUTH_TOKEN_TYPE_PASSWORD;
mAuthTokenType = AccountAuthenticator.AUTH_TOKEN_TYPE_PASSWORD;
}
adaptViewAccordingToAuthenticationMethod();
}
@ -1429,14 +1440,14 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
* the current authorization method.
*/
private void adaptViewAccordingToAuthenticationMethod () {
if (AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN.equals(mCurrentAuthTokenType)) {
if (AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN.equals(mAuthTokenType)) {
// OAuth 2 authorization
mOAuthAuthEndpointText.setVisibility(View.VISIBLE);
mOAuthTokenEndpointText.setVisibility(View.VISIBLE);
mUsernameInput.setVisibility(View.GONE);
mPasswordInput.setVisibility(View.GONE);
} else if (AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mCurrentAuthTokenType)) {
} else if (AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mAuthTokenType)) {
// SAML-based web Single Sign On
mOAuthAuthEndpointText.setVisibility(View.GONE);
mOAuthTokenEndpointText.setVisibility(View.GONE);
@ -1482,7 +1493,7 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
}
} else if (actionId == EditorInfo.IME_ACTION_NEXT && inputField != null && inputField.equals(mHostUrlInput)) {
if (AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mCurrentAuthTokenType)) {
if (AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mAuthTokenType)) {
checkOcServer();
}
}
@ -1527,7 +1538,6 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
mAuthToken = sessionCookie;
if (sessionCookie != null && sessionCookie.length() > 0) {
Log_OC.d(TAG, "Successful SSO - time to save the account");
mAuthToken = sessionCookie;
boolean success = true;
if (mAction == ACTION_CREATE) {
@ -1567,4 +1577,19 @@ implements OnRemoteOperationListener, OnSslValidatorListener, OnFocusChangeList
private void syncAccount(){
/// immediately request for the synchronization of the new account
Bundle bundle = new Bundle();
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
ContentResolver.requestSync(mAccount, AccountAuthenticator.AUTHORITY, bundle);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (AccountAuthenticator.AUTH_TOKEN_TYPE_SAML_WEB_SSO_SESSION_COOKIE.equals(mAuthTokenType) &&
mHostUrlInput.hasFocus() && event.getAction() == MotionEvent.ACTION_DOWN) {
checkOcServer();
}
return super.onTouchEvent(event);
}
}