MoinMoin/action/newaccount.py
author Thomas Waldmann <tw AT waldmann-edv DOT de>
Sun, 08 Feb 2009 19:16:58 +0100
changeset 4284 1f0db10c207f
parent 3846 92ae3d3f0a31
child 4460 91aa8c3c515b
permissions -rw-r--r--
make install-docs interwiki
     1 # -*- coding: iso-8859-1 -*-
     2 """
     3     MoinMoin - create account action
     4 
     5     @copyright: 2007 MoinMoin:JohannesBerg
     6     @license: GNU GPL, see COPYING for details.
     7 """
     8 
     9 from MoinMoin import user, wikiutil, util
    10 from MoinMoin.Page import Page
    11 from MoinMoin.widget import html
    12 from MoinMoin.security.textcha import TextCha
    13 from MoinMoin.auth import MoinAuth
    14 
    15 
    16 _debug = False
    17 
    18 def _create_user(request):
    19     _ = request.getText
    20     form = request.form
    21 
    22     if request.request_method != 'POST':
    23         return
    24 
    25     if not TextCha(request).check_answer_from_form():
    26         return _('TextCha: Wrong answer! Go back and try again...')
    27 
    28     # Create user profile
    29     theuser = user.User(request, auth_method="new-user")
    30 
    31     # Require non-empty name
    32     try:
    33         theuser.name = form['name'][0]
    34     except KeyError:
    35         return _("Empty user name. Please enter a user name.")
    36 
    37     # Don't allow creating users with invalid names
    38     if not user.isValidName(request, theuser.name):
    39         return _("""Invalid user name {{{'%s'}}}.
    40 Name may contain any Unicode alpha numeric character, with optional one
    41 space between words. Group page name is not allowed.""", wiki=True) % wikiutil.escape(theuser.name)
    42 
    43     # Name required to be unique. Check if name belong to another user.
    44     if user.getUserId(request, theuser.name):
    45         return _("This user name already belongs to somebody else.")
    46 
    47     # try to get the password and pw repeat
    48     password = form.get('password1', [''])[0]
    49     password2 = form.get('password2', [''])[0]
    50 
    51     # Check if password is given and matches with password repeat
    52     if password != password2:
    53         return _("Passwords don't match!")
    54     if not password:
    55         return _("Please specify a password!")
    56 
    57     pw_checker = request.cfg.password_checker
    58     if pw_checker:
    59         pw_error = pw_checker(request, theuser.name, password)
    60         if pw_error:
    61             return _("Password not acceptable: %s") % pw_error
    62 
    63     # Encode password
    64     if password and not password.startswith('{SHA}'):
    65         try:
    66             theuser.enc_password = user.encodePassword(password)
    67         except UnicodeError, err:
    68             # Should never happen
    69             return "Can't encode password: %s" % str(err)
    70 
    71     # try to get the email, for new users it is required
    72     email = wikiutil.clean_input(form.get('email', [''])[0])
    73     theuser.email = email.strip()
    74     if not theuser.email and 'email' not in request.cfg.user_form_remove:
    75         return _("Please provide your email address. If you lose your"
    76                  " login information, you can get it by email.")
    77 
    78     # Email should be unique - see also MoinMoin/script/accounts/moin_usercheck.py
    79     if theuser.email and request.cfg.user_email_unique:
    80         if user.get_by_email_address(request, theuser.email):
    81             return _("This email already belongs to somebody else.")
    82 
    83     # save data
    84     theuser.save()
    85 
    86     result = _("User account created! You can use this account to login now...")
    87     if _debug:
    88         result = result + util.dumpFormData(form)
    89     return result
    90 
    91 
    92 def _create_form(request):
    93     _ = request.getText
    94     url = request.page.url(request)
    95     ret = html.FORM(action=url)
    96     ret.append(html.INPUT(type='hidden', name='action', value='newaccount'))
    97     lang_attr = request.theme.ui_lang_attr()
    98     ret.append(html.Raw('<div class="userpref"%s>' % lang_attr))
    99     tbl = html.TABLE(border="0")
   100     ret.append(tbl)
   101     ret.append(html.Raw('</div>'))
   102 
   103     row = html.TR()
   104     tbl.append(row)
   105     row.append(html.TD().append(html.STRONG().append(
   106                                   html.Text(_("Name")))))
   107     cell = html.TD()
   108     row.append(cell)
   109     cell.append(html.INPUT(type="text", size="36", name="name"))
   110     cell.append(html.Text(' ' + _("(Use FirstnameLastname)")))
   111 
   112     row = html.TR()
   113     tbl.append(row)
   114     row.append(html.TD().append(html.STRONG().append(
   115                                   html.Text(_("Password")))))
   116     row.append(html.TD().append(html.INPUT(type="password", size="36",
   117                                            name="password1")))
   118 
   119     row = html.TR()
   120     tbl.append(row)
   121     row.append(html.TD().append(html.STRONG().append(
   122                                   html.Text(_("Password repeat")))))
   123     row.append(html.TD().append(html.INPUT(type="password", size="36",
   124                                            name="password2")))
   125 
   126     row = html.TR()
   127     tbl.append(row)
   128     row.append(html.TD().append(html.STRONG().append(html.Text(_("Email")))))
   129     row.append(html.TD().append(html.INPUT(type="text", size="36",
   130                                            name="email")))
   131 
   132     textcha = TextCha(request)
   133     if textcha.is_enabled():
   134         row = html.TR()
   135         tbl.append(row)
   136         row.append(html.TD().append(html.STRONG().append(
   137                                       html.Text(_('TextCha (required)')))))
   138         td = html.TD()
   139         if textcha:
   140             td.append(textcha.render())
   141         row.append(td)
   142 
   143     row = html.TR()
   144     tbl.append(row)
   145     row.append(html.TD())
   146     td = html.TD()
   147     row.append(td)
   148     td.append(html.INPUT(type="submit", name="create",
   149                          value=_('Create Profile')))
   150 
   151     return unicode(ret)
   152 
   153 def execute(pagename, request):
   154     found = False
   155     for auth in request.cfg.auth:
   156         if isinstance(auth, MoinAuth):
   157             found = True
   158             break
   159 
   160     if not found:
   161         # we will not have linked, so forbid access
   162         request.makeForbidden403()
   163         return
   164 
   165     page = Page(request, pagename)
   166     _ = request.getText
   167     form = request.form
   168 
   169     submitted = form.has_key('create')
   170 
   171     if submitted: # user pressed create button
   172         request.theme.add_msg(_create_user(request), "dialog")
   173         return page.send_page()
   174     else: # show create form
   175         request.emit_http_headers()
   176         request.theme.send_title(_("Create Account"), pagename=pagename)
   177 
   178         request.write(request.formatter.startContent("content"))
   179 
   180         # THIS IS A BIG HACK. IT NEEDS TO BE CLEANED UP
   181         request.write(_create_form(request))
   182 
   183         request.write(request.formatter.endContent())
   184 
   185         request.theme.send_footer(pagename)
   186         request.theme.send_closing_html()
   187