Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Side by Side Diff: chromium-committers/auth_util.py

Issue 25515004: Add chromium-committers appengine app. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/
Patch Set: Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 # Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 """Utilities for generating and verifying user authentication."""
6
7 __author__ = 'agable@google.com (Aaron Gable)'
8
9
10 import functools
11 import logging
12
13 from google.appengine.api import users
14 from google.appengine.ext import ndb
15
16 import constants
17 import model
18
19
20 def CheckUserAuth(handler):
21 """Decorator for webapp2 request handler methods.
22
23 Only use on webapp2.RequestHandler methods (e.g. get, post, put).
24
25 Checks to see if the user is logged in, and if they are
26 * If they are an administrator of the app, or
27 * If their email appears in the list of allowed addresses
28
29 Sets request.authenticated to 'user' if successful. Otherwise, None.
30 """
31 @functools.wraps(handler)
32 def wrapper(self, *args, **kwargs):
33 """Does the real legwork and calls the wrapped handler."""
34 def abort_auth(log_msg):
35 """Helper method to be an exit hatch when authentication fails."""
36 logging.warning(log_msg)
37 self.request.authenticated = None
38 handler(self, *args, **kwargs)
39
40 def finish_auth(log_msg):
41 """Helper method to be an exit hatch when authentication succeeds."""
42 logging.info(log_msg)
43 self.request.authenticated = 'user'
44 handler(self, *args, **kwargs)
iannucci 2013/10/09 18:57:30 Should these return the value of handler (and we s
agable 2013/10/09 19:12:31 webapp2 doesn't require or even want handlers to r
45
46 if getattr(self.request, 'authenticated', None):
47 finish_auth('Already authenticated.')
48 return
iannucci 2013/10/09 18:57:30 I would just make the else: on here set authentica
agable 2013/10/09 19:12:31 Not sure I agree with this. I think the current st
49
50 user = users.get_current_user()
51 if not user:
52 abort_auth('No logged in user.')
53 return
54
55 if users.is_current_user_admin():
56 finish_auth('User is admin.')
57 return
58
59 email = user.email()
60 email_list = ndb.Key(model.EmailList, constants.LIST).get()
61 allowed_emails = email_list.emails if email_list else []
62
63 if email in allowed_emails:
64 finish_auth('User in allowed email list.')
65 return
66
67 if (email.endswith('@google.com') and
68 email.replace('@google.com', '@chromium.org') in allowed_emails):
69 finish_auth('User in allowed email list via google -> chromium map.')
iannucci 2013/10/09 18:57:30 :(... this is teh hax... Can we at least have this
agable 2013/10/09 19:12:31 I believe this is the best way to do this. Later w
70 return
71
72 abort_auth('User not in allowed email list.')
73
74 return wrapper
75
76
77 def RequireAuth(handler):
78 """Decorator for webapp2 request handler methods.
79
80 Only use on webapp2.RequestHandler methods (e.g. get, post, put),
81 and only after using a 'Check____Auth' decorator.
82
83 Expects the handler's self.request.authenticated to be not-None.
84 If it doesn't exist or evaluates to False, 403s. Otherwise, passes
85 control to the wrapped handler.
86 """
87 @functools.wraps(handler)
88 def wrapper(self, *args, **kwargs):
89 """Does the real legwork and calls the wrapped handler."""
90 if not getattr(self.request, 'authenticated', None):
iannucci 2013/10/09 18:57:30 either this should be checking is not None, or the
agable 2013/10/09 19:12:31 SG, will be done in patchset 6 (after you finish r
91 self.abort(403)
92 else:
93 handler(self, *args, **kwargs)
94
95 return wrapper
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698