grim/reviewboard_jetbrains_hub

Parents 40c4af8906a6
Children a8ca9429612b
Sync the users first and last names as well as email address if it's verified on login
--- a/rbjbhub/extension.py Tue Jun 16 00:27:11 2020 -0500
+++ b/rbjbhub/extension.py Tue Jun 16 22:09:20 2020 -0500
@@ -18,6 +18,49 @@
from reviewboard.extensions.hooks import AuthBackendHook
+def _update_user(user, token):
+ """ Updates a user according to what is set it hub. This is mostly to deal
+ with email changes, but they can also change their name and username so
+ this just updates everything.
+ """
+
+ siteconfig = SiteConfiguration.objects.get_current()
+
+ # look up the user in hub
+ base_url = siteconfig.get('auth_jetbrains_hub_url')
+ uri = os.path.join(base_url, 'api/rest/oauth2/userinfo')
+
+ headers = {
+ 'Authorization': 'Bearer ' + token
+ }
+
+ resp = requests.get(uri, headers=headers)
+ resp.raise_for_status()
+
+ hub_user = resp.json()
+
+ # we don't have a good way to split the username to a first name/last name,
+ # so we split on the first space and then treat the two parts as the first
+ # and last names.
+ name_parts = hub_user['name'].split(' ', 1)
+
+ # figure the users email address
+ email = hub_user.get('email', '')
+
+ # only set the users email address if it is verified. This is problematic
+ # when a user is anonymized, but we'll come back to that.
+ if hub_user.get('email_verified', False):
+ user.email = email
+
+ # now update the django user
+ user.first_name = name_parts[0]
+ user.last_name = len(name_parts) > 1 and name_parts[1] or ''
+
+ user.save()
+
+ return user
+
+
class JetBrainsHubSettingsForm(SiteSettingsForm):
""" JetBrains Hub Settings Form """
@@ -82,15 +125,18 @@
if resp.status_code != 200:
return None
- return self.get_or_create_user(username)
+ json = resp.json()
+ token = json.get('access_token', '')
- def get_or_create_user(self, username, request=None):
+ return self.get_or_create_user(username, token)
+
+ def get_or_create_user(self, username, token, request=None):
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
user = User.objects.create_user(username=username)
- return user
+ return _update_user(user, token)
class JetBrainsHubExtension(Extension):