grim/reviewboard_jetbrains_hub

Parents
Children b24d1d786a19
Initial revision. Logins works, but we neet set the profile details yet
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/rbjbhub/extension.py Tue Jun 16 00:27:11 2020 -0500
@@ -0,0 +1,103 @@
+from __future__ import unicode_literals
+
+import os.path
+
+from django import forms
+from django.contrib.auth.models import User
+from django.utils.translation import ugettext_lazy as _
+
+from djblets.siteconfig.forms import SiteSettingsForm
+from djblets.siteconfig.models import SiteConfiguration
+
+import requests
+
+from requests.auth import HTTPBasicAuth
+
+from reviewboard.accounts.backends import AuthBackend
+from reviewboard.extensions.base import Extension
+from reviewboard.extensions.hooks import AuthBackendHook
+
+
+class JetBrainsHubSettingsForm(SiteSettingsForm):
+ """ JetBrains Hub Settings Form """
+
+ auth_jetbrains_hub_url = forms.CharField(
+ label=_('JetBrains Hub instance URL'),
+ help_text=_('The URL of your JetBrains Hub instance.'),
+ required=True,
+ widget=forms.TextInput(attrs={'size': '40'}),
+ )
+
+ auth_jetbrains_hub_client_id = forms.CharField(
+ label=_('Client ID'),
+ help_text=_('The client ID for the JetBrains Hub Service'),
+ required=True,
+ widget=forms.TextInput(attrs={'size': '40'}),
+ )
+
+ auth_jetbrains_hub_client_secret = forms.CharField(
+ label=_('Client Secret'),
+ help_text=_('The client secret for the JetBrains Hub Service'),
+ required=True,
+ widget=forms.PasswordInput(render_value=True, attrs={'size': '40'}),
+ )
+
+ auth_jetbrains_hub_scopes = forms.CharField(
+ label=_('Scopes'),
+ help_text=_('A space separated list scopes that you are requesting '
+ 'from the issuer.'),
+ required=True,
+ widget=forms.TextInput(attrs={'size': '40'}),
+ )
+
+
+class JetBrainsHubAuthBackend(AuthBackend):
+ backend_id = 'grim-jbhub'
+ name = _('JetBrains Hub')
+ settings_form = JetBrainsHubSettingsForm
+
+ def authenticate(self, username, password, **kwargs):
+ siteconfig = SiteConfiguration.objects.get_current()
+
+ username = username.strip()
+
+ data = {
+ 'grant_type': 'password',
+ 'scope': siteconfig.get('auth_jetbrains_hub_scopes'),
+ 'username': username,
+ 'password': password,
+ }
+
+ uri = os.path.join(
+ siteconfig.get('auth_jetbrains_hub_url'),
+ 'api/rest/oauth2/token',
+ )
+
+ auth = HTTPBasicAuth(
+ siteconfig.get('auth_jetbrains_hub_client_id'),
+ siteconfig.get('auth_jetbrains_hub_client_secret'),
+ )
+
+ resp = requests.post(uri, auth=auth, data=data)
+ if resp.status_code != 200:
+ return None
+
+ return self.get_or_create_user(username)
+
+ def get_or_create_user(self, username, request=None):
+ try:
+ user = User.objects.get(username=username)
+ except User.DoesNotExist:
+ user = User.objects.create_user(username=username)
+
+ return user
+
+
+class JetBrainsHubExtension(Extension):
+ metadata = {
+ 'Name': _('JetBrains Hub Authentication'),
+ 'Summary': _('Support for JetBrains Hub'),
+ }
+
+ def initialize(self):
+ AuthBackendHook(self, JetBrainsHubAuthBackend)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/setup.py Tue Jun 16 00:27:11 2020 -0500
@@ -0,0 +1,32 @@
+#!/usr/bin/env python
+
+from __future__ import unicode_literals
+
+from reviewboard.extensions.packaging import setup
+from setuptools import find_packages
+
+
+setup(
+ name='rbjbhub',
+ version='0.0.1',
+ author='Gary Kramlich',
+ author_email='grim@reaperworld.com',
+ url='https://keep.imfreedom.org/grim/reviewboard_jetbrains_hub',
+ description='JetBrains Hub Support for ReviewBoard',
+ packages=find_packages(),
+ install_requires=['requests'],
+ entry_points={
+ 'reviewboard.extensions': [
+ 'jbhub = rbjbhub.extension:JetBrainsHubExtension',
+ ],
+ },
+ license='GPLv2',
+ classifiers=[
+ 'Development Status :: 3 - Alpha',
+ 'Environment :: Web Framework',
+ 'Framework :: Review Board',
+ 'Operating System :: OS Independent',
+ 'Programming Language :: Python',
+ 'License :: OSI Approved :: GNU General Public License v2 (GPLv2)',
+ ],
+)