2018-11-30 17:49:35 +01:00
|
|
|
package org.gcube.data.access.storagehub.services;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
2018-12-17 14:55:43 +01:00
|
|
|
import java.util.Collections;
|
2018-11-30 17:49:35 +01:00
|
|
|
import java.util.Iterator;
|
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import javax.inject.Inject;
|
|
|
|
import javax.jcr.Node;
|
2018-12-17 14:55:43 +01:00
|
|
|
import javax.jcr.NodeIterator;
|
|
|
|
import javax.jcr.query.QueryResult;
|
2018-11-30 17:49:35 +01:00
|
|
|
import javax.servlet.ServletContext;
|
2019-04-11 18:30:43 +02:00
|
|
|
import javax.ws.rs.Consumes;
|
2018-11-30 17:49:35 +01:00
|
|
|
import javax.ws.rs.DELETE;
|
2019-04-11 18:30:43 +02:00
|
|
|
import javax.ws.rs.FormParam;
|
2018-11-30 17:49:35 +01:00
|
|
|
import javax.ws.rs.GET;
|
|
|
|
import javax.ws.rs.POST;
|
|
|
|
import javax.ws.rs.Path;
|
|
|
|
import javax.ws.rs.PathParam;
|
|
|
|
import javax.ws.rs.Produces;
|
|
|
|
import javax.ws.rs.core.Context;
|
|
|
|
import javax.ws.rs.core.MediaType;
|
|
|
|
|
|
|
|
import org.apache.jackrabbit.api.JackrabbitSession;
|
|
|
|
import org.apache.jackrabbit.api.security.user.Authorizable;
|
|
|
|
import org.apache.jackrabbit.api.security.user.Query;
|
|
|
|
import org.apache.jackrabbit.api.security.user.QueryBuilder;
|
|
|
|
import org.apache.jackrabbit.api.security.user.User;
|
2018-12-17 14:55:43 +01:00
|
|
|
import org.apache.jackrabbit.core.security.principal.PrincipalImpl;
|
|
|
|
import org.gcube.common.authorization.control.annotations.AuthorizationControl;
|
2018-11-30 17:49:35 +01:00
|
|
|
import org.gcube.common.gxrest.response.outbound.GXOutboundErrorResponse;
|
|
|
|
import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
|
2018-12-17 14:55:43 +01:00
|
|
|
import org.gcube.common.storagehub.model.types.NodeProperty;
|
2018-11-30 17:49:35 +01:00
|
|
|
import org.gcube.data.access.storagehub.Constants;
|
|
|
|
import org.gcube.data.access.storagehub.Utils;
|
2018-12-17 14:55:43 +01:00
|
|
|
import org.gcube.data.access.storagehub.exception.MyAuthException;
|
2018-11-30 17:49:35 +01:00
|
|
|
import org.gcube.data.access.storagehub.handlers.CredentialHandler;
|
2018-12-17 14:55:43 +01:00
|
|
|
import org.gcube.data.access.storagehub.handlers.UnshareHandler;
|
2018-11-30 17:49:35 +01:00
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
@Path("users")
|
|
|
|
public class UserManager {
|
|
|
|
|
|
|
|
@Context ServletContext context;
|
|
|
|
|
|
|
|
private static final Logger log = LoggerFactory.getLogger(UserManager.class);
|
|
|
|
|
|
|
|
@Inject
|
|
|
|
RepositoryInitializer repository;
|
|
|
|
|
2018-12-17 14:55:43 +01:00
|
|
|
@Inject
|
|
|
|
UnshareHandler unshareHandler;
|
2019-03-26 17:09:26 +01:00
|
|
|
|
2018-11-30 17:49:35 +01:00
|
|
|
@GET
|
|
|
|
@Path("")
|
|
|
|
@Produces(MediaType.APPLICATION_JSON)
|
2018-12-17 14:55:43 +01:00
|
|
|
@AuthorizationControl(allowed={"lucio.lelii"}, exception=MyAuthException.class)
|
2018-11-30 17:49:35 +01:00
|
|
|
public List<String> getUsers(){
|
|
|
|
|
|
|
|
JackrabbitSession session = null;
|
|
|
|
List<String> users= new ArrayList<>();
|
|
|
|
try {
|
|
|
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
|
|
|
|
|
|
|
Iterator<Authorizable> result = session.getUserManager().findAuthorizables(new Query() {
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public <T> void build(QueryBuilder<T> builder) {
|
|
|
|
builder.setSelector(User.class);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
while (result.hasNext()) {
|
|
|
|
Authorizable user = result.next();
|
2018-12-17 14:55:43 +01:00
|
|
|
log.debug("user {} found",user.getPrincipal().getName());
|
2018-11-30 17:49:35 +01:00
|
|
|
users.add(user.getPrincipal().getName());
|
|
|
|
}
|
|
|
|
}catch(Exception e) {
|
|
|
|
log.error("jcr error getting users", e);
|
|
|
|
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
|
|
|
} finally {
|
|
|
|
if (session!=null)
|
|
|
|
session.logout();
|
|
|
|
}
|
|
|
|
return users;
|
|
|
|
}
|
|
|
|
|
|
|
|
@POST
|
|
|
|
@Path("")
|
2019-04-11 18:30:43 +02:00
|
|
|
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
2018-12-17 14:55:43 +01:00
|
|
|
@AuthorizationControl(allowed={"lucio.lelii"}, exception=MyAuthException.class)
|
2019-04-11 18:30:43 +02:00
|
|
|
public String createUser(@FormParam("user") String user, @FormParam("password") String password){
|
2018-11-30 17:49:35 +01:00
|
|
|
|
|
|
|
JackrabbitSession session = null;
|
|
|
|
String userId = null;
|
|
|
|
try {
|
|
|
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
|
|
|
|
|
|
|
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
|
|
|
|
|
|
|
User createdUser = usrManager.createUser(user, password);
|
|
|
|
userId = createdUser.getID();
|
2019-03-26 17:09:26 +01:00
|
|
|
|
2018-11-30 17:49:35 +01:00
|
|
|
Node homeNode = session.getNode("/Home");
|
|
|
|
Node userHome = homeNode.addNode(user, "nthl:home");
|
2019-03-26 17:09:26 +01:00
|
|
|
|
2018-12-17 14:55:43 +01:00
|
|
|
//creating workspace folder
|
2018-11-30 17:49:35 +01:00
|
|
|
Node workspaceFolder = Utils.createFolderInternally(session, userHome, Constants.WORKSPACE_ROOT_FOLDER_NAME, "workspace of "+user, false, user, null);
|
2018-12-17 14:55:43 +01:00
|
|
|
//creating thrash folder
|
|
|
|
Utils.createFolderInternally(session, workspaceFolder, Constants.TRASH_ROOT_FOLDER_NAME, "trash of "+user, false, user, null);
|
|
|
|
//creating Vre container folder
|
|
|
|
Utils.createFolderInternally(session, workspaceFolder, Constants.VRE_FOLDER_PARENT_NAME, "special folder container of "+user, false, user, null);
|
2019-03-26 17:09:26 +01:00
|
|
|
|
2018-11-30 17:49:35 +01:00
|
|
|
session.save();
|
|
|
|
}catch(Exception e) {
|
2018-12-17 14:55:43 +01:00
|
|
|
log.error("jcr error creating user {}", user, e);
|
2018-11-30 17:49:35 +01:00
|
|
|
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
|
|
|
} finally {
|
|
|
|
if (session!=null)
|
|
|
|
session.logout();
|
|
|
|
}
|
2019-03-26 17:09:26 +01:00
|
|
|
|
2018-11-30 17:49:35 +01:00
|
|
|
return userId;
|
|
|
|
}
|
2019-03-26 17:09:26 +01:00
|
|
|
|
|
|
|
|
2018-11-30 17:49:35 +01:00
|
|
|
@DELETE
|
|
|
|
@Path("{id}")
|
2018-12-17 14:55:43 +01:00
|
|
|
@AuthorizationControl(allowed={"lucio.lelii"}, exception=MyAuthException.class)
|
2018-11-30 17:49:35 +01:00
|
|
|
public String deleteUser(@PathParam("id") String id){
|
|
|
|
|
|
|
|
JackrabbitSession session = null;
|
|
|
|
String userId = null;
|
|
|
|
try {
|
|
|
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
|
|
|
|
|
|
|
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
2019-03-26 17:09:26 +01:00
|
|
|
|
2018-12-17 14:55:43 +01:00
|
|
|
org.gcube.common.storagehub.model.Path path = Utils.getWorkspacePath(id);
|
2019-03-26 17:09:26 +01:00
|
|
|
|
|
|
|
|
2018-12-17 14:55:43 +01:00
|
|
|
String sql2Query = String.format("SELECT * FROM [nthl:workspaceSharedItem] AS node WHERE ISDESCENDANTNODE('%s')", path.toPath());
|
|
|
|
|
|
|
|
log.info("query sent is {}",sql2Query);
|
2018-11-30 17:49:35 +01:00
|
|
|
|
2019-03-26 17:09:26 +01:00
|
|
|
|
2018-12-17 14:55:43 +01:00
|
|
|
javax.jcr.query.Query jcrQuery = session.getWorkspace().getQueryManager().createQuery(sql2Query, Constants.QUERY_LANGUAGE);
|
2019-03-26 17:09:26 +01:00
|
|
|
|
2018-12-17 14:55:43 +01:00
|
|
|
QueryResult result = jcrQuery.execute();
|
|
|
|
NodeIterator nodeIt = result.getNodes();
|
|
|
|
while (nodeIt.hasNext()) {
|
|
|
|
Node rNode = nodeIt.nextNode();
|
|
|
|
String title = rNode.hasProperty(NodeProperty.TITLE.toString()) ? rNode.getProperty(NodeProperty.TITLE.toString()).getString():"unknown";
|
|
|
|
log.debug("removing sharing for folder name {} with title {} and path {} ",rNode.getName(), title, rNode.getPath());
|
|
|
|
unshareHandler.unshare(session, Collections.singleton(id), rNode, id);
|
|
|
|
}
|
2019-03-26 17:09:26 +01:00
|
|
|
|
2018-12-17 14:55:43 +01:00
|
|
|
Authorizable authorizable = usrManager.getAuthorizable(new PrincipalImpl(id));
|
|
|
|
if (!authorizable.isGroup()) {
|
|
|
|
log.info("removing user {}", id);
|
2018-11-30 17:49:35 +01:00
|
|
|
authorizable.remove();
|
2018-12-17 14:55:43 +01:00
|
|
|
}
|
2018-11-30 17:49:35 +01:00
|
|
|
session.save();
|
|
|
|
}catch(Exception e) {
|
|
|
|
log.error("jcr error getting users", e);
|
|
|
|
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
|
|
|
} finally {
|
|
|
|
if (session!=null)
|
|
|
|
session.logout();
|
|
|
|
}
|
2019-03-26 17:09:26 +01:00
|
|
|
|
2018-11-30 17:49:35 +01:00
|
|
|
return userId;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|