From c00fc0f3dc93a246f91f1e19894b9ee82a53424e Mon Sep 17 00:00:00 2001
From: Simon Leipold <s.leipold@adito.de>
Date: Thu, 30 Sep 2021 12:39:22 +0200
Subject: [PATCH] =?UTF-8?q?[Projekt:=20Entwicklung=20-=20Neon][TicketNr.:?=
 =?UTF-8?q?=201086772][Nicht=20berechtigte=20verkn=C3=BCpfte=20Datens?=
 =?UTF-8?q?=C3=A4tze=20f=C3=BChren=20zu=20Fehlern]?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../ActivityLink_entity.aod                   |   6 +
 .../object_permission_result/valueProcess.js  |   6 +
 .../object_rowid/displayValueProcess.js       |  10 +-
 .../entityfields/object_rowid/stateProcess.js |   6 +
 .../entityfields/object_type/stateProcess.js  |   6 +
 process/Permission_lib/process.js             | 122 ++++++++++++++++++
 6 files changed, 148 insertions(+), 8 deletions(-)
 create mode 100644 entity/ActivityLink_entity/entityfields/object_permission_result/valueProcess.js
 create mode 100644 entity/ActivityLink_entity/entityfields/object_rowid/stateProcess.js
 create mode 100644 entity/ActivityLink_entity/entityfields/object_type/stateProcess.js

diff --git a/entity/ActivityLink_entity/ActivityLink_entity.aod b/entity/ActivityLink_entity/ActivityLink_entity.aod
index f7987fab47..5a442b8bdb 100644
--- a/entity/ActivityLink_entity/ActivityLink_entity.aod
+++ b/entity/ActivityLink_entity/ActivityLink_entity.aod
@@ -20,6 +20,7 @@
       <title>{$OBJECTLINK_TYPE}</title>
       <consumer>Context</consumer>
       <mandatory v="true" />
+      <stateProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_type/stateProcess.js</stateProcess>
       <displayValueProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_type/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
@@ -28,6 +29,7 @@
       <consumer>Objects</consumer>
       <linkedContextProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_rowid/linkedContextProcess.js</linkedContextProcess>
       <mandatory v="true" />
+      <stateProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_rowid/stateProcess.js</stateProcess>
       <displayValueProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js</displayValueProcess>
     </entityField>
     <entityField>
@@ -94,6 +96,10 @@
       <name>#PROVIDER_AGGREGATES</name>
       <useAggregates v="true" />
     </entityProvider>
+    <entityField>
+      <name>OBJECT_PERMISSION_RESULT</name>
+      <valueProcess>%aditoprj%/entity/ActivityLink_entity/entityfields/object_permission_result/valueProcess.js</valueProcess>
+    </entityField>
   </entityFields>
   <recordContainers>
     <dbRecordContainer>
diff --git a/entity/ActivityLink_entity/entityfields/object_permission_result/valueProcess.js b/entity/ActivityLink_entity/entityfields/object_permission_result/valueProcess.js
new file mode 100644
index 0000000000..88f23e2bd9
--- /dev/null
+++ b/entity/ActivityLink_entity/entityfields/object_permission_result/valueProcess.js
@@ -0,0 +1,6 @@
+import("Permission_lib");
+import("system.result");
+import("system.vars");
+
+var res = PermissionUtil.getPermissionResult(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID"), vars.get("$sys.recordstate"), vars.get("$sys.user"));
+result.string(JSON.stringify(res));
diff --git a/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js b/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js
index 95c4eea536..d6a0d07974 100644
--- a/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js
+++ b/entity/ActivityLink_entity/entityfields/object_rowid/displayValueProcess.js
@@ -1,11 +1,5 @@
-import("system.neon");
 import("system.vars");
-import("system.db");
 import("system.result");
-import("Context_lib");
 
-if(vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW && !vars.get("$field.OBJECT_ROWID")) {
-    result.string("");
-} else if (vars.exists("$field.OBJECT_TYPE") && vars.get("$field.OBJECT_TYPE")) {
-    result.string(ContextUtils.getTitleByContext(vars.get("$field.OBJECT_TYPE"), vars.get("$field.OBJECT_ROWID")));
-}
\ No newline at end of file
+var permissionResult = JSON.parse(vars.get("$field.OBJECT_PERMISSION_RESULT"));
+result.string(permissionResult.title);
diff --git a/entity/ActivityLink_entity/entityfields/object_rowid/stateProcess.js b/entity/ActivityLink_entity/entityfields/object_rowid/stateProcess.js
new file mode 100644
index 0000000000..efa6035588
--- /dev/null
+++ b/entity/ActivityLink_entity/entityfields/object_rowid/stateProcess.js
@@ -0,0 +1,6 @@
+import("Permission_lib");
+import("system.result");
+import("system.vars");
+
+var permissionResult = JSON.parse(vars.get("$field.OBJECT_PERMISSION_RESULT"));
+result.string(PermissionUtil.getVisibilityByPermissionResult(permissionResult, vars.get("$sys.recordstate")));
diff --git a/entity/ActivityLink_entity/entityfields/object_type/stateProcess.js b/entity/ActivityLink_entity/entityfields/object_type/stateProcess.js
new file mode 100644
index 0000000000..d371cb8fb2
--- /dev/null
+++ b/entity/ActivityLink_entity/entityfields/object_type/stateProcess.js
@@ -0,0 +1,6 @@
+import("Permission_lib");
+import("system.vars");
+import("system.result");
+
+var permissionResult = JSON.parse(vars.get("$field.OBJECT_PERMISSION_RESULT"));
+result.string(PermissionUtil.getVisibilityByPermissionResult(permissionResult, vars.get("$sys.recordstate")));
diff --git a/process/Permission_lib/process.js b/process/Permission_lib/process.js
index 0273d9b02d..717172cf8d 100644
--- a/process/Permission_lib/process.js
+++ b/process/Permission_lib/process.js
@@ -1,3 +1,7 @@
+import("system.translate");
+import("Context_lib");
+import("system.logging");
+import("system.neon");
 import("system.vars");
 import("system.tools");
 import("system.SQLTYPES");
@@ -52,6 +56,10 @@ PermissionEnums.RESTRICTED_ACTION_ICON = function () {
 PermissionEnums.FORBIDDEN_ACTION_ICON = function () {
     return "VAADIN:CLOSE";
 }
+PermissionEnums.NO_PERMISSION = function () {
+    return "NO_PERMISSION";
+}
+
 
 /**
  * Provides functions to work with permissions.
@@ -983,6 +991,120 @@ function PermissionUtil () {}
         });
     }
     
+    /**
+     * Returns the permission result for a given object.
+     * 
+     * @param pObjectType the type of the object, e.g. "Organisation".
+     * 
+     * @param pObjectRowId the id of the object.
+     * 
+     * @param pRecordState the current record state.
+     * 
+     * @param pUser the user.
+     * 
+     * @return {Object{}} returns an object with a status to react accordingly in stateProcesses and a title for display.
+     */
+    PermissionUtil.getPermissionResult = function(pObjectType, pObjectRowId, pRecordState, pUser)
+    {
+        var NO_PERMISSION_TITLE = translate.text("No Permission");
+        var DEFAULT_ERROR = translate.text("Error");
+        
+        var res = {
+            status: null, 
+            title: null
+        };
+        
+        if(pRecordState != neon.OPERATINGSTATE_NEW && pObjectType) 
+        {
+            var entity = ContextUtils.getEntity(pObjectType);
+            if (tools.hasPermission(tools.PERMISSION_VIEW, entity, null, pUser, null))
+            {
+                if (pObjectRowId)
+                {
+                    try {
+                        if (tools.hasPermission(tools.PERMISSION_READ, entity, null, pUser, [pObjectRowId]))
+                        {
+                            res = {
+                                status: tools.PERMISSION_READ, 
+                                title: ContextUtils.getTitleByContext(pObjectType, pObjectRowId)
+                            };
+                        }
+                        else
+                        {
+                            res = {
+                                status: tools.PERMISSION_VIEW, 
+                                title: NO_PERMISSION_TITLE
+                            };
+                        }
+                    } 
+                    catch (err)
+                    {
+                        // display "no permission" if there was an error while calculating permissions
+                        if (err.fileName == "Permission_lib")
+                        {
+                            res = {
+                                status: tools.PERMISSION_VIEW, 
+                                title: NO_PERMISSION_TITLE
+                            };
+                        }
+                        else
+                        {
+                            // otherwise display a default error message
+                            res = {
+                                status: tools.PERMISSION_VIEW, 
+                                title: DEFAULT_ERROR
+                            };
+                        }
+                        
+                        logging.log(err);
+                    }
+                }
+                else
+                {
+                    res = {
+                        status: tools.PERMISSION_VIEW, 
+                        title: NO_PERMISSION_TITLE
+                    };
+                }
+            }
+            else
+            {
+                res = {
+                    status: PermissionEnums.NO_PERMISSION(),
+                    title: NO_PERMISSION_TITLE
+                };
+            }
+        }
+        
+        return res;
+    }
+    
+    /**
+     * Returns the visibility for a given object determined by the permission result.
+     * 
+     * @param pPermissionResult as object. Has to contain the property 'status'.
+     * 
+     * @param pRecordState the current record state.
+     * 
+     * @return {String} returns the visibility determined by the permission result.
+     */
+    PermissionUtil.getVisibilityByPermissionResult = function(pPermissionResult, pRecordState)
+    {
+        if (pRecordState != neon.OPERATINGSTATE_NEW)
+        {
+            switch (pPermissionResult.status)
+            {
+                case tools.PERMISSION_VIEW:
+                    return neon.COMPONENTSTATE_READONLY;
+                case tools.PERMISSION_READ:
+                    return neon.COMPONENTSTATE_EDITABLE;
+                default:
+                    return neon.COMPONENTSTATE_INVISIBLE;
+            }
+        }
+        return neon.COMPONENTSTATE_AUTO;
+    }
+
 } //end of block
 
 
-- 
GitLab