Changeset 5187

Show
Ignore:
Timestamp:
08/21/08 06:30:07 (5 months ago)
Author:
chrisz
Message:

By changing identity.failure_url and setting identity.force_external_redirect, it should be possible to login via https. Unfortunately, this did not work because of some flaws in the login mechanism: The login form creates two hidden fields for forward_url, and the login controller did not cope with the resulting list. Also, the previous_url parameter was not really used and has been removed. Another small problem was that the master template used a hardcoded login url instead of the url from the configuration.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/1.0/turbogears/identity/exceptions.py

    r4769 r5187  
    7777        if callable(url): 
    7878            url = url(errors) 
    79         force_external = turbogears.config.get( 
    80                 "identity.force_external_redirect", False) 
    81         if force_external: 
    82             # We need to use external redirect for https since 
    83             # we are managed by Apache/nginx or something else 
    84             # that CherryPy won't find. 
     79        if turbogears.config.get('identity.force_external_redirect', False): 
     80            # We need to use external redirect for https since we are managed 
     81            # by Apache/nginx or something else that CherryPy won't find. 
     82            # We also need to set the forward_url, because the Referer header 
     83            # won't work with an external redirect. 
    8584            params = cherrypy.request.params 
    86             params['forward_url'] = cherrypy.request.path 
     85            params['forward_url'] = cherrypy.request.object_path 
    8786            raise cherrypy.HTTPRedirect(turbogears.url(url, params)) 
    8887        else: 
  • branches/1.0/turbogears/identity/saprovider.py

    r4200 r5187  
    1212except NameError: # Python 2.3 
    1313    from sets import Set as set, ImmutableSet as frozenset 
     14 
    1415 
    1516# Global class references -- 
     
    2021visit_class = None 
    2122 
     23 
    2224class SqlAlchemyIdentity(object): 
    2325    """Identity that uses a model from a database (via SQLAlchemy).""" 
     
    112114        return visit_class.query.filter_by(visit_key=self.visit_key).first() 
    113115    visit_link = property(_get_visit_link) 
     116 
     117    def _get_login_url(self): 
     118        """Get the URL for the login page.""" 
     119        return identity.get_failure_url() 
     120    login_url = property(_get_login_url) 
    114121 
    115122    def login(self): 
  • branches/1.0/turbogears/identity/soprovider.py

    r4358 r5187  
    2222except NameError:  # Python 2.3 
    2323    from sets import Set as set, ImmutableSet as frozenset 
     24 
    2425 
    2526def to_db_encoding(s, encoding): 
     
    3233    return s 
    3334 
     35 
    3436class DeprecatedAttr(object): 
    3537    def __init__(self, old_name, new_name): 
     
    4648            (self.old_name, self.new_name), DeprecationWarning) 
    4749        return setattr(obj, self.new_name, value) 
     50 
    4851 
    4952# Global class references -- 
     
    5356permission_class = None 
    5457visit_class = None 
     58 
    5559 
    5660class SqlObjectIdentity(object): 
     
    157161    visit_link = property(_get_visit_link) 
    158162 
     163    def _get_login_url(self): 
     164        """Get the URL for the login page.""" 
     165        return identity.get_failure_url() 
     166    login_url = property(_get_login_url) 
     167 
    159168    def login(self): 
    160169        """Set the link between this identity and the visit.""" 
  • branches/1.0/turbogears/qstemplates/quickstartbig/+package+/controllers/root.py_tmpl

    r5156 r5187  
    2323 
    2424    ${b}expose(template="${package}.templates.login")${e} 
    25     def login(self, forward_url=None, previous_url=None, *args, **kw): 
     25    def login(self, forward_url=None, *args, **kw): 
     26 
     27        if forward_url: 
     28            if isinstance(forward_url, list): 
     29                forward_url = forward_url.pop(0) 
     30            else: 
     31                del request.params['forward_url'] 
    2632 
    2733        if not identity.current.anonymous and identity.was_login_attempted() \ 
    2834                and not identity.get_identity_errors(): 
    29             redirect(tg.url(forward_url or previous_url or '/', kw)) 
    30  
    31         forward_url = None 
    32         previous_url = request.object_path 
     35            redirect(tg.url(forward_url or '/', kw)) 
    3336 
    3437        if identity.was_login_attempted(): 
     
    3841            msg = _("You must provide your credentials before accessing " 
    3942                   "this resource.") 
     43            if not forward_url: 
     44                forward_url = request.object_path 
    4045        else: 
    4146            msg = _("Please log in.") 
    42             forward_url = request.headers.get("Referer", "/") 
     47            if not forward_url: 
     48                forward_url = request.headers.get("Referer", "/") 
    4349 
    4450        response.status = 403 
    45         return dict(message=msg, previous_url=previous_url, logging_in=True, 
    46             original_parameters=request.params, forward_url=forward_url) 
     51        return dict(logging_in=True, message=msg, 
     52            forward_url=forward_url, previous_url=request.object_path, 
     53            original_parameters=request.params) 
    4754 
    4855    ${b}expose()${e} 
  • branches/1.0/turbogears/qstemplates/quickstart/+package+/controllers.py_tmpl

    r5156 r5187  
    2323 
    2424    ${b}expose(template="${package}.templates.login")${e} 
    25     def login(self, forward_url=None, previous_url=None, *args, **kw): 
     25    def login(self, forward_url=None, *args, **kw): 
     26 
     27        if forward_url: 
     28            if isinstance(forward_url, list): 
     29                forward_url = forward_url.pop(0) 
     30            else: 
     31                del request.params['forward_url'] 
    2632 
    2733        if not identity.current.anonymous and identity.was_login_attempted() \ 
    2834                and not identity.get_identity_errors(): 
    29             redirect(tg.url(forward_url or previous_url or '/', kw)) 
    30  
    31         forward_url = None 
    32         previous_url = request.object_path 
     35            redirect(tg.url(forward_url or '/', kw)) 
    3336 
    3437        if identity.was_login_attempted(): 
     
    3841            msg = _("You must provide your credentials before accessing " 
    3942                   "this resource.") 
     43            if not forward_url: 
     44                forward_url = request.object_path 
    4045        else: 
    4146            msg = _("Please log in.") 
    42             forward_url = request.headers.get("Referer", "/") 
     47            if not forward_url: 
     48                forward_url = request.headers.get("Referer", "/") 
    4349 
    4450        response.status = 403 
    45         return dict(message=msg, previous_url=previous_url, logging_in=True, 
    46             original_parameters=request.params, forward_url=forward_url) 
     51        return dict(logging_in=True, message=msg, 
     52            forward_url=forward_url, previous_url=request.object_path, 
     53            original_parameters=request.params) 
    4754 
    4855    ${b}expose()${e} 
  • branches/1.0/turbogears/qstemplates/quickstart/+package+/templates/master.kid

    r3811 r5187  
    2323    <div py:if="tg.config('identity.on') and not defined('logging_in')" id="pageLogin"> 
    2424        <span py:if="tg.identity.anonymous"> 
    25             <a href="${tg.url('/login')}">Login</a> 
     25            <a href="${tg.url(tg.identity.login_url)}">Login</a> 
    2626        </span> 
    2727        <span py:if="not tg.identity.anonymous"> 
  • branches/1.1/turbogears/identity/exceptions.py

    r4769 r5187  
    1414def get_identity_errors(): 
    1515    return getattr(cherrypy.request, 'identity_errors', []) 
     16 
     17 
     18def get_failure_url(errors=None): 
     19    url = turbogears.config.get('identity.failure_url', None) 
     20    if url is None: 
     21        msg = "Missing URL for identity failure. Please fix this in app.cfg" 
     22        raise IdentityConfigurationException(msg) 
     23    if callable(url): 
     24        url = url(errors) 
     25    return url 
    1626 
    1727 
     
    7181        """Setup identity errors on the request and get URL from config.""" 
    7282        set_identity_errors(errors) 
    73         url = turbogears.config.get('identity.failure_url', None) 
    74         if url is None: 
    75             msg = "Missing URL for identity failure. Please fix this in app.cfg" 
    76             raise IdentityConfigurationException(msg) 
    77         if callable(url): 
    78             url = url(errors) 
    79         force_external = turbogears.config.get( 
    80                 "identity.force_external_redirect", False) 
    81         if force_external: 
    82             # We need to use external redirect for https since 
    83             # we are managed by Apache/nginx or something else 
    84             # that CherryPy won't find. 
     83        url = get_failure_url(errors) 
     84        if turbogears.config.get('identity.force_external_redirect', False): 
     85            # We need to use external redirect for https since we are managed 
     86            # by Apache/nginx or something else that CherryPy won't find. 
     87            # We also need to set the forward_url, because the Referer header 
     88            # won't work with an external redirect. 
    8589            params = cherrypy.request.params 
    86             params['forward_url'] = cherrypy.request.path 
     90            params['forward_url'] = cherrypy.request.object_path 
    8791            raise cherrypy.HTTPRedirect(turbogears.url(url, params)) 
    8892        else: 
  • branches/1.1/turbogears/identity/saprovider.py

    r4200 r5187  
    77import logging 
    88log = logging.getLogger("turbogears.identity.saprovider") 
     9 
    910 
    1011# Global class references -- 
     
    1516visit_class = None 
    1617 
     18 
    1719class SqlAlchemyIdentity(object): 
    1820    """Identity that uses a model from a database (via SQLAlchemy).""" 
     
    107109            return None 
    108110        return visit_class.query.filter_by(visit_key=self.visit_key).first() 
     111 
     112    @property 
     113    def login_url(self): 
     114        """Get the URL for the login page.""" 
     115        return identity.get_failure_url() 
    109116 
    110117    def login(self): 
  • branches/1.1/turbogears/identity/soprovider.py

    r4199 r5187  
    1616hub = PackageHub("turbogears.identity") 
    1717__connection__ = hub 
     18 
    1819 
    1920def to_db_encoding(s, encoding): 
     
    2627    return s 
    2728 
     29 
    2830# Global class references -- 
    2931# these will be set when the provider is initialised. 
     
    3234permission_class = None 
    3335visit_class = None 
     36 
    3437 
    3538class SqlObjectIdentity(object): 
     
    136139            return None 
    137140 
     141    @property 
     142    def login_url(self): 
     143        """Get the URL for the login page.""" 
     144        return identity.get_failure_url() 
     145 
    138146    def login(self): 
    139147        """Set the link between this identity and the visit.""" 
  • branches/1.1/turbogears/qstemplates/quickstartbig/+package+/controllers/root.py_tmpl

    r5156 r5187  
    2323 
    2424    @expose(template="${package}.templates.login") 
    25     def login(self, forward_url=None, previous_url=None, *args, **kw): 
     25    def login(self, forward_url=None, *args, **kw): 
     26 
     27        if forward_url: 
     28            if isinstance(forward_url, list): 
     29                forward_url = forward_url.pop(0) 
     30            else: 
     31                del request.params['forward_url'] 
    2632 
    2733        if not identity.current.anonymous and identity.was_login_attempted() \ 
    2834                and not identity.get_identity_errors(): 
    29             redirect(tg.url(forward_url or previous_url or '/', kw)) 
    30  
    31         forward_url = None 
    32         previous_url = request.object_path 
     35            redirect(tg.url(forward_url or '/', kw)) 
    3336 
    3437        if identity.was_login_attempted(): 
     
    3841            msg = _("You must provide your credentials before accessing " 
    3942                   "this resource.") 
     43            if not forward_url: 
     44                forward_url = request.object_path 
    4045        else: 
    4146            msg = _("Please log in.") 
    42             forward_url = request.headers.get("Referer", "/") 
     47            if not forward_url: 
     48                forward_url = request.headers.get("Referer", "/") 
    4349 
    4450        response.status = 403 
    45         return dict(message=msg, previous_url=previous_url, logging_in=True, 
    46             original_parameters=request.params, forward_url=forward_url) 
     51        return dict(logging_in=True, message=msg, 
     52            forward_url=forward_url, previous_url=request.object_path, 
     53            original_parameters=request.params) 
    4754 
    4855    @expose() 
  • branches/1.1/turbogears/qstemplates/quickstart/+package+/controllers.py_tmpl

    r5156 r5187  
    2323 
    2424    @expose(template="${package}.templates.login") 
    25     def login(self, forward_url=None, previous_url=None, *args, **kw): 
     25    def login(self, forward_url=None, *args, **kw): 
     26 
     27        if forward_url: 
     28            if isinstance(forward_url, list): 
     29                forward_url = forward_url.pop(0) 
     30            else: 
     31                del request.params['forward_url'] 
    2632 
    2733        if not identity.current.anonymous and identity.was_login_attempted() \ 
    2834                and not identity.get_identity_errors(): 
    29             redirect(tg.url(forward_url or previous_url or '/', kw)) 
    30  
    31         forward_url = None 
    32         previous_url = request.object_path 
     35            redirect(tg.url(forward_url or '/', kw)) 
    3336 
    3437        if identity.was_login_attempted(): 
     
    3841            msg = _("You must provide your credentials before accessing " 
    3942                   "this resource.") 
     43            if not forward_url: 
     44                forward_url = request.object_path 
    4045        else: 
    4146            msg = _("Please log in.") 
    42             forward_url = request.headers.get("Referer", "/") 
     47            if not forward_url: 
     48                forward_url = request.headers.get("Referer", "/") 
    4349 
    4450        response.status = 403 
    45         return dict(message=msg, previous_url=previous_url, logging_in=True, 
    46             original_parameters=request.params, forward_url=forward_url) 
     51        return dict(logging_in=True, message=msg, 
     52            forward_url=forward_url, previous_url=request.object_path, 
     53            original_parameters=request.params) 
    4754 
    4855    @expose() 
  • branches/1.1/turbogears/qstemplates/quickstart/+package+/templates/master.html

    r3671 r5187  
    2626    <div py:if="tg.config('identity.on') and not defined('logging_in')" id="pageLogin"> 
    2727        <span py:if="tg.identity.anonymous"> 
    28             <a href="${tg.url('/login')}">Login</a> 
     28            <a href="${tg.url(tg.identity.login_url)}">Login</a> 
    2929        </span> 
    3030        <span py:if="not tg.identity.anonymous"> 
  • branches/1.5/turbogears/identity/exceptions.py

    r5020 r5187  
    1414def get_identity_errors(): 
    1515    return getattr(cherrypy.request, 'identity_errors', []) 
     16 
     17 
     18def get_failure_url(errors=None): 
     19    url = turbogears.config.get('identity.failure_url', None) 
     20    if url is None: 
     21        msg = "Missing URL for identity failure. Please fix this in app.cfg" 
     22        raise IdentityConfigurationException(msg) 
     23    if callable(url): 
     24        url = url(errors) 
     25    return url 
    1626 
    1727 
     
    7181        """Setup identity errors on the request and get URL from config.""" 
    7282        set_identity_errors(errors) 
    73         url = cherrypy.request.config.get('identity.failure_url', None) 
    74         if url is None: 
    75             msg = "Missing URL for identity failure. Please fix this in app.cfg" 
    76             raise IdentityConfigurationException(msg) 
    77         if callable(url): 
    78             url = url(errors) 
    79         force_external = cherrypy.request.config.get( 
    80                 "identity.force_external_redirect", False) 
    81         if force_external: 
    82             # We need to use external redirect for https since 
    83             # we are managed by Apache/nginx or something else 
    84             # that CherryPy won't find. 
     83 
     84        url = get_failure_url(errors) 
     85        if turbogears.config.get('identity.force_external_redirect', False): 
     86            # We need to use external redirect for https since we are managed 
     87            # by Apache/nginx or something else that CherryPy won't find. 
     88            # We also need to set the forward_url, because the Referer header 
     89            # won't work with an external redirect. 
    8590            params = cherrypy.request.params 
    8691            params['forward_url'] = cherrypy.request.path_info 
  • branches/1.5/turbogears/identity/saprovider.py

    r4200 r5187  
    77import logging 
    88log = logging.getLogger("turbogears.identity.saprovider") 
     9 
    910 
    1011# Global class references -- 
     
    1516visit_class = None 
    1617 
     18 
    1719class SqlAlchemyIdentity(object): 
    1820    """Identity that uses a model from a database (via SQLAlchemy).""" 
     
    107109            return None 
    108110        return visit_class.query.filter_by(visit_key=self.visit_key).first() 
     111 
     112    @property 
     113    def login_url(self): 
     114        """Get the URL for the login page.""" 
     115        return identity.get_failure_url() 
    109116 
    110117    def login(self): 
  • branches/1.5/turbogears/identity/soprovider.py

    r5020 r5187  
    1616hub = PackageHub("turbogears.identity") 
    1717__connection__ = hub 
     18 
    1819 
    1920def to_db_encoding(s, encoding): 
     
    2627    return s 
    2728 
     29 
    2830# Global class references -- 
    2931# these will be set when the provider is initialised. 
     
    3234permission_class = None 
    3335visit_class = None 
     36 
    3437 
    3538class SqlObjectIdentity(object): 
     
    136139            return None 
    137140 
     141    @property 
     142    def login_url(self): 
     143        """Get the URL for the login page.""" 
     144        return identity.get_failure_url() 
     145 
    138146    def login(self): 
    139147        """Set the link between this identity and the visit.""" 
  • branches/1.5/turbogears/qstemplates/quickstartbig/+package+/controllers/root.py_tmpl

    r5020 r5187  
    2323 
    2424    @expose(template="${package}.templates.login") 
    25     def login(self, forward_url=None, previous_url=None, *args, **kw): 
     25    def login(self, forward_url=None, *args, **kw): 
     26 
     27        if forward_url: 
     28            if isinstance(forward_url, list): 
     29                forward_url = forward_url.pop(0) 
     30            else: 
     31                del request.params['forward_url'] 
    2632 
    2733        if not identity.current.anonymous and identity.was_login_attempted() \ 
    2834                and not identity.get_identity_errors(): 
    29             redirect(tg.url(forward_url or previous_url or '/', kw)) 
    30  
    31         forward_url = None 
    32         previous_url = request.path_info 
     35            redirect(tg.url(forward_url or '/', kw)) 
    3336 
    3437        if identity.was_login_attempted(): 
     
    3841            msg = _("You must provide your credentials before accessing " 
    3942                   "this resource.") 
     43            if not forward_url: 
     44                forward_url = request.path_info 
    4045        else: 
    4146            msg = _("Please log in.") 
    42             forward_url = request.headers.get("Referer", "/") 
     47            if not forward_url: 
     48                forward_url = request.headers.get("Referer", "/") 
    4349 
    4450        response.status = 403 
    45         return dict(message=msg, previous_url=previous_url, logging_in=True, 
    46             original_parameters=request.params, forward_url=forward_url) 
     51        return dict(logging_in=True, message=msg, 
     52            forward_url=forward_url, previous_url=request.path_info, 
     53            original_parameters=request.params) 
    4754 
    4855    @expose() 
  • branches/1.5/turbogears/qstemplates/quickstart/+package+/controllers.py_tmpl

    r5020 r5187  
    2323 
    2424    @expose(template="${package}.templates.login") 
    25     def login(self, forward_url=None, previous_url=None, *args, **kw): 
     25    def login(self, forward_url=None, *args, **kw): 
     26 
     27        if forward_url: 
     28            if isinstance(forward_url, list): 
     29                forward_url = forward_url.pop(0) 
     30            else: 
     31                del request.params['forward_url'] 
    2632 
    2733        if not identity.current.anonymous and identity.was_login_attempted() \ 
    2834                and not identity.get_identity_errors(): 
    29             redirect(tg.url(forward_url or previous_url or '/', kw)) 
    30  
    31         forward_url = None 
    32         previous_url = request.path_info 
     35            redirect(tg.url(forward_url or '/', kw)) 
    3336 
    3437        if identity.was_login_attempted(): 
     
    3841            msg = _("You must provide your credentials before accessing " 
    3942                   "this resource.") 
     43            if not forward_url: 
     44                forward_url = request.path_info 
    4045        else: 
    4146            msg = _("Please log in.") 
     
    4348 
    4449        response.status = 403 
    45         return dict(message=msg, previous_url=previous_url, logging_in=True, 
    46             original_parameters=request.params, forward_url=forward_url) 
     50        return dict(logging_in=True, message=msg, 
     51            forward_url=forward_url, previous_url=request.path_info, 
     52            original_parameters=request.params) 
    4753 
    4854    @expose() 
  • branches/1.5/turbogears/qstemplates/quickstart/+package+/templates/master.html

    r3671 r5187  
    2626    <div py:if="tg.config('identity.on') and not defined('logging_in')" id="pageLogin"> 
    2727        <span py:if="tg.identity.anonymous"> 
    28             <a href="${tg.url('/login')}">Login</a> 
     28            <a href="${tg.url(tg.identity.login_url)}">Login</a> 
    2929        </span> 
    3030        <span py:if="not tg.identity.anonymous">