authentik.providers.oauth2.views.github
authentik pretend GitHub Views
1"""authentik pretend GitHub Views""" 2 3from django.http import HttpRequest, HttpResponse, JsonResponse 4from django.utils.decorators import method_decorator 5from django.utils.text import slugify 6from django.views import View 7from django.views.decorators.csrf import csrf_exempt 8 9from authentik.common.oauth.constants import SCOPE_GITHUB_ORG_READ, SCOPE_GITHUB_USER_EMAIL 10from authentik.providers.oauth2.models import RefreshToken 11from authentik.providers.oauth2.utils import protected_resource_view 12 13 14@method_decorator(csrf_exempt, name="dispatch") 15@method_decorator(protected_resource_view([SCOPE_GITHUB_USER_EMAIL]), name="dispatch") 16class GitHubUserView(View): 17 """Emulate GitHub's /user API Endpoint""" 18 19 def get(self, request: HttpRequest, token: RefreshToken) -> HttpResponse: 20 """Emulate GitHub's /user API Endpoint""" 21 user = token.user 22 return JsonResponse( 23 { 24 "login": user.username, 25 "id": user.pk, 26 "node_id": "", 27 "avatar_url": "", 28 "gravatar_id": "", 29 "url": "", 30 "html_url": "", 31 "followers_url": "", 32 "following_url": "", 33 "gists_url": "", 34 "starred_url": "", 35 "subscriptions_url": "", 36 "organizations_url": "", 37 "repos_url": "", 38 "events_url": "", 39 "received_events_url": "", 40 "type": "User", 41 "site_admin": False, 42 "name": user.name, 43 "company": "", 44 "blog": "", 45 "location": "", 46 "email": user.email, 47 "hireable": False, 48 "bio": "", 49 "public_repos": 0, 50 "public_gists": 0, 51 "followers": 0, 52 "following": 0, 53 "created_at": user.date_joined, 54 "updated_at": user.date_joined, 55 "private_gists": 0, 56 "total_private_repos": 0, 57 "owned_private_repos": 0, 58 "disk_usage": 0, 59 "collaborators": 0, 60 "two_factor_authentication": True, 61 "plan": { 62 "name": "None", 63 "space": 0, 64 "private_repos": 0, 65 "collaborators": 0, 66 }, 67 } 68 ) 69 70 71@method_decorator(csrf_exempt, name="dispatch") 72@method_decorator(protected_resource_view([SCOPE_GITHUB_ORG_READ]), name="dispatch") 73class GitHubUserTeamsView(View): 74 """Emulate GitHub's /user/teams API Endpoint""" 75 76 def get(self, request: HttpRequest, token: RefreshToken) -> HttpResponse: 77 """Emulate GitHub's /user/teams API Endpoint""" 78 user = token.user 79 80 orgs_response = [] 81 for org in user.groups.all(): 82 _org = { 83 "id": org.num_pk, 84 "node_id": "", 85 "url": "", 86 "html_url": "", 87 "name": org.name, 88 "slug": slugify(org.name), 89 "description": "", 90 "privacy": "", 91 "permission": "", 92 "members_url": "", 93 "repositories_url": "", 94 "parent": None, 95 "members_count": 0, 96 "repos_count": 0, 97 "created_at": "", 98 "updated_at": "", 99 "organization": { 100 "login": slugify(request.brand.branding_title), 101 "id": 1, 102 "node_id": "", 103 "url": "", 104 "repos_url": "", 105 "events_url": "", 106 "hooks_url": "", 107 "issues_url": "", 108 "members_url": "", 109 "public_members_url": "", 110 "avatar_url": "", 111 "description": "", 112 "name": request.brand.branding_title, 113 "company": "", 114 "blog": "", 115 "location": "", 116 "email": "", 117 "is_verified": True, 118 "has_organization_projects": True, 119 "has_repository_projects": True, 120 "public_repos": 0, 121 "public_gists": 0, 122 "followers": 0, 123 "following": 0, 124 "html_url": "", 125 "created_at": "", 126 "updated_at": "", 127 "type": "Organization", 128 }, 129 } 130 orgs_response.append(_org) 131 return JsonResponse(orgs_response, safe=False)
@method_decorator(csrf_exempt, name='dispatch')
@method_decorator(protected_resource_view([SCOPE_GITHUB_USER_EMAIL]), name='dispatch')
class
GitHubUserView15@method_decorator(csrf_exempt, name="dispatch") 16@method_decorator(protected_resource_view([SCOPE_GITHUB_USER_EMAIL]), name="dispatch") 17class GitHubUserView(View): 18 """Emulate GitHub's /user API Endpoint""" 19 20 def get(self, request: HttpRequest, token: RefreshToken) -> HttpResponse: 21 """Emulate GitHub's /user API Endpoint""" 22 user = token.user 23 return JsonResponse( 24 { 25 "login": user.username, 26 "id": user.pk, 27 "node_id": "", 28 "avatar_url": "", 29 "gravatar_id": "", 30 "url": "", 31 "html_url": "", 32 "followers_url": "", 33 "following_url": "", 34 "gists_url": "", 35 "starred_url": "", 36 "subscriptions_url": "", 37 "organizations_url": "", 38 "repos_url": "", 39 "events_url": "", 40 "received_events_url": "", 41 "type": "User", 42 "site_admin": False, 43 "name": user.name, 44 "company": "", 45 "blog": "", 46 "location": "", 47 "email": user.email, 48 "hireable": False, 49 "bio": "", 50 "public_repos": 0, 51 "public_gists": 0, 52 "followers": 0, 53 "following": 0, 54 "created_at": user.date_joined, 55 "updated_at": user.date_joined, 56 "private_gists": 0, 57 "total_private_repos": 0, 58 "owned_private_repos": 0, 59 "disk_usage": 0, 60 "collaborators": 0, 61 "two_factor_authentication": True, 62 "plan": { 63 "name": "None", 64 "space": 0, 65 "private_repos": 0, 66 "collaborators": 0, 67 }, 68 } 69 )
Emulate GitHub's /user API Endpoint
def
get( self, request: django.http.request.HttpRequest, token: authentik.providers.oauth2.models.RefreshToken) -> django.http.response.HttpResponse:
20 def get(self, request: HttpRequest, token: RefreshToken) -> HttpResponse: 21 """Emulate GitHub's /user API Endpoint""" 22 user = token.user 23 return JsonResponse( 24 { 25 "login": user.username, 26 "id": user.pk, 27 "node_id": "", 28 "avatar_url": "", 29 "gravatar_id": "", 30 "url": "", 31 "html_url": "", 32 "followers_url": "", 33 "following_url": "", 34 "gists_url": "", 35 "starred_url": "", 36 "subscriptions_url": "", 37 "organizations_url": "", 38 "repos_url": "", 39 "events_url": "", 40 "received_events_url": "", 41 "type": "User", 42 "site_admin": False, 43 "name": user.name, 44 "company": "", 45 "blog": "", 46 "location": "", 47 "email": user.email, 48 "hireable": False, 49 "bio": "", 50 "public_repos": 0, 51 "public_gists": 0, 52 "followers": 0, 53 "following": 0, 54 "created_at": user.date_joined, 55 "updated_at": user.date_joined, 56 "private_gists": 0, 57 "total_private_repos": 0, 58 "owned_private_repos": 0, 59 "disk_usage": 0, 60 "collaborators": 0, 61 "two_factor_authentication": True, 62 "plan": { 63 "name": "None", 64 "space": 0, 65 "private_repos": 0, 66 "collaborators": 0, 67 }, 68 } 69 )
Emulate GitHub's /user API Endpoint
def
dispatch(self, request, *args, **kwargs):
135 def dispatch(self, request, *args, **kwargs): 136 # Try to dispatch to the right method; if a method doesn't exist, 137 # defer to the error handler. Also defer to the error handler if the 138 # request method isn't on the approved list. 139 if request.method.lower() in self.http_method_names: 140 handler = getattr( 141 self, request.method.lower(), self.http_method_not_allowed 142 ) 143 else: 144 handler = self.http_method_not_allowed 145 return handler(request, *args, **kwargs)
@method_decorator(csrf_exempt, name='dispatch')
@method_decorator(protected_resource_view([SCOPE_GITHUB_ORG_READ]), name='dispatch')
class
GitHubUserTeamsView72@method_decorator(csrf_exempt, name="dispatch") 73@method_decorator(protected_resource_view([SCOPE_GITHUB_ORG_READ]), name="dispatch") 74class GitHubUserTeamsView(View): 75 """Emulate GitHub's /user/teams API Endpoint""" 76 77 def get(self, request: HttpRequest, token: RefreshToken) -> HttpResponse: 78 """Emulate GitHub's /user/teams API Endpoint""" 79 user = token.user 80 81 orgs_response = [] 82 for org in user.groups.all(): 83 _org = { 84 "id": org.num_pk, 85 "node_id": "", 86 "url": "", 87 "html_url": "", 88 "name": org.name, 89 "slug": slugify(org.name), 90 "description": "", 91 "privacy": "", 92 "permission": "", 93 "members_url": "", 94 "repositories_url": "", 95 "parent": None, 96 "members_count": 0, 97 "repos_count": 0, 98 "created_at": "", 99 "updated_at": "", 100 "organization": { 101 "login": slugify(request.brand.branding_title), 102 "id": 1, 103 "node_id": "", 104 "url": "", 105 "repos_url": "", 106 "events_url": "", 107 "hooks_url": "", 108 "issues_url": "", 109 "members_url": "", 110 "public_members_url": "", 111 "avatar_url": "", 112 "description": "", 113 "name": request.brand.branding_title, 114 "company": "", 115 "blog": "", 116 "location": "", 117 "email": "", 118 "is_verified": True, 119 "has_organization_projects": True, 120 "has_repository_projects": True, 121 "public_repos": 0, 122 "public_gists": 0, 123 "followers": 0, 124 "following": 0, 125 "html_url": "", 126 "created_at": "", 127 "updated_at": "", 128 "type": "Organization", 129 }, 130 } 131 orgs_response.append(_org) 132 return JsonResponse(orgs_response, safe=False)
Emulate GitHub's /user/teams API Endpoint
def
get( self, request: django.http.request.HttpRequest, token: authentik.providers.oauth2.models.RefreshToken) -> django.http.response.HttpResponse:
77 def get(self, request: HttpRequest, token: RefreshToken) -> HttpResponse: 78 """Emulate GitHub's /user/teams API Endpoint""" 79 user = token.user 80 81 orgs_response = [] 82 for org in user.groups.all(): 83 _org = { 84 "id": org.num_pk, 85 "node_id": "", 86 "url": "", 87 "html_url": "", 88 "name": org.name, 89 "slug": slugify(org.name), 90 "description": "", 91 "privacy": "", 92 "permission": "", 93 "members_url": "", 94 "repositories_url": "", 95 "parent": None, 96 "members_count": 0, 97 "repos_count": 0, 98 "created_at": "", 99 "updated_at": "", 100 "organization": { 101 "login": slugify(request.brand.branding_title), 102 "id": 1, 103 "node_id": "", 104 "url": "", 105 "repos_url": "", 106 "events_url": "", 107 "hooks_url": "", 108 "issues_url": "", 109 "members_url": "", 110 "public_members_url": "", 111 "avatar_url": "", 112 "description": "", 113 "name": request.brand.branding_title, 114 "company": "", 115 "blog": "", 116 "location": "", 117 "email": "", 118 "is_verified": True, 119 "has_organization_projects": True, 120 "has_repository_projects": True, 121 "public_repos": 0, 122 "public_gists": 0, 123 "followers": 0, 124 "following": 0, 125 "html_url": "", 126 "created_at": "", 127 "updated_at": "", 128 "type": "Organization", 129 }, 130 } 131 orgs_response.append(_org) 132 return JsonResponse(orgs_response, safe=False)
Emulate GitHub's /user/teams API Endpoint
def
dispatch(self, request, *args, **kwargs):
135 def dispatch(self, request, *args, **kwargs): 136 # Try to dispatch to the right method; if a method doesn't exist, 137 # defer to the error handler. Also defer to the error handler if the 138 # request method isn't on the approved list. 139 if request.method.lower() in self.http_method_names: 140 handler = getattr( 141 self, request.method.lower(), self.http_method_not_allowed 142 ) 143 else: 144 handler = self.http_method_not_allowed 145 return handler(request, *args, **kwargs)