Changeset 4121 for TI12-security


Ignore:
Timestamp:
12/08/08 13:10:33 (11 years ago)
Author:
pjkersha
Message:

Working OpenIDProviderMiddleware class with generic rendering interface. TODO:

  • integrate with AuthKit? and user db via SQLAlchemy
  • Move Pylons wrapper project from test area to ndg.security.server package
  • error handling template
  • refactor rendering interface
  • replace with James Gardner's PassURL OpenID Provider?
Location:
TI12-security/trunk/python
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/Tests/openid-provider/op/development.ini

    r4105 r4121  
    5757# Logging configuration 
    5858[loggers] 
    59 keys = root, op, ndg 
     59keys = root, ndg 
    6060 
    6161[handlers] 
     
    7676[logger_ndg] 
    7777level = DEBUG 
    78 handlers = console 
     78handlers =  
    7979qualname = ndg 
    8080 
  • TI12-security/trunk/python/Tests/openid-provider/op/op/lib/rendering.py

    r4120 r4121  
    5050    """Provide Kid Templating for OpenID Provider Middleware""" 
    5151     
    52     def renderLogin(self, environ): 
     52    def renderLogin(self, environ, success_to=None, fail_to=None): 
    5353        """Set-up Kid template for OpenID Provider Login""" 
    5454        c = State() 
    5555        c.loginStatus = False 
    5656        c.title = "OpenID Login" 
    57         c.path_loginsubmit = self.paths['path_loginsubmit'] 
    58         c.fail_to = c.success_to = self.base_url + self.paths['path_mainpage'] 
     57        c.path_loginsubmit = self.paths['path_loginsubmit']        
     58        c.success_to = success_to or self.paths['path_mainpage'] 
     59        c.fail_to = fail_to or self.paths['path_mainpage']  
    5960        c.xml = '' 
    6061     
     
    9091        c = State() 
    9192        c.title = 'Approve OpenID Request?' 
     93        c.path_allow = self.paths['path_allow'] 
     94        c.id_url_base = id_url_base 
     95        c.trust_root = oidRequest.trust_root 
    9296        c.oidRequest = oidRequest 
    93          
     97 
    9498        if oidRequest.idSelect(): # We are being asked to select an ID 
    9599            msg = '''\ 
     
    100104            a random anonymous identifier. 
    101105            </p> 
    102             ''' 
    103              
    104             c.path_allow = self.paths['path_allow'] 
    105             c.id_url_base = id_url_base 
    106             c.trust_root = oidRequest.trust_root 
    107              
     106            '''             
    108107             
    109108            fdata = { 
     
    128127            '''%fdata 
    129128             
    130         elif expected_user == self.user: 
     129        else: 
    131130            msg = '''\ 
    132131            <p>A new site has asked to confirm your identity.  If you 
     
    154153              <input type="submit" name="no" value="no" /> 
    155154            </form>''' % fdata 
    156         else: 
    157             mdata = { 
    158                 'expected_user': expected_user, 
    159                 'user': self.user, 
    160                 } 
    161             msg = '''\ 
    162             <p>A site has asked for an identity belonging to 
    163             %(expected_user)s, but you are logged in as %(user)s.  To 
    164             log in as %(expected_user)s and approve the login oidRequest, 
    165             hit OK below.  The "Remember this decision" checkbox 
    166             applies only to the trust root decision.</p>''' % mdata 
    167  
    168             fdata = { 
    169                 'path_allow': self.paths['path_allow'], 
    170                 'identity': oidRequest.identity, 
    171                 'trust_root': oidRequest.trust_root, 
    172                 'expected_user': expected_user, 
    173                 } 
    174             form = '''\ 
    175             <table> 
    176               <tr><td>Identity:</td><td>%(identity)s</td></tr> 
    177               <tr><td>Trust Root:</td><td>%(trust_root)s</td></tr> 
    178             </table> 
    179             <p>Allow this authentication to proceed?</p> 
    180             <form method="POST" action="%(path_allow)s"> 
    181               <input type="checkbox" id="remember" name="remember" value="yes" 
    182                   /><label for="remember">Remember this 
    183                   decision</label><br /> 
    184               <input type="hidden" name="login_as" value="%(expected_user)s"/> 
    185               <input type="submit" name="yes" value="yes" /> 
    186               <input type="submit" name="no" value="no" /> 
    187             </form>''' % fdata 
    188155 
    189156        return _render('ndg.security.decidePage', c=c,g=config['pylons.g'],h=h) 
  • TI12-security/trunk/python/Tests/openid-provider/op/op/templates/ndg/security/decidePage.kid

    r4120 r4121  
    77        <div class="decidePageContent" style="text-indent:5px">         
    88            <h2>Login to $c.oidRequest.trust_root?</h2> 
    9                 <p>The website $c.oidRequest.trust_root has requested your  
    10                 credentials.  To proceed, press OK and you will be returned to there 
    11                 </p> 
    12             <form method="POST" action="$c.path_allow"> 
    13                         <table> 
    14                         <tr> 
    15                                 <td>Identity:</td> 
     9                <form method="POST" action="$c.path_allow"> 
     10                        <table> 
     11                                <tr> 
     12                                        <td> 
     13                                                The website $c.oidRequest.trust_root has requested  
     14                                                your OpenID identifier: 
     15                                        </td> 
     16                                </tr> 
     17                                <tr> 
    1618                                <td> 
    17                                         $c.id_url_base<input type='text' name='identifier'/> 
     19                                        $c.oidRequest.identity 
    1820                                </td> 
    1921                        </tr> 
    20                     </table> 
    21                     <p>Allow this authentication to proceed?</p> 
    22                     <input type="checkbox" id="remember" name="remember" value="yes"/> 
    23                     <label for="remember">Remember this decision</label> 
    24                 <br/> 
    25                     <input type="submit" name="yes" value="yes" /> 
    26                     <input type="submit" name="no" value="no" /> 
    27             </form> 
     22                                <tr> 
     23                                        <td>                                             
     24                                                Would you like to pass your OpenID credential 
     25                                                information back to $c.oidRequest.trust_root and  
     26                                                return to this site?   
     27                                        </td> 
     28                                </tr> 
     29                                <tr> 
     30                                        <td align="right"> 
     31                                                <input type="submit" name="Yes" value="Yes" /> 
     32                                                <input type="submit" name="No" value="No" /> 
     33                                        </td> 
     34                                </tr> 
     35                                <tr> 
     36                                        <td align="right"> 
     37                                                <input type="checkbox" id="remember" name="remember" value="yes"/> 
     38                                                <label for="remember">Remember this decision</label> 
     39                                        </td> 
     40                                </tr> 
     41                        </table> 
     42                </form> 
    2843        </div> 
    2944        <div py:replace="footer()"/> 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/openid_provider.py

    r4120 r4121  
    4545                   path_serveryadis='/serveryadis', 
    4646                   path_allow='/allow', 
     47                   path_decide='/decide', 
    4748                   path_mainpage='/')  
    4849        
     
    5253                 data_path='./', 
    5354                 charset=None, 
    54                  trace=True,#False, 
     55                 trace=False, 
    5556                 renderingClass=None, 
    5657                 **kw): 
     
    9596            raise 
    9697             
    97         self.username = None 
    9898        self.app = app 
    9999         
     
    178178        """Generate Yadis document""" 
    179179 
    180         self.username = self.path.split('/')[-1] 
     180        username = self.path.split('/')[-1] 
    181181         
    182182        endpoint_url = self.base_url + self.paths['path_openidserver'] 
    183         user_url = self.base_url + self.paths['path_id'] + '/' + self.username 
     183        user_url = self.base_url + self.paths['path_id'] + '/' + username 
    184184         
    185185        yadisDict = dict(openid20type=discover.OPENID_2_0_TYPE,  
     
    201201        try: 
    202202            oidRequest = self.oidserver.decodeRequest(self.query) 
     203             
    203204        except server.ProtocolError, why: 
    204205            response = self._displayResponse(why) 
     206             
    205207        else: 
    206208            if oidRequest is None: 
    207209                # Display text indicating that this is an endpoint. 
    208                 response = self._showAboutPage() 
    209      
     210                response = self.do_mainpage(environ, start_response) 
     211                 
    210212            # Check mode is one of "checkid_immediate", "checkid_setup" 
    211213            if oidRequest.mode in server.BROWSER_REQUEST_MODES: 
     
    215217                response = self._displayResponse(oidResponse) 
    216218             
    217         start_response("200 OK", [('Content-length', str(len(response)))]) 
    218219        return response 
    219220             
     
    223224        the Relying Party?""" 
    224225         
    225         # pretend this next bit is keying off the user's session or something, 
    226         # right? 
    227         request = self.lastCheckIDRequest.get(self.username) 
    228  
    229         if 'yes' in self.query: 
    230             if 'login_as' in self.query: 
    231                 self.username = self.query['login_as'] 
    232  
    233             if request.idSelect(): 
     226        oidRequest = environ[self.session_middleware].get('lastCheckIDRequest') 
     227 
     228        if 'Yes' in self.query: 
     229            if oidRequest.idSelect(): 
    234230                identity = self.base_url+self.paths['path_id']+'/'+\ 
    235231                            self.query['identifier'] 
    236232            else: 
    237                 identity = request.identity 
     233                identity = oidRequest.identity 
     234 
     235            trust_root = oidRequest.trust_root 
     236            if self.query.get('remember', 'no') == 'yes': 
     237                session = environ[self.session_middleware] 
     238                session['approved'] = {trust_root: 'always'} 
     239                session.save() 
    238240                 
    239             if self.username is None: 
    240                 self.username = identity.split('/')[-1] 
    241  
    242             trust_root = request.trust_root 
    243             if self.query.get('remember', 'no') == 'yes': 
    244                 self.approved[(identity, trust_root)] = 'always' 
    245  
    246             response = self._identityApproved(request, identity) 
    247         elif 'no' in self.query: 
     241            oidResponse = self._identityApproved(oidRequest, identity) 
     242            return self._displayResponse(oidResponse) 
     243         
     244        elif 'No' in self.query: 
    248245            # TODO: Check 'no' response is OK - no causes AuthKit's Relying  
    249246            # Party implementation to crash with 'openid.return_to' KeyError 
    250             # in uthkit.authenticate.open_id.process 
    251             response = request.answer(False) 
     247            # in Authkit.authenticate.open_id.process 
     248            oidResponse = oidRequest.answer(False) 
     249            return self._displayResponse(oidResponse) 
     250            #response = self._renderer.renderMainPage(environ) 
    252251 
    253252        else: 
     
    255254                                                'post.  %r' % self.query) 
    256255 
    257         return self._displayResponse(response) 
    258256     
    259257    tmplServerYadis = """\ 
     
    283281 
    284282 
    285     def do_login(self, environ, start_response): 
     283    def do_login(self, environ, start_response, **kw): 
    286284        """Display Login form""" 
    287285         
    288         response = self._renderer.renderLogin(environ) 
     286        response = self._renderer.renderLogin(environ, **kw) 
    289287        start_response('200 OK',  
    290288                       [('Content-type', 'text/html'+self.charset), 
     
    294292 
    295293    def do_loginsubmit(self, environ, start_response): 
    296         """Handle user submission from login""" 
     294        """Handle user submission from login and logout""" 
     295         
     296        session = environ[self.session_middleware] 
    297297         
    298298        if 'submit' in self.query: 
    299299            if 'username' in self.query: 
    300                 self.username = self.query['username'] 
    301                 session = environ['beaker.session'] 
     300                # login 
     301                if 'username' in session: 
     302                    log.error("Attempting login for user %s: user %s is " 
     303                              "already logged in", session['username'], 
     304                              session['username']) 
     305                    # TODO: display error page 
     306                    return self._redirect(start_response,  
     307                                          self.query['fail_to']) 
     308                     
    302309                session['username'] = self.query['username'] 
    303310                session.save() 
    304311            else: 
    305                 self.username = None 
     312                # logout 
     313                if 'username' not in session: 
     314                    log.error("No user is logged in") 
     315                    # TODO: display error page 
     316                    return self._redirect(start_response,  
     317                                          self.query['fail_to']) 
     318                del session['username'] 
     319                session.save() 
     320                 
    306321            return self._redirect(start_response, self.query['success_to']) 
     322         
    307323        elif 'cancel' in self.query: 
    308324            return self._redirect(start_response, self.query['fail_to']) 
    309325        else: 
     326            # TODO: display error page 
    310327            raise OpenIDProviderMiddlewareError('Login input not recognised ' 
    311328                                                '%r' % self.query)    
     
    320337        return response 
    321338 
    322          
    323     def _isAuthorized(self, identity_url, trust_root): 
     339 
     340    def do_decide(self, environ, start_response): 
     341        """Display page prompting the user to decide whether to trust the site 
     342        requesting their credentials""" 
     343        session = environ[self.session_middleware] 
     344        oidRequest = session.get('lastCheckIDRequest') 
     345        if oidRequest is None: 
     346            log.error("No OpenID request set in session") 
     347            return self.do_mainpage(environ, start_response) 
     348         
     349        approvedRoots = session.get('approved', {}) 
     350         
     351        if oidRequest.trust_root in approvedRoots: 
     352            response = self._identityApproved(oidRequest, oidRequest.identity) 
     353            return self._displayResponse(response) 
     354        else: 
     355            response = self._renderer.renderDecidePage(environ, oidRequest) 
     356             
     357            start_response('200 OK',  
     358                           [('Content-type', 'text/html'+self.charset), 
     359                            ('Content-length', str(len(response)))]) 
     360            return response 
     361         
     362    def _identityIsAuthorized(self, identity_url): 
     363        '''The given identity URL matches with a logged in user''' 
    324364        session = self.environ[self.session_middleware] 
    325365        username = session.get('username') 
     
    330370            return False 
    331371 
    332         key = (identity_url, trust_root) 
    333         return self.approved.get(key) is not None 
     372        return True 
     373     
     374    def _trustRootIsAuthorized(self, trust_root): 
     375        '''The given trust root (Relying Party) has previously been approved 
     376        by the user''' 
     377        session = self.environ[self.session_middleware] 
     378        approvedRoots = session.get('approved', {}) 
     379        return approvedRoots.get(trust_root) is not None 
     380 
    334381 
    335382    def _addSRegResponse(self, request, response): 
     
    341388        # TODO: role/user attribute look-up in database vs. username? 
    342389        sreg_data = { 
    343             'nickname':self.username 
     390            'nickname':self.environ[self.session_middleware]['username'] 
    344391            } 
    345392 
     
    347394        response.addExtension(sreg_resp) 
    348395 
     396 
    349397    def _identityApproved(self, request, identifier=None): 
     398        '''Action following approval of a Relying Party by the user''' 
    350399        response = request.answer(True, identity=identifier) 
    351400        self._addSRegResponse(request, response) 
    352401        return response 
    353402 
     403 
    354404    def _handleCheckIDRequest(self, oidRequest): 
    355         isAuthorized = self._isAuthorized(oidRequest.identity, 
    356                                           oidRequest.trust_root) 
    357         if isAuthorized: 
    358             oidResponse = self._identityApproved(oidRequest) 
    359             return self._displayResponse(oidResponse) 
     405         
     406        log.debug("OpenIDProviderMiddleware._handleCheckIDRequest ...") 
     407        session = self.environ[self.session_middleware] 
     408         
     409        if self._identityIsAuthorized(oidRequest.identity): 
     410            # User is logged in 
     411            if self._trustRootIsAuthorized(oidRequest.trust_root): 
     412                # User has approved this Relying Party 
     413                oidResponse = self._identityApproved(oidRequest) 
     414                return self._displayResponse(oidResponse) 
     415            else: 
     416                return self.do_decide(self.environ, self.start_response) 
     417                 
    360418        elif oidRequest.immediate: 
    361419            oidResponse = oidRequest.answer(False) 
    362420            return self._displayResponse(oidResponse) 
    363         else: 
    364             self.lastCheckIDRequest[self.username] = oidRequest 
    365 #            response = self._renderer.renderDecidePage(self.environ,oidRequest) 
    366             response = self._renderer.renderLogin(self.environ) 
     421         
     422        else: 
     423            session = self.environ[self.session_middleware] 
     424            session['lastCheckIDRequest'] = oidRequest 
     425            session.save() 
     426            response = self.do_login(self.environ, 
     427                                     self.start_response, 
     428                                     success_to=self.paths['path_decide']) 
    367429            return response 
     430 
    368431 
    369432    def _displayResponse(self, response): 
     
    372435        except server.EncodingError, why: 
    373436            text = why.response.encodeToKVForm() 
    374             return self._showErrorPage('<pre>%s</pre>' % cgi.escape(text)) 
    375  
    376         hdr = webresponse.headers.items() + self._writeUserHeader() 
     437            # TODO: Error template page 
     438            return self._renderer.renderErrorPage(self.environ) 
     439 
     440        hdr = webresponse.headers.items() 
    377441         
    378442        lenWebResponseBody = len(webresponse.body) 
     
    391455 
    392456    def _redirect(self, start_response, url): 
    393         hdr = [('Content-type', 'text/html'+self.charset), 
    394                ('Location', url)] 
    395         hdr += self._writeUserHeader() 
    396  
    397         start_response('302 %s' % httplib.responses[302], hdr) 
     457        start_response('302 %s' % httplib.responses[302],  
     458                       [('Content-type', 'text/html'+self.charset), 
     459                        ('Location', url)]) 
    398460        return [] 
    399  
    400  
    401     def _writeUserHeader(self): 
    402         if self.username is None: 
    403             # TODO: Refactor this out when replaced with beaker.session /  
    404             # AuthKit 
    405             import time 
    406             t1970 = time.gmtime(0) 
    407             expires = time.strftime( 
    408                 'Expires=%a, %d-%b-%y %H:%M:%S GMT', t1970) 
    409             return [('Set-Cookie', 'username=;%s' % expires)] 
    410         else: 
    411             return [('Set-Cookie', 'username=%s' % self.username)] 
    412  
    413     def _showAboutPage(self): 
    414         endpoint_url = self.base_url + self.paths['path_openidserver'] 
    415  
    416         def link(url): 
    417             url_attr = quoteattr(url) 
    418             url_text = cgi.escape(url) 
    419             return '<a href=%s><code>%s</code></a>' % (url_attr, url_text) 
    420  
    421         def term(url, text): 
    422             return '<dt>%s</dt><dd>%s</dd>' % (link(url), text) 
    423  
    424         resources = [ 
    425             (self.base_url, "This example server's home page"), 
    426             ('http://www.openidenabled.com/', 
    427              'An OpenID community Web site, home of this library'), 
    428             ('http://www.openid.net/', 'the official OpenID Web site'), 
    429             ] 
    430  
    431         resource_markup = ''.join([term(url, text) for url, text in resources]) 
    432  
    433         return self._showPage(200, 'This is an OpenID server', msg="""\ 
    434         <p>%s is an OpenID server endpoint.<p> 
    435         <p>For more information about OpenID, see:</p> 
    436         <dl> 
    437         %s 
    438         </dl> 
    439         """ % (link(endpoint_url), resource_markup,)) 
    440  
    441     def _showErrorPage(self, error_message): 
    442         return self._showPage(400, 'Error Processing Request', err='''\ 
    443         <p>%s</p> 
    444         <!-- 
    445  
    446         This is a large comment.  It exists to make this page larger. 
    447         That is unfortunately necessary because of the "smart" 
    448         handling of pages returned with an error code in IE. 
    449  
    450         ************************************************************* 
    451         ************************************************************* 
    452         ************************************************************* 
    453         ************************************************************* 
    454         ************************************************************* 
    455         ************************************************************* 
    456         ************************************************************* 
    457         ************************************************************* 
    458         ************************************************************* 
    459         ************************************************************* 
    460         ************************************************************* 
    461         ************************************************************* 
    462         ************************************************************* 
    463         ************************************************************* 
    464         ************************************************************* 
    465         ************************************************************* 
    466         ************************************************************* 
    467         ************************************************************* 
    468         ************************************************************* 
    469         ************************************************************* 
    470         ************************************************************* 
    471         ************************************************************* 
    472         ************************************************************* 
    473  
    474         --> 
    475         ''' % error_message) 
    476  
    477  
    478     def _showIdPage(self, path): 
    479         link_tag = '<link rel="openid.server" href="%sopenidserver">' %\ 
    480               self.base_url 
    481         yadis_loc_tag = '<meta http-equiv="x-xrds-location" content="%s">'%\ 
    482             (self.base_url+self.paths['path_yadis']+'/'+path[4:]) 
    483         disco_tags = link_tag + yadis_loc_tag 
    484         ident = self.base_url + path[1:] 
    485  
    486         approved_trust_roots = [] 
    487         for (aident, trust_root) in self.approved.keys(): 
    488             if aident == ident: 
    489                 trs = '<li><tt>%s</tt></li>\n' % cgi.escape(trust_root) 
    490                 approved_trust_roots.append(trs) 
    491  
    492         if approved_trust_roots: 
    493             prepend = '<p>Approved trust roots:</p>\n<ul>\n' 
    494             approved_trust_roots.insert(0, prepend) 
    495             approved_trust_roots.append('</ul>\n') 
    496             msg = ''.join(approved_trust_roots) 
    497         else: 
    498             msg = '' 
    499  
    500         self._showPage(200, 'An Identity Page',head_extras=disco_tags, msg='''\ 
    501         <p>This is an identity page for %s.</p> 
    502         %s 
    503         ''' % (ident, msg)) 
    504461 
    505462 
     
    513470        self.base_url = base_url 
    514471        self.paths = paths 
    515         self.username = '' 
    516472 
    517473    def renderIdentityPage(self, environ): 
     
    542498#            msg = '' 
    543499        msg = '' 
    544         return self._showPage('Identity Page',  
     500        return self._showPage(environ,  
     501                              'Identity Page',  
    545502                              head_extras=disco_tags,  
    546503                              msg='''<p>This is the identity page for %s.</p> 
     
    549506         
    550507         
    551     def renderLogin(self, environ): 
     508    def renderLogin(self, environ, success_to=None, fail_to=None): 
    552509        """Render the login form.""" 
    553         success_to, fail_to = (self.paths['path_mainpage'],)*2 
    554          
    555         return self._showPage('Login Page', form='''\ 
     510         
     511        if success_to is None: 
     512            success_to = self.paths['path_mainpage'] 
     513             
     514        if fail_to is None: 
     515            fail_to = self.paths['path_mainpage'] 
     516         
     517        return self._showPage(environ, 
     518                              'Login Page', form='''\ 
    556519            <h2>Login</h2> 
    557520            <form method="GET" action="%s"> 
     
    570533        yadis_tag = '<meta http-equiv="x-xrds-location" content="%s">' % \ 
    571534                    (self.base_url + self.paths['path_serveryadis']) 
    572              
    573         if self.username: 
     535        username = environ['beaker.session']['username']     
     536        if username: 
    574537            openid_url = self.base_url + self.paths['path_id'] + '/' + \ 
    575                         self.username 
     538                        username 
    576539            user_message = """\ 
    577540            <p>You are logged in as %s. Your OpenID identity URL is 
    578541            <tt><a href=%s>%s</a></tt>. Enter that URL at an OpenID 
    579542            consumer to test this server.</p> 
    580             """ % (self.username, quoteattr(openid_url), openid_url) 
     543            """ % (username, quoteattr(openid_url), openid_url) 
    581544        else: 
    582545            user_message = "<p>You are not <a href='%s'>logged in</a>.</p>" % \ 
    583546                            self.paths['path_login'] 
    584547 
    585         return self._showPage('Main Page', head_extras=yadis_tag, msg='''\ 
     548        return self._showPage(environ, 
     549                              'Main Page', head_extras=yadis_tag, msg='''\ 
    586550            <p>OpenID server</p> 
    587551     
     
    606570#               repr((oidRequest.identity, id_url_base)) 
    607571        expected_user = oidRequest.identity[len(id_url_base):] 
    608  
     572        username = environ['beaker.session']['username'] 
     573         
    609574        if oidRequest.idSelect(): # We are being asked to select an ID 
    610575            msg = '''\ 
     
    637602            '''%fdata 
    638603             
    639         elif expected_user == self.username: 
     604        elif expected_user == username: 
    640605            msg = '''\ 
    641606            <p>A new site has asked to confirm your identity.  If you 
     
    666631            mdata = { 
    667632                'expected_user': expected_user, 
    668                 'username': self.username, 
     633                'username': username, 
    669634                } 
    670635            msg = '''\ 
     
    696661            </form>''' % fdata 
    697662 
    698         return self._showPage('Approve OpenID request?', msg=msg, form=form) 
    699          
    700  
    701     def _showPage(self, title, head_extras='', msg=None, err=None, form=None): 
    702  
    703         if self.username is None: 
     663        return self._showPage(environ, 
     664                              'Approve OpenID request?',  
     665                              msg=msg, form=form) 
     666         
     667 
     668    def _showPage(self, environ,  
     669                  title, head_extras='', msg=None, err=None, form=None): 
     670 
     671        username = environ['beaker.session'].get('username') 
     672        if username is None: 
    704673            user_link = '<a href="/login">not logged in</a>.' 
    705674        else: 
     
    707676                        '<a href="%s?submit=true&'\ 
    708677                        'success_to=%s">Log out</a>' % \ 
    709                         (self.paths['path_id'], self.username, self.username,  
     678                        (self.paths['path_id'], username, username,  
    710679                         self.paths['path_loginsubmit'], 
    711680                         self.paths['path_login']) 
     
    819788 
    820789        return response 
    821          
    822             
    823 from authkit.authenticate import middleware, AuthKitConfigError, strip_base 
    824 from authkit.authenticate.multi import MultiHandler, status_checker 
    825  
    826 def make_handler(app, 
    827     auth_conf, 
    828     app_conf=None, 
    829     global_conf=None, 
    830     prefix='authkit.method.openidprovider.'): 
    831      
    832     app = MultiHandler(app) 
    833     app.add_method('openidprovider', Handler) 
    834     app.add_checker('openidprovider', status_checker) 
    835     return app 
Note: See TracChangeset for help on using the changeset viewer.