friendship ended with social-app. php is my new best friend
1<?php
2/**
3 * Class Gitea
4 *
5 * @created 08.04.2024
6 * @author smiley <smiley@chillerlan.net>
7 * @copyright 2024 smiley
8 * @license MIT
9 *
10 * @noinspection PhpUnused
11 */
12declare(strict_types=1);
13
14namespace chillerlan\OAuth\Providers;
15
16use chillerlan\OAuth\Core\{AuthenticatedUser, CSRFToken, OAuth2Provider, PKCE, PKCETrait, TokenRefresh, UserInfo};
17use function sprintf;
18
19/**
20 * Gitea OAuth2
21 *
22 * @link https://docs.gitea.com/development/oauth2-provider
23 */
24class Gitea extends OAuth2Provider implements CSRFToken, PKCE, TokenRefresh, UserInfo{
25 use PKCETrait;
26
27 public const IDENTIFIER = 'GITEA';
28
29 public const SCOPE_ACTIVITYPUB = 'activitypub';
30 public const SCOPE_ACTIVITYPUB_READ = 'read:activitypub';
31 public const SCOPE_ACTIVITYPUB_WRITE = 'write:activitypub';
32 public const SCOPE_ADMIN = 'admin';
33 public const SCOPE_ADMIN_READ = 'read:admin';
34 public const SCOPE_ADMIN_WRITE = 'write:admin';
35 public const SCOPE_ISSUE = 'issue';
36 public const SCOPE_ISSUE_READ = 'read:issue';
37 public const SCOPE_ISSUE_WRITE = 'write:issue';
38# public const SCOPE_MISC = 'misc';
39# public const SCOPE_MISC_READ = 'read:misc';
40# public const SCOPE_MISC_WRITE = 'write:misc';
41 public const SCOPE_NOTIFICATION = 'notification';
42 public const SCOPE_NOTIFICATION_READ = 'read:notification';
43 public const SCOPE_NOTIFICATION_WRITE = 'write:notification';
44 public const SCOPE_ORGANIZATION = 'organization';
45 public const SCOPE_ORGANIZATION_READ = 'read:organization';
46 public const SCOPE_ORGANIZATION_WRITE = 'write:organization';
47 public const SCOPE_PACKAGE = 'package';
48 public const SCOPE_PACKAGE_READ = 'read:package';
49 public const SCOPE_PACKAGE_WRITE = 'write:package';
50 public const SCOPE_REPOSITORY = 'repository';
51 public const SCOPE_REPOSITORY_READ = 'read:repository';
52 public const SCOPE_REPOSITORY_WRITE = 'write:repository';
53 public const SCOPE_USER = 'user';
54 public const SCOPE_USER_READ = 'read:user';
55 public const SCOPE_USER_WRITE = 'write:user';
56
57 public const DEFAULT_SCOPES = [
58 self::SCOPE_REPOSITORY_READ,
59 self::SCOPE_USER_READ,
60 ];
61
62 protected string $authorizationURL = 'https://gitea.com/login/oauth/authorize';
63 protected string $accessTokenURL = 'https://gitea.com/login/oauth/access_token';
64 protected string $apiURL = 'https://gitea.com/api';
65 protected string|null $apiDocs = 'https://docs.gitea.com/api/1.20/';
66 protected string|null $applicationURL = 'https://gitea.com/user/settings/applications';
67 protected string|null $userRevokeURL = 'https://gitea.com/user/settings/applications';
68
69 /** @codeCoverageIgnore */
70 public function me():AuthenticatedUser{
71 $json = $this->getMeResponseData('/v1/user');
72
73 $userdata = [
74 'data' => $json,
75 'avatar' => $json['avatar_url'],
76 'handle' => $json['login'],
77 'displayName' => $json['full_name'],
78 'email' => $json['email'],
79 'id' => $json['id'],
80 'url' => sprintf('https://gitea.com/%s', $json['login']),
81 ];
82
83 return new AuthenticatedUser($userdata);
84 }
85
86}