friendship ended with social-app. php is my new best friend
1<?php
2/**
3 * Class Codeberg
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 * Codeberg OAuth2
21 *
22 * @link https://forgejo.org/docs/latest/user/oauth2-provider/
23 * @link https://forgejo.org/docs/latest/user/token-scope/
24 * @link https://codeberg.org/api/swagger
25 */
26class Codeberg extends OAuth2Provider implements CSRFToken, PKCE, TokenRefresh, UserInfo{
27 use PKCETrait;
28
29 public const IDENTIFIER = 'CODEBERG';
30
31 public const SCOPE_ACTIVITYPUB = 'activitypub';
32 public const SCOPE_ACTIVITYPUB_READ = 'read:activitypub';
33 public const SCOPE_ACTIVITYPUB_WRITE = 'write:activitypub';
34 public const SCOPE_ADMIN = 'admin';
35 public const SCOPE_ADMIN_READ = 'read:admin';
36 public const SCOPE_ADMIN_WRITE = 'write:admin';
37 public const SCOPE_ISSUE = 'issue';
38 public const SCOPE_ISSUE_READ = 'read:issue';
39 public const SCOPE_ISSUE_WRITE = 'write:issue';
40 public const SCOPE_MISC = 'misc';
41 public const SCOPE_MISC_READ = 'read:misc';
42 public const SCOPE_MISC_WRITE = 'write:misc';
43 public const SCOPE_NOTIFICATION = 'notification';
44 public const SCOPE_NOTIFICATION_READ = 'read:notification';
45 public const SCOPE_NOTIFICATION_WRITE = 'write:notification';
46 public const SCOPE_ORGANIZATION = 'organization';
47 public const SCOPE_ORGANIZATION_READ = 'read:organization';
48 public const SCOPE_ORGANIZATION_WRITE = 'write:organization';
49 public const SCOPE_PACKAGE = 'package';
50 public const SCOPE_PACKAGE_READ = 'read:package';
51 public const SCOPE_PACKAGE_WRITE = 'write:package';
52 public const SCOPE_REPOSITORY = 'repository';
53 public const SCOPE_REPOSITORY_READ = 'read:repository';
54 public const SCOPE_REPOSITORY_WRITE = 'write:repository';
55 public const SCOPE_USER = 'user';
56 public const SCOPE_USER_READ = 'read:user';
57 public const SCOPE_USER_WRITE = 'write:user';
58
59 public const DEFAULT_SCOPES = [
60 self::SCOPE_REPOSITORY_READ,
61 self::SCOPE_USER_READ,
62 ];
63
64 protected string $authorizationURL = 'https://codeberg.org/login/oauth/authorize';
65 protected string $accessTokenURL = 'https://codeberg.org/login/oauth/access_token';
66 protected string $apiURL = 'https://codeberg.org/api';
67 protected string|null $apiDocs = 'https://codeberg.org/api/swagger';
68 protected string|null $applicationURL = 'https://codeberg.org/user/settings/applications';
69 protected string|null $userRevokeURL = 'https://codeberg.org/user/settings/applications';
70
71 /** @codeCoverageIgnore */
72 public function me():AuthenticatedUser{
73 $json = $this->getMeResponseData('/v1/user');
74
75 $userdata = [
76 'data' => $json,
77 'avatar' => $json['avatar_url'],
78 'handle' => $json['login'],
79 'displayName' => $json['full_name'],
80 'email' => $json['email'],
81 'id' => $json['id'],
82 'url' => sprintf('https://codeberg.org/%s', $json['login']),
83 ];
84
85 return new AuthenticatedUser($userdata);
86 }
87
88}