Added findUnnamedType{s,}, cloneType, Type.copyTo and Type.clone.
authorFrédéric Jolliton <git@frederic.jolliton.com>
Sun, 22 Oct 2006 15:54:08 +0000 (15:54 +0000)
committerFrédéric Jolliton <git@frederic.jolliton.com>
Sun, 22 Oct 2006 15:54:08 +0000 (15:54 +0000)
rsbac/rc.py

index f6679e3..cbf7b68 100644 (file)
@@ -239,6 +239,40 @@ def cloneRole( source , start = 0 ) :
     copyRole( source , role )
     return role
 
+def findUnnamedType( target , start = 0 ) :
+    """Find an unnamed type.
+
+    start -- Minimal RC type id to use, as integer.
+
+    Return an integer.
+    """
+    i = start
+    while 1 :
+        try :
+            getTypeName( ( target , i ) )
+        except Error , e :
+            if e[ 0 ] != headers.RSBAC_ENOTFOUND :
+                raise
+            break
+        i += 1
+    return i
+
+def findUnnamedTypes( target , n = 1 , start = 0 ) :
+    """Find a set of unnammed types.
+
+    n -- Number of unnnamed types to find.
+    start -- Minimal RC type id to use, as integer.
+
+    Returns a list of integers.
+    """
+    r = []
+    i = start
+    for j in range( n ) :
+        type = findUnnamedType( target , i )
+        r.append( type )
+        i = type + 1
+    return r
+
 @export
 def copyType( target , source , dest ) :
     """Copy a RC type.
@@ -254,6 +288,18 @@ def copyType( target , source , dest ) :
                                           source , dest ) )
 
 @export
+def cloneType( target , source , start = 0 ) :
+    """Clone a RC type under another name.
+
+    source -- RC type as integer
+    name -- Name of the new type
+
+    """
+    type = findUnnamedType( target , start )
+    copyType( target , source , type )
+    return type
+
+@export
 def getList( rcTarget , rcId , item ) :
     """Retrieve a list of RC items (role or type).
 
@@ -1040,6 +1086,13 @@ class Type( object ) :
             except Error :
                 name = 'undefined'
             return '<RC Type [%d:%d] %s>' % ( target , type , name )
+    def copyTo( self , dest ) :
+        copyType( self.__id[ 0 ] , self.__id[ 1 ] , int( dest ) )
+    def clone( self , name = None ) :
+        type = Type( self.__id[ 0 ] , cloneType( *self.__id ) )
+        if name is not None :
+            type.name = name
+        return type
     #
     # target, type
     #