X-Git-Url: http://git.linex4red.de/pub/Android/ownCloud.git/blobdiff_plain/2bc41ee3315feb483e4b92873df8f7dd3bb5499c..635fcd3e281e81b4632b92b161718c21be9c5e46:/src/eu/alefzero/owncloud/authenticator/AuthUtils.java diff --git a/src/eu/alefzero/owncloud/authenticator/AuthUtils.java b/src/eu/alefzero/owncloud/authenticator/AuthUtils.java index c5068868..e3fc32c4 100644 --- a/src/eu/alefzero/owncloud/authenticator/AuthUtils.java +++ b/src/eu/alefzero/owncloud/authenticator/AuthUtils.java @@ -1,241 +1,251 @@ -/* 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 . - * - */ - -package eu.alefzero.owncloud.authenticator; - -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.UnknownHostException; -import java.security.KeyManagementException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.security.UnrecoverableKeyException; - -import javax.net.SocketFactory; -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - -import javax.security.cert.CertificateException; -import javax.security.cert.X509Certificate; - -import org.apache.http.client.HttpClient; -import org.apache.http.conn.ClientConnectionManager; -import org.apache.http.conn.scheme.Scheme; -import org.apache.http.conn.scheme.SchemeRegistry; - -import org.apache.http.impl.client.DefaultHttpClient; - -import org.apache.commons.httpclient.auth.BasicScheme; -import org.apache.http.HttpHost; -import org.apache.http.HttpResponse; -import org.apache.http.HttpVersion; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.methods.HttpHead; -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.ssl.SSLSocketFactory; -import org.apache.http.impl.conn.SingleClientConnManager; -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 android.content.Context; -import android.os.Handler; -import android.util.Log; - -public class AuthUtils { - public static final String WEBDAV_PATH_1_2 = "/webdav/owncloud.php"; - public static final String WEBDAV_PATH_2_0 = "/files/webdav.php"; - public static final String CARDDAV_PATH_2_0 = "/apps/contacts/carddav.php"; - - private static String mResultMsg = ""; - - public static boolean authenticate(URL url, String username, String password, - Handler handler, Context context) { - String strippedPath = url.toString().endsWith("/") ? - url.toString().substring(0, url.toString().length()-1) : - url.toString(); - String webdatPath = strippedPath + WEBDAV_PATH_2_0; - URL complete_url = null; - try { - complete_url = new URL(webdatPath); - } catch (MalformedURLException e) { - // should never happend - sendResult(false, handler, context, "URL error"); - return false; - } - - // version 2.0 success - if (tryGetWebdav(complete_url, username, password, handler, context)) { - sendResult(true, handler, context, complete_url.toString()); - return true; - } - - if (mResultMsg.equals("401")) { - sendResult(false, handler, context, "Invalid login or/and password"); - return false; - } - - if (!mResultMsg.equals("404")) { - sendResult(false, handler, context, "Server error: " + mResultMsg); - return false; - } - - webdatPath = strippedPath + WEBDAV_PATH_1_2; - try { - complete_url = new URL(webdatPath); - } catch (MalformedURLException e) { - // should never happend - sendResult(false, handler, context, "URL error"); - return false; - } - - // version 1.2 success - if (tryGetWebdav(complete_url, username, password, handler, context)) { - sendResult(true, handler, context, complete_url.toString()); - return true; - } - - if (mResultMsg.equals("401")) { - sendResult(false, handler, context, "Invalid login or/and password"); - return false; - } - - if (mResultMsg.equals("404")) { - sendResult(false, handler, context, "Wrong path given"); - return false; - } - - sendResult(false, handler, context, "Server error: " + mResultMsg); - return false; - } - - public static boolean tryGetWebdav(URL url, String username, String pwd, - Handler handler, Context context) { - SchemeRegistry schemeRegistry = new SchemeRegistry(); - // http scheme - schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); - // https scheme - schemeRegistry.register(new Scheme("https", new EasySSLSocketFactory(), 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); - - ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); - - DefaultHttpClient c = new DefaultHttpClient(cm, params); - - c.getCredentialsProvider().setCredentials( - new AuthScope(url.getHost(), (url.getPort() == -1)?80:url.getPort()), - new UsernamePasswordCredentials(username, pwd)); - - BasicHttpContext localcontext = new BasicHttpContext(); - BasicScheme basicAuth = new BasicScheme(); - - localcontext.setAttribute("preemptive-auth", basicAuth); - HttpHost targetHost = new HttpHost(url.getHost(), (url.getPort() == -1) - ? 80 - : url.getPort(), (url.getProtocol().equals("https")) ? "https" : "http"); - HttpHead httpget = new HttpHead(url.toString()); - httpget.setHeader("Host", url.getHost()); - HttpResponse response = null; - try { - response = c.execute(targetHost, httpget, localcontext); - } catch (ClientProtocolException e1) { - sendResult(false, handler, context, "Protocol error: " - + e1.getLocalizedMessage()); - return false; - } catch (UnknownHostException e1) { - mResultMsg = "Unknowh host: " + e1.getLocalizedMessage(); - return false; - } catch (IOException e1) { - mResultMsg = "Error: " + e1.getLocalizedMessage(); - return false; - } - String status = response.getStatusLine().toString(); - - status = status.split(" ")[1]; - Log.i("AuthUtils", "Status returned: " + status); - if (status.equals("200")) { - return true; - } else if (status.equals("404")) { - mResultMsg = "404"; - return false; - } else if (status.equals("401")) { - mResultMsg = "401"; - return false; - } - mResultMsg = status; - return false; - } - - public static Thread performOnBackgroundThread(final Runnable r) { - final Thread t = new Thread() { - @Override - public void run() { - try { - r.run(); - } finally {} - } - }; - t.start(); - return t; - } - - public static void sendResult(final Boolean result, - final Handler handler, - final Context context, - final String message) { - if (handler == null || context == null) { - return; - } - handler.post(new Runnable() { - public void run() { - ((AuthenticatorActivity) context).onAuthenticationResult(result, message); - } - }); - } - - public static Thread attemptAuth(final URL url, final String username, - final String password, final Handler handler, - final Context context) { - final Runnable r = new Runnable() { - - public void run() { - authenticate(url, username, password, handler, context); - } - }; - return performOnBackgroundThread(r); - } -} +/* 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 . + * + */ + +package eu.alefzero.owncloud.authenticator; + +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.UnknownHostException; +import org.apache.http.conn.ClientConnectionManager; +import org.apache.http.conn.scheme.Scheme; +import org.apache.http.conn.scheme.SchemeRegistry; + +import org.apache.http.impl.client.DefaultHttpClient; + +import org.apache.commons.httpclient.auth.BasicScheme; +import org.apache.http.HttpHost; +import org.apache.http.HttpResponse; +import org.apache.http.HttpVersion; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.methods.HttpHead; +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.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.ui.activity.AuthenticatorActivity; + + +import android.accounts.Account; +import android.accounts.AccountManager; +import android.content.Context; +import android.content.SharedPreferences; +import android.os.Handler; +import android.preference.PreferenceManager; +import android.util.Log; + +public class AuthUtils { + public static final String WEBDAV_PATH_1_2 = "/webdav/owncloud.php"; + public static final String WEBDAV_PATH_2_0 = "/files/webdav.php"; + public static final String CARDDAV_PATH_2_0 = "/apps/contacts/carddav.php"; + + private static String mResultMsg = ""; + + public static boolean authenticate(URL url, String username, String password, + Handler handler, Context context) { + String strippedPath = url.toString().endsWith("/") ? + url.toString().substring(0, url.toString().length()-1) : + url.toString(); + String webdatPath = strippedPath + WEBDAV_PATH_2_0; + URL complete_url = null; + try { + complete_url = new URL(webdatPath); + } catch (MalformedURLException e) { + // should never happend + sendResult(false, handler, context, "URL error"); + return false; + } + + // version 2.0 success + if (tryGetWebdav(complete_url, username, password, handler, context)) { + sendResult(true, handler, context, complete_url.toString()); + return true; + } + + if (mResultMsg.equals("401")) { + sendResult(false, handler, context, "Invalid login or/and password"); + return false; + } + + if (!mResultMsg.equals("404")) { + sendResult(false, handler, context, "Server error: " + mResultMsg); + return false; + } + + webdatPath = strippedPath + WEBDAV_PATH_1_2; + try { + complete_url = new URL(webdatPath); + } catch (MalformedURLException e) { + // should never happend + sendResult(false, handler, context, "URL error"); + return false; + } + + // version 1.2 success + if (tryGetWebdav(complete_url, username, password, handler, context)) { + sendResult(true, handler, context, complete_url.toString()); + return true; + } + + if (mResultMsg.equals("401")) { + sendResult(false, handler, context, "Invalid login or/and password"); + return false; + } + + if (mResultMsg.equals("404")) { + sendResult(false, handler, context, "Wrong path given"); + return false; + } + + sendResult(false, handler, context, "Server error: " + mResultMsg); + return false; + } + + public static boolean tryGetWebdav(URL url, String username, String pwd, + Handler handler, Context context) { + SchemeRegistry schemeRegistry = new SchemeRegistry(); + // http scheme + schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); + // https scheme + schemeRegistry.register(new Scheme("https", new EasySSLSocketFactory(), 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); + + ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); + + DefaultHttpClient c = new DefaultHttpClient(cm, params); + + c.getCredentialsProvider().setCredentials( + new AuthScope(url.getHost(), (url.getPort() == -1)?80:url.getPort()), + new UsernamePasswordCredentials(username, pwd)); + + BasicHttpContext localcontext = new BasicHttpContext(); + BasicScheme basicAuth = new BasicScheme(); + + localcontext.setAttribute("preemptive-auth", basicAuth); + HttpHost targetHost = new HttpHost(url.getHost(), (url.getPort() == -1) + ? 80 + : url.getPort(), (url.getProtocol().equals("https")) ? "https" : "http"); + HttpHead httpget = new HttpHead(url.toString()); + httpget.setHeader("Host", url.getHost()); + HttpResponse response = null; + try { + response = c.execute(targetHost, httpget, localcontext); + } catch (ClientProtocolException e1) { + sendResult(false, handler, context, "Protocol error: " + + e1.getLocalizedMessage()); + return false; + } catch (UnknownHostException e1) { + mResultMsg = "Unknowh host: " + e1.getLocalizedMessage(); + return false; + } catch (IOException e1) { + mResultMsg = "Error: " + e1.getLocalizedMessage(); + return false; + } + String status = response.getStatusLine().toString(); + + status = status.split(" ")[1]; + Log.i("AuthUtils", "Status returned: " + status); + if (status.equals("200")) { + return true; + } else if (status.equals("404")) { + mResultMsg = "404"; + return false; + } else if (status.equals("401")) { + mResultMsg = "401"; + return false; + } + mResultMsg = status; + return false; + } + + public static Thread performOnBackgroundThread(final Runnable r) { + final Thread t = new Thread() { + @Override + public void run() { + try { + r.run(); + } finally {} + } + }; + t.start(); + return t; + } + + public static void sendResult(final Boolean result, + final Handler handler, + final Context context, + final String message) { + if (handler == null || context == null) { + return; + } + handler.post(new Runnable() { + public void run() { + ((AuthenticatorActivity) context).onAuthenticationResult(result, message); + } + }); + } + + public static Thread attemptAuth(final URL url, final String username, + final String password, final Handler handler, + final Context context) { + final Runnable r = new Runnable() { + + public void run() { + authenticate(url, username, password, handler, context); + } + }; + return performOnBackgroundThread(r); + } + + /** + * Can be used to get the currently selected ownCloud account in the preferences + * + * @param context The current appContext + * @return The current account or null, if there is none yet. + */ + public static Account getCurrentOwnCloudAccount(Context context){ + Account[] ocAccounts = AccountManager.get(context).getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE); + Account defaultAccount = null; + + SharedPreferences appPreferences = PreferenceManager.getDefaultSharedPreferences(context); + String accountName = appPreferences.getString("select_oc_account", null); + + if(accountName != null){ + for(Account account : ocAccounts){ + if(account.name.equals(accountName)){ + defaultAccount = account; + break; + } + } + } + + return defaultAccount; + } +}