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}