Changeset 134
- Timestamp:
- 11/06/07 00:35:39
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
AuthKit/trunk/authkit/authenticate/cookie.py
r118 r134 112 112 """ 113 113 114 def __init__(self, secret, userid, ip, tokens=(), user_data='', time=None, 115 cookie_name='authkit', cookie_params=None): 114 def __init__( 115 self, 116 secret, 117 userid, 118 ip, 119 tokens=(), 120 user_data='', 121 time=None, 122 cookie_name='authkit', 123 cookie_params=None, 124 nouserincookie=False, 125 ): 126 self.nouserincookie = nouserincookie 116 127 secure = False 117 128 if cookie_params is None: … … 142 153 143 154 def cookie_value(self): 144 v = '%s%08x%s!' % (self.digest(), int(self.time), self.userid) 155 if not self.nouserincookie: 156 v = '%s%08x%s!' % (self.digest(), int(self.time), self.userid) 157 else: 158 v = '%s%08x!' % (self.digest(), int(self.time)) 159 145 160 if self.tokens: 146 161 v += self.tokens + '!' … … 172 187 # are utility methods which you shouldn't need to use on their own. 173 188 174 def parse_ticket(secret, ticket, ip ):189 def parse_ticket(secret, ticket, ip, session): 175 190 """ 176 191 Parse the ticket, returning (timestamp, userid, tokens, user_data). … … 186 201 except ValueError, e: 187 202 raise BadTicket('Timestamp is not a hex integer: %s' % e) 188 try: 189 userid, data = ticket[40:].split('!', 1) 190 except ValueError: 191 raise BadTicket('userid is not followed by !') 203 204 if session is not None: 205 if not session.has_key('authkit.cookie.user'): 206 raise BadTicket('No authkit.cookie.user key exists in the session') 207 userid = session['authkit.cookie.user'] 208 data = ticket[40:] 209 else: 210 try: 211 userid, data = ticket[40:].split('!', 1) 212 except ValueError: 213 raise BadTicket('userid is not followed by !') 192 214 if '!' in data: 193 215 tokens, user_data = data.split('!', 1) … … 245 267 """ 246 268 247 def __init__(self, app, secret, name='authkit', params=None, 248 includeip=True, signoutpath=None, enforce=False, 249 ticket_class=AuthKitTicket): 269 def __init__(self, 270 app, 271 secret, 272 name='authkit', 273 params=None, 274 includeip=True, 275 signoutpath=None, 276 enforce=False, 277 ticket_class=AuthKitTicket, 278 nouserincookie=False, 279 session_middleware='beaker.session' 280 ): 250 281 log.debug("Setting up the cookie middleware") 251 282 secure = False 252 283 if params.has_key('secure') and asbool(params['secure']) == True: 253 284 secure = True 254 255 285 # secure not needed! 256 286 AuthTKTMiddleware.__init__(self, app, secret, cookie_name=name, … … 262 292 self.cookie_enforce = enforce 263 293 if self.cookie_enforce and not self.cookie_params.has_key('expires'): 264 raise Exception("Cannot enforce cookie expiration since no " 265 "cookie_params expires' has been set") 294 raise AuthKitConfigError( 295 "Cannot enforce cookie expiration since no " 296 "cookie_params expires' has been set" 297 ) 298 299 self.nouserincookie = nouserincookie 300 self.session_middleware = session_middleware 266 301 267 302 def __call__(self, environ, start_response): 303 session = None 304 if self.nouserincookie: 305 session = environ[self.session_middleware] 268 306 cookies = request.get_cookies(environ) 269 307 log.debug("These cookies were found: %s", cookies.keys()) … … 292 330 # 293 331 def bad_ticket_app(environ, start_response, msg=None): 332 # Remove the session username 333 if self.nouserincookie: 334 environ[self.session_middleware]['authkit.cookie.user'] = None 335 del environ[self.session_middleware]['authkit.cookie.user'] 336 environ[self.session_middleware].save() 337 294 338 headers = self.logout_user_cookie(environ) 295 339 headers.append(('Content-type','text/plain')) 296 start_response(' 401 Not authenticated', headers)340 start_response('200 OK', headers) 297 341 if not msg: 298 342 msg = 'Bad cookie, you have been signed out.\n If this' … … 305 349 remote_addr) 306 350 timestamp, userid, tokens, user_data = \ 307 parse_ticket(self.secret, cookie_value, remote_addr )351 parse_ticket(self.secret, cookie_value, remote_addr, session) 308 352 except BadTicket, e: 309 353 if e.expected: 310 log. error("BadTicket: %s Expected: %s", e, e.expected)354 log.debug("BadTicket: %s Expected: %s", e, e.expected) 311 355 else: 312 log. error("BadTicket: %s", e)356 log.debug("BadTicket: %s", e) 313 357 return bad_ticket_app(environ, start_response) 314 358 else: … … 373 417 tokens=tokens, user_data=user_data, 374 418 cookie_name=self.cookie_name, 375 cookie_params=self.cookie_params) 419 cookie_params=self.cookie_params, 420 nouserincookie=self.nouserincookie) 376 421 377 422 # @@: Should we set REMOTE_USER etc in the current … … 380 425 cookies = [(parts[0].strip(), ':'.join(parts[1:]).strip())] 381 426 log.debug(cookies) 427 if self.nouserincookie: 428 if self.cookie_name == environ[self.session_middleware].key: 429 raise AuthKitConfigError( 430 "The session cookie name %r is the same as the " 431 "AuthKit cookie name. Please change the session cookie " 432 "name."%( 433 environ[self.session_middleware].key 434 ) 435 ) 436 environ[self.session_middleware]['authkit.cookie.user'] = userid 437 environ[self.session_middleware].save() 382 438 return cookies 383 439 384 440 def logout_user_cookie(self, environ): 441 environ[self.session_middleware]['authkit.cookie.user'] = None 442 del environ[self.session_middleware]['authkit.cookie.user'] 443 environ[self.session_middleware].save() 385 444 domain = self.cookie_params.get('domain') 386 445 path = '/'
