commit for release
This commit is contained in:
parent
8ac4752ca7
commit
0f645fdde7
|
@ -1,7 +1,7 @@
|
||||||
<application mode='online'>
|
<application mode='online'>
|
||||||
<name>StorageHub</name>
|
<name>StorageHub</name>
|
||||||
<group>DataAccess</group>
|
<group>DataAccess</group>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>${version}</version>
|
||||||
<description>Storage Hub webapp</description>
|
<description>Storage Hub webapp</description>
|
||||||
<local-persistence location='target' />
|
<local-persistence location='target' />
|
||||||
</application>
|
</application>
|
7
pom.xml
7
pom.xml
|
@ -12,7 +12,7 @@
|
||||||
<modelVersion>4.0.0</modelVersion>
|
<modelVersion>4.0.0</modelVersion>
|
||||||
<groupId>org.gcube.data.access</groupId>
|
<groupId>org.gcube.data.access</groupId>
|
||||||
<artifactId>storagehub</artifactId>
|
<artifactId>storagehub</artifactId>
|
||||||
<version>1.0.8</version>
|
<version>1.0.9</version>
|
||||||
<name>storagehub</name>
|
<name>storagehub</name>
|
||||||
|
|
||||||
<scm>
|
<scm>
|
||||||
|
@ -97,11 +97,6 @@
|
||||||
<artifactId>common-scope</artifactId>
|
<artifactId>common-scope</artifactId>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<dependency>
|
|
||||||
<groupId>org.gcube.core</groupId>
|
|
||||||
<artifactId>common-encryption</artifactId>
|
|
||||||
</dependency>
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.gcube.common</groupId>
|
<groupId>org.gcube.common</groupId>
|
||||||
<artifactId>storagehub-model</artifactId>
|
<artifactId>storagehub-model</artifactId>
|
||||||
|
|
|
@ -44,7 +44,7 @@ public class AuthorizationChecker {
|
||||||
|
|
||||||
Item item = node2Item.getItem(node, Excludes.ALL);
|
Item item = node2Item.getItem(node, Excludes.ALL);
|
||||||
|
|
||||||
if (item==null) throw new UserNotAuthorizedException("Insufficent Provileges for user "+login+" to read node with id "+id+": it's not a valid StorageHub node");
|
if (item==null) throw new UserNotAuthorizedException("Insufficent Privileges for user "+login+" to read node with id "+id+": it's not a valid StorageHub node");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -64,10 +64,10 @@ public class AuthorizationChecker {
|
||||||
if (!authorizable.isGroup() && entry.getPrincipal().getName().equals(login)) return;
|
if (!authorizable.isGroup() && entry.getPrincipal().getName().equals(login)) return;
|
||||||
if (authorizable.isGroup() && ((Group) authorizable).isMember(userAuthorizable)) return;
|
if (authorizable.isGroup() && ((Group) authorizable).isMember(userAuthorizable)) return;
|
||||||
}
|
}
|
||||||
throw new UserNotAuthorizedException("Insufficent Provileges for user "+login+" to read node with id "+id);
|
throw new UserNotAuthorizedException("Insufficent Privileges for user "+login+" to read node with id "+id);
|
||||||
|
|
||||||
} else if (item.getOwner()==null || !item.getOwner().equals(login))
|
} else if (item.getOwner()==null || !item.getOwner().equals(login))
|
||||||
throw new UserNotAuthorizedException("Insufficent Provileges for user "+login+" to read node with id "+id);
|
throw new UserNotAuthorizedException("Insufficent Privileges for user "+login+" to read node with id "+id);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -86,10 +86,10 @@ public class AuthorizationChecker {
|
||||||
|
|
||||||
String login = AuthorizationProvider.instance.get().getClient().getId();
|
String login = AuthorizationProvider.instance.get().getClient().getId();
|
||||||
|
|
||||||
if (item==null) throw new UserNotAuthorizedException("Insufficent Provileges for user "+login+" to write into node with id "+id+": it's not a valid StorageHub node");
|
if (item==null) throw new UserNotAuthorizedException("Insufficent Privileges for user "+login+" to write into node with id "+id+": it's not a valid StorageHub node");
|
||||||
|
|
||||||
if (Constants.WRITE_PROTECTED_FOLDER.contains(item.getName()) || Constants.WRITE_PROTECTED_FOLDER.contains(item.getTitle()))
|
if (Constants.WRITE_PROTECTED_FOLDER.contains(item.getName()) || Constants.WRITE_PROTECTED_FOLDER.contains(item.getTitle()))
|
||||||
throw new UserNotAuthorizedException("Insufficent Provileges for user "+login+" to write into node with id "+id+": it's a protected folder");
|
throw new UserNotAuthorizedException("Insufficent Privileges for user "+login+" to write into node with id "+id+": it's a protected folder");
|
||||||
|
|
||||||
if (item.isShared()) {
|
if (item.isShared()) {
|
||||||
Node parentSharedNode = retrieveSharedFolderParent(node, session);
|
Node parentSharedNode = retrieveSharedFolderParent(node, session);
|
||||||
|
@ -116,7 +116,7 @@ public class AuthorizationChecker {
|
||||||
} else
|
} else
|
||||||
if(item.getOwner().equals(login))
|
if(item.getOwner().equals(login))
|
||||||
return;
|
return;
|
||||||
throw new UserNotAuthorizedException("Insufficent Provileges for user "+login+" to write into node with id "+id);
|
throw new UserNotAuthorizedException("Insufficent Privileges for user "+login+" to write into node with id "+id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -132,7 +132,7 @@ public class AuthorizationChecker {
|
||||||
//TODO: riguardare questo pezzo di codice
|
//TODO: riguardare questo pezzo di codice
|
||||||
String login = AuthorizationProvider.instance.get().getClient().getId();
|
String login = AuthorizationProvider.instance.get().getClient().getId();
|
||||||
|
|
||||||
if (item==null) throw new UserNotAuthorizedException("Insufficent Provileges for user "+login+": it's not a valid StorageHub node");
|
if (item==null) throw new UserNotAuthorizedException("Insufficent Privileges for user "+login+": it's not a valid StorageHub node");
|
||||||
|
|
||||||
Node node = session.getNodeByIdentifier(item.getId());
|
Node node = session.getNodeByIdentifier(item.getId());
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
package org.gcube.data.access.storagehub;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
|
||||||
|
import org.apache.jackrabbit.api.JackrabbitRepository;
|
||||||
|
import org.gcube.data.access.storagehub.services.GroupManager;
|
||||||
|
import org.gcube.data.access.storagehub.services.RepositoryInitializer;
|
||||||
|
import org.glassfish.jersey.server.monitoring.ApplicationEvent;
|
||||||
|
import org.glassfish.jersey.server.monitoring.ApplicationEventListener;
|
||||||
|
import org.glassfish.jersey.server.monitoring.RequestEvent;
|
||||||
|
import org.glassfish.jersey.server.monitoring.RequestEventListener;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
public class MyApplicationListener implements ApplicationEventListener {
|
||||||
|
|
||||||
|
private static final Logger log = LoggerFactory.getLogger(MyApplicationListener.class);
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
RepositoryInitializer repository;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onEvent(ApplicationEvent event) {
|
||||||
|
switch (event.getType()) {
|
||||||
|
case DESTROY_FINISHED:
|
||||||
|
log.info("Destroying application storageHub");
|
||||||
|
((JackrabbitRepository) repository.getRepository()).shutdown();
|
||||||
|
log.info("Jackrabbit repository stopped");
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RequestEventListener onRequest(RequestEvent requestEvent) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -32,6 +32,7 @@ public class StorageHub extends Application {
|
||||||
classes.add(UserManager.class);
|
classes.add(UserManager.class);
|
||||||
classes.add(GroupManager.class);
|
classes.add(GroupManager.class);
|
||||||
classes.add(SerializableErrorEntityTextWriter.class);
|
classes.add(SerializableErrorEntityTextWriter.class);
|
||||||
|
classes.add(MyApplicationListener.class);
|
||||||
return classes;
|
return classes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,11 +22,16 @@ import javax.jcr.RepositoryException;
|
||||||
import javax.jcr.Session;
|
import javax.jcr.Session;
|
||||||
import javax.jcr.lock.Lock;
|
import javax.jcr.lock.Lock;
|
||||||
import javax.jcr.lock.LockException;
|
import javax.jcr.lock.LockException;
|
||||||
|
import javax.jcr.query.Query;
|
||||||
import javax.jcr.version.Version;
|
import javax.jcr.version.Version;
|
||||||
|
|
||||||
import org.apache.commons.io.FilenameUtils;
|
import org.apache.commons.io.FilenameUtils;
|
||||||
|
import org.apache.jackrabbit.util.ISO9075;
|
||||||
import org.apache.jackrabbit.util.Text;
|
import org.apache.jackrabbit.util.Text;
|
||||||
import org.gcube.common.authorization.library.provider.AuthorizationProvider;
|
import org.gcube.common.authorization.library.provider.AuthorizationProvider;
|
||||||
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
import org.gcube.common.scope.impl.ScopeBean;
|
||||||
|
import org.gcube.common.scope.impl.ScopeBean.Type;
|
||||||
import org.gcube.common.storagehub.model.Excludes;
|
import org.gcube.common.storagehub.model.Excludes;
|
||||||
import org.gcube.common.storagehub.model.Paths;
|
import org.gcube.common.storagehub.model.Paths;
|
||||||
import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
|
import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
|
||||||
|
@ -39,15 +44,13 @@ import org.gcube.common.storagehub.model.items.Item;
|
||||||
import org.gcube.common.storagehub.model.items.SharedFolder;
|
import org.gcube.common.storagehub.model.items.SharedFolder;
|
||||||
import org.gcube.common.storagehub.model.types.ItemAction;
|
import org.gcube.common.storagehub.model.types.ItemAction;
|
||||||
import org.gcube.common.storagehub.model.types.NodeProperty;
|
import org.gcube.common.storagehub.model.types.NodeProperty;
|
||||||
import org.gcube.contentmanager.storageclient.wrapper.AccessType;
|
|
||||||
import org.gcube.contentmanager.storageclient.wrapper.MemoryType;
|
|
||||||
import org.gcube.contentmanager.storageclient.wrapper.StorageClient;
|
|
||||||
import org.gcube.data.access.storagehub.accounting.AccountingHandler;
|
import org.gcube.data.access.storagehub.accounting.AccountingHandler;
|
||||||
import org.gcube.data.access.storagehub.handlers.Item2NodeConverter;
|
import org.gcube.data.access.storagehub.handlers.Item2NodeConverter;
|
||||||
import org.gcube.data.access.storagehub.handlers.Node2ItemConverter;
|
import org.gcube.data.access.storagehub.handlers.Node2ItemConverter;
|
||||||
import org.gcube.data.access.storagehub.handlers.StorageBackendHandler;
|
import org.gcube.data.access.storagehub.handlers.StorageBackendHandler;
|
||||||
|
import org.gcube.data.access.storagehub.handlers.VRE;
|
||||||
|
import org.gcube.data.access.storagehub.handlers.VREManager;
|
||||||
import org.gcube.data.access.storagehub.handlers.VersionHandler;
|
import org.gcube.data.access.storagehub.handlers.VersionHandler;
|
||||||
import org.gcube.data.access.storagehub.storage.backend.impl.GCubeStorageBackend;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -107,15 +110,30 @@ public class Utils {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static <T extends Item> List<T> serachByNameOnFolder(Session ses, Node parent, List<String> excludes, Range range, boolean showHidden, Class<? extends Item> nodeTypeToInclude, String nameParam) throws RepositoryException, BackendGenericError{
|
||||||
|
String xpath = String.format("/jcr:root%s//element(*,nthl:workspaceItem)[jcr:like(@jcr:title, '%s')]",ISO9075.encodePath(parent.getPath()), nameParam);
|
||||||
|
|
||||||
|
//String query = String.format("SELECT * FROM [nthl:workspaceLeafItem] AS node WHERE ISDESCENDANTNODE('%s') ORDER BY node.[jcr:lastModified] DESC ",vreFolder.getPath());
|
||||||
|
logger.trace("query for search is {}",xpath);
|
||||||
|
|
||||||
|
Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(xpath, Query.XPATH);
|
||||||
|
|
||||||
|
NodeIterator it = jcrQuery.execute().getNodes();
|
||||||
|
return getItemListFromNodeIterator(it, excludes, range, showHidden, nodeTypeToInclude);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static <T extends Item> List<T> getItemList(Node parent, List<String> excludes, Range range, boolean showHidden, Class<? extends Item> nodeTypeToInclude) throws RepositoryException, BackendGenericError{
|
public static <T extends Item> List<T> getItemList(Node parent, List<String> excludes, Range range, boolean showHidden, Class<? extends Item> nodeTypeToInclude) throws RepositoryException, BackendGenericError{
|
||||||
|
logger.trace("getting children of node {}", parent.getIdentifier());
|
||||||
logger.debug("getting children of node {}", parent.getIdentifier());
|
|
||||||
|
|
||||||
List<T> returnList = new ArrayList<T>();
|
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
NodeIterator iterator = parent.getNodes();
|
NodeIterator iterator = parent.getNodes();
|
||||||
logger.trace("time to get iterator {}",(System.currentTimeMillis()-start));
|
logger.trace("time to get iterator {}",(System.currentTimeMillis()-start));
|
||||||
|
return getItemListFromNodeIterator(iterator, excludes, range, showHidden, nodeTypeToInclude);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <T extends Item> List<T> getItemListFromNodeIterator(NodeIterator iterator, List<String> excludes, Range range, boolean showHidden, Class<? extends Item> nodeTypeToInclude) throws RepositoryException, BackendGenericError{
|
||||||
|
List<T> returnList = new ArrayList<T>();
|
||||||
|
|
||||||
logger.trace("nodeType is {}",nodeTypeToInclude);
|
logger.trace("nodeType is {}",nodeTypeToInclude);
|
||||||
int count =0;
|
int count =0;
|
||||||
logger.trace("selected range is {}", range);
|
logger.trace("selected range is {}", range);
|
||||||
|
@ -123,12 +141,12 @@ public class Utils {
|
||||||
while (iterator.hasNext()){
|
while (iterator.hasNext()){
|
||||||
Node current = iterator.nextNode();
|
Node current = iterator.nextNode();
|
||||||
|
|
||||||
logger.debug("current node "+current.getName());
|
logger.trace("current node "+current.getName());
|
||||||
|
|
||||||
if (isToExclude(current, showHidden))
|
if (isToExclude(current, showHidden))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
logger.debug("current node not excluded "+current.getName());
|
logger.trace("current node not excluded "+current.getName());
|
||||||
|
|
||||||
if (range==null || (count>=range.getStart() && returnList.size()<range.getLimit())) {
|
if (range==null || (count>=range.getStart() && returnList.size()<range.getLimit())) {
|
||||||
T item = node2Item.getFilteredItem(current, excludes, nodeTypeToInclude);
|
T item = node2Item.getFilteredItem(current, excludes, nodeTypeToInclude);
|
||||||
|
@ -164,13 +182,13 @@ public class Utils {
|
||||||
Node currentNode = session.getNodeByIdentifier(directory.getId());
|
Node currentNode = session.getNodeByIdentifier(directory.getId());
|
||||||
queue.push(directory);
|
queue.push(directory);
|
||||||
Deque<Item> tempQueue = new LinkedList<Item>();
|
Deque<Item> tempQueue = new LinkedList<Item>();
|
||||||
logger.debug("adding directory {}",currentNode.getPath());
|
logger.trace("adding directory {}",currentNode.getPath());
|
||||||
for (Item item : Utils.getItemList(currentNode,Excludes.GET_ONLY_CONTENT, null, false, null)){
|
for (Item item : Utils.getItemList(currentNode,Excludes.GET_ONLY_CONTENT, null, false, null)){
|
||||||
if (excludes.contains(item.getId())) continue;
|
if (excludes.contains(item.getId())) continue;
|
||||||
if (item instanceof FolderItem)
|
if (item instanceof FolderItem)
|
||||||
tempQueue.addAll(getAllNodesForZip((FolderItem) item, session, accountingHandler, excludes));
|
tempQueue.addAll(getAllNodesForZip((FolderItem) item, session, accountingHandler, excludes));
|
||||||
else if (item instanceof AbstractFileItem){
|
else if (item instanceof AbstractFileItem){
|
||||||
logger.debug("adding file {}",item.getPath());
|
logger.trace("adding file {}",item.getPath());
|
||||||
AbstractFileItem fileItem = (AbstractFileItem) item;
|
AbstractFileItem fileItem = (AbstractFileItem) item;
|
||||||
accountingHandler.createReadObj(fileItem.getTitle(), session, session.getNodeByIdentifier(item.getId()), false);
|
accountingHandler.createReadObj(fileItem.getTitle(), session, session.getNodeByIdentifier(item.getId()), false);
|
||||||
queue.addLast(item);
|
queue.addLast(item);
|
||||||
|
@ -188,9 +206,9 @@ public class Utils {
|
||||||
Item item = queue.pop();
|
Item item = queue.pop();
|
||||||
if (item instanceof FolderItem) {
|
if (item instanceof FolderItem) {
|
||||||
actualPath = Paths.getPath(item.getPath());
|
actualPath = Paths.getPath(item.getPath());
|
||||||
logger.debug("actualPath is {}",actualPath.toPath());
|
logger.trace("actualPath is {}",actualPath.toPath());
|
||||||
String name = Paths.remove(actualPath, originalPath).toPath().replaceFirst("/", "");
|
String name = Paths.remove(actualPath, originalPath).toPath().replaceFirst("/", "");
|
||||||
logger.debug("writing dir {}",name);
|
logger.trace("writing dir {}",name);
|
||||||
if (name.isEmpty()) continue;
|
if (name.isEmpty()) continue;
|
||||||
try {
|
try {
|
||||||
zos.putNextEntry(new ZipEntry(name));
|
zos.putNextEntry(new ZipEntry(name));
|
||||||
|
@ -206,7 +224,7 @@ public class Utils {
|
||||||
}
|
}
|
||||||
try(BufferedInputStream is = new BufferedInputStream(streamToWrite)){
|
try(BufferedInputStream is = new BufferedInputStream(streamToWrite)){
|
||||||
String name = (Paths.remove(actualPath, originalPath).toPath()+item.getName()).replaceFirst("/", "");
|
String name = (Paths.remove(actualPath, originalPath).toPath()+item.getName()).replaceFirst("/", "");
|
||||||
logger.debug("writing file {}",name);
|
logger.trace("writing file {}",name);
|
||||||
zos.putNextEntry(new ZipEntry(name));
|
zos.putNextEntry(new ZipEntry(name));
|
||||||
copyStream(is, zos);
|
copyStream(is, zos);
|
||||||
}catch (Exception e) {
|
}catch (Exception e) {
|
||||||
|
@ -283,7 +301,7 @@ public class Utils {
|
||||||
|
|
||||||
String nameTocheck = ext.isEmpty()? String.format("%s(*)",filename): String.format("%s(*).%s",filename, ext);
|
String nameTocheck = ext.isEmpty()? String.format("%s(*)",filename): String.format("%s(*).%s",filename, ext);
|
||||||
|
|
||||||
logger.debug("filename is {}, extension is {} , and name to check is {}", filename, ext, nameTocheck);
|
logger.trace("filename is {}, extension is {} , and name to check is {}", filename, ext, nameTocheck);
|
||||||
|
|
||||||
NodeIterator ni = destination.getNodes(nameTocheck);
|
NodeIterator ni = destination.getNodes(nameTocheck);
|
||||||
int maxval = 0;
|
int maxval = 0;
|
||||||
|
@ -323,8 +341,10 @@ public class Utils {
|
||||||
//item.setHidden(destinationItem.isHidden());
|
//item.setHidden(destinationItem.isHidden());
|
||||||
|
|
||||||
Node newNode = new Item2NodeConverter().getNode(destinationNode, item);
|
Node newNode = new Item2NodeConverter().getNode(destinationNode, item);
|
||||||
if (accountingHandler!=null)
|
if (accountingHandler!=null) {
|
||||||
accountingHandler.createFolderAddObj(name, item.getClass().getSimpleName(), null, ses, newNode, false);
|
accountingHandler.createFolderAddObj(name, item.getClass().getSimpleName(), null, ses, destinationNode, false);
|
||||||
|
accountingHandler.createEntryCreate(item.getTitle(), ses, newNode, false);
|
||||||
|
}
|
||||||
return newNode;
|
return newNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,8 +369,10 @@ public class Utils {
|
||||||
//item.setHidden(destinationItem.isHidden());
|
//item.setHidden(destinationItem.isHidden());
|
||||||
|
|
||||||
Node newNode = new Item2NodeConverter().getNode(destinationNode, item);
|
Node newNode = new Item2NodeConverter().getNode(destinationNode, item);
|
||||||
if (accountingHandler!=null)
|
if (accountingHandler!=null) {
|
||||||
accountingHandler.createFolderAddObj(name, item.getClass().getSimpleName(), null, ses, newNode, false);
|
accountingHandler.createFolderAddObj(name, item.getClass().getSimpleName(), null, ses, destinationNode, false);
|
||||||
|
accountingHandler.createEntryCreate(item.getTitle(), ses, newNode, false);
|
||||||
|
}
|
||||||
return newNode;
|
return newNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,4 +402,43 @@ public class Utils {
|
||||||
node.setProperty(NodeProperty.LAST_MODIFIED_BY.toString(), login);
|
node.setProperty(NodeProperty.LAST_MODIFIED_BY.toString(), login);
|
||||||
node.setProperty(NodeProperty.LAST_ACTION.toString(), action.name());
|
node.setProperty(NodeProperty.LAST_ACTION.toString(), action.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static synchronized VRE getVreFolderItem(Session ses, Node2ItemConverter node2Item, VREManager vreManager, List<String> excludes ) throws RepositoryException, BackendGenericError{
|
||||||
|
org.gcube.common.storagehub.model.Path vrePath = Paths.append(Utils.getWorkspacePath(), Constants.VRE_FOLDER_PARENT_NAME);
|
||||||
|
ScopeBean bean = new ScopeBean(ScopeProvider.instance.get());
|
||||||
|
if (!bean.is(Type.VRE)) throw new BackendGenericError("the current scope is not a VRE");
|
||||||
|
String entireScopeName= bean.toString().replaceAll("^/(.*)/?$", "$1").replaceAll("/", "-");
|
||||||
|
VRE vre = vreManager.getVRE(entireScopeName);
|
||||||
|
if (vre!=null) return vre;
|
||||||
|
else {
|
||||||
|
String query = String.format("SELECT * FROM [nthl:workspaceItem] As node WHERE node.[jcr:title] like '%s' AND ISDESCENDANTNODE('%s')",entireScopeName, vrePath.toPath());
|
||||||
|
Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(query, Constants.QUERY_LANGUAGE);
|
||||||
|
NodeIterator it = jcrQuery.execute().getNodes();
|
||||||
|
|
||||||
|
if (!it.hasNext()) throw new BackendGenericError("vre folder not found for context "+entireScopeName);
|
||||||
|
|
||||||
|
Node folder = it.nextNode();
|
||||||
|
Item vreFolder = node2Item.getItem(folder, excludes);
|
||||||
|
return vreManager.putVRE(vreFolder);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static synchronized VRE getVreFolderItemByGroupNameAndUser(Session ses, String goupName, String userId, Node2ItemConverter node2Item, VREManager vreManager, List<String> excludes ) throws RepositoryException, BackendGenericError{
|
||||||
|
org.gcube.common.storagehub.model.Path vrePath = Paths.append(Utils.getWorkspacePath(userId), Constants.VRE_FOLDER_PARENT_NAME);
|
||||||
|
VRE vre = vreManager.getVRE(goupName);
|
||||||
|
if (vre!=null) return vre;
|
||||||
|
else {
|
||||||
|
String query = String.format("SELECT * FROM [nthl:workspaceItem] As node WHERE node.[jcr:title] like '%s' AND ISDESCENDANTNODE('%s')",goupName, vrePath.toPath());
|
||||||
|
Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(query, Constants.QUERY_LANGUAGE);
|
||||||
|
NodeIterator it = jcrQuery.execute().getNodes();
|
||||||
|
|
||||||
|
if (!it.hasNext()) throw new BackendGenericError("vre folder not found for context "+goupName);
|
||||||
|
|
||||||
|
Node folder = it.nextNode();
|
||||||
|
Item vreFolder = node2Item.getItem(folder, excludes);
|
||||||
|
return vreManager.putVRE(vreFolder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,6 +70,25 @@ public class AccountingHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void createEntryCreate(String title, Session ses, Node node, boolean saveHistory ) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
if (!node.hasNode(NodeProperty.ACCOUNTING.toString())){
|
||||||
|
node.addNode(NodeProperty.ACCOUNTING.toString(), NodeProperty.NT_ACCOUNTING.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
Node accountingNodeParent = node.getNode(NodeProperty.ACCOUNTING.toString());
|
||||||
|
Node accountingNode = accountingNodeParent.addNode(UUID.randomUUID().toString(),AccountingEntryType.CREATE.getNodeTypeDefinition());
|
||||||
|
accountingNode.setProperty(USER, AuthorizationProvider.instance.get().getClient().getId());
|
||||||
|
accountingNode.setProperty(DATE, Calendar.getInstance());
|
||||||
|
accountingNode.setProperty(ITEM_NAME, title);
|
||||||
|
|
||||||
|
if (saveHistory) ses.save();
|
||||||
|
} catch (RepositoryException e) {
|
||||||
|
logger.warn("error trying to retrieve accountign node",e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void createFileUpdated(String title, Session ses, Node node, boolean saveHistory ) {
|
public void createFileUpdated(String title, Session ses, Node node, boolean saveHistory ) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
@ -107,15 +126,15 @@ public class AccountingHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void createFolderAddObj(String title, String itemType, String mimeType, Session ses, Node node, boolean saveHistory ) {
|
public void createFolderAddObj(String title, String itemType, String mimeType, Session ses, Node parentNode, boolean saveHistory ) {
|
||||||
try {
|
try {
|
||||||
Node directoryNode = node.getParent();
|
|
||||||
|
|
||||||
if (!directoryNode.hasNode(NodeProperty.ACCOUNTING.toString())){
|
|
||||||
directoryNode.addNode(NodeProperty.ACCOUNTING.toString(), NodeProperty.NT_ACCOUNTING.toString());
|
if (!parentNode.hasNode(NodeProperty.ACCOUNTING.toString())){
|
||||||
|
parentNode.addNode(NodeProperty.ACCOUNTING.toString(), NodeProperty.NT_ACCOUNTING.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
Node accountingNodeParent = directoryNode.getNode(NodeProperty.ACCOUNTING.toString());
|
Node accountingNodeParent = parentNode.getNode(NodeProperty.ACCOUNTING.toString());
|
||||||
Node accountingNode = accountingNodeParent.addNode(UUID.randomUUID().toString(),AccountingEntryType.ADD.getNodeTypeDefinition());
|
Node accountingNode = accountingNodeParent.addNode(UUID.randomUUID().toString(),AccountingEntryType.ADD.getNodeTypeDefinition());
|
||||||
accountingNode.setProperty(USER, AuthorizationProvider.instance.get().getClient().getId());
|
accountingNode.setProperty(USER, AuthorizationProvider.instance.get().getClient().getId());
|
||||||
accountingNode.setProperty(DATE, Calendar.getInstance());
|
accountingNode.setProperty(DATE, Calendar.getInstance());
|
||||||
|
@ -172,7 +191,7 @@ public class AccountingHandler {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void createUnshareFolder(String title, Session ses, Node sharedNode, boolean saveHistory ) {
|
public void createUnshareFolder(String title, String user, Session ses, Node sharedNode, boolean saveHistory ) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
if (!sharedNode.hasNode(NodeProperty.ACCOUNTING.toString())){
|
if (!sharedNode.hasNode(NodeProperty.ACCOUNTING.toString())){
|
||||||
|
@ -180,8 +199,8 @@ public class AccountingHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
Node accountingNodeParent = sharedNode.getNode(NodeProperty.ACCOUNTING.toString());
|
Node accountingNodeParent = sharedNode.getNode(NodeProperty.ACCOUNTING.toString());
|
||||||
Node accountingNode = accountingNodeParent.addNode(UUID.randomUUID().toString(),AccountingEntryType.SHARE.getNodeTypeDefinition());
|
Node accountingNode = accountingNodeParent.addNode(UUID.randomUUID().toString(),AccountingEntryType.UNSHARE.getNodeTypeDefinition());
|
||||||
accountingNode.setProperty(USER, AuthorizationProvider.instance.get().getClient().getId());
|
accountingNode.setProperty(USER, user);
|
||||||
accountingNode.setProperty(DATE, Calendar.getInstance());
|
accountingNode.setProperty(DATE, Calendar.getInstance());
|
||||||
accountingNode.setProperty(ITEM_NAME, title);
|
accountingNode.setProperty(ITEM_NAME, title);
|
||||||
|
|
||||||
|
|
|
@ -56,7 +56,7 @@ public class Item2NodeConverter {
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
try{
|
try{
|
||||||
//Class<?> returnType = field.getType();
|
//Class<?> returnType = field.getType();
|
||||||
logger.debug("creating node - added field {}",field.getName());
|
logger.trace("creating node - added field {}",field.getName());
|
||||||
Values values = getObjectValue(field.getType(), field.get(item));
|
Values values = getObjectValue(field.getType(), field.get(item));
|
||||||
if (values.isMulti()) newNode.setProperty(attribute.value(), values.getValues());
|
if (values.isMulti()) newNode.setProperty(attribute.value(), values.getValues());
|
||||||
else newNode.setProperty(attribute.value(), values.getValue());
|
else newNode.setProperty(attribute.value(), values.getValue());
|
||||||
|
@ -67,7 +67,7 @@ public class Item2NodeConverter {
|
||||||
NodeAttribute nodeAttribute = field.getAnnotation(NodeAttribute.class);
|
NodeAttribute nodeAttribute = field.getAnnotation(NodeAttribute.class);
|
||||||
if (nodeAttribute.isReadOnly()) continue;
|
if (nodeAttribute.isReadOnly()) continue;
|
||||||
String nodeName = nodeAttribute.value();
|
String nodeName = nodeAttribute.value();
|
||||||
logger.debug("retrieving field node "+field.getName());
|
logger.trace("retrieving field node "+field.getName());
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
try{
|
try{
|
||||||
Object obj = field.get(item);
|
Object obj = field.get(item);
|
||||||
|
@ -129,7 +129,7 @@ public class Item2NodeConverter {
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (field.isAnnotationPresent(ListNodes.class)){
|
} else if (field.isAnnotationPresent(ListNodes.class)){
|
||||||
logger.debug("found field {} of type annotated as ListNodes in class {} on node {}", field.getName(), object.getClass().getName(), newNode.getName());
|
logger.trace("found field {} of type annotated as ListNodes in class {} on node {}", field.getName(), object.getClass().getName(), newNode.getName());
|
||||||
field.setAccessible(true);
|
field.setAccessible(true);
|
||||||
List<Object> toSetList = (List<Object>) field.get(object);
|
List<Object> toSetList = (List<Object>) field.get(object);
|
||||||
|
|
||||||
|
|
|
@ -127,7 +127,7 @@ public class Node2ItemConverter {
|
||||||
try{
|
try{
|
||||||
Class<?> returnType = field.getType();
|
Class<?> returnType = field.getType();
|
||||||
field.set(item, getPropertyValue(returnType, node.getProperty(attribute.value())));
|
field.set(item, getPropertyValue(returnType, node.getProperty(attribute.value())));
|
||||||
logger.debug("retrieve item - added field {}",field.getName());
|
logger.trace("retrieve item - added field {}",field.getName());
|
||||||
}catch(PathNotFoundException e){
|
}catch(PathNotFoundException e){
|
||||||
logger.trace("the current node dosn't contain {} property",attribute.value());
|
logger.trace("the current node dosn't contain {} property",attribute.value());
|
||||||
} catch (Exception e ) {
|
} catch (Exception e ) {
|
||||||
|
@ -320,7 +320,7 @@ public class Node2ItemConverter {
|
||||||
public boolean checkNodeType(Node node, Class<? extends Item> classToCompare) throws BackendGenericError{
|
public boolean checkNodeType(Node node, Class<? extends Item> classToCompare) throws BackendGenericError{
|
||||||
try {
|
try {
|
||||||
|
|
||||||
logger.info("class from nodetype is {} and class to compare is {}",ClassHandler.instance().get(node.getPrimaryNodeType().getName()), classToCompare);
|
logger.trace("class from nodetype is {} and class to compare is {}",ClassHandler.instance().get(node.getPrimaryNodeType().getName()), classToCompare);
|
||||||
|
|
||||||
return classToCompare.isAssignableFrom(ClassHandler.instance().get(node.getPrimaryNodeType().getName()));
|
return classToCompare.isAssignableFrom(ClassHandler.instance().get(node.getPrimaryNodeType().getName()));
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,7 @@ import org.gcube.common.storagehub.model.items.FolderItem;
|
||||||
import org.gcube.common.storagehub.model.items.Item;
|
import org.gcube.common.storagehub.model.items.Item;
|
||||||
import org.gcube.common.storagehub.model.items.SharedFolder;
|
import org.gcube.common.storagehub.model.items.SharedFolder;
|
||||||
import org.gcube.common.storagehub.model.types.ItemAction;
|
import org.gcube.common.storagehub.model.types.ItemAction;
|
||||||
|
import org.gcube.common.storagehub.model.types.NodeProperty;
|
||||||
import org.gcube.data.access.storagehub.AuthorizationChecker;
|
import org.gcube.data.access.storagehub.AuthorizationChecker;
|
||||||
import org.gcube.data.access.storagehub.Utils;
|
import org.gcube.data.access.storagehub.Utils;
|
||||||
import org.gcube.data.access.storagehub.accounting.AccountingHandler;
|
import org.gcube.data.access.storagehub.accounting.AccountingHandler;
|
||||||
|
@ -115,6 +116,8 @@ public class UnshareHandler {
|
||||||
|
|
||||||
unsharedNode = createUnsharedFolder(ses, parentNode, directoryName, item.getDescription(), login);
|
unsharedNode = createUnsharedFolder(ses, parentNode, directoryName, item.getDescription(), login);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
List<Item> itemsToCopy = Utils.getItemList(sharedItemNode, Excludes.ALL, null, true, null);
|
List<Item> itemsToCopy = Utils.getItemList(sharedItemNode, Excludes.ALL, null, true, null);
|
||||||
|
|
||||||
for (Item itemCopy: itemsToCopy) {
|
for (Item itemCopy: itemsToCopy) {
|
||||||
|
@ -122,7 +125,16 @@ public class UnshareHandler {
|
||||||
log.debug("copying {} to {}", itemToCopyNode.getPath(), unsharedNode.getPath());
|
log.debug("copying {} to {}", itemToCopyNode.getPath(), unsharedNode.getPath());
|
||||||
ses.move(itemToCopyNode.getPath(), String.format("%s/%s",unsharedNode.getPath(), itemToCopyNode.getName()));
|
ses.move(itemToCopyNode.getPath(), String.format("%s/%s",unsharedNode.getPath(), itemToCopyNode.getName()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsharedNode.getNode(NodeProperty.ACCOUNTING.toString()).remove();
|
||||||
|
ses.move(sharedItemNode.getNode(NodeProperty.ACCOUNTING.toString()).getPath(), String.format("%s/%s",unsharedNode.getPath(), NodeProperty.ACCOUNTING.toString()));
|
||||||
|
|
||||||
|
accountingHandler.createUnshareFolder(sharedItemNode.getProperty(NodeProperty.TITLE.toString()).getString(), "ALL", ses, unsharedNode, false);
|
||||||
|
|
||||||
ses.save();
|
ses.save();
|
||||||
|
}catch(Throwable t) {
|
||||||
|
log.error("erro unsharing all",t);
|
||||||
|
throw t;
|
||||||
}finally {
|
}finally {
|
||||||
ses.getWorkspace().getLockManager().unlock(sharedItemNode.getPath());
|
ses.getWorkspace().getLockManager().unlock(sharedItemNode.getPath());
|
||||||
}
|
}
|
||||||
|
@ -164,6 +176,9 @@ public class UnshareHandler {
|
||||||
|
|
||||||
log.debug("removed Access control entry for user {}",login);
|
log.debug("removed Access control entry for user {}",login);
|
||||||
Node sharedItemNode = ses.getNodeByIdentifier(item.getId());
|
Node sharedItemNode = ses.getNodeByIdentifier(item.getId());
|
||||||
|
|
||||||
|
accountingHandler.createUnshareFolder(sharedItemNode.getProperty(NodeProperty.TITLE.toString()).getString(), login, ses, sharedItemNode, false);
|
||||||
|
|
||||||
Node usersNode = sharedItemNode.getNode(NodeConstants.USERS_NAME);
|
Node usersNode = sharedItemNode.getNode(NodeConstants.USERS_NAME);
|
||||||
usersNode.remove();
|
usersNode.remove();
|
||||||
Node newUsersNode = sharedItemNode.addNode(NodeConstants.USERS_NAME);
|
Node newUsersNode = sharedItemNode.addNode(NodeConstants.USERS_NAME);
|
||||||
|
@ -175,7 +190,8 @@ public class UnshareHandler {
|
||||||
}});
|
}});
|
||||||
|
|
||||||
acm.setPolicy(sharedFolderNode.getPath(), acls);
|
acm.setPolicy(sharedFolderNode.getPath(), acls);
|
||||||
|
|
||||||
|
|
||||||
ses.save();
|
ses.save();
|
||||||
|
|
||||||
return parentId;
|
return parentId;
|
||||||
|
@ -225,7 +241,11 @@ public class UnshareHandler {
|
||||||
}});
|
}});
|
||||||
|
|
||||||
acm.setPolicy(sharedFolderNode.getPath(), acls);
|
acm.setPolicy(sharedFolderNode.getPath(), acls);
|
||||||
|
|
||||||
|
for (String user: usersToUnshare) {
|
||||||
|
accountingHandler.createUnshareFolder(sharedItemNode.getProperty(NodeProperty.TITLE.toString()).getString(), user, ses, sharedItemNode, false);
|
||||||
|
}
|
||||||
|
|
||||||
ses.save();
|
ses.save();
|
||||||
|
|
||||||
return item.getId();
|
return item.getId();
|
||||||
|
@ -242,7 +262,6 @@ public class UnshareHandler {
|
||||||
Node parentNode = ses.getNodeByIdentifier(parentDirectoryId);
|
Node parentNode = ses.getNodeByIdentifier(parentDirectoryId);
|
||||||
Node userNode = ses.getNode(String.format("%s/%s",parentNode.getPath(), directoryName));
|
Node userNode = ses.getNode(String.format("%s/%s",parentNode.getPath(), directoryName));
|
||||||
userNode.removeShare();
|
userNode.removeShare();
|
||||||
accountingHandler.createUnshareFolder(directoryName, ses, parentNode, false);
|
|
||||||
log.debug("directory removed for user {}",user);
|
log.debug("directory removed for user {}",user);
|
||||||
return parentDirectoryId;
|
return parentDirectoryId;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,13 @@
|
||||||
package org.gcube.data.access.storagehub.handlers;
|
package org.gcube.data.access.storagehub.handlers;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Calendar;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Locale;
|
||||||
import java.util.concurrent.Callable;
|
import java.util.concurrent.Callable;
|
||||||
|
|
||||||
import javax.jcr.Credentials;
|
import javax.jcr.Credentials;
|
||||||
|
@ -17,10 +21,11 @@ import javax.jcr.observation.Event;
|
||||||
import javax.jcr.observation.EventJournal;
|
import javax.jcr.observation.EventJournal;
|
||||||
import javax.jcr.query.Query;
|
import javax.jcr.query.Query;
|
||||||
|
|
||||||
|
import org.apache.jackrabbit.util.ISO9075;
|
||||||
import org.gcube.common.storagehub.model.Excludes;
|
import org.gcube.common.storagehub.model.Excludes;
|
||||||
import org.gcube.common.storagehub.model.NodeConstants;
|
import org.gcube.common.storagehub.model.NodeConstants;
|
||||||
import org.gcube.common.storagehub.model.items.Item;
|
import org.gcube.common.storagehub.model.items.Item;
|
||||||
import org.gcube.data.access.storagehub.Constants;
|
import org.gcube.common.storagehub.model.types.NodeProperty;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -29,7 +34,7 @@ public class VREQueryRetriever implements Callable<List<Item>> {
|
||||||
private static final Logger logger = LoggerFactory.getLogger(VREQueryRetriever.class);
|
private static final Logger logger = LoggerFactory.getLogger(VREQueryRetriever.class);
|
||||||
|
|
||||||
private static final int CACHE_DIMENSION = 50;
|
private static final int CACHE_DIMENSION = 50;
|
||||||
|
|
||||||
private Repository repository;
|
private Repository repository;
|
||||||
private Credentials credentials;
|
private Credentials credentials;
|
||||||
private Item vreFolder;
|
private Item vreFolder;
|
||||||
|
@ -37,7 +42,7 @@ public class VREQueryRetriever implements Callable<List<Item>> {
|
||||||
long lastTimestamp =0;
|
long lastTimestamp =0;
|
||||||
|
|
||||||
private Node2ItemConverter node2Item = new Node2ItemConverter();
|
private Node2ItemConverter node2Item = new Node2ItemConverter();
|
||||||
|
|
||||||
|
|
||||||
public VREQueryRetriever(Repository repository, Credentials credentials, Item vreFolder) {
|
public VREQueryRetriever(Repository repository, Credentials credentials, Item vreFolder) {
|
||||||
super();
|
super();
|
||||||
|
@ -53,20 +58,50 @@ public class VREQueryRetriever implements Callable<List<Item>> {
|
||||||
try {
|
try {
|
||||||
long start = System.currentTimeMillis();
|
long start = System.currentTimeMillis();
|
||||||
ses = repository.login(credentials);
|
ses = repository.login(credentials);
|
||||||
String query = String.format("SELECT * FROM [nthl:workspaceLeafItem] AS node WHERE ISDESCENDANTNODE('%s') ORDER BY node.[jcr:lastModified] DESC ",vreFolder.getPath());
|
|
||||||
logger.trace("query for recents is {}",query);
|
Calendar now = Calendar.getInstance();
|
||||||
Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(query, Constants.QUERY_LANGUAGE);
|
now.add(Calendar.YEAR, -1);
|
||||||
|
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS", Locale.ENGLISH);
|
||||||
|
String formattedDate = formatter.format(now.getTime());
|
||||||
|
|
||||||
|
|
||||||
|
String xpath = String.format("/jcr:root%s//element(*,nthl:workspaceLeafItem)[@jcr:lastModified>xs:dateTime('%s')] order by @jcr:lastModified descending",ISO9075.encodePath(vreFolder.getPath()),formattedDate);
|
||||||
|
|
||||||
|
//String query = String.format("SELECT * FROM [nthl:workspaceLeafItem] AS node WHERE ISDESCENDANTNODE('%s') ORDER BY node.[jcr:lastModified] DESC ",vreFolder.getPath());
|
||||||
|
logger.debug("query for recents is {}",xpath);
|
||||||
|
|
||||||
|
Query jcrQuery = ses.getWorkspace().getQueryManager().createQuery(xpath, Query.XPATH);
|
||||||
|
|
||||||
jcrQuery.setLimit(CACHE_DIMENSION);
|
jcrQuery.setLimit(CACHE_DIMENSION);
|
||||||
lastTimestamp = System.currentTimeMillis();
|
lastTimestamp = System.currentTimeMillis();
|
||||||
NodeIterator it = jcrQuery.execute().getNodes();
|
NodeIterator it = jcrQuery.execute().getNodes();
|
||||||
logger.trace("query for recents took {}",System.currentTimeMillis()-start);
|
logger.debug("query for recents took {}",System.currentTimeMillis()-start);
|
||||||
while (it.hasNext()) {
|
while (it.hasNext()) {
|
||||||
Node node = it.nextNode();
|
Node node = it.nextNode();
|
||||||
Item item =node2Item.getItem(node, Excludes.EXCLUDE_ACCOUNTING);
|
|
||||||
|
//long lastModifiedTimeItem = node.getProperty(NodeProperty.LAST_MODIFIED.toString()).getLong();
|
||||||
|
|
||||||
|
//logger.debug("RECENTS - node {} has timestamp {} ", node.getProperty(NodeProperty.TITLE.toString()).getString(), lastModifiedTimeItem);
|
||||||
|
/*
|
||||||
|
if(cachedList.size()<=CACHE_DIMENSION || lastModifiedTimeItem>cachedList.get(CACHE_DIMENSION-1).getLastModificationTime().getTimeInMillis()) {
|
||||||
|
logger.debug("cachedList contains {}",cachedList.size());
|
||||||
|
if(cachedList.size()>=CACHE_DIMENSION) cachedList.remove(CACHE_DIMENSION-1);
|
||||||
|
Item item =node2Item.getItem(node, Excludes.EXCLUDE_ACCOUNTING);
|
||||||
|
int insertposition =0;
|
||||||
|
for(Item cachedItem: cachedList) {
|
||||||
|
if (cachedItem.getLastModificationTime().before(item.getLastModificationTime()))
|
||||||
|
break;
|
||||||
|
insertposition++;
|
||||||
|
}
|
||||||
|
cachedList.add(insertposition, item);
|
||||||
|
logger.debug("RECENTS - adding item {} with node {} in position {}",item.getTitle(), node.getName(), insertposition);
|
||||||
|
}*/
|
||||||
|
Item item = node2Item.getItem(node, Excludes.EXCLUDE_ACCOUNTING);
|
||||||
|
logger.debug("RECENTS - adding item {} with timestamp {}",item.getTitle(), item.getLastModificationTime().getTimeInMillis());
|
||||||
cachedList.add(item);
|
cachedList.add(item);
|
||||||
logger.trace("adding item {} with node {}",item.getTitle(), node.getName());
|
|
||||||
}
|
}
|
||||||
logger.trace("creating objects took {}",System.currentTimeMillis()-start);
|
logger.debug("creating objects took {}",System.currentTimeMillis()-start);
|
||||||
if (cachedList.size()<=10) return cachedList;
|
if (cachedList.size()<=10) return cachedList;
|
||||||
else return cachedList.subList(0, 10);
|
else return cachedList.subList(0, 10);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -79,7 +114,7 @@ public class VREQueryRetriever implements Callable<List<Item>> {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
long timestampToUse = lastTimestamp;
|
long timestampToUse = lastTimestamp;
|
||||||
lastTimestamp = System.currentTimeMillis();
|
lastTimestamp = System.currentTimeMillis();
|
||||||
|
|
||||||
|
@ -89,16 +124,16 @@ public class VREQueryRetriever implements Callable<List<Item>> {
|
||||||
|
|
||||||
EventJournal journalChanged = ses.getWorkspace().getObservationManager().getEventJournal(Event.PROPERTY_CHANGED^Event.NODE_REMOVED^Event.NODE_MOVED^Event.NODE_ADDED, vreFolder.getPath(), true, null, types);
|
EventJournal journalChanged = ses.getWorkspace().getObservationManager().getEventJournal(Event.PROPERTY_CHANGED^Event.NODE_REMOVED^Event.NODE_MOVED^Event.NODE_ADDED, vreFolder.getPath(), true, null, types);
|
||||||
journalChanged.skipTo(timestampToUse);
|
journalChanged.skipTo(timestampToUse);
|
||||||
|
|
||||||
logger.trace("getting the journal took {}",System.currentTimeMillis()-start);
|
logger.trace("getting the journal took {}",System.currentTimeMillis()-start);
|
||||||
|
|
||||||
int events = 0;
|
int events = 0;
|
||||||
|
|
||||||
while (journalChanged.hasNext()) {
|
while (journalChanged.hasNext()) {
|
||||||
events++;
|
events++;
|
||||||
Event event = journalChanged.nextEvent();
|
Event event = journalChanged.nextEvent();
|
||||||
switch(event.getType()) {
|
switch(event.getType()) {
|
||||||
|
|
||||||
case Event.NODE_ADDED:
|
case Event.NODE_ADDED:
|
||||||
if (ses.nodeExists(event.getPath())) {
|
if (ses.nodeExists(event.getPath())) {
|
||||||
Node nodeAdded = ses.getNode(event.getPath());
|
Node nodeAdded = ses.getNode(event.getPath());
|
||||||
|
@ -109,7 +144,7 @@ public class VREQueryRetriever implements Callable<List<Item>> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Event.PROPERTY_CHANGED:
|
case Event.PROPERTY_CHANGED:
|
||||||
if (ses.propertyExists(event.getPath())) {
|
if (ses.propertyExists(event.getPath())) {
|
||||||
Property property = ses.getProperty(event.getPath());
|
Property property = ses.getProperty(event.getPath());
|
||||||
|
|
|
@ -2,7 +2,6 @@ package org.gcube.data.access.storagehub.services;
|
||||||
|
|
||||||
import java.security.Principal;
|
import java.security.Principal;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import javax.enterprise.context.RequestScoped;
|
import javax.enterprise.context.RequestScoped;
|
||||||
|
@ -22,7 +21,6 @@ import javax.ws.rs.PUT;
|
||||||
import javax.ws.rs.Path;
|
import javax.ws.rs.Path;
|
||||||
import javax.ws.rs.PathParam;
|
import javax.ws.rs.PathParam;
|
||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.Produces;
|
||||||
import javax.ws.rs.QueryParam;
|
|
||||||
import javax.ws.rs.core.Context;
|
import javax.ws.rs.core.Context;
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
import javax.ws.rs.core.Response;
|
import javax.ws.rs.core.Response;
|
||||||
|
@ -143,45 +141,25 @@ public class ACLManager {
|
||||||
InnerMethodName.instance.set("setACLById");
|
InnerMethodName.instance.set("setACLById");
|
||||||
Session ses = null;
|
Session ses = null;
|
||||||
try{
|
try{
|
||||||
|
|
||||||
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
Node node = ses.getNodeByIdentifier(id);
|
Node node = ses.getNodeByIdentifier(id);
|
||||||
|
|
||||||
Item item = node2Item.getItem(node, Excludes.ALL);
|
Item item = node2Item.getItem(node, Excludes.ALL);
|
||||||
|
|
||||||
if (!(item instanceof SharedFolder))
|
if (!(item instanceof SharedFolder))
|
||||||
throw new InvalidItemException("the item is not a shared folder");
|
throw new InvalidItemException("the item is not a shared folder");
|
||||||
|
|
||||||
if (item.getOwner().equals(user))
|
if (item.getOwner().equals(user))
|
||||||
throw new UserNotAuthorizedException("owner acl cannot be changed");
|
throw new UserNotAuthorizedException("owner acl cannot be changed");
|
||||||
|
|
||||||
authChecker.checkAdministratorControl(ses, (SharedFolder) item);
|
authChecker.checkAdministratorControl(ses, (SharedFolder) item);
|
||||||
|
|
||||||
SharedFolder folder = ((SharedFolder)item);
|
SharedFolder folder = ((SharedFolder)item);
|
||||||
|
|
||||||
if (folder.isVreFolder()) {
|
if (folder.isVreFolder()) {
|
||||||
if (accessType!=AccessType.ADMINISTRATOR)
|
throw new InvalidCallParameters("acls in vreFolder cannot be changed with this method");
|
||||||
throw new InvalidCallParameters("acls in vreFolder cannot be changed, only new admin can be set");
|
|
||||||
|
|
||||||
org.apache.jackrabbit.api.security.user.UserManager usrManager = ((JackrabbitSession)ses).getUserManager();
|
|
||||||
|
|
||||||
String groupId = folder.getTitle();
|
|
||||||
|
|
||||||
Group group = (Group)usrManager.getAuthorizable(groupId);
|
|
||||||
User authUser = (User)usrManager.getAuthorizable(user);
|
|
||||||
|
|
||||||
if (!group.isMember(authUser))
|
|
||||||
throw new InvalidCallParameters("user "+user+" is not in the group "+groupId);
|
|
||||||
|
|
||||||
String path = node.getPath();
|
|
||||||
AccessControlManager acm = ses.getAccessControlManager();
|
|
||||||
JackrabbitAccessControlList acls = AccessControlUtils.getAccessControlList(acm, path);
|
|
||||||
Privilege[] userPrivileges = new Privilege[] { acm.privilegeFromName(AccessType.ADMINISTRATOR.getValue()) };
|
|
||||||
Principal principal = AccessControlUtils.getPrincipal(ses, user);
|
|
||||||
acls.addAccessControlEntry(principal, userPrivileges);
|
|
||||||
acm.setPolicy(path, acls);
|
|
||||||
ses.save();
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
@ -234,14 +212,14 @@ public class ACLManager {
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @param String user
|
* @param String user
|
||||||
* @param accessType accessType
|
*
|
||||||
*
|
*
|
||||||
* @exception {@link RepositoryException} when a generic jcr error occurs
|
* @exception {@link RepositoryException} when a generic jcr error occurs
|
||||||
* @exception {@link UserNotAuthorizedException} when the caller is not ADMINISTRATOR of the shared folder
|
* @exception {@link UserNotAuthorizedException} when the caller is not ADMINISTRATOR of the shared folder
|
||||||
* @exception {@link InvalidCallParameters} when the folder is not shared with the specified user
|
* @exception {@link InvalidCallParameters} when the folder is not shared with the specified user
|
||||||
* @exception {@link InvalidItemException} when the folder is not share
|
* @exception {@link InvalidItemException} when the folder is not share
|
||||||
*/
|
*/
|
||||||
/*@DELETE
|
@DELETE
|
||||||
@Consumes(MediaType.TEXT_PLAIN)
|
@Consumes(MediaType.TEXT_PLAIN)
|
||||||
@Path("{id}/acls/{user}")
|
@Path("{id}/acls/{user}")
|
||||||
public void removeACL(@PathParam("user") String user) {
|
public void removeACL(@PathParam("user") String user) {
|
||||||
|
@ -254,35 +232,37 @@ public class ACLManager {
|
||||||
|
|
||||||
Item item = node2Item.getItem(node, Excludes.ALL);
|
Item item = node2Item.getItem(node, Excludes.ALL);
|
||||||
|
|
||||||
|
|
||||||
if (!(item instanceof SharedFolder))
|
if (!(item instanceof SharedFolder))
|
||||||
throw new InvalidItemException("the item is not a shared folder");
|
throw new InvalidItemException("the item is not a shared folder");
|
||||||
|
|
||||||
|
if (item instanceof VreFolder)
|
||||||
|
throw new InvalidCallParameters("acls in vreFolder cannot be changed with this method");
|
||||||
|
|
||||||
authChecker.checkAdministratorControl(ses, (SharedFolder) item);
|
authChecker.checkAdministratorControl(ses, (SharedFolder) item);
|
||||||
|
|
||||||
SharedFolder folder = ((SharedFolder)item);
|
SharedFolder folder = ((SharedFolder)item);
|
||||||
|
|
||||||
if (folder.isVreFolder()) {
|
AccessControlManager acm = ses.getAccessControlManager();
|
||||||
AccessControlManager acm = ses.getAccessControlManager();
|
JackrabbitAccessControlList acls = AccessControlUtils.getAccessControlList(acm, folder.getPath());
|
||||||
JackrabbitAccessControlList acls = AccessControlUtils.getAccessControlList(acm, folder.getPath());
|
|
||||||
|
|
||||||
|
|
||||||
AccessControlEntry entryToDelete= null;
|
AccessControlEntry entryToDelete= null;
|
||||||
for (AccessControlEntry ace :acls.getAccessControlEntries()) {
|
for (AccessControlEntry ace :acls.getAccessControlEntries()) {
|
||||||
if (ace.getPrincipal().getName().equals(user)) {
|
if (ace.getPrincipal().getName().equals(user)) {
|
||||||
entryToDelete = ace;
|
entryToDelete = ace;
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
if (entryToDelete!=null)
|
|
||||||
acls.removeAccessControlEntry(entryToDelete);
|
|
||||||
else return;
|
|
||||||
|
|
||||||
acm.setPolicy(folder.getPath(), acls);
|
|
||||||
ses.save();
|
|
||||||
log.debug("removed Access control entry for user {}",user);
|
|
||||||
|
|
||||||
} else throw new InvalidCallParameters("remove acl can be called only on VRE folder");
|
}
|
||||||
|
if (entryToDelete!=null)
|
||||||
|
acls.removeAccessControlEntry(entryToDelete);
|
||||||
|
else return;
|
||||||
|
|
||||||
|
acm.setPolicy(folder.getPath(), acls);
|
||||||
|
ses.save();
|
||||||
|
log.debug("removed Access control entry for user {}",user);
|
||||||
|
|
||||||
|
|
||||||
}catch(RepositoryException re){
|
}catch(RepositoryException re){
|
||||||
log.error("jcr error extracting archive", re);
|
log.error("jcr error extracting archive", re);
|
||||||
|
@ -294,7 +274,7 @@ public class ACLManager {
|
||||||
if (ses!=null)
|
if (ses!=null)
|
||||||
ses.logout();
|
ses.logout();
|
||||||
}
|
}
|
||||||
}*/
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("{id}/acls/write")
|
@Path("{id}/acls/write")
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package org.gcube.data.access.storagehub.services;
|
package org.gcube.data.access.storagehub.services;
|
||||||
|
|
||||||
|
import java.security.Principal;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -8,6 +9,8 @@ import javax.inject.Inject;
|
||||||
import javax.jcr.Node;
|
import javax.jcr.Node;
|
||||||
import javax.jcr.NodeIterator;
|
import javax.jcr.NodeIterator;
|
||||||
import javax.jcr.PathNotFoundException;
|
import javax.jcr.PathNotFoundException;
|
||||||
|
import javax.jcr.RepositoryException;
|
||||||
|
import javax.jcr.security.AccessControlEntry;
|
||||||
import javax.jcr.security.AccessControlManager;
|
import javax.jcr.security.AccessControlManager;
|
||||||
import javax.jcr.security.Privilege;
|
import javax.jcr.security.Privilege;
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
|
@ -22,6 +25,7 @@ import javax.ws.rs.PathParam;
|
||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.Produces;
|
||||||
import javax.ws.rs.core.Context;
|
import javax.ws.rs.core.Context;
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
|
||||||
import org.apache.jackrabbit.api.JackrabbitSession;
|
import org.apache.jackrabbit.api.JackrabbitSession;
|
||||||
import org.apache.jackrabbit.api.security.JackrabbitAccessControlList;
|
import org.apache.jackrabbit.api.security.JackrabbitAccessControlList;
|
||||||
|
@ -34,15 +38,26 @@ import org.apache.jackrabbit.commons.jackrabbit.authorization.AccessControlUtils
|
||||||
import org.gcube.common.authorization.control.annotations.AuthorizationControl;
|
import org.gcube.common.authorization.control.annotations.AuthorizationControl;
|
||||||
import org.gcube.common.authorization.library.provider.AuthorizationProvider;
|
import org.gcube.common.authorization.library.provider.AuthorizationProvider;
|
||||||
import org.gcube.common.gxrest.response.outbound.GXOutboundErrorResponse;
|
import org.gcube.common.gxrest.response.outbound.GXOutboundErrorResponse;
|
||||||
|
import org.gcube.common.scope.api.ScopeProvider;
|
||||||
|
import org.gcube.common.storagehub.model.Excludes;
|
||||||
import org.gcube.common.storagehub.model.acls.AccessType;
|
import org.gcube.common.storagehub.model.acls.AccessType;
|
||||||
import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
|
import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
|
||||||
|
import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters;
|
||||||
import org.gcube.common.storagehub.model.exceptions.InvalidItemException;
|
import org.gcube.common.storagehub.model.exceptions.InvalidItemException;
|
||||||
|
import org.gcube.common.storagehub.model.exceptions.StorageHubException;
|
||||||
|
import org.gcube.common.storagehub.model.exceptions.UserNotAuthorizedException;
|
||||||
import org.gcube.common.storagehub.model.types.NodeProperty;
|
import org.gcube.common.storagehub.model.types.NodeProperty;
|
||||||
import org.gcube.common.storagehub.model.types.PrimaryNodeType;
|
import org.gcube.common.storagehub.model.types.PrimaryNodeType;
|
||||||
|
import org.gcube.data.access.storagehub.AuthorizationChecker;
|
||||||
import org.gcube.data.access.storagehub.Constants;
|
import org.gcube.data.access.storagehub.Constants;
|
||||||
import org.gcube.data.access.storagehub.Utils;
|
import org.gcube.data.access.storagehub.Utils;
|
||||||
import org.gcube.data.access.storagehub.exception.MyAuthException;
|
import org.gcube.data.access.storagehub.exception.MyAuthException;
|
||||||
import org.gcube.data.access.storagehub.handlers.CredentialHandler;
|
import org.gcube.data.access.storagehub.handlers.CredentialHandler;
|
||||||
|
import org.gcube.data.access.storagehub.handlers.Node2ItemConverter;
|
||||||
|
import org.gcube.data.access.storagehub.handlers.VRE;
|
||||||
|
import org.gcube.data.access.storagehub.handlers.VREManager;
|
||||||
|
import org.gcube.smartgears.utils.InnerMethodName;
|
||||||
|
import org.glassfish.jersey.media.multipart.FormDataParam;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
@ -51,17 +66,30 @@ public class GroupManager {
|
||||||
|
|
||||||
@Context ServletContext context;
|
@Context ServletContext context;
|
||||||
|
|
||||||
|
private static final String VREMANAGER_ROLE = "VRE-Manager";
|
||||||
|
private static final String INFRASTRUCTURE_MANAGER_ROLE = "Infrastructure-Manager";
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(GroupManager.class);
|
private static final Logger log = LoggerFactory.getLogger(GroupManager.class);
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
RepositoryInitializer repository;
|
RepositoryInitializer repository;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
VREManager vreManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
Node2ItemConverter node2Item;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
AuthorizationChecker authChecker;
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("")
|
@Path("")
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
@AuthorizationControl(allowed={"lucio.lelii"}, exception=MyAuthException.class)
|
|
||||||
public List<String> getGroups(){
|
public List<String> getGroups(){
|
||||||
|
|
||||||
|
InnerMethodName.instance.set("getGroups");
|
||||||
|
|
||||||
JackrabbitSession session = null;
|
JackrabbitSession session = null;
|
||||||
List<String> groups= new ArrayList<>();
|
List<String> groups= new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
|
@ -80,9 +108,9 @@ public class GroupManager {
|
||||||
log.info("group {} found",group.getPrincipal().getName());
|
log.info("group {} found",group.getPrincipal().getName());
|
||||||
groups.add(group.getPrincipal().getName());
|
groups.add(group.getPrincipal().getName());
|
||||||
}
|
}
|
||||||
}catch(Exception e) {
|
}catch(RepositoryException re ){
|
||||||
log.error("jcr error getting groups", e);
|
log.error("jcr error creating item", re);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
||||||
} finally {
|
} finally {
|
||||||
if (session!=null)
|
if (session!=null)
|
||||||
session.logout();
|
session.logout();
|
||||||
|
@ -92,13 +120,16 @@ public class GroupManager {
|
||||||
|
|
||||||
@POST
|
@POST
|
||||||
@Path("")
|
@Path("")
|
||||||
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
@Consumes(MediaType.MULTIPART_FORM_DATA)
|
||||||
@AuthorizationControl(allowed={"lucio.lelii"}, exception=MyAuthException.class)
|
@AuthorizationControl(allowedRoles={INFRASTRUCTURE_MANAGER_ROLE}, exception=MyAuthException.class)
|
||||||
public String createGroup(@FormParam("group") String group, @FormParam("accessType") AccessType accessType){
|
public String createGroup(@FormDataParam("group") String group, @FormDataParam("accessType") AccessType accessType, @FormDataParam("folderOwner") String folderOwner){
|
||||||
|
|
||||||
|
InnerMethodName.instance.set("createGroup");
|
||||||
|
|
||||||
JackrabbitSession session = null;
|
JackrabbitSession session = null;
|
||||||
String groupId = null;
|
String groupId = null;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
||||||
|
@ -106,7 +137,7 @@ public class GroupManager {
|
||||||
Group createdGroup = usrManager.createGroup(group);
|
Group createdGroup = usrManager.createGroup(group);
|
||||||
groupId = createdGroup.getID();
|
groupId = createdGroup.getID();
|
||||||
|
|
||||||
createVreFolder(groupId, session, accessType!=null?accessType:AccessType.WRITE_OWNER);
|
createVreFolder(groupId, session, accessType!=null?accessType:AccessType.WRITE_OWNER, folderOwner);
|
||||||
|
|
||||||
session.save();
|
session.save();
|
||||||
}catch(Exception e) {
|
}catch(Exception e) {
|
||||||
|
@ -122,11 +153,14 @@ public class GroupManager {
|
||||||
|
|
||||||
@DELETE
|
@DELETE
|
||||||
@Path("{group}")
|
@Path("{group}")
|
||||||
@AuthorizationControl(allowed={"lucio.lelii"}, exception=MyAuthException.class)
|
@AuthorizationControl(allowedRoles={INFRASTRUCTURE_MANAGER_ROLE}, exception=MyAuthException.class)
|
||||||
public String deleteGroup(@PathParam("group") String group){
|
public String deleteGroup(@PathParam("group") String group){
|
||||||
|
|
||||||
|
InnerMethodName.instance.set("deleteGroup");
|
||||||
|
|
||||||
JackrabbitSession session = null;
|
JackrabbitSession session = null;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
||||||
|
@ -140,26 +174,169 @@ public class GroupManager {
|
||||||
if (authorizable.isGroup())
|
if (authorizable.isGroup())
|
||||||
authorizable.remove();
|
authorizable.remove();
|
||||||
session.save();
|
session.save();
|
||||||
}catch(Exception e) {
|
}catch(RepositoryException re ){
|
||||||
log.error("jcr error getting users", e);
|
log.error("jcr error creating item", re);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
||||||
} finally {
|
} finally {
|
||||||
if (session!=null)
|
if (session!=null)
|
||||||
session.logout();
|
session.logout();
|
||||||
}
|
}
|
||||||
|
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean isInfraManager() { return AuthorizationProvider.instance.get().getClient().getRoles().contains(INFRASTRUCTURE_MANAGER_ROLE); }
|
||||||
|
|
||||||
@PUT
|
@PUT
|
||||||
@Path("{id}")
|
@Path("{id}/admins")
|
||||||
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
||||||
@AuthorizationControl(allowed={"lucio.lelii"}, exception=MyAuthException.class)
|
@AuthorizationControl(allowedRoles={VREMANAGER_ROLE, INFRASTRUCTURE_MANAGER_ROLE}, exception=MyAuthException.class)
|
||||||
|
public void addAdmin(@PathParam("id") String groupId, @FormParam("userId") String userId){
|
||||||
|
|
||||||
|
InnerMethodName.instance.set("addAddmin");
|
||||||
|
|
||||||
|
JackrabbitSession session = null;
|
||||||
|
try {
|
||||||
|
|
||||||
|
if (!isInfraManager() && !isValidGroupForContext(groupId) )
|
||||||
|
throw new UserNotAuthorizedException("only VREManager of the selected VRE can execute this operation");
|
||||||
|
|
||||||
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
|
|
||||||
|
org.apache.jackrabbit.api.security.user.UserManager usrManager = ((JackrabbitSession)session).getUserManager();
|
||||||
|
|
||||||
|
|
||||||
|
Group group = (Group)usrManager.getAuthorizable(groupId);
|
||||||
|
User authUser = (User)usrManager.getAuthorizable(userId);
|
||||||
|
|
||||||
|
if (!group.isMember(authUser))
|
||||||
|
throw new InvalidCallParameters("user "+userId+" is not in the group "+groupId);
|
||||||
|
|
||||||
|
Node vreFolder = getVreFolderNode(session, groupId);
|
||||||
|
AccessControlManager acm = session.getAccessControlManager();
|
||||||
|
JackrabbitAccessControlList acls = AccessControlUtils.getAccessControlList(acm, vreFolder.getPath());
|
||||||
|
Privilege[] userPrivileges = new Privilege[] { acm.privilegeFromName(AccessType.ADMINISTRATOR.getValue()) };
|
||||||
|
Principal principal = AccessControlUtils.getPrincipal(session, userId);
|
||||||
|
acls.addAccessControlEntry(principal, userPrivileges);
|
||||||
|
acm.setPolicy(vreFolder.getPath(), acls);
|
||||||
|
|
||||||
|
session.save();
|
||||||
|
}catch(StorageHubException she ){
|
||||||
|
log.error(she.getErrorMessage(), she);
|
||||||
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
|
}catch(RepositoryException re ){
|
||||||
|
log.error("adding admin to VREFolder", re);
|
||||||
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error adding admin to VREFolder", re));
|
||||||
|
} finally {
|
||||||
|
if (session!=null)
|
||||||
|
session.logout();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@DELETE
|
||||||
|
@Path("{id}/admins/{userId}")
|
||||||
|
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
||||||
|
@AuthorizationControl(allowedRoles={VREMANAGER_ROLE, INFRASTRUCTURE_MANAGER_ROLE}, exception=MyAuthException.class)
|
||||||
|
public void removeAdmin(@PathParam("id") String groupId, @PathParam("userId") String userId){
|
||||||
|
|
||||||
|
InnerMethodName.instance.set("removeAdmin");
|
||||||
|
|
||||||
|
JackrabbitSession session = null;
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
if (!isValidGroupForContext(groupId) && !isInfraManager())
|
||||||
|
throw new UserNotAuthorizedException("only VREManager of the selected VRE can execute this operation");
|
||||||
|
|
||||||
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
|
|
||||||
|
Node vreFolder = getVreFolderNode(session, groupId);
|
||||||
|
AccessControlManager acm = session.getAccessControlManager();
|
||||||
|
JackrabbitAccessControlList acls = AccessControlUtils.getAccessControlList(acm, vreFolder.getPath());
|
||||||
|
|
||||||
|
AccessControlEntry toRemove = null;
|
||||||
|
for (AccessControlEntry acl: acls.getAccessControlEntries())
|
||||||
|
if (acl.getPrincipal().getName().equals(userId)) {
|
||||||
|
toRemove = acl;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
acls.removeAccessControlEntry(toRemove);
|
||||||
|
acm.setPolicy(vreFolder.getPath(), acls);
|
||||||
|
session.save();
|
||||||
|
}catch(StorageHubException she ){
|
||||||
|
log.error(she.getErrorMessage(), she);
|
||||||
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
|
}catch(RepositoryException re ){
|
||||||
|
log.error("jcr error creating item", re);
|
||||||
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
||||||
|
}finally {
|
||||||
|
if (session!=null)
|
||||||
|
session.logout();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("{groupId}/admins")
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
public List<String> getAdmins(@PathParam("groupId") String groupId){
|
||||||
|
|
||||||
|
InnerMethodName.instance.set("getAdmins");
|
||||||
|
|
||||||
|
JackrabbitSession session = null;
|
||||||
|
List<String> users = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
|
||||||
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
VRE vreFolder = Utils.getVreFolderItemByGroupNameAndUser(session, groupId, AuthorizationProvider.instance.get().getClient().getId(), node2Item, vreManager, Excludes.ALL);
|
||||||
|
AccessControlManager acm = session.getAccessControlManager();
|
||||||
|
//authChecker.checkAdministratorControl(session, (VreFolder)vreFolder.getVreFolder());
|
||||||
|
Node node = session.getNodeByIdentifier(vreFolder.getVreFolder().getId());
|
||||||
|
|
||||||
|
JackrabbitAccessControlList acls = AccessControlUtils.getAccessControlList(acm, node.getPath());
|
||||||
|
|
||||||
|
for (AccessControlEntry acl: acls.getAccessControlEntries())
|
||||||
|
for (Privilege pr: acl.getPrivileges()) {
|
||||||
|
if (pr.getName().equals(AccessType.ADMINISTRATOR.getValue())){
|
||||||
|
users.add(acl.getPrincipal().getName());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}catch(StorageHubException she ){
|
||||||
|
log.error(she.getErrorMessage(), she);
|
||||||
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
|
}catch(RepositoryException re ){
|
||||||
|
log.error("jcr error creating item", re);
|
||||||
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
||||||
|
}finally {
|
||||||
|
if (session!=null)
|
||||||
|
session.logout();
|
||||||
|
}
|
||||||
|
|
||||||
|
return users;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@PUT
|
||||||
|
@Path("{id}/users")
|
||||||
|
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
||||||
|
@AuthorizationControl(allowedRoles={VREMANAGER_ROLE, INFRASTRUCTURE_MANAGER_ROLE}, exception=MyAuthException.class)
|
||||||
public boolean addUserToGroup(@PathParam("id") String groupId, @FormParam("userId") String userId){
|
public boolean addUserToGroup(@PathParam("id") String groupId, @FormParam("userId") String userId){
|
||||||
|
|
||||||
|
InnerMethodName.instance.set("addUserToGroup");
|
||||||
|
|
||||||
JackrabbitSession session = null;
|
JackrabbitSession session = null;
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
if (!isValidGroupForContext(groupId) && !isInfraManager())
|
||||||
|
throw new UserNotAuthorizedException("only VREManager of the selected VRE can execute this operation");
|
||||||
|
|
||||||
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
||||||
|
@ -167,6 +344,9 @@ public class GroupManager {
|
||||||
Group group = (Group)usrManager.getAuthorizable(groupId);
|
Group group = (Group)usrManager.getAuthorizable(groupId);
|
||||||
User user = (User)usrManager.getAuthorizable(userId);
|
User user = (User)usrManager.getAuthorizable(userId);
|
||||||
|
|
||||||
|
if (group.isMember(user))
|
||||||
|
throw new InvalidCallParameters("user "+userId+" is already member of group "+groupId);
|
||||||
|
|
||||||
success = group.addMember(user);
|
success = group.addMember(user);
|
||||||
|
|
||||||
String folderName = group.getPrincipal().getName();
|
String folderName = group.getPrincipal().getName();
|
||||||
|
@ -177,10 +357,13 @@ public class GroupManager {
|
||||||
session.getWorkspace().clone(session.getWorkspace().getName(), folder.getPath(),userPath , false);
|
session.getWorkspace().clone(session.getWorkspace().getName(), folder.getPath(),userPath , false);
|
||||||
|
|
||||||
session.save();
|
session.save();
|
||||||
}catch(Exception e) {
|
}catch(StorageHubException she ){
|
||||||
log.error("jcr error adding user {} to group {}", userId, groupId, e);
|
log.error(she.getErrorMessage(), she);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
} finally {
|
}catch(RepositoryException re ){
|
||||||
|
log.error("jcr error creating item", re);
|
||||||
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
||||||
|
}finally {
|
||||||
if (session!=null)
|
if (session!=null)
|
||||||
session.logout();
|
session.logout();
|
||||||
}
|
}
|
||||||
|
@ -190,12 +373,18 @@ public class GroupManager {
|
||||||
|
|
||||||
@DELETE
|
@DELETE
|
||||||
@Path("{groupId}/users/{userId}")
|
@Path("{groupId}/users/{userId}")
|
||||||
@AuthorizationControl(allowed={"lucio.lelii"}, exception=MyAuthException.class)
|
@AuthorizationControl(allowedRoles={VREMANAGER_ROLE, INFRASTRUCTURE_MANAGER_ROLE}, exception=MyAuthException.class)
|
||||||
public boolean removeUserFromGroup(@PathParam("groupId") String groupId, @PathParam("userId") String userId){
|
public boolean removeUserFromGroup(@PathParam("groupId") String groupId, @PathParam("userId") String userId){
|
||||||
|
|
||||||
|
InnerMethodName.instance.set("removeUserFromGroup");
|
||||||
|
|
||||||
JackrabbitSession session = null;
|
JackrabbitSession session = null;
|
||||||
boolean success = false;
|
boolean success = false;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
if (!isValidGroupForContext(groupId) && !isInfraManager())
|
||||||
|
throw new UserNotAuthorizedException("only VREManager of the selected VRE can execute this operation");
|
||||||
|
|
||||||
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
||||||
|
@ -203,6 +392,9 @@ public class GroupManager {
|
||||||
Group group = (Group)usrManager.getAuthorizable(groupId);
|
Group group = (Group)usrManager.getAuthorizable(groupId);
|
||||||
User user = (User)usrManager.getAuthorizable(userId);
|
User user = (User)usrManager.getAuthorizable(userId);
|
||||||
|
|
||||||
|
if (!group.isMember(user))
|
||||||
|
throw new InvalidCallParameters("user "+userId+" is not member of group "+groupId);
|
||||||
|
|
||||||
//delete folder on user
|
//delete folder on user
|
||||||
String folderName = group.getPrincipal().getName();
|
String folderName = group.getPrincipal().getName();
|
||||||
Node folder = getVreFolderNode(session, folderName);
|
Node folder = getVreFolderNode(session, folderName);
|
||||||
|
@ -219,9 +411,12 @@ public class GroupManager {
|
||||||
success = group.removeMember(user);
|
success = group.removeMember(user);
|
||||||
|
|
||||||
session.save();
|
session.save();
|
||||||
}catch(Exception e) {
|
}catch(StorageHubException she ){
|
||||||
log.error("jcr error adding user {} to group {}", userId, groupId, e);
|
log.error(she.getErrorMessage(), she);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
|
}catch(RepositoryException re ){
|
||||||
|
log.error("jcr error creating item", re);
|
||||||
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
||||||
} finally {
|
} finally {
|
||||||
if (session!=null)
|
if (session!=null)
|
||||||
session.logout();
|
session.logout();
|
||||||
|
@ -233,12 +428,18 @@ public class GroupManager {
|
||||||
@GET
|
@GET
|
||||||
@Path("{groupId}/users")
|
@Path("{groupId}/users")
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
@AuthorizationControl(allowed={"lucio.lelii"}, exception=MyAuthException.class)
|
@AuthorizationControl(allowedRoles={VREMANAGER_ROLE}, exception=MyAuthException.class)
|
||||||
public List<String> getUsersOfGroup(@PathParam("groupId") String groupId){
|
public List<String> getUsersOfGroup(@PathParam("groupId") String groupId){
|
||||||
|
|
||||||
|
InnerMethodName.instance.set("getUsersOfGroup");
|
||||||
|
|
||||||
JackrabbitSession session = null;
|
JackrabbitSession session = null;
|
||||||
List<String> users = new ArrayList<>();
|
List<String> users = new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
if (!isValidGroupForContext(groupId))
|
||||||
|
throw new UserNotAuthorizedException("only VREManager of the selected VRE can execute this operation");
|
||||||
|
|
||||||
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
||||||
|
@ -253,10 +454,13 @@ public class GroupManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}catch(Exception e) {
|
}catch(StorageHubException she ){
|
||||||
log.error("jcr error getting users of group {}", groupId, e);
|
log.error(she.getErrorMessage(), she);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
} finally {
|
}catch(RepositoryException re ){
|
||||||
|
log.error("jcr error creating item", re);
|
||||||
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
||||||
|
}finally {
|
||||||
if (session!=null)
|
if (session!=null)
|
||||||
session.logout();
|
session.logout();
|
||||||
}
|
}
|
||||||
|
@ -264,7 +468,7 @@ public class GroupManager {
|
||||||
return users;
|
return users;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createVreFolder(String groupId, JackrabbitSession session, AccessType defaultAccessType) throws Exception{
|
private void createVreFolder(String groupId, JackrabbitSession session, AccessType defaultAccessType, String owner ) throws Exception{
|
||||||
|
|
||||||
Node sharedRootNode = session.getNode(Constants.SHARED_FOLDER_PATH);
|
Node sharedRootNode = session.getNode(Constants.SHARED_FOLDER_PATH);
|
||||||
|
|
||||||
|
@ -272,7 +476,7 @@ public class GroupManager {
|
||||||
|
|
||||||
String title = groupId.substring(groupId.lastIndexOf("-")+1);
|
String title = groupId.substring(groupId.lastIndexOf("-")+1);
|
||||||
|
|
||||||
Node folder= Utils.createFolderInternally(session, sharedRootNode, name, "VREFolder for "+groupId, false, AuthorizationProvider.instance.get().getClient().getId(), null);
|
Node folder= Utils.createFolderInternally(session, sharedRootNode, name, "VREFolder for "+groupId, false, owner, null);
|
||||||
folder.setPrimaryType(PrimaryNodeType.NT_WORKSPACE_SHARED_FOLDER);
|
folder.setPrimaryType(PrimaryNodeType.NT_WORKSPACE_SHARED_FOLDER);
|
||||||
folder.setProperty(NodeProperty.IS_VRE_FOLDER.toString(), true);
|
folder.setProperty(NodeProperty.IS_VRE_FOLDER.toString(), true);
|
||||||
folder.setProperty(NodeProperty.TITLE.toString(), name);
|
folder.setProperty(NodeProperty.TITLE.toString(), name);
|
||||||
|
@ -281,25 +485,29 @@ public class GroupManager {
|
||||||
|
|
||||||
AccessControlManager acm = session.getAccessControlManager();
|
AccessControlManager acm = session.getAccessControlManager();
|
||||||
JackrabbitAccessControlList acls = AccessControlUtils.getAccessControlList(acm, folder.getPath());
|
JackrabbitAccessControlList acls = AccessControlUtils.getAccessControlList(acm, folder.getPath());
|
||||||
Privilege[] adminPrivileges = new Privilege[] { acm.privilegeFromName(AccessType.ADMINISTRATOR.getValue()) };
|
|
||||||
|
|
||||||
|
/*Privilege[] adminPrivileges = new Privilege[] { acm.privilegeFromName(AccessType.ADMINISTRATOR.getValue()) };
|
||||||
acls.addAccessControlEntry(AccessControlUtils.getPrincipal(session, AuthorizationProvider.instance.get().getClient().getId()), adminPrivileges );
|
acls.addAccessControlEntry(AccessControlUtils.getPrincipal(session, AuthorizationProvider.instance.get().getClient().getId()), adminPrivileges );
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
Privilege[] usersPrivileges = new Privilege[] { acm.privilegeFromName(defaultAccessType.getValue()) };
|
Privilege[] usersPrivileges = new Privilege[] { acm.privilegeFromName(defaultAccessType.getValue()) };
|
||||||
acls.addAccessControlEntry(AccessControlUtils.getPrincipal(session,groupId), usersPrivileges );
|
acls.addAccessControlEntry(AccessControlUtils.getPrincipal(session,groupId), usersPrivileges );
|
||||||
acm.setPolicy(folder.getPath(), acls);
|
acm.setPolicy(folder.getPath(), acls);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Node getVreFolderNode(JackrabbitSession session, String name) throws InvalidItemException, Exception {
|
private Node getVreFolderNode(JackrabbitSession session, String name) throws InvalidItemException, RepositoryException {
|
||||||
Node sharedRootNode = session.getNode(Constants.SHARED_FOLDER_PATH);
|
Node sharedRootNode = session.getNode(Constants.SHARED_FOLDER_PATH);
|
||||||
|
|
||||||
Node vreFolder = null;
|
Node vreFolder = null;
|
||||||
try {
|
try {
|
||||||
vreFolder = sharedRootNode.getNode(name);
|
vreFolder = sharedRootNode.getNode(name);
|
||||||
}catch (PathNotFoundException e) {
|
}catch (PathNotFoundException e) {
|
||||||
log.debug("is an old HL VRE");
|
log.debug("is an old HL VRE");
|
||||||
}
|
}
|
||||||
|
|
||||||
NodeIterator nodes = sharedRootNode.getNodes();
|
NodeIterator nodes = sharedRootNode.getNodes();
|
||||||
while (nodes.hasNext()) {
|
while (nodes.hasNext()) {
|
||||||
Node node = nodes.nextNode();
|
Node node = nodes.nextNode();
|
||||||
|
@ -313,4 +521,10 @@ public class GroupManager {
|
||||||
return vreFolder;
|
return vreFolder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isValidGroupForContext(String group){
|
||||||
|
String currentContext = ScopeProvider.instance.get();
|
||||||
|
String expectedGroupId= currentContext.replace("/", "-").substring(1);
|
||||||
|
return group.equals(expectedGroupId);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -192,6 +192,7 @@ public class ItemsCreator {
|
||||||
ses.getWorkspace().getLockManager().unlock(destination.getPath());
|
ses.getWorkspace().getLockManager().unlock(destination.getPath());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
log.info("item with id {} correctly created",newNode.getIdentifier());
|
log.info("item with id {} correctly created",newNode.getIdentifier());
|
||||||
toReturn = newNode.getIdentifier();
|
toReturn = newNode.getIdentifier();
|
||||||
}catch(StorageHubException she ){
|
}catch(StorageHubException she ){
|
||||||
|
@ -354,12 +355,13 @@ public class ItemsCreator {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
newNode = item2Node.getNode(destinationNode, item);
|
newNode = item2Node.getNode(destinationNode, item);
|
||||||
|
accountingHandler.createEntryCreate(item.getTitle(), ses, newNode, false);
|
||||||
ses.save();
|
ses.save();
|
||||||
}finally {
|
}finally {
|
||||||
if (withLock) ses.getWorkspace().getLockManager().unlock(destinationNode.getPath());
|
if (withLock) ses.getWorkspace().getLockManager().unlock(destinationNode.getPath());
|
||||||
}
|
}
|
||||||
versionHandler.makeVersionableContent(newNode, ses);
|
versionHandler.makeVersionableContent(newNode, ses);
|
||||||
accountingHandler.createFolderAddObj(name, item.getClass().getSimpleName(), item.getContent().getMimeType(), ses, newNode, false);
|
accountingHandler.createFolderAddObj(name, item.getClass().getSimpleName(), item.getContent().getMimeType(), ses, destinationNode, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
return newNode;
|
return newNode;
|
||||||
|
|
|
@ -250,6 +250,34 @@ public class ItemsManager {
|
||||||
return new ItemList(toReturn);
|
return new ItemList(toReturn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GET
|
||||||
|
@Path("{id}/search")
|
||||||
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
public ItemList searchItems(@QueryParam("showHidden") Boolean showHidden, @QueryParam("exclude") List<String> excludes, @QueryParam("onlyType") String nodeType,@QueryParam("name") String name ){
|
||||||
|
InnerMethodName.instance.set("listById");
|
||||||
|
Session ses = null;
|
||||||
|
List<? extends Item> toReturn = null;
|
||||||
|
try{
|
||||||
|
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
authChecker.checkReadAuthorizationControl(ses, id);
|
||||||
|
toReturn = Utils.serachByNameOnFolder(ses, ses.getNodeByIdentifier(id), excludes, null, showHidden==null?false:showHidden, nodeType!=null ? ClassHandler.instance().get(nodeType) : null, name);
|
||||||
|
}catch (ItemNotFoundException e) {
|
||||||
|
log.error("id {} not found",id,e);
|
||||||
|
GXOutboundErrorResponse.throwException(new IdNotFoundException(id, e), Status.NOT_FOUND);
|
||||||
|
}catch(RepositoryException re){
|
||||||
|
log.error("jcr error getting children", re);
|
||||||
|
GXOutboundErrorResponse.throwException(new BackendGenericError(re));
|
||||||
|
}catch(StorageHubException she ){
|
||||||
|
log.error(she.getErrorMessage(), she);
|
||||||
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
|
}finally{
|
||||||
|
if (ses!=null)
|
||||||
|
ses.logout();
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ItemList(toReturn);
|
||||||
|
}
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("{id}/children/paged")
|
@Path("{id}/children/paged")
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
|
@ -280,7 +308,7 @@ public class ItemsManager {
|
||||||
|
|
||||||
@GET
|
@GET
|
||||||
@Path("publiclink/{id}")
|
@Path("publiclink/{id}")
|
||||||
@AuthorizationControl(allowed={"URIResolver"}, exception=MyAuthException.class)
|
@AuthorizationControl(allowedUsers={"URIResolver"}, exception=MyAuthException.class)
|
||||||
public Response resolvePublicLink() {
|
public Response resolvePublicLink() {
|
||||||
InnerMethodName.instance.set("resolvePubliclink");
|
InnerMethodName.instance.set("resolvePubliclink");
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,8 @@ import java.util.List;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.jcr.Node;
|
import javax.jcr.Node;
|
||||||
import javax.jcr.NodeIterator;
|
import javax.jcr.NodeIterator;
|
||||||
|
import javax.jcr.PathNotFoundException;
|
||||||
|
import javax.jcr.RepositoryException;
|
||||||
import javax.jcr.query.QueryResult;
|
import javax.jcr.query.QueryResult;
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
import javax.ws.rs.Consumes;
|
import javax.ws.rs.Consumes;
|
||||||
|
@ -20,6 +22,7 @@ import javax.ws.rs.PathParam;
|
||||||
import javax.ws.rs.Produces;
|
import javax.ws.rs.Produces;
|
||||||
import javax.ws.rs.core.Context;
|
import javax.ws.rs.core.Context;
|
||||||
import javax.ws.rs.core.MediaType;
|
import javax.ws.rs.core.MediaType;
|
||||||
|
import javax.ws.rs.core.Response;
|
||||||
|
|
||||||
import org.apache.jackrabbit.api.JackrabbitSession;
|
import org.apache.jackrabbit.api.JackrabbitSession;
|
||||||
import org.apache.jackrabbit.api.security.user.Authorizable;
|
import org.apache.jackrabbit.api.security.user.Authorizable;
|
||||||
|
@ -28,22 +31,28 @@ import org.apache.jackrabbit.api.security.user.QueryBuilder;
|
||||||
import org.apache.jackrabbit.api.security.user.User;
|
import org.apache.jackrabbit.api.security.user.User;
|
||||||
import org.apache.jackrabbit.core.security.principal.PrincipalImpl;
|
import org.apache.jackrabbit.core.security.principal.PrincipalImpl;
|
||||||
import org.gcube.common.authorization.control.annotations.AuthorizationControl;
|
import org.gcube.common.authorization.control.annotations.AuthorizationControl;
|
||||||
|
import org.gcube.common.authorization.library.provider.AuthorizationProvider;
|
||||||
import org.gcube.common.gxrest.response.outbound.GXOutboundErrorResponse;
|
import org.gcube.common.gxrest.response.outbound.GXOutboundErrorResponse;
|
||||||
import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
|
import org.gcube.common.storagehub.model.exceptions.BackendGenericError;
|
||||||
|
import org.gcube.common.storagehub.model.exceptions.StorageHubException;
|
||||||
|
import org.gcube.common.storagehub.model.exceptions.UserNotAuthorizedException;
|
||||||
import org.gcube.common.storagehub.model.types.NodeProperty;
|
import org.gcube.common.storagehub.model.types.NodeProperty;
|
||||||
import org.gcube.data.access.storagehub.Constants;
|
import org.gcube.data.access.storagehub.Constants;
|
||||||
import org.gcube.data.access.storagehub.Utils;
|
import org.gcube.data.access.storagehub.Utils;
|
||||||
import org.gcube.data.access.storagehub.exception.MyAuthException;
|
import org.gcube.data.access.storagehub.exception.MyAuthException;
|
||||||
import org.gcube.data.access.storagehub.handlers.CredentialHandler;
|
import org.gcube.data.access.storagehub.handlers.CredentialHandler;
|
||||||
import org.gcube.data.access.storagehub.handlers.UnshareHandler;
|
import org.gcube.data.access.storagehub.handlers.UnshareHandler;
|
||||||
|
import org.gcube.smartgears.utils.InnerMethodName;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@Path("users")
|
@Path("users")
|
||||||
public class UserManager {
|
public class UserManager {
|
||||||
|
|
||||||
|
private static final String INFRASTRUCTURE_MANAGER_ROLE = "Infrastructure-Manager";
|
||||||
|
|
||||||
@Context ServletContext context;
|
@Context ServletContext context;
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(UserManager.class);
|
private static final Logger log = LoggerFactory.getLogger(UserManager.class);
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
|
@ -55,9 +64,10 @@ public class UserManager {
|
||||||
@GET
|
@GET
|
||||||
@Path("")
|
@Path("")
|
||||||
@Produces(MediaType.APPLICATION_JSON)
|
@Produces(MediaType.APPLICATION_JSON)
|
||||||
@AuthorizationControl(allowed={"lucio.lelii"}, exception=MyAuthException.class)
|
|
||||||
public List<String> getUsers(){
|
public List<String> getUsers(){
|
||||||
|
|
||||||
|
InnerMethodName.instance.set("getUsers");
|
||||||
|
|
||||||
JackrabbitSession session = null;
|
JackrabbitSession session = null;
|
||||||
List<String> users= new ArrayList<>();
|
List<String> users= new ArrayList<>();
|
||||||
try {
|
try {
|
||||||
|
@ -89,14 +99,17 @@ public class UserManager {
|
||||||
@POST
|
@POST
|
||||||
@Path("")
|
@Path("")
|
||||||
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
|
||||||
@AuthorizationControl(allowed={"lucio.lelii"}, exception=MyAuthException.class)
|
@AuthorizationControl(allowedRoles={INFRASTRUCTURE_MANAGER_ROLE}, exception=MyAuthException.class)
|
||||||
public String createUser(@FormParam("user") String user, @FormParam("password") String password){
|
public String createUser(@FormParam("user") String user, @FormParam("password") String password){
|
||||||
|
|
||||||
|
InnerMethodName.instance.set("createUser");
|
||||||
|
|
||||||
JackrabbitSession session = null;
|
JackrabbitSession session = null;
|
||||||
String userId = null;
|
String userId = null;
|
||||||
try {
|
try {
|
||||||
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
|
|
||||||
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
||||||
|
|
||||||
User createdUser = usrManager.createUser(user, password);
|
User createdUser = usrManager.createUser(user, password);
|
||||||
|
@ -113,9 +126,12 @@ public class UserManager {
|
||||||
Utils.createFolderInternally(session, workspaceFolder, Constants.VRE_FOLDER_PARENT_NAME, "special folder container of "+user, false, user, null);
|
Utils.createFolderInternally(session, workspaceFolder, Constants.VRE_FOLDER_PARENT_NAME, "special folder container of "+user, false, user, null);
|
||||||
|
|
||||||
session.save();
|
session.save();
|
||||||
}catch(Exception e) {
|
}catch(StorageHubException she ){
|
||||||
log.error("jcr error creating user {}", user, e);
|
log.error(she.getErrorMessage(), she);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
|
}catch(RepositoryException re ){
|
||||||
|
log.error("jcr error creating item", re);
|
||||||
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
||||||
} finally {
|
} finally {
|
||||||
if (session!=null)
|
if (session!=null)
|
||||||
session.logout();
|
session.logout();
|
||||||
|
@ -126,18 +142,21 @@ public class UserManager {
|
||||||
|
|
||||||
|
|
||||||
@DELETE
|
@DELETE
|
||||||
@Path("{id}")
|
@Path("{user}")
|
||||||
@AuthorizationControl(allowed={"lucio.lelii"}, exception=MyAuthException.class)
|
@AuthorizationControl(allowedRoles={INFRASTRUCTURE_MANAGER_ROLE}, exception=MyAuthException.class)
|
||||||
public String deleteUser(@PathParam("id") String id){
|
public String deleteUser(@PathParam("user") String user){
|
||||||
|
|
||||||
|
InnerMethodName.instance.set("deleteUser");
|
||||||
|
|
||||||
JackrabbitSession session = null;
|
JackrabbitSession session = null;
|
||||||
String userId = null;
|
String userId = null;
|
||||||
try {
|
try {
|
||||||
|
|
||||||
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
session = (JackrabbitSession) repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
org.apache.jackrabbit.api.security.user.UserManager usrManager = session.getUserManager();
|
||||||
|
|
||||||
org.gcube.common.storagehub.model.Path path = Utils.getWorkspacePath(id);
|
org.gcube.common.storagehub.model.Path path = Utils.getWorkspacePath(user);
|
||||||
|
|
||||||
|
|
||||||
String sql2Query = String.format("SELECT * FROM [nthl:workspaceSharedItem] AS node WHERE ISDESCENDANTNODE('%s')", path.toPath());
|
String sql2Query = String.format("SELECT * FROM [nthl:workspaceSharedItem] AS node WHERE ISDESCENDANTNODE('%s')", path.toPath());
|
||||||
|
@ -153,18 +172,28 @@ public class UserManager {
|
||||||
Node rNode = nodeIt.nextNode();
|
Node rNode = nodeIt.nextNode();
|
||||||
String title = rNode.hasProperty(NodeProperty.TITLE.toString()) ? rNode.getProperty(NodeProperty.TITLE.toString()).getString():"unknown";
|
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());
|
log.debug("removing sharing for folder name {} with title {} and path {} ",rNode.getName(), title, rNode.getPath());
|
||||||
unshareHandler.unshare(session, Collections.singleton(id), rNode, id);
|
unshareHandler.unshare(session, Collections.singleton(user), rNode, user);
|
||||||
}
|
}
|
||||||
|
|
||||||
Authorizable authorizable = usrManager.getAuthorizable(new PrincipalImpl(id));
|
Authorizable authorizable = usrManager.getAuthorizable(new PrincipalImpl(user));
|
||||||
if (!authorizable.isGroup()) {
|
if (authorizable!=null && !authorizable.isGroup()) {
|
||||||
log.info("removing user {}", id);
|
log.info("removing user {}", user);
|
||||||
authorizable.remove();
|
authorizable.remove();
|
||||||
|
} else log.warn("the user {} was already deleted", user);
|
||||||
|
|
||||||
|
org.gcube.common.storagehub.model.Path homePath = Utils.getHome(user);
|
||||||
|
try {
|
||||||
|
session.getNode(homePath.toPath()).remove();
|
||||||
|
} catch (PathNotFoundException e) {
|
||||||
|
log.warn("{} home dir was already deleted", user);
|
||||||
}
|
}
|
||||||
session.save();
|
session.save();
|
||||||
}catch(Exception e) {
|
}catch(StorageHubException she ){
|
||||||
log.error("jcr error getting users", e);
|
log.error(she.getErrorMessage(), she);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(e));
|
GXOutboundErrorResponse.throwException(she, Response.Status.fromStatusCode(she.getStatus()));
|
||||||
|
}catch(RepositoryException re ){
|
||||||
|
log.error("jcr error creating item", re);
|
||||||
|
GXOutboundErrorResponse.throwException(new BackendGenericError("jcr error creating item", re));
|
||||||
} finally {
|
} finally {
|
||||||
if (session!=null)
|
if (session!=null)
|
||||||
session.logout();
|
session.logout();
|
||||||
|
|
|
@ -136,7 +136,7 @@ public class WorkspaceManager {
|
||||||
return new ItemWrapper<Item>(toReturn);
|
return new ItemWrapper<Item>(toReturn);
|
||||||
}
|
}
|
||||||
|
|
||||||
private synchronized VRE getVreFolderItem(Session ses) throws RepositoryException, BackendGenericError{
|
/*private synchronized VRE getVreFolderItem(Session ses) throws RepositoryException, BackendGenericError{
|
||||||
org.gcube.common.storagehub.model.Path vrePath = Paths.append(Utils.getWorkspacePath(), Constants.VRE_FOLDER_PARENT_NAME);
|
org.gcube.common.storagehub.model.Path vrePath = Paths.append(Utils.getWorkspacePath(), Constants.VRE_FOLDER_PARENT_NAME);
|
||||||
ScopeBean bean = new ScopeBean(ScopeProvider.instance.get());
|
ScopeBean bean = new ScopeBean(ScopeProvider.instance.get());
|
||||||
if (!bean.is(Type.VRE)) throw new BackendGenericError("the current scope is not a VRE");
|
if (!bean.is(Type.VRE)) throw new BackendGenericError("the current scope is not a VRE");
|
||||||
|
@ -155,7 +155,7 @@ public class WorkspaceManager {
|
||||||
return vreManager.putVRE(vreFolder);
|
return vreManager.putVRE(vreFolder);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}*/
|
||||||
|
|
||||||
|
|
||||||
@Path("vrefolder")
|
@Path("vrefolder")
|
||||||
|
@ -167,7 +167,7 @@ public class WorkspaceManager {
|
||||||
Item vreItem = null;
|
Item vreItem = null;
|
||||||
try {
|
try {
|
||||||
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
vreItem = getVreFolderItem(ses).getVreFolder();
|
vreItem = Utils.getVreFolderItem(ses, node2Item, vreManager, excludes).getVreFolder();
|
||||||
}catch(RepositoryException re ){
|
}catch(RepositoryException re ){
|
||||||
log.error("jcr error getting vrefolder", re);
|
log.error("jcr error getting vrefolder", re);
|
||||||
GXOutboundErrorResponse.throwException(new BackendGenericError(re));
|
GXOutboundErrorResponse.throwException(new BackendGenericError(re));
|
||||||
|
@ -192,7 +192,7 @@ public class WorkspaceManager {
|
||||||
String login = AuthorizationProvider.instance.get().getClient().getId();
|
String login = AuthorizationProvider.instance.get().getClient().getId();
|
||||||
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
ses = repository.getRepository().login(CredentialHandler.getAdminCredentials(context));
|
||||||
|
|
||||||
VRE vre = getVreFolderItem(ses);
|
VRE vre = Utils.getVreFolderItem(ses, node2Item, vreManager, excludes);
|
||||||
log.trace("VRE retrieved {}",vre.getVreFolder().getTitle());
|
log.trace("VRE retrieved {}",vre.getVreFolder().getTitle());
|
||||||
recentItems = vre.getRecents();
|
recentItems = vre.getRecents();
|
||||||
log.trace("recents retrieved {}",vre.getVreFolder().getTitle());
|
log.trace("recents retrieved {}",vre.getVreFolder().getTitle());
|
||||||
|
|
|
@ -25,7 +25,7 @@ The projects leading to this software have received funding from a series of
|
||||||
Version
|
Version
|
||||||
--------------------------------------------------
|
--------------------------------------------------
|
||||||
|
|
||||||
1.0.8 (2020-01-22)
|
1.0.9 (2020-01-22)
|
||||||
|
|
||||||
Please see the file named "changelog.xml" in this directory for the release notes.
|
Please see the file named "changelog.xml" in this directory for the release notes.
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<application mode='online'>
|
<application mode='online'>
|
||||||
<name>StorageHub</name>
|
<name>StorageHub</name>
|
||||||
<group>DataAccess</group>
|
<group>DataAccess</group>
|
||||||
<version>1.0.0-SNAPSHOT</version>
|
<version>1.0.9</version>
|
||||||
<description>Storage Hub webapp</description>
|
<description>Storage Hub webapp</description>
|
||||||
<local-persistence location='target' />
|
<local-persistence location='target' />
|
||||||
</application>
|
</application>
|
Loading…
Reference in New Issue