From 986961b388d8eb67c7c1bd5aeb3f7f9dc9d81859 Mon Sep 17 00:00:00 2001 From: gsu Date: Wed, 8 Feb 2012 17:55:53 -0800 Subject: [PATCH] Bypassed ssl certificate --- src/com/etime/ETimeActivity.java | 45 ++++++-- src/com/etime/ETimeUtils.java | 4 +- src/com/etime/EasySSLSocketFactory.java | 136 ++++++++++++++++++++++++ src/com/etime/EasyX509TrustManager.java | 93 ++++++++++++++++ src/com/etime/LoginAsyncTask.java | 16 ++- 5 files changed, 278 insertions(+), 16 deletions(-) create mode 100644 src/com/etime/EasySSLSocketFactory.java create mode 100644 src/com/etime/EasyX509TrustManager.java diff --git a/src/com/etime/ETimeActivity.java b/src/com/etime/ETimeActivity.java index 0ba3650..cb73aa0 100644 --- a/src/com/etime/ETimeActivity.java +++ b/src/com/etime/ETimeActivity.java @@ -32,11 +32,22 @@ import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; + +import org.apache.http.HttpVersion; import org.apache.http.auth.AuthScope; import org.apache.http.auth.UsernamePasswordCredentials; import org.apache.http.client.params.HttpClientParams; +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.impl.client.DefaultHttpClient; +import org.apache.http.impl.conn.SingleClientConnManager; +import org.apache.http.params.BasicHttpParams; import org.apache.http.params.HttpParams; +import org.apache.http.params.HttpProtocolParams; import java.util.Calendar; import java.util.List; @@ -83,7 +94,6 @@ public class ETimeActivity extends Activity { private boolean notCreated = true; // onResume not run yet private boolean oldAutoClockBeforePreferencePage; //Used to check if auto clock settings has been changed - private static String TIMESTAMP_RECORD_URL; @Override public void onCreate(Bundle savedInstanceState) { @@ -356,7 +366,6 @@ private void setupGlobals() { curStatus = (Button) findViewById(R.id.btn_curStatus); loading = (TextView) findViewById(R.id.tv_load); timeToClockOut = (Button) findViewById(R.id.btn_timeToClockOut); - TIMESTAMP_RECORD_URL = getString(R.string.timestamp_record_url); } /** @@ -383,21 +392,33 @@ private void setupTitlePage() { * If login has happened in the last 15 mins, don't re-login. */ private void login() { - long curTime = Calendar.getInstance().getTimeInMillis(); + long curTime = System.currentTimeMillis(); setTitle("ETime - " + loginName); - if ((curTime - loginTime) > DEF_TIMEOUT || (oldLoginNameBeforePreferencePage != null && !oldLoginNameBeforePreferencePage.equals(loginName))) { - if (httpClient != null) { - httpClient.getConnectionManager().shutdown(); - } + if (((curTime - loginTime) > DEF_TIMEOUT) || !oldLoginNameBeforePreferencePage.equals(loginName)) { + oldLoginNameBeforePreferencePage = loginName; + LoginAsyncTask loginAsyncTask = new LoginAsyncTask(); progressBar.setProgress(0); - httpClient = new DefaultHttpClient(); + SchemeRegistry schemeRegistry = new SchemeRegistry(); + schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); + 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 SingleClientConnManager(params, schemeRegistry); + + //HttpParams httpParams = new BasicHttpParams(); + httpClient = new DefaultHttpClient(cm, params); httpClient.getCredentialsProvider().setCredentials(new AuthScope(null, -1), new UsernamePasswordCredentials(loginName, password)); - HttpParams params = httpClient.getParams(); + params = httpClient.getParams(); HttpClientParams.setRedirecting(params, false); loginAsyncTask.setProgressBar(progressBar); @@ -405,10 +426,14 @@ private void login() { loginAsyncTask.setHttpClient(httpClient); loginAsyncTask.setContext(getApplicationContext()); loginAsyncTask.execute(); + + if (progressBar.getVisibility() == View.GONE) { + progressBar2.setVisibility(View.VISIBLE); + } } else { hideProgressBar(); showTitlePageBtns(); - if ((AUTO_CLOCKOUT != oldAutoClockBeforePreferencePage) || AUTO_CLOCKOUT) { + if (AUTO_CLOCKOUT != oldAutoClockBeforePreferencePage) { parseTimeCard(); } } diff --git a/src/com/etime/ETimeUtils.java b/src/com/etime/ETimeUtils.java index 0ecb97c..71ff355 100644 --- a/src/com/etime/ETimeUtils.java +++ b/src/com/etime/ETimeUtils.java @@ -78,7 +78,6 @@ protected static String getHtmlPageWithProgress(DefaultHttpClient client, String Header[] headers = response.getAllHeaders(); for (Header header : headers) { - Log.v(TAG, "Header " + header.getName() + ":" + header.getValue()); if (header.getName().equals("Content-Length")) { try { estimatedPageSize = Integer.parseInt(header.getValue()); @@ -107,7 +106,6 @@ protected static String getHtmlPageWithProgress(DefaultHttpClient client, String sb.append(line).append(NL); } page = sb.toString(); - Log.v(TAG, "Page size for " + url + " is: " + page.length()); } catch (Exception e) { Log.v(TAG, e.toString()); @@ -146,7 +144,7 @@ protected static double getTotalsHrs(String page) { total = Double.parseDouble(totalStr); } } - } catch (NumberFormatException e) { + } catch (Exception e) { Log.w(TAG, e.toString()); } diff --git a/src/com/etime/EasySSLSocketFactory.java b/src/com/etime/EasySSLSocketFactory.java new file mode 100644 index 0000000..edb892b --- /dev/null +++ b/src/com/etime/EasySSLSocketFactory.java @@ -0,0 +1,136 @@ +package com.etime; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.io.IOException; +import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Socket; +import java.net.UnknownHostException; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.TrustManager; + +import org.apache.http.conn.ConnectTimeoutException; +import org.apache.http.conn.scheme.LayeredSocketFactory; +import org.apache.http.params.HttpConnectionParams; +import org.apache.http.params.HttpParams; + +/** + * This socket factory will create ssl socket that accepts self signed + * certificate + * + * @author olamy + * @version $Id: EasySSLSocketFactory.java 765355 2009-04-15 20:59:07Z evenisse + * $ + * @since 1.2.3 + */ +public class EasySSLSocketFactory implements LayeredSocketFactory { + + private SSLContext sslcontext = null; + + private static SSLContext createEasySSLContext() throws IOException { + try { + SSLContext context = SSLContext.getInstance("TLS"); + context.init(null, new TrustManager[] { new EasyX509TrustManager( + null) }, null); + return context; + } catch (Exception e) { + throw new IOException(e.getMessage()); + } + } + + private SSLContext getSSLContext() throws IOException { + if (this.sslcontext == null) { + this.sslcontext = createEasySSLContext(); + } + return this.sslcontext; + } + + /** + * @see org.apache.http.conn.scheme.SocketFactory#connectSocket(java.net.Socket, + * java.lang.String, int, java.net.InetAddress, int, + * org.apache.http.params.HttpParams) + */ + public Socket connectSocket(Socket sock, String host, int port, + InetAddress localAddress, int localPort, HttpParams params) + throws IOException, UnknownHostException, ConnectTimeoutException { + int connTimeout = HttpConnectionParams.getConnectionTimeout(params); + int soTimeout = HttpConnectionParams.getSoTimeout(params); + + InetSocketAddress remoteAddress = new InetSocketAddress(host, port); + SSLSocket sslsock = (SSLSocket) ((sock != null) ? sock : createSocket()); + + if ((localAddress != null) || (localPort > 0)) { + // we need to bind explicitly + if (localPort < 0) { + localPort = 0; // indicates "any" + } + InetSocketAddress isa = new InetSocketAddress(localAddress, + localPort); + sslsock.bind(isa); + } + + sslsock.connect(remoteAddress, connTimeout); + sslsock.setSoTimeout(soTimeout); + return sslsock; + + } + + /** + * @see org.apache.http.conn.scheme.SocketFactory#createSocket() + */ + public Socket createSocket() throws IOException { + return getSSLContext().getSocketFactory().createSocket(); + } + + /** + * @see org.apache.http.conn.scheme.SocketFactory#isSecure(java.net.Socket) + */ + public boolean isSecure(Socket socket) throws IllegalArgumentException { + return true; + } + + /** + * @see org.apache.http.conn.scheme.LayeredSocketFactory#createSocket(java.net.Socket, + * java.lang.String, int, boolean) + */ + public Socket createSocket(Socket socket, String host, int port, + boolean autoClose) throws IOException, UnknownHostException { + return getSSLContext().getSocketFactory().createSocket(socket, host, port, autoClose); + } + + // ------------------------------------------------------------------- + // javadoc in org.apache.http.conn.scheme.SocketFactory says : + // Both Object.equals() and Object.hashCode() must be overridden + // for the correct operation of some connection managers + // ------------------------------------------------------------------- + + public boolean equals(Object obj) { + return ((obj != null) && obj.getClass().equals( + EasySSLSocketFactory.class)); + } + + public int hashCode() { + return EasySSLSocketFactory.class.hashCode(); + } + +} diff --git a/src/com/etime/EasyX509TrustManager.java b/src/com/etime/EasyX509TrustManager.java new file mode 100644 index 0000000..140fbc8 --- /dev/null +++ b/src/com/etime/EasyX509TrustManager.java @@ -0,0 +1,93 @@ +package com.etime; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.net.ssl.X509TrustManager; + +/** + * @author olamy + * @version $Id: EasyX509TrustManager.java 765355 2009-04-15 20:59:07Z evenisse $ + * @since 1.2.3 + */ +public class EasyX509TrustManager + implements X509TrustManager +{ + + private X509TrustManager standardTrustManager = null; + + /** + * Constructor for EasyX509TrustManager. + */ + public EasyX509TrustManager( KeyStore keystore ) + throws NoSuchAlgorithmException, KeyStoreException + { + super(); + TrustManagerFactory factory = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm() ); + factory.init( keystore ); + TrustManager[] trustmanagers = factory.getTrustManagers(); + if ( trustmanagers.length == 0 ) + { + throw new NoSuchAlgorithmException( "no trust manager found" ); + } + this.standardTrustManager = (X509TrustManager) trustmanagers[0]; + } + + /** + * @see javax.net.ssl.X509TrustManager#checkClientTrusted(X509Certificate[],String authType) + */ + public void checkClientTrusted( X509Certificate[] certificates, String authType ) + throws CertificateException + { + standardTrustManager.checkClientTrusted( certificates, authType ); + } + + /** + * @see javax.net.ssl.X509TrustManager#checkServerTrusted(X509Certificate[],String authType) + */ + public void checkServerTrusted( X509Certificate[] certificates, String authType ) + throws CertificateException + { + if ( ( certificates != null ) && ( certificates.length == 1 ) ) + { + certificates[0].checkValidity(); + } + else + { + standardTrustManager.checkServerTrusted( certificates, authType ); + } + } + + /** + * @see javax.net.ssl.X509TrustManager#getAcceptedIssuers() + */ + public X509Certificate[] getAcceptedIssuers() + { + return this.standardTrustManager.getAcceptedIssuers(); + } + +} diff --git a/src/com/etime/LoginAsyncTask.java b/src/com/etime/LoginAsyncTask.java index 0e4ca32..0f95bb6 100644 --- a/src/com/etime/LoginAsyncTask.java +++ b/src/com/etime/LoginAsyncTask.java @@ -44,15 +44,16 @@ public class LoginAsyncTask extends AsyncTask implemen int myProgress; private int LOGIN_URL_PAGE_SIZE; private int LOGIN_URL2_PAGE_SIZE; + private int step = 0; @Override protected void onPostExecute(Boolean result) { if (result) { activity.onPostLogin(); } else { - Toast.makeText(context, "Bad Username/Password", Toast.LENGTH_LONG).show(); - activity.startPreferencesPage(); + Toast.makeText(context, "Bad Username/Password " + step, Toast.LENGTH_LONG).show(); activity.setLoginTime(0); + activity.startPreferencesPage(); } } @@ -93,26 +94,35 @@ public boolean signon() { myProgress = 0; publishProgress(10); + step = 0; page = ETimeUtils.getHtmlPageWithProgress(httpClient, LOGIN_URL, this, 10, 30, LOGIN_URL_PAGE_SIZE); if (page == null || page.contains(LOGIN_FAILED)) { return false; } + step++; page = ETimeUtils.getHtmlPageWithProgress(httpClient, LOGIN_URL_STEP2, this, 30, 50, LOGIN_URL2_PAGE_SIZE); if (page == null || page.contains(LOGIN_FAILED)) { return false; } + step++; + if (page.equals("/wfc/applications/suitenav/navigation.do?ESS=true")) { + return true; //already logged in + } + + step++; page = ETimeUtils.getHtmlPageWithProgress(httpClient, page, this, 50, 80, LOGIN_URL_PAGE_SIZE); if (page == null || page.contains(LOGIN_FAILED)) { return false; } + step++; page = ETimeUtils.getHtmlPageWithProgress(httpClient, page, this, 80, 100, LOGIN_URL_PAGE_SIZE); if (page == null || page.contains(LOGIN_FAILED)) { return false; } - + step++; return true; }