/** * Copyright (c) Istituto Nazionale di Fisica Nucleare (INFN). 2006-2016 * * 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.glite.security.voms.admin.persistence.dao; import java.util.Iterator; import java.util.List; import org.glite.security.voms.admin.error.NullArgumentException; import org.glite.security.voms.admin.persistence.HibernateFactory; import org.glite.security.voms.admin.persistence.error.AlreadyExistsException; import org.glite.security.voms.admin.persistence.error.NoSuchAttributeException; import org.glite.security.voms.admin.persistence.error.NoSuchRoleException; import org.glite.security.voms.admin.persistence.model.ACL; import org.glite.security.voms.admin.persistence.model.VOMSGroup; import org.glite.security.voms.admin.persistence.model.VOMSRole; import org.glite.security.voms.admin.persistence.model.attribute.VOMSAttributeDescription; import org.glite.security.voms.admin.persistence.model.attribute.VOMSRoleAttribute; import org.hibernate.Query; public class VOMSRoleDAO { protected VOMSRoleDAO() { HibernateFactory.beginTransaction(); } public List<VOMSRole> findAll() { return getAll(); } @SuppressWarnings("unchecked") public List<VOMSRole> getAll() { String query = "from org.glite.security.voms.admin.persistence.model.VOMSRole"; return HibernateFactory.getSession().createQuery(query).list(); } public int countRoles() { String query = "select count(*) from org.glite.security.voms.admin.persistence.model.VOMSRole"; Long count = (Long) HibernateFactory.getSession().createQuery(query) .uniqueResult(); return count.intValue(); } public int countMatches(String searchString) { String sString = "%" + searchString + "%"; String query = "select count(*) from org.glite.security.voms.admin.persistence.model.VOMSRole where name like :searchString"; Long count = (Long) HibernateFactory.getSession().createQuery(query) .setString("searchString", sString).uniqueResult(); return count.intValue(); } public SearchResults getAll(int firstResult, int maxResults) { SearchResults results = SearchResults.instance(); String query = "from org.glite.security.voms.admin.persistence.model.VOMSRole"; Query q = HibernateFactory.getSession().createQuery(query); q.setFirstResult(firstResult); q.setMaxResults(maxResults); List res = q.list(); results.setCount(countRoles()); results.setFirstResult(firstResult); results.setResultsPerPage(maxResults); results.setResults(res); return results; } public SearchResults search(String searchString, int firstResult, int maxResults) { if (searchString == null || searchString.equals("") || searchString.length() == 0) return getAll(firstResult, maxResults); SearchResults results = SearchResults.instance(); String sString = "%" + searchString + "%"; String query = "from org.glite.security.voms.admin.persistence.model.VOMSRole where name like :searchString"; Query q = HibernateFactory.getSession().createQuery(query) .setString("searchString", sString); q.setFirstResult(firstResult); q.setMaxResults(maxResults); List res = q.list(); results.setCount(countMatches(searchString)); results.setFirstResult(firstResult); results.setResultsPerPage(maxResults); results.setSearchString(searchString); results.setResults(res); return results; } public SearchResults searchMembers(VOMSGroup g, VOMSRole r, String searchString, int firstResult, int maxResults) { if (g == null) throw new NullArgumentException("Cannot search members in a null group!"); if (r == null) throw new NullArgumentException("Cannot search members in a null role!"); if (searchString == null || searchString.equals("") || searchString.length() == 0) return getMembers(g, r, firstResult, maxResults); SearchResults results = SearchResults.instance(); String sString = "%" + searchString + "%"; String queryString = "select m.user as user from org.glite.security.voms.admin.persistence.model.VOMSMapping m where m.group = :group and m.role is :role " + "and m.user.dn like :searchString order by m.user.dn asc"; Query q = HibernateFactory.getSession().createQuery(queryString) .setString("searchString", sString); q.setEntity("group", g); q.setEntity("role", r); q.setFirstResult(firstResult); q.setMaxResults(maxResults); List res = q.list(); results.setSearchString(searchString); results.setResults(res); results.setCount(countMatchingMembers(g, r, searchString)); results.setFirstResult(firstResult); results.setResultsPerPage(maxResults); return results; } private int countMatchingMembers(VOMSGroup g, VOMSRole r, String searchString) { if (g == null) throw new NullArgumentException("Cannot search members in a null group!"); if (r == null) throw new NullArgumentException("Cannot search members in a null role!"); String sString; if (searchString == null) sString = "%"; else sString = "%" + searchString + "%"; String queryString = "select count(m.user) from org.glite.security.voms.admin.persistence.model.VOMSMapping m where m.group = :group and m.role is :role " + "and m.user.dn like :searchString order by m.user.dn asc"; Query q = HibernateFactory.getSession().createQuery(queryString); q.setString("searchString", sString); q.setEntity("group", g); q.setEntity("role", r); return ((Long) q.uniqueResult()).intValue(); } private SearchResults getMembers(VOMSGroup g, VOMSRole r, int firstResult, int maxResults) { if (g == null) throw new NullArgumentException("Cannot search members in a null group!"); if (r == null) throw new NullArgumentException("Cannot search members in a null role!"); int membersCount = r.getUsers(g).size(); SearchResults results = SearchResults.instance(); String queryString = "select m.user as user from org.glite.security.voms.admin.persistence.model.VOMSMapping m where m.group = :group and m.role is :role " + "order by m.user.dn asc"; Query q = HibernateFactory.getSession().createQuery(queryString); q.setEntity("group", g); q.setEntity("role", r); q.setFirstResult(firstResult); q.setMaxResults(maxResults); List res = q.list(); results.setSearchString(null); results.setResults(res); results.setCount(membersCount); results.setFirstResult(firstResult); results.setResultsPerPage(maxResults); return results; } public List getAllNames() { String query = "select name from org.glite.security.voms.admin.persistence.model.VOMSRole"; return HibernateFactory.getSession().createQuery(query).list(); } public VOMSRole findByName(String roleName) { String query = "from org.glite.security.voms.admin.persistence.model.VOMSRole where name = :name"; return (VOMSRole) HibernateFactory.getSession().createQuery(query) .setString("name", roleName).uniqueResult(); } public VOMSRole findById(Long id) { return (VOMSRole) HibernateFactory.getSession().load(VOMSRole.class, id); } public VOMSRole create(String roleName) { if (findByName(roleName) != null) throw new AlreadyExistsException("Role \"" + roleName + "\" already defined in database!"); VOMSRole r = new VOMSRole(roleName); HibernateFactory.getSession().save(r); return r; } public void deleteAll() { HibernateFactory .getSession() .createQuery( "delete from org.glite.security.voms.admin.persistence.model.VOMSRole") .executeUpdate(); } public VOMSRole delete(Long id) { VOMSRole r = findById(id); if (r == null) throw new NoSuchRoleException("Role with id \"" + id + "\" is not defined in database!"); delete(r); return r; } public VOMSRole delete(String roleName) { VOMSRole r = findByName(roleName); if (r == null) throw new NoSuchRoleException("Role '" + roleName + "' is not defined in database!"); delete(r); return r; } public VOMSRole delete(VOMSRole r) { if (findByName(r.getName()) == null) throw new NoSuchRoleException("Role \"" + r + "\" is not defined in database!"); r.getMappings().clear(); Iterator aclIter = r.getAcls().iterator(); while (aclIter.hasNext()) { ACL acl = (ACL) aclIter.next(); VOMSGroup g = acl.getGroup(); g.getAcls().remove(acl); aclIter.remove(); } // Delete permissions from ACLs that may be related with this role ACLDAO.instance().deletePermissionsForRole(r); // Delete role admins VOMSAdminDAO.instance().deleteRoleAdmins(r); HibernateFactory.getSession().delete(r); return r; } public void removeRoleAttributesForGroup(VOMSGroup g) { String deleteString = "delete from VOMSRoleAttribute where group = :group"; HibernateFactory.getSession().createQuery(deleteString) .setEntity("group", g).executeUpdate(); } public VOMSRoleAttribute setAttribute(VOMSRole r, VOMSGroup g, String attrName, String attrValue) { VOMSAttributeDescription desc = VOMSAttributeDAO.instance() .getAttributeDescriptionByName(attrName); if (desc == null) throw new NoSuchAttributeException("Attribute '" + attrName + "' is not defined in this vo."); VOMSRoleAttribute val = r.getAttributeByName(g, attrName); if (val != null) val.setValue(attrValue); else { val = VOMSRoleAttribute.instance(desc, attrValue, g, r); r.addAttribute(val); } HibernateFactory.getSession().update(r); return val; } public VOMSRoleAttribute createAttribute(VOMSRole r, VOMSGroup g, String attrName, String attrDesc, String attrValue) { if (r.getAttributeByName(g, attrName) != null) throw new AlreadyExistsException("Attribute \"" + attrName + "\" already defined for role \"" + r + "\" in group \"" + g + "\"."); VOMSAttributeDescription desc = VOMSAttributeDAO.instance() .getAttributeDescriptionByName(attrName); if (desc == null) desc = VOMSAttributeDAO.instance().createAttributeDescription(attrName, attrDesc); VOMSRoleAttribute val = VOMSRoleAttribute.instance(desc, attrValue, g, r); r.addAttribute(val); return val; } public VOMSRoleAttribute deleteAttributeByName(VOMSRole r, VOMSGroup g, String attrName) { VOMSRoleAttribute attr = r.getAttributeByName(g, attrName); if (attr == null) throw new NoSuchAttributeException("Attribute '" + attrName + "' not defined for role '" + r.getName() + "' in group '" + g + "'."); deleteAttribute(r, attr); return attr; } public void deleteAttribute(VOMSRole r, VOMSRoleAttribute val) { r.deleteAttribute(val); HibernateFactory.getSession().update(r); } public List getMembers(VOMSGroup g, VOMSRole r) { if (g == null) throw new IllegalArgumentException("group parameter must be non-null!"); if (r == null) throw new IllegalArgumentException("role parameter must be non-null!"); String query = "select m.user from org.glite.security.voms.admin.persistence.model.VOMSMapping m where m.group = :group and m.role = :role"; return HibernateFactory.getSession().createQuery(query) .setEntity("group", g).setEntity("role", r).list(); } public static VOMSRoleDAO instance() { return new VOMSRoleDAO(); } public Object getMemberSubjectStrings(VOMSGroup g, VOMSRole r) { if (g == null) throw new IllegalArgumentException("group parameter must be non-null!"); if (r == null) throw new IllegalArgumentException("role parameter must be non-null!"); String query = "select distinct c.subjectString from VOMSUser u join u.certificates c join u.mappings m where u.suspended is false and c.suspended is false and m.group = :group and m.role = :role"; return HibernateFactory.getSession().createQuery(query) .setEntity("group", g).setEntity("role", r).list(); } }