/**
* Copyright (c) 2011-2014, OpenIoT
*
* This library is free software; you can redistribute it and/or
* modify it either under the terms of the GNU Lesser General Public
* License version 2.1 as published by the Free Software Foundation
* (the "LGPL"). If you do not alter this
* notice, a recipient may use your version of this file under the LGPL.
*
* You should have received a copy of the LGPL along with this library
* in the file COPYING-LGPL-2.1; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
* OF ANY KIND, either express or implied. See the LGPL for
* the specific language governing rights and limitations.
*
* Contact: OpenIoT mailto: info@openiot.eu
*/
package org.openiot.security.oauth.lsm;
import java.util.ArrayList;
import java.util.List;
import org.jasig.cas.services.RegisteredService;
import org.openiot.commons.util.PropertyManagement;
import org.openiot.lsm.security.oauth.LSMOAuthHttpManager;
import org.openiot.lsm.security.oauth.LSMRegisteredServiceImpl;
import org.openiot.lsm.security.oauth.LSMServiceTicketImpl;
import org.openiot.lsm.security.oauth.LSMTicketGrantingTicketImpl;
import org.openiot.lsm.security.oauth.mgmt.Permission;
import org.openiot.lsm.security.oauth.mgmt.Role;
import org.openiot.lsm.security.oauth.mgmt.User;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.sparql.engine.http.QueryEngineHTTP;
public class LSMOAuthManager {
private static LSMOAuthManager instance;
private String lSMOauthGraphURL;
private String sparqlEndPoint;
private String instancePrefix;
private LSMOAuthHttpManager lsmOAuthHttpManager;
public static LSMOAuthManager getInstance() {
if (instance == null)
instance = new LSMOAuthManager();
return instance;
}
private LSMOAuthManager() {
PropertyManagement propertyManagement = new PropertyManagement();
sparqlEndPoint = propertyManagement.getSecurityLsmSparqlEndPoint();
lSMOauthGraphURL = propertyManagement.getSecurityLsmGraphURL();
instancePrefix = propertyManagement.getOpeniotResourceNamespace();
lsmOAuthHttpManager = new LSMOAuthHttpManager(lSMOauthGraphURL);
}
public String getLSMOauthGraphURL() {
return lSMOauthGraphURL;
}
public void setLSMOauthGraphURL(String lSMOauthGraphURL) {
this.lSMOauthGraphURL = lSMOauthGraphURL;
lsmOAuthHttpManager.setLSMOauthGraphURL(lSMOauthGraphURL);
}
public Permission getPermission(String perId) {
return lsmOAuthHttpManager.getPermission(perId);
}
public void deletePermission(String perId) {
lsmOAuthHttpManager.deletePermission(perId);
}
public void addPermission(Permission permission) {
lsmOAuthHttpManager.addPermission(permission);
}
public Role getRole(String roleId) {
return lsmOAuthHttpManager.getRole(roleId);
}
public void deleteRole(String roleId) {
lsmOAuthHttpManager.deleteRole(roleId);
}
public void addRole(Role role) {
lsmOAuthHttpManager.addRole(role);
}
public User getUser(String userId) {
return lsmOAuthHttpManager.getUser(userId);
}
public void deleteUser(String userId) {
lsmOAuthHttpManager.deleteUser(userId);
}
public void addUser(User user) {
lsmOAuthHttpManager.addUser(user);
}
public LSMServiceTicketImpl getServiceTicketImpl(String ticketId) {
return lsmOAuthHttpManager.getServiceTicketImpl(ticketId);
}
public void deleteServiceTicketImpl(String ticketId) {
lsmOAuthHttpManager.deleteServiceTicketImpl(ticketId);
}
public void addServiceTicketImpl(LSMServiceTicketImpl serviceTicketImpl) {
lsmOAuthHttpManager.addServiceTicketImpl(serviceTicketImpl);
}
public LSMTicketGrantingTicketImpl getTicketGranting(String grantId) {
return lsmOAuthHttpManager.getTicketGranting(grantId);
}
public void deleteTicketGranting(String grantId) {
lsmOAuthHttpManager.deleteTicketGranting(grantId);
}
public void addTicketGrangtingTicket(LSMTicketGrantingTicketImpl ticketGranting) {
lsmOAuthHttpManager.addTicketGrangtingTicket(ticketGranting);
}
public LSMRegisteredServiceImpl getRegisteredService(long serviceId) {
final LSMRegisteredServiceImpl registeredService = lsmOAuthHttpManager.getRegisteredService(serviceId);
return registeredService;
}
public void deleteRegisteredService(long serviceId) {
lsmOAuthHttpManager.deleteRegisteredService(serviceId);
}
public void addRegisteredService(LSMRegisteredServiceImpl reg_service) {
lsmOAuthHttpManager.addRegisteredService(reg_service);
}
/**
* Returns the list of all LSMTicketGrantingTicketImpl having grantId as ticketGrantingTicket
*
* @param grantId
* @return
*/
public List<LSMTicketGrantingTicketImpl> getAllTicketsOfTicketGrantingTicket(String grantId) {
String prefix = instancePrefix;
String grantURL = prefix + grantId;
if (grantId.contains(prefix)) {
grantURL = grantId;
grantId = grantId.substring(grantId.lastIndexOf("/") + 1);
}
List<LSMTicketGrantingTicketImpl> ticketList = null;
String sparql = "select ?tic_grant" + " from <" + lSMOauthGraphURL + "> \n" + "where{ "
+ "?tic_grant <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://openiot.eu/ontology/ns/TicketScheduler>."
+ "?tic_grant <http://openiot.eu/ontology/ns/grants> " + "<" + grantURL + ">. \n" + "}";
try {
String service = sparqlEndPoint;
QueryExecution vqe = new QueryEngineHTTP(service, sparql);
ResultSet results = vqe.execSelect();
ticketList = new ArrayList<LSMTicketGrantingTicketImpl>();
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
LSMTicketGrantingTicketImpl t = getTicketGranting(soln.get("?tic_grant").toString());
ticketList.add(t);
}
vqe.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return ticketList;
}
/**
* Returns the list of all LSMServiceTicketImpl having grantId as ticketGrantingTicket
*
* @param grantId
* @return
*/
public List<LSMServiceTicketImpl> getAllServiceTicketsOfTicketGrantingTicket(String grantId) {
String prefix = instancePrefix;
String grantURL = prefix + grantId;
if (grantId.contains(prefix)) {
grantURL = grantId;
grantId = grantId.substring(grantId.lastIndexOf("/") + 1);
}
List<LSMServiceTicketImpl> ticketList = null;
String sparql = "select ?ticket" + " from <" + lSMOauthGraphURL + "> \n" + "where{ "
+ "?ticket <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://openiot.eu/ontology/ns/Ticket>."
+ "?ticket <http://openiot.eu/ontology/ns/grantedBy> " + "<" + grantURL + ">. \n" + "}";
try {
String service = sparqlEndPoint;
QueryExecution vqe = new QueryEngineHTTP(service, sparql);
ResultSet results = vqe.execSelect();
ticketList = new ArrayList<LSMServiceTicketImpl>();
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
LSMServiceTicketImpl t = getServiceTicketImpl(soln.get("?ticket").toString());
ticketList.add(t);
}
vqe.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return ticketList;
}
/**
* Returns the list of all LSMTicketGrantingTicketImpls
*
* @return
*/
public List<LSMTicketGrantingTicketImpl> getAllTicketGrantingTickets() {
List<LSMTicketGrantingTicketImpl> grantList = null;
String sparql = " select ?tic_grant" + " from <" + lSMOauthGraphURL + "> \n" + "where{ "
+ "?tic_grant <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://openiot.eu/ontology/ns/TicketScheduler>." + "}";
try {
String service = sparqlEndPoint;
QueryExecution vqe = new QueryEngineHTTP(service, sparql);
ResultSet results = vqe.execSelect();
grantList = new ArrayList<LSMTicketGrantingTicketImpl>();
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
LSMTicketGrantingTicketImpl t = getTicketGranting(soln.get("?tic_grant").toString());
grantList.add(t);
}
vqe.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return grantList;
}
/**
* Returns the list of all LSMServiceTicketImpls
*
* @return
*/
public List<LSMServiceTicketImpl> getAllServiceTickets() {
List<LSMServiceTicketImpl> ticketList = null;
String sparql = " select ?ticket" + " from <" + lSMOauthGraphURL + "> \n" + "where{ "
+ "?ticket <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://openiot.eu/ontology/ns/Ticket>." + "}";
try {
String service = sparqlEndPoint;
QueryExecution vqe = new QueryEngineHTTP(service, sparql);
ResultSet results = vqe.execSelect();
ticketList = new ArrayList<LSMServiceTicketImpl>();
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
LSMServiceTicketImpl t = getServiceTicketImpl(soln.get("?ticket").toString());
ticketList.add(t);
}
vqe.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return ticketList;
}
/**
* Returns the the number of available LSMTicketGrantingTicketImpls
*
* @return
*/
public int getTicketGrantingTicketsCount() {
int count = -1;
String sparql = " select (count(?tic_grant) as ?count)" + " from <" + lSMOauthGraphURL + "> \n" + "where{ "
+ "?tic_grant <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://openiot.eu/ontology/ns/TicketScheduler>." + "}";
try {
String service = sparqlEndPoint;
QueryExecution vqe = new QueryEngineHTTP(service, sparql);
ResultSet results = vqe.execSelect();
if (results.hasNext()) {
QuerySolution soln = results.nextSolution();
count = soln.get("?count").asLiteral().getInt();
}
vqe.close();
} catch (Exception e) {
e.printStackTrace();
}
return count;
}
/**
* Returns the the number of available LSMServiceTicketImpls
*
* @return
*/
public int getServiceTicketsCount() {
int count = -1;
String sparql = " select (count(?ticket) as ?count)" + " from <" + lSMOauthGraphURL + "> \n" + "where{ "
+ "?ticket <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://openiot.eu/ontology/ns/Ticket>." + "}";
try {
String service = sparqlEndPoint;
QueryExecution vqe = new QueryEngineHTTP(service, sparql);
ResultSet results = vqe.execSelect();
if (results.hasNext()) {
QuerySolution soln = results.nextSolution();
count = soln.get("?count").asLiteral().getInt();
}
vqe.close();
} catch (Exception e) {
e.printStackTrace();
}
return count;
}
/**
* Retrievs a user by the username
*
* @param username
* @return
*/
public User getUserByUsername(String username) {
org.openiot.lsm.security.oauth.mgmt.User user = null;
String userURL = instancePrefix + "user/" + username;
if (username.contains(instancePrefix + "user/")) {
userURL = username;
username = username.substring(username.lastIndexOf("/") + 1);
}
String sparql = " select ?nick ?mbox ?pass ?role" + " from <" + lSMOauthGraphURL + "> \n" + "where{ " + "<" + userURL
+ "> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://openiot.eu/ontology/ns/User>." + "OPTIONAL{<" + userURL
+ "> <http://xmlns.com/foaf/0.1/nick> ?nick.}" + "OPTIONAL{<" + userURL + "> <http://xmlns.com/foaf/0.1/mbox> ?mbox.}" + "<" + userURL
+ "> <http://openiot.eu/ontology/ns/password> ?pass.}";
try {
String service = sparqlEndPoint;
QueryExecution vqe = new QueryEngineHTTP(service, sparql);
ResultSet results = vqe.execSelect();
if (results.hasNext()) {
user = new org.openiot.lsm.security.oauth.mgmt.User();
user.setUsername(username);
QuerySolution soln = results.nextSolution();
user.setEmail(soln.get("?mbox").toString());
user.setPassword(soln.get("?pass").toString());
user.setName(soln.get("?nick").toString());
List<Role> roles = getUserRoles(username);
if (roles != null)
user.setRoles(roles);
}
vqe.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return user;
}
/**
* Retrievs roles of a user
*
* @param username
* @return
*/
public List<Role> getUserRoles(String username) {
List<Role> roles = new ArrayList<Role>();
String userURL = instancePrefix + "user/" + username;
if (username.contains(instancePrefix + "user/")) {
userURL = username;
username = username.substring(username.lastIndexOf("/") + 1);
}
String sparql = " select ?roleId " + " from <" + lSMOauthGraphURL + "> \n" + "where{ "
+ "?roleId <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://openiot.eu/ontology/ns/ClientRole>." + "<" + userURL
+ "> <http://openiot.eu/ontology/ns/role> ?roleId." + "}";
try {
String service = sparqlEndPoint;
QueryExecution vqe = new QueryEngineHTTP(service, sparql);
ResultSet results = vqe.execSelect();
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
Role role = getRole(soln.get("?roleId").toString());
roles.add(role);
}
vqe.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return roles;
}
/**
* Retrieves all LSMRegisteredServiceImpls
*
* @return
*/
public List<RegisteredService> getAllRegisteredServices() {
List<RegisteredService> serviceList = new ArrayList<RegisteredService>();
String sparql = " select ?service" + " from <" + lSMOauthGraphURL + "> \n" + "where{ "
+ "?service <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://openiot.eu/ontology/ns/CloudService>." + "}";
try {
String service = sparqlEndPoint;
QueryExecution vqe = new QueryEngineHTTP(service, sparql);
ResultSet results = vqe.execSelect();
while (results.hasNext()) {
QuerySolution soln = results.nextSolution();
String serviceURL = soln.get("?service").toString();
String serviceId = serviceURL.substring(serviceURL.lastIndexOf("/") + 1);
LSMRegisteredServiceImpl t = getRegisteredService(Long.parseLong(serviceId));
if(t != null)
serviceList.add(t);
}
vqe.close();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return serviceList;
}
}