You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2021/06/24 06:22:53 UTC

[isis] 01/01: ISIS-2764: makes stop impersonating available always

This is an automated email from the ASF dual-hosted git repository.

danhaywood pushed a commit to branch ISIS-2764
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 8ad64408832a0d92b2fd96b7a7832dba355db453
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Thu Jun 24 07:22:32 2021 +0100

    ISIS-2764: makes stop impersonating available always
---
 .../modules/fun/pages/ui/menubars-layout.adoc      |  2 +-
 .../org/apache/isis/applib/IsisModuleApplib.java   |  2 +
 .../isis/applib/services/user/ImpersonateMenu.java | 30 ---------
 .../applib/services/user/ImpersonateStopMenu.java  | 77 ++++++++++++++++++++++
 .../applib/mixins/Object_stopImpersonating.java    | 15 ++---
 5 files changed, 86 insertions(+), 40 deletions(-)

diff --git a/antora/components/userguide/modules/fun/pages/ui/menubars-layout.adoc b/antora/components/userguide/modules/fun/pages/ui/menubars-layout.adoc
index a164220..b0c773f 100644
--- a/antora/components/userguide/modules/fun/pages/ui/menubars-layout.adoc
+++ b/antora/components/userguide/modules/fun/pages/ui/menubars-layout.adoc
@@ -247,7 +247,7 @@ You can use `menubars.layout.xml` to arrange these as you see fit, though our re
             <mb3:named>Impersonate</mb3:named>
             <mb3:serviceAction objectType="isis.sudo.ImpersonateMenu" id="impersonate"/>
             <mb3:serviceAction objectType="isis.sudo.ImpersonateMenu" id="impersonateWithRoles"/>
-            <mb3:serviceAction objectType="isis.sudo.ImpersonateMenu" id="stopImpersonating"/>
+            <mb3:serviceAction objectType="isis.applib.ImpersonateStopMenu" id="stopImpersonating"/>
         </mb3:section>
         <mb3:section>
             <mb3:serviceAction objectType="isis.security.LogoutMenu" id="logout"/>
diff --git a/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java b/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
index 7072ebf..9f0fd67 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/IsisModuleApplib.java
@@ -55,6 +55,7 @@ import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
 import org.apache.isis.applib.services.session.SessionLoggingServiceLogging;
 import org.apache.isis.applib.services.sudo.SudoService;
 import org.apache.isis.applib.services.user.ImpersonateMenu;
+import org.apache.isis.applib.services.user.ImpersonateStopMenu;
 import org.apache.isis.applib.services.user.RoleMemento;
 import org.apache.isis.applib.services.user.UserMemento;
 import org.apache.isis.applib.services.user.UserService;
@@ -100,6 +101,7 @@ import org.apache.isis.schema.IsisModuleSchema;
         ConfigurationMenu.class,
         LayoutServiceMenu.class,
         ImpersonateMenu.class,
+        ImpersonateStopMenu.class,
         MetaModelServiceMenu.class,
         QueryResultsCache.class,
         UserService.class,
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/user/ImpersonateMenu.java b/api/applib/src/main/java/org/apache/isis/applib/services/user/ImpersonateMenu.java
index 82b2141..360fe3a 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/user/ImpersonateMenu.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/user/ImpersonateMenu.java
@@ -10,21 +10,15 @@ import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.DomainServiceLayout;
-import org.apache.isis.applib.annotation.LabelPosition;
 import org.apache.isis.applib.annotation.MemberSupport;
 import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.annotation.Parameter;
-import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.PriorityPrecedence;
 import org.apache.isis.applib.annotation.Publishing;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
-import org.apache.isis.applib.annotation.Value;
 import org.apache.isis.applib.services.message.MessageService;
 
 import lombok.RequiredArgsConstructor;
-import lombok.val;
-import lombok.experimental.Accessors;
 
 /**
  * Provides the UI to allow a current user to be impersonated.
@@ -150,28 +144,4 @@ public class ImpersonateMenu {
     }
 
 
-
-
-
-    public static class StopImpersonatingDomainEvent extends ActionDomainEvent { }
-
-    @Action(
-            domainEvent = ImpersonateMenu.StopImpersonatingDomainEvent.class,
-            semantics = SemanticsOf.IDEMPOTENT,
-            commandPublishing = Publishing.DISABLED,
-            executionPublishing = Publishing.DISABLED,
-            restrictTo = RestrictTo.PROTOTYPING
-    )
-    @ActionLayout(sequence = "100.3")
-    public void stopImpersonating() {
-        this.userService.stopImpersonating();
-        this.messageService.informUser("No longer impersonating another user");
-    }
-    public boolean hideStopImpersonating() {
-        return ! this.userService.supportsImpersonation();
-    }
-    public String disableStopImpersonating() {
-        return ! this.userService.isImpersonating() ? "no user is currently being impersonated": null;
-    }
-
 }
diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/user/ImpersonateStopMenu.java b/api/applib/src/main/java/org/apache/isis/applib/services/user/ImpersonateStopMenu.java
new file mode 100644
index 0000000..f963b00
--- /dev/null
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/user/ImpersonateStopMenu.java
@@ -0,0 +1,77 @@
+package org.apache.isis.applib.services.user;
+
+import javax.inject.Inject;
+
+import org.apache.isis.applib.IsisModuleApplib;
+import org.apache.isis.applib.annotation.Action;
+import org.apache.isis.applib.annotation.ActionLayout;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.DomainServiceLayout;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.annotation.PriorityPrecedence;
+import org.apache.isis.applib.annotation.Publishing;
+import org.apache.isis.applib.annotation.RestrictTo;
+import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.applib.services.message.MessageService;
+
+import lombok.RequiredArgsConstructor;
+
+/**
+ * Provides the UI to allow a current user to be impersonated.
+ *
+ * <p>
+ *     All of the actions provided here are restricted to PROTOTYPE mode only;
+ *     this feature is <i>not</i> intended for production use as it would imply
+ *     a large security hole !
+ * </p>
+ *
+ * @see UserService
+ * @see ImpersonateMenuAdvisor
+ * @see ImpersonatedUserHolder
+ *
+ * @since 2.0 {@index}
+ */
+@DomainService(
+        nature = NatureOfService.VIEW,
+        logicalTypeName = ImpersonateStopMenu.LOGICAL_TYPE_NAME
+)
+@DomainServiceLayout(
+        named = "Security",
+        menuBar = DomainServiceLayout.MenuBar.TERTIARY
+)
+@javax.annotation.Priority(PriorityPrecedence.EARLY)
+@RequiredArgsConstructor(onConstructor_ = {@Inject})
+public class ImpersonateStopMenu {
+
+    public static final String LOGICAL_TYPE_NAME = IsisModuleApplib.NAMESPACE + ".ImpersonateStopMenu";   // deliberately IS part of isis.applib
+
+    final UserService userService;
+    final MessageService messageService;
+
+
+    public static abstract class ActionDomainEvent extends IsisModuleApplib.ActionDomainEvent<ImpersonateStopMenu> {}
+
+
+    public static class StopImpersonatingDomainEvent extends ActionDomainEvent { }
+
+    @Action(
+            domainEvent = ImpersonateStopMenu.StopImpersonatingDomainEvent.class,
+            semantics = SemanticsOf.IDEMPOTENT,
+            commandPublishing = Publishing.DISABLED,
+            executionPublishing = Publishing.DISABLED,
+            restrictTo = RestrictTo.PROTOTYPING
+    )
+    @ActionLayout(sequence = "100.3")
+    public void stopImpersonating() {
+        this.userService.stopImpersonating();
+        this.messageService.informUser("No longer impersonating another user");
+    }
+    public boolean hideStopImpersonating() {
+        return ! isImpersonating();
+    }
+
+    private boolean isImpersonating() {
+        return this.userService.supportsImpersonation() && this.userService.isImpersonating();
+    }
+
+}
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/applib/mixins/Object_stopImpersonating.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/applib/mixins/Object_stopImpersonating.java
index 3eeb664..b993da6 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/applib/mixins/Object_stopImpersonating.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/applib/mixins/Object_stopImpersonating.java
@@ -28,12 +28,12 @@ import org.apache.isis.applib.annotation.Redirect;
 import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.mixins.layout.LayoutMixinConstants;
-import org.apache.isis.applib.services.user.ImpersonateMenu;
+import org.apache.isis.applib.services.user.ImpersonateStopMenu;
 
 import lombok.RequiredArgsConstructor;
 
 /**
- * Same as {@link ImpersonateMenu#stopImpersonating()},
+ * Same as {@link ImpersonateStopMenu#stopImpersonating()},
  * but implemented as a mixin so that can be invoked while accessing an object.
  *
  * @since 2.0 {@index}
@@ -61,18 +61,15 @@ public class Object_stopImpersonating {
     private final Object holder;
 
     public Object act() {
-        impersonateMenu.stopImpersonating();
+        impersonateStopMenu.stopImpersonating();
         return holder;
     }
 
     @MemberSupport public boolean hideAct() {
-        return impersonateMenu.hideStopImpersonating();
+        return impersonateStopMenu.hideStopImpersonating();
     }
-    @MemberSupport public String disableAct() {
-        return impersonateMenu.disableStopImpersonating();
 
-    }
-
-    @Inject ImpersonateMenu impersonateMenu;
+    @Inject
+    ImpersonateStopMenu impersonateStopMenu;
 
 }