annotate bitsyauth/__init__.py @ 53:d9e712cfd098

STUB: bitsyauth/__init__.py
author Jeff Hammel <k0scist@gmail.com>
date Thu, 06 Mar 2014 22:27:26 -0800
parents aabc968611bc
children b39ab92955ef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
52
aabc968611bc STUB: bitsyauth/__init__.py
Jeff Hammel <k0scist@gmail.com>
parents: 45
diff changeset
1 """
aabc968611bc STUB: bitsyauth/__init__.py
Jeff Hammel <k0scist@gmail.com>
parents: 45
diff changeset
2 bitsyauth: wrapper module for paste auth
aabc968611bc STUB: bitsyauth/__init__.py
Jeff Hammel <k0scist@gmail.com>
parents: 45
diff changeset
3 """
aabc968611bc STUB: bitsyauth/__init__.py
Jeff Hammel <k0scist@gmail.com>
parents: 45
diff changeset
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
aabc968611bc STUB: bitsyauth/__init__.py
Jeff Hammel <k0scist@gmail.com>
parents: 45
diff changeset
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
158b469a10e9 whitespace
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
41 """
158b469a10e9 whitespace
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
42 a simple auth implementation: inner middleware
158b469a10e9 whitespace
Jeff Hammel <jhammel@mozilla.com>
parents: 43
diff changeset
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
74b8a8793414 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
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
c958eb9300da add bitsy factory for filter
egj@socialplanning.org
parents: 6
diff changeset
80 orig_environ = dict(environ)
c958eb9300da add bitsy factory for filter
egj@socialplanning.org
parents: 6
diff changeset
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
c958eb9300da add bitsy factory for filter
egj@socialplanning.org
parents: 6
diff changeset
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()
53
d9e712cfd098 STUB: bitsyauth/__init__.py
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
94 try:
d9e712cfd098 STUB: bitsyauth/__init__.py
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
95 res = response(self.request.environ, start_response)
d9e712cfd098 STUB: bitsyauth/__init__.py
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
96 return res
d9e712cfd098 STUB: bitsyauth/__init__.py
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
97 except Exception as e:
d9e712cfd098 STUB: bitsyauth/__init__.py
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
98 print (e)
d9e712cfd098 STUB: bitsyauth/__init__.py
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
99 raise
d9e712cfd098 STUB: bitsyauth/__init__.py
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
100 import pdb; pdb.set_trace()
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
101
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
102 # digest auth
20
9f4369b769d0 this *may* be more portable?
Jeff Hammel <jhammel@mozilla.com>
parents: 19
diff changeset
103 if 'Authorization' in self.request.headers.keys():
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
104 return self.wrapped_app(self.request.environ, start_response)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
105
8
c958eb9300da add bitsy factory for filter
egj@socialplanning.org
parents: 6
diff changeset
106 response = Request(orig_environ).get_response(self.app)
c958eb9300da add bitsy factory for filter
egj@socialplanning.org
parents: 6
diff changeset
107
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
108 # respond to 401s
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
109 if response.status_int == 401: # Unauthorized
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
110 if self.request.environ.get('REMOTE_USER'):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
111 return exc.HTTPForbidden()
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
112 else:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
113 response = self.request.get_response(self.wrapped_app)
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 user = self.request.environ.get('REMOTE_USER')
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
116 if user:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
117 self.request.environ['paste.auth_tkt.set_user'](user)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
118
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
119 return response(self.request.environ, start_response)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
120
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
121 ### authentication function
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 digest_authfunc(self, environ, realm, user):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
124 return self.passwords()[user] # passwords stored in m5 digest
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
125
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
126 def authfunc(self, environ, user, password):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
127 return self.hash(user, password) == self.passwords()[user]
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
128
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
129 def hash(self, user, password):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
130 # use md5 digest for now
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
131 return digest.digest_password(self.realm, user, password)
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 def security_wrapper(self):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
134 """return the app securely wrapped"""
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
135
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
136 multi_auth = multi.MultiHandler(self.app)
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 # digest authentication
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
139 multi_auth.add_method('digest', digest.middleware,
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
140 self.realm, self.digest_authfunc)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
141 multi_auth.set_query_argument('digest', key='auth')
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 # form authentication
6
40fa556252a7 fix playing nice with paste auth
k0s <k0scist@gmail.com>
parents: 5
diff changeset
144 template = self.login(wrap=True, action='%s')
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
145 multi_auth.add_method('form', form.middleware, self.authfunc,
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
146 template=template)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
147 multi_auth.set_default('form')
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
148
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
149 return multi_auth
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
150
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
151 # 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
152 return cookie.middleware(multi_auth)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
153
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
154 ### methods dealing with intrinsic URLs
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
155
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
156 def url_lookup(self):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
157 retval = dict([ (value, key) for key, value
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
158 in self.urls.items() ])
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
159 if self.captcha:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
160 retval.update(dict([(('/join/%s.png' % key), 'image_captcha')
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
161 for key in self.keys]))
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
162 return retval
21
74b8a8793414 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
163
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
164 def get_response(self, text, content_type='text/html'):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
165 res = Response(content_type=content_type, body=text)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
166 res.content_length = len(res.body)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
167 return res
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
168
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
169 def make_response(self):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
170 url_lookup = self.url_lookup()
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
171 path = self.request.path_info
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
172 assert path in url_lookup
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
173
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
174 # 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
175 if self.request.environ.get('REMOTE_USER'):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
176 return self.redirect("You are already logged in")
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
177
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
178 handler = url_lookup[path]
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
179 function = getattr(self, handler)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
180
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
181 if self.request.method == 'GET':
21
74b8a8793414 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
182 # XXX could/should do this with decorators
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
183 return self.get_response(function(wrap=True),
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
184 content_type=self.content_type.get(handler,'text/html'))
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
185 if self.request.method == 'POST':
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
186 post_func = getattr(self, handler + "_post")
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
187 errors = post_func()
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
188 if errors:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
189 return self.get_response(function(errors=errors, wrap=True))
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
190 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
191 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
192 return self.redirect("Welcome!", location=location)
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
193
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
194 def redirect(self, message='', location=None):
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
195 """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
196 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
197
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
198 def image_captcha(self, wrap=True):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
199 """return data for the image"""
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
200 key = self.request.path_info.split('/join/')[-1]
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
201 key = int(key.split('.png')[0])
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
202 return skimpyAPI.Png(self.keys[key], scale=3.0).data()
21
74b8a8793414 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
203
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
204 ### forms and their display methods
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
205
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
206 ### login
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
207
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
208 def login_form(self, referer=None, action=None):
6
40fa556252a7 fix playing nice with paste auth
k0s <k0scist@gmail.com>
parents: 5
diff changeset
209 form = Form(action=action or '', submit='Login')
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
210 form.add_element('textfield', 'Name', input_name='username')
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
211 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
212 if referer:
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
213 form.add_element('hidden', 'referer', value=referer)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
214 return form
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
215
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
216 def login(self, errors=None, wrap=False, action=None):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
217 """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
218 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
219 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
220 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
221 form = self.login_form(action=action, referer=referer)
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
222 join = self.urls.get('join')
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
223 retval = form(errors)
21
74b8a8793414 whitespace cleanup
Jeff Hammel <jhammel@mozilla.com>
parents: 20
diff changeset
224 if join:
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
225 retval += '<br/>\n' + markup.a('join', href="%s" % join)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
226 retval = markup.div(retval)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
227 if wrap:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
228 title = 'login'
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
229 if self.site:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
230 pagetitle = '%s - %s' % (title, self.site)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
231 retval = markup.wrap(markup.h1(title.title()) + retval,
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
232 pagetitle=pagetitle)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
233
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
234 return retval
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
235
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
236 def login_post(self):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
237 """handle a login POST request"""
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
238 user = self.request.POST.get('username')
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
239 password = self.request.POST.get('password')
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
240 passwords = self.passwords()
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
241 error = False
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
242 if user not in passwords:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
243 error = True
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
244 else:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
245 error = not self.authfunc(self.request.environ, user, password)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
246 if error:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
247 return { 'Name': 'Wrong username or password' }
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
248 self.request.environ['REMOTE_USER'] = user
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
249 self.request.environ['paste.auth_tkt.set_user'](user)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
250
52
aabc968611bc STUB: bitsyauth/__init__.py
Jeff Hammel <k0scist@gmail.com>
parents: 45
diff changeset
251
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
252 ### join
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 def captcha_pre(self, word, key):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
255 """CAPTCHA with pre-formatted text"""
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
256 return skimpyAPI.Pre(word, scale=1.2).data()
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
257
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
258 def captcha_png(self, word, key):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
259 """CAPTCHA with a PNG image"""
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
260 return markup.image('/join/%s.png' % key)
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 def join_form(self):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
263 captcha = ''
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
264 if self.captcha:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
265 # data for CAPTCHA
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
266 key = random.Random().randint(0, sys.maxint)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
267 word = random_word()
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
268
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
269 self.keys[key] = word
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
270
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
271 captcha = StringIO()
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 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
274 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
275
19
aac4a4ea70a7 whitespace
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
276 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
277 markup.i(captcha_help)))
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
278
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
279 # determine type of CAPTCHA
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
280 captchas = ' '.join(self.request.GET.getall('captcha'))
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
281 if not captchas:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
282 captchas = 'pre'
19
aac4a4ea70a7 whitespace
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
283
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
284 captcha_funcs=dict(pre=self.captcha_pre,
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
285 image=self.captcha_png,)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
286 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
287 if i in captcha_funcs ]
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
288 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
289 print >> captcha, captchas
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
290 print >> captcha, markup.p(markup.input(None, **dict(name='captcha', type='text')))
19
aac4a4ea70a7 whitespace
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
291
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
292 captcha = captcha.getvalue()
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 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
295 form.add_element('textfield', 'Name')
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
296 form.add_password_confirmation()
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
297 form.add_element('hidden', 'key', value=str(key))
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
298 return form
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
299
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
300 def join(self, errors=None, wrap=False):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
301 """join div or page if wrap"""
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
302 form = self.join_form()
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
303 retval = markup.div(form(errors))
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
304 if wrap:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
305 pagetitle = title = 'join'
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
306 if self.site:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
307 pagetitle = '%s - %s' % (title, self.site)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
308 if self.captcha:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
309 errors = errors or {}
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
310 captcha_err = errors.get('CAPTCHA', '')
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
311 if captcha_err:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
312 captcha_err = markup.p(markup.em(captcha_err),
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
313 **{'class': 'error'})
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
314 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
315 pagetitle=pagetitle)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
316 return retval
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
317
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
318 def join_post(self):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
319 """handle a join POST request"""
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
320 form = self.join_form()
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
321 errors = form.validate(self.request.POST)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
322
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
323 # validate captcha
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
324 if CAPTCHA:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
325 key = self.request.POST.get('key')
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
326 try:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
327 key = int(key)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
328 except ValueError:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
329 key = None
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
330 if not key:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
331 errors['CAPTCHA'] = 'Please type the funky looking word'
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
332 word = self.keys.pop(key, None)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
333 if not word:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
334 errors['CAPTCHA'] = 'Please type the funky looking word'
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
335 if word != self.request.POST.get('captcha','').lower():
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
336 errors['CAPTCHA'] = 'Sorry, you typed the wrong word'
19
aac4a4ea70a7 whitespace
Jeff Hammel <jhammel@mozilla.com>
parents: 18
diff changeset
337
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
338 name = self.request.POST.get('Name', '')
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
339 if not name:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
340 if not errors.has_key('Name'):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
341 errors['Name'] = []
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
342 errors['Name'].append('Please enter a user name')
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
343 if name in self.passwords():
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
344 if not errors.has_key('Name'):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
345 errors['Name'] = []
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
346 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
347
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
348 if not errors: # create a new user
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
349 self.newuser(name,
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
350 self.hash(name, self.request.POST['Password']))
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
351 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
352 self.request.environ['paste.auth_tkt.set_user'](name)
18
814ed3208afa whitespace
Jeff Hammel <jhammel@mozilla.com>
parents: 17
diff changeset
353
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
354 return errors
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 class BitsyAuth(object):
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
357 """outer middleware for auth; does the cookie handling and wrapping"""
18
814ed3208afa whitespace
Jeff Hammel <jhammel@mozilla.com>
parents: 17
diff changeset
358
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
359 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
360 self.app = app
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
361 self.path = '/logout'
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
362 self.cookie = '__ac'
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
363 auth = BitsyAuthInnerWare(app, passwords=passwords, newuser=newuser, site=site)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
364 self.hash = auth.hash
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
365
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
366 # paste.auth.auth_tkt
9
73b2b5bccd52 * allow logout to pass through instead of failing
egj@socialplanning.org
parents: 8
diff changeset
367 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
368 auth, global_conf, secret,
73b2b5bccd52 * allow logout to pass through instead of failing
egj@socialplanning.org
parents: 8
diff changeset
369 cookie_name=self.cookie, logout_path='/logout')
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
370
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
371 def __call__(self, environ, start_response):
42
Jeff Hammel <jhammel@mozilla.com>
parents: 21
diff changeset
372
9
73b2b5bccd52 * allow logout to pass through instead of failing
egj@socialplanning.org
parents: 8
diff changeset
373 try:
73b2b5bccd52 * allow logout to pass through instead of failing
egj@socialplanning.org
parents: 8
diff changeset
374 return self.cookie_handler(environ, start_response)
15
431bd76aabb7 slightly less stupid exception handling
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
375 except auth_tkt.BadTicket:
431bd76aabb7 slightly less stupid exception handling
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
376 environ.pop('HTTP_COOKIE') # kill all cookies! bad! XXX
431bd76aabb7 slightly less stupid exception handling
Jeff Hammel <jhammel@mozilla.com>
parents: 9
diff changeset
377 return self.cookie_handler(environ, start_response)
9
73b2b5bccd52 * allow logout to pass through instead of failing
egj@socialplanning.org
parents: 8
diff changeset
378 return self.logout(environ, start_response)
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
379
9
73b2b5bccd52 * allow logout to pass through instead of failing
egj@socialplanning.org
parents: 8
diff changeset
380 def logout(self, environ, start_response):
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
381 req = Request(environ)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
382 keys = [ 'REMOTE_USER' ]
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
383 # 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
384 for key in keys:
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
385 req.environ.pop(key, None)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
386
43
Jeff Hammel <jhammel@mozilla.com>
parents: 42
diff changeset
387 # return response
0
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
388 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
389 res = Response(content_type='text/html', body=body)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
390 req.cookies.pop(self.cookie, None)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
391 res.delete_cookie(self.cookie)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
392 res.unset_cookie(self.cookie)
284621b3effd initial commit of bitsyauth, initially from bitsyblog
k0s <k0scist@gmail.com>
parents:
diff changeset
393 return res(environ, start_response)
17
d5f44b38826d whitespace
Jeff Hammel <jhammel@mozilla.com>
parents: 15
diff changeset
394