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
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
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
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
- Install actins and macro; test them (should work with 1,3, Python 2.3).
Create copy of UserPreferences, for instance, MyPreferences
Replace UserPreferences with
[[Login]] /!\ Don't have an account or forgot the password? Go to MyPreferences