IMAPAuth
The purpose of IMAPAuth is to avoid creating a lot of users inside an organization and, at the same time, restricting the access to the wiki by people outside the organization. Using an IMAP server, all your users with an e-mail account on @mydomain can login into your wiki.
This plugin cuts out the @mydomain part of the login when creating the users, so cleber@mydomain.com will become just cleber.
It's based on DummyAuth (by RadomirDopieralski).
Usage
Simply add these lines to your wikiconfig.py:
from IMAPAuth import IMAPAuth auth = [IMAPAuth(u'stmp.anyserver.com')]
The file
1 #-*- encoding: utf-8 -*-
2
3 # IMAP auth for MoinMoin, by Cléber Zavadniak
4 # Based on DummyAuth, by RadomirDopieralski
5 # (http://moinmo.in/AuthMarket?action=AttachFile&do=view&target=DummyAuth.py)
6 # (http://moinmo.in/RadomirDopieralski)
7 #
8 # Usage: add these lines to your wikiconfig.py:
9 #
10 # from IMAPAuth import IMAPAuth
11 # auth = [IMAPAuth(u'stmp.yourserver.com')]
12
13 import imaplib
14
15 from MoinMoin import user
16 from MoinMoin.auth import BaseAuth, CancelLogin, ContinueLogin
17
18 class IMAPAuth(BaseAuth):
19 """Authenticate users if they authenticate at some IMAP server."""
20
21 name = 'imap'
22 logout_possible = True
23 login_inputs = ['username', 'password']
24
25 def __init__(self, host, port = 143):
26 self.host = host
27 self.port = port
28
29 def login_plain (self, imap, user, password, authuser = None):
30 def plain_callback (response):
31 if authuser is None:
32 return "%s\x00%s\x00%s" % ( user , user , password )
33 else:
34 return "%s\x00%s\x00%s" % ( user , authuser , password )
35
36 try:
37 return imap.authenticate ('PLAIN', plain_callback)
38 except imap.error as e:
39 print 'imap error:', e
40 return False
41
42
43 def authenticate (self, request, username, password):
44
45 imap = imaplib.IMAP4(self.host, self.port)
46 #print
47 #print 'imap capabilities:', imap.capabilities
48 resposta = self.login_plain(imap, username, password)
49
50 if resposta and resposta[0] == 'OK' and 'Logged in' in resposta[1]:
51
52 # Cuts off the @server part of the e-mail address:
53 clear_username = username.split('@')[0]
54
55 u = user.User(request, auth_username=clear_username, auth_method=self.name, auth_attribs=('username', 'password',))
56 u.name = clear_username
57 u.remember_me = 0 # 0 enforces cookie_lifetime config param
58
59 u.create_or_update(True)
60
61 return u
62
63 else:
64 return False # Invalid credentials!
65
66 def login(self, request, user_obj, **kw):
67
68 _ = request.getText
69
70 username = kw.get('username')
71 password = kw.get('password')
72
73 if user_obj:
74 pass # Do we have anything to do in this case?
75 else:
76 u = self.authenticate(request, username, password)
77 if u == False:
78 return CancelLogin(_("Invalid username or password."))
79 else:
80 return ContinueLogin(u)
81
82 return ContinueLogin(user_obj)
83
84 def logout(self, request, user_obj, **kw):
85 # Faz nada.
86 user_obj.valid = False
87 return user_obj, False
Hits: 309
