Commit Graph

55 Commits

Author SHA1 Message Date
a104117618 Added pillar.auth.cors.allow() decorator
Use this decorator on Flask endpoints that should respond with CORS
headers. These headers are sent in a reply when the browser sends an
`Origin` request header; for more info see [1].

This commit rolls back the previous commit (0ee1d0d3), as this new
approach with a separate decorator is both easier to use and less
error-prone.

[1] https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
2019-03-19 10:55:15 +01:00
b4ee5b59bd Sync Blender ID badge as soon as user logs in
This adds a new Blinker signal `user_logged_in` that is only sent when
the user logs in via the web interface (and not on every token
authentication and every API call).
2018-10-10 16:54:58 +02:00
314ce40e71 Send logged-in user in user_authenticated signal 2018-10-10 15:30:35 +02:00
40933d51cf Show badges to users in their profile settings 2018-09-12 15:02:19 +02:00
0983474e76 Store Blender ID OAuth scopes in MongoDB + request badge scope too
This also changes the way we treat Blender ID tokens. Before, the Blender ID
token was discarded and a random token was generated & stored. Now the
actual Blender ID token is stored.

The Facebook and Google OAuth code still uses the old approach of generating
a new token. Not sure what the added value is, though, because once the
Django session is gone there is nothing left to authenticate the user and
thus the random token is useless anyway.
2018-09-12 15:02:19 +02:00
1401a6168f Always use urljoin to construct Blender ID URLs 2018-09-12 15:02:19 +02:00
534d06ca8f Include video progress data in UserClass
See src/templates/nodes/custom/group/view_embed.pug for a crude example.
2018-09-11 14:06:45 +02:00
791906521f Added a test context manager to log in when doing Flask test client requests 2018-08-30 18:27:55 +02:00
2c40665271 Use urljoin() to compose OAuth URLs instead of string concatenation
String concatenation is bound to mess up; in this case it was producing
double slashes instead of single ones when `BLENDER_ID_ENDPOINT` ends in
a slash. Since URLs generally end in a slash, this should be supported.
2018-08-29 14:17:17 +02:00
9ee7b742ab Make more consistent use of BLENDER_ID_ENDPOINT
Now BLENDER_ID_ENDPOINT is used for the Blender ID OAuth config,
and it's directly accessed when building requests for Blender ID token
validation (without using utility functions).
2018-06-22 19:38:27 +02:00
854bc7cfaf Sentry: include extra user information
We perform authentication of the user while handling the request,
but Sentry calls get_user_info() in a before-request handler. This means
that Sentry would miss user info in many cases. This fixes that.
2018-02-14 13:52:52 +01:00
fd3e795824 Store IP-based org-given roles in the user document.
This is a two-stage approach that happens when a new token is verified
with Blender ID and stored in our local MongoDB:

  - Given the remote IP address of the HTTP request, compute and store the
    org roles in the token document.
  - Recompute the user's roles based on their own roles, regular org roles,
    and the roles stored in non-expired token documents.

This happens once per hour, since that's how long we store tokens in our
database.
2018-01-25 14:01:28 +01:00
05ad824dcb Allow UserClass instantiation without database ID
This allows us to inspect the capabilities that would be given to a user,
without actually creating the user in the database first.
2017-12-20 13:34:11 +01:00
2bcc26860f Removed 'subscriber' cap from 'admin' role
This allows admins to test what happens when users do not have a
subscription. To give the user subscriber capability, just grant demo role
as well.
2017-12-06 12:09:21 +01:00
49a6a6a758 Delete the auth token when logging out.
Before this, authentication tokens were kept in the database, even when
someone logged out. This is unwanted behaviour, as logging in will create
yet another token anyway there is no reason to keep the token around.
2017-11-17 12:10:21 +01:00
d651791f22 Set remember=True on login_user to persist login sessions
Before this, after closing the browser a user had to login again.
2017-11-07 23:18:46 +01:00
d9c3705c47 Fix tuples in existing session['blender_id_oauth_token']
In a past version of Pillar we accidentally stored tuples in the session.
Such sessions should be actively fixed.
2017-10-17 12:40:33 +02:00
88ffd64706 get_blender_id_oauth_token() now consistently returns a str
Before it could return either of str, tuple, or None.
2017-10-17 12:16:56 +02:00
a897282400 Added some type checks before assigning to session['blender_id_oauth_token']
There were some sporadic TypeErrors where the session var was set to a
tuple instead of a string; this is a way to figure out where that happens.
2017-10-17 12:16:20 +02:00
896784a351 Clear session when token is invalid
Before this, the user's authentication token would still be stored in
the session even when it's found to be invalid. This caused a login
action to fail, but not in such a way that we would redirect to the login
page of Blender ID. Rather, it would keep you not logged in. By clearing
the session we're sure that the invalid token is forgotten, and the next
request will handle the login properly.
2017-09-13 15:23:38 +02:00
3a3b3c3269 Revert "Replaced config SCHEME with Flask's own PREFERRED_URL_SCHEME setting."
This reverts commit 8318d4b1f6.
2017-09-01 16:19:58 +02:00
8318d4b1f6 Replaced config SCHEME with Flask's own PREFERRED_URL_SCHEME setting.
This prevents us from explicitly passing SCHEME to url_for() calls.

NOTE: this possibly requires an update to your config_local.py
2017-08-31 14:37:35 +02:00
d6dd0d69d0 Fix for missing underscore in _scheme arg
Be more careful next time!
2017-08-31 14:32:39 +02:00
2d3b54b80b Use app config SCHEME to enforce https when doing oauth redirects 2017-08-31 14:22:07 +02:00
62542f0329 Rolled back some flask_login and g.current_user integration
Setting flask_login.current_user ourselves was a bad idea, and messed up
flask_login's internal administration. Our code now just manages
g.current_user in these specific instances, which works fine.
2017-08-30 12:39:46 +02:00
6825b8bf74 Fixed infinite recursion. 2017-08-29 12:31:52 +02:00
bdd603fb17 Using new UserClass instances everywhere:
- No more direct access to g.current_user, unless unavoidable.
  - Using pillar.auth.current_user instead of g.current_user or
    flask_login.current_user.
  - p.a.current_user is never checked against None.
  - p.a.current_user.is_authenticated or is_anonymous is used, and never
    together with a negation (instead of 'not is_anon' use 'is_auth').
  - No more accessing current_user a a dict.
  - No more checks for admin role, use capability check instead.
2017-08-29 11:34:48 +02:00
c7c867f1c7 OAuth signin: streamlined instantiation of OAuthSignIn subclasses 2017-08-25 12:35:08 +02:00
a12838032f Introducing exception handling in the application code 2017-08-25 11:47:40 +02:00
41a82c44c5 Tests for providers callbacks
Also added SERVER_NAME in config_testing and pre-populated the  keys of OAUTH_CREDENTIALS, since the implementation of providers is part of the application.
2017-08-25 10:55:35 +02:00
cecf81a07d Initial tests for OAuthSignIn 2017-08-25 10:55:35 +02:00
45275c3831 Switch to class-based OAuthUserResponse
Instead of returning an arbirary number of items, we provide a standardized and better documented response.
2017-08-25 10:55:35 +02:00
6b3e523036 Remove Flask-OAuthlib and oauth_blender_id from Pillar
We switch completely to a rauth-based approach, allowing multiple providers for authentication.
2017-08-25 10:53:22 +02:00
23b856b073 Move Blender ID to extensible OAuth
Also, added support for Google OAuth.
2017-08-25 10:51:45 +02:00
c827dc4ed2 Initial work to support multiple OAuth clients 2017-08-25 10:51:45 +02:00
d48a308cc6 Renamed pillar.auth.current_web_user to pillar.auth.current_user
This is an in-between change. In the future, we want to always set
g.current_user so that it's never None (but rather an AnonymousUser
instance). However, there is still some code that assumes that when
g.current_user is not None the user is logged in. This should be
addressed first.
2017-08-24 14:28:18 +02:00
b9ae4396e5 Orgs: show "My Organizations" in the user's menu
This is shown only when the user is member of or administrator for one or
more organizations, otherwise it's hidden.
2017-08-24 14:28:18 +02:00
2b09711eb0 Load user capabilities from Pillar config and allow extensions to extend.
Default caps can be overridden using the USER_CAPABILITIES name in
config_local.py. These can be extended by Pillar Extensions.
2017-08-22 11:31:17 +02:00
566f2a4835 Late-initialise CLI user & late-import UserClass class
This may fix some unit tests issues.
2017-08-22 09:41:38 +02:00
575a7ed1a7 Introduced role-based capability system.
It's still rather limited and hard-coded, but it works.
2017-08-18 14:47:42 +02:00
566a23d3b6 Unified user representation for web and API calls
Both approaches now use a pillar.auth.UserClass instance. g.current_user
is now always set to that instance, even for web entry points.

This UserClass instance can still be keyed like the old dict, but this is
for temporary compatibility and shouldn't be relied on in new or touched
code.
2017-08-18 13:19:34 +02:00
bd13d89817 Added permission check to DELETE of nodes. 2017-07-13 17:29:46 +02:00
9a10c86329 Added pillar.auth.current_web_user to easily get the current UserClass. 2017-05-12 13:55:55 +02:00
fdb9154b85 Allow login_user() to load the user from the database
This makes it easier to properly log someone in from a unit test.
2017-05-12 13:55:55 +02:00
2703617179 Added 'groups' property to UserClass
This property was created by _load_user(), but never had a default
value set in UserClass.__init__().
2017-05-12 13:55:55 +02:00
9f752e2584 Made AnonymousUser a subclass of UserClass 2017-05-12 13:55:55 +02:00
82437724cc Added some type annotation
The web layer uses string IDs, whereas the API layer uses ObjectIDs.
Those annotations make it a bit more explicit what is used where.
2017-05-12 13:55:55 +02:00
080d98f57c Removed unused imports 2017-05-12 13:55:55 +02:00
870800e8d2 Stop flashing 'Please log in to access this page.'
This message was "flashed" (http://flask.pocoo.org/docs/0.12/patterns/flashing/)
by Flask-Login. This happens on every unauthorised request, so also on
AJAX requests (like for the notifications). As a result, a user could be
spammed by a screen full of these messages if they left their window open
and their session timed out.
2017-05-05 10:40:08 +02:00
379d40837b Fixed issues logging in.
The API call to /api/bcloud/update-subscription is now performed via the
SDK, to ensure proper authentication. Also streamlined some other code.
2017-05-05 10:29:16 +02:00