Feature #13497
closedSuppression d'un utilisateur remplacé
100%
Description
Pour la fonctionnalité de remplacement, le but est de faire en sorte de pouvoir continuer le remplacement même si l’utilisateur est en attente de suppression.
Files
Updated by Yohann Chastagnier about 1 month ago
- Status changed from New to In progress...
Updated by Yohann Chastagnier about 1 month ago
- Status changed from In progress... to Resolved
Le travail a porté ici sur les remplacements déjà existants.
Lorsque le remplacement est en vigueur et que le remplacé est un utilisateur en attente de suppression, le remplaçant n'avait plus la possibilité de réaliser les actions dans le workflow pour lesquelles il est en charge.
L'objectif ici était de rendre dans cette situation les actions encore réalisables.
PRs :
Updated by Miguel Moquillon about 1 month ago
- Status changed from Resolved to Integration in progress...
Updated by Miguel Moquillon about 1 month ago
- Si l'utilisateur a été supprimé avant tout remplacement, son remplacement n'est pas possible. Ce point a été précisé ici dans la résolution du problème.
- Dans certaines situations où une action est réalisée en remplacement d'un utilisateur supprimé, une erreur survient lors de la validation de l'action. Cas détecté avec le workflow Ouicare :
- le remplacé supprimé joue le rôle de publieur et il est remplacé dans ce rôle par un autre utilisateur, lui aussi donc publieur,
- le remplaçant exécute l'action de publier une demande approuvée : une erreur survient (message
processManager.ILL_CREATE_FORM
) et l'exception suivante est affichée dans les logs :
023-02-22 14:55:22,969 SEVERE [silverpeas.core.web.mvc.util] (default task-19) org.silverpeas.core.workflow.api.WorkflowException: workflowEngine.EX_ERR_PROCESS_EVENT: org.silverpeas.core.persistence.TransactionRuntimeException: org.silverpeas.core.workflow.api.WorkflowException: workflowEngine.EX_ERR_PROCESS_EVENT
at deployment.silverpeas.war//org.silverpeas.core.persistence.Transaction.perform(Transaction.java:108)
at deployment.silverpeas.war//org.silverpeas.core.persistence.Transaction$Proxy$_$$_WeldSubclass.perform$$super(Unknown Source)
at jdk.internal.reflect.GeneratedMethodAccessor320.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.jboss.weld.core@3.1.9.Final//org.jboss.weld.interceptor.proxy.TerminalAroundInvokeInvocationContext.proceedInternal(TerminalAroundInvokeInvocationContext.java:51)
at org.jboss.weld.core@3.1.9.Final//org.jboss.weld.interceptor.proxy.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:78)
at org.jboss.jts//com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:197)
at org.jboss.jts//com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:185)
at org.jboss.jts//com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorRequired.doIntercept(TransactionalInterceptorRequired.java:53)
at org.jboss.jts//com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorBase.intercept(TransactionalInterceptorBase.java:90)
at org.jboss.jts//com.arjuna.ats.jta.cdi.transactional.TransactionalInterceptorRequired.intercept(TransactionalInterceptorRequired.java:47)
at jdk.internal.reflect.GeneratedMethodAccessor132.invoke(Unknown Source)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.jboss.weld.core@3.1.9.Final//org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:73)
at org.jboss.weld.core@3.1.9.Final//org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeAroundInvoke(InterceptorMethodHandler.java:84)
at org.jboss.weld.core@3.1.9.Final//org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:72)
at org.jboss.weld.core@3.1.9.Final//org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:56)
at org.jboss.weld.core@3.1.9.Final//org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:79)
at org.jboss.weld.core@3.1.9.Final//org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:68)
at deployment.silverpeas.war//org.silverpeas.core.persistence.Transaction$Proxy$_$$_WeldSubclass.perform(Unknown Source)
at deployment.silverpeas.war//org.silverpeas.core.persistence.Transaction.performInOne(Transaction.java:63)
at deployment.silverpeas.war//org.silverpeas.core.workflow.engine.WorkflowEngineImpl.processControls(WorkflowEngineImpl.java:111)
at deployment.silverpeas.war//org.silverpeas.core.workflow.engine.WorkflowEngineImpl.process(WorkflowEngineImpl.java:103)
at deployment.silverpeas.war//org.silverpeas.core.workflow.engine.WorkflowEngineImpl.process(WorkflowEngineImpl.java:78)
at deployment.silverpeas.war//org.silverpeas.processmanager.ProcessManagerSessionController.processAction(ProcessManagerSessionController.java:1245)
at deployment.silverpeas.war//org.silverpeas.processmanager.servlets.ProcessManagerRequestRouter$19.computeDestination(ProcessManagerRequestRouter.java:615)
at deployment.silverpeas.war//org.silverpeas.processmanager.servlets.SessionSafeFunctionHandler.getDestination(SessionSafeFunctionHandler.java:80)
at deployment.silverpeas.war//org.silverpeas.processmanager.servlets.ProcessManagerRequestRouter.getDestination(ProcessManagerRequestRouter.java:1011)
at deployment.silverpeas.war//org.silverpeas.processmanager.servlets.ProcessManagerRequestRouter.getDestination(ProcessManagerRequestRouter.java:71)
at deployment.silverpeas.war//org.silverpeas.core.web.mvc.route.ComponentRequestRouter.computeNextDestination(ComponentRequestRouter.java:263)
at deployment.silverpeas.war//org.silverpeas.core.web.mvc.route.ComponentRequestRouter.computeDestination(ComponentRequestRouter.java:228)
at deployment.silverpeas.war//org.silverpeas.core.web.mvc.route.ComponentRequestRouter.doPost(ComponentRequestRouter.java:161)
at javax.servlet.api@2.0.0.Final//javax.servlet.http.HttpServlet.service(HttpServlet.java:523)
at deployment.silverpeas.war//org.silverpeas.core.web.mvc.webcomponent.SilverpeasHttpServlet.service(SilverpeasHttpServlet.java:58)
at deployment.silverpeas.war//org.silverpeas.core.web.mvc.webcomponent.SilverpeasAuthenticatedHttpServlet.service(SilverpeasAuthenticatedHttpServlet.java:80)
at javax.servlet.api@2.0.0.Final//javax.servlet.http.HttpServlet.service(HttpServlet.java:590)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
at io.undertow.websocket@2.2.19.Final//io.undertow.websockets.jsr.JsrWebSocketFilter.doFilter(JsrWebSocketFilter.java:173)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at deployment.silverpeas.war//org.silverpeas.components.whitepages.filters.ComponentRequestRouterFilter.doFilter(ComponentRequestRouterFilter.java:71)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at deployment.silverpeas.war//org.silverpeas.core.web.filter.MassiveWebSecurityFilter.doFilter(MassiveWebSecurityFilter.java:135)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at deployment.silverpeas.war//org.silverpeas.core.web.filter.WebCORSFilter.doFilter(WebCORSFilter.java:81)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at deployment.silverpeas.war//org.silverpeas.web.filter.InternetExplorerAntiCompatibilityFilter.doFilter(InternetExplorerAntiCompatibilityFilter.java:50)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at deployment.silverpeas.war//org.silverpeas.web.token.SessionSynchronizerTokenValidator.doFilter(SessionSynchronizerTokenValidator.java:95)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at deployment.silverpeas.war//org.silverpeas.core.web.filter.MessageFilter.doFilter(MessageFilter.java:73)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at deployment.silverpeas.war//org.silverpeas.web.filter.SilverpeasExceptionLoggingFilter.doFilter(SilverpeasExceptionLoggingFilter.java:49)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at deployment.silverpeas.war//org.silverpeas.web.filter.ResourceCacheFilter.doFilter(ResourceCacheFilter.java:55)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at deployment.silverpeas.war//org.silverpeas.web.filter.HttpServletRequestDecoration.doFilter(HttpServletRequestDecoration.java:59)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at deployment.silverpeas.war//org.silverpeas.web.filter.CharsetFilter.doFilter(CharsetFilter.java:73)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at org.wildfly.security.elytron-web.undertow-server@1.10.1.Final//org.wildfly.elytron.web.undertow.server.ElytronRunAsHandler.lambda$handleRequest$1(ElytronRunAsHandler.java:68)
at org.wildfly.security.elytron-base@1.19.1.Final//org.wildfly.security.auth.server.FlexibleIdentityAssociation.runAsFunctionEx(FlexibleIdentityAssociation.java:103)
at org.wildfly.security.elytron-base@1.19.1.Final//org.wildfly.security.auth.server.Scoped.runAsFunctionEx(Scoped.java:161)
at org.wildfly.security.elytron-base@1.19.1.Final//org.wildfly.security.auth.server.Scoped.runAs(Scoped.java:73)
at org.wildfly.security.elytron-web.undertow-server@1.10.1.Final//org.wildfly.elytron.web.undertow.server.ElytronRunAsHandler.handleRequest(ElytronRunAsHandler.java:67)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.core@2.2.19.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.core@2.2.19.Final//io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:53)
at io.undertow.core@2.2.19.Final//io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:59)
at io.undertow.core@2.2.19.Final//io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
at org.wildfly.security.elytron-web.undertow-server-servlet@1.10.1.Final//org.wildfly.elytron.web.undertow.server.servlet.CleanUpHandler.handleRequest(CleanUpHandler.java:38)
at io.undertow.core@2.2.19.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow@26.1.2.Final//org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.core@2.2.19.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow@26.1.2.Final//org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)
at io.undertow.core@2.2.19.Final//io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:275)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:79)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:134)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:131)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at org.wildfly.extension.undertow@26.1.2.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1544)
at org.wildfly.extension.undertow@26.1.2.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1544)
at org.wildfly.extension.undertow@26.1.2.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1544)
at org.wildfly.extension.undertow@26.1.2.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1544)
at org.wildfly.extension.undertow@26.1.2.Final//org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1544)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:255)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:79)
at io.undertow.servlet@2.2.19.Final//io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:100)
at io.undertow.core@2.2.19.Final//io.undertow.server.Connectors.executeRootHandler(Connectors.java:387)
at io.undertow.core@2.2.19.Final//io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)
at org.jboss.threads@2.4.0.Final//org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1990)
at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
at org.jboss.threads@2.4.0.Final//org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
at org.jboss.xnio@3.8.7.Final//org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: org.silverpeas.core.workflow.api.WorkflowException: workflowEngine.EX_ERR_PROCESS_EVENT
at deployment.silverpeas.war//org.silverpeas.core.workflow.engine.WorkflowEngineImpl.lambda$processControls$0(WorkflowEngineImpl.java:130)
at deployment.silverpeas.war//org.silverpeas.core.persistence.Transaction.perform(Transaction.java:106)
... 119 more
Updated by Yohann Chastagnier 30 days ago
- File workflow-repl-select-user-group.png workflow-repl-select-user-group.png added
- File workflow-repl-user-panel.png workflow-repl-user-panel.png added
- % Done changed from 0 to 100
Oui en effet, il n'est pas possible de gérer le remplacement d'un utilisateur définitivement supprimé (même si le remplacement d'un tel utilisateur existait avant sa suppression définitive).
Le problème technique remonté par Miguel a été traité.
Quelques améliorations UI ont été apportées pour améliorer le confort d'utilisation :- le composant de sélection d'utilisateurs et/ou de groupes permet de distinguer les utilisateurs supprimés des autres utilisateurs
Précision : les utilisateurs supprimés sont présentés s'ils sont explicitement demandés. C'est le cas, dans le cas de la gestion des remplacements du workflow.
- de même, dans le panneau de sélection des utilisateurs (userpanel), les utilisateurs en attente de suppression sont visuellement identifiable
La précision du point précédent est valable pour ce point également.
Finalement, en termes de gestion et de présentation graphique, il s'est avéré plus simple de permettre de créer des remplacements sur des utilisateurs déjà en attente de suppression que de ne gérer que les remplacements déjà créés pour les utilisateurs dans cet état.
Il est donc maintenant possible de créer le remplacement d'un utilisateur déjà en attente de suppression.
Cela peut d'ailleurs permettre de palier à une situation de blocage où le remplacement d'un utilisateur ne serait pas créé à temps par rapport à sa suppression (en attente).
Updated by Miguel Moquillon 29 days ago
Attention, quand je parlais d'un utilisateur supprimé, je ne parlais pas de "supprimé définitivement" mais plutôt supprimé au sens de retirer et donc en attente de suppression définitive.
Updated by Miguel Moquillon 29 days ago
- Soit l'utilisateur Toto assigné à une tâche
- Celui-ci est remplacé par le superviseur par une autre personne, Titi
- Le compte de Toto est supprimé définitivement
- Titi accède au workflow : parmi les rôles proposés, son remplacement de Toto n'est pas présenté : il ne peut donc accomplir la tâche en remplacement de Toto
Updated by Yohann Chastagnier 29 days ago
Oui, c'est ce que j'indique dans la première phrase de la note #note-5.
La situation d'un remplacement d'un utilisateur en attente de suppression est une situation particulière qu'il faut traiter relativement rapidement avant que la suppression définitive soit effective.
Updated by Miguel Moquillon 29 days ago
- Status changed from Integration in progress... to Closed
Ok. Intégré dans master