From 08777c0265fbabcfdcc30f96dd6798f403b3173d Mon Sep 17 00:00:00 2001 From: davigonz Date: Thu, 7 Jun 2018 18:01:15 +0200 Subject: [PATCH] Get rid of refactor classes, use methods wrapper --- .../owncloud/android/lib/refactor/Log_OC.java | 212 -------- .../android/lib/refactor/OCContext.java | 28 - .../android/lib/refactor/OwnCloudContext.java | 53 -- .../refactor/account/AccountTypeUtils.java | 49 -- .../lib/refactor/account/AccountUtils.java | 299 ----------- .../lib/refactor/account/OCAccount.java | 159 ------ .../credentials/OCAnonymousCredentials.java | 31 -- .../credentials/OCBasicCredentials.java | 67 --- .../credentials/OCBearerCredentials.java | 67 --- .../credentials/OCCredentials.java | 41 -- .../credentials/OCSamlSsoCredentials.java | 85 --- .../OwnCloudCredentialsFactory.java | 85 --- .../oauth/BearerAuthScheme.java | 261 --------- .../oauth/BearerCredentials.java | 102 ---- .../oauth/OAuth2ClientConfiguration.java | 55 -- .../authentication/oauth/OAuth2Constants.java | 68 --- .../authentication/oauth/OAuth2GrantType.java | 46 -- .../authentication/oauth/OAuth2Provider.java | 66 --- .../oauth/OAuth2ProvidersRegistry.java | 122 ----- .../oauth/OAuth2QueryParser.java | 75 --- .../oauth/OAuth2RequestBuilder.java | 48 -- .../oauth/OAuth2ResponseParser.java | 77 --- .../oauth/OwnCloudOAuth2Provider.java | 94 ---- .../oauth/OwnCloudOAuth2RequestBuilder.java | 151 ------ .../OAuth2GetAccessTokenOperation.java | 115 ---- .../OAuth2RefreshAccessTokenOperation.java | 108 ---- .../exceptions/AccountNotFoundException.java | 23 - .../CertificateCombinedException.java | 140 ----- .../OperationCancelledException.java | 34 -- .../refactor/operations/RemoteOperation.java | 131 ----- .../operations/RemoteOperationResult.java | 500 ------------------ .../files/DownloadRemoteFileOperation.java | 67 --- .../operations/files/PropfindOperation.java | 61 --- .../files/RemoveRemoteFileOperation.java | 65 --- .../files/UploadRemoteFileOperation.java | 103 ---- .../refactor/utils/ErrorMessageParser.java | 138 ----- .../InvalidCharacterExceptionParser.java | 144 ----- .../lib/resources/files/RemoteFile.java | 6 +- 38 files changed, 3 insertions(+), 3973 deletions(-) delete mode 100644 src/com/owncloud/android/lib/refactor/Log_OC.java delete mode 100644 src/com/owncloud/android/lib/refactor/OCContext.java delete mode 100644 src/com/owncloud/android/lib/refactor/OwnCloudContext.java delete mode 100644 src/com/owncloud/android/lib/refactor/account/AccountTypeUtils.java delete mode 100644 src/com/owncloud/android/lib/refactor/account/AccountUtils.java delete mode 100644 src/com/owncloud/android/lib/refactor/account/OCAccount.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/credentials/OCAnonymousCredentials.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/credentials/OCBasicCredentials.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/credentials/OCBearerCredentials.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/credentials/OCCredentials.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/credentials/OCSamlSsoCredentials.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/credentials/OwnCloudCredentialsFactory.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/oauth/BearerAuthScheme.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/oauth/BearerCredentials.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2ClientConfiguration.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2Constants.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2GrantType.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2Provider.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2ProvidersRegistry.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2QueryParser.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2RequestBuilder.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2ResponseParser.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/oauth/OwnCloudOAuth2Provider.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/oauth/OwnCloudOAuth2RequestBuilder.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/oauth/operations/OAuth2GetAccessTokenOperation.java delete mode 100644 src/com/owncloud/android/lib/refactor/authentication/oauth/operations/OAuth2RefreshAccessTokenOperation.java delete mode 100644 src/com/owncloud/android/lib/refactor/exceptions/AccountNotFoundException.java delete mode 100644 src/com/owncloud/android/lib/refactor/exceptions/CertificateCombinedException.java delete mode 100644 src/com/owncloud/android/lib/refactor/exceptions/OperationCancelledException.java delete mode 100644 src/com/owncloud/android/lib/refactor/operations/RemoteOperation.java delete mode 100644 src/com/owncloud/android/lib/refactor/operations/RemoteOperationResult.java delete mode 100644 src/com/owncloud/android/lib/refactor/operations/files/DownloadRemoteFileOperation.java delete mode 100644 src/com/owncloud/android/lib/refactor/operations/files/PropfindOperation.java delete mode 100644 src/com/owncloud/android/lib/refactor/operations/files/RemoveRemoteFileOperation.java delete mode 100644 src/com/owncloud/android/lib/refactor/operations/files/UploadRemoteFileOperation.java delete mode 100644 src/com/owncloud/android/lib/refactor/utils/ErrorMessageParser.java delete mode 100644 src/com/owncloud/android/lib/refactor/utils/InvalidCharacterExceptionParser.java diff --git a/src/com/owncloud/android/lib/refactor/Log_OC.java b/src/com/owncloud/android/lib/refactor/Log_OC.java deleted file mode 100644 index 53499f30..00000000 --- a/src/com/owncloud/android/lib/refactor/Log_OC.java +++ /dev/null @@ -1,212 +0,0 @@ -package com.owncloud.android.lib.refactor; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.text.SimpleDateFormat; -import java.util.Calendar; - -import android.util.Log; - - -public class Log_OC { - private static final String SIMPLE_DATE_FORMAT = "yyyy/MM/dd HH:mm:ss"; - private static final String LOG_FOLDER_NAME = "log"; - private static final long MAX_FILE_SIZE = 1000000; // 1MB - - private static String mOwncloudDataFolderLog = "owncloud_log"; - - private static File mLogFile; - private static File mFolder; - private static BufferedWriter mBuf; - - private static String[] mLogFileNames = {"currentLog.txt", "olderLog.txt"}; - - private static boolean isMaxFileSizeReached = false; - private static boolean isEnabled = false; - - public static void setLogDataFolder(String logFolder){ - mOwncloudDataFolderLog = logFolder; - } - - public static void i(String TAG, String message){ - Log.i(TAG, message); - appendLog(TAG+" : "+ message); - } - - public static void d(String TAG, String message){ - Log.d(TAG, message); - appendLog(TAG + " : " + message); - } - public static void d(String TAG, String message, Exception e) { - Log.d(TAG, message, e); - appendLog(TAG + " : " + message + " Exception : "+ e.getStackTrace()); - } - public static void e(String TAG, String message){ - Log.e(TAG, message); - appendLog(TAG + " : " + message); - } - - public static void e(String TAG, String message, Throwable e) { - Log.e(TAG, message, e); - appendLog(TAG+" : " + message +" Exception : " + e.getStackTrace()); - } - - public static void v(String TAG, String message){ - Log.v(TAG, message); - appendLog(TAG+" : "+ message); - } - - public static void w(String TAG, String message) { - Log.w(TAG, message); - appendLog(TAG+" : "+ message); - } - - public static void wtf(String TAG, String message) { - Log.wtf(TAG, message); - appendLog(TAG+" : "+ message); - } - - /** - * Start doing logging - * @param storagePath : directory for keeping logs - */ - synchronized public static void startLogging(String storagePath) { - String logPath = storagePath + File.separator + - mOwncloudDataFolderLog + File.separator + LOG_FOLDER_NAME; - mFolder = new File(logPath); - mLogFile = new File(mFolder + File.separator + mLogFileNames[0]); - - boolean isFileCreated = false; - - if (!mFolder.exists()) { - mFolder.mkdirs(); - isFileCreated = true; - Log.d("LOG_OC", "Log file created"); - } - - try { - - // Create the current log file if does not exist - mLogFile.createNewFile(); - mBuf = new BufferedWriter(new FileWriter(mLogFile, true)); - isEnabled = true; - - if (isFileCreated) { - appendPhoneInfo(); - } - - } catch (IOException e) { - e.printStackTrace(); - } finally { - if(mBuf != null) { - try { - mBuf.close(); - } catch(IOException e) { - e.printStackTrace(); - } - } - } - } - - synchronized public static void stopLogging() { - try { - if (mBuf != null) - mBuf.close(); - isEnabled = false; - - mLogFile = null; - mFolder = null; - mBuf = null; - isMaxFileSizeReached = false; - isEnabled = false; - - } catch (IOException e) { - // Because we are stopping logging, we only log to Android console. - Log.e("OC_Log", "Closing log file failed: ", e); - } catch (Exception e) { - // This catch should never fire because we do null check on mBuf. - // But just for the sake of stability let's log this odd situation. - // Because we are stopping logging, we only log to Android console. - Log.e("OC_Log", "Stopping logging failed: ", e); - } - } - - /** - * Delete history logging - */ - public static void deleteHistoryLogging() { - File folderLogs = new File(mFolder + File.separator); - if(folderLogs.isDirectory()){ - String[] myFiles = folderLogs.list(); - for (int i=0; i MAX_FILE_SIZE) { - isMaxFileSizeReached = true; - } - } - } - - public static String[] getLogFileNames() { - return mLogFileNames; - } -} diff --git a/src/com/owncloud/android/lib/refactor/OCContext.java b/src/com/owncloud/android/lib/refactor/OCContext.java deleted file mode 100644 index e91a4240..00000000 --- a/src/com/owncloud/android/lib/refactor/OCContext.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.owncloud.android.lib.refactor; - -import com.owncloud.android.lib.refactor.account.OCAccount; - -public class OCContext { - private static final String TAG = OCContext.class.toString(); - private static final int MAX_REDIRECTIONS_COUNT = 3; - private static final int MAX_REPEAT_COUNT_WITH_FRESH_CREDENTIALS = 1; - private static final String PARAM_SINGLE_COOKIE_HEADER = "http.protocol.single-cookie-header"; - private static final boolean PARAM_SINGLE_COOKIE_HEADER_VALUE = true; - private static final String PARAM_PROTOCOL_VERSION = "http.protocol.version"; - - private OCAccount mOCAccount; - private String mUserAgent; - - public OCContext(OCAccount account, String userAgent) { - mOCAccount = account; - mUserAgent = userAgent; - } - - public OCAccount getOCAccount() { - return mOCAccount; - } - - public String getUserAgent() { - return mUserAgent; - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/OwnCloudContext.java b/src/com/owncloud/android/lib/refactor/OwnCloudContext.java deleted file mode 100644 index 008b10e0..00000000 --- a/src/com/owncloud/android/lib/refactor/OwnCloudContext.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.owncloud.android.lib.refactor; - -import android.net.Uri; - -import com.owncloud.android.lib.refactor.authentication.credentials.OCCredentials; - - -public class OwnCloudContext { - private static final String TAG = OwnCloudContext.class.toString(); - - public static final String WEBDAV_PATH_4_0 = "/remote.php/dav"; - public static final String STATUS_PATH = "/status.php"; - public static final String FILES_WEB_PATH = "/index.php/apps/files"; - - private static final int MAX_REDIRECTIONS_COUNT = 3; - private static final int MAX_REPEAT_COUNT_WITH_FRESH_CREDENTIALS = 1; - private static final String PARAM_SINGLE_COOKIE_HEADER = "http.protocol.single-cookie-header"; - private static final boolean PARAM_SINGLE_COOKIE_HEADER_VALUE = true; - private static final String PARAM_PROTOCOL_VERSION = "http.protocol.version"; - - private OCCredentials mCredentials = null; - private Uri mBaseUri; - - public static final class Builder { - OwnCloudContext ocContext = new OwnCloudContext(); - - public Builder setCredentials(OCCredentials credentials) { - ocContext.mCredentials = credentials; - return this; - } - - public Builder setBaseUri(Uri baseUri) { - ocContext.mBaseUri = baseUri; - return this; - } - - public OwnCloudContext build() { - return ocContext; - } - } - - public OCCredentials getCredentials() { - return mCredentials; - } - - public Uri getBaseUri() { - return mBaseUri; - } - - public Uri getWebdavUri() { - return Uri.parse(mBaseUri + WEBDAV_PATH_4_0); - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/account/AccountTypeUtils.java b/src/com/owncloud/android/lib/refactor/account/AccountTypeUtils.java deleted file mode 100644 index 009194e0..00000000 --- a/src/com/owncloud/android/lib/refactor/account/AccountTypeUtils.java +++ /dev/null @@ -1,49 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.account; - -/** - * @author masensio - * @author David A. Velasco - */ -public class AccountTypeUtils { - - public static String getAuthTokenTypePass(String accountType) { - return accountType + ".password"; - } - - public static String getAuthTokenTypeAccessToken(String accountType) { - return accountType + ".oauth2.access_token"; - } - - public static String getAuthTokenTypeRefreshToken(String accountType) { - return accountType + ".oauth2.refresh_token"; - } - - public static String getAuthTokenTypeSamlSessionCookie(String accountType) { - return accountType + ".saml.web_sso.session_cookie"; - } - -} diff --git a/src/com/owncloud/android/lib/refactor/account/AccountUtils.java b/src/com/owncloud/android/lib/refactor/account/AccountUtils.java deleted file mode 100644 index 2abe32c4..00000000 --- a/src/com/owncloud/android/lib/refactor/account/AccountUtils.java +++ /dev/null @@ -1,299 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2017 ownCloud GmbH. - * Copyright (C) 2012 Bartek Przybylski - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.account; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.accounts.AccountsException; -import android.accounts.AuthenticatorException; -import android.accounts.OperationCanceledException; -import android.content.Context; -import android.net.Uri; - -import com.owncloud.android.lib.refactor.Log_OC; -import com.owncloud.android.lib.refactor.operations.RemoteOperation; -import com.owncloud.android.lib.refactor.authentication.credentials.OCBasicCredentials; -import com.owncloud.android.lib.refactor.authentication.credentials.OCBearerCredentials; -import com.owncloud.android.lib.refactor.authentication.credentials.OCCredentials; -import com.owncloud.android.lib.refactor.authentication.credentials.OCSamlSsoCredentials; -import com.owncloud.android.lib.refactor.exceptions.AccountNotFoundException; -import com.owncloud.android.lib.resources.status.OwnCloudVersion; - -import org.apache.commons.httpclient.auth.AuthenticationException; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import okhttp3.Cookie; - -public class AccountUtils { - - private static final String TAG = AccountUtils.class.getSimpleName(); - - /** - * Constructs full url to host and webdav resource basing on host version - * - * @param context Valid Android {@link Context}, needed to access the {@link AccountManager} - * @param account A stored ownCloud {@link Account} - * @return Full URL to WebDAV endpoint in the server corresponding to 'account'. - * @throws AccountNotFoundException When 'account' is unknown for the AccountManager - */ - public static String getWebDavUrlForAccount(Context context, Account account) - throws AccountNotFoundException { - - return getBaseUrlForAccount(context, account) + RemoteOperation.WEBDAV_PATH_4_0; - } - - - /** - * Extracts url server from the account - * - * @param context Valid Android {@link Context}, needed to access the {@link AccountManager} - * @param account A stored ownCloud {@link Account} - * @return Full URL to the server corresponding to 'account', ending in the base path - * common to all API endpoints. - * @throws AccountNotFoundException When 'account' is unknown for the AccountManager - */ - public static String getBaseUrlForAccount(Context context, Account account) - throws AccountNotFoundException { - AccountManager ama = AccountManager.get(context.getApplicationContext()); - String baseurl = ama.getUserData(account, Constants.KEY_OC_BASE_URL); - - if (baseurl == null) - throw new AccountNotFoundException(account, "Account not found", null); - - return baseurl; - } - - - /** - * Get the username corresponding to an OC account. - * - * @param account An OC account - * @return Username for the given account, extracted from the account.name - */ - public static String getUsernameForAccount(Account account) { - String username = null; - try { - username = account.name.substring(0, account.name.lastIndexOf('@')); - } catch (Exception e) { - Log_OC.e(TAG, "Couldn't get a username for the given account", e); - } - return username; - } - - /** - * Get the stored server version corresponding to an OC account. - * - * @param account An OC account - * @param context Application context - * @return Version of the OC server, according to last check - */ - public static OwnCloudVersion getServerVersionForAccount(Account account, Context context) { - AccountManager ama = AccountManager.get(context); - OwnCloudVersion version = null; - try { - String versionString = ama.getUserData(account, Constants.KEY_OC_VERSION); - version = new OwnCloudVersion(versionString); - - } catch (Exception e) { - Log_OC.e(TAG, "Couldn't get a the server version for an account", e); - } - return version; - } - - /** - * @return OCCredentials - * @throws IOException - * @throws AuthenticatorException - * @throws OperationCanceledException - */ - - /** - * - * @param context an Android context - * @param account the coresponding Android account - * @return - * @throws OperationCanceledException - * @throws AuthenticatorException - * @throws IOException - */ - public static OCCredentials getCredentialsForAccount(Context context, Account account) - throws OperationCanceledException, AuthenticatorException, IOException { - - final AccountManager am = AccountManager.get(context); - final String supportsOAuth2 = am.getUserData(account, AccountUtils.Constants.KEY_SUPPORTS_OAUTH2); - final boolean isOauth2 = supportsOAuth2 != null && supportsOAuth2.equals("TRUE"); - String supportsSamlSSo = am.getUserData(account, - AccountUtils.Constants.KEY_SUPPORTS_SAML_WEB_SSO); - final boolean isSamlSso = supportsSamlSSo != null && supportsSamlSSo.equals("TRUE"); - final String username = AccountUtils.getUsernameForAccount(account); - - if (isOauth2) { - final String accessToken = am.blockingGetAuthToken( - account, - AccountTypeUtils.getAuthTokenTypeAccessToken(account.type), - false); - - return new OCBearerCredentials(username, accessToken); - - } else if (isSamlSso) { - - try { - final String accessToken = am.blockingGetAuthToken( - account, - AccountTypeUtils.getAuthTokenTypeSamlSessionCookie(account.type), - false); - - return new OCSamlSsoCredentials(username, accessToken, - Uri.parse(getBaseUrlForAccount(context, account))); - } catch (AccountNotFoundException e) { - throw new AuthenticationException("Account not found", e); - } - - } else { - final String password = am.blockingGetAuthToken( - account, - AccountTypeUtils.getAuthTokenTypePass(account.type), - false); - - return new OCBasicCredentials(username, password); - } - } - - - public static String buildAccountName(Uri serverBaseUrl, String username) { - if (serverBaseUrl.getScheme() == null) { - serverBaseUrl = Uri.parse("https://" + serverBaseUrl.toString()); - } - - // Remove http:// or https:// - String url = serverBaseUrl.toString(); - if (url.contains("://")) { - url = url.substring(serverBaseUrl.toString().indexOf("://") + 3); - } - String accountName = username + "@" + url; - - return accountName; - } - - public static void saveCookies(List cookies, Account savedAccount, Context context) { - - // Account Manager - AccountManager ac = AccountManager.get(context.getApplicationContext()); - - if (cookies != null && cookies.size() != 0) { - StringBuilder cookiesString = new StringBuilder(); - for (Cookie cookie : cookies) { - cookiesString.append(cookiesString + cookie.toString() + ";"); - } - - ac.setUserData(savedAccount, Constants.KEY_COOKIES, cookiesString.toString()); - } - - } - - - /** - * Restore the client cookies persisted in an account stored in the system AccountManager. - * - * @param account - * @param context - * @return - * @throws AccountsException - */ - public static List getCookiesFromAccount(Account account, Context context) throws AccountsException { - if (account == null) { - Log_OC.d(TAG, "Cannot restore cookie for null account"); - return new ArrayList<>(); - } - - Log_OC.d(TAG, "Restoring cookies for " + account.name); - - final AccountManager am = AccountManager.get(context.getApplicationContext()); - final Uri serverUri = Uri.parse(getBaseUrlForAccount(context, account)); - final String cookiesString = am.getUserData(account, Constants.KEY_COOKIES); - final List cookies = new ArrayList<>(); - - if (cookiesString != null) { - String[] rawCookies = cookiesString.split(";"); - for (String rawCookie : rawCookies) { - final int equalPos = rawCookie.indexOf('='); - - cookies.add(new Cookie.Builder() - .name(rawCookie.substring(0, equalPos)) - .value(rawCookie.substring(equalPos + 1)) - .domain(serverUri.getHost()) - .path(serverUri.getPath()) - .build()); - } - } - return cookies; - } - - public static class Constants { - /** - * Version should be 3 numbers separated by dot so it can be parsed by - * {@link OwnCloudVersion} - */ - public static final String KEY_OC_VERSION = "oc_version"; - /** - * Base url should point to owncloud installation without trailing / ie: - * http://server/path or https://owncloud.server - */ - public static final String KEY_OC_BASE_URL = "oc_base_url"; - /** - * Flag signaling if the ownCloud server can be accessed with OAuth2 access tokens. - */ - public static final String KEY_SUPPORTS_OAUTH2 = "oc_supports_oauth2"; - /** - * Flag signaling if the ownCloud server can be accessed with session cookies from SAML-based web single-sign-on. - */ - public static final String KEY_SUPPORTS_SAML_WEB_SSO = "oc_supports_saml_web_sso"; - /** - * OC account cookies - */ - public static final String KEY_COOKIES = "oc_account_cookies"; - - /** - * OC account version - */ - public static final String KEY_OC_ACCOUNT_VERSION = "oc_account_version"; - - /** - * User's display name - */ - public static final String KEY_DISPLAY_NAME = "oc_display_name"; - - /** - * OAuth2 refresh token - **/ - public static final String KEY_OAUTH2_REFRESH_TOKEN = "oc_oauth2_refresh_token"; - - } - -} diff --git a/src/com/owncloud/android/lib/refactor/account/OCAccount.java b/src/com/owncloud/android/lib/refactor/account/OCAccount.java deleted file mode 100644 index a84eac2d..00000000 --- a/src/com/owncloud/android/lib/refactor/account/OCAccount.java +++ /dev/null @@ -1,159 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.account; - -import android.accounts.Account; -import android.accounts.AccountManager; -import android.accounts.AuthenticatorException; -import android.accounts.OperationCanceledException; -import android.content.Context; -import android.net.Uri; - -import com.owncloud.android.lib.refactor.authentication.credentials.OCAnonymousCredentials; -import com.owncloud.android.lib.refactor.authentication.credentials.OCCredentials; -import com.owncloud.android.lib.refactor.exceptions.AccountNotFoundException; - -import org.apache.commons.httpclient.auth.AuthenticationException; - -import java.io.IOException; - -/** - * OwnCloud Account - * - * @author David A. Velasco - */ -public class OCAccount { - - private Uri mBaseUri; - private OCCredentials mCredentials; - private String mDisplayName; - private String mSavedAccountName; - private Account mSavedAccount; - - - /** - * Constructor for already saved OC accounts. - * - * Do not use for anonymous credentials. - */ - public OCAccount(Account savedAccount, Context context) throws AccountNotFoundException, IOException, OperationCanceledException, AuthenticatorException { - if (savedAccount == null) { - throw new IllegalArgumentException("Parameter 'savedAccount' cannot be null"); - } - - if (context == null) { - throw new IllegalArgumentException("Parameter 'context' cannot be null"); - } - - mSavedAccount = savedAccount; - mSavedAccountName = savedAccount.name; - mCredentials = AccountUtils.getCredentialsForAccount(context, savedAccount); - - AccountManager ama = AccountManager.get(context.getApplicationContext()); - String baseUrl = ama.getUserData(mSavedAccount, AccountUtils.Constants.KEY_OC_BASE_URL); - if (baseUrl == null ) { - throw new AccountNotFoundException(mSavedAccount, "Account not found", null); - } - mBaseUri = Uri.parse(AccountUtils.getBaseUrlForAccount(context, mSavedAccount)); - mDisplayName = ama.getUserData(mSavedAccount, AccountUtils.Constants.KEY_DISPLAY_NAME); - } - - - /** - * Constructor for non yet saved OC accounts. - * - * @param baseUri URI to the OC server to get access to. - * @param credentials Credentials to authenticate in the server. NULL is valid for anonymous credentials. - */ - public OCAccount(Uri baseUri, OCCredentials credentials) { - if (baseUri == null) { - throw new IllegalArgumentException("Parameter 'baseUri' cannot be null"); - } - mSavedAccount = null; - mSavedAccountName = null; - if(baseUri != null && !baseUri.equals("")) { - mBaseUri = baseUri; - } else { - throw new IllegalArgumentException("baseUri can not be null or empty"); - } - mCredentials = credentials != null - ? credentials - : new OCAnonymousCredentials(); - String username = mCredentials.getUsername(); - if (username != null) { - mSavedAccountName = AccountUtils.buildAccountName(mBaseUri, username); - } - } - - /** - * Method for deferred load of account attributes from AccountManager - * - * @param context - * @throws AccountNotFoundException - * @throws AuthenticatorException - * @throws IOException - * @throws OperationCanceledException - */ - public void loadCredentials(Context context) - throws AccountNotFoundException, AuthenticatorException, - IOException, OperationCanceledException { - - if (context == null) { - throw new IllegalArgumentException("Parameter 'context' cannot be null"); - } - - if (mSavedAccount != null) { - mCredentials = AccountUtils.getCredentialsForAccount(context, mSavedAccount); - } - } - - public Uri getBaseUri() { - return mBaseUri; - } - - public OCCredentials getCredentials() { - return mCredentials; - } - - public String getName() { - return mSavedAccountName; - } - - public Account getSavedAccount() { - return mSavedAccount; - } - - public String getDisplayName() { - if (mDisplayName != null && mDisplayName.length() > 0) { - return mDisplayName; - } else if (mCredentials != null) { - return mCredentials.getUsername(); - } else if (mSavedAccount != null) { - return AccountUtils.getUsernameForAccount(mSavedAccount); - } else { - return null; - } - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCAnonymousCredentials.java b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCAnonymousCredentials.java deleted file mode 100644 index fa0d04c5..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCAnonymousCredentials.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.owncloud.android.lib.refactor.authentication.credentials; - -import java.util.HashMap; -import java.util.Map; -public class OCAnonymousCredentials implements OCCredentials { - - @Override - public Map getCredentialHeaders() { - return new HashMap<>(0); - } - - @Override - public String getCredentialCookie() { - return null; - } - - @Override - public String getUsername() { - return ""; - } - - @Override - public String getAuthToken() { - return null; - } - - @Override - public boolean authTokenCanBeRefreshed() { - return false; - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCBasicCredentials.java b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCBasicCredentials.java deleted file mode 100644 index abb2b27b..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCBasicCredentials.java +++ /dev/null @@ -1,67 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ -package com.owncloud.android.lib.refactor.authentication.credentials; - -import java.util.HashMap; -import java.util.Map; - -import okhttp3.Credentials; - -public class OCBasicCredentials implements OCCredentials { - - private String mUsername; - private String mPassword; - - public OCBasicCredentials(String username, String password) { - mUsername = username != null ? username : ""; - mPassword = password != null ? password : ""; - } - - @Override - public Map getCredentialHeaders() { - HashMap header = new HashMap<>(1); - header.put("Authorization", Credentials.basic(mUsername, mPassword)); - return header; - } - - @Override - public String getCredentialCookie() { - return null; - } - - @Override - public String getUsername() { - return mUsername; - } - - @Override - public String getAuthToken() { - return mPassword; - } - - @Override - public boolean authTokenCanBeRefreshed() { - return false; - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCBearerCredentials.java b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCBearerCredentials.java deleted file mode 100644 index 92f35689..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCBearerCredentials.java +++ /dev/null @@ -1,67 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ -package com.owncloud.android.lib.refactor.authentication.credentials; - -import java.util.HashMap; -import java.util.Map; - -public class OCBearerCredentials implements OCCredentials { - - private String mUsername; - private String mAccessToken; - - public OCBearerCredentials(String username, String accessToken) { - mUsername = username != null ? username : ""; - mAccessToken = accessToken != null ? accessToken : ""; - } - - @Override - public Map getCredentialHeaders() { - HashMap header = new HashMap<>(1); - header.put("Authorization", "Bearer " + mAccessToken); - return header; - } - - @Override - public String getCredentialCookie() { - return null; - } - - @Override - public String getUsername() { - // not relevant for authentication, but relevant for informational purposes - return mUsername; - } - - @Override - public String getAuthToken() { - return mAccessToken; - } - - @Override - public boolean authTokenCanBeRefreshed() { - return true; - } - -} diff --git a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCCredentials.java b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCCredentials.java deleted file mode 100644 index 63ff805b..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCCredentials.java +++ /dev/null @@ -1,41 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.authentication.credentials; - -import java.util.Map; - -public interface OCCredentials { - - Map getCredentialHeaders(); - - //TODO: Remove this once SAML is obsolet - String getCredentialCookie(); - - String getUsername(); - - String getAuthToken(); - - boolean authTokenCanBeRefreshed(); -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCSamlSsoCredentials.java b/src/com/owncloud/android/lib/refactor/authentication/credentials/OCSamlSsoCredentials.java deleted file mode 100644 index b974a79c..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/credentials/OCSamlSsoCredentials.java +++ /dev/null @@ -1,85 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ -package com.owncloud.android.lib.refactor.authentication.credentials; - -import android.net.Uri; - -import org.apache.commons.httpclient.Cookie; -import java.util.HashMap; -import java.util.Map; - -public class OCSamlSsoCredentials implements OCCredentials { - - private final String mUsername; - private final String mSessionCookie; - private final Uri mBaseUrl; - - public OCSamlSsoCredentials(String username, String sessionCookie, Uri baseUrl) { - mUsername = username != null ? username : ""; - mSessionCookie = sessionCookie != null ? sessionCookie : ""; - mBaseUrl = baseUrl; - } - - @Override - public String getCredentialCookie() { - - String[] rawCookies = mSessionCookie.split(";"); - StringBuilder processedCookies = new StringBuilder(); - Cookie cookie = null; - for (final String rawCookie : rawCookies) { - int equalPos = rawCookie.indexOf('='); - if (equalPos >= 0) { - cookie = new Cookie(); - cookie.setName(rawCookie.substring(0, equalPos)); - cookie.setValue(rawCookie.substring(equalPos + 1)); - cookie.setDomain(mBaseUrl.getHost()); // VERY IMPORTANT - cookie.setPath(mBaseUrl.getPath()); // VERY IMPORTANT - processedCookies.append(cookie.toExternalForm() + ";"); - } - } - return processedCookies.toString(); - } - - @Override - public Map getCredentialHeaders() { - return new HashMap<>(0); - } - - @Override - public String getUsername() { - // not relevant for authentication, but relevant for informational purposes - return mUsername; - } - - @Override - public String getAuthToken() { - return mSessionCookie; - } - - @Override - public boolean authTokenCanBeRefreshed() { - return false; - } - -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/authentication/credentials/OwnCloudCredentialsFactory.java b/src/com/owncloud/android/lib/refactor/authentication/credentials/OwnCloudCredentialsFactory.java deleted file mode 100644 index 3bcc1ef6..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/credentials/OwnCloudCredentialsFactory.java +++ /dev/null @@ -1,85 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.authentication.credentials; - -import java.util.Map; - -public class OwnCloudCredentialsFactory { - - public static final String CREDENTIAL_CHARSET = "UTF-8"; - - private static OCAnonymousCredentials sAnonymousCredentials; - - public static OCCredentials newBasicCredentials(String username, String password) { - return new OCBasicCredentials(username, password); - } - - public static OCCredentials newBearerCredentials(String username, String authToken) { - return new OCBearerCredentials(username, authToken); - } - - public static OCCredentials newSamlSsoCredentials(String username, String sessionCookie) { - return new OCSamlSsoCredentials(username, sessionCookie, null); - } - - public static final OCCredentials getAnonymousCredentials() { - if (sAnonymousCredentials == null) { - sAnonymousCredentials = new OCAnonymousCredentials(); - } - return sAnonymousCredentials; - } - - public static final class OCAnonymousCredentials implements OCCredentials { - - protected OCAnonymousCredentials() { - } - - @Override - public String getAuthToken() { - return ""; - } - - @Override - public boolean authTokenCanBeRefreshed() { - return false; - } - - @Override - public Map getCredentialHeaders() { - return null; - } - - @Override - public String getCredentialCookie() { - return null; - } - - @Override - public String getUsername() { - // no user name - return null; - } - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/BearerAuthScheme.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/BearerAuthScheme.java deleted file mode 100644 index b37fdfd7..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/BearerAuthScheme.java +++ /dev/null @@ -1,261 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.authentication.oauth; - -import org.apache.commons.httpclient.Credentials; -import org.apache.commons.httpclient.HttpMethod; -import org.apache.commons.httpclient.auth.AuthChallengeParser; -import org.apache.commons.httpclient.auth.AuthScheme; -import org.apache.commons.httpclient.auth.AuthenticationException; -import org.apache.commons.httpclient.auth.InvalidCredentialsException; -import org.apache.commons.httpclient.auth.MalformedChallengeException; - -import java.util.Map; - - -/** - * Bearer authentication scheme as defined in RFC 6750. - * - * @author David A. Velasco - */ - -public class BearerAuthScheme implements AuthScheme /*extends RFC2617Scheme*/ { - - private static final String TAG = BearerAuthScheme.class.getSimpleName(); - - public static final String AUTH_POLICY = "Bearer"; - - /** Whether the bearer authentication process is complete */ - private boolean mComplete; - - /** Authentication parameter map */ - @SuppressWarnings("rawtypes") - private Map mParams = null; - - - /** - * Default constructor for the bearer authentication scheme. - */ - public BearerAuthScheme() { - mComplete = false; - } - - /** - * Constructor for the basic authentication scheme. - * - * @param challenge Authentication challenge - * - * @throws MalformedChallengeException Thrown if the authentication challenge is malformed - */ - public BearerAuthScheme(final String challenge) throws MalformedChallengeException { - processChallenge(challenge); - mComplete = true; - } - - /** - * Returns textual designation of the bearer authentication scheme. - * - * @return "Bearer" - */ - public String getSchemeName() { - return "bearer"; - } - - /** - * Processes the Bearer challenge. - * - * @param challenge The challenge string - * - * @throws MalformedChallengeException Thrown if the authentication challenge is malformed - */ - public void processChallenge(String challenge) throws MalformedChallengeException { - String s = AuthChallengeParser.extractScheme(challenge); - if (!s.equalsIgnoreCase(getSchemeName())) { - throw new MalformedChallengeException( - "Invalid " + getSchemeName() + " challenge: " + challenge); - } - mParams = AuthChallengeParser.extractParams(challenge); - mComplete = true; - } - - /** - * Tests if the Bearer authentication process has been completed. - * - * @return 'true' if Bearer authorization has been processed, 'false' otherwise. - */ - public boolean isComplete() { - return this.mComplete; - } - - /** - * Produces bearer authorization string for the given set of - * {@link Credentials}. - * - * @param credentials The set of credentials to be used for authentication - * @param method Method name is ignored by the bearer authentication scheme - * @param uri URI is ignored by the bearer authentication scheme - * @throws InvalidCredentialsException If authentication credentials are not valid or not applicable - * for this authentication scheme - * @throws AuthenticationException If authorization string cannot be generated due to an authentication failure - * @return A bearer authorization string - */ - public String authenticate(Credentials credentials, String method, String uri) throws AuthenticationException { - BearerCredentials bearer; - try { - bearer = (BearerCredentials) credentials; - } catch (ClassCastException e) { - throw new InvalidCredentialsException( - "Credentials cannot be used for bearer authentication: " - + credentials.getClass().getName()); - } - return BearerAuthScheme.authenticate(bearer); - } - - - /** - * Returns 'false'. Bearer authentication scheme is request based. - * - * @return 'false'. - */ - public boolean isConnectionBased() { - return false; - } - - /** - * Produces bearer authorization string for the given set of {@link Credentials}. - * - * @param credentials The set of credentials to be used for authentication - * @param method The method being authenticated - * @throws InvalidCredentialsException If authentication credentials are not valid or not applicable for this authentication - * scheme. - * @throws AuthenticationException If authorization string cannot be generated due to an authentication failure. - * - * @return a basic authorization string - */ - public String authenticate(Credentials credentials, HttpMethod method) throws AuthenticationException { - if (method == null) { - throw new IllegalArgumentException("Method may not be null"); - } - BearerCredentials bearer = null; - try { - bearer = (BearerCredentials) credentials; - } catch (ClassCastException e) { - throw new InvalidCredentialsException( - "Credentials cannot be used for bearer authentication: " - + credentials.getClass().getName()); - } - return BearerAuthScheme.authenticate( - bearer, - method.getParams().getCredentialCharset()); - } - - /** - * Returns a bearer Authorization header value for the given - * {@link BearerCredentials}. - * - * @param credentials The credentials to encode. - * - * @return A bearer authorization string - */ - public static String authenticate(BearerCredentials credentials) { - return authenticate(credentials, "ISO-8859-1"); - } - - /** - * Returns a bearer Authorization header value for the given - * {@link BearerCredentials} and charset. - * - * @param credentials The credentials to encode. - * @param charset The charset to use for encoding the credentials - * - * @return A bearer authorization string - * - * @since 3.0 - */ - public static String authenticate(BearerCredentials credentials, String charset) { - - if (credentials == null) { - throw new IllegalArgumentException("Credentials may not be null"); - } - if (charset == null || charset.length() == 0) { - throw new IllegalArgumentException("charset may not be null or empty"); - } - StringBuffer buffer = new StringBuffer(); - buffer.append(credentials.getAccessToken()); - - return "Bearer " + buffer.toString(); - } - - /** - * Returns a String identifying the authentication challenge. This is - * used, in combination with the host and port to determine if - * authorization has already been attempted or not. Schemes which - * require multiple requests to complete the authentication should - * return a different value for each stage in the request. - * - * Additionally, the ID should take into account any changes to the - * authentication challenge and return a different value when appropriate. - * For example when the realm changes in basic authentication it should be - * considered a different authentication attempt and a different value should - * be returned. - * - * This method simply returns the realm for the challenge. - * - * @return String a String identifying the authentication challenge. - */ - @Override - public String getID() { - return getRealm(); - } - - /** - * Returns authentication parameter with the given name, if available. - * - * @param name The name of the parameter to be returned - * - * @return The parameter with the given name - */ - @Override - public String getParameter(String name) { - if (name == null) { - throw new IllegalArgumentException("Parameter name may not be null"); - } - if (mParams == null) { - return null; - } - return (String) mParams.get(name.toLowerCase()); - } - - /** - * Returns authentication realm. The realm may not be null. - * - * @return The authentication realm - */ - @Override - public String getRealm() { - return getParameter("realm"); - } - -} diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/BearerCredentials.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/BearerCredentials.java deleted file mode 100644 index 6771a6af..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/BearerCredentials.java +++ /dev/null @@ -1,102 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.authentication.oauth; - -import org.apache.commons.httpclient.util.LangUtils; - -/** - * - * @author David A. Velasco - */ -public class BearerCredentials { - - - private String mAccessToken; - - - /** - * The constructor with the bearer token - * - * @param token The bearer token - */ - public BearerCredentials(String token) { - /*if (token == null) { - throw new IllegalArgumentException("Bearer token may not be null"); - }*/ - mAccessToken = (token == null) ? "" : token; - } - - - /** - * Returns the access token - * - * @return The access token - */ - public String getAccessToken() { - return mAccessToken; - } - - - /** - * Get this object string. - * - * @return The access token - */ - public String toString() { - return mAccessToken; - } - - /** - * Does a hash of the access token. - * - * @return The hash code of the access token - */ - public int hashCode() { - int hash = LangUtils.HASH_SEED; - hash = LangUtils.hashCode(hash, mAccessToken); - return hash; - } - - /** - * These credentials are assumed equal if accessToken is the same. - * - * @param o The other object to compare with. - * - * @return 'True' if the object is equivalent. - */ - public boolean equals(Object o) { - if (o == null) return false; - if (this == o) return true; - if (this.getClass().equals(o.getClass())) { - BearerCredentials that = (BearerCredentials) o; - if (LangUtils.equals(mAccessToken, that.mAccessToken)) { - return true; - } - } - return false; - } - -} - diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2ClientConfiguration.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2ClientConfiguration.java deleted file mode 100644 index 62b01f33..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2ClientConfiguration.java +++ /dev/null @@ -1,55 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * - * @author David A. Velasco - * Copyright (C) 2017 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.authentication.oauth; - -public class OAuth2ClientConfiguration { - - private String mClientId; - - private String mClientSecret; - - private String mRedirectUri; - - public OAuth2ClientConfiguration(String clientId, String clientSecret, String redirectUri) { - mClientId = (clientId == null) ? "" : clientId; - mClientSecret = (clientSecret == null) ? "" : clientSecret; - mRedirectUri = (redirectUri == null) ? "" : redirectUri; - } - - public String getClientId() { - return mClientId; - } - - public String getClientSecret() { - return mClientSecret; - } - - public String getRedirectUri() { - return mRedirectUri; - } - -} diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2Constants.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2Constants.java deleted file mode 100644 index e390e357..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2Constants.java +++ /dev/null @@ -1,68 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * - * @author David A. Velasco - * Copyright (C) 2017 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.authentication.oauth; - -/** - * Constant values for OAuth 2 protocol. - * - * Includes required and optional parameter NAMES used in the 'authorization code' grant type. - */ - -public class OAuth2Constants { - - /// Parameters to send to the Authorization Endpoint - public static final String KEY_RESPONSE_TYPE = "response_type"; - public static final String KEY_REDIRECT_URI = "redirect_uri"; - public static final String KEY_CLIENT_ID = "client_id"; - public static final String KEY_SCOPE = "scope"; - public static final String KEY_STATE = "state"; - - /// Additional parameters to send to the Token Endpoint - public static final String KEY_GRANT_TYPE = "grant_type"; - public static final String KEY_CODE = "code"; - - // Used to get the Access Token using Refresh Token - public static final String OAUTH2_REFRESH_TOKEN_GRANT_TYPE = "refresh_token"; - - /// Parameters received in an OK response from the Token Endpoint - public static final String KEY_ACCESS_TOKEN = "access_token"; - public static final String KEY_TOKEN_TYPE = "token_type"; - public static final String KEY_EXPIRES_IN = "expires_in"; - public static final String KEY_REFRESH_TOKEN = "refresh_token"; - - /// Parameters in an ERROR response - public static final String KEY_ERROR = "error"; - public static final String KEY_ERROR_DESCRIPTION = "error_description"; - public static final String KEY_ERROR_URI = "error_uri"; - public static final String VALUE_ERROR_ACCESS_DENIED = "access_denied"; - - /// Extra not standard - public static final String KEY_USER_ID = "user_id"; - - /// Depends on oauth2 grant type - public static final String OAUTH2_RESPONSE_TYPE_CODE = "code"; -} diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2GrantType.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2GrantType.java deleted file mode 100644 index 4010da2f..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2GrantType.java +++ /dev/null @@ -1,46 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * - * @author David A. Velasco - * Copyright (C) 2017 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.authentication.oauth; - -public enum OAuth2GrantType { - AUTHORIZATION_CODE("authorization_code"), - IMPLICIT("implicit"), - PASSWORD("password"), - CLIENT_CREDENTIAL("client_credentials"), - REFRESH_TOKEN("refresh_token") // not a grant type conceptually, but used as such to refresh access tokens - ; - - private String mValue; - - OAuth2GrantType(String value) { - mValue = value; - } - - public String getValue() { - return mValue; - } -} diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2Provider.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2Provider.java deleted file mode 100644 index f6f7c88a..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2Provider.java +++ /dev/null @@ -1,66 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * - * @author David A. Velasco - * Copyright (C) 2017 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.authentication.oauth; - -public interface OAuth2Provider { - - /** - * {@link OAuth2RequestBuilder} implementation for this provider. - * - * @return {@link OAuth2RequestBuilder} implementation. - */ - OAuth2RequestBuilder getOperationBuilder(); - - - /** - * Set configuration of the client that will use this {@link OAuth2Provider} - * @param oAuth2ClientConfiguration Configuration of the client that will use this {@link OAuth2Provider} - */ - void setClientConfiguration(OAuth2ClientConfiguration oAuth2ClientConfiguration); - - /** - * Configuration of the client that is using this {@link OAuth2Provider} - * return Configuration of the client that is usinng this {@link OAuth2Provider} - */ - OAuth2ClientConfiguration getClientConfiguration(); - - - /** - * Set base URI to authorization server. - * - * @param authorizationServerUri Set base URL to authorization server. - */ - void setAuthorizationServerUri(String authorizationServerUri); - - /** - * base URI to authorization server. - * - * @return Base URL to authorization server. - */ - String getAuthorizationServerUri(); - -} diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2ProvidersRegistry.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2ProvidersRegistry.java deleted file mode 100644 index 11014cf1..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2ProvidersRegistry.java +++ /dev/null @@ -1,122 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * - * @author David A. Velasco - * Copyright (C) 2017 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.authentication.oauth; - - -import java.util.HashMap; -import java.util.Map; - -public class OAuth2ProvidersRegistry { - - private Map mProviders = new HashMap<>(); - - private OAuth2Provider mDefaultProvider = null; - - private OAuth2ProvidersRegistry () { - } - - /** - * See https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom - */ - private static class LazyHolder { - private static final OAuth2ProvidersRegistry INSTANCE = new OAuth2ProvidersRegistry(); - } - - /** - * Singleton accesor. - * - * @return Singleton isntance of {@link OAuth2ProvidersRegistry} - */ - public static OAuth2ProvidersRegistry getInstance() { - return LazyHolder.INSTANCE; - } - - /** - * Register an {@link OAuth2Provider} with the name passed as parameter. - * - * @param name Name to bind 'oAuthProvider' in the registry. - * @param oAuth2Provider An {@link OAuth2Provider} instance to keep in the registry. - * @throws IllegalArgumentException if 'name' or 'oAuthProvider' are null. - */ - public void registerProvider(String name, OAuth2Provider oAuth2Provider) { - if (name == null) { - throw new IllegalArgumentException("Name must not be NULL"); - } - if (oAuth2Provider == null) { - throw new IllegalArgumentException("oAuth2Provider must not be NULL"); - } - - mProviders.put(name, oAuth2Provider); - if (mProviders.size() == 1) { - mDefaultProvider = oAuth2Provider; - } - } - - public OAuth2Provider unregisterProvider(String name) { - OAuth2Provider unregisteredProvider = mProviders.remove(name); - if (mProviders.size() == 0) { - mDefaultProvider = null; - } else if (unregisteredProvider != null && unregisteredProvider == mDefaultProvider) { - mDefaultProvider = mProviders.values().iterator().next(); - } - return unregisteredProvider; - } - - /** - * Get default {@link OAuth2Provider}. - * - * @return Default provider, or NULL if there is no provider. - */ - public OAuth2Provider getProvider() { - return mDefaultProvider; - } - - /** - * Get {@link OAuth2Provider} registered with the name passed as parameter. - * - * @param name Name used to register the desired {@link OAuth2Provider} - * @return {@link OAuth2Provider} registered with the name 'name' - */ - public OAuth2Provider getProvider(String name) { - return mProviders.get(name); - } - - /** - * Sets the {@link OAuth2Provider} registered with the name passed as parameter as the default provider - * - * @param name Name used to register the {@link OAuth2Provider} to set as default. - * @return {@link OAuth2Provider} set as default, or NULL if no provider was registered with 'name'. - */ - public OAuth2Provider setDefaultProvider(String name) { - OAuth2Provider toDefault = mProviders.get(name); - if (toDefault != null) { - mDefaultProvider = toDefault; - } - return toDefault; - } - -} diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2QueryParser.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2QueryParser.java deleted file mode 100644 index e3fc6a31..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2QueryParser.java +++ /dev/null @@ -1,75 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * - * @author David A. Velasco - * Copyright (C) 2017 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.authentication.oauth; - -import com.owncloud.android.lib.refactor.Log_OC; - -import java.util.HashMap; -import java.util.Map; - - -public class OAuth2QueryParser { - - private static final String TAG = OAuth2QueryParser.class.getName(); - - private Map mOAuth2ParsedAuthorizationResponse; - - public OAuth2QueryParser() { - mOAuth2ParsedAuthorizationResponse = new HashMap<>(); - } - - public Map parse(String query) { - mOAuth2ParsedAuthorizationResponse.clear(); - - if (query != null) { - String[] pairs = query.split("&"); - int i = 0; - String key = ""; - String value; - 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; - } else if (j == 1) { - value = p; - mOAuth2ParsedAuthorizationResponse.put(key, value); - } - - Log_OC.v(TAG, "[" + i + "," + j + "] = " + p); - j++; - } - i++; - } - } - - return mOAuth2ParsedAuthorizationResponse; - } - -} diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2RequestBuilder.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2RequestBuilder.java deleted file mode 100644 index dc49b525..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2RequestBuilder.java +++ /dev/null @@ -1,48 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * - * @author David A. Velasco - * Copyright (C) 2017 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.authentication.oauth; - -import com.owncloud.android.lib.refactor.operations.RemoteOperation; - -public interface OAuth2RequestBuilder { - - enum OAuthRequest { - GET_AUTHORIZATION_CODE, CREATE_ACCESS_TOKEN, REFRESH_ACCESS_TOKEN - } - - void setRequest(OAuthRequest operation); - - void setGrantType(OAuth2GrantType grantType); - - void setAuthorizationCode(String code); - - void setRefreshToken(String refreshToken); - - RemoteOperation buildOperation(); - - String buildUri(); -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2ResponseParser.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2ResponseParser.java deleted file mode 100644 index 86fb2a24..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/OAuth2ResponseParser.java +++ /dev/null @@ -1,77 +0,0 @@ -/** - * ownCloud Android client application - * - * @author David A. Velasco - * - * Copyright (C) 2017 ownCloud GmbH. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.owncloud.android.lib.refactor.authentication.oauth; - - -import org.json.JSONException; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.Map; - -public class OAuth2ResponseParser { - - public Map parseAccessTokenResult(JSONObject tokenJson) throws JSONException { - Map resultTokenMap = new HashMap<>(); - - if (tokenJson.has(OAuth2Constants.KEY_ACCESS_TOKEN)) { - resultTokenMap.put(OAuth2Constants.KEY_ACCESS_TOKEN, tokenJson. - getString(OAuth2Constants.KEY_ACCESS_TOKEN)); - } - if (tokenJson.has(OAuth2Constants.KEY_TOKEN_TYPE)) { - resultTokenMap.put(OAuth2Constants.KEY_TOKEN_TYPE, tokenJson. - getString(OAuth2Constants.KEY_TOKEN_TYPE)); - } - if (tokenJson.has(OAuth2Constants.KEY_EXPIRES_IN)) { - resultTokenMap.put(OAuth2Constants.KEY_EXPIRES_IN, tokenJson. - getString(OAuth2Constants.KEY_EXPIRES_IN)); - } - if (tokenJson.has(OAuth2Constants.KEY_REFRESH_TOKEN)) { - resultTokenMap.put(OAuth2Constants.KEY_REFRESH_TOKEN, tokenJson. - getString(OAuth2Constants.KEY_REFRESH_TOKEN)); - } - if (tokenJson.has(OAuth2Constants.KEY_SCOPE)) { - resultTokenMap.put(OAuth2Constants.KEY_SCOPE, tokenJson. - getString(OAuth2Constants.KEY_SCOPE)); - } - if (tokenJson.has(OAuth2Constants.KEY_ERROR)) { - resultTokenMap.put(OAuth2Constants.KEY_ERROR, tokenJson. - getString(OAuth2Constants.KEY_ERROR)); - } - if (tokenJson.has(OAuth2Constants.KEY_ERROR_DESCRIPTION)) { - resultTokenMap.put(OAuth2Constants.KEY_ERROR_DESCRIPTION, tokenJson. - getString(OAuth2Constants.KEY_ERROR_DESCRIPTION)); - } - if (tokenJson.has(OAuth2Constants.KEY_ERROR_URI)) { - resultTokenMap.put(OAuth2Constants.KEY_ERROR_URI, tokenJson. - getString(OAuth2Constants.KEY_ERROR_URI)); - } - - if (tokenJson.has(OAuth2Constants.KEY_USER_ID)) { // not standard - resultTokenMap.put(OAuth2Constants.KEY_USER_ID, tokenJson. - getString(OAuth2Constants.KEY_USER_ID)); - } - - return resultTokenMap; - } - -} diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/OwnCloudOAuth2Provider.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/OwnCloudOAuth2Provider.java deleted file mode 100644 index a7a41e94..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/OwnCloudOAuth2Provider.java +++ /dev/null @@ -1,94 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * - * @author David A. Velasco - * Copyright (C) 2017 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.authentication.oauth; - -import com.owncloud.android.lib.refactor.Log_OC; - -public class OwnCloudOAuth2Provider implements OAuth2Provider { - - public static final String NAME = OAuth2Provider.class.getName(); - - public static final String ACCESS_TOKEN_ENDPOINT_PATH = "index.php/apps/oauth2/api/v1/token"; - private static final String AUTHORIZATION_CODE_ENDPOINT_PATH = "index.php/apps/oauth2/authorize"; - - private String mAuthorizationServerUrl = ""; - private String mAccessTokenEndpointPath = ACCESS_TOKEN_ENDPOINT_PATH; - private String mAuthorizationCodeEndpointPath = AUTHORIZATION_CODE_ENDPOINT_PATH; - - private OAuth2ClientConfiguration mClientConfiguration; - - @Override - public OAuth2RequestBuilder getOperationBuilder() { - return new OwnCloudOAuth2RequestBuilder(this); - } - - @Override - public void setClientConfiguration(OAuth2ClientConfiguration oAuth2ClientConfiguration) { - mClientConfiguration = oAuth2ClientConfiguration; - } - - @Override - public OAuth2ClientConfiguration getClientConfiguration() { - return mClientConfiguration; - } - - @Override - public void setAuthorizationServerUri(String authorizationServerUri) { - mAuthorizationServerUrl = authorizationServerUri; - } - - @Override - public String getAuthorizationServerUri() { - return mAuthorizationServerUrl; - } - - public String getAccessTokenEndpointPath() { - return mAccessTokenEndpointPath; - } - - public void setAccessTokenEndpointPath(String accessTokenEndpointPath) { - if (accessTokenEndpointPath == null || accessTokenEndpointPath.length() <= 0) { - Log_OC.w(NAME, "Setting invalid access token endpoint path, going on with default"); - mAccessTokenEndpointPath = ACCESS_TOKEN_ENDPOINT_PATH; - } else { - mAccessTokenEndpointPath = accessTokenEndpointPath; - } - } - - public String getAuthorizationCodeEndpointPath() { - return mAuthorizationCodeEndpointPath; - } - - public void setAuthorizationCodeEndpointPath(String authorizationCodeEndpointPath) { - if (authorizationCodeEndpointPath == null || authorizationCodeEndpointPath.length() <= 0) { - Log_OC.w(NAME, "Setting invalid authorization code endpoint path, going on with default"); - mAuthorizationCodeEndpointPath = AUTHORIZATION_CODE_ENDPOINT_PATH; - } else { - mAuthorizationCodeEndpointPath = authorizationCodeEndpointPath; - } - } -} diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/OwnCloudOAuth2RequestBuilder.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/OwnCloudOAuth2RequestBuilder.java deleted file mode 100644 index 6a458149..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/OwnCloudOAuth2RequestBuilder.java +++ /dev/null @@ -1,151 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * - * @author David A. Velasco - * Copyright (C) 2017 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.authentication.oauth; - -import android.net.Uri; - -import com.owncloud.android.lib.refactor.OCContext; -import com.owncloud.android.lib.refactor.operations.RemoteOperation; -import com.owncloud.android.lib.refactor.authentication.oauth.operations.OAuth2GetAccessTokenOperation; -import com.owncloud.android.lib.refactor.authentication.oauth.operations.OAuth2RefreshAccessTokenOperation; - -public class OwnCloudOAuth2RequestBuilder implements OAuth2RequestBuilder { - - private OCContext ocContext; - private OwnCloudOAuth2Provider mOAuth2Provider; - - private OAuthRequest mRequest; - private OAuth2GrantType mGrantType = OAuth2GrantType.AUTHORIZATION_CODE; - private String mCode; - private String mRefreshToken; - - public OwnCloudOAuth2RequestBuilder(OwnCloudOAuth2Provider ownCloudOAuth2Provider) { - mOAuth2Provider = ownCloudOAuth2Provider; - } - - @Override - public void setRequest(OAuthRequest request) { - mRequest = request; - } - - @Override - public void setGrantType(OAuth2GrantType grantType) { - mGrantType = grantType; - } - - @Override - public void setAuthorizationCode(String code) { - mCode = code; - } - - @Override - public void setRefreshToken(String refreshToken) { - mRefreshToken = refreshToken; - } - - public void setOcContext(OCContext ocContext) { - this.ocContext = ocContext; - } - - @Override - public RemoteOperation buildOperation() { - if (mGrantType != OAuth2GrantType.AUTHORIZATION_CODE && - mGrantType != OAuth2GrantType.REFRESH_TOKEN) { - throw new UnsupportedOperationException( - "Unsupported grant type. Only " + - OAuth2GrantType.AUTHORIZATION_CODE.getValue() + " and " + - OAuth2GrantType.REFRESH_TOKEN + " are supported"); - } - OAuth2ClientConfiguration clientConfiguration = mOAuth2Provider.getClientConfiguration(); - - switch(mRequest) { - case CREATE_ACCESS_TOKEN: - return new OAuth2GetAccessTokenOperation( - ocContext, - mGrantType.getValue(), - mCode, - clientConfiguration.getClientId(), - clientConfiguration.getRedirectUri(), - mOAuth2Provider.getAccessTokenEndpointPath()); - - case REFRESH_ACCESS_TOKEN: - return new OAuth2RefreshAccessTokenOperation( - ocContext, - clientConfiguration.getClientId(), - mRefreshToken, - mOAuth2Provider.getAccessTokenEndpointPath()); - default: - throw new UnsupportedOperationException("Unsupported request"); - } - } - - @Override - public String buildUri() { - if (OAuth2GrantType.AUTHORIZATION_CODE != mGrantType) { - throw new UnsupportedOperationException( - "Unsupported grant type. Only " + - OAuth2GrantType.AUTHORIZATION_CODE.getValue() + " is supported by this provider" - ); - } - OAuth2ClientConfiguration clientConfiguration = mOAuth2Provider.getClientConfiguration(); - Uri uri; - Uri.Builder uriBuilder; - switch(mRequest) { - case GET_AUTHORIZATION_CODE: - uri = Uri.parse(mOAuth2Provider.getAuthorizationServerUri()); - uriBuilder = uri.buildUpon(); - uriBuilder.appendEncodedPath(mOAuth2Provider.getAuthorizationCodeEndpointPath()); - uriBuilder.appendQueryParameter( - OAuth2Constants.KEY_RESPONSE_TYPE, OAuth2Constants.OAUTH2_RESPONSE_TYPE_CODE); - uriBuilder.appendQueryParameter( - OAuth2Constants.KEY_REDIRECT_URI, clientConfiguration.getRedirectUri()); - uriBuilder.appendQueryParameter( - OAuth2Constants.KEY_CLIENT_ID, clientConfiguration.getClientId()); - - uri = uriBuilder.build(); - return uri.toString(); - - case CREATE_ACCESS_TOKEN: - uri = Uri.parse(mOAuth2Provider.getAuthorizationServerUri()); - uriBuilder = uri.buildUpon(); - uriBuilder.appendEncodedPath(mOAuth2Provider.getAccessTokenEndpointPath()); - uriBuilder.appendQueryParameter( - OAuth2Constants.KEY_RESPONSE_TYPE, OAuth2Constants.OAUTH2_RESPONSE_TYPE_CODE); - uriBuilder.appendQueryParameter( - OAuth2Constants.KEY_REDIRECT_URI, clientConfiguration.getRedirectUri()); - uriBuilder.appendQueryParameter( - OAuth2Constants.KEY_CLIENT_ID, clientConfiguration.getClientId()); - - uri = uriBuilder.build(); - return uri.toString(); - - default: - throw new UnsupportedOperationException("Unsupported request"); - } - } - -} diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/operations/OAuth2GetAccessTokenOperation.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/operations/OAuth2GetAccessTokenOperation.java deleted file mode 100644 index 0edaeacb..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/operations/OAuth2GetAccessTokenOperation.java +++ /dev/null @@ -1,115 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * - * @author David A. Velasco - * Copyright (C) 2017 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.authentication.oauth.operations; - -import com.owncloud.android.lib.refactor.OCContext; -import com.owncloud.android.lib.refactor.operations.RemoteOperationResult; -import com.owncloud.android.lib.refactor.authentication.oauth.OAuth2Constants; -import com.owncloud.android.lib.refactor.authentication.oauth.OAuth2ResponseParser; -import com.owncloud.android.lib.refactor.authentication.oauth.OwnCloudOAuth2Provider; -import com.owncloud.android.lib.refactor.operations.RemoteOperation; - -import org.json.JSONObject; - -import java.util.Map; - -import okhttp3.MultipartBody; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; - - -public class OAuth2GetAccessTokenOperation extends RemoteOperation> { - - private final String mGrantType; - private final String mCode; - private final String mClientId; - private final String mRedirectUri; - private final String mAccessTokenEndpointPath; - private final OAuth2ResponseParser mResponseParser; - - public OAuth2GetAccessTokenOperation( - OCContext context, - String grantType, - String code, - String clientId, - String redirectUri, - String accessTokenEndpointPath) { - super(context); - mClientId = clientId; - mRedirectUri = redirectUri; - mGrantType = grantType; - mCode = code; - - mAccessTokenEndpointPath = - accessTokenEndpointPath != null - ? accessTokenEndpointPath - : OwnCloudOAuth2Provider.ACCESS_TOKEN_ENDPOINT_PATH; - - mResponseParser = new OAuth2ResponseParser(); - } - - @Override - public Result exec() { - try { - final RequestBody requestBody = new MultipartBody.Builder() - .setType(MultipartBody.FORM) - .addFormDataPart(OAuth2Constants.KEY_GRANT_TYPE, mGrantType) - .addFormDataPart(OAuth2Constants.KEY_CODE, mCode) - .addFormDataPart(OAuth2Constants.KEY_REDIRECT_URI, mRedirectUri) - .addFormDataPart(OAuth2Constants.KEY_CLIENT_ID, mClientId) - .build(); - - final Request request = getRequestBuilder() - .url(getHttpUrl(mAccessTokenEndpointPath)) - .method("POST", requestBody) - .build(); - - final Response response = getClient() - .newCall(request) - .execute(); - - final String responseData = response.body().string(); - - if (responseData != null && responseData.length() > 0) { - final JSONObject tokenJson = new JSONObject(responseData); - final Map accessTokenResult = - mResponseParser.parseAccessTokenResult(tokenJson); - - return (accessTokenResult.get(OAuth2Constants.KEY_ERROR) != null || - accessTokenResult.get(OAuth2Constants.KEY_ACCESS_TOKEN) == null) - ? new Result(RemoteOperationResult.ResultCode.OAUTH2_ERROR) - : new Result(true, request, response, accessTokenResult); - } else { - return new Result(false, request, response); - } - - } catch (Exception e) { - return new Result(e); - } - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/authentication/oauth/operations/OAuth2RefreshAccessTokenOperation.java b/src/com/owncloud/android/lib/refactor/authentication/oauth/operations/OAuth2RefreshAccessTokenOperation.java deleted file mode 100644 index 9453f613..00000000 --- a/src/com/owncloud/android/lib/refactor/authentication/oauth/operations/OAuth2RefreshAccessTokenOperation.java +++ /dev/null @@ -1,108 +0,0 @@ -/** - * ownCloud Android client application - * - * @author David González Verdugo - * - * Copyright (C) 2017 ownCloud GmbH. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - */ - -package com.owncloud.android.lib.refactor.authentication.oauth.operations; - -import com.owncloud.android.lib.refactor.OCContext; -import com.owncloud.android.lib.refactor.operations.RemoteOperationResult; -import com.owncloud.android.lib.refactor.Log_OC; -import com.owncloud.android.lib.refactor.operations.RemoteOperation; -import com.owncloud.android.lib.refactor.authentication.oauth.OAuth2Constants; -import com.owncloud.android.lib.refactor.authentication.oauth.OAuth2GrantType; -import com.owncloud.android.lib.refactor.authentication.oauth.OAuth2ResponseParser; -import com.owncloud.android.lib.refactor.authentication.oauth.OwnCloudOAuth2Provider; - -import org.json.JSONObject; - -import java.util.Map; - -import okhttp3.MultipartBody; -import okhttp3.Request; -import okhttp3.RequestBody; -import okhttp3.Response; - -public class OAuth2RefreshAccessTokenOperation extends RemoteOperation> { - - private static final String TAG = OAuth2RefreshAccessTokenOperation.class.getSimpleName(); - - private final String mClientId; - private final String mRefreshToken; - private final String mAccessTokenEndpointPath; - private final OAuth2ResponseParser mResponseParser; - - public OAuth2RefreshAccessTokenOperation( - OCContext ocContext, - String clientId, - String refreshToken, - String accessTokenEndpointPath - ) { - super(ocContext); - - mClientId = clientId; - mRefreshToken = refreshToken; - - mAccessTokenEndpointPath = - accessTokenEndpointPath != null ? - accessTokenEndpointPath : - OwnCloudOAuth2Provider.ACCESS_TOKEN_ENDPOINT_PATH; - - mResponseParser = new OAuth2ResponseParser(); - } - - @Override - public Result exec() { - try { - final RequestBody requestBody = new MultipartBody.Builder() - .setType(MultipartBody.FORM) - .addFormDataPart(OAuth2Constants.KEY_GRANT_TYPE, - OAuth2GrantType.REFRESH_TOKEN.getValue()) - .addFormDataPart(OAuth2Constants.KEY_CLIENT_ID, mClientId) - .addFormDataPart(OAuth2Constants.KEY_REFRESH_TOKEN, mRefreshToken) - .build(); - - final Request request = getRequestBuilder() - .url(getHttpUrl(mAccessTokenEndpointPath)) - .method("POST", requestBody) - .build(); - - final Response response = getClient().newCall(request).execute(); - - final String responseData = response.body().string(); - Log_OC.d(TAG, "OAUTH2: raw response from POST TOKEN: " + responseData); - - if (responseData != null && responseData.length() > 0) { - final JSONObject tokenJson = new JSONObject(responseData); - final Map accessTokenResult = - mResponseParser.parseAccessTokenResult(tokenJson); - return (accessTokenResult.get(OAuth2Constants.KEY_ERROR) != null || - accessTokenResult.get(OAuth2Constants.KEY_ACCESS_TOKEN) == null) - ? new Result(RemoteOperationResult.ResultCode.OAUTH2_ERROR) - : new Result(true, request, response, accessTokenResult); - - } else { - return new Result(false, request, response); - } - - } catch (Exception e) { - return new Result(e); - } - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/exceptions/AccountNotFoundException.java b/src/com/owncloud/android/lib/refactor/exceptions/AccountNotFoundException.java deleted file mode 100644 index fd1bfd6c..00000000 --- a/src/com/owncloud/android/lib/refactor/exceptions/AccountNotFoundException.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.owncloud.android.lib.refactor.exceptions; - -import android.accounts.Account; -import android.accounts.AccountsException; - -public class AccountNotFoundException extends AccountsException { - - /** - * Generated - should be refreshed every time the class changes!! - */ - private static final long serialVersionUID = -1684392454778508693L; - - private Account mFailedAccount; - - public AccountNotFoundException(Account failedAccount, String message, Throwable cause) { - super(message, cause); - mFailedAccount = failedAccount; - } - - public Account getFailedAccount() { - return mFailedAccount; - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/exceptions/CertificateCombinedException.java b/src/com/owncloud/android/lib/refactor/exceptions/CertificateCombinedException.java deleted file mode 100644 index 7582bb0f..00000000 --- a/src/com/owncloud/android/lib/refactor/exceptions/CertificateCombinedException.java +++ /dev/null @@ -1,140 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.exceptions; - -import com.owncloud.android.lib.common.network.AdvancedSslSocketFactory; -import com.owncloud.android.lib.common.network.AdvancedX509TrustManager; - -import java.security.cert.CertPathValidatorException; -import java.security.cert.CertificateException; -import java.security.cert.CertificateExpiredException; -import java.security.cert.CertificateNotYetValidException; -import java.security.cert.X509Certificate; - -import javax.net.ssl.SSLPeerUnverifiedException; - -/** - * Exception joining all the problems that {@link AdvancedX509TrustManager} can find in - * a certificate chain for a server. - * - * This was initially created as an extension of CertificateException, but some - * implementations of the SSL socket layer in existing devices are REPLACING the CertificateException - * instances thrown by {@link javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[], String)} - * with SSLPeerUnverifiedException FORGETTING THE CAUSING EXCEPTION instead of wrapping it. - * - * Due to this, extending RuntimeException is necessary to get that the CertificateCombinedException - * instance reaches {@link AdvancedSslSocketFactory#verifyPeerIdentity}. - * - * BE CAREFUL. As a RuntimeException extensions, Java compilers do not require to handle it - * in client methods. Be sure to use it only when you know exactly where it will go. - * - * @author David A. Velasco - */ -public class CertificateCombinedException extends RuntimeException { - - /** Generated - to refresh every time the class changes */ - private static final long serialVersionUID = -8875782030758554999L; - - private X509Certificate mServerCert = null; - private String mHostInUrl; - - private CertificateExpiredException mCertificateExpiredException = null; - private CertificateNotYetValidException mCertificateNotYetValidException = null; - private CertPathValidatorException mCertPathValidatorException = null; - private CertificateException mOtherCertificateException = null; - private SSLPeerUnverifiedException mSslPeerUnverifiedException = null; - - public CertificateCombinedException(X509Certificate x509Certificate) { - mServerCert = x509Certificate; - } - - public X509Certificate getServerCertificate() { - return mServerCert; - } - - public String getHostInUrl() { - return mHostInUrl; - } - - public void setHostInUrl(String host) { - mHostInUrl = host; - } - - public CertificateExpiredException getCertificateExpiredException() { - return mCertificateExpiredException; - } - - public void setCertificateExpiredException(CertificateExpiredException c) { - mCertificateExpiredException = c; - } - - public CertificateNotYetValidException getCertificateNotYetValidException() { - return mCertificateNotYetValidException; - } - - public void setCertificateNotYetException(CertificateNotYetValidException c) { - mCertificateNotYetValidException = c; - } - - public CertPathValidatorException getCertPathValidatorException() { - return mCertPathValidatorException; - } - - public void setCertPathValidatorException(CertPathValidatorException c) { - mCertPathValidatorException = c; - } - - public CertificateException getOtherCertificateException() { - return mOtherCertificateException; - } - - public void setOtherCertificateException(CertificateException c) { - mOtherCertificateException = c; - } - - public SSLPeerUnverifiedException getSslPeerUnverifiedException() { - return mSslPeerUnverifiedException ; - } - - public void setSslPeerUnverifiedException(SSLPeerUnverifiedException s) { - mSslPeerUnverifiedException = s; - } - - public boolean isException() { - return (mCertificateExpiredException != null || - mCertificateNotYetValidException != null || - mCertPathValidatorException != null || - mOtherCertificateException != null || - mSslPeerUnverifiedException != null); - } - - public boolean isRecoverable() { - return (mCertificateExpiredException != null || - mCertificateNotYetValidException != null || - mCertPathValidatorException != null || - mSslPeerUnverifiedException != null); - } - -} diff --git a/src/com/owncloud/android/lib/refactor/exceptions/OperationCancelledException.java b/src/com/owncloud/android/lib/refactor/exceptions/OperationCancelledException.java deleted file mode 100644 index 27a5ede6..00000000 --- a/src/com/owncloud/android/lib/refactor/exceptions/OperationCancelledException.java +++ /dev/null @@ -1,34 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.exceptions; - -public class OperationCancelledException extends Exception { - - /** - * Generated serial version - to avoid Java warning - */ - private static final long serialVersionUID = -6350981497740424983L; - -} diff --git a/src/com/owncloud/android/lib/refactor/operations/RemoteOperation.java b/src/com/owncloud/android/lib/refactor/operations/RemoteOperation.java deleted file mode 100644 index 99fe0713..00000000 --- a/src/com/owncloud/android/lib/refactor/operations/RemoteOperation.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.owncloud.android.lib.refactor.operations; -import android.net.Uri; - -import com.owncloud.android.lib.refactor.OCContext; - -import java.io.IOException; -import java.util.Map; - -import at.bitfire.dav4android.UrlUtils; -import okhttp3.HttpUrl; -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; - -public abstract class RemoteOperation { - private final OCContext mContext; - // TODO Move to a constants file - private static final String USER_AGENT_HEADER = "User-Agent"; - public static final String WEBDAV_PATH_4_0 = "remote.php/dav/files"; - private static OkHttpClient mClient = null; - - - public class Result extends RemoteOperationResult { - public Result(ResultCode code) { - this(code, null); - } - - public Result(ResultCode code, I data) { - super(code); - mData = data; - } - - public Result(Exception e) { - super(e); - mData = null; - } - - public Result(boolean success, Request request, Response response) throws IOException { - this(success, request, response, null);; - } - - public Result(boolean success, Request request, Response response, I data) throws IOException { - super(success, request, response); - mData = data; - } - - private final I mData; - - public I getData() { - return mData; - } - } - - - protected RemoteOperation(OCContext ocContext) { - mContext = ocContext; - if(mClient == null) { - mClient = new OkHttpClient.Builder() - .followRedirects(false) - .build(); - } - } - - public abstract Result exec(); - - protected OCContext getOCContext() { - return mContext; - } - - protected OkHttpClient getClient() { - return mClient.newBuilder() - .addInterceptor(chain -> - chain.proceed( - addRequestCredentials(chain.request()) - .addHeader(USER_AGENT_HEADER, mContext.getUserAgent()) - .build() - ) - ) - .followRedirects(false) - .build(); - } - - private Uri.Builder getBaseUriBuilder() { - return mContext.getOCAccount().getBaseUri().buildUpon(); - } - - protected HttpUrl getHttpUrl(String endpointPath) { - return UrlUtils.INSTANCE.omitTrailingSlash(HttpUrl.parse( - getBaseUriBuilder() - .appendEncodedPath(endpointPath) - .build() - .toString())); - } - - protected HttpUrl getWebDavHttpUrl(String resourcePath) { - return UrlUtils.INSTANCE.omitTrailingSlash(HttpUrl.parse( - getBaseUriBuilder() - .appendEncodedPath(WEBDAV_PATH_4_0) - .appendEncodedPath(mContext.getOCAccount().getDisplayName()) - .appendEncodedPath(resourcePath) - .build() - .toString())); - } - - protected Request.Builder getRequestBuilder() { - return new Request.Builder(); - } - - private Request.Builder addRequestCredentials(Request request) { - Request.Builder builder = request.newBuilder(); - - for(Map.Entry header : mContext.getOCAccount() - .getCredentials() - .getCredentialHeaders() - .entrySet()) { - builder.addHeader(header.getKey(), header.getValue()); - } - - //TODO: Remove this part once SAML is obsolet - final String credentialCookie = mContext - .getOCAccount() - .getCredentials() - .getCredentialCookie(); - if(credentialCookie != null) { - System.err.println(credentialCookie); - builder.addHeader("Cookie", credentialCookie); - } - - return builder; - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/operations/RemoteOperationResult.java b/src/com/owncloud/android/lib/refactor/operations/RemoteOperationResult.java deleted file mode 100644 index 87570a90..00000000 --- a/src/com/owncloud/android/lib/refactor/operations/RemoteOperationResult.java +++ /dev/null @@ -1,500 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.operations; - -import android.accounts.Account; -import android.accounts.AccountsException; - -import com.owncloud.android.lib.refactor.Log_OC; -import com.owncloud.android.lib.refactor.exceptions.AccountNotFoundException; -import com.owncloud.android.lib.refactor.exceptions.CertificateCombinedException; -import com.owncloud.android.lib.refactor.exceptions.OperationCancelledException; -import com.owncloud.android.lib.refactor.utils.ErrorMessageParser; -import com.owncloud.android.lib.refactor.utils.InvalidCharacterExceptionParser; - -import org.apache.commons.httpclient.HttpStatus; -import org.json.JSONException; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.Serializable; -import java.net.MalformedURLException; -import java.net.SocketException; -import java.net.SocketTimeoutException; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import javax.net.ssl.SSLException; - -import at.bitfire.dav4android.exception.ConflictException; -import at.bitfire.dav4android.exception.DavException; -import at.bitfire.dav4android.exception.HttpException; -import at.bitfire.dav4android.exception.InvalidDavResponseException; -import at.bitfire.dav4android.exception.NotFoundException; -import at.bitfire.dav4android.exception.PreconditionFailedException; -import at.bitfire.dav4android.exception.ServiceUnavailableException; -import at.bitfire.dav4android.exception.UnauthorizedException; -import at.bitfire.dav4android.exception.UnsupportedDavException; -import okhttp3.Headers; -import okhttp3.Request; -import okhttp3.Response; - - -/** - * The result of a remote operation required to an ownCloud server. - *

- * Provides a common classification of remote operation results for all the - * application. - * - * @author David A. Velasco - */ -public abstract class RemoteOperationResult implements Serializable { - - /** - * Generated - should be refreshed every time the class changes!! - */ - private static final long serialVersionUID = 4968939884332652230L; - - private static final String TAG = RemoteOperationResult.class.getSimpleName(); - - - public enum ResultCode { - OK, - OK_SSL, - OK_NO_SSL, - UNHANDLED_HTTP_CODE, - UNAUTHORIZED, - FILE_NOT_FOUND, - INSTANCE_NOT_CONFIGURED, - UNKNOWN_ERROR, - WRONG_CONNECTION, - TIMEOUT, - INCORRECT_ADDRESS, - HOST_NOT_AVAILABLE, - NO_NETWORK_CONNECTION, - SSL_ERROR, - SSL_RECOVERABLE_PEER_UNVERIFIED, - BAD_OC_VERSION, - CANCELLED, - INVALID_LOCAL_FILE_NAME, - INVALID_OVERWRITE, - CONFLICT, - OAUTH2_ERROR, - SYNC_CONFLICT, - LOCAL_STORAGE_FULL, - LOCAL_STORAGE_NOT_MOVED, - LOCAL_STORAGE_NOT_COPIED, - OAUTH2_ERROR_ACCESS_DENIED, - QUOTA_EXCEEDED, - ACCOUNT_NOT_FOUND, - ACCOUNT_EXCEPTION, - ACCOUNT_NOT_NEW, - ACCOUNT_NOT_THE_SAME, - INVALID_CHARACTER_IN_NAME, - SHARE_NOT_FOUND, - LOCAL_STORAGE_NOT_REMOVED, - FORBIDDEN, - SHARE_FORBIDDEN, - SPECIFIC_FORBIDDEN, - OK_REDIRECT_TO_NON_SECURE_CONNECTION, - INVALID_MOVE_INTO_DESCENDANT, - INVALID_COPY_INTO_DESCENDANT, - PARTIAL_MOVE_DONE, - PARTIAL_COPY_DONE, - SHARE_WRONG_PARAMETER, - WRONG_SERVER_RESPONSE, - INVALID_CHARACTER_DETECT_IN_SERVER, - DELAYED_FOR_WIFI, - LOCAL_FILE_NOT_FOUND, - SERVICE_UNAVAILABLE, - SPECIFIC_SERVICE_UNAVAILABLE, - SPECIFIC_UNSUPPORTED_MEDIA_TYPE - } - - private boolean mSuccess = false; - private int mHttpCode = -1; - private String mHttpPhrase = null; - private Exception mException = null; - private ResultCode mCode = ResultCode.UNKNOWN_ERROR; - private String mRedirectedLocation; - private ArrayList mAuthenticate = new ArrayList<>(); - private String mLastPermanentLocation = null; - - /** - * Public constructor from result code. - * - * To be used when the caller takes the responsibility of interpreting the result of a {@link RemoteOperation} - * - * @param code {@link ResultCode} decided by the caller. - */ - public RemoteOperationResult(ResultCode code) { - mCode = code; - mSuccess = (code == ResultCode.OK || code == ResultCode.OK_SSL || - code == ResultCode.OK_NO_SSL || - code == ResultCode.OK_REDIRECT_TO_NON_SECURE_CONNECTION); - } - - /** - * Public constructor from exception. - * - * To be used when an exception prevented the end of the {@link RemoteOperation}. - * - * Determines a {@link ResultCode} depending on the type of the exception. - * - * @param e Exception that interrupted the {@link RemoteOperation} - */ - public RemoteOperationResult(Exception e) { - if (e instanceof SSLException || e instanceof RuntimeException) { - CertificateCombinedException se = getCertificateCombinedException(e); - mException = se; - } else { - mException = e; - } - - mCode = getResultCodeByException(e); - } - - private ResultCode getResultCodeByException(Exception e) { - return (e instanceof UnauthorizedException) ? ResultCode.UNAUTHORIZED - : (e instanceof NotFoundException) ? ResultCode.FILE_NOT_FOUND - : (e instanceof ConflictException) ? ResultCode.CONFLICT - : (e instanceof PreconditionFailedException) ? ResultCode.UNKNOWN_ERROR - : (e instanceof ServiceUnavailableException) ? ResultCode.SERVICE_UNAVAILABLE - : (e instanceof HttpException) ? ResultCode.UNHANDLED_HTTP_CODE - : (e instanceof InvalidDavResponseException) ? ResultCode.UNKNOWN_ERROR - : (e instanceof UnsupportedDavException) ? ResultCode.UNKNOWN_ERROR - : (e instanceof DavException) ? ResultCode.UNKNOWN_ERROR - : (e instanceof SSLException || e instanceof RuntimeException) ? handleSSLException(e) - : (e instanceof SocketException) ? ResultCode.WRONG_CONNECTION - : (e instanceof SocketTimeoutException) ? ResultCode.TIMEOUT - : (e instanceof MalformedURLException) ? ResultCode.INCORRECT_ADDRESS - : (e instanceof UnknownHostException) ? ResultCode.HOST_NOT_AVAILABLE - : ResultCode.UNKNOWN_ERROR; - } - - private ResultCode handleSSLException(Exception e) { - final CertificateCombinedException se = getCertificateCombinedException(e); - return (se != null && se.isRecoverable()) ? ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED - : (e instanceof RuntimeException) ? ResultCode.HOST_NOT_AVAILABLE - : ResultCode.SSL_ERROR; - } - - /** - * Public constructor from separate elements of an HTTP or DAV response. - * - * To be used when the result needs to be interpreted from the response of an HTTP/DAV method. - * - * Determines a {@link ResultCode} from the already executed method received as a parameter. Generally, - * will depend on the HTTP code and HTTP response headers received. In some cases will inspect also the - * response body - * - * @param success - * @param request - * @param response - * @throws IOException - */ - public RemoteOperationResult(boolean success, Request request, Response response) throws IOException { - this(success, response.code(), HttpStatus.getStatusText(response.code()), response.headers()); - - if (mHttpCode == HttpStatus.SC_BAD_REQUEST) { // 400 - - String bodyResponse = response.body().string(); - // do not get for other HTTP codes!; could not be available - - if (bodyResponse != null && bodyResponse.length() > 0) { - InputStream is = new ByteArrayInputStream(bodyResponse.getBytes()); - InvalidCharacterExceptionParser xmlParser = new InvalidCharacterExceptionParser(); - try { - if (xmlParser.parseXMLResponse(is)) { - mCode = ResultCode.INVALID_CHARACTER_DETECT_IN_SERVER; - } - - } catch (Exception e) { - Log_OC.w(TAG, "Error reading exception from server: " + e.getMessage()); - // mCode stays as set in this(success, httpCode, headers) - } - } - } - - // before - switch (mHttpCode) { - case HttpStatus.SC_FORBIDDEN: - parseErrorMessageAndSetCode(request, response, ResultCode.SPECIFIC_FORBIDDEN); - break; - case HttpStatus.SC_UNSUPPORTED_MEDIA_TYPE: - parseErrorMessageAndSetCode(request, response, ResultCode.SPECIFIC_UNSUPPORTED_MEDIA_TYPE); - break; - case HttpStatus.SC_SERVICE_UNAVAILABLE: - parseErrorMessageAndSetCode(request, response, ResultCode.SPECIFIC_SERVICE_UNAVAILABLE); - break; - default: - break; - } - } - - /** - * Parse the error message included in the body response, if any, and set the specific result - * code - */ - - /** - * Parse the error message included in the body response, if any, and set the specific result - * code - * - * @param request okHttp request - * @param response okHttp respnse - * @param resultCode our own custom result code - * @throws IOException - */ - private void parseErrorMessageAndSetCode(Request request, Response response, ResultCode resultCode) - throws IOException { - - String bodyResponse = response.body().string(); - - if (bodyResponse != null && bodyResponse.length() > 0) { - InputStream is = new ByteArrayInputStream(bodyResponse.getBytes()); - ErrorMessageParser xmlParser = new ErrorMessageParser(); - try { - String errorMessage = xmlParser.parseXMLResponse(is); - if (errorMessage != "" && errorMessage != null) { - mCode = resultCode; - mHttpPhrase = errorMessage; - } - } catch (Exception e) { - Log_OC.w(TAG, "Error reading exception from server: " + e.getMessage()); - // mCode stays as set in this(success, httpCode, headers) - } - } - } - - /** - * Public constructor from separate elements of an HTTP or DAV response. - * - * To be used when the result needs to be interpreted from HTTP response elements that could come from - * different requests (WARNING: black magic, try to avoid). - * - * Determines a {@link ResultCode} depending on the HTTP code and HTTP response headers received. - * - * @param success The operation was considered successful or not. - * @param httpCode HTTP status code returned by an HTTP/DAV method. - * @param httpPhrase HTTP status line phrase returned by an HTTP/DAV method - * @param headers HTTP response header returned by an HTTP/DAV method - */ - public RemoteOperationResult(boolean success, int httpCode, String httpPhrase, Headers headers) { - this(success, httpCode, httpPhrase); - for (Map.Entry> header : headers.toMultimap().entrySet()) { - if ("location".equals(header.getKey().toLowerCase())) { - mRedirectedLocation = header.getValue().get(0); - continue; - } - if ("www-authenticate".equals(header.getKey().toLowerCase())) { - mAuthenticate.add(header.getValue().get(0).toLowerCase()); - } - } - if (isIdPRedirection()) { - mCode = ResultCode.UNAUTHORIZED; // overrides default ResultCode.UNKNOWN - } - } - - /** - * Private constructor for results built interpreting a HTTP or DAV response. - * - * Determines a {@link ResultCode} depending of the type of the exception. - * - * @param success Operation was successful or not. - * @param httpCode HTTP status code returned by the HTTP/DAV method. - * @param httpPhrase HTTP status line phrase returned by the HTTP/DAV method - */ - private RemoteOperationResult(boolean success, int httpCode, String httpPhrase) { - mSuccess = success; - mHttpCode = httpCode; - mHttpPhrase = httpPhrase; - mCode = success - ? ResultCode.OK - : getCodeFromStatus(httpCode); - } - - private ResultCode getCodeFromStatus(int status) { - switch (status) { - case HttpStatus.SC_UNAUTHORIZED: return ResultCode.UNAUTHORIZED; - case HttpStatus.SC_FORBIDDEN: return ResultCode.FORBIDDEN; - case HttpStatus.SC_NOT_FOUND: return ResultCode.FILE_NOT_FOUND; - case HttpStatus.SC_CONFLICT: return ResultCode.CONFLICT; - case HttpStatus.SC_INTERNAL_SERVER_ERROR: return ResultCode.INSTANCE_NOT_CONFIGURED; - case HttpStatus.SC_SERVICE_UNAVAILABLE: return ResultCode.SERVICE_UNAVAILABLE; - case HttpStatus.SC_INSUFFICIENT_STORAGE: return ResultCode.QUOTA_EXCEEDED; - default: - Log_OC.d(TAG, - "RemoteOperationResult has processed UNHANDLED_HTTP_CODE: " + - mHttpCode + " " + mHttpPhrase - ); - return ResultCode.UNHANDLED_HTTP_CODE; - } - } - - public boolean isSuccess() { - return mSuccess; - } - - public boolean isCancelled() { - return mCode == ResultCode.CANCELLED; - } - - public int getHttpCode() { - return mHttpCode; - } - - public String getHttpPhrase() { - return mHttpPhrase; - } - - public ResultCode getCode() { - return mCode; - } - - public Exception getException() { - return mException; - } - - public boolean isSslRecoverableException() { - return mCode == ResultCode.SSL_RECOVERABLE_PEER_UNVERIFIED; - } - - public boolean isRedirectToNonSecureConnection() { - return mCode == ResultCode.OK_REDIRECT_TO_NON_SECURE_CONNECTION; - } - - private CertificateCombinedException getCertificateCombinedException(Exception e) { - CertificateCombinedException result = null; - if (e instanceof CertificateCombinedException) { - return (CertificateCombinedException) e; - } - Throwable cause = mException.getCause(); - Throwable previousCause = null; - while (cause != null && cause != previousCause && - !(cause instanceof CertificateCombinedException)) { - previousCause = cause; - cause = cause.getCause(); - } - return (cause != null && cause instanceof CertificateCombinedException) - ? (CertificateCombinedException) cause - : result; - } - - public String getLogMessage() { - - if (mException != null) { - return (mException instanceof OperationCancelledException) - ? "Operation cancelled by the caller" - : (mException instanceof SocketException) ? "Socket exception" - : (mException instanceof SocketTimeoutException) ? "Socket timeout exception" - : (mException instanceof MalformedURLException) ? "Malformed URL exception" - : (mException instanceof UnknownHostException) ? "Unknown host exception" - : (mException instanceof CertificateCombinedException) ? - (((CertificateCombinedException) mException).isRecoverable() - ? "SSL recoverable exception" - : "SSL exception") - : (mException instanceof SSLException) ? "SSL exception" - : (mException instanceof DavException) ? "Unexpected WebDAV exception" - : (mException instanceof HttpException) ? "HTTP violation" - : (mException instanceof IOException) ? "Unrecovered transport exception" - : (mException instanceof AccountNotFoundException) - ? handleFailedAccountException((AccountNotFoundException)mException) - : (mException instanceof AccountsException) ? "Exception while using account" - : (mException instanceof JSONException) ? "JSON exception" - : "Unexpected exception"; - } - - switch (mCode) { - case INSTANCE_NOT_CONFIGURED: return "The ownCloud server is not configured!"; - case NO_NETWORK_CONNECTION: return "No network connection"; - case BAD_OC_VERSION: return "No valid ownCloud version was found at the server"; - case LOCAL_STORAGE_FULL: return "Local storage full"; - case LOCAL_STORAGE_NOT_MOVED: return "Error while moving file to final directory"; - case ACCOUNT_NOT_NEW: return "Account already existing when creating a new one"; - case INVALID_CHARACTER_IN_NAME: return "The file name contains an forbidden character"; - case FILE_NOT_FOUND: return "Local file does not exist"; - case SYNC_CONFLICT: return "Synchronization conflict"; - default: return "Operation finished with HTTP status code " - + mHttpCode - + " (" - + (isSuccess() ? "success" : "fail") - + ")"; - } - } - - private String handleFailedAccountException(AccountNotFoundException e) { - final Account failedAccount = e.getFailedAccount(); - return e.getMessage() + " (" + - (failedAccount != null ? failedAccount.name : "NULL") + ")"; - } - - public boolean isServerFail() { - return (mHttpCode >= HttpStatus.SC_INTERNAL_SERVER_ERROR); - } - - public boolean isException() { - return (mException != null); - } - - public boolean isTemporalRedirection() { - return (mHttpCode == 302 || mHttpCode == 307); - } - - public String getRedirectedLocation() { - return mRedirectedLocation; - } - - public boolean isIdPRedirection() { - return (mRedirectedLocation != null && - (mRedirectedLocation.toUpperCase().contains("SAML") || - mRedirectedLocation.toLowerCase().contains("wayf"))); - } - - /** TODO: make this set via constructor - * Checks if is a non https connection - * - * @return boolean true/false - - public boolean isNonSecureRedirection() { - return (mRedirectedLocation != null && !(mRedirectedLocation.toLowerCase().startsWith("https://"))); - } - - public ArrayList getAuthenticateHeaders() { - return mAuthenticate; - } - - public String getLastPermanentLocation() { - return mLastPermanentLocation; - } - - public void setLastPermanentLocation(String lastPermanentLocation) { - mLastPermanentLocation = lastPermanentLocation; - } - */ -} diff --git a/src/com/owncloud/android/lib/refactor/operations/files/DownloadRemoteFileOperation.java b/src/com/owncloud/android/lib/refactor/operations/files/DownloadRemoteFileOperation.java deleted file mode 100644 index e754e199..00000000 --- a/src/com/owncloud/android/lib/refactor/operations/files/DownloadRemoteFileOperation.java +++ /dev/null @@ -1,67 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.owncloud.android.lib.refactor.operations.files; - -import com.owncloud.android.lib.refactor.OCContext; -import com.owncloud.android.lib.refactor.operations.RemoteOperation; -import at.bitfire.dav4android.DavOCResource; -import static com.owncloud.android.lib.refactor.operations.RemoteOperationResult.ResultCode.OK; - -/** - * Remote operation performing the download of a remote file in the ownCloud server. - * - * @author David A. Velasco - * @author masensio - * @author David González Verdugo - */ -public class DownloadRemoteFileOperation extends RemoteOperation { - - private String mRemotePath; - private String mLocalFolderPath; - - public DownloadRemoteFileOperation(OCContext ocContext, String remotePath, String localFolderPath) { - super(ocContext); - mRemotePath = remotePath.replaceAll("^/+", ""); - mLocalFolderPath = localFolderPath; - } - - @Override - public Result exec() { - - try { - DavOCResource davOCResource = new DavOCResource( - getClient(), - getWebDavHttpUrl(mRemotePath) - ); - davOCResource.get("*/*"); - - //TODO Create local file from the downloaded one and implement progress listener - - return new Result(OK); - - } catch (Exception e) { - return new Result(e); - } - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/operations/files/PropfindOperation.java b/src/com/owncloud/android/lib/refactor/operations/files/PropfindOperation.java deleted file mode 100644 index 782e0f18..00000000 --- a/src/com/owncloud/android/lib/refactor/operations/files/PropfindOperation.java +++ /dev/null @@ -1,61 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.operations.files; - -import com.owncloud.android.lib.refactor.OCContext; -import com.owncloud.android.lib.refactor.operations.RemoteOperation; - -import at.bitfire.dav4android.DavOCResource; -import at.bitfire.dav4android.DavResource; -import at.bitfire.dav4android.PropertyUtils; -import okhttp3.HttpUrl; - -import static com.owncloud.android.lib.refactor.operations.RemoteOperationResult.ResultCode.OK; - -public class PropfindOperation extends RemoteOperation { - - private String mRemotePath; - - public PropfindOperation(OCContext ocContext, String remotePath) { - super(ocContext); - mRemotePath = remotePath; - } - - @Override - public Result exec() { - try { - final HttpUrl location = HttpUrl.parse(getWebDavHttpUrl(mRemotePath).toString()); - - DavOCResource davOCResource = new DavOCResource(getClient(), location); - davOCResource.propfind(1, PropertyUtils.INSTANCE.getAllPropSet()); - - return new Result(OK, davOCResource); - - } catch (Exception e) { - e.printStackTrace(); - return new Result(e); - } - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/operations/files/RemoveRemoteFileOperation.java b/src/com/owncloud/android/lib/refactor/operations/files/RemoveRemoteFileOperation.java deleted file mode 100644 index 3d96ee46..00000000 --- a/src/com/owncloud/android/lib/refactor/operations/files/RemoveRemoteFileOperation.java +++ /dev/null @@ -1,65 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ - -package com.owncloud.android.lib.refactor.operations.files; - -import com.owncloud.android.lib.refactor.OCContext; -import com.owncloud.android.lib.refactor.operations.RemoteOperation; -import at.bitfire.dav4android.DavOCResource; - -import static com.owncloud.android.lib.refactor.operations.RemoteOperationResult.ResultCode.OK; - -/** - * Remote operation performing the removal of a remote file or folder in the ownCloud server. - * - * @author David A. Velasco - * @author masensio - * @author David González Verdugo - */ -public class RemoveRemoteFileOperation extends RemoteOperation { - - private String mRemotePath; - - public RemoveRemoteFileOperation(OCContext ocContext, String remotePath) { - super(ocContext); - - mRemotePath = remotePath; - } - - @Override - public Result exec() { - try { - DavOCResource davOCResource = new DavOCResource( - getClient(), - getWebDavHttpUrl(mRemotePath) - ); - davOCResource.delete(null); - - return new Result(OK); - - } catch (Exception e) { - return new Result(e); - } - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/operations/files/UploadRemoteFileOperation.java b/src/com/owncloud/android/lib/refactor/operations/files/UploadRemoteFileOperation.java deleted file mode 100644 index 612d1139..00000000 --- a/src/com/owncloud/android/lib/refactor/operations/files/UploadRemoteFileOperation.java +++ /dev/null @@ -1,103 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2018 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - */ - -package com.owncloud.android.lib.refactor.operations.files; - -import com.owncloud.android.lib.refactor.OCContext; -import com.owncloud.android.lib.refactor.operations.RemoteOperation; -import java.io.File; -import java.util.concurrent.atomic.AtomicBoolean; - -import at.bitfire.dav4android.DavOCResource; -import okhttp3.MediaType; -import okhttp3.RequestBody; - -import static com.owncloud.android.lib.refactor.operations.RemoteOperationResult.ResultCode.OK; - -/** - * @author David González Verdugo - */ -public class UploadRemoteFileOperation extends RemoteOperation { - - private File mFileToUpload; - private String mRemotePath; - private String mMimeType; - private String mFileLastModifTimestamp; - private String mRequiredEtag; - - protected final AtomicBoolean mCancellationRequested = new AtomicBoolean(false); - - - public UploadRemoteFileOperation(OCContext ocContext, String localPath, String remotePath, String mimeType, - String fileLastModifTimestamp) { - super(ocContext); - - mFileToUpload = new File(localPath); - mRemotePath = remotePath.replaceAll("^/+", ""); //Delete leading slashes - mMimeType = mimeType; - mFileLastModifTimestamp = fileLastModifTimestamp; - } - - public UploadRemoteFileOperation(OCContext ocContext, String localPath, String remotePath, String mimeType, - String requiredEtag, String fileLastModifTimestamp) { - this(ocContext, localPath, remotePath, mimeType, fileLastModifTimestamp); - mRequiredEtag = requiredEtag; - } - - @Override - public Result exec() { - - try { - - MediaType mediaType = MediaType.parse(mMimeType); - RequestBody requestBody = RequestBody.create(mediaType, mFileToUpload); - - DavOCResource davOCResource = new DavOCResource( - getClient(), - getWebDavHttpUrl(mRemotePath)); - - davOCResource.put( - requestBody, - null, - false, - "multipart/form-data", - String.valueOf(mFileToUpload.length()), - mFileLastModifTimestamp - ); - - return new Result(OK); - - } catch (Exception e) { - return new Result(e); - } - } - - public void cancel() { - synchronized (mCancellationRequested) { - mCancellationRequested.set(true); - // TODO -// if (mPutMethod != null) -// mPutMethod.abort(); - } - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/utils/ErrorMessageParser.java b/src/com/owncloud/android/lib/refactor/utils/ErrorMessageParser.java deleted file mode 100644 index e886bd62..00000000 --- a/src/com/owncloud/android/lib/refactor/utils/ErrorMessageParser.java +++ /dev/null @@ -1,138 +0,0 @@ -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2017 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ -package com.owncloud.android.lib.refactor.utils; - -import android.util.Xml; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlPullParserFactory; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Parser for server exceptions - * @author davidgonzalez - */ -public class ErrorMessageParser { - // No namespaces - private static final String ns = null; - - // Nodes for XML Parser - private static final String NODE_ERROR = "d:error"; - private static final String NODE_MESSAGE = "s:message"; - - /** - * Parse exception response - * @param is - * @return errorMessage for an exception - * @throws XmlPullParserException - * @throws IOException - */ - public String parseXMLResponse(InputStream is) throws XmlPullParserException, - IOException { - String errorMessage = ""; - - try { - // XMLPullParser - XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); - factory.setNamespaceAware(true); - - XmlPullParser parser = Xml.newPullParser(); - parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); - parser.setInput(is, null); - parser.nextTag(); - errorMessage = readError(parser); - - } finally { - is.close(); - } - return errorMessage; - } - - /** - * Parse OCS node - * @param parser - * @return reason for exception - * @throws XmlPullParserException - * @throws IOException - */ - private String readError (XmlPullParser parser) throws XmlPullParserException, IOException { - String errorMessage = ""; - parser.require(XmlPullParser.START_TAG, ns , NODE_ERROR); - while (parser.next() != XmlPullParser.END_TAG) { - if (parser.getEventType() != XmlPullParser.START_TAG) { - continue; - } - String name = parser.getName(); - // read NODE_MESSAGE - if (name.equalsIgnoreCase(NODE_MESSAGE)) { - errorMessage = readText(parser); - } else { - skip(parser); - } - } - return errorMessage; - } - - /** - * Skip tags in parser procedure - * @param parser - * @throws XmlPullParserException - * @throws IOException - */ - private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { - if (parser.getEventType() != XmlPullParser.START_TAG) { - throw new IllegalStateException(); - } - int depth = 1; - while (depth != 0) { - switch (parser.next()) { - case XmlPullParser.END_TAG: - depth--; - break; - case XmlPullParser.START_TAG: - depth++; - break; - } - } - } - - /** - * Read the text from a node - * @param parser - * @return Text of the node - * @throws IOException - * @throws XmlPullParserException - */ - private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { - String result = ""; - if (parser.next() == XmlPullParser.TEXT) { - result = parser.getText(); - parser.nextTag(); - } - return result; - } -} \ No newline at end of file diff --git a/src/com/owncloud/android/lib/refactor/utils/InvalidCharacterExceptionParser.java b/src/com/owncloud/android/lib/refactor/utils/InvalidCharacterExceptionParser.java deleted file mode 100644 index a5733961..00000000 --- a/src/com/owncloud/android/lib/refactor/utils/InvalidCharacterExceptionParser.java +++ /dev/null @@ -1,144 +0,0 @@ - -/* ownCloud Android Library is available under MIT license - * Copyright (C) 2016 ownCloud GmbH. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS - * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - */ -package com.owncloud.android.lib.refactor.utils; - -import android.util.Xml; - -import org.xmlpull.v1.XmlPullParser; -import org.xmlpull.v1.XmlPullParserException; -import org.xmlpull.v1.XmlPullParserFactory; - -import java.io.IOException; -import java.io.InputStream; - -/** - * Parser for Invalid Character server exception - * @author masensio - */ -public class InvalidCharacterExceptionParser { - - private static final String EXCEPTION_STRING = "OC\\Connector\\Sabre\\Exception\\InvalidPath"; - private static final String EXCEPTION_UPLOAD_STRING = "OCP\\Files\\InvalidPathException"; - - // No namespaces - private static final String ns = null; - - // Nodes for XML Parser - private static final String NODE_ERROR = "d:error"; - private static final String NODE_EXCEPTION = "s:exception"; - /** - * Parse is as an Invalid Path Exception - * @param is - * @return if The exception is an Invalid Char Exception - * @throws XmlPullParserException - * @throws IOException - */ - public boolean parseXMLResponse(InputStream is) throws XmlPullParserException, - IOException { - boolean result = false; - - try { - // XMLPullParser - XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); - factory.setNamespaceAware(true); - - XmlPullParser parser = Xml.newPullParser(); - parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false); - parser.setInput(is, null); - parser.nextTag(); - result = readError(parser); - - } finally { - is.close(); - } - return result; - } - - /** - * Parse OCS node - * @param parser - * @return List of ShareRemoteFiles - * @throws XmlPullParserException - * @throws IOException - */ - private boolean readError (XmlPullParser parser) throws XmlPullParserException, IOException { - String exception = ""; - parser.require(XmlPullParser.START_TAG, ns , NODE_ERROR); - while (parser.next() != XmlPullParser.END_TAG) { - if (parser.getEventType() != XmlPullParser.START_TAG) { - continue; - } - String name = parser.getName(); - // read NODE_EXCEPTION - if (name.equalsIgnoreCase(NODE_EXCEPTION)) { - exception = readText(parser); - } else { - skip(parser); - } - - } - return exception.equalsIgnoreCase(EXCEPTION_STRING) || - exception.equalsIgnoreCase(EXCEPTION_UPLOAD_STRING); - } - - /** - * Skip tags in parser procedure - * @param parser - * @throws XmlPullParserException - * @throws IOException - */ - private void skip(XmlPullParser parser) throws XmlPullParserException, IOException { - if (parser.getEventType() != XmlPullParser.START_TAG) { - throw new IllegalStateException(); - } - int depth = 1; - while (depth != 0) { - switch (parser.next()) { - case XmlPullParser.END_TAG: - depth--; - break; - case XmlPullParser.START_TAG: - depth++; - break; - } - } - } - - /** - * Read the text from a node - * @param parser - * @return Text of the node - * @throws IOException - * @throws XmlPullParserException - */ - private String readText(XmlPullParser parser) throws IOException, XmlPullParserException { - String result = ""; - if (parser.next() == XmlPullParser.TEXT) { - result = parser.getText(); - parser.nextTag(); - } - return result; - } -} diff --git a/src/com/owncloud/android/lib/resources/files/RemoteFile.java b/src/com/owncloud/android/lib/resources/files/RemoteFile.java index 5d30178a..bbb5159c 100644 --- a/src/com/owncloud/android/lib/resources/files/RemoteFile.java +++ b/src/com/owncloud/android/lib/resources/files/RemoteFile.java @@ -29,7 +29,6 @@ import android.os.Parcel; import android.os.Parcelable; import com.owncloud.android.lib.common.network.WebdavEntry; -import com.owncloud.android.lib.refactor.operations.RemoteOperation; import java.io.Serializable; import java.math.BigDecimal; @@ -49,6 +48,8 @@ import at.bitfire.dav4android.property.owncloud.OCPrivatelink; import at.bitfire.dav4android.property.owncloud.OCSize; import okhttp3.HttpUrl; +import static com.owncloud.android.lib.common.OwnCloudClient.NEW_WEBDAV_PATH_4_0; + /** * Contains the data of a Remote File from a WebDavEntry * @@ -231,8 +232,7 @@ public class RemoteFile implements Parcelable, Serializable { private static String getRemotePathFromUrl(HttpUrl url, String displayName) { - final String pathToRemove = - "/" + RemoteOperation.WEBDAV_PATH_4_0 + "/" + displayName; + final String pathToRemove = NEW_WEBDAV_PATH_4_0 + displayName; return Uri.decode(url.encodedPath()).replace(pathToRemove, ""); }