# Script to Set Component Security Checkboxes

**URL:** <https://forum.inductiveautomation.com/t/script-to-set-component-security-checkboxes/21792>\
**Category:** Ignition\
**Tags:** security, ignition79, scripting\
**Created:** [January 10, 2019, 6:13pm UTC](https://forum.inductiveautomation.com/t/script-to-set-component-security-checkboxes/21792 "2019-01-10T18:13:03Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![mlindstrom](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/mlindstrom/32/30000_2.png) [@mlindstrom](https://forum.inductiveautomation.com/u/mlindstrom)\
**Post date:** [January 10, 2019, 6:13pm UTC](https://forum.inductiveautomation.com/t/script-to-set-component-security-checkboxes/21792/1 "2019-01-10T18:13:03Z")

</div>

I’m creating a popup template with configurable text and buttons on it, for use by a wide range of development and production engineers. Using `system.security.getRoles()` returns the roles of the active user, which I can use in a to set `myButton.componentEnabled`, but this is a less-than-perfect solution as it cannot inherit permissions or dynamically change the restrictions between “Access Denied Overlay” and “Disable” depending on the need of the engineer.

I cannot find a security property listed in [https://docs.inductiveautomation.com/display/DOC79/Button](https://docs.inductiveautomation.com/display/DOC79/Button), so perhaps it’s some hidden Java property?

I’m using Ignition v7.9.7.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [January 10, 2019, 6:28pm UTC](https://forum.inductiveautomation.com/t/script-to-set-component-security-checkboxes/21792/2 "2019-01-10T18:28:09Z")

</div>

You would need to use `button.putClientProperty(key, permissions)`, where `key` is [`VisionComponent.COMPONENT_PERMISSIONS`](http://files.inductiveautomation.com/sdk/javadoc/ignition79/795/com/inductiveautomation/vision/api/client/components/model/VisionComponent.html#COMPONENT_PERMISSIONS) and `permissions` is an instance of [`ComponentPermissions`](http://files.inductiveautomation.com/sdk/javadoc/ignition79/795/com/inductiveautomation/vision/api/client/components/model/security/ComponentPermissions.html). You’ll need to import both classes to use them.

---

<div class="post-metadata">

**Author:** ![mlindstrom](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/mlindstrom/32/30000_2.png) [@mlindstrom](https://forum.inductiveautomation.com/u/mlindstrom)\
**Post date:** [January 10, 2019, 11:54pm UTC](https://forum.inductiveautomation.com/t/script-to-set-component-security-checkboxes/21792/3 "2019-01-10T23:54:44Z")

</div>

Thank you, that got me 90% of the way with the code below!!! I could not, however, figure out how to set custom restrictions. Restrictions come as `restriction@hexKey`. How do I create my own restrictions including the key before doing putClientProperty?

There are five available restrictions acording to [Interface ComponentRestriction](http://files.inductiveautomation.com/sdk/javadoc/ignition79/795/com/inductiveautomation/vision/api/client/components/model/security/ComponentRestriction.html), which are EnabledRestriction, EventScriptRestriction, FPMIWindow.DoNotOpenWindow, OverlayRestriction, and VisibilityRestriction. Doing myComponentPermissions.getRestrictions() gives me an array like `array(com.inductiveautomation.vision.api.client.components.model.security.ComponentRestriction, [com.inductiveautomation.vision.api.client.components.model.security.EnabledRestriction@ed9809eb])`, showing the hexKey I’m talking about.

```auto
from com.inductiveautomation.vision.api.client.components.model.security import ComponentPermissions
from com.inductiveautomation.vision.api.client.components.model import VisionComponent
from array import array
import java.lang.String as createJavaString

myComponent = system.gui.getWindow("Popups/OperatorAck").rootContainer.getComponent("Pushbuttons").getComponent("Pb1")

requestedSecurity = system.gui.getWindow("Popups/OperatorAck").rootContainer.AccessLevelBitArray

#Set Custom Security or Inherit Permissions?
inheritPermissions = not (bool)(requestedSecurity & 2**0)

#Construct Required Roles
requiredRoles = array(createJavaString)
if (requestedSecurity & 2**1):
     requiredRoles.append(u'Associate')
if (requestedSecurity & 2**2):
     requiredRoles.append(u'Designer')
if (requestedSecurity & 2**3):
     requiredRoles.append(u'Engineer')
if (requestedSecurity & 2**4):
     requiredRoles.append(u'GatewayAdmin')
if (requestedSecurity & 2**5):
     requiredRoles.append(u'Maintenance')
if (requestedSecurity & 2**6):
     requiredRoles.append(u'Supervisor')

#Construct Restrictions
myComponentPermissions = myComponent.getClientProperty(VisionComponent.COMPONENT_PERMISSIONS)
restrictions = myComponentPermissions.getRestrictions()

#Set Security
key = VisionComponent.COMPONENT_PERMISSIONS
permissions = ComponentPermissions(inheritPermissions, requiredRoles, restrictions)
myComponent.putClientProperty(key, permissions)

```

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [January 11, 2019, 12:32am UTC](https://forum.inductiveautomation.com/t/script-to-set-component-security-checkboxes/21792/4 "2019-01-11T00:32:54Z")

</div>

> [@mlindstrom](#):
>
> `array(com.inductiveautomation.vision.api.client.components.model.security.ComponentRestriction, [com.inductiveautomation.vision.api.client.components.model.security.EnabledRestriction@ed9809eb])`

That's just Java's default `toString` representation - it's `<classname@hashcode>`. To set your own, use the static [`set`](http://files.inductiveautomation.com/sdk/javadoc/ignition79/795/com/inductiveautomation/vision/api/client/components/model/security/ComponentPermissions.html#set-javax.swing.JComponent-com.inductiveautomation.vision.api.client.components.model.security.ComponentPermissions-) method with your own constructed [`ComponentPermissions`](http://files.inductiveautomation.com/sdk/javadoc/ignition79/795/com/inductiveautomation/vision/api/client/components/model/security/ComponentPermissions.html#ComponentPermissions-boolean-java.lang.String:A-com.inductiveautomation.vision.api.client.components.model.security.ComponentRestriction:A-) instance. Use the static fields on ComponentPermissions to reference the default security permissions, eg [`Access Denied`](http://files.inductiveautomation.com/sdk/javadoc/ignition79/795/com/inductiveautomation/vision/api/client/components/model/security/ComponentPermissions.html#ACCESS_DENIED_OVERLAY).

Put together, setting a new permission would be something like:

```python
from com.inductiveautomation.vision.api.client.components.model.security import ComponentPermissions

inheritPermissions = False
requiredRoles = ['Engineer']
restrictions = [ComponentPermissions.DISABLE, ComponentPermissions.ACCESS_DENIED_OVERLAY]

customPermissions = ComponentPermissions(inheritPermissions, requiredRoles, restrictions)

ComponentPermissions.set(myComponent, customPermissions)

```

---

<div class="post-metadata">

**Author:** ![mlindstrom](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/mlindstrom/32/30000_2.png) [@mlindstrom](https://forum.inductiveautomation.com/u/mlindstrom)\
**Post date:** [January 11, 2019, 2:36pm UTC](https://forum.inductiveautomation.com/t/script-to-set-component-security-checkboxes/21792/5 "2019-01-11T14:36:11Z")

</div>

Thank you, that solved it and let me simplify the requiredRoles as well:

```auto
####################################################
### INITIALIZE #####################################

#Import required classes
from com.inductiveautomation.vision.api.client.components.model.security import ComponentPermissions
from com.inductiveautomation.vision.api.client.components.model import VisionComponent

#Reference DINT from PLC to set security
requestedSecurity = system.gui.getWindow("Popups/OperatorAck").rootContainer.AccessLevelBitArray

#Choose which component security to modify
myComponent = system.gui.getWindow("Popups/OperatorAck").rootContainer.getComponent("Pushbuttons").getComponent("Pb1")

####################################################
### CONSTRUCT PERMISSIONS ##########################

#Set Custom Security or Inherit Permissions?
inheritPermissions = not (bool)(requestedSecurity & 2**0)

#Construct Required Roles
requiredRoles = []
if (requestedSecurity & 2**1):
     requiredRoles.append('Associate')
if (requestedSecurity & 2**2):
     requiredRoles.append('Designer')
if (requestedSecurity & 2**3):
     requiredRoles.append('Engineer')
if (requestedSecurity & 2**4):
     requiredRoles.append('GatewayAdmin')
if (requestedSecurity & 2**5):
     requiredRoles.append('Maintenance')
if (requestedSecurity & 2**6):
     requiredRoles.append('Supervisor')

#Construct Restrictions
restrictions = []
if (requestedSecurity & 2**7):
	restrictions.append(ComponentPermissions.ACCESS_DENIED_OVERLAY)
if (requestedSecurity & 2**8):
	restrictions.append(ComponentPermissions.DISABLE)
if (requestedSecurity & 2**9):
	restrictions.append(ComponentPermissions.DISABLE_SCRIPTS)
if (requestedSecurity & 2**10):
	restrictions.append(ComponentPermissions.HIDE)

#####################################################
### SET SECURITY ####################################
key = VisionComponent.COMPONENT_PERMISSIONS
permissions = ComponentPermissions(inheritPermissions, requiredRoles, restrictions)
myComponent.putClientProperty(key, permissions)

```
