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