Added rsbac.auth module.
authorFrédéric Jolliton <git@frederic.jolliton.com>
Fri, 27 Oct 2006 13:12:40 +0000 (13:12 +0000)
committerFrédéric Jolliton <git@frederic.jolliton.com>
Fri, 27 Oct 2006 13:12:40 +0000 (13:12 +0000)
rsbac/__init__.py
rsbac/auth.py [new file with mode: 0644]

index ecc8196..30139d9 100644 (file)
@@ -20,7 +20,7 @@
 __all__ = [
     'Error' ,
     'adf' , 'module' , 'transaction' , 'objects' , 'rc' , 'um' , 'data' ,
-    'jail' , 'acl' , 'daz' , 'roles' ,
+    'jail' , 'acl' , 'daz' , 'roles' , 'auth' ,
     'moduleVersion' , 'headerVersion' , 'kernelVersion' ]
 
 import sys
@@ -33,7 +33,8 @@ 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, roles
+from rsbac import adf, module, transaction, objects
+from rsbac import rc, um, data, jail, acl, daz, roles, auth
 
 __all__ += _data.__all__
 __all__ += _misc.__all__
diff --git a/rsbac/auth.py b/rsbac/auth.py
new file mode 100644 (file)
index 0000000..ad04baf
--- /dev/null
@@ -0,0 +1,180 @@
+# -*- 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__ = []
+
+def export( o ) :
+    if not isinstance( o , basestring ) :
+        name = o.__name__
+    else :
+        name , o = o , None
+    if name in __all__ :
+        raise ImportError , 'duplicate name %r in module %r' % ( name , __name__ )
+    __all__.append( name )
+    return o
+
+from rsbac import lib, headers
+from rsbac import transaction
+from rsbac.errors import raiseIfError
+from rsbac._utils import fetch, intToTtl, ttlToInt, unlimitedTtl
+
+_g_range = headers.rsbac_auth_cap_range_t()
+
+def _fromRange( r ) :
+    a , b = r.first , r.last
+    if a == b :
+        return int( a )
+    else :
+        return int( a ) , int( b )
+
+def _simplifyRange( value ) :
+    if isinstance( value , tuple ) and len( tuple ) == 2 and value[ 0 ] == value[ 1 ] :
+        return value[ 0 ]
+    else :
+        return value
+
+def _toRange( value ) :
+    range = _g_range
+    if isinstance( value , ( int , long ) ) :
+        range.first = range.last = value
+    elif isinstance( value , tuple ) :
+        range.first , range.last = value
+    else :
+        raise RuntimeError
+    return range
+
+def addProcessAuthCapList( pid , type , range , ttl = unlimitedTtl ) :
+    return raiseIfError( lib.rsbac_auth_add_p_cap( transaction._t ,
+                                                   pid , type ,
+                                                   _toRange( range ) ,
+                                                   ttlToInt( ttl ) ) )
+
+def removeProcessAuthCapList( pid , type , range , ttl = unlimitedTtl ) :
+    return raiseIfError( lib.rsbac_auth_remove_p_cap( transaction._t ,
+                                                      pid , type ,
+                                                      _toRange( range ) ,
+                                                      ttlToInt( ttl ) ) )
+
+def addFdAuthCapList( path , type , range , ttl = unlimitedTtl ) :
+    return raiseIfError( lib.rsbac_auth_add_f_cap( transaction._t ,
+                                                   path , type ,
+                                                   _toRange( range ) ,
+                                                   ttlToInt( ttl ) ) )
+
+def removeFdAuthCapList( path , type , range , ttl = unlimitedTtl ) :
+    return raiseIfError( lib.rsbac_auth_remove_f_cap( transaction._t ,
+                                                      path , type ,
+                                                      _toRange( range ) ,
+                                                      ttlToInt( ttl ) ) )
+
+def getFdAuthCapList( path , type ) :
+    ranges , ttls = \
+            fetch( ( headers.rsbac_auth_cap_range_t ,
+                     headers.rsbac_time_t ) ,
+                   lambda n , a , b :
+                   lib.rsbac_auth_get_f_caplist( transaction._t ,
+                                                 path , type ,
+                                                 a , b ,
+                                                 n ) ,
+                   32 )
+    return [ ( _range( r ) , intToTtl( ttl ) ) for r , ttl in zip( ranges , ttls ) ]
+
+def getProcessAuthCapList( pid , type ) :
+    ranges , ttls = \
+            fetch( ( headers.rsbac_auth_cap_range_t ,
+                     headers.rsbac_time_t ) ,
+                   lambda n , a , b :
+                   lib.rsbac_auth_get_p_caplist( transaction._t ,
+                                                 pid ,
+                                                 type ,
+                                                 a , b ,
+                                                 n ) ,
+                   32 )
+    return [ ( _range( r ) , intToTtl( ttl ) ) for r , ttl in zip( ranges , ttls ) ]
+
+@export
+def addAuthCapabilityList( target , type , range , ttl = unlimitedTtl ) :
+    if instance( target , Process ) :
+        return addProcessAuthCapList( type.pid , range , ttl )
+    elif isinstance( target , FDBase ) :
+        return addFdAuthCapList( type._id , range , ttl )
+    else :
+        raise RuntimeError , 'unexpected object %r' % ( target , )
+
+@export
+def delAuthCapabilityList( target , type , range ) :
+    if instance( target , Process ) :
+        return removeProcessAuthCapList( type.pid , range )
+    elif isinstance( target , FDBase ) :
+        return removeFdAuthCapList( type._id , range )
+    else :
+        raise RuntimeError , 'unexpected object %r' % ( target , )
+
+@export
+def getAuthCapabilityList( target , type ) :
+    if instance( target , Process ) :
+        return getProcessAuthCapList( type.pid )
+    elif isinstance( target , FDBase ) :
+        return getFdAuthCapList( type._id )
+    else :
+        raise RuntimeError , 'unexpected object %r' % ( target , )
+
+class AuthCapDictProxyBase( object ) :
+    __slots__ = ()
+    def keys( self ) :
+        return [ i[ 0 ] for i in self.items() ]
+    def values( self ) :
+        return [ i[ 1 ] for i in self.items() ]
+    def __getitem__( self , range ) :
+        range = _simplifyRange( range )
+        for k , v in self.items() :
+            if k == range :
+                return v or True
+        else :
+            return False
+
+class AuthCapDictProxyProcess( AuthCapDictProxyBase ) :
+    __slots__ = ( '_target' , '_type' )
+    def __init__( self , target , type ) :
+        super( AuthCapDictProxyProcess , self ).__init__()
+        self._target = target
+        self._type = type
+    def __setitem__( self , range , value ) :
+        range = _simplifyRange( range )
+        if value is True :
+            value = None
+        addProcessAuthCapList( self._target , self._type , range , value )
+    def items( self ) :
+        return getProcessAuthCapList( self._target , self._type )
+
+class AuthCapDictProxyFd( AuthCapDictProxyBase ) :
+    __slots__ = ( '_target' , '_type' )
+    def __init__( self , target , type ) :
+        super( AuthCapDictProxyFd , self ).__init__()
+        self._target = target
+        self._type = type
+    def items( self ) :
+        return getFdAuthCapList( self._target , self._type )
+
+from rsbac.objects import Process, FDBase
+
+# Local Variables:
+# indent-tabs-mode: nil
+# python-indent: 4
+# End: