Mercurial > hg > bitsyauth
annotate bitsyauth/__init__.py @ 52:aabc968611bc
STUB: bitsyauth/__init__.py
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Sun, 23 Feb 2014 17:08:13 -0800 |
parents | 54a53bbe5be9 |
children | d9e712cfd098 |
rev | line source |
---|---|
52 | 1 """ |
2 bitsyauth: wrapper module for paste auth | |
3 """ | |
4 | |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
5 import markup |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
6 import random |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
7 import re |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
8 import sys |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
9 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
10 from cStringIO import StringIO |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
11 from markup.form import Form |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
12 from paste.auth import basic, cookie, digest, form, multi, auth_tkt |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
13 from webob import Request, Response, exc |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
14 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
15 try: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
16 from skimpyGimpy import skimpyAPI |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
17 CAPTCHA = True |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
18 except ImportError: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
19 CAPTCHA = False |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
20 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
21 dictionary_file = '/usr/share/dict/american-english' |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
22 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
23 def random_word(): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
24 """generate a random word for CAPTCHA auth""" |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
25 min_length = 5 # minimum word length |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
26 if not globals().has_key('dictionary'): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
27 # read the dictionary -- this may be platform dependent |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
28 # XXX could use a backup dictionary |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
29 _dictionary = file(dictionary_file).readlines() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
30 _dictionary = [ i.strip() for i in _dictionary ] |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
31 _dictionary = [ i.lower() for i in _dictionary |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
32 if i.isalpha() and i > min_length ] |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
33 globals()['dictionary'] = _dictionary |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
34 return random.Random().choice(dictionary) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
35 |
52 | 36 |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
37 class BitsyAuthInnerWare(object): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
38 """inner auth; does login checking""" |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
39 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
40 def __init__(self, app, passwords, newuser=None, site=None, realm=None): |
44 | 41 """ |
42 a simple auth implementation: inner middleware | |
43 | |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
44 * app: the WSGI app to be wrapped |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
45 * passwords: callable that return a dictionary of {'user': 'password'} |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
46 * newuser: callable to make a new user, taking name + pw |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
47 * site: name of the site |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
48 * realm: realm for HTTP digest authentication |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
49 """ |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
50 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
51 self.app = app |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
52 self.passwords = passwords |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
53 self.site = site or '' |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
54 self.realm = realm or self.site |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
55 self.captcha = True |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
56 self.urls = { 'login': '/login', 'join': '/join', } |
45
54a53bbe5be9
bitsyauth/__init__.py example/persona.html
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
57 |
54a53bbe5be9
bitsyauth/__init__.py example/persona.html
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
58 # CAPTCHAs |
54a53bbe5be9
bitsyauth/__init__.py example/persona.html
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
59 # using skimpygimpy (for now) |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
60 self.keys = {} # keys, words for CAPTCHA request |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
61 self.content_type = { 'image_captcha': 'image/png', |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
62 'wav_captcha': 'audio/wav' } |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
63 |
45
54a53bbe5be9
bitsyauth/__init__.py example/persona.html
Jeff Hammel <jhammel@mozilla.com>
parents:
44
diff
changeset
|
64 # new user creation |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
65 if newuser: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
66 self.newuser = newuser |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
67 else: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
68 self.urls.pop('join') # don't do joining |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
69 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
70 # WSGI app securely wrapped |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
71 self.wrapped_app = self.security_wrapper() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
72 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
73 if not CAPTCHA: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
74 self.captcha = False |
21 | 75 |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
76 ### WSGI/HTTP layer |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
77 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
78 def __call__(self, environ, start_response): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
79 |
8 | 80 orig_environ = dict(environ) |
81 | |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
82 self.request = Request(environ) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
83 self.request.path_info = self.request.path_info.rstrip('/') |
20
9f4369b769d0
this *may* be more portable?
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
84 |
8 | 85 self.redirect_to = '/' + self.request.script_name.lstrip('/') |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
86 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
87 # URLs intrinsic to BitsyAuth |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
88 if self.request.path_info == '/logout': |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
89 response = self.redirect() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
90 return response(self.request.environ, start_response) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
91 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
92 if self.request.path_info in self.url_lookup(): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
93 response = self.make_response() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
94 return response(self.request.environ, start_response) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
95 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
96 # digest auth |
20
9f4369b769d0
this *may* be more portable?
Jeff Hammel <jhammel@mozilla.com>
parents:
19
diff
changeset
|
97 if 'Authorization' in self.request.headers.keys(): |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
98 return self.wrapped_app(self.request.environ, start_response) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
99 |
8 | 100 response = Request(orig_environ).get_response(self.app) |
101 | |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
102 # respond to 401s |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
103 if response.status_int == 401: # Unauthorized |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
104 if self.request.environ.get('REMOTE_USER'): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
105 return exc.HTTPForbidden() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
106 else: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
107 response = self.request.get_response(self.wrapped_app) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
108 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
109 user = self.request.environ.get('REMOTE_USER') |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
110 if user: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
111 self.request.environ['paste.auth_tkt.set_user'](user) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
112 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
113 return response(self.request.environ, start_response) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
114 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
115 ### authentication function |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
116 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
117 def digest_authfunc(self, environ, realm, user): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
118 return self.passwords()[user] # passwords stored in m5 digest |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
119 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
120 def authfunc(self, environ, user, password): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
121 return self.hash(user, password) == self.passwords()[user] |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
122 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
123 def hash(self, user, password): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
124 # use md5 digest for now |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
125 return digest.digest_password(self.realm, user, password) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
126 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
127 def security_wrapper(self): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
128 """return the app securely wrapped""" |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
129 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
130 multi_auth = multi.MultiHandler(self.app) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
131 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
132 # digest authentication |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
133 multi_auth.add_method('digest', digest.middleware, |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
134 self.realm, self.digest_authfunc) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
135 multi_auth.set_query_argument('digest', key='auth') |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
136 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
137 # form authentication |
6 | 138 template = self.login(wrap=True, action='%s') |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
139 multi_auth.add_method('form', form.middleware, self.authfunc, |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
140 template=template) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
141 multi_auth.set_default('form') |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
142 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
143 return multi_auth |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
144 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
145 # might have to wrap cookie.middleware(BitsyAuth(multi(app))) ::shrug:: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
146 return cookie.middleware(multi_auth) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
147 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
148 ### methods dealing with intrinsic URLs |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
149 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
150 def url_lookup(self): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
151 retval = dict([ (value, key) for key, value |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
152 in self.urls.items() ]) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
153 if self.captcha: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
154 retval.update(dict([(('/join/%s.png' % key), 'image_captcha') |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
155 for key in self.keys])) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
156 return retval |
21 | 157 |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
158 def get_response(self, text, content_type='text/html'): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
159 res = Response(content_type=content_type, body=text) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
160 res.content_length = len(res.body) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
161 return res |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
162 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
163 def make_response(self): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
164 url_lookup = self.url_lookup() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
165 path = self.request.path_info |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
166 assert path in url_lookup |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
167 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
168 # login and join shouldn't be accessible when logged in |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
169 if self.request.environ.get('REMOTE_USER'): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
170 return self.redirect("You are already logged in") |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
171 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
172 handler = url_lookup[path] |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
173 function = getattr(self, handler) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
174 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
175 if self.request.method == 'GET': |
21 | 176 # XXX could/should do this with decorators |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
177 return self.get_response(function(wrap=True), |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
178 content_type=self.content_type.get(handler,'text/html')) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
179 if self.request.method == 'POST': |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
180 post_func = getattr(self, handler + "_post") |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
181 errors = post_func() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
182 if errors: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
183 return self.get_response(function(errors=errors, wrap=True)) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
184 else: |
5
2693b81f5960
fix redirection behaviour (though ultimately the whole class should be refactored not to store request on it)
k0s <k0scist@gmail.com>
parents:
4
diff
changeset
|
185 location = self.request.POST.get('referer') |
2693b81f5960
fix redirection behaviour (though ultimately the whole class should be refactored not to store request on it)
k0s <k0scist@gmail.com>
parents:
4
diff
changeset
|
186 return self.redirect("Welcome!", location=location) |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
187 |
5
2693b81f5960
fix redirection behaviour (though ultimately the whole class should be refactored not to store request on it)
k0s <k0scist@gmail.com>
parents:
4
diff
changeset
|
188 def redirect(self, message='', location=None): |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
189 """redirect from instrinsic urls""" |
5
2693b81f5960
fix redirection behaviour (though ultimately the whole class should be refactored not to store request on it)
k0s <k0scist@gmail.com>
parents:
4
diff
changeset
|
190 return exc.HTTPSeeOther(message, location=location or self.redirect_to) |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
191 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
192 def image_captcha(self, wrap=True): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
193 """return data for the image""" |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
194 key = self.request.path_info.split('/join/')[-1] |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
195 key = int(key.split('.png')[0]) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
196 return skimpyAPI.Png(self.keys[key], scale=3.0).data() |
21 | 197 |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
198 ### forms and their display methods |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
199 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
200 ### login |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
201 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
202 def login_form(self, referer=None, action=None): |
6 | 203 form = Form(action=action or '', submit='Login') |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
204 form.add_element('textfield', 'Name', input_name='username') |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
205 form.add_element('password', 'Password', input_name='password') |
5
2693b81f5960
fix redirection behaviour (though ultimately the whole class should be refactored not to store request on it)
k0s <k0scist@gmail.com>
parents:
4
diff
changeset
|
206 if referer: |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
207 form.add_element('hidden', 'referer', value=referer) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
208 return form |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
209 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
210 def login(self, errors=None, wrap=False, action=None): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
211 """login div""" |
5
2693b81f5960
fix redirection behaviour (though ultimately the whole class should be refactored not to store request on it)
k0s <k0scist@gmail.com>
parents:
4
diff
changeset
|
212 referer = None |
2693b81f5960
fix redirection behaviour (though ultimately the whole class should be refactored not to store request on it)
k0s <k0scist@gmail.com>
parents:
4
diff
changeset
|
213 if hasattr(self, 'request'): |
2693b81f5960
fix redirection behaviour (though ultimately the whole class should be refactored not to store request on it)
k0s <k0scist@gmail.com>
parents:
4
diff
changeset
|
214 referer = self.request.referer |
2693b81f5960
fix redirection behaviour (though ultimately the whole class should be refactored not to store request on it)
k0s <k0scist@gmail.com>
parents:
4
diff
changeset
|
215 form = self.login_form(action=action, referer=referer) |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
216 join = self.urls.get('join') |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
217 retval = form(errors) |
21 | 218 if join: |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
219 retval += '<br/>\n' + markup.a('join', href="%s" % join) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
220 retval = markup.div(retval) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
221 if wrap: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
222 title = 'login' |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
223 if self.site: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
224 pagetitle = '%s - %s' % (title, self.site) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
225 retval = markup.wrap(markup.h1(title.title()) + retval, |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
226 pagetitle=pagetitle) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
227 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
228 return retval |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
229 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
230 def login_post(self): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
231 """handle a login POST request""" |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
232 user = self.request.POST.get('username') |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
233 password = self.request.POST.get('password') |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
234 passwords = self.passwords() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
235 error = False |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
236 if user not in passwords: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
237 error = True |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
238 else: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
239 error = not self.authfunc(self.request.environ, user, password) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
240 if error: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
241 return { 'Name': 'Wrong username or password' } |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
242 self.request.environ['REMOTE_USER'] = user |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
243 self.request.environ['paste.auth_tkt.set_user'](user) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
244 |
52 | 245 |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
246 ### join |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
247 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
248 def captcha_pre(self, word, key): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
249 """CAPTCHA with pre-formatted text""" |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
250 return skimpyAPI.Pre(word, scale=1.2).data() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
251 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
252 def captcha_png(self, word, key): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
253 """CAPTCHA with a PNG image""" |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
254 return markup.image('/join/%s.png' % key) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
255 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
256 def join_form(self): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
257 captcha = '' |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
258 if self.captcha: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
259 # data for CAPTCHA |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
260 key = random.Random().randint(0, sys.maxint) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
261 word = random_word() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
262 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
263 self.keys[key] = word |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
264 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
265 captcha = StringIO() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
266 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
267 captcha_text = "Please type the word below so I know you're not a computer:" |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
268 captcha_help = "(please %s if the page is unreadable)" % markup.link('/join?captcha=image', 'go here') |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
269 |
19 | 270 print >> captcha, markup.p('%s<br/> %s' % (captcha_text, |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
271 markup.i(captcha_help))) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
272 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
273 # determine type of CAPTCHA |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
274 captchas = ' '.join(self.request.GET.getall('captcha')) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
275 if not captchas: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
276 captchas = 'pre' |
19 | 277 |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
278 captcha_funcs=dict(pre=self.captcha_pre, |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
279 image=self.captcha_png,) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
280 captchas = [ captcha_funcs[i](word, key) for i in captchas.split() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
281 if i in captcha_funcs ] |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
282 captchas = '\n'.join([markup.p(i) for i in captchas]) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
283 print >> captcha, captchas |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
284 print >> captcha, markup.p(markup.input(None, **dict(name='captcha', type='text'))) |
19 | 285 |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
286 captcha = captcha.getvalue() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
287 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
288 form = Form(action=self.urls['join'], submit='Join', post_html=captcha) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
289 form.add_element('textfield', 'Name') |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
290 form.add_password_confirmation() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
291 form.add_element('hidden', 'key', value=str(key)) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
292 return form |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
293 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
294 def join(self, errors=None, wrap=False): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
295 """join div or page if wrap""" |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
296 form = self.join_form() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
297 retval = markup.div(form(errors)) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
298 if wrap: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
299 pagetitle = title = 'join' |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
300 if self.site: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
301 pagetitle = '%s - %s' % (title, self.site) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
302 if self.captcha: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
303 errors = errors or {} |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
304 captcha_err = errors.get('CAPTCHA', '') |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
305 if captcha_err: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
306 captcha_err = markup.p(markup.em(captcha_err), |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
307 **{'class': 'error'}) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
308 retval = markup.wrap(markup.h1(title.title()) + captcha_err + retval, |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
309 pagetitle=pagetitle) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
310 return retval |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
311 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
312 def join_post(self): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
313 """handle a join POST request""" |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
314 form = self.join_form() |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
315 errors = form.validate(self.request.POST) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
316 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
317 # validate captcha |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
318 if CAPTCHA: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
319 key = self.request.POST.get('key') |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
320 try: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
321 key = int(key) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
322 except ValueError: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
323 key = None |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
324 if not key: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
325 errors['CAPTCHA'] = 'Please type the funky looking word' |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
326 word = self.keys.pop(key, None) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
327 if not word: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
328 errors['CAPTCHA'] = 'Please type the funky looking word' |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
329 if word != self.request.POST.get('captcha','').lower(): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
330 errors['CAPTCHA'] = 'Sorry, you typed the wrong word' |
19 | 331 |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
332 name = self.request.POST.get('Name', '') |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
333 if not name: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
334 if not errors.has_key('Name'): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
335 errors['Name'] = [] |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
336 errors['Name'].append('Please enter a user name') |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
337 if name in self.passwords(): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
338 if not errors.has_key('Name'): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
339 errors['Name'] = [] |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
340 errors['Name'].append('The name %s is already taken' % name) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
341 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
342 if not errors: # create a new user |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
343 self.newuser(name, |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
344 self.hash(name, self.request.POST['Password'])) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
345 self.request.environ['REMOTE_USER'] = name # login the new user |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
346 self.request.environ['paste.auth_tkt.set_user'](name) |
18 | 347 |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
348 return errors |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
349 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
350 class BitsyAuth(object): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
351 """outer middleware for auth; does the cookie handling and wrapping""" |
18 | 352 |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
353 def __init__(self, app, global_conf, passwords, newuser, site='', secret='secret'): |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
354 self.app = app |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
355 self.path = '/logout' |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
356 self.cookie = '__ac' |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
357 auth = BitsyAuthInnerWare(app, passwords=passwords, newuser=newuser, site=site) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
358 self.hash = auth.hash |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
359 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
360 # paste.auth.auth_tkt |
9
73b2b5bccd52
* allow logout to pass through instead of failing
egj@socialplanning.org
parents:
8
diff
changeset
|
361 self.cookie_handler = auth_tkt.make_auth_tkt_middleware( |
73b2b5bccd52
* allow logout to pass through instead of failing
egj@socialplanning.org
parents:
8
diff
changeset
|
362 auth, global_conf, secret, |
73b2b5bccd52
* allow logout to pass through instead of failing
egj@socialplanning.org
parents:
8
diff
changeset
|
363 cookie_name=self.cookie, logout_path='/logout') |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
364 |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
365 def __call__(self, environ, start_response): |
42 | 366 |
9
73b2b5bccd52
* allow logout to pass through instead of failing
egj@socialplanning.org
parents:
8
diff
changeset
|
367 try: |
73b2b5bccd52
* allow logout to pass through instead of failing
egj@socialplanning.org
parents:
8
diff
changeset
|
368 return self.cookie_handler(environ, start_response) |
15
431bd76aabb7
slightly less stupid exception handling
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
369 except auth_tkt.BadTicket: |
431bd76aabb7
slightly less stupid exception handling
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
370 environ.pop('HTTP_COOKIE') # kill all cookies! bad! XXX |
431bd76aabb7
slightly less stupid exception handling
Jeff Hammel <jhammel@mozilla.com>
parents:
9
diff
changeset
|
371 return self.cookie_handler(environ, start_response) |
9
73b2b5bccd52
* allow logout to pass through instead of failing
egj@socialplanning.org
parents:
8
diff
changeset
|
372 return self.logout(environ, start_response) |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
373 |
9
73b2b5bccd52
* allow logout to pass through instead of failing
egj@socialplanning.org
parents:
8
diff
changeset
|
374 def logout(self, environ, start_response): |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
375 req = Request(environ) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
376 keys = [ 'REMOTE_USER' ] |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
377 # keys = [ 'REMOTE_USER', 'AUTH_TYPE', 'paste.auth.cookie', 'paste.cookies', 'HTTP_COOKIE' ] # XXX zealous kill |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
378 for key in keys: |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
379 req.environ.pop(key, None) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
380 |
43 | 381 # return response |
0
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
382 body = '<html><head><title>logout</title></head><body>logout</body></html>' |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
383 res = Response(content_type='text/html', body=body) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
384 req.cookies.pop(self.cookie, None) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
385 res.delete_cookie(self.cookie) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
386 res.unset_cookie(self.cookie) |
284621b3effd
initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
387 return res(environ, start_response) |
17 | 388 |