Author: chrisz
Date: Sat Jan 26 07:13:39 2008
New Revision: 4056
URL: http://trac.turbogears.org/changeset/4056

Log:
Fixed CP request header inspection in the identity inspection (merged r3498 
from 1.0 to 1.1 branch).

Modified:
   branches/1.1/turbogears/command/base.py
   branches/1.1/turbogears/identity/conditions.py

Modified: branches/1.1/turbogears/command/base.py
==============================================================================
--- branches/1.1/turbogears/command/base.py     (original)
+++ branches/1.1/turbogears/command/base.py     Sat Jan 26 07:13:39 2008
@@ -13,7 +13,7 @@
 import turbogears
 from turbogears.util import get_model, load_project_config, \
         get_project_config, get_package_name
-from turbogears.identity import SecureObject,from_any_host
+from turbogears.identity import SecureObject, from_any_host
 from turbogears import config, database
 from sacommand import sacommand
 

Modified: branches/1.1/turbogears/identity/conditions.py
==============================================================================
--- branches/1.1/turbogears/identity/conditions.py      (original)
+++ branches/1.1/turbogears/identity/conditions.py      Sat Jan 26 07:13:39 2008
@@ -52,16 +52,17 @@
     A compound predicate that evaluates to true if any one of its 
sub-predicates
     evaluates to true.
     '''
-    error_message= "No predicates were able to grant access"
+    error_message = "No predicates were able to grant access"
 
-    def eval_with_object( self, obj, errors=None ):
+    def eval_with_object(self, obj, errors=None):
         '''
         Return true if any sub-predicate evaluates to true.
         '''
         for p in self.predicates:
-            if p.eval_with_object( obj, None ):
+            if p.eval_with_object(obj, None):
                 return True
-        self.append_error_message( errors )
+
+        self.append_error_message(errors)
         return False
 
 
@@ -70,22 +71,23 @@
     A mix-in helper class for Identity Predicates.
     '''
     def __nonzero__(self):
-        return self.eval_with_object( current )
+        return self.eval_with_object(current)
 
 
 class in_group(Predicate, IdentityPredicateHelper):
     '''
     Predicate for requiring a group.
     '''
-    error_message= "Not member of group: %(group_name)s"
+    error_message = "Not member of group: %(group_name)s"
 
     def __init__(self, group_name):
-        self.group_name= group_name
+        self.group_name = group_name
 
-    def eval_with_object( self, identity, errors=None ):
+    def eval_with_object(self, identity, errors=None):
         if self.group_name in identity.groups:
             return True
-        self.append_error_message( errors )
+
+        self.append_error_message(errors)
         return False
 
 
@@ -94,8 +96,8 @@
     Predicate for requiring membership in a number of groups.
     '''
     def __init__(self, *groups):
-        group_predicates= [in_group(g) for g in groups]
-        super(in_all_groups,self).__init__( *group_predicates )
+        group_predicates = [in_group(g) for g in groups]
+        super(in_all_groups,self).__init__(*group_predicates)
 
 
 class in_any_group(Any, IdentityPredicateHelper):
@@ -105,9 +107,9 @@
     error_message= "Not member of any group: %(group_list)s"
 
     def __init__(self, *groups):
-        self.group_list= ", ".join(groups)
-        group_predicates= [in_group(g) for g in groups]
-        super(in_any_group,self).__init__( *group_predicates )
+        self.group_list = ", ".join(groups)
+        group_predicates = [in_group(g) for g in groups]
+        super(in_any_group,self).__init__(*group_predicates)
 
 
 class not_anonymous(Predicate, IdentityPredicateHelper):
@@ -116,10 +118,11 @@
     '''
     error_message= "Anonymous access denied"
 
-    def eval_with_object( self, identity, errors=None ):
+    def eval_with_object(self, identity, errors=None):
         if current.anonymous:
-            self.append_error_message( errors )
+            self.append_error_message(errors)
             return False
+
         return True
 
 
@@ -127,10 +130,10 @@
     '''
     Predicate for checking whether the visitor has a particular permission.
     '''
-    error_message= "Permission denied: %(permission_name)s"
+    error_message = "Permission denied: %(permission_name)s"
 
     def __init__(self, permission_name):
-        self.permission_name= permission_name
+        self.permission_name = permission_name
 
     def eval_with_object(self, identity, errors=None):
         '''
@@ -139,7 +142,7 @@
         if self.permission_name in identity.permissions:
             return True
 
-        self.append_error_message( errors )
+        self.append_error_message(errors)
         return False
 
 
@@ -148,27 +151,28 @@
     Predicate for checking whether the visitor has all permissions.
     '''
     def __init__(self, *permissions):
-        permission_predicates= [has_permission(p) for p in permissions]
-        super(has_all_permissions,self).__init__( *permission_predicates )
+        permission_predicates = [has_permission(p) for p in permissions]
+        super(has_all_permissions,self).__init__(*permission_predicates)
 
 
 class has_any_permission(Any, IdentityPredicateHelper):
     '''
     Predicate for checking whether the visitor has at least one permission.
     '''
-    error_message= "No matching permissions: %(permission_list)s"
+    error_message = "No matching permissions: %(permission_list)s"
 
     def __init__(self, *permissions):
-        self.permission_list= ", ".join( permissions )
-        permission_predicates= [has_permission(p) for p in permissions]
-        super(has_any_permission,self).__init__( *permission_predicates )
+        self.permission_list = ", ".join(permissions)
+        permission_predicates = [has_permission(p) for p in permissions]
+        super(has_any_permission,self).__init__(*permission_predicates)
 
 
 def _remoteHost():
     try:
-        ips= cherrypy.request.headers.get( "X-Forwarded-For",
-                                             cherrypy.request.remote_host )
+        ips = cherrypy.request.headers.get(
+                "X-Forwarded-For", cherrypy.request.headers.get('Remote-Addr'))
         return ips.split(",")[-1].strip()
+
     except:
         return ""
 
@@ -176,6 +180,7 @@
 def _match_ip(cidr, ip):
     if not '/' in cidr:
         return cidr == ip
+
     else:
         try:
             b,m = cidr.split('/')
@@ -183,6 +188,7 @@
             a1 = struct.unpack('!L', socket.inet_aton(b))[0] >> shift
             a2 = struct.unpack('!L', socket.inet_aton(ip))[0] >> shift
             return a1 == a2
+
         except:
             return False
 
@@ -193,19 +199,20 @@
     Note: We never want to announce what the list of allowed hosts is, because
     it is way too easy to spoof an IP address in a TCP/IP packet.
     '''
-    error_message= "Access from this host is not permitted."
+    error_message = "Access from this host is not permitted."
 
     def __init__(self, host):
-        self.host= host
+        self.host = host
 
-    def eval_with_object( self, obj, errors=None ):
+    def eval_with_object(self, obj, errors=None):
         '''
         Match the visitor's host against the criteria.
         '''
         ip = _remoteHost()
-        if _match_ip( self.host, ip ):
+        if _match_ip(self.host, ip):
             return True
-        self.append_error_message( errors )
+
+        self.append_error_message(errors)
         return False
 
 
@@ -214,11 +221,11 @@
     Predicate for checking whether the visitor's host is one of a number of
     permitted hosts.
     '''
-    error_message= "Access from this host is not permitted."
+    error_message = "Access from this host is not permitted."
 
     def __init__(self, hosts):
-        host_predicates= [from_host(h) for h in hosts]
-        super(from_any_host,self).__init__( *host_predicates )
+        host_predicates = [from_host(h) for h in hosts]
+        super(from_any_host, self).__init__(*host_predicates)
 
 
 def require(predicate, obj=None):
@@ -229,113 +236,132 @@
     def entangle(fn):
         def require(func, self, *args, **kwargs):
             try:
-                errors= []
+                errors = []
                 if predicate is None or \
                    predicate.eval_with_object(current, errors):
                     return fn(self, *args, **kwargs)
+
             except IdentityException, e:
-                errors= [str(e)]
+                errors = [str(e)]
 
             raise IdentityFailure(errors)
 
-        fn._require= predicate
+        fn._require = predicate
         return require
+
     return weak_signature_decorator(entangle)
 
-def _secureResourceDecorator( fn ):
+def _secureResourceDecorator(fn):
     '''
     A decorator function used by the SecureResourceMeta metaclass.
     '''
-    def _wrapper( self, *args, **kwargs ):
-        predicate= getattr( self.__class__, "require", None )
+    def _wrapper(self, *args, **kwargs):
+        predicate = getattr(self.__class__, "require", None)
 
         try:
-            errors= []
+            errors = []
             if predicate is None or \
-               predicate.eval_with_object( current, errors ):
-                return fn( self, *args, **kwargs )
+               predicate.eval_with_object(current, errors):
+                return fn(self, *args, **kwargs)
+
         except IdentityException, e:
-            errors= [str(e)]
+            errors = [str(e)]
 
-        raise IdentityFailure( errors )
+        raise IdentityFailure(errors)
 
     try:
-        _wrapper.func_name= fn.func_name
+        _wrapper.func_name = fn.func_name
+
     except TypeError:
         pass
-    if hasattr( fn, "exposed" ):
-        _wrapper.exposed= fn.exposed
+
+    if hasattr(fn, "exposed"):
+        _wrapper.exposed = fn.exposed
+
     return _wrapper
 
 
-def _check_method( obj, fn, predicate ):
-    def _wrapper( *args, **kw ):
+def _check_method(obj, fn, predicate):
+    def _wrapper(*args, **kw):
         errors= []
-        if predicate.eval_with_object( current, errors ):
-            return fn( *args, **kw )
+        if predicate.eval_with_object(current, errors):
+            return fn(*args, **kw)
+
         else:
-            raise IdentityFailure( errors )
-    _wrapper.exposed= True
+            raise IdentityFailure(errors)
+
+    _wrapper.exposed = True
     return _wrapper
 
 
 class SecureResource(object):
 
-    def __getattribute__( self, name ):
+    def __getattribute__(self, name):
         from turbogears import controllers
-        if name[:3]=="_cp" or name in ["require"]:
+        if name[:3] == "_cp" or name in ["require"]:
             return object.__getattribute__(self,name)
+
         try:
-            value= object.__getattribute__(self,name)
+            value = object.__getattribute__(self,name)
             try:
-                predicate= object.__getattribute__(self,"require")
+                predicate = object.__getattribute__(self,"require")
+
             except AttributeError:
-                predicate= turbogears.config.get( "identity.require", None )
+                predicate = turbogears.config.get("identity.require", None)
 
             if predicate is None:
                 raise AttributeError("SecureResource requires a require "
                                      "attribute either on the controller class 
"
                                      "itself or in the config file")
 
-            errors= []
-            if (isinstance( value, types.MethodType ) and
-                hasattr( value, "exposed" )):
-                return _check_method( self, value, predicate )
-            if isinstance( value, controllers.Controller ):
-                return SecureObject( value, predicate )
+            errors = []
+            if (isinstance(value, types.MethodType) and
+                hasattr(value, "exposed")):
+                return _check_method(self, value, predicate)
+
+            if isinstance(value, controllers.Controller):
+                return SecureObject(value, predicate)
+
             # Some other property
             return value
+
         except IdentityException, e:
             errors= [str(e)]
 
-        raise IdentityFailure( errors )
+        raise IdentityFailure(errors)
 
 class SecureObject(object):
-    def __init__( self, obj, require, exclude=[]):
+    def __init__(self, obj, require, exclude=[]):
         self._exclude = exclude
-        self._object= obj
-        self._require= require
+        self._object = obj
+        self._require = require
 
-    def __getattribute__( self, name ):
+    def __getattribute__(self, name):
         from turbogears import controllers
-        if name[:3]=="_cp" or name in ["_object","_require","_exclude"]:
+        if name[:3] == "_cp" or name in ["_object", "_require", "_exclude"]:
             return object.__getattribute__(self,name)
+
         try:
-            obj= object.__getattribute__( self, "_object" )
-            value= getattr( obj, name )
+            obj = object.__getattribute__(self, "_object")
+            value = getattr(obj, name)
 
-            errors= []
-            predicate= object.__getattribute__(self,"_require")
+            errors = []
+            predicate = object.__getattribute__(self, "_require")
             if name in object.__getattribute__(self, "_exclude"):
                 return value
-            if (isinstance( value, types.MethodType ) and
-                hasattr( value, "exposed" )):
-                return _check_method( obj, value, predicate )
-            if isinstance( value, controllers.Controller ):
-                return SecureObject( value, predicate )
+
+            if (isinstance(value, types.MethodType) and
+                hasattr(value, "exposed")):
+                return _check_method(obj, value, predicate)
+
+            if isinstance(value, controllers.Controller):
+                return SecureObject(value, predicate)
+
             # Some other property
             return value
+
         except IdentityException, e:
-            errors= [str(e)]
+            errors = [str(e)]
+
+        raise IdentityFailure(errors)
 
-        raise IdentityFailure( errors )

Reply via email to