""" open/dulcinea/lib/ui/user/password.qpy """ from dulcinea.common import get_site_title from dulcinea.ui.util import get_site_url, item_list from qp.fill.form import Form from qp.fill.html import href, mailto from qp.fill.widget import CompositeWidget, PasswordWidget, StringWidget from qp.mail.send import sendmail from qp.pub.common import header, footer, redirect, get_request, get_user, page from qp.pub.common import complete_path, get_users, get_publisher class NewPasswordWidget(CompositeWidget): def __init__(self, name, value=None, validation_function=None, size=None, **kwargs): CompositeWidget.__init__(self, name, value=None, **kwargs) self.add(PasswordWidget, 'first', value, size=size) self.add(PasswordWidget, 'second', value, size=size) self.validation_function = validation_function def _parse(self, request): first = self.get('first') second = self.get('second') if first != second: self.set_error("The two password fields didn't match.") else: self.value = first if None not in (self.value, self.validation_function): error = self.validation_function(self.value) if error: self.set_error(error) class ValidPasswordWidget(PasswordWidget): def __init__(self, name, validation_function=None, **kwargs): PasswordWidget.__init__(self, name, **kwargs) self.validation_function = validation_function def _parse(self, request): PasswordWidget._parse(self, request) if None not in (self.value, self.validation_function): error = self.validation_function(self.value) if error: self.set_error(error) def change_user_password_form:xml(user): def validation(password): if get_user().has_password(password): return None else: return 'Wrong password.' form = Form() form.add(ValidPasswordWidget, 'your_password', title='Your password', size=15, validation_function=validation, required=1) form.add(NewPasswordWidget, 'password', title='New password', size=15, validation_function=user.check_new_password, hint='Make up a password or leave blank to disable user.') form.add_submit('change', 'Change password') form.add_submit('cancel', 'Cancel') if form.get('cancel'): redirect('.') if not form.is_submitted() or form.has_errors(): return page('Change Password: %s' % user.format_realname(), form.render()) password = form['password'] if password: user.set_password(password) else: user.set_password(None, check=False) remote_addr = get_request().get_environ("REMOTE_ADDR") user.record_change(get_user(), remote_addr, password=1) return page( 'Password Changed: %s' % user.format_realname(), '') def change_password_form:xml(): user = get_user() def validation(password): if user.has_password(password): return None else: return 'Wrong password.' form = Form() form.add(ValidPasswordWidget, 'current_password', title='Current password', size=15, validation_function=validation, required=1) form.add(NewPasswordWidget, 'password', title='New password', size=15, validation_function=user.check_new_password, required=1) form.add_submit('change', 'Change password') form.add_submit('cancel', 'Cancel') if form.get('cancel'): redirect('.') if not form.is_submitted() or form.has_errors(): return page('Change Password: %s' % user, form.render()) user.set_password(form.get('password')) remote_addr = get_request().get_environ("REMOTE_ADDR") user.record_change(user, remote_addr, password=1) return page( 'Password Changed: %s' % user.format_realname(), '') def new_password_form:xml(user=None): form = Form() if not user: form.add(StringWidget, 'user_id', title='User ID', size=20, maxlength=32) form.add_submit('send', value='Send password') form.add_submit('cancel', value='Cancel') if form['cancel']: redirect('..') if user: def render:xml(): title = 'New password: %s' % user.get_id() header(title) get_publisher().format_user_profile(user) '''
Click "Send password" to email %s a new password to the address listed in the the profile.
''' % user.format() form.render() footer(title) def notification:str(): site_url = get_site_url() 'Your password has been set at the %s.\n\n' % get_site_title() 'Your user ID is: %s\n' % user.get_id() 'Your password is: %s\n\n' % user.generate_password() 'Please visit %smy/ to login,\n' % site_url 'and %smy/profile/change_password\nto change ' % site_url ' your password.\n\n' 'Other information associated with your account:\n' ' real name: %s\n' % user.format_realname() ' email address: %s\n' % user.get_email() ' phone number: %s\n\n' % user.get_phone() or "(unknown)" 'You can visit %smy/profile/edit\nto update ' % site_url 'this information.\n' cc_addrs = [get_user().get_email()] def confirm:xml(): title = 'New Password Confirmation' header(title) '' footer(title) else: def render:xml(): title = 'Forgot Your Password?' header(title) '' footer(title) def notification:str(): 'A new password has been requested for your account at\n' '%s.\n\n' % get_site_url() 'Your new password is: %s\n' % user.generate_password() cc_addrs = None def confirm:xml(): title = 'New Password Confirmation' header(title) '

Your new password has been sent to you.

' item_list((complete_path('/my/'), 'Sign In')) footer(title) if not form.is_submitted(): return render() if not user: user = get_users().get(form.get('user_id')) if not user: form.set_error('user_id', 'Invalid user ID') return render() email = user.get_email() if not email: form.set_error('send', 'No email address supplied') if form.has_errors(): return render() if user.is_disabled(): header('Account Disabled') '

' 'The account, %s, is disabled.' % user.get_id() '

' footer() else: sendmail('New %s Password' % get_site_title(), notification(), [email], cc_addrs=cc_addrs, charset='latin1') remote_addr = get_request().get_environ("REMOTE_ADDR") user.record_change(get_user(), remote_addr, password=1) return confirm()