mirror of
				https://github.com/pelican-dev/panel.git
				synced 2025-11-04 03:06:54 +01:00 
			
		
		
		
	# Conflicts: # app/Filament/Resources/NodeResource/RelationManagers/AllocationsRelationManager.php # app/Filament/Resources/ServerResource/Pages/CreateServer.php # app/Filament/Resources/ServerResource/Pages/EditServer.php # app/Filament/Resources/ServerResource/RelationManagers/AllocationsRelationManager.php # app/Filament/Resources/UserResource/Pages/EditProfile.php # app/Models/Node.php # app/Models/Objects/DeploymentObject.php # app/Services/Allocations/AssignmentService.php # app/Services/Servers/ServerCreationService.php # app/Services/Servers/TransferServerService.php # pint.json
		
			
				
	
	
		
			151 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			151 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Providers;
 | 
						|
 | 
						|
use App\Extensions\Themes\Theme;
 | 
						|
use App\Livewire\EndpointSynth;
 | 
						|
use App\Models;
 | 
						|
use App\Models\ApiKey;
 | 
						|
use App\Models\Node;
 | 
						|
use App\Models\User;
 | 
						|
use App\Rules\Port;
 | 
						|
use Dedoc\Scramble\Scramble;
 | 
						|
use Dedoc\Scramble\Support\Generator\OpenApi;
 | 
						|
use Dedoc\Scramble\Support\Generator\SecurityScheme;
 | 
						|
use Filament\Support\Colors\Color;
 | 
						|
use Filament\Support\Facades\FilamentColor;
 | 
						|
use Illuminate\Database\Eloquent\Relations\Relation;
 | 
						|
use Illuminate\Foundation\Application;
 | 
						|
use Illuminate\Pagination\Paginator;
 | 
						|
use Illuminate\Support\Facades\Broadcast;
 | 
						|
use Illuminate\Support\Facades\Event;
 | 
						|
use Illuminate\Support\Facades\Gate;
 | 
						|
use Illuminate\Support\Facades\Http;
 | 
						|
use Illuminate\Support\Facades\URL;
 | 
						|
use Illuminate\Support\Facades\Validator;
 | 
						|
use Illuminate\Support\Facades\View;
 | 
						|
use Illuminate\Support\ServiceProvider;
 | 
						|
use Illuminate\Support\Str;
 | 
						|
use Illuminate\Validation\InvokableValidationRule;
 | 
						|
use Laravel\Sanctum\Sanctum;
 | 
						|
use Livewire\Livewire;
 | 
						|
 | 
						|
class AppServiceProvider extends ServiceProvider
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Bootstrap any application services.
 | 
						|
     */
 | 
						|
    public function boot(Application $app): void
 | 
						|
    {
 | 
						|
        // TODO: remove when old admin area gets yeeted
 | 
						|
        View::share('appVersion', config('app.version'));
 | 
						|
        View::share('appIsGit', 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.
 | 
						|
        if (Str::startsWith(config('app.url') ?? '', 'https://')) {
 | 
						|
            URL::forceScheme('https');
 | 
						|
        }
 | 
						|
 | 
						|
        Relation::enforceMorphMap([
 | 
						|
            '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();
 | 
						|
 | 
						|
        Livewire::propertySynthesizer(EndpointSynth::class);
 | 
						|
 | 
						|
        // Assign custom validation rules
 | 
						|
        Validator::extend('port', function ($attribute, $value, $parameters, $validator) {
 | 
						|
            $rule = InvokableValidationRule::make(new Port());
 | 
						|
            $rule->setValidator($validator); // @phpstan-ignore-line
 | 
						|
            $rule->setData($validator->getData()); // @phpstan-ignore-line
 | 
						|
 | 
						|
            $result = $rule->passes($attribute, $value);
 | 
						|
            if (!$result) {
 | 
						|
                $validator->customMessages[$attribute] = $rule->message();
 | 
						|
            }
 | 
						|
 | 
						|
            return $result;
 | 
						|
        });
 | 
						|
 | 
						|
        $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->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;
 | 
						|
        });
 | 
						|
    }
 | 
						|
}
 |