/!\ code based on stuff below was committed to moin--main--1.5--patch-487. Thanks Radomir!

Contents

Simple separate login/logout

Userform.py broken into two separate actions and a macro.

Login Action

The action performs login. If trailin enabled redirects to the last page, else to the FrontPage. The action could be invoked directly (that's why lowercased): http://host/?action=login&username=UserName&password=??????

The redirects don't work for me - it tries to redirect to 'interwikiname:pagename' and fails. It doesn't seem to like the interwiki stuff - -- BenRitcey 2006-03-04 22:16:02

/login.py:

   1 """
   2     MoinMoin - login action based on userform
   3 
   4     @copyright: 2005 by Radomirs Cirskis <nad2000 AT gmail DOT com>
   5     @license: GNU GPL, see COPYING for details.
   6 """
   7 
   8 from MoinMoin import user, wikiutil
   9 from MoinMoin.Page import Page
  10 
  11 def execute(pagename, request):
  12     return LoginHandler(pagename, request).handle()
  13 
  14 class LoginHandler:
  15 
  16     def __init__(self, pagename, request):
  17         """ Initialize user settings form. """
  18         self.request = request
  19         self._ = request.getText
  20         self.cfg = request.cfg
  21         self.page = Page(request, pagename)
  22 
  23     def handle(self):
  24         _ = self._
  25         form = self.request.form
  26 
  27         error = None
  28 
  29         # Trying to login with a user name and a password
  30 
  31         # Require valid user name
  32         name = form.get('username', [''])[0]
  33         if not user.isValidName(self.request, name):
  34              error = _("""Invalid user name {{{'%s'}}}.
  35 Name may contain any Unicode alpha numeric character, with optional one
  36 space between words. Group page name is not allowed.""") % name
  37 
  38         # Check that user exists
  39         elif not user.getUserId(self.request, name):
  40             error = _('Unknown user name: {{{"%s"}}}. Please enter'
  41                          ' user name and password.') % name
  42 
  43         # Require password
  44         else:
  45             password = form.get('password',[None])[0]
  46             if not password:
  47                 error = _("Missing password. Please enter user name and"
  48                          " password.")
  49             else:
  50                 # Load the user data and check for validness
  51                 theuser = user.User(self.request, name=name, password=password)
  52                 if not theuser.valid:
  53                     error = _("Sorry, wrong password.")
  54 
  55                 # Save the user and send a cookie
  56                 else:
  57                     self.request.user = theuser
  58                     self.request.setCookie()
  59         if error:
  60             # Send page with an error message
  61             return self.page.send_page(self.request, msg=error)
  62 
  63         nextpagename = self.request.cfg.page_front_page
  64         for p in theuser.getTrail()[::-1]:
  65             if p!=self.page.page_name:
  66                 nextpagename = p
  67                 break
  68 
  69         return Page(self.request, nextpagename).send_page( self.request)

/!\ Good news! The user can login without uid. To the user can be send generated password within link: http://host/?action=login&username=UserName&password=??????

Logout Action

/logout.py:

   1 from MoinMoin import wikiutil
   2 from MoinMoin.Page import Page
   3 
   4 
   5 
   6 #############################################################################
   7 ### Form POST Handling
   8 #############################################################################
   9 
  10 def execute( pagename, request):
  11     """ Rerforms logout
  12 
  13     """
  14     return LogoutHandler(pagename, request).handle()
  15 
  16 
  17 class LogoutHandler:
  18 
  19     def __init__(self, pagename, request):
  20         """ Initialize user settings form. """
  21         self.request = request
  22         self._ = request.getText
  23         self.page = Page(request,pagename)
  24 
  25     def handle(self):
  26         _ = self._
  27         form = self.request.form
  28 
  29         self.request.deleteCookie()
  30         message = _("Cookie deleted. You are now logged out.")
  31         return self.page.send_page(self.request, msg=message)

Login Macro

Teh macro renders login form

/Login.py:

   1 from MoinMoin import config, user, util, wikiutil
   2 from MoinMoin.widget import html
   3 
   4 _debug = 1
   5 
   6 def execute(macro, args):
   7     return Login(macro.request).asHTML()
   8 
   9 #############################################################################
  10 ### Form Generation
  11 #############################################################################
  12 
  13 class Login:
  14     """ User login. """
  15 
  16     def __init__(self, request):
  17         """ Initialize user settings form.
  18         """
  19         self.request = request
  20         self._ = request.getText
  21         self.cfg = request.cfg
  22 
  23     def make_form(self):
  24         """ Create the FORM, and the TABLE with the input fields
  25         """
  26         sn = self.request.getScriptname()
  27         pi = self.request.getPathinfo()
  28         action = u"%s%s" % (sn, pi)
  29         self._form = html.FORM(action=action)
  30         self._table = html.TABLE(border="0")
  31 
  32         # Use the user interface language and direction
  33         lang_attr = self.request.theme.ui_lang_attr()
  34         self._form.append(html.Raw('<div class="userpref"%s>' % lang_attr))
  35 
  36         self._form.append(html.INPUT(type="hidden", name="action", value="login"))
  37         self._form.append(self._table)
  38         self._form.append(html.Raw("</div>"))
  39 
  40 
  41     def make_row(self, label, cell, **kw):
  42         """ Create a row in the form table.
  43         """
  44         self._table.append(html.TR().extend([
  45             html.TD(**kw).extend([html.B().append(label), '   ']),
  46             html.TD().extend(cell),
  47         ]))
  48 
  49 
  50     def asHTML(self):
  51         """ Create the complete HTML form code. """
  52         _ = self._
  53         self.make_form()
  54 
  55         buttons = [
  56             ('login', _('Login')),
  57         ]
  58 
  59         self.make_row(_('Name'), [
  60             html.INPUT(
  61                 type="text", size="32", name="username", value=self.request.user.name
  62             ),
  63         ])
  64 
  65         self.make_row(_('Password'), [
  66             html.INPUT(
  67                 type="password", size="32", name="password",
  68             )
  69         ])
  70 
  71         # Add buttons
  72         button_cell = []
  73         for name, label in buttons:
  74             button_cell.extend([
  75                 html.INPUT(type="submit", name=name, value=label),
  76                 ' ',
  77             ])
  78         self.make_row('', button_cell)
  79 
  80         return unicode(self._form)

Installation

  1. Install actins and macro; test them (should work with 1,3, Python 2.3).
  2. Create copy of UserPreferences, for instance, MyPreferences

  3. Replace UserPreferences with

    • [[Login]]
      
      /!\ Don't have an account or forgot the password? Go to MyPreferences

TODO

MoinMoin: RadomirsCirskis/LoginLogout (last edited 2007-10-29 19:19:23 by localhost)