123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348 |
- /* ownCloud Android client application
- * Copyright (C) 2011 Bartek Przybylski
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * 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 <http://www.gnu.org/licenses/>.
- *
- */
- package eu.alefzero.webdav;
- import java.io.BufferedInputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import org.apache.commons.httpclient.Credentials;
- import org.apache.commons.httpclient.HttpClient;
- import org.apache.commons.httpclient.HttpException;
- import org.apache.commons.httpclient.HttpMethodBase;
- import org.apache.commons.httpclient.HttpVersion;
- import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
- import org.apache.commons.httpclient.UsernamePasswordCredentials;
- import org.apache.commons.httpclient.auth.AuthScope;
- import org.apache.commons.httpclient.methods.GetMethod;
- import org.apache.commons.httpclient.methods.HeadMethod;
- import org.apache.commons.httpclient.methods.PutMethod;
- import org.apache.commons.httpclient.params.HttpMethodParams;
- import org.apache.commons.httpclient.protocol.Protocol;
- import org.apache.http.HttpStatus;
- import org.apache.http.params.CoreProtocolPNames;
- import org.apache.jackrabbit.webdav.client.methods.DavMethod;
- import org.apache.jackrabbit.webdav.client.methods.DeleteMethod;
- import org.apache.jackrabbit.webdav.client.methods.MkColMethod;
- import com.owncloud.android.AccountUtils;
- import com.owncloud.android.authenticator.AccountAuthenticator;
- import com.owncloud.android.authenticator.EasySSLSocketFactory;
- import com.owncloud.android.files.interfaces.OnDatatransferProgressListener;
- import com.owncloud.android.utils.OwnCloudVersion;
- import android.accounts.Account;
- import android.accounts.AccountManager;
- import android.content.Context;
- import android.net.Uri;
- import android.util.Log;
- public class WebdavClient extends HttpClient {
- private Uri mUri;
- private Credentials mCredentials;
- final private static String TAG = "WebdavClient";
- private static final String USER_AGENT = "Android-ownCloud";
-
- /** Default timeout for waiting data from the server: 10 seconds */
- public static final int DEFAULT_DATA_TIMEOUT = 10000;
-
- /** Default timeout for establishing a connection: infinite */
- public static final int DEFAULT_CONNECTION_TIMEOUT = 0;
-
- private OnDatatransferProgressListener mDataTransferListener;
- static private MultiThreadedHttpConnectionManager mConnManager = null;
-
- static public MultiThreadedHttpConnectionManager getMultiThreadedConnManager() {
- if (mConnManager == null) {
- mConnManager = new MultiThreadedHttpConnectionManager();
- mConnManager.setMaxConnectionsPerHost(5);
- mConnManager.setMaxTotalConnections(5);
- }
- return mConnManager;
- }
-
- /**
- * Creates a WebdavClient setup for the current account
- * @param account The client accout
- * @param context The application context
- * @return
- */
- public WebdavClient (Account account, Context context) {
- setDefaultTimeouts();
-
- OwnCloudVersion ownCloudVersion = new OwnCloudVersion(AccountManager.get(context).getUserData(account,
- AccountAuthenticator.KEY_OC_VERSION));
- String baseUrl = AccountManager.get(context).getUserData(account, AccountAuthenticator.KEY_OC_BASE_URL);
- String webDavPath = AccountUtils.getWebdavPath(ownCloudVersion);
- String username = account.name.substring(0, account.name.lastIndexOf('@'));
- String password = AccountManager.get(context).getPassword(account);
-
- mUri = Uri.parse(baseUrl + webDavPath);
- Log.e("ASD", ""+username);
- setCredentials(username, password);
- }
-
- public WebdavClient() {
- super(getMultiThreadedConnManager());
-
- setDefaultTimeouts();
-
- getParams().setParameter(HttpMethodParams.USER_AGENT, USER_AGENT);
- getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
- allowSelfsignedCertificates();
- }
- public void setCredentials(String username, String password) {
- getParams().setAuthenticationPreemptive(true);
- getState().setCredentials(AuthScope.ANY,
- getCredentials(username, password));
- }
- private Credentials getCredentials(String username, String password) {
- if (mCredentials == null)
- mCredentials = new UsernamePasswordCredentials(username, password);
- return mCredentials;
- }
-
- /**
- * Sets the connection and wait-for-data timeouts to be applied by default.
- */
- private void setDefaultTimeouts() {
- getParams().setSoTimeout(DEFAULT_DATA_TIMEOUT);
- getHttpConnectionManager().getParams().setConnectionTimeout(DEFAULT_CONNECTION_TIMEOUT);
- }
- public void allowSelfsignedCertificates() {
- // https
- Protocol.registerProtocol("https", new Protocol("https",
- new EasySSLSocketFactory(), 443));
- }
- /**
- * Downloads a file in remoteFilepath to the local targetPath.
- *
- * @param remoteFilepath Path to the file in the remote server, URL DECODED.
- * @param targetFile Local path to save the downloaded file.
- * @return 'True' when the file is successfully downloaded.
- */
- public boolean downloadFile(String remoteFilepath, File targetFile) {
- boolean ret = false;
- GetMethod get = new GetMethod(mUri.toString() + WebdavUtils.encodePath(remoteFilepath));
- int status = -1;
- try {
- status = executeMethod(get);
- if (status == HttpStatus.SC_OK) {
- targetFile.createNewFile();
- BufferedInputStream bis = new BufferedInputStream(
- get.getResponseBodyAsStream());
- FileOutputStream fos = new FileOutputStream(targetFile);
- byte[] bytes = new byte[4096];
- int readResult;
- while ((readResult = bis.read(bytes)) != -1) {
- if (mDataTransferListener != null)
- mDataTransferListener.transferProgress(readResult);
- fos.write(bytes, 0, readResult);
- }
- ret = true;
- }
-
- } catch (HttpException e) {
- Log.e(TAG, "HTTP exception downloading " + remoteFilepath, e);
- } catch (IOException e) {
- Log.e(TAG, "I/O exception downloading " + remoteFilepath, e);
- } catch (Exception e) {
- Log.e(TAG, "Unexpected exception downloading " + remoteFilepath, e);
-
- } finally {
- if (!ret) {
- if (status >= 0) {
- Log.e(TAG, "Download of " + remoteFilepath + " to " + targetFile + " failed with HTTP status " + status);
- }
- if (targetFile.exists()) {
- targetFile.delete();
- }
- }
- }
- return ret;
- }
-
- /**
- * Deletes a remote file via webdav
- * @param remoteFilePath Remote file path of the file to delete, in URL DECODED format.
- * @return
- */
- public boolean deleteFile(String remoteFilePath){
- DavMethod delete = new DeleteMethod(mUri.toString() + WebdavUtils.encodePath(remoteFilePath));
- try {
- executeMethod(delete);
- } catch (Throwable e) {
- Log.e(TAG, "Deleting failed with error: " + e.getMessage(), e);
- return false;
- }
- return true;
- }
- public void setDataTransferProgressListener(OnDatatransferProgressListener listener) {
- mDataTransferListener = listener;
- }
-
- /**
- * Creates or update a file in the remote server with the contents of a local file.
- *
- *
- * @param localFile Path to the local file to upload.
- * @param remoteTarget Remote path to the file to create or update, URL DECODED
- * @param contentType MIME type of the file.
- * @return 'True' then the upload was successfully completed
- */
- public boolean putFile(String localFile, String remoteTarget, String contentType) {
- boolean result = false;
- int status = -1;
- try {
- File f = new File(localFile);
- FileRequestEntity entity = new FileRequestEntity(f, contentType);
- entity.setOnDatatransferProgressListener(mDataTransferListener);
- PutMethod put = new PutMethod(mUri.toString() + WebdavUtils.encodePath(remoteTarget));
- put.setRequestEntity(entity);
- status = executeMethod(put);
-
- result = (status == HttpStatus.SC_OK || status == HttpStatus.SC_CREATED || status == HttpStatus.SC_NO_CONTENT);
-
- Log.d(TAG, "PUT response for " + remoteTarget + " finished with HTTP status " + status);
-
- } catch (HttpException e) {
- Log.e(TAG, "HTTP exception uploading " + localFile + " to " + remoteTarget, e);
- } catch (IOException e) {
- Log.e(TAG, "I/O exception uploading " + localFile + " to " + remoteTarget, e);
- } catch (Exception e) {
- Log.e(TAG, "Unexpected exception uploading " + localFile + " to " + remoteTarget, e);
- }
-
- if (!result && status >= 0) Log.e(TAG, "Upload of " + localFile + " to " + remoteTarget + " FAILED with HTTP status " + status);
-
- return result;
- }
- /**
- * Tries to log in to the given WedDavURI, with the given credentials
- * @param uri To test
- * @param username Username to check
- * @param password Password to verify
- * @return A {@link HttpStatus}-Code of the result. SC_OK is good.
- */
- public static int tryToLogin(Uri uri, String username, String password) {
- int returnCode = 0;
- try {
- WebdavClient client = new WebdavClient();
- client.setCredentials(username, password);
- HeadMethod head = new HeadMethod(uri.toString());
- returnCode = client.executeMethod(head);
- } catch (HttpException e) {
- Log.e(TAG, "HTTP exception trying to login at " + uri.getEncodedPath(), e);
- } catch (IOException e) {
- Log.e(TAG, "I/O exception trying to login at " + uri.getEncodedPath(), e);
- } catch (Exception e) {
- Log.e(TAG, "Unexpected exception trying to login at " + uri.getEncodedPath(), e);
- }
- return returnCode;
- }
- /**
- * Creates a remote directory with the received path.
- *
- * @param path Path of the directory to create, URL DECODED
- * @return 'True' when the directory is successfully created
- */
- public boolean createDirectory(String path) {
- boolean result = false;
- int status = -1;
- try {
- MkColMethod mkcol = new MkColMethod(mUri.toString() + WebdavUtils.encodePath(path));
- Log.d(TAG, "Creating directory " + path);
- status = executeMethod(mkcol);
- Log.d(TAG, "Status returned: " + status);
- result = mkcol.succeeded();
-
- } catch (HttpException e) {
- Log.e(TAG, "HTTP exception creating directory " + path, e);
- } catch (IOException e) {
- Log.e(TAG, "I/O exception creating directory " + path, e);
- } catch (Exception e) {
- Log.e(TAG, "Unexpected exception creating directory " + path, e);
-
- }
- if (!result && status >= 0) {
- Log.e(TAG, "Creation of directory " + path + " failed with HTTP status " + status);
- }
- return result;
- }
-
-
- /**
- * Check if a file exists in the OC server
- *
- * @return 'Boolean.TRUE' if the file exists; 'Boolean.FALSE' it doesn't exist; NULL if couldn't be checked
- */
- public Boolean existsFile(String path) {
- try {
- HeadMethod head = new HeadMethod(mUri.toString() + WebdavUtils.encodePath(path));
- int status = executeMethod(head);
- return (status == HttpStatus.SC_OK);
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- }
- /**
- * Requests the received method with the received timeout (milliseconds).
- *
- * Executes the method through the inherited HttpClient.executedMethod(method).
- *
- * Sets the socket timeout for the HttpMethodBase method received.
- *
- * @param method HTTP method request.
- * @param timeout Timeout to set, in milliseconds; <= 0 means infinite.
- */
- public int executeMethod(HttpMethodBase method, int readTimeout) throws HttpException, IOException {
- int oldSoTimeout = getParams().getSoTimeout();
- try {
- if (readTimeout < 0) {
- readTimeout = 0;
- }
- HttpMethodParams params = method.getParams();
- params.setSoTimeout(readTimeout);
- method.setParams(params); // this should be enough...
- getParams().setSoTimeout(readTimeout); // ... but this is necessary for HTTPS
- return executeMethod(method);
- } finally {
- getParams().setSoTimeout(oldSoTimeout);
- }
- }
- }
|