Ticket #1729: 1729-notebook-login.patch

File 1729-notebook-login.patch, 6.9 KB (added by robertwb, 5 years ago)
  • sage/server/notebook/avatars.py

    # HG changeset patch
    # User Robert Bradshaw <robertwb@math.washington.edu>
    # Date 1199857970 28800
    # Node ID 95ffb0a687e98678b2f0b0981079f16fcc3df6d9
    # Parent  addc96bacb8b96bb134f38260fd4d643900eec2a
    Login redunant on server startup when page opens, disable.
    
    diff -r addc96bacb8b -r 95ffb0a687e9 sage/server/notebook/avatars.py
    a b class PasswordChecker(object): 
    3939    implements(checkers.ICredentialsChecker) 
    4040    credentialInterfaces = (credentials.IUsernamePassword,) 
    4141 
    42  
    43  
    4442    def add_user(self, username, password, email, account_type='user'): 
    4543        self.check_username(username) 
    4644        U = twist.notebook.add_user(username, password, email, account_type) 
    class PasswordChecker(object): 
    6664            return defer.succeed(username) 
    6765        else: 
    6866            return defer.succeed(FailedLogin(username,failure_type='password')) 
     67             
     68 
     69class ITokenCredentials(credentials.ICredentials): 
     70    def checkToken(token): 
     71        pass 
     72         
     73 
     74class TokenCred(object): 
     75    implements(ITokenCredentials) 
     76     
     77    def __init__(self, token=None): 
     78        self.token = token 
     79         
     80    def checkToken(self, token): 
     81        return token == self.token 
     82         
     83 
     84class OneTimeTokenChecker(object): 
     85    implements(checkers.ICredentialsChecker) 
     86    credentialInterfaces = (ITokenCredentials,) 
     87     
     88    is_startup = True 
     89     
     90    def requestAvatarId(self, credentials): 
     91        from twisted.python import log 
     92        if self.token and credentials.checkToken(self.token): 
     93            if self.is_startup: 
     94                self.is_startup = False 
     95                self.token = credentials.token = randint(0, 2**128) 
     96            return defer.succeed('admin') 
     97        else: 
     98            return defer.fail("Bad token") 
    6999 
    70100 
    71101class LoginSystem(object): 
  • sage/server/notebook/guard.py

    diff -r addc96bacb8b -r 95ffb0a687e9 sage/server/notebook/guard.py
    a b class MySessionWrapper(object): 
    149149        Inital logic occurs here to decide the 
    150150        authentication status of a given user. 
    151151        """ 
    152         #log.msg("request: %s, segments: %s" % (str(request.args), segments))  
    153         #see if the user already has a session going 
    154152        if segments and segments[0] == "login": 
    155153            #log.msg("Login") 
    156154            #get the username and password in the postdata 
    class MySessionWrapper(object): 
    160158            l.addCallback(lambda _: self.requestPasswordAuthentication(request, segments)) 
    161159            return l 
    162160             
     161        if segments and segments[0] == "": 
     162            if request.args.get('startup_token', [''])[0]: 
     163                return self.requestPasswordAuthentication(request, segments) 
     164             
     165        #see if the user already has a session going 
    163166        session = self.getSession(request) 
     167        log.msg("session: %s" % session)  
    164168        if session is None: 
    165             # log.msg("unknown session") 
     169            #log.msg("unknown session") 
    166170            return self.requestAnonymousAuthentication(request, segments) 
    167171        else: 
    168172            if segments and segments[0] == "logout": 
    class MySessionWrapper(object): 
    238242        mind = [newCookie, None, None]  
    239243        d = self.portal.login(creds, mind, self.credInterface) 
    240244        d.addCallback(_success, request, segments) 
    241         #d.addErrback(self._loginFailure, request, segments, 'Anonymous access not allowed.') 
    242245        return d 
    243246 
    244247    def getSession(self, request): 
    class MySessionWrapper(object): 
    258261        or if they dont exist we have an anonymous 
    259262        session 
    260263        """ 
     264        if request.args.get('startup_token', [''])[0]: 
     265            import avatars 
     266            return avatars.TokenCred(request.args.get('startup_token', [''])[0]) 
    261267        username = request.args.get('email', [''])[0] 
    262268        password = request.args.get('password', [''])[0] 
    263269        return credentials.UsernamePassword(username, password) 
    class MySessionWrapper(object): 
    269275        Also saved the credentials that the user used to log in 
    270276        to later associate these credentials with the users session. 
    271277        """ 
     278        #log.msg("=== _loginSuccess ===") 
    272279        session.set_authCreds(creds) 
    273280        return rsrc, () 
    274281     
    275282    def _loginFailure(self, *x): #TODO 
    276         #log.msg("=== _loginFailure ===") 
    277         print x 
     283        log.msg("=== _loginFailure ===") 
     284         
     285        log.msg(str(x)) 
    278286                  
    279287    def incorrectLoginError(self, error, ctx, segments, loginFailure): 
    280288        pass 
  • sage/server/notebook/run_notebook.py

    diff -r addc96bacb8b -r 95ffb0a687e9 sage/server/notebook/run_notebook.py
    a b def notebook_twisted(self, 
    143143                address, port, secure) 
    144144 
    145145        if open_viewer: 
    146             open_page = "from sage.server.misc import open_page; open_page('%s', %s, %s, '%s')"%(address, port, secure, start_path) 
     146            if secure: 
     147                start_path = "'/?startup_token=%s' % startup_token" 
     148            else: 
     149                start_path = "'" + start_path + "'" 
     150            open_page = "from sage.server.misc import open_page; open_page('%s', %s, %s, %s)"%(address, port, secure, start_path) 
    147151        else: 
    148152            open_page = '' 
    149153         
    import sage.server.notebook.worksheet as 
    168172import sage.server.notebook.worksheet as worksheet 
    169173worksheet.init_sage_prestart(twist.notebook.get_server(), twist.notebook.get_ulimit()) 
    170174 
    171 import signal, sys 
     175import signal, sys, random 
    172176def my_sigint(x, n): 
    173177    twist.notebook.save() 
    174178    signal.signal(signal.SIGINT, signal.SIG_DFL) 
    from twisted.cred import portal 
    190194 
    191195realm = avatars.LoginSystem() 
    192196p = portal.Portal(realm) 
     197startup_token = '%%x' %% random.randint(0, 2**128) 
     198startup_checker = avatars.OneTimeTokenChecker() 
     199startup_checker.token = startup_token 
     200p.registerChecker(startup_checker) 
    193201password_checker = avatars.PasswordChecker() 
    194202p.registerChecker(password_checker) 
    195203p.registerChecker(checkers.AllowAnonymousAccess()) 
  • sage/server/notebook/twist.py

    diff -r addc96bacb8b -r 95ffb0a687e9 sage/server/notebook/twist.py
    a b def notebook_updates(): 
    102102###################################################################################### 
    103103# RESOURCES 
    104104###################################################################################### 
     105 
    105106 
    106107############################ 
    107108# An error message 
    class UserToplevel(Toplevel): 
    16861687    child_upload = Upload() 
    16871688    child_logout = Logout() 
    16881689     
     1690     
    16891691 
    16901692    #child_login = RedirectLogin() 
    16911693