Server certificates improvements: fixed problems in devices with OpenSSL implementati...
[pub/Android/ownCloud.git] / src / com / owncloud / android / authenticator / ConnectionCheckOperation.java
1 /* ownCloud Android client application
2 * Copyright (C) 2012 Bartek Przybylski
3 *
4 * This program is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 *
17 */
18
19 package com.owncloud.android.authenticator;
20
21 import org.apache.commons.httpclient.HttpStatus;
22 import org.apache.commons.httpclient.methods.GetMethod;
23 import org.json.JSONException;
24 import org.json.JSONObject;
25
26 import com.owncloud.android.AccountUtils;
27 import com.owncloud.android.operations.RemoteOperation;
28 import com.owncloud.android.operations.RemoteOperationResult;
29 import com.owncloud.android.utils.OwnCloudVersion;
30
31 import eu.alefzero.webdav.WebdavClient;
32 import android.content.Context;
33 import android.net.ConnectivityManager;
34 import android.net.Uri;
35 import android.util.Log;
36
37 public class ConnectionCheckOperation extends RemoteOperation {
38
39 /** Maximum time to wait for a response from the server when the connection is being tested, in MILLISECONDs. */
40 public static final int TRY_CONNECTION_TIMEOUT = 5000;
41
42 private static final String TAG = ConnectionCheckOperation.class.getCanonicalName();
43
44 private String mUrl;
45 private RemoteOperationResult mLatestResult;
46 private Context mContext;
47 private OwnCloudVersion mOCVersion;
48
49 public ConnectionCheckOperation(String url, Context context) {
50 mUrl = url;
51 mContext = context;
52 mOCVersion = null;
53 }
54
55 public OwnCloudVersion getDiscoveredVersion() {
56 return mOCVersion;
57 }
58
59 private boolean tryConnection(WebdavClient wc, String urlSt) {
60 boolean retval = false;
61 GetMethod get = null;
62 try {
63 get = new GetMethod(urlSt);
64 int status = wc.executeMethod(get, TRY_CONNECTION_TIMEOUT, TRY_CONNECTION_TIMEOUT);
65 String response = get.getResponseBodyAsString();
66 if (status == HttpStatus.SC_OK) {
67 JSONObject json = new JSONObject(response);
68 if (!json.getBoolean("installed")) {
69 mLatestResult = new RemoteOperationResult(RemoteOperationResult.ResultCode.INSTANCE_NOT_CONFIGURED);
70 } else {
71 mOCVersion = new OwnCloudVersion(json.getString("version"));
72 if (!mOCVersion.isVersionValid()) {
73 mLatestResult = new RemoteOperationResult(RemoteOperationResult.ResultCode.BAD_OC_VERSION);
74
75 } else {
76 retval = true;
77 }
78 }
79
80 } else {
81 mLatestResult = new RemoteOperationResult(false, status);
82 }
83
84 } catch (JSONException e) {
85 mLatestResult = new RemoteOperationResult(RemoteOperationResult.ResultCode.INSTANCE_NOT_CONFIGURED);
86
87 } catch (Exception e) {
88 mLatestResult = new RemoteOperationResult(e);
89
90 } finally {
91 if (get != null)
92 get.releaseConnection();
93 }
94
95 if (mLatestResult.isSuccess()) {
96 Log.i(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage());
97
98 } else if (mLatestResult.getException() != null) {
99 Log.e(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage(), mLatestResult.getException());
100
101 } else {
102 Log.e(TAG, "Connection check at " + urlSt + ": " + mLatestResult.getLogMessage());
103 }
104
105 return retval;
106 }
107
108 private boolean isOnline() {
109 ConnectivityManager cm = (ConnectivityManager) mContext
110 .getSystemService(Context.CONNECTIVITY_SERVICE);
111 return cm != null && cm.getActiveNetworkInfo() != null
112 && cm.getActiveNetworkInfo().isConnectedOrConnecting();
113 }
114
115 @Override
116 protected RemoteOperationResult run(WebdavClient client) {
117 if (!isOnline()) {
118 return new RemoteOperationResult(RemoteOperationResult.ResultCode.NO_NETWORK_CONNECTION);
119 }
120 if (mUrl.startsWith("http://") || mUrl.startsWith("https://")) {
121 mLatestResult = new RemoteOperationResult(
122 mUrl.startsWith("https://") ? RemoteOperationResult.ResultCode.OK_SSL : RemoteOperationResult.ResultCode.OK_NO_SSL
123 );
124 tryConnection(client, mUrl + AccountUtils.STATUS_PATH);
125 return mLatestResult;
126
127 } else {
128 client.setBaseUri(Uri.parse("https://" + mUrl + AccountUtils.STATUS_PATH));
129 if (tryConnection(client, "https://" + mUrl + AccountUtils.STATUS_PATH)) {
130 return new RemoteOperationResult(RemoteOperationResult.ResultCode.OK_SSL);
131
132 } else if (!mLatestResult.isSslRecoverableException()) {
133
134 Log.d(TAG, "establishing secure connection failed, trying non secure connection");
135 client.setBaseUri(Uri.parse("http://" + mUrl + AccountUtils.STATUS_PATH));
136 if (tryConnection(client, "http://" + mUrl + AccountUtils.STATUS_PATH)) {
137 return new RemoteOperationResult(RemoteOperationResult.ResultCode.OK_NO_SSL);
138 }
139 }
140 return mLatestResult;
141 }
142 }
143
144 }