diff --git a/entity/PermissionAction_entity/PermissionAction_entity.aod b/entity/PermissionAction_entity/PermissionAction_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..cd867971b4e9eb6bf463622825c4af3c58ac8cac --- /dev/null +++ b/entity/PermissionAction_entity/PermissionAction_entity.aod @@ -0,0 +1,72 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.10" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.10"> + <name>PermissionAction_entity</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <title>Action</title> + <titlePlural>Actions</titlePlural> + <recordContainer>jDito</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityField> + <name>ACTION</name> + <title>Action</title> + <dropDownProcess>%aditoprj%/entity/PermissionAction_entity/entityfields/action/dropDownProcess.js</dropDownProcess> + <stateProcess>%aditoprj%/entity/PermissionAction_entity/entityfields/action/stateProcess.js</stateProcess> + <displayValueProcess>%aditoprj%/entity/PermissionAction_entity/entityfields/action/displayValueProcess.js</displayValueProcess> + </entityField> + <entityField> + <name>UID</name> + </entityField> + <entityProvider> + <name>PermissionActions</name> + <recordContainer>jDito</recordContainer> + <dependencies> + <entityDependency> + <name>c92e552c-6d88-4fe1-918f-1a9a71ea28ad</name> + <entityName>PermissionDetail_entity</entityName> + <fieldName>PermissionActions</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityConsumer> + <name>PermissionDetails</name> + <dependency> + <name>dependency</name> + <entityName>PermissionDetail_entity</entityName> + <fieldName>Permissions</fieldName> + </dependency> + </entityConsumer> + <entityParameter> + <name>PermissionId_param</name> + <expose v="true" /> + </entityParameter> + <entityParameter> + <name>AccessType_param</name> + <expose v="true" /> + </entityParameter> + </entityFields> + <recordContainers> + <jDitoRecordContainer> + <name>jDito</name> + <jDitoRecordAlias>_____SYSTEMALIAS</jDitoRecordAlias> + <contentProcess>%aditoprj%/entity/PermissionAction_entity/recordcontainers/jdito/contentProcess.js</contentProcess> + <onInsert>%aditoprj%/entity/PermissionAction_entity/recordcontainers/jdito/onInsert.js</onInsert> + <onUpdate>%aditoprj%/entity/PermissionAction_entity/recordcontainers/jdito/onUpdate.js</onUpdate> + <onDelete>%aditoprj%/entity/PermissionAction_entity/recordcontainers/jdito/onDelete.js</onDelete> + <recordFieldMappings> + <jDitoRecordFieldMapping> + <name>UID.value</name> + </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>ACTION.value</name> + </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>ACTION.displayValue</name> + </jDitoRecordFieldMapping> + </recordFieldMappings> + </jDitoRecordContainer> + </recordContainers> +</entity> diff --git a/entity/PermissionAction_entity/entityfields/action/displayValueProcess.js b/entity/PermissionAction_entity/entityfields/action/displayValueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..65a3ad0b2b9e511648cf581003a9061e05a1c8ad --- /dev/null +++ b/entity/PermissionAction_entity/entityfields/action/displayValueProcess.js @@ -0,0 +1,6 @@ +import("system.result"); +import("system.vars"); + +var action = vars.get("$field.ACTION"); + +result.string(action); \ No newline at end of file diff --git a/entity/PermissionAction_entity/entityfields/action/dropDownProcess.js b/entity/PermissionAction_entity/entityfields/action/dropDownProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..371de4f973263f8e8f350776ff042bf5390c5877 --- /dev/null +++ b/entity/PermissionAction_entity/entityfields/action/dropDownProcess.js @@ -0,0 +1,95 @@ +import("system.vars"); +import("system.result"); + +var accesstype = vars.get("$param.AccessType_param"); +var actions = []; + +switch (accesstype) { + case "E": + actions = [ + ["view", "view"], + ["create", "create"] + ] + break; + case "R": + actions = [ + ["read", "read"], + ["update", "update"], + ["delete", "delete"] + ] + break; + case "F": + actions = [ + ["read", "read"], + ["update", "update"] + ] +} + +result.object(actions); + + +//############################################################################# +//################only show actions which are not yet in the DB################ +//##########################not done yet####################################### +//############################################################################# +//import("system.logging"); +//import("Permission_lib"); +//import("system.vars"); +//import("system.result"); +// +//var permisson = vars.get("$param.PermissionId_param"); +//var actionIdsInDb = PermissionUtil.getPermissionAction(permisson); +//var actionsInDb = []; +//for each (var actionId in actionIdsInDb) { +// actionsInDb.push(PermissionUtil.resolvePermissionActionId(actionId)); +//} +// +//var entityActions = ["view", "create"]; +//var recordActions = ["read", "update", "delete"]; +//var fieldActions = ["read", "update"]; +//var diff; +// +//var accesstype = vars.get("$param.AccessType_param"); +//var actions = []; +// +//switch (accesstype) { +// case "E": +// diff = arrDiff(actionsInDb, entityActions); +// break; +// case "R": +// diff = arrDiff(actionsInDb, recordActions); +// break; +// case "F": +// diff = arrDiff(actionsInDb, fieldActions); +// break; +//} +// +//for each (let entry in diff) { +// actions.push([entry, entry]); +//} +// +//result.object(actions); +// +//// arrDiff calculates different elements of two arrays and returns them as array, otherwise empty array +//function arrDiff (arr1, arr2) { +// var helperArr = [], diff = []; +// +// for (let i = 0; i < arr1.length; i++) { +// helperArr[arr1[i]] = true; +// } +// +// for (let i = 0; i < arr2.length; i++) { +// if (helperArr[arr2[i]]) { +// delete helperArr[arr2[i]]; +// } +// else { +// helperArr[arr2[i]] = true; +// } +// } +// +// for (var k in helperArr) { +// diff.push(k); +// } +// +// return diff; +//} \ No newline at end of file diff --git a/entity/PermissionAction_entity/entityfields/action/stateProcess.js b/entity/PermissionAction_entity/entityfields/action/stateProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..b4084caba76a70eeb1b82b8f65a214904cb98d16 --- /dev/null +++ b/entity/PermissionAction_entity/entityfields/action/stateProcess.js @@ -0,0 +1,9 @@ +import("system.vars"); +import("system.result"); +import("system.neon"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) { + result.string(neon.COMPONENTSTATE_EDITABLE); +} else { + result.string(neon.COMPONENTSTATE_READONLY); +} diff --git a/entity/PermissionAction_entity/recordcontainers/jdito/contentProcess.js b/entity/PermissionAction_entity/recordcontainers/jdito/contentProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..e3af7028be1e1b0648f1c4a92b35b7e382118ff1 --- /dev/null +++ b/entity/PermissionAction_entity/recordcontainers/jdito/contentProcess.js @@ -0,0 +1,18 @@ +import("system.logging"); +import("system.result"); +import("system.vars"); +import("system.tools"); +import("Permission_lib"); + +var actions = []; +var permissionId = vars.exists("$param.PermissionId_param") && vars.get("$param.PermissionId_param"); + +if (permissionId && PermissionUtil.existsPermission(permissionId)) +{ + var permActions = PermissionUtil.getPermissionAction(permissionId); + for each (var permActionId in permActions) { + actions.push([permActionId[0], PermissionUtil.resolvePermissionActionId(permActionId), PermissionUtil.resolvePermissionActionId(permActionId)]); + } + + result.object(actions); +} \ No newline at end of file diff --git a/entity/PermissionAction_entity/recordcontainers/jdito/onDelete.js b/entity/PermissionAction_entity/recordcontainers/jdito/onDelete.js new file mode 100644 index 0000000000000000000000000000000000000000..69b743814c1db71967e744c83ca9b55fa011f84d --- /dev/null +++ b/entity/PermissionAction_entity/recordcontainers/jdito/onDelete.js @@ -0,0 +1,5 @@ +import("system.vars"); +import("Permission_lib"); + +var action = vars.get("$local.uid"); +PermissionUtil.deletePermissionAction(action); \ No newline at end of file diff --git a/entity/PermissionAction_entity/recordcontainers/jdito/onInsert.js b/entity/PermissionAction_entity/recordcontainers/jdito/onInsert.js new file mode 100644 index 0000000000000000000000000000000000000000..f7e1c66e82ec846dd37c2b2c5510c1a4642421cf --- /dev/null +++ b/entity/PermissionAction_entity/recordcontainers/jdito/onInsert.js @@ -0,0 +1,16 @@ +import("system.logging"); +import("system.db"); +import("system.tools"); +import("system.result"); +import("system.vars"); +import("Permission_lib"); + +var alias = "_____SYSTEMALIAS"; +var permissionId = vars.exists("$param.PermissionId_param") && vars.get("$param.PermissionId_param"); + +if (permissionId) { + var newAction = vars.get("$local.rowdata")["ACTION.value"]; + PermissionUtil.insertNewPermissionAction(permissionId, newAction, vars.get("$field.UID")); +} + +tools.clearPermissionCache(); \ No newline at end of file diff --git a/entity/PermissionAction_entity/recordcontainers/jdito/onUpdate.js b/entity/PermissionAction_entity/recordcontainers/jdito/onUpdate.js new file mode 100644 index 0000000000000000000000000000000000000000..6d5e623b7c990ff901bcfc65cbae34e86b2b65a8 --- /dev/null +++ b/entity/PermissionAction_entity/recordcontainers/jdito/onUpdate.js @@ -0,0 +1,13 @@ +import("system.tools"); +import("system.result"); +import("system.vars"); +import("Permission_lib"); + +var col = "ACTION"; +var table = "ASYS_PERMISSIONACTION"; +var permissionId = vars.exists("$param.PermissionId_param") && vars.get("$param.PermissionId_param"); + +if (permissionId && PermissionUtil.existsPermission(permissionId)) { + var newAction = vars.get("$local.rowdata")["ACTION.value"]; + PermissionUtil.updateIfDiff(vars.get("$field.UID"), newAction, col, table); +} \ No newline at end of file diff --git a/entity/PermissionDetail_entity/PermissionDetail_entity.aod b/entity/PermissionDetail_entity/PermissionDetail_entity.aod index 805cd843553b44db1fa41862d00a6f860b38af7c..bcacf9e74ba1b543ba42c577e3d76d5e7cf475e4 100644 --- a/entity/PermissionDetail_entity/PermissionDetail_entity.aod +++ b/entity/PermissionDetail_entity/PermissionDetail_entity.aod @@ -24,7 +24,8 @@ <entityField> <name>ACTION</name> <title>Action</title> - <mandatory v="true" /> + <mandatory v="false" /> + <state>INVISIBLE</state> </entityField> <entityField> <name>ROLE</name> @@ -101,6 +102,12 @@ <fieldName>PermissionDetails</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>62a56e76-d049-4c53-a439-79261a8058e1</name> + <entityName>PermissionAction_entity</entityName> + <fieldName>PermissionDetails</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> </entityProvider> <entityParameter> @@ -165,6 +172,24 @@ </entityParameter> </children> </entityConsumer> + <entityConsumer> + <name>PermissionActions</name> + <dependency> + <name>dependency</name> + <entityName>PermissionAction_entity</entityName> + <fieldName>PermissionActions</fieldName> + </dependency> + <children> + <entityParameter> + <name>PermissionId_param</name> + <valueProcess>%aditoprj%/entity/PermissionDetail_entity/entityfields/permissionactions/children/permissionid_param/valueProcess.js</valueProcess> + </entityParameter> + <entityParameter> + <name>AccessType_param</name> + <valueProcess>%aditoprj%/entity/PermissionDetail_entity/entityfields/permissionactions/children/accesstype_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> </entityFields> <recordContainers> <jDitoRecordContainer> diff --git a/entity/PermissionDetail_entity/entityfields/condition/stateProcess.js b/entity/PermissionDetail_entity/entityfields/condition/stateProcess.js index 71fd7034f822385b31ede8fc4d755ce78aa56a1b..419962f904c9cd0a047f5c53832be8154b966e77 100644 --- a/entity/PermissionDetail_entity/entityfields/condition/stateProcess.js +++ b/entity/PermissionDetail_entity/entityfields/condition/stateProcess.js @@ -3,7 +3,7 @@ import("system.result"); import("system.neon"); if(vars.get("$field.ACCESSTYPE") == "E") { - result.string(neon.COMPONENTSTATE_DISABLED); + result.string(neon.COMPONENTSTATE_INVISIBLE); } else { if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) { result.string(neon.COMPONENTSTATE_EDITABLE); diff --git a/entity/PermissionDetail_entity/entityfields/condition/valueProcess.js b/entity/PermissionDetail_entity/entityfields/condition/valueProcess.js index 1c44df7a4b437ff59294457d7198174510327b28..63d2b62fa7a27a2855ee7dd5967859f8049da68e 100644 --- a/entity/PermissionDetail_entity/entityfields/condition/valueProcess.js +++ b/entity/PermissionDetail_entity/entityfields/condition/valueProcess.js @@ -1,4 +1,3 @@ -import("system.logging"); import("system.neon"); import("system.vars"); import("system.result"); diff --git a/entity/PermissionDetail_entity/entityfields/permissionactions/children/accesstype_param/valueProcess.js b/entity/PermissionDetail_entity/entityfields/permissionactions/children/accesstype_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..530d2556d48deea69763a157ea7713b4dc0b233f --- /dev/null +++ b/entity/PermissionDetail_entity/entityfields/permissionactions/children/accesstype_param/valueProcess.js @@ -0,0 +1,3 @@ +import("system.vars"); +import("system.result"); +result.string(vars.get("$field.ACCESSTYPE")); \ No newline at end of file diff --git a/entity/PermissionDetail_entity/entityfields/permissionactions/children/permissionid_param/valueProcess.js b/entity/PermissionDetail_entity/entityfields/permissionactions/children/permissionid_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..7f2dea6db775c3e184ecfe8b4937e583ad91ec39 --- /dev/null +++ b/entity/PermissionDetail_entity/entityfields/permissionactions/children/permissionid_param/valueProcess.js @@ -0,0 +1,17 @@ +import("system.vars"); +import("system.result"); +import("Permission_lib"); + +var entity = vars.get("$field.ENTITY"); +var cond = vars.get("$field.CONDITION"); +var noCond = "{\"entity\":\"" + entity + "\",\"filter\":{\"type\":\"group\",\"operator\":\"AND\",\"childs\":[]}}"; +var permSetId = PermissionUtil.getPermissionSet(vars.get("$field.ROLE"), vars.get("$field.ENTITY"), vars.get("$field.ACCESSTYPE")); + +if (permSetId != "" && (cond == "" || cond == noCond)) { + var rootPermId = PermissionUtil.getDefaultPermission(permSetId); + if (rootPermId != "") { + result.string(rootPermId); + } +} else { + result.string(vars.get("$field.UID")); +} \ No newline at end of file diff --git a/entity/PermissionDetail_entity/recordcontainers/jdito/onInsert.js b/entity/PermissionDetail_entity/recordcontainers/jdito/onInsert.js index 043cefec525b2ba9304aaeb29f8dd1d87c953bd2..df2a2545e7f02a5b61ab2de2d49a6e8da67488d2 100644 --- a/entity/PermissionDetail_entity/recordcontainers/jdito/onInsert.js +++ b/entity/PermissionDetail_entity/recordcontainers/jdito/onInsert.js @@ -1,4 +1,3 @@ -import("system.logging"); import("Permission_lib"); import("system.neon"); import("system.util"); @@ -9,26 +8,20 @@ import("Permission_lib"); import("Entity_lib"); var alias = "_____SYSTEMALIAS"; +var tablename = "ASYS_PERMISSION"; var sqlExt = ""; -var permissionid = util.getNewUUID(); +var permissionid = vars.get("$field.UID"); var role = vars.get("$field.ROLE"); var entity = vars.get("$field.ENTITY"); var field = vars.get("$field.FIELD"); var accesstype = vars.get("$field.ACCESSTYPE").trim(); var condtype = vars.get("$field.CONDTYPE").trim(); var condition = vars.get("$field.CONDITION"); -var action = vars.get("$field.ACTION"); -if (checkInput([role, entity, accesstype, condtype, action])) { - if (checkInput([field])) - sqlExt += " and FIELD_ID = '" + field + "'"; - else if (action.includes("view") || action.includes("create")) - sqlExt += " and ACCESSTYPE = 'E'"; - else - sqlExt += " and ACCESSTYPE = 'R'"; - - var sqlStr = "select ASYS_PERMISSIONSETID from ASYS_PERMISSIONSET where ENTITY_ID = '" + entity + "' and ROLE_ID = '" + role + "'" + sqlExt; - var permissionsetid = db.cell(sqlStr, alias); +if (checkInput([role, entity, accesstype, condtype])) { + + // permission set + var permissionsetid = PermissionUtil.getPermissionSet(role, entity, accesstype, field); if (permissionsetid == "") { // no fitting permissionset found - insert new permissionset @@ -38,35 +31,22 @@ if (checkInput([role, entity, accesstype, condtype, action])) { } else { rootpermissionset = PermissionUtil.getRootPermissionSet(role, entity); } - permissionsetid = PermissionUtil.insertNewPermissionSet(rootpermissionset, entity, role, field, accesstype) + permissionsetid = PermissionUtil.insertNewPermissionSet(rootpermissionset, entity, role, field, accesstype); } - - // deletes permissions with CONDTYPE = 'false' - condtype=false if a permission is used to display that a entity has no permissions - var childPermissions = PermissionUtil.getAllChildPermissions(permissionsetid); - for each (var permid in childPermissions) { - if (PermissionUtil.getCondType(permid) == "false") { - let table = "ASYS_PERMISSION"; - let cond = " ASYS_PERMISSIONID = '" + permid + "'"; - db.deleteData(table, cond, alias); // delete permission with cond type = false - } - } - - // check if a new permissions is needed or an existing one can be used - var existingPermId = permExists(role, entity, field, accesstype, condtype, condition); - if (existingPermId != "") { - // update - permissionid = existingPermId; + + // permission + var existingPerm = PermissionUtil.getPermission(role, entity, field, accesstype, condition); + if (existingPerm == "") { + // no existing perm found -> insert + PermissionUtil.insertNewPermission(permissionsetid, condition, condtype, permissionid); } else { - // permission doesnt exist -> insert new permission - // new permissionid is needed to link actions to the permission in the next step - permissionid = PermissionUtil.insertNewPermission(permissionsetid, condition, condtype) + // existing perm found -> update + PermissionUtil.updateIfDiff(existingPerm, permissionsetid, "ASYS_PERMISSIONSET_ID", tablename); + PermissionUtil.updateIfDiff(existingPerm, condition, "COND", tablename); + PermissionUtil.updateIfDiff(existingPerm, "true", "CONDTYPE", tablename); } - // insert new permissionaction - var actionNew = action.split(","); - for each (let permaction in actionNew) { - PermissionUtil.insertNewPermissionAction(permissionid, permaction); - } + // permission action gets created in PermissionAction_entity tools.clearPermissionCache(); } @@ -80,23 +60,51 @@ function checkInput(pInputArr) { return true; } -// returns permissionid of the permission with fitting parameters, otherwise returns empty string -function permExists(pRole, pEntity, pField, pAccesstype, pCondtype, pCondition) { - var sqlStr = ""; - var sqlExt = ""; - - if (checkInput([pCondition])) { - sqlExt += " and COND like '%" + pCondition + "%'"; - } - - if (checkInput([pField])) { - sqlExt += " and FIELD_ID = '" + pField + "'"; - } - - sqlStr = "select ASYS_PERMISSION.ASYS_PERMISSIONID from ASYS_PERMISSIONSET" - + " join ASYS_PERMISSION on ASYS_PERMISSION.ASYS_PERMISSIONSET_ID = ASYS_PERMISSIONSET.ASYS_PERMISSIONSETID" - + " where ENTITY_ID = '" + pEntity + "' and ROLE_ID = '" + pRole + "'" - + " and ACCESSTYPE = '" + pAccesstype + "' and CONDTYPE = '" + pCondtype + "'" + sqlExt; - var permId = db.cell(sqlStr, alias); - return permId; -} \ No newline at end of file +// +// // deletes permissions with CONDTYPE = 'false' - condtype=false if a permission is used to display that a entity has no permissions +// var childPermissions = PermissionUtil.getAllChildPermissions(permissionsetid); +// for each (var permid in childPermissions) { +// if (PermissionUtil.getCondType(permid) == "false") { +// PermissionUtil.deletePermission(permid); +// } +// } +// +// // check if a new permissions is needed or an existing one can be used +// var existingPermId = permExists(role, entity, field, accesstype, condtype, condition); +// if (existingPermId != "") { +// // update +// permissionid = existingPermId; +// } else { +// // permission doesnt exist -> insert new permission +// // new permissionid is needed to link actions to the permission in the next step +// logging.log("onInsert cond: " + condition); +// permissionid = PermissionUtil.insertNewPermission(permissionsetid, condition, condtype) +// } +// +// // insert new permissionaction +// var actionNew = action.split(","); +// for each (let permaction in actionNew) { +// PermissionUtil.insertNewPermissionAction(permissionid, permaction); +// } +// +// +//// returns permissionid of the permission with fitting parameters, otherwise returns empty string +//function permExists(pRole, pEntity, pField, pAccesstype, pCondtype, pCondition) { +// var sqlStr = ""; +// var sqlExt = ""; +// +// if (checkInput([pCondition])) { +// sqlExt += " and cast(COND as varchar(999) = '" + pCondition + "'"; +// } +// +// if (checkInput([pField])) { +// sqlExt += " and FIELD_ID = '" + pField + "'"; +// } +// +// sqlStr = "select ASYS_PERMISSION.ASYS_PERMISSIONID from ASYS_PERMISSIONSET" +// + " join ASYS_PERMISSION on ASYS_PERMISSION.ASYS_PERMISSIONSET_ID = ASYS_PERMISSIONSET.ASYS_PERMISSIONSETID" +// + " where ENTITY_ID = '" + pEntity + "' and ROLE_ID = '" + pRole + "'" +// + " and ACCESSTYPE = '" + pAccesstype + "' and CONDTYPE = '" + pCondtype + "'" + sqlExt; +// var permId = db.cell(sqlStr, alias); +// return permId; +//} \ No newline at end of file diff --git a/neonContext/PermissionAction/PermissionAction.aod b/neonContext/PermissionAction/PermissionAction.aod new file mode 100644 index 0000000000000000000000000000000000000000..d59ee2df144a9e3cff48b0f6a69a2063c6ab5a71 --- /dev/null +++ b/neonContext/PermissionAction/PermissionAction.aod @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.0" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.0"> + <name>PermissionAction</name> + <title>Permission Action</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <entity>PermissionAction_entity</entity> + <references> + <neonViewReference> + <name>e2098ef8-52da-4a97-abf9-e313be9ba43f</name> + <view>PermissionActionEdit_view</view> + </neonViewReference> + <neonViewReference> + <name>2d27ce8b-7676-4db8-9644-006b2d83d61f</name> + <view>PermissionActionFilter_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonView/PermissionActionEdit_view/PermissionActionEdit_view.aod b/neonView/PermissionActionEdit_view/PermissionActionEdit_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..9a9c84f8257b9f369d7c8455519121792ffe4f1e --- /dev/null +++ b/neonView/PermissionActionEdit_view/PermissionActionEdit_view.aod @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.2"> + <name>PermissionActionEdit_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <noneLayout> + <name>layout</name> + </noneLayout> + </layout> + <children> + <genericMultipleViewTemplate> + <name>GenericMultiple</name> + <entityField>#ENTITY</entityField> + <title>Action</title> + <columns> + <neonTableColumn> + <name>0272107d-c34c-40e7-974e-5a63d2239fdb</name> + <entityField>ACTION</entityField> + </neonTableColumn> + </columns> + </genericMultipleViewTemplate> + </children> +</neonView> diff --git a/neonView/PermissionActionFilter_view/PermissionActionFilter_view.aod b/neonView/PermissionActionFilter_view/PermissionActionFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..3bbf8059184dc70dc4053b1c43338fc19f829655 --- /dev/null +++ b/neonView/PermissionActionFilter_view/PermissionActionFilter_view.aod @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.2" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.2"> + <name>PermissionActionFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <noneLayout> + <name>layout</name> + </noneLayout> + </layout> + <children> + <tableViewTemplate> + <name>Table</name> + <entityField>#ENTITY</entityField> + <columns> + <neonTableColumn> + <name>87d9c672-bce9-489a-b0cd-f8fcd2e4cdfd</name> + <entityField>ACTION</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + </children> +</neonView> diff --git a/neonView/PermissionDetailEdit_view/PermissionDetailEdit_view.aod b/neonView/PermissionDetailEdit_view/PermissionDetailEdit_view.aod index 8ef8579b7a1540329efda5245002705fd31b22ff..5a86fdf6d84f791ab91f4abd6c7269a73bd5eca4 100644 --- a/neonView/PermissionDetailEdit_view/PermissionDetailEdit_view.aod +++ b/neonView/PermissionDetailEdit_view/PermissionDetailEdit_view.aod @@ -4,9 +4,9 @@ <majorModelMode>DISTRIBUTED</majorModelMode> <isSmall v="true" /> <layout> - <boxLayout> + <noneLayout> <name>layout</name> - </boxLayout> + </noneLayout> </layout> <children> <genericViewTemplate> @@ -40,5 +40,10 @@ </entityFieldLink> </fields> </genericViewTemplate> + <neonViewReference> + <name>bde148a0-e0ba-45e1-9402-f2855fd2ec4a</name> + <entityField>PermissionActions</entityField> + <view>PermissionActionEdit_view</view> + </neonViewReference> </children> </neonView> diff --git a/neonView/PermissionDetailPreview_view/PermissionDetailPreview_view.aod b/neonView/PermissionDetailPreview_view/PermissionDetailPreview_view.aod index 5ebbf66f77e25fcb516748764f0e687e3f9cd596..4a5ae421786a728f041aad983d1c0fa6871bb9a3 100644 --- a/neonView/PermissionDetailPreview_view/PermissionDetailPreview_view.aod +++ b/neonView/PermissionDetailPreview_view/PermissionDetailPreview_view.aod @@ -3,9 +3,9 @@ <name>PermissionDetailPreview_view</name> <majorModelMode>DISTRIBUTED</majorModelMode> <layout> - <boxLayout> + <noneLayout> <name>layout</name> - </boxLayout> + </noneLayout> </layout> <children> <cardViewTemplate> @@ -29,5 +29,10 @@ </entityFieldLink> </fields> </genericViewTemplate> + <neonViewReference> + <name>b9e52e84-8ed8-4fe1-a938-6c6ff399c418</name> + <entityField>PermissionActions</entityField> + <view>PermissionActionFilter_view</view> + </neonViewReference> </children> </neonView> diff --git a/process/Permission_lib/process.js b/process/Permission_lib/process.js index 689c3577f4200a347625f62998acd1ccc3305026..bec5de949e05a8cad27e1e644de9705220b7630b 100644 --- a/process/Permission_lib/process.js +++ b/process/Permission_lib/process.js @@ -301,6 +301,28 @@ PermissionUtil.getPermissionAction = function(pPermId) { return db.table(sqlStr, alias); } +/** + * Gets the permission set id of a given role-entity-accesstype-combination. + * + * @param {String} pRole the name of the role + * + * @param {String} pEntity the name of the entity + * + * @param {String} pAccessType the name of the access type (E,R,F) + * + * @param {String} pField the name of the field + * + * @result {String} returns the id of the matching permission set. The result can never be null. + */ +PermissionUtil.getPermissionSet = function(pRole, pEntity, pAccessType, pField) { + var sqlStr = "select ASYS_PERMISSIONSETID from ASYS_PERMISSIONSET" + + " where ROLE_ID = '" + pRole + "' and ENTITY_ID = '" + pEntity + "' and ACCESSTYPE = '" + pAccessType + "'"; + if (pField != null && pField != "" && pField != undefined) { + sqlStr += " and FIELD_ID = '" + pField + "'"; + } + return db.cell(sqlStr, alias); +} + /** * Gets the root permission set of a entity-role-combination. * @@ -412,15 +434,22 @@ PermissionUtil.insertNewPermissionSet = function(pParentPermSet, pEntity, pRole, * * @param {String} pCondType The Condition Type of the permission, should nearly always be "true" * + * @param {String} pPermId The id of the new permission (can be empty/null) + * * @result {Integer} returns the id of the inserted permission */ -PermissionUtil.insertNewPermission = function(pParentPermSet, pCond, pCondType) { +PermissionUtil.insertNewPermission = function(pParentPermSet, pCond, pCondType, pPermId) { var table = "ASYS_PERMISSION"; var cols = db.getColumns(table, alias); - var permid = util.getNewUUID(); - var vals = [permid, pParentPermSet, pCond, pCondType]; + var permId; + if (pPermId != null && pPermId != "" && pPermId != undefined) { + permId = pPermId; + } else { + permId = util.getNewUUID(); + } + var vals = [permId, pParentPermSet, pCond, pCondType]; db.insertData(table, cols, null, vals, alias); - return permid; + return permId; } /** @@ -430,30 +459,138 @@ PermissionUtil.insertNewPermission = function(pParentPermSet, pCond, pCondType) * * @param {String} pAction Action (view, create,...), mandatory * - * @result {Integer} returns the id of the inserted permission action + * @param {String} pActionId The id of the new permission action + * + * @result {Integer} returns the id of the inserted permission action, returns null if insert was not possible */ -PermissionUtil.insertNewPermissionAction = function(pParentPerm, pAction) { +PermissionUtil.insertNewPermissionAction = function(pParentPerm, pAction, pActionId) { var table = "ASYS_PERMISSIONACTION"; var cols = db.getColumns(table, alias); - var permactionid = util.getNewUUID(); - var vals = [pAction, permactionid, pParentPerm]; - db.insertData(table, cols, null, vals, alias); - return permactionid; + var permactionid; + + var actions = PermissionUtil.getPermissionAction(pParentPerm); + var sqlStr = "select ACCESSTYPE from ASYS_PERMISSIONSET where ASYS_PERMISSIONSETID = '" + PermissionUtil.getParentPermissionSet(pParentPerm) + "'"; + var accesstype = db.cell(sqlStr, alias); + var insertIsAllowed = true; + + switch (accesstype) { + case "R": + if (actions.length >= 3) { + insertIsAllowed = false; + } + break; + default: + if (actions.length >= 2) { + insertIsAllowed = false; + } + break; + } + + if (insertIsAllowed) { + sqlStr = "select ASYS_PERMISSIONACTIONID from ASYS_PERMISSIONACTION where ASYS_PERMISSIONACTIONID = '" + pActionId + "'"; // if same id is already in db -> create new UID + + if (pActionId != null & pActionId != "" && pActionId != undefined && db.cell(sqlStr, alias) == "") { + permactionid = pActionId; + } else { + permactionid = util.getNewUUID(); + } + var vals = [pAction, permactionid, pParentPerm]; + db.insertData(table, cols, null, vals, alias); + return permactionid; + } + return null; } /** - * Returns the cond type of a permission. - * - * @param {String} pPerm The permission, mandatory - * - * @result {Integer} returns the cond type of a permission - */ + * Returns the cond type of a permission. + * + * @param {String} pPerm The permission, mandatory + * + * @result {Integer} returns the cond type of a permission + */ PermissionUtil.getCondType = function(pPerm) { var table = "ASYS_PERMISSION"; var sqlStr = "select CONDTYPE from " + table + " where ASYS_PERMISSIONID = '" + pPerm + "'"; return db.cell(sqlStr, alias); } +/** + * Returns true if the permission exists, otherwise false. + * + * @param {String} pPermId The permission id + * + * @result {Boolean} true if permission exists, otherwise false + */ +PermissionUtil.existsPermission = function(pPermId) { + var table = "ASYS_PERMISSION"; + var sqlStr = "select COUNT(*) from " + table + " where ASYS_PERMISSIONID = '" + pPermId + "'"; + if (db.cell(sqlStr, alias) != "0") { + return true; + } + return false; +} + +/** + * Returns permissionid of the permission with fitting parameters, otherwise returns empty string + * + * @param {String} pRole Name of the role + * + * @param {String} pEntity Name of the entity + * + * @param {String} pField Name of the field + * + * @param {String} pAccesstype Accesstype (E,F,R) + * + * @param {String} pCondition The condition (Filter in JSON-format) + * + * @param {String} pCondtype Type of the condition (true/false) + * + * @result {String} Returns the id of the permission with fitting parameters, otherwise returns empty string, can never be null + * + */ +PermissionUtil.getPermission = function(pRole, pEntity, pField, pAccesstype, pCondition, pCondtype) { + var sqlStr = ""; + var sqlExt = ""; + var noCond = "{\"entity\":\"" + pEntity + "\",\"filter\":{\"type\":\"group\",\"operator\":\"AND\",\"childs\":[]}}"; + + if (checkInput([pCondition])) { + if (pCondition == noCond) { + sqlExt += " and (COND like '%" + pCondition + "%' or COND is null)"; + } else { + sqlExt += " and COND like '%" + pCondition + "%'"; + } + } + + if (checkInput([pField])) { + sqlExt += " and FIELD_ID = '" + pField + "'"; + } + + if (checkInput([pCondtype])) { + sqlExt += " and CONDTYPE = '" + pCondtype + "'"; + } + + sqlStr = "select ASYS_PERMISSION.ASYS_PERMISSIONID from ASYS_PERMISSIONSET" + + " join ASYS_PERMISSION on ASYS_PERMISSION.ASYS_PERMISSIONSET_ID = ASYS_PERMISSIONSET.ASYS_PERMISSIONSETID" + + " where ENTITY_ID = '" + pEntity + "' and ROLE_ID = '" + pRole + "'" + + " and ACCESSTYPE = '" + pAccesstype + "'" + sqlExt; + var permId = db.cell(sqlStr, alias); + return permId; +} + +/** + * Deletes a permission action from ASYS_PERMISSIONACTION. + * + * @param {String} pPermActionId The permission action id which should be deleted, mandatory + * + * @result {Integer} returns the number of deleted records + */ +PermissionUtil.deletePermissionAction = function(pPermActionId) { + var table = "ASYS_PERMISSIONACTION"; + var cond = " ASYS_PERMISSIONACTIONID = '" + pPermActionId + "'"; + return db.deleteData(table, cond, alias); +} + + // arrDiff calculates different elements of two arrays and returns them as array, otherwise empty array function arrDiff (arr1, arr2) { var helperArr = [], diff = []; @@ -476,4 +613,13 @@ function arrDiff (arr1, arr2) { } return diff; +} + +// checks input array if each element is a valid input, returns true if valid, otherwise false +function checkInput(pInputArr) { + for each (var input in pInputArr) { + if (input == undefined || input == null || input == "") + return false; + } + return true; } \ No newline at end of file