add passbook.pretend to use passbook in applications which don't support generic OAuth
This commit is contained in:
parent
750117b0fd
commit
39d9fe9bf0
|
@ -74,6 +74,7 @@ INSTALLED_APPS = [
|
||||||
'passbook.otp.apps.PassbookOTPConfig',
|
'passbook.otp.apps.PassbookOTPConfig',
|
||||||
'passbook.captcha_factor.apps.PassbookCaptchaFactorConfig',
|
'passbook.captcha_factor.apps.PassbookCaptchaFactorConfig',
|
||||||
'passbook.hibp_policy.apps.PassbookHIBPConfig',
|
'passbook.hibp_policy.apps.PassbookHIBPConfig',
|
||||||
|
'passbook.pretend.apps.PassbookPretendConfig',
|
||||||
]
|
]
|
||||||
|
|
||||||
# Message Tag fix for bootstrap CSS Classes
|
# Message Tag fix for bootstrap CSS Classes
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
"""passbook access helper classes"""
|
"""passbook access helper classes"""
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
|
|
||||||
from django.http import Http404
|
from django.contrib import messages
|
||||||
|
from django.utils.translation import gettext as _
|
||||||
|
|
||||||
from passbook.core.models import Application
|
from passbook.core.models import Application
|
||||||
|
|
||||||
|
@ -11,14 +12,18 @@ class AccessMixin:
|
||||||
"""Mixin class for usage in Authorization views.
|
"""Mixin class for usage in Authorization views.
|
||||||
Provider functions to check application access, etc"""
|
Provider functions to check application access, etc"""
|
||||||
|
|
||||||
|
# request is set by view but since this Mixin has no base class
|
||||||
|
request = None
|
||||||
|
|
||||||
def provider_to_application(self, provider):
|
def provider_to_application(self, provider):
|
||||||
"""Lookup application assigned to provider, throw error if no application assigned"""
|
"""Lookup application assigned to provider, throw error if no application assigned"""
|
||||||
try:
|
try:
|
||||||
return provider.application
|
return provider.application
|
||||||
except Application.DoesNotExist as exc:
|
except Application.DoesNotExist as exc:
|
||||||
# TODO: Log that no provider has no application assigned
|
messages.error(self.request, _('Provider "%(name)s" has no application assigned' % {
|
||||||
LOGGER.warning('Provider "%s" has no application assigned...', provider)
|
'name': provider
|
||||||
raise Http404 from exc
|
}))
|
||||||
|
raise exc
|
||||||
|
|
||||||
def user_has_access(self, application, user):
|
def user_has_access(self, application, user):
|
||||||
"""Check if user has access to application."""
|
"""Check if user has access to application."""
|
||||||
|
|
|
@ -22,6 +22,8 @@ OAUTH2_PROVIDER = {
|
||||||
'SCOPES': {
|
'SCOPES': {
|
||||||
'openid:userinfo': 'Access OpenID Userinfo',
|
'openid:userinfo': 'Access OpenID Userinfo',
|
||||||
# 'write': 'Write scope',
|
# 'write': 'Write scope',
|
||||||
# 'groups': 'Access to your groups'
|
# 'groups': 'Access to your groups',
|
||||||
|
'user:email': 'GitHub Compatibility: User E-Mail',
|
||||||
|
'read:org': 'GitHub Compatibility: User Groups',
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,11 @@
|
||||||
|
"""passbook pretend config"""
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class PassbookPretendConfig(AppConfig):
|
||||||
|
"""passbook pretend config"""
|
||||||
|
|
||||||
|
name = 'passbook.pretend'
|
||||||
|
label = 'passbook_pretend'
|
||||||
|
verbose_name = 'passbook Pretender'
|
||||||
|
mountpoint = ''
|
|
@ -0,0 +1,16 @@
|
||||||
|
"""passbook pretend urls"""
|
||||||
|
from django.urls import include, path
|
||||||
|
from oauth2_provider.views import TokenView
|
||||||
|
|
||||||
|
from passbook.oauth_provider.views.oauth2 import PassbookAuthorizationView
|
||||||
|
from passbook.pretend.views.github import GitHubUserView
|
||||||
|
|
||||||
|
github_urlpatterns = [
|
||||||
|
path('login/oauth/authorize', PassbookAuthorizationView.as_view(), name='github-authorize'),
|
||||||
|
path('login/oauth/access_token', TokenView.as_view(), name='github-access-token'),
|
||||||
|
path('user', GitHubUserView.as_view(), name='github-user'),
|
||||||
|
]
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('', include(github_urlpatterns))
|
||||||
|
]
|
|
@ -0,0 +1,55 @@
|
||||||
|
"""passbook pretend GitHub Views"""
|
||||||
|
from django.http import JsonResponse
|
||||||
|
from django.views import View
|
||||||
|
|
||||||
|
|
||||||
|
class GitHubUserView(View):
|
||||||
|
"""Emulate GitHub's /user API Endpoint"""
|
||||||
|
|
||||||
|
def get(self, request):
|
||||||
|
"""Emulate GitHub's /user API Endpoint"""
|
||||||
|
return JsonResponse({
|
||||||
|
"login": request.user.username,
|
||||||
|
"id": request.user.pk,
|
||||||
|
"node_id": "",
|
||||||
|
"avatar_url": "",
|
||||||
|
"gravatar_id": "",
|
||||||
|
"url": "",
|
||||||
|
"html_url": "",
|
||||||
|
"followers_url": "",
|
||||||
|
"following_url": "",
|
||||||
|
"gists_url": "",
|
||||||
|
"starred_url": "",
|
||||||
|
"subscriptions_url": "",
|
||||||
|
"organizations_url": "",
|
||||||
|
"repos_url": "",
|
||||||
|
"events_url": "",
|
||||||
|
"received_events_url": "",
|
||||||
|
"type": "User",
|
||||||
|
"site_admin": False,
|
||||||
|
"name": "%s %s" % (request.user.first_name, request.user.last_name),
|
||||||
|
"company": "",
|
||||||
|
"blog": "",
|
||||||
|
"location": "",
|
||||||
|
"email": request.user.email,
|
||||||
|
"hireable": False,
|
||||||
|
"bio": "",
|
||||||
|
"public_repos": 0,
|
||||||
|
"public_gists": 0,
|
||||||
|
"followers": 0,
|
||||||
|
"following": 0,
|
||||||
|
"created_at": request.user.date_joined,
|
||||||
|
"updated_at": request.user.date_joined,
|
||||||
|
"private_gists": 0,
|
||||||
|
"total_private_repos": 0,
|
||||||
|
"owned_private_repos": 0,
|
||||||
|
"disk_usage": 0,
|
||||||
|
"collaborators": 0,
|
||||||
|
"two_factor_authentication": True,
|
||||||
|
"plan": {
|
||||||
|
"name": "None",
|
||||||
|
"space": 0,
|
||||||
|
"private_repos": 0,
|
||||||
|
"collaborators": 0
|
||||||
|
}
|
||||||
|
})
|
Reference in New Issue