2018-11-30 17:49:35 +01:00
package org.gcube.data.access.storagehub.services ;
import java.util.ArrayList ;
2018-12-17 14:55:43 +01:00
import java.util.Collections ;
2021-03-15 11:57:46 +01:00
import java.util.HashSet ;
2018-11-30 17:49:35 +01:00
import java.util.Iterator ;
import java.util.List ;
2021-01-11 18:07:57 +01:00
import java.util.Set ;
2021-03-12 10:24:45 +01:00
import java.util.function.Predicate ;
2021-03-16 00:04:54 +01:00
import java.util.stream.Collectors ;
2018-11-30 17:49:35 +01:00
import javax.jcr.Node ;
2020-01-22 16:41:12 +01:00
import javax.jcr.PathNotFoundException ;
import javax.jcr.RepositoryException ;
2018-11-30 17:49:35 +01:00
import org.apache.jackrabbit.api.JackrabbitSession ;
import org.apache.jackrabbit.api.security.user.Authorizable ;
2021-03-16 00:04:54 +01:00
import org.apache.jackrabbit.api.security.user.Group ;
2018-11-30 17:49:35 +01:00
import org.apache.jackrabbit.api.security.user.Query ;
import org.apache.jackrabbit.api.security.user.QueryBuilder ;
import org.apache.jackrabbit.api.security.user.User ;
2018-12-17 14:55:43 +01:00
import org.apache.jackrabbit.core.security.principal.PrincipalImpl ;
2019-10-09 11:52:48 +02:00
import org.gcube.common.authorization.control.annotations.AuthorizationControl ;
2018-11-30 17:49:35 +01:00
import org.gcube.common.gxrest.response.outbound.GXOutboundErrorResponse ;
2020-03-05 15:39:34 +01:00
import org.gcube.common.storagehub.model.Excludes ;
2022-10-03 17:24:53 +02:00
import org.gcube.common.storagehub.model.Paths ;
2018-11-30 17:49:35 +01:00
import org.gcube.common.storagehub.model.exceptions.BackendGenericError ;
2021-02-08 12:30:58 +01:00
import org.gcube.common.storagehub.model.exceptions.IdNotFoundException ;
2022-10-03 17:24:53 +02:00
import org.gcube.common.storagehub.model.exceptions.InvalidCallParameters ;
2020-01-22 16:41:12 +01:00
import org.gcube.common.storagehub.model.exceptions.StorageHubException ;
2021-03-12 10:24:45 +01:00
import org.gcube.common.storagehub.model.exceptions.UserNotAuthorizedException ;
2020-03-05 15:39:34 +01:00
import org.gcube.common.storagehub.model.items.Item ;
2021-03-12 10:24:45 +01:00
import org.gcube.common.storagehub.model.items.SharedFolder ;
2022-10-03 17:24:53 +02:00
import org.gcube.common.storagehub.model.types.SHUBUser ;
2021-03-12 10:24:45 +01:00
import org.gcube.data.access.storagehub.AuthorizationChecker ;
2018-11-30 17:49:35 +01:00
import org.gcube.data.access.storagehub.Constants ;
2021-03-31 14:49:47 +02:00
import org.gcube.data.access.storagehub.PathUtil ;
2020-03-16 16:55:26 +01:00
import org.gcube.data.access.storagehub.StorageHubAppllicationManager ;
2018-11-30 17:49:35 +01:00
import org.gcube.data.access.storagehub.Utils ;
2021-03-16 00:04:54 +01:00
import org.gcube.data.access.storagehub.handlers.GroupHandler ;
2020-03-05 15:39:34 +01:00
import org.gcube.data.access.storagehub.handlers.TrashHandler ;
2018-12-17 14:55:43 +01:00
import org.gcube.data.access.storagehub.handlers.UnshareHandler ;
2021-04-07 12:38:18 +02:00
import org.gcube.data.access.storagehub.handlers.items.builders.FolderCreationParameters ;
2020-03-16 16:55:26 +01:00
import org.gcube.smartgears.annotations.ManagedBy ;
2020-01-22 16:41:12 +01:00
import org.gcube.smartgears.utils.InnerMethodName ;
2018-11-30 17:49:35 +01:00
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
2023-05-30 10:18:47 +02:00
import com.webcohesion.enunciate.metadata.rs.RequestHeader ;
import com.webcohesion.enunciate.metadata.rs.RequestHeaders ;
2024-03-15 14:26:05 +01:00
import jakarta.inject.Inject ;
import jakarta.servlet.ServletContext ;
import jakarta.ws.rs.Consumes ;
import jakarta.ws.rs.DELETE ;
import jakarta.ws.rs.FormParam ;
import jakarta.ws.rs.GET ;
import jakarta.ws.rs.POST ;
import jakarta.ws.rs.PUT ;
import jakarta.ws.rs.Path ;
import jakarta.ws.rs.PathParam ;
import jakarta.ws.rs.Produces ;
import jakarta.ws.rs.core.Context ;
import jakarta.ws.rs.core.MediaType ;
import jakarta.ws.rs.core.Response ;
2018-11-30 17:49:35 +01:00
@Path ( " users " )
2020-03-16 16:55:26 +01:00
@ManagedBy ( StorageHubAppllicationManager . class )
2023-05-30 10:18:47 +02:00
@RequestHeaders ( {
@RequestHeader ( name = " Authorization " , description = " Bearer token, see https://dev.d4science.org/how-to-access-resources " ) ,
} )
2018-11-30 17:49:35 +01:00
public class UserManager {
2020-01-22 16:41:12 +01:00
private static final String INFRASTRUCTURE_MANAGER_ROLE = " Infrastructure-Manager " ;
2021-03-12 10:24:45 +01:00
2018-11-30 17:49:35 +01:00
@Context ServletContext context ;
2021-03-12 10:24:45 +01:00
2018-11-30 17:49:35 +01:00
private static final Logger log = LoggerFactory . getLogger ( UserManager . class ) ;
2022-06-27 15:34:24 +02:00
RepositoryInitializer repository = StorageHubAppllicationManager . getRepository ( ) ;
2018-11-30 17:49:35 +01:00
2018-12-17 14:55:43 +01:00
@Inject
UnshareHandler unshareHandler ;
2021-03-12 10:24:45 +01:00
2021-04-07 12:38:18 +02:00
@Inject
AuthorizationChecker authChecker ;
2022-10-03 17:24:53 +02:00
2020-03-05 15:39:34 +01:00
@Inject
TrashHandler trashHandler ;
2022-10-03 17:24:53 +02:00
2021-03-16 00:04:54 +01:00
@Inject
GroupHandler groupHandler ;
2022-10-03 17:24:53 +02:00
2021-03-12 10:24:45 +01:00
@Inject
2021-03-31 14:49:47 +02:00
PathUtil pathUtil ;
2023-05-22 11:02:21 +02:00
private List < SHUBUser > retrieveUsers ( ) throws Throwable {
2018-11-30 17:49:35 +01:00
JackrabbitSession session = null ;
2022-10-03 17:24:53 +02:00
List < SHUBUser > users = null ;
2018-11-30 17:49:35 +01:00
try {
2024-03-15 14:26:05 +01:00
session = ( JackrabbitSession ) repository . getRepository ( ) . login ( Constants . JCR_CREDENTIALS ) ;
2018-11-30 17:49:35 +01:00
Iterator < Authorizable > result = session . getUserManager ( ) . findAuthorizables ( new Query ( ) {
@Override
public < T > void build ( QueryBuilder < T > builder ) {
builder . setSelector ( User . class ) ;
}
} ) ;
2022-10-03 17:24:53 +02:00
Set < SHUBUser > usersSet = new HashSet < > ( ) ;
2024-03-15 14:26:05 +01:00
String adminUser = Constants . ADMIN_USER ;
2022-10-03 17:24:53 +02:00
Node homeNode = session . getNode ( " /Home " ) ;
2018-11-30 17:49:35 +01:00
while ( result . hasNext ( ) ) {
Authorizable user = result . next ( ) ;
2018-12-17 14:55:43 +01:00
log . debug ( " user {} found " , user . getPrincipal ( ) . getName ( ) ) ;
2021-03-15 11:57:46 +01:00
if ( user . getPrincipal ( ) . getName ( ) . equals ( adminUser ) ) continue ;
2022-10-03 17:24:53 +02:00
long homeVersion = - 1 ;
try {
Node userHome = homeNode . getNode ( user . getPrincipal ( ) . getName ( ) ) ;
if ( userHome . hasProperty ( Constants . HOME_VERSION_PROP ) )
homeVersion = userHome . getProperty ( Constants . HOME_VERSION_PROP ) . getLong ( ) ;
else homeVersion = 0 ;
2023-05-22 11:02:21 +02:00
usersSet . add ( new SHUBUser ( user . getPrincipal ( ) . getName ( ) , homeVersion ) ) ;
2022-10-03 17:24:53 +02:00
} catch ( Exception e ) {
2023-05-22 11:02:21 +02:00
log . warn ( " error retrieving user {} home " , user . getPrincipal ( ) . getName ( ) ) ;
2022-10-03 17:24:53 +02:00
}
2023-05-22 11:02:21 +02:00
2018-11-30 17:49:35 +01:00
}
2022-10-03 17:24:53 +02:00
2021-03-15 11:57:46 +01:00
users = new ArrayList < > ( usersSet ) ;
Collections . sort ( users ) ;
2022-10-03 17:24:53 +02:00
2018-11-30 17:49:35 +01:00
} finally {
if ( session ! = null )
session . logout ( ) ;
}
return users ;
}
2023-05-22 11:02:21 +02:00
@GET
@Path ( " " )
@Produces ( MediaType . APPLICATION_JSON )
public List < SHUBUser > getUsers ( ) {
2024-03-15 14:26:05 +01:00
InnerMethodName . set ( " getUsers " ) ;
2023-05-22 11:02:21 +02:00
try {
return retrieveUsers ( ) ;
} catch ( Throwable e ) {
log . error ( " jcr error getting users " , e ) ;
GXOutboundErrorResponse . throwException ( new BackendGenericError ( e ) ) ;
}
return null ;
}
2018-11-30 17:49:35 +01:00
2023-05-22 11:02:21 +02:00
2021-02-08 12:30:58 +01:00
@GET
@Path ( " {user} " )
2022-10-03 17:24:53 +02:00
public SHUBUser getUser ( @PathParam ( " user " ) String user ) {
2021-03-12 10:24:45 +01:00
2024-03-15 14:26:05 +01:00
InnerMethodName . set ( " getUser " ) ;
2021-03-12 10:24:45 +01:00
2021-02-08 12:30:58 +01:00
JackrabbitSession session = null ;
try {
2024-03-15 14:26:05 +01:00
session = ( JackrabbitSession ) repository . getRepository ( ) . login ( Constants . JCR_CREDENTIALS ) ;
2021-02-08 12:30:58 +01:00
org . apache . jackrabbit . api . security . user . UserManager usrManager = session . getUserManager ( ) ;
Authorizable authorizable = usrManager . getAuthorizable ( user ) ;
2021-03-12 10:24:45 +01:00
2022-10-03 17:24:53 +02:00
if ( authorizable ! = null & & ! authorizable . isGroup ( ) ) {
long homeVersion = - 1 ;
try {
Node homeNode = session . getNode ( " /Home " ) ;
Node userHome = homeNode . getNode ( authorizable . getPrincipal ( ) . getName ( ) ) ;
if ( userHome . hasProperty ( Constants . HOME_VERSION_PROP ) )
homeVersion = userHome . getProperty ( Constants . HOME_VERSION_PROP ) . getLong ( ) ;
else homeVersion = 0 ;
} catch ( Exception e ) {
log . warn ( " error retrieving user {} home " , authorizable . getPrincipal ( ) . getName ( ) , e ) ;
}
2021-03-12 10:24:45 +01:00
2022-10-03 17:24:53 +02:00
return new SHUBUser ( authorizable . getPrincipal ( ) . getName ( ) , homeVersion ) ;
}
2021-02-08 12:30:58 +01:00
log . debug ( " user {} not found " , user ) ;
2021-03-12 10:24:45 +01:00
2021-02-08 12:30:58 +01:00
} catch ( Exception e ) {
log . error ( " jcr error getting user " , e ) ;
GXOutboundErrorResponse . throwException ( new BackendGenericError ( e ) ) ;
} finally {
if ( session ! = null )
session . logout ( ) ;
}
2021-03-12 10:24:45 +01:00
2021-02-08 12:30:58 +01:00
GXOutboundErrorResponse . throwException ( new IdNotFoundException ( user ) ) ;
2021-03-12 10:24:45 +01:00
2021-02-08 12:30:58 +01:00
return null ;
}
2021-03-12 10:24:45 +01:00
2018-11-30 17:49:35 +01:00
@POST
@Path ( " " )
2019-04-11 18:30:43 +02:00
@Consumes ( MediaType . APPLICATION_FORM_URLENCODED )
2024-03-15 14:26:05 +01:00
@AuthorizationControl ( allowedRoles = { INFRASTRUCTURE_MANAGER_ROLE } )
2019-04-11 18:30:43 +02:00
public String createUser ( @FormParam ( " user " ) String user , @FormParam ( " password " ) String password ) {
2021-03-12 10:24:45 +01:00
2024-03-15 14:26:05 +01:00
InnerMethodName . set ( " createUser " ) ;
2021-03-12 10:24:45 +01:00
2018-11-30 17:49:35 +01:00
JackrabbitSession session = null ;
String userId = null ;
try {
2024-03-15 14:26:05 +01:00
session = ( JackrabbitSession ) repository . getRepository ( ) . login ( Constants . JCR_CREDENTIALS ) ;
2021-03-12 10:24:45 +01:00
2018-11-30 17:49:35 +01:00
org . apache . jackrabbit . api . security . user . UserManager usrManager = session . getUserManager ( ) ;
User createdUser = usrManager . createUser ( user , password ) ;
2022-10-03 17:24:53 +02:00
2018-11-30 17:49:35 +01:00
userId = createdUser . getID ( ) ;
2019-03-26 17:09:26 +01:00
2018-11-30 17:49:35 +01:00
Node homeNode = session . getNode ( " /Home " ) ;
Node userHome = homeNode . addNode ( user , " nthl:home " ) ;
2022-10-03 17:24:53 +02:00
2021-04-07 12:38:18 +02:00
userHome . setProperty ( Constants . HOME_VERSION_PROP , 1l ) ;
2022-10-03 17:24:53 +02:00
2018-12-17 14:55:43 +01:00
//creating workspace folder
2021-04-07 12:38:18 +02:00
FolderCreationParameters wsFolderParameters = FolderCreationParameters . builder ( ) . name ( Constants . WORKSPACE_ROOT_FOLDER_NAME ) . description ( " workspace of " + user ) . author ( user ) . on ( userHome . getIdentifier ( ) ) . with ( session ) . build ( ) ;
2022-03-28 18:27:18 +02:00
Utils . createFolderInternally ( wsFolderParameters , null , true ) ;
2018-12-17 14:55:43 +01:00
//creating thrash folder
2021-04-07 12:38:18 +02:00
FolderCreationParameters trashFolderParameters = FolderCreationParameters . builder ( ) . name ( Constants . TRASH_ROOT_FOLDER_NAME ) . description ( " trash of " + user ) . author ( user ) . on ( userHome . getIdentifier ( ) ) . with ( session ) . build ( ) ;
2022-03-28 18:27:18 +02:00
Utils . createFolderInternally ( trashFolderParameters , null , true ) ;
2018-12-17 14:55:43 +01:00
//creating Vre container folder
2021-04-07 12:38:18 +02:00
FolderCreationParameters vreFolderParameters = FolderCreationParameters . builder ( ) . name ( Constants . PERSONAL_VRES_FOLDER_PARENT_NAME ) . description ( " vre folder container of " + user ) . author ( user ) . on ( userHome . getIdentifier ( ) ) . with ( session ) . build ( ) ;
2022-03-28 18:27:18 +02:00
Utils . createFolderInternally ( vreFolderParameters , null , true ) ;
2022-10-03 17:24:53 +02:00
//creating inbox folder
FolderCreationParameters inboxFolderParameters = FolderCreationParameters . builder ( ) . name ( Constants . INBOX_FOLDER_NAME ) . description ( " inbox of " + user ) . author ( user ) . on ( userHome . getIdentifier ( ) ) . with ( session ) . build ( ) ;
Utils . createFolderInternally ( inboxFolderParameters , null , true ) ;
//creating outbox folder
FolderCreationParameters outboxFolderParameters = FolderCreationParameters . builder ( ) . name ( Constants . OUTBOX_FOLDER_NAME ) . description ( " outbox of " + user ) . author ( user ) . on ( userHome . getIdentifier ( ) ) . with ( session ) . build ( ) ;
Utils . createFolderInternally ( outboxFolderParameters , null , true ) ;
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 ( ) ;
}
return userId ;
}
@PUT
@Path ( " {user} " )
@Consumes ( MediaType . APPLICATION_FORM_URLENCODED )
2024-03-15 14:26:05 +01:00
@AuthorizationControl ( allowedRoles = { INFRASTRUCTURE_MANAGER_ROLE } )
2022-10-03 17:24:53 +02:00
public String updateHomeUserToLatestVersion ( @PathParam ( " user " ) String user ) {
2024-03-15 14:26:05 +01:00
InnerMethodName . set ( " updateHomeUserToLatestVersion " ) ;
2022-10-03 17:24:53 +02:00
JackrabbitSession session = null ;
String userId = null ;
try {
2024-03-15 14:26:05 +01:00
session = ( JackrabbitSession ) repository . getRepository ( ) . login ( Constants . JCR_CREDENTIALS ) ;
2022-10-03 17:24:53 +02:00
org . apache . jackrabbit . api . security . user . UserManager usrManager = session . getUserManager ( ) ;
Authorizable auth = usrManager . getAuthorizable ( user ) ;
if ( auth = = null | | auth . isGroup ( ) )
throw new InvalidCallParameters ( " invalid user passed " ) ;
Node homeNode = session . getNode ( " /Home " ) ;
Node userHome = homeNode . getNode ( user ) ;
2022-10-04 13:44:04 +02:00
if ( userHome = = null )
throw new BackendGenericError ( " home for user {} not found " ) ;
2022-10-03 17:24:53 +02:00
/ *
//creating workspace folder
FolderCreationParameters wsFolderParameters = FolderCreationParameters . builder ( ) . name ( Constants . WORKSPACE_ROOT_FOLDER_NAME ) . description ( " workspace of " + user ) . author ( user ) . on ( userHome . getIdentifier ( ) ) . with ( session ) . build ( ) ;
Utils . createFolderInternally ( wsFolderParameters , null , true ) ;
* /
//updating thrash folder
if ( ! userHome . hasProperty ( Constants . HOME_VERSION_PROP ) | | userHome . getProperty ( Constants . HOME_VERSION_PROP ) . getLong ( ) < 1 ) {
org . gcube . common . storagehub . model . Path workspacePath = Paths . append ( Paths . getPath ( userHome . getPath ( ) ) , Constants . WORKSPACE_ROOT_FOLDER_NAME ) ;
Boolean oldTrashExists = session . nodeExists ( Paths . append ( workspacePath , Constants . TRASH_ROOT_FOLDER_NAME ) . toPath ( ) ) ;
if ( oldTrashExists )
2022-10-04 13:44:04 +02:00
session . move ( Paths . append ( workspacePath , Constants . TRASH_ROOT_FOLDER_NAME ) . toPath ( ) , Paths . append ( Paths . getPath ( userHome . getPath ( ) ) , Constants . TRASH_ROOT_FOLDER_NAME ) . toPath ( ) ) ;
2022-10-03 17:24:53 +02:00
else {
FolderCreationParameters trashFolderParameters = FolderCreationParameters . builder ( ) . name ( Constants . TRASH_ROOT_FOLDER_NAME ) . description ( " trash of " + user ) . author ( user ) . on ( userHome . getIdentifier ( ) ) . with ( session ) . build ( ) ;
Utils . createFolderInternally ( trashFolderParameters , null , true ) ;
}
Boolean oldVresExists = session . nodeExists ( Paths . append ( workspacePath , Constants . OLD_VRE_FOLDER_PARENT_NAME ) . toPath ( ) ) ;
if ( oldVresExists )
2022-10-04 13:44:04 +02:00
session . move ( Paths . append ( workspacePath , Constants . OLD_VRE_FOLDER_PARENT_NAME ) . toPath ( ) , Paths . append ( Paths . getPath ( userHome . getPath ( ) ) , Constants . PERSONAL_VRES_FOLDER_PARENT_NAME ) . toPath ( ) ) ;
2022-10-03 17:24:53 +02:00
else {
//creating Vre container folder
FolderCreationParameters vreFolderParameters = FolderCreationParameters . builder ( ) . name ( Constants . PERSONAL_VRES_FOLDER_PARENT_NAME ) . description ( " vre folder container of " + user ) . author ( user ) . on ( userHome . getIdentifier ( ) ) . with ( session ) . build ( ) ;
Utils . createFolderInternally ( vreFolderParameters , null , true ) ;
}
}
/ *
2021-05-04 11:42:02 +02:00
//creating inbox folder
FolderCreationParameters inboxFolderParameters = FolderCreationParameters . builder ( ) . name ( Constants . INBOX_FOLDER_NAME ) . description ( " inbox of " + user ) . author ( user ) . on ( userHome . getIdentifier ( ) ) . with ( session ) . build ( ) ;
2022-03-28 18:27:18 +02:00
Utils . createFolderInternally ( inboxFolderParameters , null , true ) ;
2022-10-03 17:24:53 +02:00
2021-05-04 11:42:02 +02:00
//creating outbox folder
FolderCreationParameters outboxFolderParameters = FolderCreationParameters . builder ( ) . name ( Constants . OUTBOX_FOLDER_NAME ) . description ( " outbox of " + user ) . author ( user ) . on ( userHome . getIdentifier ( ) ) . with ( session ) . build ( ) ;
2022-03-28 18:27:18 +02:00
Utils . createFolderInternally ( outboxFolderParameters , null , true ) ;
2022-10-03 17:24:53 +02:00
* /
userHome . setProperty ( Constants . HOME_VERSION_PROP , 1l ) ;
2018-11-30 17:49:35 +01:00
session . save ( ) ;
2020-01-22 16:41:12 +01:00
} 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 ) ) ;
2018-11-30 17:49:35 +01:00
} finally {
if ( session ! = null )
session . logout ( ) ;
}
2019-03-26 17:09:26 +01:00
2018-11-30 17:49:35 +01:00
return userId ;
}
2019-03-26 17:09:26 +01:00
2018-11-30 17:49:35 +01:00
@DELETE
2020-01-22 16:41:12 +01:00
@Path ( " {user} " )
2024-03-15 14:26:05 +01:00
@AuthorizationControl ( allowedRoles = { INFRASTRUCTURE_MANAGER_ROLE } )
2021-03-12 10:24:45 +01:00
public String deleteUser ( @PathParam ( " user " ) final String user ) {
2024-03-15 14:26:05 +01:00
InnerMethodName . set ( " deleteUser " ) ;
2021-03-12 10:24:45 +01:00
2018-11-30 17:49:35 +01:00
JackrabbitSession session = null ;
try {
2021-03-12 10:24:45 +01:00
2024-03-15 14:26:05 +01:00
session = ( JackrabbitSession ) repository . getRepository ( ) . login ( Constants . JCR_CREDENTIALS ) ;
2018-11-30 17:49:35 +01:00
org . apache . jackrabbit . api . security . user . UserManager usrManager = session . getUserManager ( ) ;
2019-03-26 17:09:26 +01:00
2021-03-16 00:04:54 +01:00
User authorizable = ( User ) usrManager . getAuthorizable ( new PrincipalImpl ( user ) ) ;
2022-10-03 17:24:53 +02:00
2021-03-16 00:04:54 +01:00
if ( authorizable ! = null )
removeUserFromBelongingGroup ( session , authorizable , usrManager ) ;
else log . warn ( " user was already deleted from jackrabbit, trying to delete folders " ) ;
2022-10-03 17:24:53 +02:00
2021-03-16 00:04:54 +01:00
unshareUsersFolders ( session , user ) ;
2018-11-30 17:49:35 +01:00
2021-03-16 00:04:54 +01:00
removeUserHomeAndDeleteFiles ( session , user ) ;
2022-10-03 17:24:53 +02:00
2021-03-16 00:04:54 +01:00
//FINALIZE user removal
2021-03-15 16:01:14 +01:00
if ( authorizable ! = null & & ! authorizable . isGroup ( ) ) {
log . info ( " removing user {} " , user ) ;
authorizable . remove ( ) ;
2021-03-16 00:04:54 +01:00
} else log . warn ( " the user {} was already deleted, it should never happen " , user ) ;
2022-10-03 17:24:53 +02:00
2018-11-30 17:49:35 +01:00
session . save ( ) ;
2020-01-22 16:41:12 +01:00
} 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 ) ) ;
2018-11-30 17:49:35 +01:00
} finally {
if ( session ! = null )
session . logout ( ) ;
}
2019-03-26 17:09:26 +01:00
2021-03-16 00:04:54 +01:00
return user ;
}
2023-05-14 12:57:32 +02:00
@GET
@Path ( " {user}/groups " )
@Produces ( MediaType . APPLICATION_JSON )
public List < String > getGroupsPerUser ( @PathParam ( " user " ) final String user ) {
2024-03-15 14:26:05 +01:00
InnerMethodName . set ( " getGroupsPerUser " ) ;
2023-05-14 12:57:32 +02:00
JackrabbitSession session = null ;
List < String > groups = new ArrayList < > ( ) ;
try {
2024-03-15 14:26:05 +01:00
session = ( JackrabbitSession ) repository . getRepository ( ) . login ( Constants . JCR_CREDENTIALS ) ;
2023-05-14 12:57:32 +02:00
org . apache . jackrabbit . api . security . user . UserManager usrManager = session . getUserManager ( ) ;
User authUser = ( User ) usrManager . getAuthorizable ( new PrincipalImpl ( user ) ) ;
Iterator < Group > groupsAuth = authUser . memberOf ( ) ;
while ( groupsAuth . hasNext ( ) ) {
Authorizable group = groupsAuth . next ( ) ;
groups . add ( group . getPrincipal ( ) . getName ( ) ) ;
}
} 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 groups ;
}
2021-03-16 00:04:54 +01:00
private void removeUserFromBelongingGroup ( JackrabbitSession session , User authorizable , org . apache . jackrabbit . api . security . user . UserManager usrManager ) throws RepositoryException , StorageHubException {
Iterator < Authorizable > groups = session . getUserManager ( ) . findAuthorizables ( new Query ( ) {
@Override
public < T > void build ( QueryBuilder < T > builder ) {
builder . setSelector ( Group . class ) ;
}
} ) ;
2022-10-03 17:24:53 +02:00
2021-03-16 00:04:54 +01:00
String user = authorizable . getPrincipal ( ) . getName ( ) ;
while ( groups . hasNext ( ) ) {
Authorizable group = groups . next ( ) ;
log . info ( " group found {} " , group . getPrincipal ( ) . getName ( ) ) ;
if ( group . isGroup ( ) & & ( ( Group ) group ) . isMember ( authorizable ) ) {
2022-10-03 17:24:53 +02:00
2021-03-16 00:04:54 +01:00
boolean success = groupHandler . removeUserFromGroup ( group . getPrincipal ( ) . getName ( ) , user , session ) ;
log . warn ( " user {} {} removed from vre {} " , user , success ? " " : " not " , group . getPrincipal ( ) . getName ( ) ) ;
}
}
}
2022-10-03 17:24:53 +02:00
2021-03-16 00:04:54 +01:00
private void unshareUsersFolders ( JackrabbitSession session , String user ) {
try {
Node sharedFolderNode = session . getNode ( Constants . SHARED_FOLDER_PATH ) ;
2022-10-03 17:24:53 +02:00
2021-03-16 00:04:54 +01:00
Predicate < Node > sharedWithUserChecker = new Predicate < Node > ( ) {
@Override
public boolean test ( Node t ) {
try {
2021-04-07 12:38:18 +02:00
authChecker . checkReadAuthorizationControl ( t . getSession ( ) , user , t . getIdentifier ( ) ) ;
2021-03-16 00:04:54 +01:00
return true ;
} catch ( UserNotAuthorizedException | BackendGenericError | RepositoryException e ) {
return false ;
}
}
} ;
2022-10-03 17:24:53 +02:00
2021-03-16 00:04:54 +01:00
List < SharedFolder > items = Utils . getItemList ( sharedWithUserChecker , sharedFolderNode , Excludes . ALL , null , false , SharedFolder . class ) ;
2022-10-03 17:24:53 +02:00
2021-03-16 00:04:54 +01:00
log . debug ( " Shared folder to unshare found are {} " , items . size ( ) ) ;
2022-10-03 17:24:53 +02:00
2021-03-16 00:04:54 +01:00
for ( SharedFolder item : items ) {
String title = item . getTitle ( ) ;
log . debug ( " in list folder name {} with title {} and path {} " , item . getName ( ) , title , item . getPath ( ) ) ;
if ( item . isPublicItem ( ) & & ! item . getUsers ( ) . getMap ( ) . containsKey ( user ) ) continue ;
if ( item . isVreFolder ( ) ) continue ;
2022-10-03 17:24:53 +02:00
2021-03-16 00:04:54 +01:00
log . info ( " removing sharing for folder name {} with title {} and path {} " , item . getName ( ) , title , item . getPath ( ) ) ;
String owner = item . getOwner ( ) ;
2022-10-03 17:24:53 +02:00
2021-03-16 00:04:54 +01:00
Set < String > usersToUnshare = owner . equals ( user ) ? Collections . emptySet ( ) : Collections . singleton ( user ) ;
try {
unshareHandler . unshareForRemoval ( session , usersToUnshare , session . getNodeByIdentifier ( item . getId ( ) ) , user ) ;
} catch ( Throwable e ) {
log . warn ( " error unsharing folder with title '{}' and id {} " , title , item . getId ( ) , e ) ;
}
}
} catch ( Throwable t ) {
log . warn ( " error getting folder shared with {} " , user , t ) ;
}
2018-11-30 17:49:35 +01:00
}
2021-03-16 00:04:54 +01:00
private void removeUserHomeAndDeleteFiles ( JackrabbitSession session , String user ) throws RepositoryException , StorageHubException {
2021-03-31 14:49:47 +02:00
org . gcube . common . storagehub . model . Path homePath = pathUtil . getHome ( user ) ;
org . gcube . common . storagehub . model . Path workspacePath = pathUtil . getWorkspacePath ( user ) ;
2022-11-16 17:50:00 +01:00
2022-10-03 17:24:53 +02:00
2021-03-16 00:04:54 +01:00
try {
Node workspaceNode = session . getNode ( workspacePath . toPath ( ) ) ;
List < Item > workspaceItems = Utils . getItemList ( workspaceNode , Excludes . GET_ONLY_CONTENT , null , true , null ) . stream ( ) . filter ( i - > ! i . isShared ( ) ) . collect ( Collectors . toList ( ) ) ;
trashHandler . removeOnlyNodesContent ( session , workspaceItems ) ;
2021-03-16 13:03:27 +01:00
} catch ( PathNotFoundException e ) {
log . warn ( " {} workspace dir {} was already deleted " , user , homePath . toPath ( ) ) ;
}
2022-10-03 17:24:53 +02:00
2021-03-16 13:03:27 +01:00
try {
2022-11-16 17:50:00 +01:00
org . gcube . common . storagehub . model . Path trashPath = pathUtil . getTrashPath ( user , session ) ;
2021-03-16 13:03:27 +01:00
Node trashNode = session . getNode ( trashPath . toPath ( ) ) ;
List < Item > trashItems = Utils . getItemList ( trashNode , Excludes . ALL , null , true , null ) ;
trashHandler . removeOnlyNodesContent ( session , trashItems ) ;
} catch ( PathNotFoundException e ) {
log . warn ( " {} trash dir {} was already deleted " , user , homePath . toPath ( ) ) ;
}
2022-10-03 17:24:53 +02:00
2021-03-16 13:03:27 +01:00
try {
Node homeNode = session . getNode ( homePath . toPath ( ) ) ;
2021-03-16 00:04:54 +01:00
homeNode . remove ( ) ;
} catch ( PathNotFoundException e ) {
2021-03-16 13:03:27 +01:00
log . warn ( " {} home dir {} was already deleted " , user , homePath . toPath ( ) ) ;
2021-03-16 00:04:54 +01:00
}
}
2022-10-03 17:24:53 +02:00
2018-11-30 17:49:35 +01:00
}