/* * Copyright (c) 2005-2010, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. * * WSO2 Inc. 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. * */ package org.wso2.mobile.idp.proxy.utils; import android.util.Log; import org.apache.commons.codec.binary.Base64; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ClientConnectionManager; 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.ByteArrayEntity; 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.protocol.HTTP; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import java.security.KeyStore; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; /** * Handle network communication between SDK and authorization server */ public class ServerUtilities { private final static String TAG = "ServerUtilities"; private static boolean isSSLEnable = false; private static InputStream inputStream; private static String trustStorePassword; /** * Enable SSL communication between client application and authorization server (if you have selfish sign certificate) * * @param in read self sign certificate from BKS as a InputStream * @param myTrustStorePassword key store password */ public static void enableSSL(InputStream in, String myTrustStorePassword) { inputStream = in; isSSLEnable = true; trustStorePassword = myTrustStorePassword; } /** * * @param context * @param url * @param params * @param clientID * @param clientSecret * @return */ public static Map<String, String> postData(String url, Map<String, String> params, String clientID, String clientSecret) { // Create a new HttpClient and Post Header Map<String, String> responseParams = new HashMap<String, String>(); HttpClient httpclient = getCertifiedHttpClient(); Log.d(TAG, "Posting '" + params.toString() + "' to " + url); StringBuilder bodyBuilder = new StringBuilder(); Iterator<Entry<String, String>> iterator = params.entrySet().iterator(); while (iterator.hasNext()) { Entry<String, String> param = iterator.next(); bodyBuilder.append(param.getKey()).append('=') .append(param.getValue()); if (iterator.hasNext()) { bodyBuilder.append('&'); } } String body = bodyBuilder.toString(); Log.d(TAG, "Posting '" + body + "' to " + url); byte[] postData = body.getBytes(); HttpPost httppost = new HttpPost(url); httppost.setHeader("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"); httppost.setHeader("Accept", "*/*"); httppost.setHeader("User-Agent", "Mozilla/5.0 ( compatible ), Android"); String authorizationString = "Basic " + new String(Base64.encodeBase64((clientID + ":" + clientSecret).getBytes())); //this line is diffe httppost.setHeader("Authorization", authorizationString); Log.e("AUTH : STRING : ", authorizationString); try { httppost.setEntity(new ByteArrayEntity(postData)); HttpResponse response = httpclient.execute(httppost); responseParams.put("response", getResponseBody(response)); responseParams.put("status", String.valueOf(response.getStatusLine().getStatusCode())); Log.d(TAG, responseParams.get("response")); return responseParams; } catch (ClientProtocolException e) { Log.d(TAG,e.toString()); return null; } catch (IOException e) { JSONObject obj = new JSONObject(); try { e.printStackTrace(); obj.put("error_description", "Internal Server Error"); obj.put("error", "Internal Server Error"); } catch (JSONException e1) { Log.d(TAG,e1.toString()); } responseParams.put("response", obj.toString()); responseParams.put("status", "500"); return responseParams; } } public static HttpClient getCertifiedHttpClient() { try { HttpClient client = null; if (isSSLEnable) { KeyStore localTrustStore = KeyStore.getInstance("BKS"); localTrustStore.load(inputStream, trustStorePassword.toCharArray()); SchemeRegistry schemeRegistry = new SchemeRegistry(); schemeRegistry.register(new Scheme("http", PlainSocketFactory .getSocketFactory(), 80)); SSLSocketFactory sslSocketFactory = new SSLSocketFactory(localTrustStore); sslSocketFactory.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); schemeRegistry.register(new Scheme("https", sslSocketFactory, 443)); HttpParams params = new BasicHttpParams(); ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry); client = new DefaultHttpClient(cm, params); } else { client = new DefaultHttpClient(); } return client; } catch (Exception e) { Log.d(TAG, e.toString()); return null; } } /** * * @param response * @return */ public static String getResponseBody(HttpResponse response) { String response_text = null; HttpEntity entity = null; try { entity = response.getEntity(); response_text = _getResponseBody(entity); } catch (ParseException e) { Log.d(TAG, e.toString()); } catch (IOException e) { if (entity != null) { try { entity.consumeContent(); } catch (IOException e1) { Log.d(TAG, e1.toString()); } } } return response_text; } /** * * @param entity * @return * @throws IOException * @throws ParseException */ public static String _getResponseBody(final HttpEntity entity) throws IOException, ParseException { if (entity == null) { throw new IllegalArgumentException("HTTP entity may not be null"); } InputStream instream = entity.getContent(); if (instream == null) { return ""; } if (entity.getContentLength() > Integer.MAX_VALUE) { throw new IllegalArgumentException( "HTTP entity too large to be buffered in memory"); } String charset = getContentCharSet(entity); if (charset == null) { charset = HTTP.DEFAULT_CONTENT_CHARSET; } Reader reader = new InputStreamReader(instream, charset); StringBuilder buffer = new StringBuilder(); try { char[] tmp = new char[1024]; int l; while ((l = reader.read(tmp)) != -1) { buffer.append(tmp, 0, l); } } finally { reader.close(); } return buffer.toString(); } /** * * @param entity * @return * @throws ParseException */ public static String getContentCharSet(final HttpEntity entity) throws ParseException { if (entity == null) { throw new IllegalArgumentException("HTTP entity may not be null"); } String charset = null; if (entity.getContentType() != null) { HeaderElement values[] = entity.getContentType().getElements(); if (values.length > 0) { NameValuePair param = values[0].getParameterByName("charset"); if (param != null) { charset = param.getValue(); } } } return charset; } }