Updated TTL behavior to be consistent everywhere.
authorFrédéric Jolliton <git@frederic.jolliton.com>
Fri, 27 Oct 2006 13:25:31 +0000 (13:25 +0000)
committerFrédéric Jolliton <git@frederic.jolliton.com>
Fri, 27 Oct 2006 13:51:04 +0000 (13:51 +0000)
Previously, TTL were represented in 2 different ways:

 * None or a positive integer (where None meant unlimited TTL)

 * False, True or a positive integer (where False mean undefined TTL,
 and True mean unlimited TTL)

The latter is now the default behavior for all the TTLs.

Low level functions still use "raw" TTL (0 for unlimited TTL and
a positive integer otherwise.)

rsbac/_utils.py
rsbac/acl.py
rsbac/objects.py
rsbac/transaction.py
rsbac/um.py

index 2ad457e..ad4f497 100644 (file)
@@ -41,6 +41,8 @@ def slowButCorrectStringAssignation( object , field , data , nul = 1 ) :
     character. Also, a NUL character is silently interpreted as the
     end of the string!
 
+    This function take cares of these points.
+
     """
     if '\x00' in data :
         raise RuntimeError , 'a string intended for ctypes cannot contains the NUL character.'
@@ -137,7 +139,7 @@ def fetch( type , fun , start = None ) :
     Fetch one or several RSBAC arrays of types specified by 'type', by
     calling the function 'fun'. This function should takes several
     arguments: the first argument receive the number of items to
-    retrieve, and the remaining argument are ctypes pointer to already
+    retrieve and the remaining argument are ctypes pointer to already
     allocated arrays. This function act as a callback called by fetch,
     and may be called an unspecified number of times.
 
@@ -188,10 +190,15 @@ def fetch( type , fun , start = None ) :
             n += n // 2 + 1
         return tuple( arr[ : m ] for arr in arrs )
 
+#--[ TTL ]--------------------------------------------------------------------
+
+undefinedTtl = False
+unlimitedTtl = True
+
 def ttlToInt( ttl ) :
-    if ttl is None :
+    if ttl is True :
         ttl = 0
-    else :
+    else : # include False
         ttl = int( ttl )
         if ttl < 1 :
             ttl = 1
@@ -199,7 +206,7 @@ def ttlToInt( ttl ) :
 
 def intToTtl( n ) :
     if not n :
-        return None
+        return True
     else :
         assert n >= 1
         return int( n )
index adfffa1..8a5d72b 100644 (file)
@@ -34,7 +34,7 @@ from ctypes import byref, pointer
 from rsbac import headers, lib, transaction
 from rsbac._data import AclRequestVector
 from rsbac.errors import raiseIfError, Error
-from rsbac._utils import fetch, intToTtl, ttlToInt
+from rsbac._utils import fetch, intToTtl, ttlToInt, unlimitedTtl
 
 g_aclSyscallArg = headers.rsbac_acl_syscall_arg_t()
 g_aclSyscallArgRef = byref( g_aclSyscallArg )
@@ -88,7 +88,7 @@ def _from_acl_subject( type , id ) :
 # set_acl_entry
 #
 
-def setAclEntryById( target , subject , rights , ttl = None ) :
+def setAclEntryById( target , subject , rights , ttl = unlimitedTtl ) :
     st , si = _to_acl_subject( subject )
     raiseIfError( lib.rsbac_acl( transaction._t ,
                                  headers.ACLC_set_acl_entry ,
@@ -96,7 +96,7 @@ def setAclEntryById( target , subject , rights , ttl = None ) :
                                               st , si ,
                                               int( rights ) , ttlToInt( ttl ) ) ) )
 
-def setAclEntryByName( target , subject , rights , ttl = None ) :
+def setAclEntryByName( target , subject , rights , ttl = unlimitedTtl ) :
     st , si = _to_acl_subject( subject )
     raiseIfError( lib.rsbac_acl_n( transaction._t ,
                                    headers.ACLC_set_acl_entry ,
@@ -257,13 +257,13 @@ def getAclMaskByName( target ) :
 #
 
 @export
-def setAclEntry( target , subject , rights , ttl = None ) :
+def setAclEntry( target , subject , rights , ttl = unlimitedTtl ) :
     """Set an ACL entry for a target-subject couple.
 
     target -- Object
     subject -- either an instance of objects.User, acl.Group or rc.Role.
     rights -- AclRequestVector
-    ttl -- None or a positive integer
+    ttl -- TTL
 
     """
     if target._byName :
@@ -437,7 +437,7 @@ class EffectiveAclByName( AclBase ) :
     def __iter__( self ) :
         return ( n[ 0 ] for n in self.__list() )
     def __getitem__( self , subject ) :
-        return getAclRightsByName( self.target , subject , True ) , False
+        return getEffectiveAclRightsByName( self.target , subject ) , False
 
 #--[ Group ]------------------------------------------------------------------
 
@@ -570,12 +570,12 @@ def getGroupList( includeGlobal = False ) :
     return map( _unpackEntry , arr )
 
 @export
-def addGroupMember( group , user , ttl = None ) :
+def addGroupMember( group , user , ttl = unlimitedTtl ) :
     """Add a member to an ACL group.
 
     group -- ACL group as integer
     user -- user as integer
-    ttl -- None or a positive integer
+    ttl -- TTL
 
     """
     arg = headers.rsbac_acl_group_syscall_arg_t()
@@ -658,8 +658,6 @@ class AclGroupMembersTtlDictProxy( object ) :
     def __getitem__( self , user ) :
         for uid , ttl in getGroupMembers( self.__group ) :
             if uid == user :
-                if ttl is None :
-                    ttl = True
                 return ttl
         return False
     def __setitem__( self , user , value ) :
@@ -669,13 +667,13 @@ class AclGroupMembersTtlDictProxy( object ) :
     def __repr__( self ) :
         r = []
         for user , ttl in getGroupMembers( self.__group ) :
-            if ttl is None :
+            if ttl is True :
                 r.append( str( user ) )
             else :
                 r.append( '%s(%ds)' % ( user , ttl ) )
         return '<Members for ACL group %d: %s>' \
             % ( self.__group , ', '.join( r ) or 'none' )
-    def add( self , user , ttl = None ) :
+    def add( self , user , ttl = unlimitedTtl ) :
         addGroupMember( self.__group , user , ttl )
     def discard( self , user ) :
         removeGroupMember( self.__group , user )
index 40d9dca..05deb7b 100644 (file)
@@ -40,7 +40,7 @@ from rsbac._data import FileFlags, PaxFlags, CapsFlags, JailFlags
 from rsbac.errors import Error, raiseIfError
 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 ipToInt, intToIp
 from rsbac._utils import processName, digits
 from rsbac.roles import SystemRole
 
index 763a3a1..b256019 100644 (file)
@@ -30,6 +30,7 @@ from ctypes import byref
 
 from rsbac import headers, lib
 from rsbac.errors import raiseIfError
+from rsbac._utils import intToTtl, ttlToInt, unlimitedTtl
 
 # Minimal transaction support. FIXME: Integrate transactions into the
 # rest of the modules. For example, as a global (g_transaction
@@ -71,11 +72,8 @@ def _with( o , fun , args = () ) :
 def withCurrentTransaction( n , fun ) :
     return _with( CurrentTransaction( n ) , fun )
 
-def withTransaction( fun , uid = g_ALL_USERS , password = None , ttl = None ) :
-    if ttl is None :
-        ttl = 0
-    else :
-        ttl = max( ttl , 1 )
+def withTransaction( fun , uid = g_ALL_USERS , password = None , ttl = unlimitedTtl ) :
+    ttl = ttlToInt( ttl )
     n = begin( uid , password , ttl )
     try :
         _with( CurrentTransaction( n ) , fun , ( Transaction( n ) , ) )
@@ -85,6 +83,8 @@ def withTransaction( fun , uid = g_ALL_USERS , password = None , ttl = None ) :
         # transaction is fine.
         lib.rsbac_list_ta_forget( n , password )
 
+#--[ Low level ]--------------------------------------------------------------
+
 def begin( uid = g_ALL_USERS , password = None , ttl = 0 ) :
     value = headers.rsbac_list_ta_number_t()
     raiseIfError( lib.rsbac_list_ta_begin( ttl , byref( value ) ,
@@ -101,6 +101,8 @@ def commit( transaction , password = None ) :
 def forget( transaction , password = None ) :
     raiseIfError( lib.rsbac_list_ta_forget( transaction , password ) )
 
+#--[ Wrapper ]----------------------------------------------------------------
+
 class Transaction( object ) :
     __slots__ = ( 'id' , 'password' )
     def __init__( self , id , password = None ) :
@@ -108,7 +110,7 @@ class Transaction( object ) :
         self.password = password
     def __repr__( self ) :
         return '<Transaction %d>' % ( self.id , )
-    def refresh( self , ttl = None ) :
+    def refresh( self , ttl = unlimitedTtl ) :
         return refresh( self.id , self.password , ttlToInt( ttl ) )
     def commit( self ) :
         return commit( self.id , self.password )
index 5506db9..678b10f 100644 (file)
@@ -35,7 +35,7 @@ from ctypes import byref
 
 from rsbac import lib, headers, transaction
 from rsbac._utils import stringToByteArray, aptr, slowButCorrectStringAssignation
-from rsbac._utils import fetch, intToTtl, ttlToInt
+from rsbac._utils import fetch, intToTtl, ttlToInt, unlimitedTtl
 from rsbac.errors import Error, raiseIfError
 
 g_umModData = headers.rsbac_um_mod_data_t()
@@ -86,13 +86,13 @@ def _makeDefaultGroupEntry() :
     return groupEntry
 
 @export
-def addUser( name , uid = None , password = None , ttl = None ) :
+def addUser( name , uid = None , password = None , ttl = unlimitedTtl ) :
     """Add a user to the UM module.
 
     name -- username as string
     uid -- None or a prefered UID as integer
     password -- None or a default password as string
-    ttl -- None or an integer
+    ttl -- TTL
 
     Returns the UID of the newly created user.
 
@@ -109,13 +109,13 @@ def addUser( name , uid = None , password = None , ttl = None ) :
     return User( getUid( name ) )
 
 @export
-def addGroup( name , gid = None , password = None , ttl = None ) :
+def addGroup( name , gid = None , password = None , ttl = unlimitedTtl ) :
     """Add a group to the UM module.
 
     name -- group name as string
     gid -- None or a prefered GID as integer
     password -- None or a default password as string
-    ttl -- None or an integer
+    ttl -- TTL
 
     """
     if gid is None :
@@ -130,12 +130,12 @@ def addGroup( name , gid = None , password = None , ttl = None ) :
     return Group( getGid( name ) )
 
 @export
-def addToGroups( uid , gid , ttl = None ) :
+def addToGroups( uid , gid , ttl = unlimitedTtl ) :
     """Add an UM user to an UM group.
 
     uid -- UID as integer
     gid -- GID as integer
-    ttl -- None or an integer
+    ttl -- TTL
 
     """
     ttl = ttlToInt( ttl )
@@ -461,7 +461,7 @@ def getUserTtl( uid ) :
 
     uid -- UID as integer
 
-    Returns either None (no TTL) or a non-negative integer.
+    Returns TTL.
 
     """
     raiseIfError( lib.rsbac_um_get_user_item( transaction._t , uid ,
@@ -474,10 +474,10 @@ def setUserTtl( uid , ttl ) :
     """Set the TTL of an UM user.
 
     uid -- UID as integer
-    ttl -- None or an integer.
+    ttl -- TTL
 
     """
-    g_umModData.ttl = ttl
+    g_umModData.ttl = ttlToInt( ttl )
     raiseIfError( lib.rsbac_um_mod_user( transaction._t , uid ,
                                          headers.UM_ttl ,
                                          g_umModDataRef ) )
@@ -611,7 +611,7 @@ def getGroupTtl( gid ) :
 
     gid -- GID as integer
 
-    Returns None or a positive integer.
+    Returns TTL.
 
     """
     raiseIfError( lib.rsbac_um_get_group_item( transaction._t , gid ,
@@ -624,10 +624,10 @@ def setGroupTtl( gid , ttl ) :
     """Set the TTL of an UM group
 
     gid -- GID as integer
-    ttl -- None or an integer.
+    ttl -- TTL
 
     """
-    g_umModData.ttl = ttl
+    g_umModData.ttl = ttlToInt( ttl )
     raiseIfError( lib.rsbac_um_mod_group( transaction._t , gid ,
                                           headers.UM_ttl ,
                                           g_umModDataRef ) )
@@ -641,7 +641,7 @@ class UserGroups( object ) :
         return iter( getGroupsList( self._uid ) )
     def __repr__( self ) :
         return '<Groups for user %d: %s>' % ( self._uid , list( self ) or 'none' )
-    def add( self , gid , ttl = None ) :
+    def add( self , gid , ttl = unlimitedTtl ) :
         addToGroups( self._uid , int( gid ) , ttl )
     def discard( self , gid ) :
         removeFromGroups( self._uid , int( gid ) )
@@ -666,10 +666,10 @@ class UserBase( object ) :
             name = 'undefined'
         try :
             ttl = self.getTtl()
-            if ttl is not None :
-                ttl = ' (%ds)' % ttl
-            else :
+            if ttl is True :
                 ttl = ''
+            else :
+                ttl = ' (%ds)' % ttl
         except Error , e :
             if e[ 0 ] != headers.RSBAC_ENOTFOUND :
                 raise
@@ -798,10 +798,10 @@ class Group( object ) :
             name = 'undefined'
         try :
             ttl = self.getTtl()
-            if ttl is not None :
-                ttl = ' (%d)' % ttl
-            else :
+            if ttl is True :
                 ttl = ''
+            else :
+                ttl = ' (%d)' % ttl
         except Error , e :
             if e[ 0 ] != headers.RSBAC_ENOTFOUND :
                 raise