Many, many changes to do with making database layer security.
This commit is contained in:
parent
e7a4961e9b
commit
7a977d5acd
|
@ -9,8 +9,8 @@
|
|||
Transform ADL into (partial) controller classes
|
||||
|
||||
$Author: sb $
|
||||
$Revision: 1.25 $
|
||||
$Date: 2009-02-02 10:49:13 $
|
||||
$Revision: 1.26 $
|
||||
$Date: 2009-02-06 12:08:28 $
|
||||
-->
|
||||
|
||||
<!-- WARNING WARNING WARNING: Do NOT reformat this file!
|
||||
|
@ -18,9 +18,12 @@
|
|||
<xsl:stylesheet version="1.0"
|
||||
xmlns="http://libs.cygnets.co.uk/adl/1.1/"
|
||||
xmlns:adl="http://libs.cygnets.co.uk/adl/1.1/"
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:exsl="urn:schemas-microsoft-com:xslt"
|
||||
extension-element-prefixes="exsl">
|
||||
|
||||
<xsl:include href="csharp-type-include.xslt"/>
|
||||
<xsl:include href="permissions-include.xslt"/>
|
||||
|
||||
<xsl:output encoding="UTF-8" method="text"/>
|
||||
|
||||
|
@ -67,7 +70,7 @@
|
|||
//
|
||||
// Automatically generated abstract super class for controllers for the
|
||||
// <xsl:value-of select="/adl:application/@name"/> application; generated using
|
||||
// adl2controllerclasses.xslt version <xsl:value-of select="substring( '$Revision: 1.25 $', 10)"/>
|
||||
// adl2controllerclasses.xslt version <xsl:value-of select="substring( '$Revision: 1.26 $', 10)"/>
|
||||
//
|
||||
// <xsl:value-of select="/adl:application/@revision"/>
|
||||
//
|
||||
|
@ -78,8 +81,10 @@
|
|||
using System;
|
||||
using System.Data;
|
||||
using System.Collections.Generic;
|
||||
using System.Data.SqlClient;
|
||||
using NHibernate;
|
||||
using NHibernate.Expression;
|
||||
using Cygnet.DBAuth;
|
||||
using Cygnet.Web.Controllers;
|
||||
using Cygnet.Web.Helpers;
|
||||
using Castle.MonoRail.Framework;
|
||||
|
@ -96,21 +101,55 @@
|
|||
[ <!-- in the longer term, all the helpers which a given
|
||||
project needs which not every project needs should be listed here,
|
||||
with appropriate 'xsl:if' wrappers. -->
|
||||
Helper(typeof(FormatterHelper), "t"),
|
||||
Helper(typeof(SecurityHelper), "SecurityHelper")
|
||||
]
|
||||
public abstract partial class <xsl:value-of select="concat( 'Abstract', /adl:application/@name, 'Controller')"/> : BaseController {
|
||||
|
||||
<xsl:choose>
|
||||
<xsl:when test="$authentication-layer = 'Application'"/>
|
||||
<xsl:when test="$authentication-layer = 'Database'">
|
||||
public <xsl:value-of select="concat( 'Abstract', /adl:application/@name, 'Controller')"/>(){
|
||||
dbSessionProvider = new DBLayerSessionProvider();
|
||||
}
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:message terminate="yes">
|
||||
ADL: ERROR: invalid value (<xsl:value-of select="$authentication-layer"/>) provided for authentication-layer
|
||||
</xsl:message>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
|
||||
<xsl:for-each select="//adl:entity">
|
||||
/// <summary>
|
||||
/// Return a list of all instances of <xsl:value-of select="@name"/> for use in menus, etc;
|
||||
/// </summary>
|
||||
protected IList<<xsl:value-of select="concat( $entityns, '.', @name)"/>> <xsl:value-of select="concat( 'FetchAll', @name)"/>( ISession hibernator) {
|
||||
return hibernator.CreateCriteria(typeof(<xsl:value-of select="concat( $entityns, '.', @name)"/>))
|
||||
protected IList<<xsl:value-of select="concat( $entityns, '.', @name)"/>> <xsl:value-of select="concat( 'FetchAll', @name)"/>( ) {
|
||||
IList<<xsl:value-of select="concat( $entityns, '.', @name)"/>> result = new List<<xsl:value-of select="concat( $entityns, '.', @name)"/>>();
|
||||
|
||||
<xsl:variable name="readgroups">
|
||||
<xsl:call-template name="entity-read-groups">
|
||||
<xsl:with-param name="entity" select="."/>
|
||||
</xsl:call-template>
|
||||
</xsl:variable>
|
||||
<xsl:if test="$authentication-layer = 'Database'">
|
||||
if (
|
||||
<xsl:for-each select="exsl:node-set( $readgroups)/*">
|
||||
InGroup( "<xsl:value-of select="./@name"/>")<xsl:if test="position() != last()">||</xsl:if>
|
||||
</xsl:for-each>
|
||||
){
|
||||
</xsl:if>
|
||||
result = GetDBSession().CreateCriteria(typeof(<xsl:value-of select="concat( $entityns, '.', @name)"/>))
|
||||
<xsl:for-each select="descendant::adl:property[@distinct='user']">
|
||||
.AddOrder( <xsl:value-of select="concat('new Order( "', @name, '", true)')"/>)
|
||||
</xsl:for-each>
|
||||
.SetCacheable( true)
|
||||
.SetCacheRegion( "<xsl:value-of select="/adl:application/@name"/>")
|
||||
.List<<xsl:value-of select="concat( $entityns, '.', @name)"/>>();
|
||||
<xsl:if test="$authentication-layer != 'Application'">
|
||||
}
|
||||
</xsl:if>
|
||||
return result;
|
||||
}
|
||||
|
||||
</xsl:for-each>
|
||||
|
@ -142,7 +181,7 @@
|
|||
//
|
||||
// Controller for auto-generated forms for editing <xsl:value-of select="@name"/>s
|
||||
// Automatically generated from application description using
|
||||
// adl2controllerclasses.xslt version <xsl:value-of select="substring( '$Revision: 1.25 $', 10)"/>
|
||||
// adl2controllerclasses.xslt version <xsl:value-of select="substring( '$Revision: 1.26 $', 10)"/>
|
||||
//
|
||||
// This file is automatically generated; DO NOT EDIT IT.
|
||||
//
|
||||
|
@ -235,11 +274,7 @@
|
|||
/// Temporary hack to sort a problem with uninitialised messages
|
||||
/// </summary>
|
||||
public void fixupMessages() {
|
||||
ISession hibernator =
|
||||
NHibernateHelper.GetCurrentSession( <xsl:if test="$authentication-layer = 'Database'">
|
||||
Session[ NHibernateHelper.USERTOKEN],
|
||||
Session[NHibernateHelper.PASSTOKEN]
|
||||
</xsl:if>);
|
||||
ISession hibernator = GetDBSession();
|
||||
ICollection<<xsl:value-of select="concat($entityns, '.', @name)"/>> instances =
|
||||
hibernator.CreateCriteria( typeof( <xsl:value-of select="concat($entityns, '.', @name)"/>))
|
||||
.List<<xsl:value-of select="concat($entityns, '.', @name)"/>>();
|
||||
|
@ -270,11 +305,7 @@
|
|||
/// </summary>
|
||||
private void Store()
|
||||
{
|
||||
ISession hibernator =
|
||||
NHibernateHelper.GetCurrentSession( <xsl:if test="$authentication-layer = 'Database'">
|
||||
Session[ NHibernateHelper.USERTOKEN],
|
||||
Session[NHibernateHelper.PASSTOKEN]
|
||||
</xsl:if>);
|
||||
ISession hibernator = GetDBSession();
|
||||
List<string> messages = new List<string>();
|
||||
/* A 'newborn' instance can be updated even if the current user doesn't have
|
||||
* update permissions, seeing that we use an update operation to set the
|
||||
|
@ -571,11 +602,8 @@
|
|||
if ( ! HasNoErrors())
|
||||
{
|
||||
/* the session may be polluted; create a new session */
|
||||
NHibernateHelper.CloseSession();
|
||||
hibernator = NHibernateHelper.GetCurrentSession(<xsl:if test="$authentication-layer = 'Database'">
|
||||
Session[ NHibernateHelper.USERTOKEN],
|
||||
Session[NHibernateHelper.PASSTOKEN]
|
||||
</xsl:if>);
|
||||
CloseDBSession();
|
||||
hibernator = GetDBSession();
|
||||
|
||||
record = FetchRecord( hibernator);
|
||||
} /* if ( ! HasNoErrors()) */
|
||||
|
@ -592,11 +620,7 @@
|
|||
public void Delete()
|
||||
{
|
||||
AssertUserCanDelete();
|
||||
ISession hibernator =
|
||||
NHibernateHelper.GetCurrentSession( <xsl:if test="$authentication-layer = 'Database'">
|
||||
Session[ NHibernateHelper.USERTOKEN],
|
||||
Session[NHibernateHelper.PASSTOKEN]
|
||||
</xsl:if>);
|
||||
ISession hibernator = GetDBSession();
|
||||
|
||||
if ( "true".Equals( Params["reallydelete"]))
|
||||
{
|
||||
|
@ -644,11 +668,7 @@
|
|||
public void InternalShowList( String view)
|
||||
{
|
||||
AssertUserCanRead();
|
||||
ISession hibernator =
|
||||
NHibernateHelper.GetCurrentSession( <xsl:if test="$authentication-layer = 'Database'">
|
||||
Session[ NHibernateHelper.USERTOKEN],
|
||||
Session[NHibernateHelper.PASSTOKEN]
|
||||
</xsl:if>);
|
||||
ISession hibernator = GetDBSession();
|
||||
|
||||
ICriteria search =
|
||||
hibernator.CreateCriteria(typeof(<xsl:value-of select="concat( $entityns, '.', @name)"/>));
|
||||
|
@ -679,9 +699,6 @@
|
|||
|
||||
IList<<xsl:value-of select="concat( $entityns, '.', @name)"/>> instances = search.List<<xsl:value-of select="concat( $entityns, '.', @name)"/>>();
|
||||
|
||||
<xsl:if test="$authentication-layer = 'Database'">
|
||||
PropertyBag["username"] = Session[ NHibernateHelper.USERTOKEN];
|
||||
</xsl:if>
|
||||
PropertyBag["instances"] =
|
||||
PaginationHelper.CreatePagination( this, instances, 25);
|
||||
|
||||
|
@ -736,7 +753,11 @@
|
|||
|
||||
<xsl:template match="adl:property">
|
||||
<xsl:if test="@required='true'">
|
||||
if ( String.IsNullOrEmpty( Form[ "<xsl:value-of select="concat( 'instance.', @name)"/>" ]))
|
||||
if (
|
||||
<xsl:if test="@immutable='true'">
|
||||
(record == null || <xsl:value-of select="concat( 'record.', @name)"/> == null) &&
|
||||
</xsl:if>
|
||||
String.IsNullOrEmpty( Form[ "<xsl:value-of select="concat( 'instance.', @name)"/>" ]))
|
||||
{
|
||||
AddError( <xsl:choose>
|
||||
<xsl:when test="adl:ifmissing[@locale=$locale]">
|
||||
|
@ -784,18 +805,11 @@
|
|||
</xsl:for-each>
|
||||
if ( command.Equals( "delete"))
|
||||
{
|
||||
ISession hibernator =
|
||||
NHibernateHelper.GetCurrentSession( <xsl:if test="$authentication-layer = 'Database'">
|
||||
Session[ NHibernateHelper.USERTOKEN],
|
||||
Session[NHibernateHelper.PASSTOKEN]
|
||||
</xsl:if>);
|
||||
ISession hibernator = GetDBSession();
|
||||
|
||||
<xsl:value-of select="concat($entityns, '.', ancestor::adl:entity/@name)"/> record = FetchRecord( hibernator);
|
||||
|
||||
TypedPropertyBag = new {
|
||||
<xsl:if test="$authentication-layer = 'Database'">
|
||||
username = Session[ NHibernateHelper.USERTOKEN],
|
||||
</xsl:if>
|
||||
instance = record };
|
||||
|
||||
RenderViewWithFailover( "maybedelete.vm", "maybedelete.auto.vm");
|
||||
|
@ -834,11 +848,7 @@
|
|||
public void <xsl:value-of select="concat($form/@name, 'With', @name)"/>( string <xsl:value-of select="@name"/>)
|
||||
{
|
||||
AssertUserCanRead();
|
||||
ISession hibernator =
|
||||
NHibernateHelper.GetCurrentSession( <xsl:if test="$authentication-layer = 'Database'">
|
||||
Session[ NHibernateHelper.USERTOKEN],
|
||||
Session[NHibernateHelper.PASSTOKEN]
|
||||
</xsl:if>);
|
||||
ISession hibernator = GetDBSession();
|
||||
<xsl:value-of select="ancestor::adl:entity/@name"/> record = new <xsl:value-of select="ancestor::adl:entity/@name"/>();
|
||||
|
||||
record.<xsl:value-of select="@name"/> = <xsl:call-template name="fetch-property-instance">
|
||||
|
@ -870,11 +880,7 @@
|
|||
string <xsl:value-of select="concat( ' ', @name)"/>
|
||||
<xsl:if test="not( position() = last())">,</xsl:if>
|
||||
</xsl:for-each>) {
|
||||
ISession hibernator =
|
||||
NHibernateHelper.GetCurrentSession( <xsl:if test="$authentication-layer = 'Database'">
|
||||
Session[ NHibernateHelper.USERTOKEN],
|
||||
Session[NHibernateHelper.PASSTOKEN]
|
||||
</xsl:if>);
|
||||
ISession hibernator = GetDBSession();
|
||||
<xsl:value-of select="concat( 'this.', @name)"/>(
|
||||
hibernator.CreateCriteria( typeof(<xsl:value-of select="concat($entityns, '.', ancestor::adl:entity/@name)"/>))
|
||||
<xsl:for-each select="ancestor::adl:entity/adl:key/adl:property">
|
||||
|
@ -892,11 +898,7 @@
|
|||
/// <param name="record">the record to show</param>
|
||||
protected void <xsl:value-of select="@name"/>( <xsl:value-of select="concat($entityns, '.', ancestor::adl:entity/@name)"/> record)
|
||||
{
|
||||
ISession hibernator =
|
||||
NHibernateHelper.GetCurrentSession( <xsl:if test="$authentication-layer = 'Database'">
|
||||
Session[ NHibernateHelper.USERTOKEN],
|
||||
Session[NHibernateHelper.PASSTOKEN]
|
||||
</xsl:if>);
|
||||
ISession hibernator = GetDBSession();
|
||||
|
||||
if ( record == null ){
|
||||
record = new <xsl:value-of select="concat($entityns, '.', ancestor::adl:entity/@name)"/>();
|
||||
|
@ -905,9 +907,6 @@
|
|||
}
|
||||
|
||||
TypedPropertyBag = new {
|
||||
<xsl:if test="$authentication-layer = 'Database'">
|
||||
username = Session[ NHibernateHelper.USERTOKEN],
|
||||
</xsl:if>
|
||||
<xsl:call-template name="formmenus">
|
||||
<xsl:with-param name="form" select="."/>
|
||||
</xsl:call-template>
|
||||
|
@ -1070,7 +1069,7 @@
|
|||
<xsl:param name="property"/>
|
||||
<xsl:variable name="entity" select="//adl:entity[@name=$property/@entity]"/>
|
||||
<xsl:value-of select="concat('all_', $property/@name)"/> =
|
||||
<xsl:value-of select="concat( 'FetchAll', $entity/@name)"/>( NHibernateHelper.GetCurrentSession()),
|
||||
<xsl:value-of select="concat( 'FetchAll', $entity/@name)"/>( ),
|
||||
</xsl:template>
|
||||
|
||||
<xsl:template name="primary-key-csharp-type">
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
Transform ADL into C# entity classes
|
||||
|
||||
$Author: sb $
|
||||
$Revision: 1.16 $
|
||||
$Date: 2009-02-02 18:13:39 $
|
||||
$Revision: 1.17 $
|
||||
$Date: 2009-02-06 12:08:28 $
|
||||
-->
|
||||
|
||||
<!-- WARNING WARNING WARNING: Do NOT reformat this file!
|
||||
|
@ -41,6 +41,10 @@
|
|||
<!-- the name and version of the product being built -->
|
||||
<xsl:param name="product-version" select="'Application Description Language Framework'"/>
|
||||
|
||||
<!-- Whether to authenticate at application or at database layer.
|
||||
If not 'Application', then 'Database'. -->
|
||||
<xsl:param name="authentication-layer" select="Application"/>
|
||||
|
||||
<!-- strings used in normalising names for constants.
|
||||
NOTE NOTE NOTE:
|
||||
this deliberately converts space and punctuation to underscore -->
|
||||
|
@ -66,7 +70,7 @@
|
|||
// (c)2007 Cygnet Solutions Ltd
|
||||
//
|
||||
// Automatically generated from application description using
|
||||
// adl2entityclass.xsl revision <xsl:value-of select="substring( '$Revision: 1.16 $', 10)"/>
|
||||
// adl2entityclass.xsl revision <xsl:value-of select="substring( '$Revision: 1.17 $', 10)"/>
|
||||
//
|
||||
// <xsl:value-of select="/adl:application/@revision"/>
|
||||
//
|
||||
|
@ -93,7 +97,7 @@
|
|||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Automatically generated from description of group <xsl:value-of select="@name"/>
|
||||
/// using adl2entityclass.xsl revision <xsl:value-of select="substring( '$Revision: 1.16 $', 10)"/>.
|
||||
/// using adl2entityclass.xsl revision <xsl:value-of select="substring( '$Revision: 1.17 $', 10)"/>.
|
||||
///
|
||||
/// DO NOT EDIT THIS FILE!
|
||||
/// </remarks>
|
||||
|
@ -119,7 +123,7 @@
|
|||
// (c)2007 Cygnet Solutions Ltd
|
||||
//
|
||||
// Automatically generated from application description using
|
||||
// adl2entityclass.xsl revision <xsl:value-of select="substring( '$Revision: 1.16 $', 10)"/>
|
||||
// adl2entityclass.xsl revision <xsl:value-of select="substring( '$Revision: 1.17 $', 10)"/>
|
||||
//
|
||||
// <xsl:value-of select="/adl:application/@revision"/>
|
||||
//
|
||||
|
@ -145,7 +149,7 @@
|
|||
/// </summary>
|
||||
/// <remarks>
|
||||
/// Automatically generated from description of entity <xsl:value-of select="@name"/>
|
||||
/// using adl2entityclass.xsl revision <xsl:value-of select="substring( '$Revision: 1.16 $', 10)"/>.
|
||||
/// using adl2entityclass.xsl revision <xsl:value-of select="substring( '$Revision: 1.17 $', 10)"/>.
|
||||
/// Note that manually maintained parts of this class may be defined in
|
||||
/// a separate file called <xsl:value-of select="@name"/>.manual.cs, q.v.
|
||||
///
|
||||
|
@ -288,13 +292,13 @@
|
|||
<xsl:when test="@type='date'">
|
||||
<!-- if what we've got is just a date, we only want to see the date part of it -->
|
||||
if ( <xsl:value-of select="@name"/> != null){
|
||||
result.Append(<xsl:value-of select="@name"/>.ToString( "d"));
|
||||
result.Append(((DateTime)<xsl:value-of select="@name"/>).ToShortDateString());
|
||||
}
|
||||
</xsl:when>
|
||||
<xsl:when test="@type='time'">
|
||||
<!-- if what we've got is just a time, we only want to see the time part of it -->
|
||||
if ( <xsl:value-of select="@name"/> != null){
|
||||
result.Append(<xsl:value-of select="@name"/>.ToString( "t"));
|
||||
result.Append(((DateTime)<xsl:value-of select="@name"/>).ToShortTimeString());
|
||||
}
|
||||
</xsl:when>
|
||||
<xsl:when test="@required = 'true' and (@type = 'integer' or @type = 'real' or @type = 'boolean' or @type = 'money')">
|
||||
|
@ -331,29 +335,37 @@
|
|||
public override string NoDeleteReason {
|
||||
get {
|
||||
string result = null;
|
||||
<xsl:if test="adl:property[@type='list']|adl:property[@type='link']">
|
||||
StringBuilder bob = new StringBuilder();
|
||||
<!-- TODO: we ought to start worrying about internationalisation NOW, not later! -->
|
||||
<xsl:choose>
|
||||
<xsl:when test="$authentication-layer='Application'">
|
||||
<xsl:if test="adl:property[@type='list']|adl:property[@type='link']">
|
||||
StringBuilder bob = new StringBuilder();
|
||||
<!-- TODO: we ought to start worrying about internationalisation NOW, not later! -->
|
||||
|
||||
<xsl:for-each select="adl:property[@type='list']|adl:property[@type='link']">
|
||||
<xsl:choose>
|
||||
<xsl:when test="@cascade='manual'"/>
|
||||
<xsl:when test="@cascade='all'"/>
|
||||
<xsl:when test="@cascade='all-delete-orphan'"/>
|
||||
<xsl:when test="@cascade='delete'"/>
|
||||
<xsl:when test="@concrete='false'"/>
|
||||
<xsl:otherwise>
|
||||
if ( <xsl:value-of select="concat( ' _', @name)"/> != null && <xsl:value-of select="concat( ' _', @name)"/>.Count > 0) {
|
||||
bob.AppendFormat("Cannot delete this <xsl:value-of select="../@name"/> as it has {0} dependent <xsl:value-of select="@name"/>; ", <xsl:value-of select="concat( ' _', @name)"/>.Count);
|
||||
}
|
||||
<xsl:for-each select="adl:property[@type='list']|adl:property[@type='link']">
|
||||
<xsl:choose>
|
||||
<xsl:when test="@cascade='manual'"/>
|
||||
<xsl:when test="@cascade='all'"/>
|
||||
<xsl:when test="@cascade='all-delete-orphan'"/>
|
||||
<xsl:when test="@cascade='delete'"/>
|
||||
<xsl:when test="@concrete='false'"/>
|
||||
<xsl:otherwise>
|
||||
if ( <xsl:value-of select="concat( ' _', @name)"/> != null && <xsl:value-of select="concat( ' _', @name)"/>.Count > 0) {
|
||||
bob.AppendFormat("Cannot delete this <xsl:value-of select="../@name"/> as it has {0} dependent <xsl:value-of select="@name"/>; ", <xsl:value-of select="concat( ' _', @name)"/>.Count);
|
||||
}
|
||||
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:for-each>
|
||||
if (bob.Length > 0) {
|
||||
result = bob.ToString();
|
||||
}
|
||||
</xsl:if>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:for-each>
|
||||
if (bob.Length > 0) {
|
||||
result = bob.ToString();
|
||||
}
|
||||
</xsl:if>
|
||||
</xsl:when>
|
||||
<xsl:when test="$authentication-layer='Database'">
|
||||
/* unfortunately it's not currently possible to compute no-delete reasons
|
||||
* on 'Database' authenticated applications */
|
||||
</xsl:when>
|
||||
</xsl:choose>
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -22,8 +22,8 @@
|
|||
Templates are listed in alphabetical order.
|
||||
|
||||
$Author: sb $
|
||||
$Revision: 1.4 $
|
||||
$Date: 2009-02-04 18:39:11 $
|
||||
$Revision: 1.5 $
|
||||
$Date: 2009-02-06 12:08:28 $
|
||||
-->
|
||||
|
||||
<xsl:template name="i18n-add-a-new">
|
||||
|
@ -102,7 +102,7 @@
|
|||
<xsl:value-of select="concat( $noun, 'es')"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="starts-with( substring($noun, string-length($noun) ), 'y')">
|
||||
<xsl:value-of select="concat( substring( $noun, string-length($noun)), 'ies')"/>
|
||||
<xsl:value-of select="concat( substring( $noun, 1, string-length($noun) - 1), 'ies')"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:value-of select="concat( $noun, 's')"/>
|
||||
|
|
261
transforms/permissions-include.xslt
Executable file
261
transforms/permissions-include.xslt
Executable file
|
@ -0,0 +1,261 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<xsl:stylesheet version="1.0"
|
||||
xmlns="http://libs.cygnets.co.uk/adl/1.1/"
|
||||
xmlns:adl="http://libs.cygnets.co.uk/adl/1.1/"
|
||||
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
|
||||
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
|
||||
xmlns:exsl="urn:schemas-microsoft-com:xslt"
|
||||
extension-element-prefixes="exsl">
|
||||
<!--
|
||||
Application Description Language framework
|
||||
permissions-include.xslt
|
||||
|
||||
(c) 2007 Cygnet Solutions Ltd
|
||||
|
||||
Utility templates to find permissions on various things
|
||||
|
||||
$Author: sb $
|
||||
$Revision: 1.1 $
|
||||
$Date: 2009-02-06 12:08:28 $
|
||||
-->
|
||||
|
||||
<!-- collect all groups which can edit the specified property -->
|
||||
<xsl:template name="property-edit-groups">
|
||||
<xsl:param name="property"/>
|
||||
<xsl:for-each select="//adl:group">
|
||||
<xsl:variable name="perm">
|
||||
<xsl:call-template name="property-permission">
|
||||
<xsl:with-param name="property" select="$property"/>
|
||||
<xsl:with-param name="groupname" select="@name"/>
|
||||
</xsl:call-template>
|
||||
</xsl:variable>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$perm='all'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='edit'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise/>
|
||||
</xsl:choose>
|
||||
</xsl:for-each>
|
||||
</xsl:template>
|
||||
|
||||
<!-- those groups which can insert -->
|
||||
<xsl:template name="property-insert-groups">
|
||||
<xsl:param name="property"/>
|
||||
<xsl:for-each select="//adl:group">
|
||||
<xsl:variable name="perm">
|
||||
<xsl:call-template name="property-permission">
|
||||
<xsl:with-param name="property" select="$property"/>
|
||||
<xsl:with-param name="groupname" select="@name"/>
|
||||
</xsl:call-template>
|
||||
</xsl:variable>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$perm='all'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='edit'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='insert'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='noedit'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise/>
|
||||
</xsl:choose>
|
||||
</xsl:for-each>
|
||||
</xsl:template>
|
||||
|
||||
<!-- those groups which can read -->
|
||||
<xsl:template name="property-read-groups">
|
||||
<xsl:param name="property"/>
|
||||
<xsl:for-each select="//adl:group">
|
||||
<xsl:variable name="perm">
|
||||
<xsl:call-template name="property-permission">
|
||||
<xsl:with-param name="property" select="$property"/>
|
||||
<xsl:with-param name="groupname" select="@name"/>
|
||||
</xsl:call-template>
|
||||
</xsl:variable>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$perm='all'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='edit'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='insert'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='noedit'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='read'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise/>
|
||||
</xsl:choose>
|
||||
</xsl:for-each>
|
||||
</xsl:template>
|
||||
|
||||
<!-- collect the groups which can read an entity -->
|
||||
<xsl:template name="entity-read-groups">
|
||||
<xsl:param name="entity"/>
|
||||
<xsl:for-each select="//adl:group">
|
||||
<xsl:variable name="groupname" select="@name"/>
|
||||
<xsl:variable name="perm">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$entity/adl:permission[@group=$groupname]">
|
||||
<xsl:value-of select="$entity/adl:permission[@group=$groupname]/@permission"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>none</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$perm='all'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='edit'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='insert'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='noedit'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='read'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise/>
|
||||
</xsl:choose>
|
||||
</xsl:for-each>
|
||||
</xsl:template>
|
||||
|
||||
<!-- collect the groups which can delete an entity -->
|
||||
<xsl:template name="entity-delete-groups">
|
||||
<xsl:param name="entity"/>
|
||||
<xsl:for-each select="//adl:group">
|
||||
<xsl:variable name="groupname" select="@name"/>
|
||||
<xsl:variable name="perm">
|
||||
<xsl:choose>
|
||||
<xsl:when test="$entity/adl:permission[@group=$groupname]">
|
||||
<xsl:value-of select="$entity/adl:permission[@group=$groupname]/@permission"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>none</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:variable>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$perm='all'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise/>
|
||||
</xsl:choose>
|
||||
</xsl:for-each>
|
||||
</xsl:template>
|
||||
|
||||
|
||||
<!-- collect the groups which can read a page, form or list -->
|
||||
<xsl:template name="page-read-groups">
|
||||
<xsl:param name="page"/>
|
||||
<xsl:for-each select="//adl:group">
|
||||
<xsl:variable name="perm">
|
||||
<xsl:call-template name="page-permission">
|
||||
<xsl:with-param name="page" select="$page"/>
|
||||
<xsl:with-param name="groupname" select="@name"/>
|
||||
</xsl:call-template>
|
||||
</xsl:variable>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$perm='all'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='edit'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='insert'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='noedit'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$perm='read'">
|
||||
<xsl:copy-of select="."/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise/>
|
||||
</xsl:choose>
|
||||
</xsl:for-each>
|
||||
</xsl:template>
|
||||
|
||||
<!-- find, as a string, the permission which applies to this property in the context of the named group.
|
||||
NOTE: recurses up the group hierarchy - if it has cycles that's your problem, buster.
|
||||
page: a page, list or form element
|
||||
groupname: a string, being the name of a group
|
||||
-->
|
||||
<xsl:template name="page-permission">
|
||||
<xsl:param name="page"/>
|
||||
<xsl:param name="groupname" select="'public'"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$page/adl:permission[@group=$groupname]">
|
||||
<xsl:value-of select="$page/adl:permission[@group=$groupname]/@permission"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$page/ancestor::adl:entity/adl:permission[@group=$groupname]">
|
||||
<xsl:value-of select="$page/ancestor::adl:entity/adl:permission[@group=$groupname]/@permission"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="//adl:group[@name=$groupname]/@parent">
|
||||
<xsl:call-template name="page-permission">
|
||||
<xsl:with-param name="page" select="$page"/>
|
||||
<xsl:with-param name="groupname" select="//adl:group[@name=$groupname]/@parent"/>
|
||||
</xsl:call-template>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>none</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<!-- find, as a string, the permission which applies to this property in the context of the named group.
|
||||
NOTE: recurses up the group hierarchy - if it has cycles that's your problem, buster.
|
||||
property: a property element
|
||||
groupname: a string, being the name of a group
|
||||
-->
|
||||
<xsl:template name="property-permission">
|
||||
<xsl:param name="property"/>
|
||||
<xsl:param name="groupname" select="'public'"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$property/adl:permission[@group=$groupname]">
|
||||
<xsl:value-of select="$property/adl:permission[@group=$groupname]/@permission"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="$property/ancestor::adl:entity/adl:permission[@group=$groupname]">
|
||||
<xsl:value-of select="$property/ancestor::adl:entity/adl:permission[@group=$groupname]/@permission"/>
|
||||
</xsl:when>
|
||||
<xsl:when test="//adl:group[@name=$groupname]/@parent">
|
||||
<xsl:call-template name="property-permission">
|
||||
<xsl:with-param name="property" select="$property"/>
|
||||
<xsl:with-param name="groupname" select="//adl:group[@name=$groupname]/@parent"/>
|
||||
</xsl:call-template>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>none</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
<!-- find, as a string, the permission which applies to this field in the context of the named group
|
||||
field: a field element
|
||||
groupname: a string, being the name of a group
|
||||
-->
|
||||
<xsl:template name="field-permission">
|
||||
<xsl:param name="field"/>
|
||||
<xsl:param name="groupname"/>
|
||||
<xsl:choose>
|
||||
<xsl:when test="$field/adl:permission[@group=$groupname]">
|
||||
<xsl:value-of select="$field/adl:permission[@group=$groupname]/@permission"/>
|
||||
</xsl:when>
|
||||
<xsl:otherwise>
|
||||
<xsl:call-template name="property-permission">
|
||||
<xsl:with-param name="property" select="$field/ancestor::adl:entity//adl:property[@name=$field/@name]"/>
|
||||
<xsl:with-param name="groupname" select="$groupname"/>
|
||||
</xsl:call-template>
|
||||
</xsl:otherwise>
|
||||
</xsl:choose>
|
||||
</xsl:template>
|
||||
|
||||
</xsl:stylesheet>
|
Loading…
Reference in a new issue