versionData()['version'] ?? 'undefined'); View::share('appIsGit', $this->versionData()['is_git'] ?? false); Paginator::useBootstrap(); // If the APP_URL value is set with https:// make sure we force it here. Theoretically // this should just work with the proxy logic, but there are a lot of cases where it // doesn't, and it triggers a lot of support requests, so lets just head it off here. // // @see https://github.com/pterodactyl/panel/issues/3623 if (Str::startsWith(config('app.url') ?? '', 'https://')) { URL::forceScheme('https'); } Relation::enforceMorphMap([ 'allocation' => Models\Allocation::class, 'api_key' => Models\ApiKey::class, 'backup' => Models\Backup::class, 'database' => Models\Database::class, 'egg' => Models\Egg::class, 'egg_variable' => Models\EggVariable::class, 'schedule' => Models\Schedule::class, 'server' => Models\Server::class, 'ssh_key' => Models\UserSSHKey::class, 'task' => Models\Task::class, 'user' => Models\User::class, ]); } /** * Register application service providers. */ /** * Return version information for the footer. */ protected function versionData(): array { return Cache::remember('git-version', 5, function () { if (file_exists(base_path('.git/HEAD'))) { $head = explode(' ', file_get_contents(base_path('.git/HEAD'))); if (array_key_exists(1, $head)) { $path = base_path('.git/' . trim($head[1])); } } if (isset($path) && file_exists($path)) { return [ 'version' => substr(file_get_contents($path), 0, 8), 'is_git' => true, ]; } return [ 'version' => config('app.version'), 'is_git' => false, ]; }); } } Models\Allocation::class, 'api_key' => Models\ApiKey::class, 'backup' => Models\Backup::class, 'database' => Models\Database::class, 'egg' => Models\Egg::class, 'egg_variable' => Models\EggVariable::class, 'schedule' => Models\Schedule::class, 'server' => Models\Server::class, 'ssh_key' => Models\UserSSHKey::class, 'task' => Models\Task::class, 'user' => Models\User::class, ]); Http::macro( 'daemon', fn (Node $node, array $headers = []) => Http::acceptJson() ->asJson() ->withToken($node->daemon_token) ->withHeaders($headers) ->withOptions(['verify' => (bool) $app->environment('production')]) ->timeout(config('panel.guzzle.timeout')) ->connectTimeout(config('panel.guzzle.connect_timeout')) ->baseUrl($node->getConnectionAddress()) ); $this->bootAuth(); $this->bootBroadcast(); $bearerTokens = fn (OpenApi $openApi) => $openApi->secure(SecurityScheme::http('bearer')); Gate::define('viewApiDocs', fn () => true); Scramble::registerApi('application', ['api_path' => 'api/application', 'info' => ['version' => '1.0']]); Scramble::registerApi('client', ['api_path' => 'api/client', 'info' => ['version' => '1.0']])->afterOpenApiGenerated($bearerTokens); Scramble::registerApi('remote', ['api_path' => 'api/remote', 'info' => ['version' => '1.0']])->afterOpenApiGenerated($bearerTokens); Event::listen(function (\SocialiteProviders\Manager\SocialiteWasCalled $event) { $event->extendSocialite('discord', \SocialiteProviders\Discord\Provider::class); }); FilamentColor::register([ 'danger' => Color::Red, 'gray' => Color::Zinc, 'info' => Color::Sky, 'primary' => Color::Blue, 'success' => Color::Green, 'warning' => Color::Amber, ]); Gate::before(function (User $user, $ability) { return $user->isRootAdmin() ? true : null; }); } /** * Register application service providers. */ public function register(): void { $this->mergeConfigFrom(base_path('config/ExtensionFS.php'), 'filesystems'); // Load Blueprint's route service provider. $this->app->register(RouteServiceProvider::class); // Only load the settings service provider if the environment // is configured to allow it. if (!config('pelican.load_environment_only', false) && $this->app->environment() !== 'testing') { $this->app->register(SettingsServiceProvider::class); } $this->app->singleton('extensions.themes', function () { return new Theme(); }); Scramble::extendOpenApi(fn (OpenApi $openApi) => $openApi->secure(SecurityScheme::http('bearer'))); Scramble::ignoreDefaultRoutes(); } public function bootAuth(): void { Sanctum::usePersonalAccessTokenModel(ApiKey::class); } public function bootBroadcast(): void { Broadcast::routes(); /* * Authenticate the user's personal channel... */ Broadcast::channel('App.User.*', function ($user, $userId) { return (int) $user->id === (int) $userId; }); } }