chore: pint

This commit is contained in:
Benjamin Nussbaum 2025-08-26 11:17:09 +02:00
parent 25f36eaf54
commit 4c66761baa
12 changed files with 142 additions and 121 deletions

View file

@ -2,7 +2,9 @@
namespace App\Console\Commands;
use Exception;
use Illuminate\Console\Command;
use InvalidArgumentException;
use Laravel\Socialite\Facades\Socialite;
class OidcTestCommand extends Command
@ -31,7 +33,7 @@ class OidcTestCommand extends Command
// Check if OIDC is enabled
$enabled = config('services.oidc.enabled');
$this->line("OIDC Enabled: " . ($enabled ? '✅ Yes' : '❌ No'));
$this->line('OIDC Enabled: '.($enabled ? '✅ Yes' : '❌ No'));
// Check configuration values
$endpoint = config('services.oidc.endpoint');
@ -40,11 +42,11 @@ class OidcTestCommand extends Command
$redirect = config('services.oidc.redirect');
$scopes = config('services.oidc.scopes', []);
$this->line("OIDC Endpoint: " . ($endpoint ? "{$endpoint}" : '❌ Not set'));
$this->line("Client ID: " . ($clientId ? "{$clientId}" : '❌ Not set'));
$this->line("Client Secret: " . ($clientSecret ? '✅ Set' : '❌ Not set'));
$this->line("Redirect URL: " . ($redirect ? "{$redirect}" : '❌ Not set'));
$this->line("Scopes: " . (empty($scopes) ? '❌ Not set' : '✅ ' . implode(', ', $scopes)));
$this->line('OIDC Endpoint: '.($endpoint ? "{$endpoint}" : '❌ Not set'));
$this->line('Client ID: '.($clientId ? "{$clientId}" : '❌ Not set'));
$this->line('Client Secret: '.($clientSecret ? '✅ Set' : '❌ Not set'));
$this->line('Redirect URL: '.($redirect ? "{$redirect}" : '❌ Not set'));
$this->line('Scopes: '.(empty($scopes) ? '❌ Not set' : '✅ '.implode(', ', $scopes)));
$this->newLine();
@ -53,38 +55,45 @@ class OidcTestCommand extends Command
// Only test driver if we have basic configuration
if ($endpoint && $clientId && $clientSecret) {
$driver = Socialite::driver('oidc');
$this->line("OIDC Driver: ✅ Successfully registered and accessible");
$this->line('OIDC Driver: ✅ Successfully registered and accessible');
if ($enabled) {
$this->info("✅ OIDC is fully configured and ready to use!");
$this->line("You can test the login flow at: /auth/oidc/redirect");
$this->info('✅ OIDC is fully configured and ready to use!');
$this->line('You can test the login flow at: /auth/oidc/redirect');
} else {
$this->warn("⚠️ OIDC driver is working but OIDC_ENABLED is false.");
$this->warn('⚠️ OIDC driver is working but OIDC_ENABLED is false.');
}
} else {
$this->line("OIDC Driver: ✅ Registered (configuration test skipped due to missing values)");
$this->warn("⚠️ OIDC driver is registered but missing required configuration.");
$this->line("Please set the following environment variables:");
if (!$enabled) $this->line(" - OIDC_ENABLED=true");
if (!$endpoint) {
$this->line(" - OIDC_ENDPOINT=https://your-oidc-provider.com (base URL)");
$this->line(" OR");
$this->line(" - OIDC_ENDPOINT=https://your-oidc-provider.com/.well-known/openid-configuration (full URL)");
$this->line('OIDC Driver: ✅ Registered (configuration test skipped due to missing values)');
$this->warn('⚠️ OIDC driver is registered but missing required configuration.');
$this->line('Please set the following environment variables:');
if (! $enabled) {
$this->line(' - OIDC_ENABLED=true');
}
if (! $endpoint) {
$this->line(' - OIDC_ENDPOINT=https://your-oidc-provider.com (base URL)');
$this->line(' OR');
$this->line(' - OIDC_ENDPOINT=https://your-oidc-provider.com/.well-known/openid-configuration (full URL)');
}
if (! $clientId) {
$this->line(' - OIDC_CLIENT_ID=your-client-id');
}
if (! $clientSecret) {
$this->line(' - OIDC_CLIENT_SECRET=your-client-secret');
}
if (!$clientId) $this->line(" - OIDC_CLIENT_ID=your-client-id");
if (!$clientSecret) $this->line(" - OIDC_CLIENT_SECRET=your-client-secret");
}
} catch (\InvalidArgumentException $e) {
} catch (InvalidArgumentException $e) {
if (str_contains($e->getMessage(), 'Driver [oidc] not supported')) {
$this->error("❌ OIDC Driver registration failed: Driver not supported");
$this->error('❌ OIDC Driver registration failed: Driver not supported');
} else {
$this->error("❌ OIDC Driver error: " . $e->getMessage());
$this->error('❌ OIDC Driver error: '.$e->getMessage());
}
} catch (\Exception $e) {
$this->warn("⚠️ OIDC Driver registered but configuration error: " . $e->getMessage());
} catch (Exception $e) {
$this->warn('⚠️ OIDC Driver registered but configuration error: '.$e->getMessage());
}
$this->newLine();
return Command::SUCCESS;
}
}

View file

@ -4,6 +4,7 @@ namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Models\User;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
@ -17,23 +18,25 @@ class OidcController extends Controller
*/
public function redirect()
{
if (!config('services.oidc.enabled')) {
if (! config('services.oidc.enabled')) {
return redirect()->route('login')->withErrors(['oidc' => 'OIDC authentication is not enabled.']);
}
// Check if all required OIDC configuration is present
$requiredConfig = ['endpoint', 'client_id', 'client_secret'];
foreach ($requiredConfig as $key) {
if (!config("services.oidc.{$key}")) {
if (! config("services.oidc.{$key}")) {
Log::error("OIDC configuration missing: {$key}");
return redirect()->route('login')->withErrors(['oidc' => 'OIDC is not properly configured.']);
}
}
try {
return Socialite::driver('oidc')->redirect();
} catch (\Exception $e) {
Log::error('OIDC redirect error: ' . $e->getMessage());
} catch (Exception $e) {
Log::error('OIDC redirect error: '.$e->getMessage());
return redirect()->route('login')->withErrors(['oidc' => 'Failed to initiate OIDC authentication.']);
}
}
@ -43,32 +46,34 @@ class OidcController extends Controller
*/
public function callback(Request $request)
{
if (!config('services.oidc.enabled')) {
if (! config('services.oidc.enabled')) {
return redirect()->route('login')->withErrors(['oidc' => 'OIDC authentication is not enabled.']);
}
// Check if all required OIDC configuration is present
$requiredConfig = ['endpoint', 'client_id', 'client_secret'];
foreach ($requiredConfig as $key) {
if (!config("services.oidc.{$key}")) {
if (! config("services.oidc.{$key}")) {
Log::error("OIDC configuration missing: {$key}");
return redirect()->route('login')->withErrors(['oidc' => 'OIDC is not properly configured.']);
}
}
try {
$oidcUser = Socialite::driver('oidc')->user();
// Find or create the user
$user = $this->findOrCreateUser($oidcUser);
// Log the user in
Auth::login($user, true);
return redirect()->intended(route('dashboard', absolute: false));
} catch (\Exception $e) {
Log::error('OIDC callback error: ' . $e->getMessage());
} catch (Exception $e) {
Log::error('OIDC callback error: '.$e->getMessage());
return redirect()->route('login')->withErrors(['oidc' => 'Failed to authenticate with OIDC provider.']);
}
}
@ -80,26 +85,28 @@ class OidcController extends Controller
{
// First, try to find user by OIDC subject ID
$user = User::where('oidc_sub', $oidcUser->getId())->first();
if ($user) {
// Update user information from OIDC
$user->update([
'name' => $oidcUser->getName() ?: $user->name,
'email' => $oidcUser->getEmail() ?: $user->email,
]);
return $user;
}
// If not found by OIDC sub, try to find by email
if ($oidcUser->getEmail()) {
$user = User::where('email', $oidcUser->getEmail())->first();
if ($user) {
// Link the existing user with OIDC
$user->update([
'oidc_sub' => $oidcUser->getId(),
'name' => $oidcUser->getName() ?: $user->name,
]);
return $user;
}
}
@ -108,9 +115,9 @@ class OidcController extends Controller
return User::create([
'oidc_sub' => $oidcUser->getId(),
'name' => $oidcUser->getName() ?: 'OIDC User',
'email' => $oidcUser->getEmail() ?: $oidcUser->getId() . '@oidc.local',
'email' => $oidcUser->getEmail() ?: $oidcUser->getId().'@oidc.local',
'password' => bcrypt(Str::random(32)), // Random password since we're using OIDC
'email_verified_at' => now(), // OIDC users are considered verified
]);
}
}
}

View file

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace App\Liquid\FileSystems;
use InvalidArgumentException;
use Keepsuit\Liquid\Contracts\LiquidFileSystem;
/**
@ -52,10 +53,10 @@ class InlineTemplatesFileSystem implements LiquidFileSystem
public function readTemplateFile(string $templateName): string
{
if (!isset($this->templates[$templateName])) {
throw new \InvalidArgumentException("Template '{$templateName}' not found in inline templates");
if (! isset($this->templates[$templateName])) {
throw new InvalidArgumentException("Template '{$templateName}' not found in inline templates");
}
return $this->templates[$templateName];
}
}
}

View file

@ -20,6 +20,7 @@ use Keepsuit\Liquid\TagBlock;
class TemplateTag extends TagBlock
{
protected string $templateName;
protected Raw $body;
public static function tagName(): string
@ -36,16 +37,16 @@ class TemplateTag extends TagBlock
{
// Get the template name from the tag parameters
$templateNameExpression = $context->params->expression();
$this->templateName = match (true) {
is_string($templateNameExpression) => trim($templateNameExpression),
is_numeric($templateNameExpression) => (string) $templateNameExpression,
$templateNameExpression instanceof VariableLookup => (string) $templateNameExpression,
default => throw new SyntaxException("Template name must be a string, number, or variable"),
default => throw new SyntaxException('Template name must be a string, number, or variable'),
};
// Validate template name (letters, numbers, underscores, and slashes only)
if (!preg_match('/^[a-zA-Z0-9_\/]+$/', $this->templateName)) {
if (! preg_match('/^[a-zA-Z0-9_\/]+$/', $this->templateName)) {
throw new SyntaxException("Invalid template name '{$this->templateName}' - template names must contain only letters, numbers, underscores, and slashes");
}
@ -74,7 +75,7 @@ class TemplateTag extends TagBlock
// Get the file system from the environment
$fileSystem = $context->environment->fileSystem;
if (!$fileSystem instanceof InlineTemplatesFileSystem) {
if (! $fileSystem instanceof InlineTemplatesFileSystem) {
// If no inline file system is available, just return empty string
// This allows the template to be used in contexts where inline templates aren't supported
return '';
@ -96,4 +97,4 @@ class TemplateTag extends TagBlock
{
return $this->body;
}
}
}

View file

@ -182,10 +182,12 @@ class Device extends Model
{
return $this->belongsTo(Firmware::class, 'update_firmware_id');
}
public function deviceModel(): BelongsTo
{
return $this->belongsTo(DeviceModel::class);
}
public function logs(): HasMany
{
return $this->hasMany(DeviceLog::class);
@ -224,19 +226,20 @@ class Device extends Model
if ($from < $to) {
// Normal range, same day
return $now->between($from, $to) ? (int) $now->diffInSeconds($to, false) : null;
} else {
// Overnight range
if ($now->gte($from)) {
// After 'from', before midnight
return (int) $now->diffInSeconds($to->copy()->addDay(), false);
} elseif ($now->lt($to)) {
// After midnight, before 'to'
return (int) $now->diffInSeconds($to, false);
} else {
// Not in sleep window
return null;
}
}
// Overnight range
if ($now->gte($from)) {
// After 'from', before midnight
return (int) $now->diffInSeconds($to->copy()->addDay(), false);
}
if ($now->lt($to)) {
// After midnight, before 'to'
return (int) $now->diffInSeconds($to, false);
}
// Not in sleep window
return null;
}
public function isPauseActive(): bool

View file

@ -41,6 +41,7 @@ class AppServiceProvider extends ServiceProvider
// Register OIDC provider with Socialite
Socialite::extend('oidc', function ($app) {
$config = $app['config']['services.oidc'] ?? [];
return new OidcProvider(
$app['request'],
$config['client_id'] ?? null,

View file

@ -51,7 +51,7 @@ class ImageGenerationService
if (config('app.puppeteer_wait_for_network_idle')) {
$browsershot->waitUntilNetworkIdle();
}
if (config('app.puppeteer_window_size_strategy') == 'v2') {
if (config('app.puppeteer_window_size_strategy') === 'v2') {
$browsershot->windowSize($imageSettings['width'], $imageSettings['height']);
} else {
$browsershot->windowSize(800, 480);

View file

@ -2,11 +2,11 @@
namespace App\Services;
use Exception;
use GuzzleHttp\Client;
use Laravel\Socialite\Two\AbstractProvider;
use Laravel\Socialite\Two\ProviderInterface;
use Laravel\Socialite\Two\User;
use GuzzleHttp\Client;
use Illuminate\Support\Arr;
class OidcProvider extends AbstractProvider implements ProviderInterface
{
@ -36,19 +36,19 @@ class OidcProvider extends AbstractProvider implements ProviderInterface
public function __construct($request, $clientId, $clientSecret, $redirectUrl, $scopes = [], $guzzle = [])
{
parent::__construct($request, $clientId, $clientSecret, $redirectUrl, $guzzle);
$endpoint = config('services.oidc.endpoint');
if (!$endpoint) {
throw new \Exception('OIDC endpoint is not configured. Please set OIDC_ENDPOINT environment variable.');
if (! $endpoint) {
throw new Exception('OIDC endpoint is not configured. Please set OIDC_ENDPOINT environment variable.');
}
// Handle both full well-known URL and base URL
if (str_ends_with($endpoint, '/.well-known/openid-configuration')) {
$this->baseUrl = str_replace('/.well-known/openid-configuration', '', $endpoint);
} else {
$this->baseUrl = rtrim($endpoint, '/');
}
$this->scopes = $scopes ?: ['openid', 'profile', 'email'];
$this->loadOidcConfiguration();
}
@ -59,21 +59,21 @@ class OidcProvider extends AbstractProvider implements ProviderInterface
protected function loadOidcConfiguration()
{
try {
$url = $this->baseUrl . '/.well-known/openid-configuration';
$url = $this->baseUrl.'/.well-known/openid-configuration';
$client = new Client();
$response = $client->get($url);
$this->oidcConfig = json_decode($response->getBody()->getContents(), true);
if (!$this->oidcConfig) {
throw new \Exception('OIDC configuration is empty or invalid JSON');
if (! $this->oidcConfig) {
throw new Exception('OIDC configuration is empty or invalid JSON');
}
if (!isset($this->oidcConfig['authorization_endpoint'])) {
throw new \Exception('authorization_endpoint not found in OIDC configuration');
if (! isset($this->oidcConfig['authorization_endpoint'])) {
throw new Exception('authorization_endpoint not found in OIDC configuration');
}
} catch (\Exception $e) {
throw new \Exception('Failed to load OIDC configuration: ' . $e->getMessage());
} catch (Exception $e) {
throw new Exception('Failed to load OIDC configuration: '.$e->getMessage());
}
}
@ -82,9 +82,10 @@ class OidcProvider extends AbstractProvider implements ProviderInterface
*/
protected function getAuthUrl($state)
{
if (!$this->oidcConfig || !isset($this->oidcConfig['authorization_endpoint'])) {
throw new \Exception('OIDC configuration not loaded or authorization_endpoint not found.');
if (! $this->oidcConfig || ! isset($this->oidcConfig['authorization_endpoint'])) {
throw new Exception('OIDC configuration not loaded or authorization_endpoint not found.');
}
return $this->buildAuthUrlFromBase($this->oidcConfig['authorization_endpoint'], $state);
}
@ -93,9 +94,10 @@ class OidcProvider extends AbstractProvider implements ProviderInterface
*/
protected function getTokenUrl()
{
if (!$this->oidcConfig || !isset($this->oidcConfig['token_endpoint'])) {
throw new \Exception('OIDC configuration not loaded or token_endpoint not found.');
if (! $this->oidcConfig || ! isset($this->oidcConfig['token_endpoint'])) {
throw new Exception('OIDC configuration not loaded or token_endpoint not found.');
}
return $this->oidcConfig['token_endpoint'];
}
@ -104,13 +106,13 @@ class OidcProvider extends AbstractProvider implements ProviderInterface
*/
protected function getUserByToken($token)
{
if (!$this->oidcConfig || !isset($this->oidcConfig['userinfo_endpoint'])) {
throw new \Exception('OIDC configuration not loaded or userinfo_endpoint not found.');
if (! $this->oidcConfig || ! isset($this->oidcConfig['userinfo_endpoint'])) {
throw new Exception('OIDC configuration not loaded or userinfo_endpoint not found.');
}
$response = $this->getHttpClient()->get($this->oidcConfig['userinfo_endpoint'], [
'headers' => [
'Authorization' => 'Bearer ' . $token,
'Authorization' => 'Bearer '.$token,
],
]);
@ -153,4 +155,4 @@ class OidcProvider extends AbstractProvider implements ProviderInterface
'grant_type' => 'authorization_code',
]);
}
}
}