/*
* Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* Licensed 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.iot.firealarm.access.api;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONException;
import org.json.JSONObject;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Properties;
public class AccessTokenClient {
//TODO read from configuration file
private static Log log = LogFactory.getLog(AccessTokenClient.class);
// private static AccessTokenClient accessTokenClient = new AccessTokenClient();
private static final String propertiesFileName = "firealarmApp.properties";
private static final String confDirPath = System.getProperty("carbon.config.dir.path");
private static final String propertiesFilePath = confDirPath + File.separator + "iot" + File.separator + propertiesFileName;
private static Properties properties = new Properties();;
private static InputStream propertiesInputStream = null;
// private String tokenURL ="https://192.168.57.128:9444/oauth2/token";
private static String tokenURL ="https://localhost:9443/oauth2/token";
private static String grantType ="password";
private static String scope ="PRODUCTION device_";
private static String appToken="NVp6UzIxM1RyWDhOUHY1QjN1Z0tXczJ1WW1nYTp3TG9iMkFldW1DZkNMVkpZVnROYjlDSFVYUXNh";
public AccessTokenClient() throws AccessTokenException {
try {
propertiesInputStream = new FileInputStream(propertiesFilePath);
} catch (FileNotFoundException e) {
log.error("API specific properties file could not be found at: " + propertiesFilePath);
}
//load a properties file from class path, inside static method
try {
properties.load(propertiesInputStream);
} catch (IOException e) {
String error = "Loading API specific properties from file at - " + propertiesFilePath + " failed...";
log.error(error);
throw new AccessTokenException(error, e);
}
tokenURL = properties.getProperty("tokenURL");
grantType = properties.getProperty("grantType");
scope = properties.getProperty("scope");
appToken = properties.getProperty("appToken");
try {
propertiesInputStream.close();
} catch (IOException e) {
String error = "Stream for reading Properties file could not be closed";
log.warn(error);
throw new AccessTokenException(error, e);
}
// return accessTokenClient;
}
// public static AccessTokenClient getInstance(){
// try {
// propertiesInputStream = new FileInputStream(propertiesFilePath);
// } catch (FileNotFoundException e) {
// log.error("API specific properties file could not be found at: " + propertiesFilePath);
// }
//
// //load a properties file from class path, inside static method
// try {
// properties.load(propertiesInputStream);
// } catch (IOException e) {
// log.error("Loading API specific properties from file at - " + propertiesFilePath + " failed...");
// }
//
// tokenURL = properties.getProperty("tokenURL");
// grantType = properties.getProperty("grantType");
// scope = properties.getProperty("scope");
// appToken = properties.getProperty("appToken");
//
// try {
// propertiesInputStream.close();
// } catch (IOException e) {
// log.warn("Stream for reading Properties file could not be closed");
// }
//
// return accessTokenClient;
// }
public AccessTokenInfo getAccessToken(String username,String password ,String appInstanceId) throws AccessTokenException {
SSLContext ctx;
String response = "";
try {
ctx = SSLContext.getInstance("TLS");
ctx.init(new KeyManager[0], new TrustManager[]{new DefaultTrustManager()},
new SecureRandom());
SSLContext.setDefault(ctx);
URL url = new URL(tokenURL);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setHostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
}
});
//System.out.println(conn.getResponseCode());
conn.disconnect();
HttpClient httpClient = new HttpClient();
PostMethod postMethod = new PostMethod(tokenURL);
postMethod.addParameter(new NameValuePair("grant_type", grantType));
postMethod.addParameter(new NameValuePair("username",username));
postMethod.addParameter(new NameValuePair("password", password));
postMethod.addParameter(new NameValuePair("scope", scope + appInstanceId));
postMethod.addRequestHeader("Authorization",
"Basic " + appToken);
postMethod.addRequestHeader("Content-Type", "application/x-www-form-urlencoded");
httpClient.executeMethod(postMethod);
response = postMethod.getResponseBodyAsString();
log.info(response);
JSONObject jsonObject=new JSONObject(response);
AccessTokenInfo accessTokenInfo=new AccessTokenInfo();
accessTokenInfo.setAccess_token(jsonObject.getString("access_token"));
accessTokenInfo.setRefresh_token(jsonObject.getString("refresh_token"));
accessTokenInfo.setExpires_in(jsonObject.getInt("expires_in"));
accessTokenInfo.setToken_type(jsonObject.getString("token_type"));
return accessTokenInfo;
} catch (NoSuchAlgorithmException | KeyManagementException| IOException |JSONException e) {
log.error(e.getMessage());
throw new AccessTokenException("Configuration Error for Access Token Generation");
}catch (NullPointerException e){
return null;
}
}
private static class DefaultTrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] arg0, String arg1)
throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
}