/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2002-2017 Pentaho Corporation.. All rights reserved. */ package org.pentaho.platform.web.http.api.resources; import static javax.ws.rs.core.MediaType.APPLICATION_JSON; import static javax.ws.rs.core.MediaType.APPLICATION_XML; import java.util.ArrayList; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; import org.pentaho.platform.engine.core.system.PentahoSessionHolder; import org.pentaho.platform.engine.core.system.PentahoSystem; import org.pentaho.platform.engine.security.DefaultRoleComparator; import org.pentaho.platform.engine.security.DefaultUsernameComparator; import org.pentaho.platform.web.http.api.resources.services.UserRoleListService; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; /** * The UserRoleListResource service lists roles, permissions, and users. Provides a list of users per role and roles per * user. */ @Path( "/userrolelist/" ) public class UserRoleListResource extends AbstractJaxRSResource { private ArrayList<String> systemRoles; protected String adminRole; private String anonymousRole; private ArrayList<String> extraRoles; protected static UserRoleListService userRoleListService; public UserRoleListResource() { this( PentahoSystem.get( ArrayList.class, "singleTenantSystemAuthorities", PentahoSessionHolder.getSession() ), PentahoSystem.get( String.class, "singleTenantAdminAuthorityName", PentahoSessionHolder.getSession() ), PentahoSystem.get( String.class, "singleTenantAnonymousAuthorityName", PentahoSessionHolder.getSession() ), PentahoSystem.get( ArrayList.class, "extraSystemAuthorities", PentahoSessionHolder.getSession() ) ); } public UserRoleListResource( final ArrayList<String> systemRoles, final String adminRole, final ArrayList<String> extraRoles ) { this( systemRoles, adminRole, PentahoSystem.get( String.class, "singleTenantAnonymousAuthorityName", PentahoSessionHolder.getSession() ), extraRoles ); } public UserRoleListResource( final ArrayList<String> systemRoles, final String adminRole, final String anonymousRole, final ArrayList<String> extraRoles ) { this.systemRoles = systemRoles; this.adminRole = adminRole; this.anonymousRole = anonymousRole; this.extraRoles = extraRoles; userRoleListService = new UserRoleListService(); userRoleListService.setExtraRoles( extraRoles ); userRoleListService.setSystemRoles( systemRoles ); userRoleListService.setRoleComparator( new DefaultRoleComparator() ); userRoleListService.setUserComparator( new DefaultUsernameComparator() ); } /** * Returns the list of permission users in the platform. * * <p> * <b>Example Request:</b><br /> * GET pentaho/api/userrolelist/permission-users * </p> * * @return A list of User objects for users with permissions in the platform. * * <p> * <b>Example Response:</b> * </p> * * <pre function="syntax.xml"> * <?xml version="1.0" encoding="UTF-8" standalone="yes"?><userList><users>pat</users><users>admin</users><users>suzy</users><users>tiffany</users><users>enco*de:te^s_t$</users></userList> * </pre> */ @GET @Path( "/permission-users" ) @Produces( { APPLICATION_XML, APPLICATION_JSON } ) @StatusCodes( { @ResponseCode( code = 200, condition = "Successfully retrieved the list of User objects." ), @ResponseCode( code = 500, condition = "Unable to retrieve User objects." ) } ) public UserListWrapper getPermissionUsers() throws Exception { return getUsers(); } /** * Return a list of the permission roles in the platform. * * <p> * <b>Example Request:</b><br /> * GET pentaho/api/userrolelist/permission-roles * </p> * * @return A list of permission roles in the platform. * * <p> * <b>Example Response:</b> * </p> * * <pre function="syntax.xml"> * <?xml version="1.0" encoding="UTF-8" standalone="yes"?><roleList><roles>Anonymous</roles><roles>Business Analyst</roles><roles>Authenticated</roles><roles>Report Author</roles><roles>Power User</roles></roleList> * </pre> */ @GET @Path( "/permission-roles" ) @Produces( { APPLICATION_XML, APPLICATION_JSON } ) @StatusCodes( { @ResponseCode( code = 200, condition = "Successfully retrieved the list of permission roles." ) } ) public RoleListWrapper getPermissionRoles() throws Exception { return userRoleListService.getPermissionRoles( adminRole ); } /** * Returns the list of users in the platform. * * <p> * <b>Example Request:</b><br /> * GET pentaho/api/userrolelist/users * </p> * * @return A list of User objects for users in the platform. * * <p> * <b>Example Response:</b> * </p> * * <pre function="syntax.xml"> * <?xml version="1.0" encoding="UTF-8" standalone="yes"?><userList><users>pat</users><users>admin</users><users>suzy</users><users>tiffany</users><users>enco*de:te^s_t$</users></userList> * </pre> */ @GET @Path( "/users" ) @Produces( { APPLICATION_XML, APPLICATION_JSON } ) @StatusCodes( { @ResponseCode( code = 200, condition = "Successfully retrieved the list of User objects." ), @ResponseCode( code = 500, condition = "Unable to retrieve User objects." ) } ) public UserListWrapper getUsers() throws Exception { return userRoleListService.getUsers(); } /** * Get a list of the standard roles in the platform. * * <p> * <b>Example Request:</b><br /> * GET pentaho/api/userrolelist/roles * </p> * * @return A list of Role objects that contains the standard roles in the platform. * * <p> * <b>Example Response:</b> * </p> * * <pre function="syntax.xml"> * <?xml version="1.0" encoding="UTF-8" standalone="yes"?><roleList><roles>Anonymous</roles><roles>Business Analyst</roles><roles>Authenticated</roles><roles>Report Author</roles><roles>Power User</roles></roleList> * </pre> */ @GET @Path( "/roles" ) @Produces( { APPLICATION_XML, APPLICATION_JSON } ) @StatusCodes( { @ResponseCode( code = 200, condition = "Successfully retrieved the list of Role objects." ), } ) public RoleListWrapper getRoles( @QueryParam( "addExtraRoles" ) String addExtraRoles ) { boolean includeExtraRoles = true; if ( addExtraRoles != null && addExtraRoles.length() > 0 ) { includeExtraRoles = Boolean.parseBoolean( addExtraRoles ); } return userRoleListService.getRoles( includeExtraRoles ); } /** * Get a list of the all roles in the platform including Anonymous and Administrator. * * <p> * <b>Example Request:</b><br /> * GET pentaho/api/userrolelist/allRoles * </p> * * @return A list of Role objects that contains all the roles in the platform. * * <p> * <b>Example Response:</b> * </p> * * <pre function="syntax.xml"> * <?xml version="1.0" encoding="UTF-8" standalone="yes"?><roleList><roles>Anonymous</roles><roles>Business Analyst</roles><roles>Authenticated</roles><roles>Report Author</roles><roles>Power User</roles><roles>Authenticated</roles><roles>Anonymous</roles></roleList> * </pre> */ @GET @Path( "/allRoles" ) @Produces( { APPLICATION_XML, APPLICATION_JSON } ) @StatusCodes( { @ResponseCode( code = 200, condition = "Successfully retrieved the list of Role objects." ), } ) public RoleListWrapper getAllRoles() throws Exception { return userRoleListService.getAllRoles(); } /** * Returns Roles identified as "system roles" from the repository. * * <p> * <b>Example Request:</b><br /> * GET pentaho/api/userrolelist/systemRoles * </p> * * @return A list of system roles. * * <p> * <b>Example Response:</b> * </p> * * <pre function="syntax.xml"> * <?xml version="1.0" encoding="UTF-8" standalone="yes"?><roleList><roles>Authenticated</roles><roles>Administrator</roles><roles>Anonymous</roles></roleList> * </pre> */ @GET @Path( "/systemRoles" ) @Produces( { APPLICATION_XML, APPLICATION_JSON } ) @StatusCodes( { @ResponseCode( code = 200, condition = "Successfully returns system role list." ) } ) public RoleListWrapper getSystemRoles() { return userRoleListService.getSystemRoles(); } /** * Returns roles identified as "extra roles" from the repository. * * <p> * <b>Example Request:</b><br /> * GET pentaho/api/userrolelist/extraRoles * </p> * * @return Roles identified as "extra roles" are returned as a list from the repository as shown in the example. * * <p> * <b>Example Response:</b> * </p> * * <pre function="syntax.xml"> * <?xml version="1.0" encoding="UTF-8" standalone="yes"?><roleList><roles>Authenticated</roles><roles>Anonymous</roles></roleList> * </pre> */ @GET @Path( "/extraRoles" ) @Produces( { APPLICATION_XML, APPLICATION_JSON } ) @StatusCodes( { @ResponseCode( code = 200, condition = "Successfully returns extra role list." ) } ) public RoleListWrapper getExtraRoles() { return userRoleListService.getExtraRolesList(); } /** * Gets the roles for the given user. * * <p> * <b>Example Request:</b><br /> * GET pentaho/api/userrolelist/getRolesForUser?user=admin * </p> * * @param user * The username to get the roles for * * @return A list of Role objects containing the roles for the given user. * * <p> * <b>Example Response:</b> * </p> * * <pre function="syntax.xml"> * <?xml version="1.0" encoding="UTF-8"?><roles><role>Administrator</role><role>Authenticated</role></roles> * </pre> */ @GET @Path( "/getRolesForUser" ) @Produces( { APPLICATION_XML, APPLICATION_JSON } ) @StatusCodes( { @ResponseCode( code = 200, condition = "Successfully retrieved the list of Role objects." ), @ResponseCode( code = 500, condition = "Invalid user parameter." ) } ) public RolesWrapper getRolesForUser( @QueryParam( "user" ) String user ) throws Exception { return new RolesWrapper( userRoleListService.doGetRolesForUser( user ) ); } /** * Gets the list of users that have the role specified by the role parameter. The list of valid roles can be obtained * by calling the /roles endpoint. * * <p> * <b>Example Request:</b><br /> * GET pentaho/api/userrolelist/getUsersInRole?role=Authenticated * </p> * * @param role * The role to get the users for * * @return A list of User objects that have the roles specified in the role parameter. * * <p> * <b>Example Response:</b> * </p> * * <pre function="syntax.xml"> * <?xml version="1.0" encoding="UTF-8"?><users><user>pat</user><user>admin</user><user>suzy</user><user>tiffany</user><user>enco*de:te^s_t$</user></users> * </pre> */ @GET @Path( "/getUsersInRole" ) @Produces( { APPLICATION_XML, APPLICATION_JSON } ) @StatusCodes( { @ResponseCode( code = 200, condition = "Successfully retrieved the list of User objects." ), @ResponseCode( code = 500, condition = "Missing the role parameter." ) } ) public UsersWrapper getUsersInRole( @QueryParam( "role" ) String role ) throws Exception { return new UsersWrapper( userRoleListService.doGetUsersInRole( role ) ); } }