/*
* © Copyright IBM Corp. 2013
*
* 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 grantaccess.webapp;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import com.ibm.commons.runtime.Application;
import com.ibm.commons.util.StringUtil;
import com.ibm.sbt.jslibrary.SBTEnvironment;
import com.ibm.sbt.security.credential.store.CredentialStoreException;
import com.ibm.sbt.security.credential.store.CredentialStoreFactory;
import com.ibm.sbt.security.credential.store.DBCredentialStore;
import com.ibm.sbt.services.client.ClientServicesException;
import com.ibm.sbt.services.client.base.datahandlers.EntityList;
import com.ibm.sbt.services.client.connections.communities.Community;
import com.ibm.sbt.services.client.connections.communities.CommunityService;
import com.ibm.sbt.services.endpoints.ConnectionsOAuth2Endpoint;
import com.ibm.sbt.services.endpoints.Endpoint;
import com.ibm.sbt.services.endpoints.EndpointFactory;
import com.ibm.sbt.services.endpoints.OAuth2Endpoint;
import com.ibm.sbt.services.endpoints.OAuthEndpoint;
import com.ibm.sbt.services.endpoints.SmartCloudOAuthEndpoint;
/**
* @author mwallace
*
*/
public class Users {
private final static String DEFAULT_JNDINAME = "jdbc/ibmsbt-dbtokenstore";
private static boolean driverLoaded;
private static DBCredentialStore store;
static public List<String> getUsers() {
List<String> users = new ArrayList<String>();
try {
if (store == null) {
store = (DBCredentialStore)CredentialStoreFactory.getCredentialStore("CredStoreDB");
}
Connection connection = getConnection();
try {
PreparedStatement stmt = connection.prepareStatement("SELECT USERID FROM "+store.getTableName()+" WHERE APPID = ? AND SERVICENAME = ?");
try {
stmt.setString(1, store.findApplicationName());
stmt.setString(2, getServiceName());
ResultSet rs = stmt.executeQuery();
try {
while(rs.next()) {
users.add(rs.getString(1));
}
} finally {
rs.close();
}
} finally {
stmt.close();
}
} finally {
connection.close();
}
} catch (Exception e) {
e.printStackTrace();
}
return users;
}
static public int getCommunityMembershipCount(String user) {
int ret = -1;
try {
Endpoint endpoint = createEndpoint(user);
if (endpoint != null) {
CommunityService service = new CommunityService(endpoint);
EntityList<Community> list = service.getMyCommunities();
return list.getTotalResults();
}
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
static private Endpoint createEndpoint(String user) throws ClientServicesException {
Endpoint endpoint = getEndpoint("connections");
if (endpoint instanceof SmartCloudOAuthEndpoint) {
SmartCloudOAuthEndpoint smartcloud = (SmartCloudOAuthEndpoint)endpoint;
SmartCloudOAuthEndpoint cloned = new SmartCloudOAuthEndpoint();
cloned.setApiVersion(smartcloud.getApiVersion());
cloned.setUrl(smartcloud.getUrl());
cloned.setForceTrustSSLCertificate(smartcloud.isForceTrustSSLCertificate());
cloned.setConsumerKey(smartcloud.getConsumerKey());
cloned.setConsumerSecret(smartcloud.getConsumerSecret());
cloned.setRequestTokenURL(smartcloud.getRequestTokenURL());
cloned.setAuthorizationURL(smartcloud.getAuthorizationURL());
cloned.setAccessTokenURL(smartcloud.getAccessTokenURL());
cloned.setSignatureMethod(smartcloud.getSignatureMethod());
cloned.setCredentialStore(smartcloud.getCredentialStore());
cloned.setServiceName(smartcloud.getServiceName());
cloned.setAppId(smartcloud.getAppId());
cloned.setAuthenticationService(smartcloud.getAuthenticationService());
if (cloned.login(user)) {
return cloned;
}
}
if (endpoint instanceof ConnectionsOAuth2Endpoint) {
ConnectionsOAuth2Endpoint connections = (ConnectionsOAuth2Endpoint)endpoint;
ConnectionsOAuth2Endpoint cloned = new ConnectionsOAuth2Endpoint();
cloned.setApiVersion(connections.getApiVersion());
cloned.setUrl(connections.getUrl());
cloned.setForceTrustSSLCertificate(connections.isForceTrustSSLCertificate());
cloned.setConsumerKey(connections.getConsumerKey());
cloned.setConsumerSecret(connections.getConsumerSecret());
cloned.setAuthorizationURL(connections.getAuthorizationURL());
cloned.setAccessTokenURL(connections.getAccessTokenURL());
cloned.setCredentialStore(connections.getCredentialStore());
cloned.setServiceName(connections.getServiceName());
cloned.setAppId(connections.getAppId());
cloned.setAuthenticationService(connections.getAuthenticationService());
if (cloned.login(user)) {
return cloned;
}
}
return null;
}
/*
* Return the service name to use.
*/
static private String getServiceName() {
Endpoint endpoint = getEndpoint("connecitons");
if (endpoint instanceof OAuth2Endpoint) {
return ((OAuth2Endpoint)endpoint).getServiceName();
}
if (endpoint instanceof OAuthEndpoint) {
return ((OAuthEndpoint)endpoint).getServiceName();
}
throw new IllegalStateException("This sample only works with an OAuth endpoint");
}
/*
* Return the endpoint with the specified alias
*/
static private Endpoint getEndpoint(String endpointName){
com.ibm.commons.runtime.Context context = com.ibm.commons.runtime.Context.getUnchecked();
if (context == null) {
return null;
}
String environment = context.getProperty("environment");
environment = (environment == null) ? "defaultEnvironment" : environment;
if(environment != null) {
SBTEnvironment env = (SBTEnvironment) context.getBean(environment);
SBTEnvironment.Endpoint[] endpointsArray = env.getEndpointsArray();
for(SBTEnvironment.Endpoint endpoint : endpointsArray){
if(StringUtil.equals(endpointName, endpoint.getAlias())){
endpointName = endpoint.getName();
break;
} else if (StringUtil.equals(endpointName, endpoint.getName())){
break;
}
}
}
return EndpointFactory.getEndpoint(endpointName);
}
/*
* Load the DB Drivers
*/
static private synchronized void loadDBDriver() throws ClassNotFoundException, IllegalAccessException, InstantiationException {
if (driverLoaded) {
return;
}
String driver = store.getJdbcDriverClass();
if(StringUtil.isNotEmpty(driver)){
if(Application.getUnchecked()!=null){
Application.getUnchecked().getClassLoader().loadClass(driver); //Class.forname does not work on OSGI
}else{
Class.forName(driver).newInstance(); // Load driver
}
driverLoaded = true;
}
}
/*
* Method decides if Connection should be fetched through URL or JNDI
*/
static private Connection getConnection() throws CredentialStoreException, ClassNotFoundException, IllegalAccessException, InstantiationException, SQLException, NamingException{
if(StringUtil.isNotEmpty(store.getJdbcUrl())){
loadDBDriver();
return DriverManager.getConnection(store.getJdbcUrl());
}else {
return getConnectionUsingJNDI();
}
}
/*
* Read the database settings from JNDI
*/
static private Connection getConnectionUsingJNDI() throws CredentialStoreException, NamingException, SQLException {
String jndikey = store.getJndiName();
InitialContext initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
if(StringUtil.isEmpty(jndikey)){
jndikey = DEFAULT_JNDINAME;
}
DataSource ds = (DataSource) envCtx.lookup(jndikey);
return ds.getConnection();
}
}