X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/cab55a8edd27a9b470e0a0b97e228ba3852a65f1..73f8797b7572e431037fd5ee55c24237c544dfcb:/src/com/owncloud/android/ui/activity/AuthenticatorActivity.java diff --git a/src/com/owncloud/android/ui/activity/AuthenticatorActivity.java b/src/com/owncloud/android/ui/activity/AuthenticatorActivity.java index f3d60966..fb5c711b 100644 --- a/src/com/owncloud/android/ui/activity/AuthenticatorActivity.java +++ b/src/com/owncloud/android/ui/activity/AuthenticatorActivity.java @@ -21,6 +21,7 @@ package com.owncloud.android.ui.activity; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; +import java.util.Map; import org.json.JSONException; import org.json.JSONObject; @@ -30,14 +31,18 @@ import com.owncloud.android.authenticator.AccountAuthenticator; import com.owncloud.android.authenticator.AuthenticationRunnable; import com.owncloud.android.authenticator.OnAuthenticationResultListener; import com.owncloud.android.authenticator.OnConnectCheckListener; +import com.owncloud.android.authenticator.oauth2.OAuth2Context; import com.owncloud.android.authenticator.oauth2.OAuth2GetCodeRunnable; import com.owncloud.android.authenticator.oauth2.OnOAuth2GetCodeResultListener; import com.owncloud.android.authenticator.oauth2.connection.ConnectorOAuth2; import com.owncloud.android.authenticator.oauth2.services.OAuth2GetTokenService; import com.owncloud.android.ui.dialog.SslValidatorDialog; import com.owncloud.android.ui.dialog.SslValidatorDialog.OnSslValidatorListener; +import com.owncloud.android.utils.OwnCloudVersion; import com.owncloud.android.network.OwnCloudClientUtils; import com.owncloud.android.operations.ConnectionCheckOperation; +import com.owncloud.android.operations.ExistenceCheckOperation; +import com.owncloud.android.operations.GetOAuth2AccessToken; import com.owncloud.android.operations.OnRemoteOperationListener; import com.owncloud.android.operations.RemoteOperation; import com.owncloud.android.operations.RemoteOperationResult; @@ -67,6 +72,7 @@ import android.view.View.OnFocusChangeListener; import android.view.Window; import android.widget.CheckBox; import android.widget.EditText; +import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import com.owncloud.android.R; @@ -91,19 +97,23 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity private Thread mAuthThread; private AuthenticationRunnable mAuthRunnable; - //private ConnectionCheckerRunnable mConnChkRunnable = null; private ConnectionCheckOperation mConnChkRunnable; + private ExistenceCheckOperation mAuthChkOperation; private final Handler mHandler = new Handler(); private String mBaseUrl; + private OwnCloudVersion mDiscoveredVersion; private static final String STATUS_TEXT = "STATUS_TEXT"; private static final String STATUS_ICON = "STATUS_ICON"; private static final String STATUS_CORRECT = "STATUS_CORRECT"; private static final String IS_SSL_CONN = "IS_SSL_CONN"; + private static final String OC_VERSION = "OC_VERSION"; private int mStatusText, mStatusIcon; private boolean mStatusCorrect, mIsSslConn; private RemoteOperationResult mLastSslUntrustedServerResult; + public static final String PARAM_ACCOUNTNAME = "param_Accountname"; + public static final String PARAM_USERNAME = "param_Username"; public static final String PARAM_HOSTNAME = "param_Hostname"; @@ -112,11 +122,9 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity private static final String OAUTH2_STATUS_TEXT = "OAUTH2_STATUS_TEXT"; private static final String OAUTH2_STATUS_ICON = "OAUTH2_STATUS_ICON"; private static final String OAUTH2_CODE_RESULT = "CODE_RESULT"; - private static final String OAUTH2_BASE_URL = "BASE_URL"; private static final String OAUTH2_IS_CHECKED = "OAUTH2_IS_CHECKED"; private Thread mOAuth2GetCodeThread; private OAuth2GetCodeRunnable mOAuth2GetCodeRunnable; - private String oAuth2BaseUrl; private TokenReceiver tokenReceiver; private JSONObject codeResponseJson; private int mOAuth2StatusText, mOAuth2StatusIcon; @@ -125,9 +133,11 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity // Variables used to save the on the state the contents of all fields. private static final String HOST_URL_TEXT = "HOST_URL_TEXT"; - private static final String OAUTH2_URL_TEXT = "OAUTH2_URL_TEXT"; private static final String ACCOUNT_USERNAME = "ACCOUNT_USERNAME"; private static final String ACCOUNT_PASSWORD = "ACCOUNT_PASSWORD"; + + //private boolean mNewRedirectUriCaptured; + private Uri mNewCapturedUriFromOAuth2Redirection; // END of oAuth2 variables. @@ -140,8 +150,8 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity ImageView iv2 = (ImageView) findViewById(R.id.viewPassword); TextView tv = (TextView) findViewById(R.id.host_URL); TextView tv2 = (TextView) findViewById(R.id.account_password); - // New textview to oAuth2 URL. - TextView tv3 = (TextView) findViewById(R.id.oAuth_URL); + EditText oauth2Url = (EditText)findViewById(R.id.oAuth_URL); + oauth2Url.setText("OWNCLOUD AUTHORIZATION PROVIDER IN TEST"); if (savedInstanceState != null) { mStatusIcon = savedInstanceState.getInt(STATUS_ICON); @@ -153,14 +163,17 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity if (!mStatusCorrect) iv.setVisibility(View.VISIBLE); else - iv.setVisibility(View.INVISIBLE); + iv.setVisibility(View.INVISIBLE); + + String ocVersion = savedInstanceState.getString(OC_VERSION, null); + if (ocVersion != null) + mDiscoveredVersion = new OwnCloudVersion(ocVersion); // Getting the state of oAuth2 components. mOAuth2StatusIcon = savedInstanceState.getInt(OAUTH2_STATUS_ICON); mOAuth2StatusText = savedInstanceState.getInt(OAUTH2_STATUS_TEXT); // We set this to true if the rotation happens when the user is validating oAuth2 user_code. changeViewByOAuth2Check(savedInstanceState.getBoolean(OAUTH2_IS_CHECKED)); - oAuth2BaseUrl = savedInstanceState.getString(OAUTH2_BASE_URL); // We store a JSon object with all the data returned from oAuth2 server when we get user_code. // Is better than store variable by variable. We use String object to serialize from/to it. try { @@ -175,8 +188,6 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity // Getting contents of each field. EditText hostUrl = (EditText)findViewById(R.id.host_URL); hostUrl.setText(savedInstanceState.getString(HOST_URL_TEXT), TextView.BufferType.EDITABLE); - EditText oauth2Url = (EditText)findViewById(R.id.oAuth_URL); - oauth2Url.setText(savedInstanceState.getString(OAUTH2_URL_TEXT), TextView.BufferType.EDITABLE); EditText accountUsername = (EditText)findViewById(R.id.account_username); accountUsername.setText(savedInstanceState.getString(ACCOUNT_USERNAME), TextView.BufferType.EDITABLE); EditText accountPassword = (EditText)findViewById(R.id.account_password); @@ -187,22 +198,53 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity mStatusText = mStatusIcon = 0; mStatusCorrect = false; mIsSslConn = false; + + String accountName = getIntent().getExtras().getString(PARAM_ACCOUNTNAME); + String tokenType = getIntent().getExtras().getString(AccountAuthenticator.KEY_AUTH_TOKEN_TYPE); + if (AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN.equals(tokenType)) { + CheckBox oAuth2Check = (CheckBox) findViewById(R.id.oauth_onOff_check); + oAuth2Check.setChecked(true); + changeViewByOAuth2Check(true); + } + + if (accountName != null) { + ((TextView) findViewById(R.id.account_username)).setText(accountName.substring(0, accountName.lastIndexOf('@'))); + tv.setText(accountName.substring(accountName.lastIndexOf('@') + 1)); + } } iv.setOnClickListener(this); iv2.setOnClickListener(this); tv.setOnFocusChangeListener(this); tv2.setOnFocusChangeListener(this); - // Setting the listener for oAuth2 URL TextView. - tv3.setOnFocusChangeListener(this); - super.onCreate(savedInstanceState); + Button b = (Button) findViewById(R.id.account_register); + if (b != null) { + b.setText(String.format(getString(R.string.auth_register), getString(R.string.app_name))); + } + + mNewCapturedUriFromOAuth2Redirection = null; } + + @Override + protected void onNewIntent (Intent intent) { + Uri data = intent.getData(); + //mNewRedirectUriCaptured = (data != null && data.toString().startsWith(OAuth2Context.MY_REDIRECT_URI)); + if (data != null && data.toString().startsWith(OAuth2Context.MY_REDIRECT_URI)) { + mNewCapturedUriFromOAuth2Redirection = data; + } + Log.d(TAG, "onNewIntent()"); + + } + + @Override protected void onSaveInstanceState(Bundle outState) { outState.putInt(STATUS_ICON, mStatusIcon); outState.putInt(STATUS_TEXT, mStatusText); outState.putBoolean(STATUS_CORRECT, mStatusCorrect); + if (mDiscoveredVersion != null) + outState.putString(OC_VERSION, mDiscoveredVersion.toString()); // Saving the state of oAuth2 components. outState.putInt(OAUTH2_STATUS_ICON, mOAuth2StatusIcon); @@ -212,12 +254,10 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity if (codeResponseJson != null){ outState.putString(OAUTH2_CODE_RESULT, codeResponseJson.toString()); } - outState.putString(OAUTH2_BASE_URL, oAuth2BaseUrl); // END of saving the state of oAuth2 components. // Saving contents of each field. outState.putString(HOST_URL_TEXT,((TextView) findViewById(R.id.host_URL)).getText().toString().trim()); - outState.putString(OAUTH2_URL_TEXT,((TextView) findViewById(R.id.oAuth_URL)).getText().toString().trim()); outState.putString(ACCOUNT_USERNAME,((TextView) findViewById(R.id.account_username)).getText().toString().trim()); outState.putString(ACCOUNT_PASSWORD,((TextView) findViewById(R.id.account_password)).getText().toString().trim()); @@ -252,9 +292,13 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity case OAUTH2_LOGIN_PROGRESS: { ProgressDialog working_dialog = new ProgressDialog(this); try { - working_dialog.setMessage(String.format(getString(R.string.oauth_code_validation_message), - codeResponseJson.getString(OAuth2GetCodeRunnable.CODE_VERIFICATION_URL), - codeResponseJson.getString(OAuth2GetCodeRunnable.CODE_USER_CODE))); + if (codeResponseJson != null && codeResponseJson.has(OAuth2GetCodeRunnable.CODE_VERIFICATION_URL)) { + working_dialog.setMessage(String.format(getString(R.string.oauth_code_validation_message), + codeResponseJson.getString(OAuth2GetCodeRunnable.CODE_VERIFICATION_URL), + codeResponseJson.getString(OAuth2GetCodeRunnable.CODE_USER_CODE))); + } else { + working_dialog.setMessage(String.format("Getting authorization")); + } } catch (JSONException e) { Log.e(TAG, "onCreateDialog->JSONException: " + e.toString()); } @@ -307,6 +351,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity switch (id) { case DIALOG_LOGIN_PROGRESS: case DIALOG_CERT_NOT_SAVED: + case OAUTH2_LOGIN_PROGRESS: break; case DIALOG_SSL_VALIDATOR: { ((SslValidatorDialog)dialog).updateResult(mLastSslUntrustedServerResult); @@ -320,12 +365,19 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity @Override protected void onResume() { Log.d(TAG, "onResume() start"); - // Registering token receiver. We must listening to the service that is pooling to the oAuth server for a token. + // (old oauth code) Registering token receiver. We must listening to the service that is pooling to the oAuth server for a token. if (tokenReceiver == null) { IntentFilter tokenFilter = new IntentFilter(OAuth2GetTokenService.TOKEN_RECEIVED_MESSAGE); tokenReceiver = new TokenReceiver(); this.registerReceiver(tokenReceiver,tokenFilter); } + // (new oauth code) + /*if (mNewRedirectUriCaptured) { + mNewRedirectUriCaptured = false;*/ + if (mNewCapturedUriFromOAuth2Redirection != null) { + getOAuth2AccessTokenFromCapturedRedirection(); + + } super.onResume(); } @@ -382,8 +434,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity accManager.setUserData(account, AccountAuthenticator.KEY_OC_URL, url.toString()); accManager.setUserData(account, - AccountAuthenticator.KEY_OC_VERSION, mConnChkRunnable - .getDiscoveredVersion().toString()); + AccountAuthenticator.KEY_OC_VERSION, mDiscoveredVersion.toString()); accManager.setUserData(account, AccountAuthenticator.KEY_OC_BASE_URL, mBaseUrl); @@ -411,7 +462,11 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity // NOTHING TO DO ; can't find out what situation that leads to the exception in this code, but user logs signal that it happens } TextView tv = (TextView) findViewById(R.id.account_username); - tv.setError(message); + tv.setError(message + " "); // the extra spaces are a workaround for an ugly bug: + // 1. insert wrong credentials and connect + // 2. put the focus on the user name field with using hardware controls (don't touch the screen); the error is shown UNDER the field + // 3. touch the user name field; the software keyboard appears; the error popup is moved OVER the field and SHRINKED in width, losing the last word + // Seen, at least, in Android 2.x devices } } public void onCancelClick(View view) { @@ -432,11 +487,27 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity || url.toLowerCase().startsWith("https://")) { prefix = ""; } - continueConnection(prefix); + CheckBox oAuth2Check = (CheckBox) findViewById(R.id.oauth_onOff_check); + if (oAuth2Check != null && oAuth2Check.isChecked()) { + startOauthorization(); + + } else { + continueConnection(prefix); + } } + private void startOauthorization() { + // We start a thread to get an authorization code from the oAuth2 server. + setOAuth2ResultIconAndText(R.drawable.progress_small, R.string.oauth_login_connection); + mOAuth2GetCodeRunnable = new OAuth2GetCodeRunnable(OAuth2Context.OAUTH2_F_AUTHORIZATION_ENDPOINT_URL, this); + //mOAuth2GetCodeRunnable = new OAuth2GetCodeRunnable(OAuth2Context.OAUTH2_G_DEVICE_GETCODE_URL, this); + mOAuth2GetCodeRunnable.setListener(this, mHandler); + mOAuth2GetCodeThread = new Thread(mOAuth2GetCodeRunnable); + mOAuth2GetCodeThread.start(); + } + public void onRegisterClick(View view) { - Intent register = new Intent(Intent.ACTION_VIEW, Uri.parse("https://owncloud.com/mobile/new")); + Intent register = new Intent(Intent.ACTION_VIEW, Uri.parse(getString(R.string.url_account_register))); setResult(RESULT_CANCELED); startActivity(register); } @@ -452,8 +523,8 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity url = url.substring(0, url.length() - 1); URL uri = null; - String webdav_path = AccountUtils.getWebdavPath(mConnChkRunnable - .getDiscoveredVersion()); + mDiscoveredVersion = mConnChkRunnable.getDiscoveredVersion(); + String webdav_path = AccountUtils.getWebdavPath(mDiscoveredVersion, false); if (webdav_path == null) { onAuthenticationResult(false, getString(R.string.auth_bad_oc_version_title)); @@ -557,7 +628,6 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity findViewById(R.id.buttonOK).setEnabled(mStatusCorrect); } - @Override public void onFocusChange(View view, boolean hasFocus) { if (view.getId() == R.id.host_URL) { if (!hasFocus) { @@ -567,11 +637,12 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity setResultIconAndText(R.drawable.progress_small, R.string.auth_testing_connection); //mConnChkRunnable = new ConnectionCheckerRunnable(uri, this); - mConnChkRunnable = new ConnectionCheckOperation(uri, this); + mConnChkRunnable = new ConnectionCheckOperation(uri, this); //mConnChkRunnable.setListener(this, mHandler); //mAuthThread = new Thread(mConnChkRunnable); //mAuthThread.start(); WebdavClient client = OwnCloudClientUtils.createOwnCloudClient(Uri.parse(uri), this); + mDiscoveredVersion = null; mAuthThread = mConnChkRunnable.execute(client, this, mHandler); } else { findViewById(R.id.refreshButton).setVisibility( @@ -593,28 +664,6 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity v.setInputType(input_type); iv.setVisibility(View.INVISIBLE); } - // If the focusChange occurs on the oAuth2 URL field, we do this. - } else if (view.getId() == R.id.oAuth_URL) { - if (!hasFocus) { - TextView tv3 = ((TextView) findViewById(R.id.oAuth_URL)); - // We get the URL of oAuth2 server. - oAuth2BaseUrl = tv3.getText().toString().trim(); - if (oAuth2BaseUrl.length() != 0) { - // We start a thread to get user_code from the oAuth2 server. - setOAuth2ResultIconAndText(R.drawable.progress_small, R.string.oauth_login_connection); - mOAuth2GetCodeRunnable = new OAuth2GetCodeRunnable(oAuth2BaseUrl, this); - mOAuth2GetCodeRunnable.setListener(this, mHandler); - mOAuth2GetCodeThread = new Thread(mOAuth2GetCodeRunnable); - mOAuth2GetCodeThread.start(); - } else { - findViewById(R.id.refreshButton).setVisibility( - View.INVISIBLE); - setOAuth2ResultIconAndText(0, 0); - } - } else { - // avoids that the 'connect' button can be clicked if the test was previously passed - findViewById(R.id.buttonOK).setEnabled(false); - } } } @@ -639,8 +688,14 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity onFocusChange(findViewById(R.id.host_URL), false); } else if (v.getId() == R.id.viewPassword) { TextView view = (TextView) findViewById(R.id.account_password); - int input_type = InputType.TYPE_CLASS_TEXT - | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD; + int input_type = view.getInputType(); + if ((input_type & InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) == InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD) { + input_type = InputType.TYPE_CLASS_TEXT + | InputType.TYPE_TEXT_VARIATION_PASSWORD; + } else { + input_type = InputType.TYPE_CLASS_TEXT + | InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD; + } view.setInputType(input_type); } } @@ -715,15 +770,18 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity public void onOAuth2GetCodeResult(ResultOAuthType type, JSONObject responseJson) { if ((type == ResultOAuthType.OK_SSL)||(type == ResultOAuthType.OK_NO_SSL)) { codeResponseJson = responseJson; - startOAuth2Authentication(); + if (codeResponseJson != null) { + getOAuth2AccessTokenFromJsonResponse(); + } // else - nothing to do here - wait for callback !!! + } else if (type == ResultOAuthType.HOST_NOT_AVAILABLE) { setOAuth2ResultIconAndText(R.drawable.common_error, R.string.oauth_connection_url_unavailable); } } // If the results of getting the user_code and verification_url are OK, we get the received data and we start - // the pooling service to oAuth2 server to get a valid token. - private void startOAuth2Authentication () { + // the polling service to oAuth2 server to get a valid token. + private void getOAuth2AccessTokenFromJsonResponse() { String deviceCode = null; String verificationUrl = null; String userCode = null; @@ -762,7 +820,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity // Starting the pooling service. try { Intent tokenService = new Intent(this, OAuth2GetTokenService.class); - tokenService.putExtra(OAuth2GetTokenService.TOKEN_BASE_URI, oAuth2BaseUrl); + tokenService.putExtra(OAuth2GetTokenService.TOKEN_URI, OAuth2Context.OAUTH2_G_DEVICE_GETTOKEN_URL); tokenService.putExtra(OAuth2GetTokenService.TOKEN_DEVICE_CODE, deviceCode); tokenService.putExtra(OAuth2GetTokenService.TOKEN_INTERVAL, interval); @@ -771,7 +829,61 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity catch (Exception e) { Log.e(TAG, "tokenService creation problem :", e); } + } + + private void getOAuth2AccessTokenFromCapturedRedirection() { + Map responseValues = new HashMap(); + //String queryParameters = getIntent().getData().getQuery(); + String queryParameters = mNewCapturedUriFromOAuth2Redirection.getQuery(); + mNewCapturedUriFromOAuth2Redirection = null; + + Log.v(TAG, "Queryparameters (Code) = " + queryParameters); + + String[] pairs = queryParameters.split("&"); + Log.v(TAG, "Pairs (Code) = " + pairs.toString()); + + int i = 0; + String key = ""; + String value = ""; + + StringBuilder sb = new StringBuilder(); + + while (pairs.length > i) { + int j = 0; + String[] part = pairs[i].split("="); + + while (part.length > j) { + String p = part[j]; + if (j == 0) { + key = p; + sb.append(key + " = "); + } else if (j == 1) { + value = p; + responseValues.put(key, value); + sb.append(value + "\n"); + } + + Log.v(TAG, "[" + i + "," + j + "] = " + p); + j++; + } + i++; + } + + + // Updating status widget to OK. + setOAuth2ResultIconAndText(R.drawable.ic_ok, R.string.auth_connection_established); + + // Showing the dialog with instructions for the user. + showDialog(OAUTH2_LOGIN_PROGRESS); + + // + RemoteOperation operation = new GetOAuth2AccessToken(responseValues); + WebdavClient client = OwnCloudClientUtils.createOwnCloudClient(Uri.parse(OAuth2Context.OAUTH2_F_TOKEN_ENDPOINT_URL), getApplicationContext()); + operation.execute(client, this, mHandler); + } + + // We get data from the oAuth2 token service with this broadcast receiver. private class TokenReceiver extends BroadcastReceiver { @@ -792,7 +904,7 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity @Override public void onRemoteOperationFinish(RemoteOperation operation, RemoteOperationResult result) { - if (operation.equals(mConnChkRunnable)) { + if (operation instanceof ConnectionCheckOperation) { mStatusText = mStatusIcon = 0; mStatusCorrect = false; @@ -880,6 +992,126 @@ public class AuthenticatorActivity extends AccountAuthenticatorActivity else findViewById(R.id.refreshButton).setVisibility(View.INVISIBLE); findViewById(R.id.buttonOK).setEnabled(mStatusCorrect); + + } else if (operation instanceof GetOAuth2AccessToken) { + + try { + dismissDialog(OAUTH2_LOGIN_PROGRESS); + } catch (IllegalArgumentException e) { + // NOTHING TO DO ; can't find out what situation that leads to the exception in this code, but user logs signal that it happens + } + + if (result.isSuccess()) { + + /// time to test the retrieved access token on the ownCloud server + String url = ((TextView) findViewById(R.id.host_URL)).getText() + .toString().trim(); + if (url.endsWith("/")) + url = url.substring(0, url.length() - 1); + + Uri uri = null; + /*String webdav_path = AccountUtils.getWebdavPath(mDiscoveredVersion); + + if (webdav_path == null) { + onAuthenticationResult(false, getString(R.string.auth_bad_oc_version_title)); + return; + }*/ + + String prefix = ""; + if (mIsSslConn) { + prefix = "https://"; + } else { + prefix = "http://"; + } + if (url.toLowerCase().startsWith("http://") + || url.toLowerCase().startsWith("https://")) { + prefix = ""; + } + + try { + mBaseUrl = prefix + url; + //String url_str = prefix + url + webdav_path; + String url_str = prefix + url + "/remote.php/odav"; + uri = Uri.parse(url_str); + + } catch (Exception e) { + // should never happen + onAuthenticationResult(false, getString(R.string.auth_incorrect_address_title)); + return; + } + + showDialog(DIALOG_LOGIN_PROGRESS); + String accessToken = ((GetOAuth2AccessToken)operation).getResultTokenMap().get(OAuth2Context.KEY_ACCESS_TOKEN); + Log.d(TAG, "Got ACCESS TOKEN: " + accessToken); + mAuthChkOperation = new ExistenceCheckOperation("", this, accessToken); + WebdavClient client = OwnCloudClientUtils.createOwnCloudClient(uri, getApplicationContext()); + mAuthChkOperation.execute(client, this, mHandler); + + + } else { + TextView tv = (TextView) findViewById(R.id.oAuth_URL); + tv.setError("A valid authorization could not be obtained"); + + } + + } else if (operation instanceof ExistenceCheckOperation) { + + try { + dismissDialog(DIALOG_LOGIN_PROGRESS); + } catch (IllegalArgumentException e) { + // NOTHING TO DO ; can't find out what situation that leads to the exception in this code, but user logs signal that it happens + } + + if (result.isSuccess()) { + TextView tv = (TextView) findViewById(R.id.oAuth_URL); + Log.d(TAG, "Checked access - time to save the account"); + + Uri uri = Uri.parse(mBaseUrl); + String username = "OAuth_user" + (new java.util.Random(System.currentTimeMillis())).nextLong(); + String accountName = username + "@" + uri.getHost(); + if (uri.getPort() >= 0) { + accountName += ":" + uri.getPort(); + } + // TODO - check that accountName does not exist + Account account = new Account(accountName, AccountAuthenticator.ACCOUNT_TYPE); + AccountManager accManager = AccountManager.get(this); + accManager.addAccountExplicitly(account, "", null); // with our implementation, the password is never input in the app + + // Add this account as default in the preferences, if there is none + Account defaultAccount = AccountUtils.getCurrentOwnCloudAccount(this); + if (defaultAccount == null) { + SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit(); + editor.putString("select_oc_account", accountName); + editor.commit(); + } + + /// account data to save by the AccountManager + final Intent intent = new Intent(); + intent.putExtra(AccountManager.KEY_ACCOUNT_TYPE, AccountAuthenticator.ACCOUNT_TYPE); + intent.putExtra(AccountManager.KEY_ACCOUNT_NAME, account.name); + intent.putExtra(AccountManager.KEY_USERDATA, username); + + accManager.setAuthToken(account, AccountAuthenticator.AUTH_TOKEN_TYPE_ACCESS_TOKEN, ((ExistenceCheckOperation) operation).getAccessToken()); + + accManager.setUserData(account, AccountAuthenticator.KEY_OC_VERSION, mConnChkRunnable.getDiscoveredVersion().toString()); + accManager.setUserData(account, AccountAuthenticator.KEY_OC_BASE_URL, mBaseUrl); + accManager.setUserData(account, AccountAuthenticator.KEY_SUPPORTS_OAUTH2, "TRUE"); + + setAccountAuthenticatorResult(intent.getExtras()); + setResult(RESULT_OK, intent); + + /// enforce the first account synchronization + Bundle bundle = new Bundle(); + bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true); + ContentResolver.requestSync(account, "org.owncloud", bundle); + + finish(); + + } else { + TextView tv = (TextView) findViewById(R.id.oAuth_URL); + tv.setError(result.getLogMessage()); + Log.d(TAG, "Access failed: " + result.getLogMessage()); + } } }