Introduction
Starting version 1.1 Penrose supports operational attributes such as creatorsName, createTimestamp, modifiersName, and modifyTimestamp.
By default the operational attributes are disabled. To enable operational attributes you need to prepare a storage and configure a module.
Configuring Operational Attributes
Add the fields to store the operational attributes in the sources.xml:
<source name="users"> <connection-name>MySQL</connection-name> <field name="username" primaryKey="true"/> <field name="firstName"/> <field name="lastName"/> <field name="password"/> <field name="creatorsName"/> <field name="createTimestamp" type="DATETIME"/> <field name="modifiersName"/> <field name="modifyTimestamp" type="DATETIME"/> <parameter> <param-name>tableName</param-name> <param-value>users</param-value> </parameter> </source>
Then configure the operational attributes in mapping.xml:
<entry dn="uid=...,ou=Users,dc=Operational Attribute,dc=Example,dc=com"> <oc>person</oc> <oc>organizationalPerson</oc> <oc>inetOrgPerson</oc> ... other attributes ... <at name="creatorsName" operational="true"> <variable>u.creatorsName</variable> </at> <at name="createTimestamp" operational="true"> <expression> import org.safehaus.penrose.operationalAttribute.*; if (u == void || u == null) return; if (u.createTimestamp == void || u.createTimestamp == null) return null; return OperationalAttribute.formatDate(u.createTimestamp); </expression> </at> <at name="modifiersName" operational="true"> <variable>u.modifiersName</variable> </at> <at name="modifyTimestamp" operational="true"> <expression> import org.safehaus.penrose.operationalAttribute.*; if (u == void || u == null) return; if (u.modifyTimestamp == void || u.modifyTimestamp == null) return null; return OperationalAttribute.formatDate(u.modifyTimestamp); </expression> </at> </entry>
Then configure the reverse mappings for the operational attributes in the same entry:
<entry dn="uid=...,ou=Users,dc=Operational Attribute,dc=Example,dc=com"> <source name="u"> <source-name>users</source-name> ... other fields ... <field name="creatorsName"> <variable>creatorsName</variable> </field> <field name="createTimestamp"> <expression> import org.safehaus.penrose.operationalAttribute.*; if (createTimestamp == void || createTimestamp == null) return null; return OperationalAttribute.parseDate(createTimestamp); </expression> </field> <field name="modifiersName"> <variable>modifiersName</variable> </field> <field name="modifyTimestamp"> <expression> import org.safehaus.penrose.operationalAttribute.*; if (modifyTimestamp == void || modifyTimestamp == null) return null; return OperationalAttribute.parseDate(modifyTimestamp); </expression> </field> </source> </entry>
Finally, configure the OperationalAttributeModule in modules.xml:
<module name="OperationalAttributeModule">
<module-class>org.safehaus.penrose.operationalAttribute.OperationalAttributeModule</module-class>
</module>
<module-mapping>
<module-name>OperationalAttributeModule</module-name>
<base-dn>dc=Operational Attribute,dc=Example,dc=com</base-dn>
<filter>(objectClass=*)</filter>
<scope>SUBTREE</scope>
</module-mapping>
This module will generate the values of the operational attributes on add, modify, and modrdn operations.
Example
The example files are available in PENROSE_SERVER_HOME/samples/operational directory.
Create a new partition by copying the configuration files in PENROSE_SERVER_HOME/samples/operational/partition into a new PENROSE_SERVER_HOME/partitions/operational directory.
Then register the new partition in PENROSE_SERVER_HOME/conf/server.xml:
<partition name="operational" path="partitions/operational"/>
Add an entry:
ldapadd -h localhost -p 10389 -D uid=admin,ou=system -w secret -x dn: uid=test,ou=Users,dc=Operational Attribute,dc=Example,dc=com objectClass: inetOrgPerson objectClass: organizationalPerson objectClass: person uid: test userPassword: test sn: User cn: Test User
Search the operational attributes:
ldapsearch -h localhost -p 10389 -D uid=admin,ou=system -w secret -x -b "dc=Operational Attribute,dc=Example,dc=com" \* +
dn: uid=test,ou=Users,dc=Operational Attribute,dc=Example,dc=com
modifiersName: uid=admin,ou=system
creatorsName: uid=admin,ou=system
sn: User
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
uid: test
cn: Secret User
modifyTimestamp: 20061004231152Z
createTimestamp: 20061004231050Z
userPassword:: c2VjcmV0
