ssl support for syncing
[pub/Android/ownCloud.git] / src / eu / alefzero / webdav / WebdavClient.java
index 4d97ceb..722614e 100644 (file)
  *   along with this program.  If not, see <http://www.gnu.org/licenses/>.\r
  *\r
  */\r
-package eu.alefzero.webdav;\r
-\r
-import java.io.BufferedInputStream;\r
-import java.io.BufferedOutputStream;\r
-import java.io.File;\r
-import java.io.FileOutputStream;\r
-import java.io.IOException;\r
-import java.io.InputStreamReader;\r
-import java.io.OutputStreamWriter;\r
-\r
-import org.apache.http.HttpHost;\r
-import org.apache.http.HttpResponse;\r
-import org.apache.http.HttpStatus;\r
-import org.apache.http.HttpVersion;\r
-import org.apache.http.auth.AuthScope;\r
-import org.apache.http.auth.UsernamePasswordCredentials;\r
-import org.apache.http.client.methods.HttpGet;\r
-import org.apache.http.client.methods.HttpPut;\r
-import org.apache.http.conn.ClientConnectionManager;\r
-import org.apache.http.conn.params.ConnManagerPNames;\r
-import org.apache.http.conn.params.ConnPerRouteBean;\r
-import org.apache.http.conn.scheme.PlainSocketFactory;\r
-import org.apache.http.conn.scheme.Scheme;\r
-import org.apache.http.conn.scheme.SchemeRegistry;\r
-import org.apache.http.conn.ssl.SSLSocketFactory;\r
-import org.apache.http.entity.FileEntity;\r
-import org.apache.http.entity.mime.content.FileBody;\r
-import org.apache.http.impl.auth.BasicScheme;\r
-import org.apache.http.impl.client.DefaultHttpClient;\r
-import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;\r
-import org.apache.http.params.BasicHttpParams;\r
-import org.apache.http.params.HttpParams;\r
-import org.apache.http.params.HttpProtocolParams;\r
-import org.apache.http.protocol.BasicHttpContext;\r
-\r
-import eu.alefzero.owncloud.authenticator.EasySSLSocketFactory;\r
-\r
-import android.net.Uri;\r
-import android.util.Log;\r
-\r
-/**\r
- * A basic WebDAV-Client\r
- * @author Bartek Przybylski\r
- *\r
- */\r
-public class WebdavClient {\r
-  private DefaultHttpClient mHttpClient;\r
-  private BasicHttpContext mHttpContext;\r
-  private HttpHost mTargetHost;\r
-  private SchemeRegistry mSchemeRegistry;\r
-  private Uri mUri;\r
-  final private static String TAG = "WebdavClient";\r
-  \r
-  public WebdavClient(Uri uri) {\r
-    mUri = uri;\r
-    mSchemeRegistry = new SchemeRegistry();\r
-    setupHttpClient();\r
-  }\r
-  \r
-  public void setCredentials(String username, String password) {\r
-    // determine default port for http or https\r
-    int targetPort = mTargetHost.getPort() == -1 ? \r
-                        ( mUri.getScheme().equals("https") ? 443 : 80)\r
-                        : mUri.getPort();\r
-\r
-    mHttpClient.getCredentialsProvider().setCredentials(\r
-        new AuthScope(mUri.getHost(), targetPort), \r
-        new UsernamePasswordCredentials(username, password));\r
-    BasicScheme basicAuth = new BasicScheme();\r
-    mHttpContext.setAttribute("preemptive-auth", basicAuth);\r
-  }\r
-  \r
-  public void allowUnsignedCertificates() {\r
-    // https\r
-    mSchemeRegistry.register(new Scheme("https", new EasySSLSocketFactory(), 443));\r
-  }\r
-  \r
-  public boolean downloadFile(String filepath, File targetPath) {\r
-    HttpGet get = new HttpGet(mUri.toString() + filepath.replace(" ", "%20"));\r
-    get.setHeader("Host", mUri.getHost());\r
-    get.setHeader("User-Agent", "Android-ownCloud");\r
-    \r
-    try {\r
-      HttpResponse response = mHttpClient.execute(mTargetHost, get, mHttpContext);\r
-      if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {\r
-        return false;\r
-      }\r
-      BufferedInputStream bis = new BufferedInputStream(response.getEntity().getContent());\r
-      FileOutputStream fos = new FileOutputStream(targetPath);\r
-      \r
-      byte[] bytes = new byte[512];\r
-      int readResult;\r
-      while ((readResult = bis.read(bytes)) != -1) fos.write(bytes, 0, readResult);\r
-      \r
-    } catch (IOException e) {\r
-      e.printStackTrace();\r
-      return false;\r
-    }\r
-    return true;\r
-  }\r
-  \r
-  void getFileList(String dirPath) {\r
-    \r
-  }\r
-  \r
-  public boolean putFile(String localFile,\r
-                  String remoteTarget,\r
-                  String contentType) {\r
-    boolean result = true;\r
-    HttpPut method = new HttpPut(mUri.toString() + remoteTarget.replace(" ", "%20"));\r
-    method.setHeader("Content-type", contentType);\r
-    method.setHeader("Host", mUri.getHost());\r
-    method.setHeader("User-Agent", "Android-ownCloud");\r
-\r
-    try {\r
-      FileBody fb = new FileBody(new File(localFile, contentType));\r
-      final FileEntity fileEntity = new FileEntity(new File(localFile), contentType);\r
-\r
-      method.setEntity(fileEntity);\r
-      Log.i(TAG, "executing:" + method.getRequestLine().toString());\r
-\r
-      mHttpClient.execute(mTargetHost, method, mHttpContext);\r
-      /*mHandler.post(new Runnable() {\r
-      public void run() {\r
-        Uploader.this.PartialupdateUpload(c.getString(c.getColumnIndex(Media.DATA)),\r
-                                                  c.getString(c.getColumnIndex(Media.DISPLAY_NAME)),\r
-                                                  mUploadPath + (mUploadPath.equals("/")?"":"/"),\r
-                                                  fileEntity.getContentType().getValue(),\r
-                                                  fileEntity.getContentLength()+"");\r
-      }\r
-    });\r
-    Log.i(TAG, "Uploading, done");\r
-*/\r
-      Log.i(TAG, "Uploading, done");\r
-    } catch (final Exception e) {\r
-      Log.i(TAG, ""+e.getMessage());\r
-      result = false;\r
-    }\r
-    \r
-    return result;\r
-  }\r
-  \r
-  public boolean createDirectory(String path) {\r
-    HttpMkCol method = new HttpMkCol(mUri.toString() + path + "/");\r
-    method.setHeader("User-Agent", "Android-ownCloud");\r
-    \r
-    try {\r
-      mHttpClient.execute(mTargetHost, method, mHttpContext);\r
-      Log.i(TAG, "Creating dir completed");\r
-    } catch (final Exception e) {\r
-      e.printStackTrace();\r
-      return false;\r
-    }\r
-    return true;\r
-  }\r
-  \r
-  private void setupHttpClient() {\r
-    // http scheme\r
-    mSchemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));\r
-    mSchemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));\r
-    \r
-    HttpParams params = new BasicHttpParams();\r
-    params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30);\r
-    params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30));\r
-    params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false);\r
-    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);\r
-\r
-    mHttpContext = new BasicHttpContext();\r
-    ClientConnectionManager cm = new ThreadSafeClientConnManager(params, mSchemeRegistry);\r
-\r
-    int port = mUri.getPort() == -1 ? \r
-                 mUri.getScheme().equals("https") ? 443 : 80\r
-               : mUri.getPort();\r
-    \r
-    mTargetHost = new HttpHost(mUri.getHost(), port, mUri.getScheme());\r
-    \r
-    mHttpClient = new DefaultHttpClient(cm, params);\r
-  }\r
-}\r
+package eu.alefzero.webdav;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+
+import org.apache.http.HttpHost;
+import org.apache.http.HttpResponse;
+import org.apache.http.HttpStatus;
+import org.apache.http.HttpVersion;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.conn.ClientConnectionManager;
+import org.apache.http.conn.params.ConnManagerPNames;
+import org.apache.http.conn.params.ConnPerRouteBean;
+import org.apache.http.conn.scheme.PlainSocketFactory;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.scheme.SchemeRegistry;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.entity.FileEntity;
+import org.apache.http.entity.mime.content.FileBody;
+import org.apache.http.impl.auth.BasicScheme;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
+import org.apache.http.params.BasicHttpParams;
+import org.apache.http.params.HttpParams;
+import org.apache.http.params.HttpProtocolParams;
+import org.apache.http.protocol.BasicHttpContext;
+
+import eu.alefzero.owncloud.authenticator.EasySSLSocketFactory;
+import eu.alefzero.webdav.HttpMkCol;
+
+import android.net.Uri;
+import android.util.Log;
+
+public class WebdavClient {
+  private DefaultHttpClient mHttpClient;
+  private BasicHttpContext mHttpContext;
+  private HttpHost mTargetHost;
+  private SchemeRegistry mSchemeRegistry;
+  private Uri mUri;
+  final private static String TAG = "WebdavClient";
+  
+  public DefaultHttpClient getHttpClient() {
+    return mHttpClient;
+  }
+  public HttpHost getTargetHost() {
+    return mTargetHost;
+  }
+  
+  public WebdavClient(Uri uri) {
+    mUri = uri;
+    mSchemeRegistry = new SchemeRegistry();
+    setupHttpClient();
+  }
+  
+  public void setCredentials(String username, String password) {
+    // determine default port for http or https
+    int targetPort = mTargetHost.getPort() == -1 ? 
+                        ( mUri.getScheme().equals("https") ? 443 : 80)
+                        : mUri.getPort();
+
+    mHttpClient.getCredentialsProvider().setCredentials(
+        new AuthScope(mUri.getHost(), targetPort), 
+        new UsernamePasswordCredentials(username, password));
+    BasicScheme basicAuth = new BasicScheme();
+    mHttpContext.setAttribute("preemptive-auth", basicAuth);
+  }
+  
+  public void allowUnsignedCertificates() {
+    // https
+    mSchemeRegistry.register(new Scheme("https", new EasySSLSocketFactory(), 443));
+  }
+  
+  public boolean downloadFile(String filepath, File targetPath) {
+    HttpGet get = new HttpGet(mUri.toString() + filepath.replace(" ", "%20"));
+    get.setHeader("Host", mUri.getHost());
+    get.setHeader("User-Agent", "Android-ownCloud");
+    
+    try {
+      HttpResponse response = mHttpClient.execute(mTargetHost, get, mHttpContext);
+      if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
+        return false;
+      }
+      BufferedInputStream bis = new BufferedInputStream(response.getEntity().getContent());
+      FileOutputStream fos = new FileOutputStream(targetPath);
+      
+      byte[] bytes = new byte[512];
+      int readResult;
+      while ((readResult = bis.read(bytes)) != -1) fos.write(bytes, 0, readResult);
+      
+    } catch (IOException e) {
+      e.printStackTrace();
+      return false;
+    }
+    return true;
+  }
+  
+  public boolean putFile(String localFile,
+                  String remoteTarget,
+                  String contentType) {
+    boolean result = true;
+    HttpPut method = new HttpPut(mUri.toString() + remoteTarget.replace(" ", "%20"));
+    method.setHeader("Content-type", contentType);
+    method.setHeader("Host", mUri.getHost());
+    method.setHeader("User-Agent", "Android-ownCloud");
+
+    try {
+      FileBody fb = new FileBody(new File(localFile, contentType));
+      final FileEntity fileEntity = new FileEntity(new File(localFile), contentType);
+
+      method.setEntity(fileEntity);
+      Log.i(TAG, "executing:" + method.getRequestLine().toString());
+
+      mHttpClient.execute(mTargetHost, method, mHttpContext);
+      /*mHandler.post(new Runnable() {
+      public void run() {
+        Uploader.this.PartialupdateUpload(c.getString(c.getColumnIndex(Media.DATA)),
+                                                  c.getString(c.getColumnIndex(Media.DISPLAY_NAME)),
+                                                  mUploadPath + (mUploadPath.equals("/")?"":"/"),
+                                                  fileEntity.getContentType().getValue(),
+                                                  fileEntity.getContentLength()+"");
+      }
+    });
+    Log.i(TAG, "Uploading, done");
+*/
+      Log.i(TAG, "Uploading, done");
+    } catch (final Exception e) {
+      Log.i(TAG, ""+e.getMessage());
+      result = false;
+    }
+    
+    return result;
+  }
+  
+  public boolean createDirectory(String path) {
+    HttpMkCol method = new HttpMkCol(mUri.toString() + path + "/");
+    method.setHeader("User-Agent", "Android-ownCloud");
+    
+    try {
+      mHttpClient.execute(mTargetHost, method, mHttpContext);
+      Log.i(TAG, "Creating dir completed");
+    } catch (final Exception e) {
+      e.printStackTrace();
+      return false;
+    }
+    return true;
+  }
+  
+  private void setupHttpClient() {
+    // http scheme
+    mSchemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));
+    mSchemeRegistry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443));
+    
+    HttpParams params = new BasicHttpParams();
+    params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30);
+    params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30));
+    params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false);
+    HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
+
+    mHttpContext = new BasicHttpContext();
+    ClientConnectionManager cm = new ThreadSafeClientConnManager(params, mSchemeRegistry);
+
+    int port = mUri.getPort() == -1 ? 
+                 mUri.getScheme().equals("https") ? 443 : 80
+               : mUri.getPort();
+    
+    mTargetHost = new HttpHost(mUri.getHost(), port, mUri.getScheme());
+    
+    mHttpClient = new DefaultHttpClient(cm, params);
+  }
+}