Ticket #3649: sage-3649.patch
| File sage-3649.patch, 13.2 kB (added by TimothyClemans, 4 months ago) |
|---|
-
a/sage/server/notebook/server_conf.py
old new 14 14 15 15 'save_interval':360, # seconds 16 16 17 'doc_pool_size':128 17 'doc_pool_size':128, 18 'email':False 18 19 } 19 20 20 21 class ServerConfiguration(conf.Configuration): -
a/sage/server/notebook/template.py
old new 39 39 for name in templates: 40 40 G[name + '_template'] = PageTemplate(pjoin(path, '%s.template'%name)) 41 41 42 def login_page_template(accounts, default_user, is_username_error=False, is_password_error=False, welcome=None ):42 def login_page_template(accounts, default_user, is_username_error=False, is_password_error=False, welcome=None, recover=False): 43 43 if accounts: 44 44 reg = "<a href='/register'><b>Sign up for a new SAGE Notebook account</b></a>" 45 45 else: 46 46 reg = "" 47 if recover: 48 forgot_pass = "<a href='/forgotpass'><b>Forgot password</b></a>" 49 else: 50 forgot_pass = '' 47 51 if is_username_error: 48 52 u_e = '<tr><td align=right><span style="color:red">Error:</span></td><td>Username is not in the system</td></tr>' 49 53 else: … … 56 60 welcome = '<h2>Congratulations %s! You can now sign into the Sage Notebook.</h2>' % welcome 57 61 else: 58 62 welcome = '' 59 return login_template(register = reg, default=default_user, username_error=u_e, password_error=p_e, welcome=welcome )63 return login_template(register = reg, default=default_user, username_error=u_e, password_error=p_e, welcome=welcome, forgot_pass=forgot_pass) 60 64 61 def registration_page_template( error=None, input=None):65 def registration_page_template(is_email=False, error=None, input=None): 62 66 keywords = dict([(i, '') for i in ['error', 'username', 'username_error', 'password_error', 'confirm_pass_error', 'email', 'email_error']]) 63 67 def error_html(msg): 64 68 return '<p><span class="error">Error:</span> ' + msg + '</p>' … … 90 94 if 'retype_password' in input: 91 95 del input['retype_password'] 92 96 keywords.update(input) 97 98 if is_email: 99 e_box = """<li><h2>Enter your e-mail address</h2> 100 <p>Your e-mail address is required for account confirmation and recovery. You will be emailed a confirmation link right after you successfully sign up.</p> 101 <input type="text" name="email" value="%s" class="entry" /> 102 %s 103 </li>""" % (keywords['email'], keywords['email_error']) 104 else: 105 e_box = '' 106 keywords['email_box'] = e_box 107 del keywords['email'] 108 del keywords['email_error'] 93 109 template = Template(file.read()).substitute(keywords) 94 110 file.close() 95 111 return template -
a/sage/server/notebook/twist.py
old new 885 885 if not error: #webbrowser may auto fill in "old password" even though the user may nto want to change her passwords 886 886 notebook.change_password(self.username, request.args['Newpass'][0]) 887 887 redirect_to_logout = True 888 889 if 'Newemail' in request.args:890 notebook.user(self.username).set_email(request.args['Newemail'][0])891 redirect_to_home = True888 if notebook.conf()['email']: 889 if 'Newemail' in request.args: 890 notebook.user(self.username).set_email(request.args['Newemail'][0]) 891 redirect_to_home = True 892 892 893 893 if error: 894 894 return http.Response(stream=message(error, '/settings')) … … 960 960 for i in range(1, 10, 2): 961 961 s += '<option%s>%s</option>' % (' selected' if notebook.user(self.username)['autosave_interval']/60 == i else '', i) 962 962 s += '</select></div></div>' 963 if notebook.conf()['email']: 964 email_section = """ 965 <div class="section"> 966 <h2>Change E-mail Address</h2> 967 968 <div> 969 <table style="float:right"><tr><td>Current e-mail:</td><td>%s</td></tr> 970 <tr><td></td><td>%s</td></tr> 971 <tr><td style="text-align:right">New e-mail:</td><td><input type="text" name="Newemail" class="c1" /></td></tr></table> 972 <div style="clear:both"></div> 973 </div> 974 </div> 975 """ % ('None' if notebook.user(self.username)._User__email == '' else notebook.user(self.username)._User__email, 'Not confirmed' if not notebook.user(self.username).is_email_confirmed() else 'Confirmed') 976 else: email_section = '' 963 977 s += """ 964 978 <div class="section"> 965 979 <h2>Change Password</h2> … … 970 984 </div> 971 985 </div> 972 986 973 <div class="section"> 974 <h2>Change E-mail Address</h2> 975 976 <div> 977 <table style="float:right"><tr><td>Current e-mail:</td><td>%s</td></tr> 978 <tr><td></td><td>%s</td></tr> 979 <tr><td style="text-align:right">New e-mail:</td><td><input type="text" name="Newemail" class="c1" /></td></tr></table> 980 <div style="clear:both"></div> 981 </div> 982 </div> 987 %s 983 988 <div id="buttons"> 984 <input type="submit" value="Save">""" % ('None' if notebook.user(self.username)._User__email == '' else notebook.user(self.username)._User__email, 'Not confirmed' if not notebook.user(self.username).is_email_confirmed() else 'Confirmed')989 <input type="submit" value="Save">""" % email_section 985 990 s += '<input type="button" value="Cancel" style="margin-left:5px" onClick="parent.location=\'/home/%s\'">' % self.username 986 991 s += """ 987 992 </div> … … 1752 1757 #################################### 1753 1758 class RegConfirmation(resource.Resource): 1754 1759 def render(self, request): 1760 if not notebook.conf()['email']: 1761 return http.Response(stream=message('The confirmation system is not active.')) 1755 1762 key = request.args['key'][0] 1756 1763 global notebook 1757 1764 invalid_confirm_key = """\ … … 1898 1905 self.userdb = userdb 1899 1906 1900 1907 def render(self, request): 1901 input_boxes = ['username', 'password', 'retype_password', 'email'] 1908 input_boxes = ['username', 'password', 'retype_password'] 1909 if notebook.conf()['email']: 1910 input_boxes.append('email') 1902 1911 is_valid_dict = {'username': is_valid_username, 'password': is_valid_password, 1903 1912 'retype_password': do_passwords_match, 'email': is_valid_email} 1904 1913 missing = [False] * len(input_boxes) … … 1932 1941 missing[i] = True 1933 1942 1934 1943 if set(missing) == set([True]): 1935 return http.Response(stream=registration_page_template( ))1944 return http.Response(stream=registration_page_template(is_email=notebook.conf()['email'])) 1936 1945 elif set(missing) == set([False]): 1937 1946 for i, box in enumerate(input_boxes): 1938 1947 filled_in[box] = request.args[box][0] … … 1964 1973 return http.Response(stream=registration_page_template(error=errors, input=filled_in)) 1965 1974 else: 1966 1975 try: 1976 e = filled_in['email'] if notebook.conf()['email'] else '' 1967 1977 self.userdb.add_user(filled_in['username'], request.args['password'][0], 1968 filled_in['email'])1978 e) 1969 1979 except ValueError: 1970 1980 errors.append('username_taken') 1971 1981 return http.Response(stream=registration_page_template(error=errors, input=filled_in)) 1972 1982 1973 destaddr = filled_in['email'] 1974 from sage.server.notebook.smtpsend import send_mail 1975 from sage.server.notebook.register import make_key, build_msg 1976 # TODO: make this come from the server settings 1977 key = make_key() 1978 listenaddr = notebook.address 1979 port = notebook.port 1980 fromaddr = 'no-reply@%s' % listenaddr 1981 body = build_msg(key, filled_in['username'], listenaddr, port, 1982 notebook.secure) 1983 1984 # Send a confirmation message to the user. 1985 try: 1986 send_mail(self, fromaddr, destaddr, "Sage Notebook Registration",body) 1987 waiting[key] = filled_in['username'] 1988 except ValueError: 1989 pass 1983 if notebook.conf()['email']: 1984 destaddr = filled_in['email'] 1985 from sage.server.notebook.smtpsend import send_mail 1986 from sage.server.notebook.register import make_key, build_msg 1987 # TODO: make this come from the server settings 1988 key = make_key() 1989 listenaddr = notebook.address 1990 port = notebook.port 1991 fromaddr = 'no-reply@%s' % listenaddr 1992 body = build_msg(key, filled_in['username'], listenaddr, port, 1993 notebook.secure) 1994 1995 # Send a confirmation message to the user. 1996 try: 1997 send_mail(self, fromaddr, destaddr, "Sage Notebook Registration",body) 1998 waiting[key] = filled_in['username'] 1999 except ValueError: 2000 pass 1990 2001 1991 2002 return http.Response(stream=login_page_template(notebook.get_accounts(), 1992 notebook.default_user(), welcome=filled_in['username'])) 2003 notebook.default_user(), welcome=filled_in['username'], 2004 recover=notebook.conf()['email'])) 1993 2005 1994 2006 class ForgotPassPage(resource.Resource): 1995 2007 1996 2008 def render(self, request): 2009 if not notebook.conf()['email']: 2010 return http.Response(stream=message('The account recovery system is not active.')) 2011 1997 2012 if request.args.has_key('username'): 1998 2013 def error(msg): 1999 2014 return http.Response(stream=message(msg, '/forgotpass')) … … 2100 2115 self.username = username if username else 'guest' 2101 2116 2102 2117 def render(self, ctx): 2103 return http.Response(stream = login_page_template(notebook.get_accounts(), notebook.default_user() ))2118 return http.Response(stream = login_page_template(notebook.get_accounts(), notebook.default_user(), recover=notebook.conf()['email'])) 2104 2119 2105 2120 def userchildFactory(self, request, name): 2106 2121 return InvalidPage(msg = "unauthorized request", username = self.username) … … 2118 2133 2119 2134 class LoginResourceClass(resource.Resource): 2120 2135 def render(self, ctx): 2121 return http.Response(stream = login_page_template(notebook.get_accounts(), notebook.default_user() ))2136 return http.Response(stream = login_page_template(notebook.get_accounts(), notebook.default_user(), recover=notebook.conf()['email'])) 2122 2137 2123 2138 def childFactory(self, request, name): 2124 2139 return LoginResource … … 2152 2167 #child_login = LoginResource 2153 2168 2154 2169 def render(self, ctx): 2155 return http.Response(stream = login_page_template(notebook.get_accounts(), notebook.default_user() ))2170 return http.Response(stream = login_page_template(notebook.get_accounts(), notebook.default_user(), recover=notebook.conf()['email'])) 2156 2171 2157 2172 class FailedToplevel(Toplevel): 2158 2173 def __init__(self, info, problem, username=None): … … 2165 2180 # worksheets and ratings, this gives no new information way. 2166 2181 # If published pages were disabled, then this should be disabled too. 2167 2182 if self.problem == 'username': 2168 return http.Response(stream = login_page_template(notebook.get_accounts(), notebook.default_user(), is_username_error=True ))2183 return http.Response(stream = login_page_template(notebook.get_accounts(), notebook.default_user(), is_username_error=True, recover=notebook.conf()['email'])) 2169 2184 else: 2170 return http.Response(stream = login_page_template(notebook.get_accounts(), self.username, is_password_error=True ))2185 return http.Response(stream = login_page_template(notebook.get_accounts(), self.username, is_password_error=True, recover=notebook.conf()['email'])) 2171 2186 2172 2187 2173 2188 class UserToplevel(Toplevel):