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 GitHubUserView(django.views.generic.base.View):
15@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 GitHubUserTeamsView(django.views.generic.base.View):
 72@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)