Added the roles module, including a SystemRole class. Updated objects to use it.
authorFrédéric Jolliton <git@frederic.jolliton.com>
Thu, 26 Oct 2006 01:40:27 +0000 (01:40 +0000)
committerFrédéric Jolliton <git@frederic.jolliton.com>
Thu, 26 Oct 2006 01:40:27 +0000 (01:40 +0000)
rsbac/__init__.py
rsbac/objects.py
rsbac/roles.py [new file with mode: 0644]

index 98a35a3..ecc8196 100644 (file)
@@ -20,7 +20,7 @@
 __all__ = [
     'Error' ,
     'adf' , 'module' , 'transaction' , 'objects' , 'rc' , 'um' , 'data' ,
-    'jail' , 'acl' , 'daz' ,
+    'jail' , 'acl' , 'daz' , 'roles' ,
     'moduleVersion' , 'headerVersion' , 'kernelVersion' ]
 
 import sys
@@ -33,7 +33,7 @@ moduleVersion = ( 0 , 0 , 1 , '' )
 from rsbac.errors import Error
 from rsbac._data import *
 from rsbac._misc import *
-from rsbac import adf, module, transaction, objects, rc, um, data, jail, acl, daz
+from rsbac import adf, module, transaction, objects, rc, um, data, jail, acl, daz, roles
 
 __all__ += _data.__all__
 __all__ += _misc.__all__
index 85662f6..40d9dca 100644 (file)
@@ -42,6 +42,7 @@ from rsbac._utils import aptr, slowButCorrectStringAssignation
 from rsbac._utils import stringToByteArray, byteArrayToString, fetch
 from rsbac._utils import ipToInt, intToIp, ttlToInt, intToTtl
 from rsbac._utils import processName, digits
+from rsbac.roles import SystemRole
 
 # Singleton. Obviously bad for MT. But good for performance..
 g_attributeValue = headers.rsbac_attribute_value_t()
@@ -289,6 +290,8 @@ def buildObjectClass( className , parents , target , byName ) :
                 mpre , mpost = int , PaxFlags
             elif ctype == 'rsbac_cap_vector_t' :
                 mpre , mpost = int , CapsFlags
+            elif ctype == 'rsbac_system_role_int_t' :
+                mpre , mpost = int , SystemRole
             else :
                 mpre , mpost = None , None
             if ctype == 'rsbac_res_array_t' :
@@ -298,6 +301,7 @@ def buildObjectClass( className , parents , target , byName ) :
             addAttribute( module , attributeId , attribute , field ,
                           pre , post , mpre , mpost )
         fields.add( field )
+    # FIXME: remote_log_array_{high,low} too !
     if 'log_array_low' in fields and 'log_array_high' in fields :
         addLogArrayAttribute()
         attributes.append( 'log_array' )
diff --git a/rsbac/roles.py b/rsbac/roles.py
new file mode 100644 (file)
index 0000000..81a95d5
--- /dev/null
@@ -0,0 +1,62 @@
+# -*- coding:utf-8 -*-
+
+# py-rsbac - RSBAC Python bindings
+# Copyright (C) 2006  Frederic Jolliton <pyrsbac@tuxee.net>
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+# 
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+__all__ = [ 'SystemRole' ]
+
+import sys
+
+from rsbac import headers
+
+_g_systemRolesName = {}
+_g_systemRoles = {}
+
+class SystemRole( object ) :
+    __slots__ = ( 'id' , )
+    def __new__( cls , id ) :
+        instance = _g_systemRoles.get( id )
+        if instance is None :
+            instance = object.__new__( cls )
+            instance.__init_singleton__( id )
+            _g_systemRoles[ id ] = instance
+        return instance
+    def __init_singleton__( self , id ) :
+        self.id = id
+    def __int__( self ) :
+        return int( self.id )
+    def __long__( self ) :
+        return long( self.id )
+    def __repr__( self ) :
+        return '<SystemRole %s [%d]>' % ( _g_systemRolesName.get( self.id , '??' ) , self.id )
+
+def createSystemRoles() :
+    m = sys.modules[ __name__ ]
+    for name in dir( headers ) :
+        if name.startswith( 'SR_' ) and name.upper() != 'SR_NONE' :
+            role = name[ 3 : ]
+            value = getattr( headers , name )
+            _g_systemRolesName[ value ] = role
+            setattr( m , role , SystemRole( value ) )
+            __all__.append( role )
+createSystemRoles()
+del createSystemRoles
+
+# Local Variables:
+# indent-tabs-mode: nil
+# python-indent: 4
+# End: