diff --git a/.env.example b/.env.example index 21e776f5..7c4bd0bd 100644 --- a/.env.example +++ b/.env.example @@ -107,6 +107,7 @@ MAIL_FROM_ADDRESS=null AUTHENTICATION_GUARD=web-guard + # Name of the HTTP headers sent by the reverse proxy that identifies the authenticated user at proxy level. # Check your proxy documentation to find out how these headers are named (i.e 'REMOTE_USER', 'REMOTE_EMAIL', etc...) # (only relevant when AUTHENTICATION_GUARD is set to 'reverse-proxy-guard') @@ -114,10 +115,12 @@ AUTHENTICATION_GUARD=web-guard AUTH_PROXY_HEADER_FOR_USER=null AUTH_PROXY_HEADER_FOR_EMAIL=null + # Custom logout URL to open when using an auth proxy. PROXY_LOGOUT_URL=null + #### WebAuthn settings #### # Relying Party name, aka the name of the application. @@ -125,15 +128,19 @@ PROXY_LOGOUT_URL=null WEBAUTHN_NAME=2FAuth + # Relying Party ID. If null, the device will fill it internally. # See https://webauthn-doc.spomky-labs.com/pre-requisites/the-relying-party#how-to-determine-the-relying-party-id WEBAUTHN_ID=null +# [DEPRECATED] # Optional image data in BASE64 (128 bytes maximum) or an image url # See https://webauthn-doc.spomky-labs.com/pre-requisites/the-relying-party#relying-party-icon -WEBAUTHN_ICON=null +# WEBAUTHN_ICON=null +# [/DEPRECATED] + # Use this setting to control how user verification behave during the # WebAuthn authentication flow. @@ -150,6 +157,7 @@ WEBAUTHN_ICON=null WEBAUTHN_USER_VERIFICATION=preferred + # Use this setting to declare trusted proxied. # Supported: # '*': to trust any proxy @@ -157,6 +165,7 @@ WEBAUTHN_USER_VERIFICATION=preferred TRUSTED_PROXIES=null + # Leave the following configuration vars as is. # Unless you like to tinker and know what you're doing. diff --git a/.env.testing b/.env.testing index 8f9a02c4..4f20f10e 100644 --- a/.env.testing +++ b/.env.testing @@ -5,7 +5,7 @@ APP_DEBUG=true APP_URL=http://localhost WEBAUTHN_NAME=TestApp -WEBAUTHN_ID=localhost +WEBAUTHN_ID=null WEBAUTHN_USER_VERIFICATION=discouraged AUTHENTICATION_GUARD=web-guard diff --git a/app/Console/Commands/Utils/ResetTrait.php b/app/Console/Commands/Utils/ResetTrait.php index 60e43b87..7dd48eb3 100644 --- a/app/Console/Commands/Utils/ResetTrait.php +++ b/app/Console/Commands/Utils/ResetTrait.php @@ -66,8 +66,8 @@ protected function flushDB() : void DB::table('oauth_access_tokens')->delete(); DB::table('oauth_personal_access_clients')->delete(); DB::table('oauth_refresh_tokens')->delete(); - DB::table('web_authn_credentials')->delete(); - DB::table('web_authn_recoveries')->delete(); + DB::table('webauthn_credentials')->delete(); + DB::table('webauthn_recoveries')->delete(); DB::table('twofaccounts')->delete(); DB::table('options')->delete(); DB::table('groups')->delete(); diff --git a/app/Extensions/EloquentTwoFAuthProvider.php b/app/Extensions/EloquentTwoFAuthProvider.php deleted file mode 100644 index 2bcf833a..00000000 --- a/app/Extensions/EloquentTwoFAuthProvider.php +++ /dev/null @@ -1,31 +0,0 @@ -fallback = !Settings::get('useWebauthnOnly'); - } -} diff --git a/app/Extensions/WebauthnCredentialBroker.php b/app/Extensions/WebauthnCredentialBroker.php new file mode 100644 index 00000000..991cc2c8 --- /dev/null +++ b/app/Extensions/WebauthnCredentialBroker.php @@ -0,0 +1,66 @@ +getUser($credentials); + + if (!$user instanceof WebAuthnAuthenticatable) { + return static::INVALID_USER; + } + + if ($this->tokens->recentlyCreatedToken($user)) { + return static::RESET_THROTTLED; + } + + $token = $this->tokens->create($user); + + if ($callback) { + $callback($user, $token); + } else { + $user->sendWebauthnRecoveryNotification($token); + } + + return static::RESET_LINK_SENT; + } + + + /** + * Reset the password for the given token. + * + * @param array $credentials + * @param \Closure $callback + * + * @return \Illuminate\Contracts\Auth\CanResetPassword|string + */ + public function reset(array $credentials, Closure $callback) + { + $user = $this->validateReset($credentials); + + if (!$user instanceof CanResetPasswordContract || !$user instanceof WebAuthnAuthenticatable) { + return $user; + } + + $callback($user); + + $this->tokens->delete($user); + + return static::PASSWORD_RESET; + } +} diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 1fc2f5fa..adfa3c3b 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -39,8 +39,6 @@ public function register(UserStoreRequest $request) Log::info('User created'); $this->guard()->login($user); - // $this->guard()->loginUsingId($user->id); - // Auth::guard('admin')->attempt($credentials); return response()->json([ 'message' => 'account created', diff --git a/app/Http/Controllers/Auth/UserController.php b/app/Http/Controllers/Auth/UserController.php index afd14087..1597058b 100644 --- a/app/Http/Controllers/Auth/UserController.php +++ b/app/Http/Controllers/Auth/UserController.php @@ -62,8 +62,8 @@ public function delete(UserDeleteRequest $request) DB::table('twofaccounts')->delete(); DB::table('groups')->delete(); DB::table('options')->delete(); - DB::table('web_authn_credentials')->delete(); - DB::table('web_authn_recoveries')->delete(); + DB::table('webauthn_credentials')->delete(); + DB::table('webauthn_recoveries')->delete(); DB::table('oauth_access_tokens')->delete(); DB::table('oauth_auth_codes')->delete(); DB::table('oauth_clients')->delete(); diff --git a/app/Http/Controllers/Auth/WebAuthnConfirmController.php b/app/Http/Controllers/Auth/WebAuthnConfirmController.php index b1e585e9..4477eeab 100644 --- a/app/Http/Controllers/Auth/WebAuthnConfirmController.php +++ b/app/Http/Controllers/Auth/WebAuthnConfirmController.php @@ -1,30 +1,30 @@ 'required|exists:users,email', - ]; + $credentials = $request->validated(); + + $response = $broker->sendResetLink($credentials); + + return $response === Password::RESET_LINK_SENT + ? $this->sendRecoveryLinkResponse($request, $response) + : $this->sendRecoveryLinkFailedResponse($request, $response); + } + + + /** + * Get the response for a failed account recovery link. + * + * @param \Illuminate\Http\Request $request + * @param string $response + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse + * @throws \Illuminate\Validation\ValidationException + */ + protected function sendRecoveryLinkFailedResponse(Request $request, string $response) + { + if ($request->wantsJson()) { + throw ValidationException::withMessages(['email' => [trans($response)]]); + } + + return back() + ->withInput($request->only('email')) + ->withErrors(['email' => trans($response)]); } diff --git a/app/Http/Controllers/Auth/WebAuthnLoginController.php b/app/Http/Controllers/Auth/WebAuthnLoginController.php index c3738ad1..50b5e5fb 100644 --- a/app/Http/Controllers/Auth/WebAuthnLoginController.php +++ b/app/Http/Controllers/Auth/WebAuthnLoginController.php @@ -3,20 +3,17 @@ namespace App\Http\Controllers\Auth; use App\Models\User; -use Illuminate\Http\Request; +use Illuminate\Http\JsonResponse; use App\Http\Controllers\Controller; -use DarkGhostHunter\Larapass\Http\AuthenticatesWebAuthn; use Carbon\Carbon; use Illuminate\Support\Facades\Log; +use Laragear\WebAuthn\Http\Requests\AssertionRequest; +use Laragear\WebAuthn\Http\Requests\AssertedRequest; +use Illuminate\Contracts\Support\Responsable; +use Laragear\WebAuthn\WebAuthn; class WebAuthnLoginController extends Controller { - // use AuthenticatesWebAuthn; - use AuthenticatesWebAuthn { - options as traitOptions; - login as traitLogin; - } - /* |-------------------------------------------------------------------------- | WebAuthn Login Controller @@ -29,66 +26,75 @@ class WebAuthnLoginController extends Controller */ /** - * @return \Illuminate\Http\JsonResponse|\Webauthn\PublicKeyCredentialRequestOptions + * Returns the challenge to assertion. + * + * @param \Laragear\WebAuthn\Http\Requests\AssertionRequest $request + * @return \Illuminate\Contracts\Support\Responsable|\Illuminate\Http\JsonResponse */ - public function options(Request $request) - { - // Since 2FAuth is single user designed we fetch the user instance - // and merge its email address to the request. This let Larapass validate - // the request against a user instance without the need to ask the visitor - // for an email address. - // - // This approach override the Larapass 'userless' config value that seems buggy. + public function options(AssertionRequest $request): Responsable|JsonResponse + { + switch (env('WEBAUTHN_USER_VERIFICATION')) { + case WebAuthn::USER_VERIFICATION_DISCOURAGED: + $request = $request->fastLogin(); // Makes the authenticator to only check for user presence on registration + break; + case WebAuthn::USER_VERIFICATION_REQUIRED: + $request = $request->secureLogin(); // Makes the authenticator to always verify the user thoroughly on registration + break; + } + + // Since 2FAuth is single user designed we fetch the user instance. + // This lets Larapass validate the request without the need to ask + // the visitor for an email address. $user = User::first(); - if (!$user) { - return response()->json([ + return $user + ? $request->toVerify($user) + : response()->json([ 'message' => 'no registered user' ], 400); - } - else $request->merge(['email' => $user->email]); - - return $this->traitOptions($request); - } - + } + /** * Log the user in. * - * @param \Illuminate\Http\Request $request - * + * @param \Laragear\WebAuthn\Http\Requests\AssertedRequest $request * @return \Illuminate\Http\Response|\Illuminate\Http\JsonResponse */ - public function login(Request $request) + public function login(AssertedRequest $request) { Log::info('User login via webauthn requested'); - $request->validate($this->assertionRules()); if ($request->has('response')) { $response = $request->response; // Some authenticators do not send a userHandle so we hack the response to be compliant - // with Larapass/webauthn-lib implementation that wait for a userHandle + // with Larapass/webauthn-lib implementation that waits for a userHandle if(!$response['userHandle']) { - $user = User::getFromCredentialId($request->id); - $response['userHandle'] = base64_encode($user->userHandle()); + $response['userHandle'] = User::getFromCredentialId($request->id)?->userHandle(); $request->merge(['response' => $response]); } } + + $user = $request->login(); - return $this->traitLogin($request); + if ($user) { + $this->authenticated($user); + return response()->noContent(); + } + + return response()->noContent(422); } /** * The user has been authenticated. * - * @param \Illuminate\Http\Request $request * @param mixed $user * * @return void|\Illuminate\Http\JsonResponse */ - protected function authenticated(Request $request, $user) + protected function authenticated($user) { $user->last_seen_at = Carbon::now()->format('Y-m-d H:i:s'); $user->save(); diff --git a/app/Http/Controllers/Auth/WebAuthnManageController.php b/app/Http/Controllers/Auth/WebAuthnManageController.php index 5cbf075c..017fc254 100644 --- a/app/Http/Controllers/Auth/WebAuthnManageController.php +++ b/app/Http/Controllers/Auth/WebAuthnManageController.php @@ -6,26 +6,10 @@ use App\Http\Controllers\Controller; use Illuminate\Http\Request; use App\Http\Requests\WebauthnRenameRequest; -use DarkGhostHunter\Larapass\Eloquent\WebAuthnCredential; use Illuminate\Support\Facades\Log; class WebAuthnManageController extends Controller -{ - /* - |-------------------------------------------------------------------------- - | WebAuthn Manage Controller - |-------------------------------------------------------------------------- - | - | - */ - - /** - * Create a new controller instance. - */ - public function __construct() - { - } - +{ /** * List all WebAuthn registered credentials @@ -34,34 +18,30 @@ public function __construct() */ public function index(Request $request) { - $user = $request->user(); - $allUserCredentials = $user->webAuthnCredentials() - ->enabled() - ->get() - ->all(); + $allUserCredentials = $request->user()->webAuthnCredentials()->WhereEnabled()->get(); return response()->json($allUserCredentials, 200); } /** - * Rename a WebAuthn device + * Rename a WebAuthn credential * * @param \App\Http\Requests\WebauthnRenameRequest $request + * @param string $credential * @return \Illuminate\Http\JsonResponse */ public function rename(WebauthnRenameRequest $request, string $credential) { $validated = $request->validated(); - $webAuthnCredential = WebAuthnCredential::where('id', $credential)->firstOrFail(); - $webAuthnCredential->name = $validated['name']; // @phpstan-ignore-line - $webAuthnCredential->save(); + abort_if(! $request->user()->renameCredential($credential, $validated['name']), 404); return response()->json([ - 'name' => $webAuthnCredential->name, - ], 200); + 'name' => $validated['name'], + ], 200); } + /** * Remove the specified credential from storage. @@ -76,13 +56,15 @@ public function delete(Request $request, $credential) Log::info('Deletion of security device requested'); $user = $request->user(); - $user->removeCredential($credential); + $user->flushCredential($credential); - // Webauthn user options should be reset to prevent impossible login + // Webauthn user options need to be reset to prevent impossible login when + // no more registered device exists. // See #110 - if (blank($user->allCredentialDescriptors())) { + if (blank($user->webAuthnCredentials()->WhereEnabled()->get())) { Settings::delete('useWebauthnAsDefault'); Settings::delete('useWebauthnOnly'); + Log::notice('No Webauthn credential enabled, Webauthn settings reset to default'); } Log::info('Security device deleted'); diff --git a/app/Http/Controllers/Auth/WebAuthnRecoveryController.php b/app/Http/Controllers/Auth/WebAuthnRecoveryController.php index 7e4ccb37..8f2ccad2 100644 --- a/app/Http/Controllers/Auth/WebAuthnRecoveryController.php +++ b/app/Http/Controllers/Auth/WebAuthnRecoveryController.php @@ -3,55 +3,83 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; -use App\Providers\RouteServiceProvider; -use DarkGhostHunter\Larapass\Http\RecoversWebAuthn; -use DarkGhostHunter\Larapass\Facades\WebAuthn; +use App\Http\Requests\WebauthnRecoveryRequest; +use App\Extensions\WebauthnCredentialBroker; +use App\Facades\Settings; +use Illuminate\Auth\AuthenticationException; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Validation\ValidationException; +use Illuminate\Support\Facades\Auth; +use Illuminate\Foundation\Auth\ResetsPasswords; +use Illuminate\Support\Facades\Password; +use Illuminate\Support\Facades\App; class WebAuthnRecoveryController extends Controller { - use RecoversWebAuthn; - - /* - |-------------------------------------------------------------------------- - | WebAuthn Recovery Controller - |-------------------------------------------------------------------------- - | - | When an user loses his device he will reach this controller to attach a - | new device. The user will attach a new device, and optionally, disable - | all others. Then he will be authenticated and redirected to your app. - | - */ + use ResetsPasswords; /** - * Where to redirect users after resetting their password. + * Let the user regain access to his account using email+password by resetting + * the "use webauthn only" setting. * - * @var string + * @param \App\Http\Requests\WebauthnRecoveryRequest $request + * @param \App\Extensions\WebauthnCredentialBroker $broker + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\JsonResponse + * @throws \Illuminate\Validation\ValidationException */ - protected $redirectTo = RouteServiceProvider::HOME; - - - /** - * Returns the credential creation options to the user. - * - * @param \Illuminate\Http\Request $request - * - * @return \Illuminate\Http\JsonResponse - */ - public function options(Request $request): JsonResponse + public function recover(WebauthnRecoveryRequest $request, WebauthnCredentialBroker $broker) { - $user = WebAuthn::getUser($request->validate($this->rules())); + $credentials = $request->validated(); - // We will proceed only if the broker can find the user and the token is valid. - // If the user doesn't exists or the token is invalid, we will bail out with a - // HTTP 401 code because the user doing the request is not authorized for it. - abort_unless(WebAuthn::tokenExists($user, $request->input('token')), 401, __('auth.webauthn.invalid_recovery_token')); + $response = $broker->reset( + $credentials, + function ($user) use ($request) { + // At this time, the WebAuthnUserProvider is already registered in the Laravel Service Container, + // with a password_fallback value set using the useWebauthnOnly user setting (see AuthServiceProvider.php). + // To ensure user login with email+pwd credentials, we replace the registered WebAuthnUserProvider instance + // with a new instance configured with password_fallback On. + $provider = new \Laragear\WebAuthn\Auth\WebAuthnUserProvider( + app()->make('hash'), + \App\Models\User::class, + app()->make(\Laragear\WebAuthn\Assertion\Validator\AssertionValidator::class), + true, + ); + + Auth::guard()->setProvider($provider); + + if (Auth::attempt($request->only('email', 'password'))) { + if ($this->shouldRevokeAllCredentials($request)) { + $user->flushCredentials(); + } + Settings::delete('useWebauthnOnly'); + } + else throw new AuthenticationException(); + } + ); + + return $response === Password::PASSWORD_RESET + ? $this->sendRecoveryResponse($request, $response) + : $this->sendRecoveryFailedResponse($request, $response); - return response()->json(WebAuthn::generateAttestation($user)); } + + /** + * Check if the user has set to revoke all credentials. + * + * @param \App\Http\Requests\WebauthnRecoveryRequest $request + * + * @return bool|mixed + */ + protected function shouldRevokeAllCredentials(WebauthnRecoveryRequest $request): mixed + { + return filter_var($request->header('WebAuthn-Unique'), FILTER_VALIDATE_BOOLEAN) + ?: $request->input('revokeAll', true); + } + + /** * Get the response for a successful account recovery. * @@ -60,13 +88,13 @@ public function options(Request $request): JsonResponse * * @return \Illuminate\Http\JsonResponse * - * @codeCoverageIgnore - already covered by larapass test */ protected function sendRecoveryResponse(Request $request, string $response): JsonResponse { - return response()->json(['message' => __('auth.webauthn.device_successfully_registered')]); + return response()->json(['message' => __('auth.webauthn.webauthn_login_disabled')]); } + /** * Get the response for a failed account recovery. * @@ -76,10 +104,16 @@ protected function sendRecoveryResponse(Request $request, string $response): Jso * @return \Illuminate\Http\JsonResponse * @throws \Illuminate\Validation\ValidationException * - * @codeCoverageIgnore - already covered by larapass test */ protected function sendRecoveryFailedResponse(Request $request, string $response): JsonResponse { - throw ValidationException::withMessages(['email' => [trans($response)]]); + switch ($response) { + case Password::INVALID_TOKEN: + throw ValidationException::withMessages(['token' => [__('auth.webauthn.invalid_reset_token')]]); + + default: + throw ValidationException::withMessages(['email' => [trans($response)]]); + } + } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Auth/WebAuthnRegisterController.php b/app/Http/Controllers/Auth/WebAuthnRegisterController.php index bfc0d2e7..3ef32b42 100644 --- a/app/Http/Controllers/Auth/WebAuthnRegisterController.php +++ b/app/Http/Controllers/Auth/WebAuthnRegisterController.php @@ -3,20 +3,48 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; -use DarkGhostHunter\Larapass\Http\RegistersWebAuthn; +use Illuminate\Contracts\Support\Responsable; +use Illuminate\Http\Response; +use Laragear\WebAuthn\Http\Requests\AttestationRequest; +use Laragear\WebAuthn\Http\Requests\AttestedRequest; +use Laragear\WebAuthn\WebAuthn; class WebAuthnRegisterController extends Controller { - use RegistersWebAuthn; + /** + * Returns a challenge to be verified by the user device. + * + * @param \Laragear\WebAuthn\Http\Requests\AttestationRequest $request + * @return \Illuminate\Contracts\Support\Responsable + */ + public function options(AttestationRequest $request): Responsable + { + switch (env('WEBAUTHN_USER_VERIFICATION')) { + case WebAuthn::USER_VERIFICATION_DISCOURAGED: + $request = $request->fastRegistration(); // Makes the authenticator to only check for user presence on registration + break; + case WebAuthn::USER_VERIFICATION_REQUIRED: + $request = $request->secureRegistration(); // Makes the authenticator to always verify the user thoroughly on registration + break; + } - /* - |-------------------------------------------------------------------------- - | WebAuthn Registration Controller - |-------------------------------------------------------------------------- - | - | This controller receives an user request to register a device and also - | verifies the registration. If everything goes ok, the credential is - | persisted into the application, otherwise it will signal failure. - | - */ + return $request + // ->allowDuplicates() // Allows the device to create multiple credentials for the same user for this app + // ->userless() // Tells the authenticator use this credential to login instantly, instead of asking for one + ->toCreate(); + } + + + /** + * Registers a device for further WebAuthn authentication. + * + * @param \Laragear\WebAuthn\Http\Requests\AttestedRequest $request + * @return \Illuminate\Http\Response + */ + public function register(AttestedRequest $request): Response + { + $request->save(); + + return response()->noContent(); + } } \ No newline at end of file diff --git a/app/Http/Requests/WebauthnDeviceLostRequest.php b/app/Http/Requests/WebauthnDeviceLostRequest.php new file mode 100644 index 00000000..e8bcb090 --- /dev/null +++ b/app/Http/Requests/WebauthnDeviceLostRequest.php @@ -0,0 +1,35 @@ + [ + 'required', + 'email', + new \App\Rules\CaseInsensitiveEmailExists + ], + ]; + } +} diff --git a/app/Http/Requests/WebauthnRecoveryRequest.php b/app/Http/Requests/WebauthnRecoveryRequest.php new file mode 100644 index 00000000..e2d04dd9 --- /dev/null +++ b/app/Http/Requests/WebauthnRecoveryRequest.php @@ -0,0 +1,33 @@ + 'required', + 'email' => 'required|email', + 'password' => 'required', + ]; + } +} diff --git a/app/Models/Traits/WebAuthnManageCredentials.php b/app/Models/Traits/WebAuthnManageCredentials.php new file mode 100644 index 00000000..dcd51815 --- /dev/null +++ b/app/Models/Traits/WebAuthnManageCredentials.php @@ -0,0 +1,97 @@ +getHex()->toString() + // to obtain a UUID v4 with dashes removed and uses it as user_id (aka userHandle) + // see https://github.com/ramsey/uuid/blob/4.x/src/Uuid.php#L379 + // and Laragear\WebAuthn\Assertion\Validator\Pipes\CheckCredentialIsForUser::validateId() + + return $this->webAuthnCredentials()->value('user_id') + ?? str_replace('-', '', Str::uuid()->toString()); + } + + + /** + * Saves a new alias for a given WebAuthn credential. + * + * @param string $id + * @param string $alias + * @return bool + */ + public function renameCredential(string $id, string $alias): bool + { + return boolval($this->webAuthnCredentials()->whereKey($id)->update(['alias' => $alias])); + } + + + /** + * Removes one or more credentials previously registered. + * + * @param string|array $id + * @return void + */ + public function flushCredential($id): void + { + if (! $this->relationLoaded('webAuthnCredentials')) { + $this->webAuthnCredentials()->whereKey($id)->delete(); + + return; + } + + if ($this->webAuthnCredentials instanceof Collection && $this->webAuthnCredentials->isNotEmpty()) { + $this->webAuthnCredentials->whereIn('id', $id)->each->delete(); + + $this->setRelation('webAuthnCredentials', $this->webAuthnCredentials->whereNotIn('id', $id)); + } + } + + + /** + * Sends a webauthn recovery email to the user. + * + * @param string $token + * + * @return void + */ + public function sendWebauthnRecoveryNotification(string $token): void + { + // $accountRecoveryNotification = new WebauthnRecoveryNotification($token); + // $accountRecoveryNotification->toMailUsing(null); + + // $accountRecoveryNotification->createUrlUsing(function(mixed $notifiable, string $token) { + // $url = url( + // route( + // 'webauthn.recover', + // [ + // 'token' => $token, + // 'email' => $notifiable->getEmailForPasswordReset(), + // ], + // false + // ) + // ); + + // return $url; + // }); + + $this->notify(new WebauthnRecoveryNotification($token)); + + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 4442930b..0540452a 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -4,18 +4,16 @@ use Illuminate\Auth\Notifications\ResetPassword; use Illuminate\Notifications\Notifiable; -use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; use Laravel\Passport\HasApiTokens; use Illuminate\Support\Facades\Log; use Illuminate\Database\Eloquent\Factories\HasFactory; -use DarkGhostHunter\Larapass\Contracts\WebAuthnAuthenticatable; -use DarkGhostHunter\Larapass\WebAuthnAuthentication; -use DarkGhostHunter\Larapass\Notifications\AccountRecoveryNotification; +use Laragear\WebAuthn\WebAuthnAuthentication; +use App\Models\Traits\WebAuthnManageCredentials; class User extends Authenticatable implements WebAuthnAuthenticatable { - use WebAuthnAuthentication; + use WebAuthnAuthentication, WebAuthnManageCredentials; use HasApiTokens, HasFactory, Notifiable; /** @@ -30,16 +28,17 @@ class User extends Authenticatable implements WebAuthnAuthenticatable /** * The attributes that should be hidden for serialization. * - * @var array + * @var array */ protected $hidden = [ - 'password', 'remember_token', + 'password', + 'remember_token', ]; /** * The attributes that should be cast. * - * @var array + * @var array */ protected $casts = [ 'email_verified_at' => 'datetime', @@ -67,33 +66,20 @@ public function setEmailAttribute($value) : void $this->attributes['email'] = strtolower($value); } + /** - * Sends a credential recovery email to the user. + * Returns an WebAuthnAuthenticatable user from a given Credential ID. * - * @param string $token - * - * @return void + * @param string $id + * @return WebAuthnAuthenticatable|null */ - public function sendCredentialRecoveryNotification(string $token): void + public static function getFromCredentialId(string $id): ?WebAuthnAuthenticatable { - $accountRecoveryNotification = new AccountRecoveryNotification($token); - $accountRecoveryNotification->toMailUsing(null); - - $accountRecoveryNotification->createUrlUsing(function(mixed $notifiable, string $token) { - $url = url( - route( - 'webauthn.recover', - [ - 'token' => $token, - 'email' => $notifiable->getEmailForPasswordReset(), - ], - false - ) - ); - - return $url; - }); - - $this->notify($accountRecoveryNotification); + return static::whereHas( + 'webauthnCredentials', + static function ($query) use ($id) { + return $query->whereKey($id); + } + )->first(); } } diff --git a/app/Models/WebAuthnAuthenticatable.php b/app/Models/WebAuthnAuthenticatable.php new file mode 100644 index 00000000..f1d84a90 --- /dev/null +++ b/app/Models/WebAuthnAuthenticatable.php @@ -0,0 +1,43 @@ +token = $token; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + return ['mail']; + } + + /** + * Get the mail representation of the notification. + * + * @param mixed $notifiable + * @return \Illuminate\Notifications\Messages\MailMessage + */ + public function toMail($notifiable) + { + // if (static::$toMailCallback) { + // return call_user_func(static::$toMailCallback, $notifiable, $this->token); + // } + + // if (static::$createUrlCallback) { + // $url = call_user_func(static::$createUrlCallback, $notifiable, $this->token); + // } else { + $url = url( + route( + 'webauthn.recover', + [ + 'token' => $this->token, + 'email' => $notifiable->getEmailForPasswordReset(), + ], + false + ) + ); + // } + + return (new MailMessage) + ->subject(Lang::get('Account Recovery Notification')) + ->line( + Lang::get( + 'You are receiving this email because we received an account recovery request for your account.' + ) + ) + ->action(Lang::get('Recover Account'), $url) + ->line( + Lang::get( + 'This recovery link will expire in :count minutes.', + ['count' => config('auth.passwords.webauthn.expire')] + ) + ) + ->line(Lang::get('If you did not request an account recovery, no further action is required.')); + } + + // /** + // * Set a callback that should be used when creating the reset password button URL. + // * + // * @param \Closure|null $callback + // * + // * @return void + // */ + // public static function createUrlUsing(?Closure $callback): void + // { + // static::$createUrlCallback = $callback; + // } + + // /** + // * Set a callback that should be used when building the notification mail message. + // * + // * @param \Closure|null $callback + // * + // * @return void + // */ + // public static function toMailUsing(?Closure $callback): void + // { + // static::$toMailCallback = $callback; + // } +} diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 06f5b637..60d11dbb 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -5,20 +5,63 @@ use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; use Illuminate\Support\Facades\Auth; use App\Services\Auth\ReverseProxyGuard; -use App\Extensions\EloquentTwoFAuthProvider; use App\Extensions\RemoteUserProvider; -use DarkGhostHunter\Larapass\WebAuthn\WebAuthnAssertValidator; -use Illuminate\Contracts\Hashing\Hasher; +use App\Facades\Settings; +use Illuminate\Support\Facades\Config; +use RuntimeException; +use App\Extensions\WebauthnCredentialBroker; +use Illuminate\Auth\Passwords\DatabaseTokenRepository; +use Illuminate\Support\Str; class AuthServiceProvider extends ServiceProvider { /** - * The policy mappings for the application. + * The model to policy mappings for the application. * + * @var array */ - // protected $policies = [ - // 'App\Models\Model' => 'App\Policies\ModelPolicy', - // ]; + protected $policies = [ + // 'App\Models\Model' => 'App\Policies\ModelPolicy', + ]; + + + /** + * Register the service provider. + * + * @return void + * @throws \Illuminate\Contracts\Container\BindingResolutionException + */ + public function register(): void + { + + $this->app->singleton( + WebauthnCredentialBroker::class, + static function ($app) { + if (!$config = $app['config']['auth.passwords.webauthn']) { + throw new RuntimeException('You must set the [webauthn] key broker in [auth] config.'); + } + + $key = $app['config']['app.key']; + + if (Str::startsWith($key, 'base64:')) { + $key = base64_decode(substr($key, 7)); + } + + return new WebauthnCredentialBroker( + new DatabaseTokenRepository( + $app['db']->connection($config['connection'] ?? null), + $app['hash'], + $config['table'], + $key, + $config['expire'], + $config['throttle'] ?? 0 + ), + $app['auth']->createUserProvider($config['provider'] ?? null) + ); + } + ); + } + /** * Register any authentication / authorization services. @@ -29,24 +72,6 @@ public function boot() { $this->registerPolicies(); - // We use our own user provider derived from the Larapass user provider. - // The only difference between the 2 providers is that the custom one sets - // the webauthn fallback setting with 2FAuth's 'useWebauthnOnly' option - // value instead of the 'larapass.fallback' config value. - // This way we can offer the user to change this setting from the 2FAuth UI - // rather than from the .env file. - Auth::provider( - 'eloquent-2fauth', - static function ($app, $config) { - return new EloquentTwoFAuthProvider( - $app['config'], - $app[WebAuthnAssertValidator::class], - $app[Hasher::class], - $config['model'] - ); - } - ); - // Register a custom provider for reverse-proxy authentication Auth::provider('remote-user', function ($app, array $config) { // Return an instance of Illuminate\Contracts\Auth\UserProvider... @@ -62,6 +87,24 @@ static function ($app, $config) { }); + // Previously we were using a custom user provider derived from the Larapass user provider + // in order to honor the "useWebauthnOnly" user option. + // Since Laragear\WebAuthn now replaces DarkGhostHunter\Larapass, the new approach is + // simplier: We overload the 'eloquent-webauthn' registration from Laragear\WebAuthn\WebAuthnServiceProvider + // with a custom closure that uses the "useWebauthnOnly" user option + Auth::provider( + 'eloquent-webauthn', + static function (\Illuminate\Contracts\Foundation\Application $app, array $config): \Laragear\WebAuthn\Auth\WebAuthnUserProvider { + return new \Laragear\WebAuthn\Auth\WebAuthnUserProvider( + $app->make('hash'), + $config['model'], + $app->make(\Laragear\WebAuthn\Assertion\Validator\AssertionValidator::class), + Settings::get('useWebauthnOnly') ? false : true + ); + } + ); + + // Normally we should set the Passport routes here using Passport::routes(). // If so the passport routes would be set for both 'web' and 'api' middlewares without // possibility to exclude the web middleware (we can only pass additional middlewares to Passport::routes()) diff --git a/composer.json b/composer.json index 4e2c4bf4..76de7992 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,7 @@ "ext-tokenizer": "*", "ext-xml": "*", "chillerlan/php-qrcode": "^4.3", - "darkghosthunter/larapass": "^3.0.2", + "laragear/webauthn": "^1.1.0", "doctormckay/steam-totp": "^1.0", "doctrine/dbal": "^3.4", "fruitcake/laravel-cors": "^2.0", diff --git a/composer.lock b/composer.lock index a78bfbea..d61e2350 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "1071757c859f11e167fb7721d20774a5", + "content-hash": "c1eb8a99b34305b0e8960f37ebafe283", "packages": [ { "name": "asm89/stack-cors", @@ -131,26 +131,26 @@ }, { "name": "brick/math", - "version": "0.9.3", + "version": "0.10.2", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae" + "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae", - "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae", + "url": "https://api.github.com/repos/brick/math/zipball/459f2781e1a08d52ee56b0b1444086e038561e3f", + "reference": "459f2781e1a08d52ee56b0b1444086e038561e3f", "shasum": "" }, "require": { "ext-json": "*", - "php": "^7.1 || ^8.0" + "php": "^7.4 || ^8.0" }, "require-dev": { "php-coveralls/php-coveralls": "^2.2", - "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", - "vimeo/psalm": "4.9.2" + "phpunit/phpunit": "^9.0", + "vimeo/psalm": "4.25.0" }, "type": "library", "autoload": { @@ -175,19 +175,15 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.9.3" + "source": "https://github.com/brick/math/tree/0.10.2" }, "funding": [ { "url": "https://github.com/BenMorel", "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/brick/math", - "type": "tidelift" } ], - "time": "2021-08-15T20:50:18+00:00" + "time": "2022-08-10T22:54:19+00:00" }, { "name": "chillerlan/php-qrcode", @@ -331,83 +327,6 @@ ], "time": "2022-07-05T22:32:14+00:00" }, - { - "name": "darkghosthunter/larapass", - "version": "v3.0.2", - "source": { - "type": "git", - "url": "https://github.com/DarkGhostHunter/Larapass.git", - "reference": "d12c3da078c5adc78229f0711176e856cb73e9cf" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/DarkGhostHunter/Larapass/zipball/d12c3da078c5adc78229f0711176e856cb73e9cf", - "reference": "d12c3da078c5adc78229f0711176e856cb73e9cf", - "shasum": "" - }, - "require": { - "ext-json": "*", - "illuminate/support": "^8.0", - "nyholm/psr7": "^1.3", - "php": ">=7.4.0", - "ramsey/uuid": "^4.0", - "symfony/psr-http-message-bridge": "^2.0", - "thecodingmachine/safe": "^1.3.3", - "web-auth/webauthn-lib": "^3.3" - }, - "require-dev": { - "laravel/framework": "8.*", - "orchestra/testbench": "^6.7.2", - "phpunit/phpunit": "^9.5.2" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "DarkGhostHunter\\Larapass\\LarapassServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "DarkGhostHunter\\Larapass\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Italo Israel Baeza Cabrera", - "email": "darkghosthunter@gmail.com", - "role": "Developer" - } - ], - "description": "Authenticate users with just their device, fingerprint or biometric data. Goodbye passwords!", - "homepage": "https://github.com/darkghosthunter/larapass", - "keywords": [ - "darkghosthunter", - "laravel", - "webauthn" - ], - "support": { - "issues": "https://github.com/DarkGhostHunter/Larapass/issues", - "source": "https://github.com/DarkGhostHunter/Larapass/tree/v3.0.2" - }, - "funding": [ - { - "url": "https://paypal.me/darkghosthunter", - "type": "custom" - }, - { - "url": "https://ko-fi.com/DarkGhostHunter", - "type": "ko_fi" - } - ], - "abandoned": true, - "time": "2021-11-01T21:17:29+00:00" - }, { "name": "defuse/php-encryption", "version": "v2.3.1", @@ -1155,27 +1074,27 @@ }, { "name": "egulias/email-validator", - "version": "2.1.25", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/egulias/EmailValidator.git", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" + "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", - "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/f88dcf4b14af14a98ad96b14b2b317969eab6715", + "reference": "f88dcf4b14af14a98ad96b14b2b317969eab6715", "shasum": "" }, "require": { - "doctrine/lexer": "^1.0.1", - "php": ">=5.5", - "symfony/polyfill-intl-idn": "^1.10" + "doctrine/lexer": "^1.2", + "php": ">=7.2", + "symfony/polyfill-intl-idn": "^1.15" }, "require-dev": { - "dominicsayers/isemail": "^3.0.7", - "phpunit/phpunit": "^4.8.36|^7.5.15", - "satooshi/php-coveralls": "^1.0.1" + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^8.5.8|^9.3.3", + "vimeo/psalm": "^4" }, "suggest": { "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" @@ -1183,7 +1102,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -1211,7 +1130,7 @@ ], "support": { "issues": "https://github.com/egulias/EmailValidator/issues", - "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + "source": "https://github.com/egulias/EmailValidator/tree/3.2.1" }, "funding": [ { @@ -1219,82 +1138,7 @@ "type": "github" } ], - "time": "2020-12-29T14:50:06+00:00" - }, - { - "name": "fgrosse/phpasn1", - "version": "v2.4.0", - "source": { - "type": "git", - "url": "https://github.com/fgrosse/PHPASN1.git", - "reference": "eef488991d53e58e60c9554b09b1201ca5ba9296" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/fgrosse/PHPASN1/zipball/eef488991d53e58e60c9554b09b1201ca5ba9296", - "reference": "eef488991d53e58e60c9554b09b1201ca5ba9296", - "shasum": "" - }, - "require": { - "php": "~7.1.0 || ~7.2.0 || ~7.3.0 || ~7.4.0 || ~8.0.0 || ~8.1.0" - }, - "require-dev": { - "php-coveralls/php-coveralls": "~2.0", - "phpunit/phpunit": "^6.3 || ^7.0 || ^8.0" - }, - "suggest": { - "ext-bcmath": "BCmath is the fallback extension for big integer calculations", - "ext-curl": "For loading OID information from the web if they have not bee defined statically", - "ext-gmp": "GMP is the preferred extension for big integer calculations", - "phpseclib/bcmath_compat": "BCmath polyfill for servers where neither GMP nor BCmath is available" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "FG\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Friedrich Große", - "email": "friedrich.grosse@gmail.com", - "homepage": "https://github.com/FGrosse", - "role": "Author" - }, - { - "name": "All contributors", - "homepage": "https://github.com/FGrosse/PHPASN1/contributors" - } - ], - "description": "A PHP Framework that allows you to encode and decode arbitrary ASN.1 structures using the ITU-T X.690 Encoding Rules.", - "homepage": "https://github.com/FGrosse/PHPASN1", - "keywords": [ - "DER", - "asn.1", - "asn1", - "ber", - "binary", - "decoding", - "encoding", - "x.509", - "x.690", - "x509", - "x690" - ], - "support": { - "issues": "https://github.com/fgrosse/PHPASN1/issues", - "source": "https://github.com/fgrosse/PHPASN1/tree/v2.4.0" - }, - "time": "2021-12-11T12:41:06+00:00" + "time": "2022-06-18T20:57:19+00:00" }, { "name": "firebase/php-jwt", @@ -1438,17 +1282,88 @@ "time": "2022-02-23T14:25:13+00:00" }, { - "name": "google/protobuf", - "version": "v3.21.7", + "name": "fruitcake/php-cors", + "version": "v1.2.0", "source": { "type": "git", - "url": "https://github.com/protocolbuffers/protobuf-php.git", - "reference": "56505903b395c5d38cbf4c8575bfef4f4c9d4c30" + "url": "https://github.com/fruitcake/php-cors.git", + "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/56505903b395c5d38cbf4c8575bfef4f4c9d4c30", - "reference": "56505903b395c5d38cbf4c8575bfef4f4c9d4c30", + "url": "https://api.github.com/repos/fruitcake/php-cors/zipball/58571acbaa5f9f462c9c77e911700ac66f446d4e", + "reference": "58571acbaa5f9f462c9c77e911700ac66f446d4e", + "shasum": "" + }, + "require": { + "php": "^7.4|^8.0", + "symfony/http-foundation": "^4.4|^5.4|^6" + }, + "require-dev": { + "phpstan/phpstan": "^1.4", + "phpunit/phpunit": "^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "Fruitcake\\Cors\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fruitcake", + "homepage": "https://fruitcake.nl" + }, + { + "name": "Barryvdh", + "email": "barryvdh@gmail.com" + } + ], + "description": "Cross-origin resource sharing library for the Symfony HttpFoundation", + "homepage": "https://github.com/fruitcake/php-cors", + "keywords": [ + "cors", + "laravel", + "symfony" + ], + "support": { + "issues": "https://github.com/fruitcake/php-cors/issues", + "source": "https://github.com/fruitcake/php-cors/tree/v1.2.0" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2022-02-20T15:07:15+00:00" + }, + { + "name": "google/protobuf", + "version": "v3.21.8", + "source": { + "type": "git", + "url": "https://github.com/protocolbuffers/protobuf-php.git", + "reference": "6377c52338fd18634dddf6becfde94b8b16cd9f5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/6377c52338fd18634dddf6becfde94b8b16cd9f5", + "reference": "6377c52338fd18634dddf6becfde94b8b16cd9f5", "shasum": "" }, "require": { @@ -1477,9 +1392,9 @@ "proto" ], "support": { - "source": "https://github.com/protocolbuffers/protobuf-php/tree/v3.21.7" + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v3.21.8" }, - "time": "2022-09-29T21:58:56+00:00" + "time": "2022-10-18T18:22:00+00:00" }, { "name": "graham-campbell/result-type", @@ -1930,57 +1845,154 @@ "time": "2021-07-13T18:46:38+00:00" }, { - "name": "laravel/framework", - "version": "v8.83.25", + "name": "laragear/webauthn", + "version": "v1.1.4", "source": { "type": "git", - "url": "https://github.com/laravel/framework.git", - "reference": "b77b908a9426efa41d6286a2ef4c3adbf5398ca1" + "url": "https://github.com/Laragear/WebAuthn.git", + "reference": "e2af6a8395095b78996a5096103141c9744c3e57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/b77b908a9426efa41d6286a2ef4c3adbf5398ca1", - "reference": "b77b908a9426efa41d6286a2ef4c3adbf5398ca1", + "url": "https://api.github.com/repos/Laragear/WebAuthn/zipball/e2af6a8395095b78996a5096103141c9744c3e57", + "reference": "e2af6a8395095b78996a5096103141c9744c3e57", "shasum": "" }, "require": { - "doctrine/inflector": "^1.4|^2.0", - "dragonmantank/cron-expression": "^3.0.2", - "egulias/email-validator": "^2.1.10", "ext-json": "*", + "ext-openssl": "*", + "illuminate/auth": "9.*", + "illuminate/config": "9.*", + "illuminate/database": "9.*", + "illuminate/encryption": "9.*", + "illuminate/http": "9.*", + "illuminate/session": "9.*", + "illuminate/support": "9.*", + "php": ">=8.0.2" + }, + "require-dev": { + "jetbrains/phpstorm-attributes": "^1.0", + "mockery/mockery": "^1.5", + "orchestra/testbench": "7.*", + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Laragear\\WebAuthn\\WebAuthnServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laragear\\WebAuthn\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lukas Buchs", + "role": "Original developer" + }, + { + "name": "Italo Israel Baeza Cabrera", + "email": "DarkGhostHunter@Gmail.com", + "homepage": "https://patreon.com/packagesforlaravel", + "role": "Developer" + } + ], + "description": "Authenticate your users with biometric data, devices or USB keys.", + "homepage": "https://github.com/laragear/webauthn", + "keywords": [ + "Authentication", + "faceid", + "laravel", + "passkeys", + "touchid", + "webauthn", + "windows hello" + ], + "support": { + "issues": "https://github.com/Laragear/TwoFactor/issues", + "source": "https://github.com/Laragear/TwoFactor" + }, + "funding": [ + { + "url": "https://www.buymeacoffee.com/darkghosthunter", + "type": "Buy me a cofee" + }, + { + "url": "https://ko-fi.com/DarkGhostHunter", + "type": "Ko-Fi" + }, + { + "url": "https://patreon.com/PackagesForLaravel", + "type": "Patreon" + }, + { + "url": "https://paypal.me/darkghosthunter", + "type": "Paypal" + } + ], + "time": "2022-11-11T21:30:09+00:00" + }, + { + "name": "laravel/framework", + "version": "v9.36.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "80ba0561b3682b96743e1c152fde0698bbdb2412" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/80ba0561b3682b96743e1c152fde0698bbdb2412", + "reference": "80ba0561b3682b96743e1c152fde0698bbdb2412", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^2.0", + "dragonmantank/cron-expression": "^3.3.2", + "egulias/email-validator": "^3.2.1", "ext-mbstring": "*", "ext-openssl": "*", - "laravel/serializable-closure": "^1.0", - "league/commonmark": "^1.3|^2.0.2", - "league/flysystem": "^1.1", + "fruitcake/php-cors": "^1.2", + "laravel/serializable-closure": "^1.2.2", + "league/commonmark": "^2.2", + "league/flysystem": "^3.0.16", "monolog/monolog": "^2.0", - "nesbot/carbon": "^2.53.1", - "opis/closure": "^3.6", - "php": "^7.3|^8.0", - "psr/container": "^1.0", - "psr/log": "^1.0|^2.0", - "psr/simple-cache": "^1.0", + "nesbot/carbon": "^2.62.1", + "nunomaduro/termwind": "^1.13", + "php": "^8.0.2", + "psr/container": "^1.1.1|^2.0.1", + "psr/log": "^1.0|^2.0|^3.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", "ramsey/uuid": "^4.2.2", - "swiftmailer/swiftmailer": "^6.3", - "symfony/console": "^5.4", - "symfony/error-handler": "^5.4", - "symfony/finder": "^5.4", - "symfony/http-foundation": "^5.4", - "symfony/http-kernel": "^5.4", - "symfony/mime": "^5.4", - "symfony/process": "^5.4", - "symfony/routing": "^5.4", - "symfony/var-dumper": "^5.4", - "tijsverkoyen/css-to-inline-styles": "^2.2.2", + "symfony/console": "^6.0.9", + "symfony/error-handler": "^6.0", + "symfony/finder": "^6.0", + "symfony/http-foundation": "^6.0", + "symfony/http-kernel": "^6.0", + "symfony/mailer": "^6.0", + "symfony/mime": "^6.0", + "symfony/process": "^6.0", + "symfony/routing": "^6.0", + "symfony/uid": "^6.0", + "symfony/var-dumper": "^6.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.5", "vlucas/phpdotenv": "^5.4.1", - "voku/portable-ascii": "^1.6.1" + "voku/portable-ascii": "^2.0" }, "conflict": { "tightenco/collect": "<5.5.33" }, "provide": { - "psr/container-implementation": "1.0", - "psr/simple-cache-implementation": "1.0" + "psr/container-implementation": "1.1|2.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0" }, "replace": { "illuminate/auth": "self.version", @@ -1988,6 +2000,7 @@ "illuminate/bus": "self.version", "illuminate/cache": "self.version", "illuminate/collections": "self.version", + "illuminate/conditionable": "self.version", "illuminate/config": "self.version", "illuminate/console": "self.version", "illuminate/container": "self.version", @@ -2016,21 +2029,27 @@ "illuminate/view": "self.version" }, "require-dev": { - "aws/aws-sdk-php": "^3.198.1", + "ably/ably-php": "^1.0", + "aws/aws-sdk-php": "^3.235.5", "doctrine/dbal": "^2.13.3|^3.1.4", - "filp/whoops": "^2.14.3", - "guzzlehttp/guzzle": "^6.5.5|^7.0.1", - "league/flysystem-cached-adapter": "^1.0", - "mockery/mockery": "^1.4.4", - "orchestra/testbench-core": "^6.27", + "fakerphp/faker": "^1.9.2", + "guzzlehttp/guzzle": "^7.5", + "league/flysystem-aws-s3-v3": "^3.0", + "league/flysystem-ftp": "^3.0", + "league/flysystem-path-prefixing": "^3.3", + "league/flysystem-read-only": "^3.3", + "league/flysystem-sftp-v3": "^3.0", + "mockery/mockery": "^1.5.1", + "orchestra/testbench-core": "^7.11", "pda/pheanstalk": "^4.0", - "phpunit/phpunit": "^8.5.19|^9.5.8", - "predis/predis": "^1.1.9", - "symfony/cache": "^5.4" + "phpstan/phpstan": "^1.4.7", + "phpunit/phpunit": "^9.5.8", + "predis/predis": "^1.1.9|^2.0.2", + "symfony/cache": "^6.0" }, "suggest": { "ably/ably-php": "Required to use the Ably broadcast driver (^1.0).", - "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.198.1).", + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage, and SES mail driver (^3.235.5).", "brianium/paratest": "Required to run tests in parallel (^6.0).", "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).", "ext-bcmath": "Required to use the multiple_of validation rule.", @@ -2042,27 +2061,31 @@ "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", "filp/whoops": "Required for friendly error pages in development (^2.14.3).", - "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.5.5|^7.0.1).", + "guzzlehttp/guzzle": "Required to use the HTTP Client and the ping methods on schedules (^7.5).", "laravel/tinker": "Required to use the tinker console command (^2.0).", - "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", - "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", - "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", - "mockery/mockery": "Required to use mocking (^1.4.4).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^3.0).", + "league/flysystem-ftp": "Required to use the Flysystem FTP driver (^3.0).", + "league/flysystem-path-prefixing": "Required to use the scoped driver (^3.3).", + "league/flysystem-read-only": "Required to use read-only disks (^3.3)", + "league/flysystem-sftp-v3": "Required to use the Flysystem SFTP driver (^3.0).", + "mockery/mockery": "Required to use mocking (^1.5.1).", "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", - "phpunit/phpunit": "Required to use assertions and run tests (^8.5.19|^9.5.8).", - "predis/predis": "Required to use the predis connector (^1.1.9).", + "phpunit/phpunit": "Required to use assertions and run tests (^9.5.8).", + "predis/predis": "Required to use the predis connector (^1.1.9|^2.0.2).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", - "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0|^5.0|^6.0|^7.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^5.4).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^5.4).", - "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).", - "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^6.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^6.0).", + "symfony/http-client": "Required to enable support for the Symfony API mail transports (^6.0).", + "symfony/mailgun-mailer": "Required to enable support for the Mailgun mail transport (^6.0).", + "symfony/postmark-mailer": "Required to enable support for the Postmark mail transport (^6.0).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "8.x-dev" + "dev-master": "9.x-dev" } }, "autoload": { @@ -2076,7 +2099,8 @@ "Illuminate\\": "src/Illuminate/", "Illuminate\\Support\\": [ "src/Illuminate/Macroable/", - "src/Illuminate/Collections/" + "src/Illuminate/Collections/", + "src/Illuminate/Conditionable/" ] } }, @@ -2100,50 +2124,50 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2022-09-30T13:00:40+00:00" + "time": "2022-10-19T13:23:53+00:00" }, { "name": "laravel/passport", - "version": "v10.4.1", + "version": "v11.2.1", "source": { "type": "git", "url": "https://github.com/laravel/passport.git", - "reference": "b62b418a6d9e9aca231a587be0fc14dc55cd8d77" + "reference": "5a26d6cbf56544c9f56994c6978f8fbe4d82bb33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/passport/zipball/b62b418a6d9e9aca231a587be0fc14dc55cd8d77", - "reference": "b62b418a6d9e9aca231a587be0fc14dc55cd8d77", + "url": "https://api.github.com/repos/laravel/passport/zipball/5a26d6cbf56544c9f56994c6978f8fbe4d82bb33", + "reference": "5a26d6cbf56544c9f56994c6978f8fbe4d82bb33", "shasum": "" }, "require": { "ext-json": "*", "firebase/php-jwt": "^6.0", - "illuminate/auth": "^8.37|^9.0", - "illuminate/console": "^8.37|^9.0", - "illuminate/container": "^8.37|^9.0", - "illuminate/contracts": "^8.37|^9.0", - "illuminate/cookie": "^8.37|^9.0", - "illuminate/database": "^8.37|^9.0", - "illuminate/encryption": "^8.37|^9.0", - "illuminate/http": "^8.37|^9.0", - "illuminate/support": "^8.37|^9.0", + "illuminate/auth": "^9.0", + "illuminate/console": "^9.0", + "illuminate/container": "^9.0", + "illuminate/contracts": "^9.0", + "illuminate/cookie": "^9.0", + "illuminate/database": "^9.0", + "illuminate/encryption": "^9.0", + "illuminate/http": "^9.0", + "illuminate/support": "^9.0", "lcobucci/jwt": "^3.4|^4.0", "league/oauth2-server": "^8.2", "nyholm/psr7": "^1.3", - "php": "^7.3|^8.0", + "php": "^8.0", "phpseclib/phpseclib": "^2.0|^3.0", "symfony/psr-http-message-bridge": "^2.0" }, "require-dev": { "mockery/mockery": "^1.0", - "orchestra/testbench": "^6.0|^7.0", + "orchestra/testbench": "^7.0", "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "10.x-dev" + "dev-master": "11.x-dev" }, "laravel": { "providers": [ @@ -2177,7 +2201,7 @@ "issues": "https://github.com/laravel/passport/issues", "source": "https://github.com/laravel/passport" }, - "time": "2022-04-16T13:38:08+00:00" + "time": "2022-09-29T15:52:25+00:00" }, { "name": "laravel/serializable-closure", @@ -2747,54 +2771,49 @@ }, { "name": "league/flysystem", - "version": "1.1.10", + "version": "3.9.0", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" + "reference": "60f3760352fe08e918bc3b1acae4e91af092ebe1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", - "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/60f3760352fe08e918bc3b1acae4e91af092ebe1", + "reference": "60f3760352fe08e918bc3b1acae4e91af092ebe1", "shasum": "" }, "require": { - "ext-fileinfo": "*", - "league/mime-type-detection": "^1.3", - "php": "^7.2.5 || ^8.0" + "league/mime-type-detection": "^1.0.0", + "php": "^8.0.2" }, "conflict": { - "league/flysystem-sftp": "<1.0.6" + "aws/aws-sdk-php": "3.209.31 || 3.210.0", + "guzzlehttp/guzzle": "<7.0", + "guzzlehttp/ringphp": "<1.1.1", + "phpseclib/phpseclib": "3.0.15", + "symfony/http-client": "<5.2" }, "require-dev": { - "phpspec/prophecy": "^1.11.1", - "phpunit/phpunit": "^8.5.8" - }, - "suggest": { - "ext-ftp": "Allows you to use FTP server storage", - "ext-openssl": "Allows you to use FTPS server storage", - "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", - "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", - "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", - "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", - "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", - "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", - "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", - "league/flysystem-webdav": "Allows you to use WebDAV storage", - "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", - "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", - "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + "async-aws/s3": "^1.5", + "async-aws/simple-s3": "^1.0", + "aws/aws-sdk-php": "^3.198.1", + "composer/semver": "^3.0", + "ext-fileinfo": "*", + "ext-ftp": "*", + "ext-zip": "*", + "friendsofphp/php-cs-fixer": "^3.5", + "google/cloud-storage": "^1.23", + "microsoft/azure-storage-blob": "^1.1", + "phpseclib/phpseclib": "^3.0.14", + "phpstan/phpstan": "^0.12.26", + "phpunit/phpunit": "^9.5.11", + "sabre/dav": "^4.3.1" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.1-dev" - } - }, "autoload": { "psr-4": { - "League\\Flysystem\\": "src/" + "League\\Flysystem\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -2804,40 +2823,42 @@ "authors": [ { "name": "Frank de Jonge", - "email": "info@frenky.net" + "email": "info@frankdejonge.nl" } ], - "description": "Filesystem abstraction: Many filesystems, one API.", + "description": "File storage abstraction for PHP", "keywords": [ - "Cloud Files", "WebDAV", - "abstraction", "aws", "cloud", - "copy.com", - "dropbox", - "file systems", + "file", "files", "filesystem", "filesystems", "ftp", - "rackspace", - "remote", "s3", "sftp", "storage" ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.1.10" + "source": "https://github.com/thephpleague/flysystem/tree/3.9.0" }, "funding": [ { - "url": "https://offset.earth/frankdejonge", - "type": "other" + "url": "https://ecologi.com/frankdejonge", + "type": "custom" + }, + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" } ], - "time": "2022-10-04T09:16:37+00:00" + "time": "2022-10-18T21:02:43+00:00" }, { "name": "league/mime-type-detection", @@ -3560,6 +3581,92 @@ }, "time": "2022-09-04T07:30:47+00:00" }, + { + "name": "nunomaduro/termwind", + "version": "v1.14.1", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/termwind.git", + "reference": "86fc30eace93b9b6d4c844ba6de76db84184e01b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/86fc30eace93b9b6d4c844ba6de76db84184e01b", + "reference": "86fc30eace93b9b6d4c844ba6de76db84184e01b", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": "^8.0", + "symfony/console": "^5.3.0|^6.0.0" + }, + "require-dev": { + "ergebnis/phpstan-rules": "^1.0.", + "illuminate/console": "^8.0|^9.0", + "illuminate/support": "^8.0|^9.0", + "laravel/pint": "^1.0.0", + "pestphp/pest": "^1.21.0", + "pestphp/pest-plugin-mock": "^1.0", + "phpstan/phpstan": "^1.4.6", + "phpstan/phpstan-strict-rules": "^1.1.0", + "symfony/var-dumper": "^5.2.7|^6.0.0", + "thecodingmachine/phpstan-strict-rules": "^1.0.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Termwind\\Laravel\\TermwindServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/Functions.php" + ], + "psr-4": { + "Termwind\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Its like Tailwind CSS, but for the console.", + "keywords": [ + "cli", + "console", + "css", + "package", + "php", + "style" + ], + "support": { + "issues": "https://github.com/nunomaduro/termwind/issues", + "source": "https://github.com/nunomaduro/termwind/tree/v1.14.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/xiCO2k", + "type": "github" + } + ], + "time": "2022-10-17T15:20:29+00:00" + }, { "name": "nyholm/psr7", "version": "1.5.1", @@ -3637,71 +3744,6 @@ ], "time": "2022-06-22T07:13:36+00:00" }, - { - "name": "opis/closure", - "version": "3.6.3", - "source": { - "type": "git", - "url": "https://github.com/opis/closure.git", - "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/opis/closure/zipball/3d81e4309d2a927abbe66df935f4bb60082805ad", - "reference": "3d81e4309d2a927abbe66df935f4bb60082805ad", - "shasum": "" - }, - "require": { - "php": "^5.4 || ^7.0 || ^8.0" - }, - "require-dev": { - "jeremeamia/superclosure": "^2.0", - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.6.x-dev" - } - }, - "autoload": { - "files": [ - "functions.php" - ], - "psr-4": { - "Opis\\Closure\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marius Sarca", - "email": "marius.sarca@gmail.com" - }, - { - "name": "Sorin Sarca", - "email": "sarca_sorin@hotmail.com" - } - ], - "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", - "homepage": "https://opis.io/closure", - "keywords": [ - "anonymous functions", - "closure", - "function", - "serializable", - "serialization", - "serialize" - ], - "support": { - "issues": "https://github.com/opis/closure/issues", - "source": "https://github.com/opis/closure/tree/3.6.3" - }, - "time": "2022-01-27T09:35:39+00:00" - }, { "name": "paragonie/constant_time_encoding", "version": "v2.6.3", @@ -4109,22 +4151,27 @@ }, { "name": "psr/container", - "version": "1.1.2", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/php-fig/container.git", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", - "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", "shasum": "" }, "require": { "php": ">=7.4.0" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, "autoload": { "psr-4": { "Psr\\Container\\": "src/" @@ -4151,9 +4198,9 @@ ], "support": { "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.2" + "source": "https://github.com/php-fig/container/tree/2.0.2" }, - "time": "2021-11-05T16:50:12+00:00" + "time": "2021-11-05T16:47:00+00:00" }, { "name": "psr/event-dispatcher", @@ -4367,30 +4414,30 @@ }, { "name": "psr/log", - "version": "1.1.4", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/log.git", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", - "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "3.x-dev" } }, "autoload": { "psr-4": { - "Psr\\Log\\": "Psr/Log/" + "Psr\\Log\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -4411,31 +4458,31 @@ "psr-3" ], "support": { - "source": "https://github.com/php-fig/log/tree/1.1.4" + "source": "https://github.com/php-fig/log/tree/3.0.0" }, - "time": "2021-05-03T11:20:27+00:00" + "time": "2021-07-14T16:46:02+00:00" }, { "name": "psr/simple-cache", - "version": "1.0.1", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/php-fig/simple-cache.git", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", - "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/764e0b3939f5ca87cb904f570ef9be2d78a07865", + "reference": "764e0b3939f5ca87cb904f570ef9be2d78a07865", "shasum": "" }, "require": { - "php": ">=5.3.0" + "php": ">=8.0.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -4450,7 +4497,7 @@ "authors": [ { "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" + "homepage": "https://www.php-fig.org/" } ], "description": "Common interfaces for simple caching", @@ -4462,9 +4509,9 @@ "simple-cache" ], "support": { - "source": "https://github.com/php-fig/simple-cache/tree/master" + "source": "https://github.com/php-fig/simple-cache/tree/3.0.0" }, - "time": "2017-10-23T01:57:42+00:00" + "time": "2021-10-29T13:26:27+00:00" }, { "name": "psy/psysh", @@ -4834,27 +4881,27 @@ }, { "name": "spatie/laravel-package-tools", - "version": "1.12.1", + "version": "1.13.6", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "09f80fa240d44fafb1c70657c74ee44ffa929357" + "reference": "c377cc7223655c2278c148c1685b8b5a78af5c65" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/09f80fa240d44fafb1c70657c74ee44ffa929357", - "reference": "09f80fa240d44fafb1c70657c74ee44ffa929357", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/c377cc7223655c2278c148c1685b8b5a78af5c65", + "reference": "c377cc7223655c2278c148c1685b8b5a78af5c65", "shasum": "" }, "require": { - "illuminate/contracts": "^7.0|^8.0|^9.0", - "php": "^7.4|^8.0" + "illuminate/contracts": "^9.28", + "php": "^8.0" }, "require-dev": { - "mockery/mockery": "^1.4", - "orchestra/testbench": "^5.0|^6.23|^7.0", - "phpunit/phpunit": "^9.4", - "spatie/test-time": "^1.2" + "mockery/mockery": "^1.5", + "orchestra/testbench": "^7.7", + "phpunit/phpunit": "^9.5.24", + "spatie/test-time": "^1.3" }, "type": "library", "autoload": { @@ -4881,7 +4928,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.12.1" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.13.6" }, "funding": [ { @@ -4889,152 +4936,7 @@ "type": "github" } ], - "time": "2022-06-28T14:29:26+00:00" - }, - { - "name": "spomky-labs/base64url", - "version": "v2.0.4", - "source": { - "type": "git", - "url": "https://github.com/Spomky-Labs/base64url.git", - "reference": "7752ce931ec285da4ed1f4c5aa27e45e097be61d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/base64url/zipball/7752ce931ec285da4ed1f4c5aa27e45e097be61d", - "reference": "7752ce931ec285da4ed1f4c5aa27e45e097be61d", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "require-dev": { - "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "^0.11|^0.12", - "phpstan/phpstan-beberlei-assert": "^0.11|^0.12", - "phpstan/phpstan-deprecation-rules": "^0.11|^0.12", - "phpstan/phpstan-phpunit": "^0.11|^0.12", - "phpstan/phpstan-strict-rules": "^0.11|^0.12" - }, - "type": "library", - "autoload": { - "psr-4": { - "Base64Url\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Florent Morselli", - "homepage": "https://github.com/Spomky-Labs/base64url/contributors" - } - ], - "description": "Base 64 URL Safe Encoding/Decoding PHP Library", - "homepage": "https://github.com/Spomky-Labs/base64url", - "keywords": [ - "base64", - "rfc4648", - "safe", - "url" - ], - "support": { - "issues": "https://github.com/Spomky-Labs/base64url/issues", - "source": "https://github.com/Spomky-Labs/base64url/tree/v2.0.4" - }, - "funding": [ - { - "url": "https://github.com/Spomky", - "type": "github" - }, - { - "url": "https://www.patreon.com/FlorentMorselli", - "type": "patreon" - } - ], - "time": "2020-11-03T09:10:25+00:00" - }, - { - "name": "spomky-labs/cbor-php", - "version": "v2.1.0", - "source": { - "type": "git", - "url": "https://github.com/Spomky-Labs/cbor-php.git", - "reference": "28e2712cfc0b48fae661a48ffc6896d7abe83684" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Spomky-Labs/cbor-php/zipball/28e2712cfc0b48fae661a48ffc6896d7abe83684", - "reference": "28e2712cfc0b48fae661a48ffc6896d7abe83684", - "shasum": "" - }, - "require": { - "brick/math": "^0.8.15|^0.9.0", - "ext-mbstring": "*", - "php": ">=7.3" - }, - "require-dev": { - "ekino/phpstan-banned-code": "^1.0", - "ext-json": "*", - "infection/infection": "^0.18|^0.25", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-beberlei-assert": "^1.0", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1.0", - "phpunit/phpunit": "^9.5", - "rector/rector": "^0.12", - "roave/security-advisories": "dev-latest", - "symplify/easy-coding-standard": "^10.0" - }, - "suggest": { - "ext-bcmath": "GMP or BCMath extensions will drastically improve the library performance. BCMath extension needed to handle the Big Float and Decimal Fraction Tags", - "ext-gmp": "GMP or BCMath extensions will drastically improve the library performance" - }, - "type": "library", - "autoload": { - "psr-4": { - "CBOR\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Florent Morselli", - "homepage": "https://github.com/Spomky" - }, - { - "name": "All contributors", - "homepage": "https://github.com/Spomky-Labs/cbor-php/contributors" - } - ], - "description": "CBOR Encoder/Decoder for PHP", - "keywords": [ - "Concise Binary Object Representation", - "RFC7049", - "cbor" - ], - "support": { - "issues": "https://github.com/Spomky-Labs/cbor-php/issues", - "source": "https://github.com/Spomky-Labs/cbor-php/tree/v2.1.0" - }, - "funding": [ - { - "url": "https://github.com/Spomky", - "type": "github" - }, - { - "url": "https://www.patreon.com/FlorentMorselli", - "type": "patreon" - } - ], - "time": "2021-12-13T12:46:26+00:00" + "time": "2022-10-11T06:37:42+00:00" }, { "name": "spomky-labs/otphp", @@ -5158,124 +5060,44 @@ }, "time": "2022-09-27T15:03:11+00:00" }, - { - "name": "swiftmailer/swiftmailer", - "version": "v6.3.0", - "source": { - "type": "git", - "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c", - "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c", - "shasum": "" - }, - "require": { - "egulias/email-validator": "^2.0|^3.1", - "php": ">=7.0.0", - "symfony/polyfill-iconv": "^1.0", - "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0" - }, - "require-dev": { - "mockery/mockery": "^1.0", - "symfony/phpunit-bridge": "^4.4|^5.4" - }, - "suggest": { - "ext-intl": "Needed to support internationalized email addresses" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.2-dev" - } - }, - "autoload": { - "files": [ - "lib/swift_required.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Chris Corbyn" - }, - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - } - ], - "description": "Swiftmailer, free feature-rich PHP mailer", - "homepage": "https://swiftmailer.symfony.com", - "keywords": [ - "email", - "mail", - "mailer" - ], - "support": { - "issues": "https://github.com/swiftmailer/swiftmailer/issues", - "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" - }, - "funding": [ - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", - "type": "tidelift" - } - ], - "abandoned": "symfony/mailer", - "time": "2021-10-18T15:26:12+00:00" - }, { "name": "symfony/console", - "version": "v5.4.14", + "version": "v6.0.14", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "984ea2c0f45f42dfed01d2f3987b187467c4b16d" + "reference": "1f89cab8d52c84424f798495b3f10342a7b1a070" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/984ea2c0f45f42dfed01d2f3987b187467c4b16d", - "reference": "984ea2c0f45f42dfed01d2f3987b187467c4b16d", + "url": "https://api.github.com/repos/symfony/console/zipball/1f89cab8d52c84424f798495b3f10342a7b1a070", + "reference": "1f89cab8d52c84424f798495b3f10342a7b1a070", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "php": ">=8.0.2", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16", "symfony/service-contracts": "^1.1|^2|^3", - "symfony/string": "^5.1|^6.0" + "symfony/string": "^5.4|^6.0" }, "conflict": { - "psr/log": ">=3", - "symfony/dependency-injection": "<4.4", - "symfony/dotenv": "<5.1", - "symfony/event-dispatcher": "<4.4", - "symfony/lock": "<4.4", - "symfony/process": "<4.4" + "symfony/dependency-injection": "<5.4", + "symfony/dotenv": "<5.4", + "symfony/event-dispatcher": "<5.4", + "symfony/lock": "<5.4", + "symfony/process": "<5.4" }, "provide": { - "psr/log-implementation": "1.0|2.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { - "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^4.4|^5.0|^6.0", - "symfony/lock": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/lock": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -5315,7 +5137,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.14" + "source": "https://github.com/symfony/console/tree/v6.0.14" }, "funding": [ { @@ -5331,7 +5153,7 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:01:20+00:00" + "time": "2022-10-07T08:02:12+00:00" }, { "name": "symfony/css-selector", @@ -5467,27 +5289,27 @@ }, { "name": "symfony/error-handler", - "version": "v5.4.14", + "version": "v6.0.14", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "5fe6d42ffeb68b094df8fdbf3acf23f391cc6be0" + "reference": "81e57c793d9a573f29f8b5296d5d8ee4602badcb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/5fe6d42ffeb68b094df8fdbf3acf23f391cc6be0", - "reference": "5fe6d42ffeb68b094df8fdbf3acf23f391cc6be0", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/81e57c793d9a573f29f8b5296d5d8ee4602badcb", + "reference": "81e57c793d9a573f29f8b5296d5d8ee4602badcb", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^4.4|^5.0|^6.0" + "symfony/var-dumper": "^5.4|^6.0" }, "require-dev": { "symfony/deprecation-contracts": "^2.1|^3", - "symfony/http-kernel": "^4.4|^5.0|^6.0", - "symfony/serializer": "^4.4|^5.0|^6.0" + "symfony/http-kernel": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -5518,7 +5340,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.4.14" + "source": "https://github.com/symfony/error-handler/tree/v6.0.14" }, "funding": [ { @@ -5534,7 +5356,7 @@ "type": "tidelift" } ], - "time": "2022-10-03T15:15:50+00:00" + "time": "2022-10-07T08:02:12+00:00" }, { "name": "symfony/event-dispatcher", @@ -5700,22 +5522,20 @@ }, { "name": "symfony/finder", - "version": "v5.4.11", + "version": "v6.0.11", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c" + "reference": "09cb683ba5720385ea6966e5e06be2a34f2568b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/7872a66f57caffa2916a584db1aa7f12adc76f8c", - "reference": "7872a66f57caffa2916a584db1aa7f12adc76f8c", + "url": "https://api.github.com/repos/symfony/finder/zipball/09cb683ba5720385ea6966e5e06be2a34f2568b1", + "reference": "09cb683ba5720385ea6966e5e06be2a34f2568b1", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2" }, "type": "library", "autoload": { @@ -5743,7 +5563,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.4.11" + "source": "https://github.com/symfony/finder/tree/v6.0.11" }, "funding": [ { @@ -5759,35 +5579,34 @@ "type": "tidelift" } ], - "time": "2022-07-29T07:37:50+00:00" + "time": "2022-07-29T07:39:48+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.14", + "version": "v6.0.14", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "e7c7b395c3a61d746919c21e915f51f0039c3f75" + "reference": "e8aa505d35660877e6695d68be53df2ceac7cf57" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e7c7b395c3a61d746919c21e915f51f0039c3f75", - "reference": "e7c7b395c3a61d746919c21e915f51f0039c3f75", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/e8aa505d35660877e6695d68be53df2ceac7cf57", + "reference": "e8aa505d35660877e6695d68be53df2ceac7cf57", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/cache": "^5.4|^6.0", "symfony/dependency-injection": "^5.4|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^5.4|^6.0", "symfony/http-kernel": "^5.4.12|^6.0.12|^6.1.4", - "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/mime": "^5.4|^6.0", "symfony/rate-limiter": "^5.2|^6.0" }, "suggest": { @@ -5819,7 +5638,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.14" + "source": "https://github.com/symfony/http-foundation/tree/v6.0.14" }, "funding": [ { @@ -5835,67 +5654,64 @@ "type": "tidelift" } ], - "time": "2022-10-01T21:59:28+00:00" + "time": "2022-10-02T08:16:40+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.14", + "version": "v6.0.14", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "6f77fabc1a37c2dceecc6f78cca44772705dc52f" + "reference": "f9fc93c4f12e2fd7dea37f7b5840deb34e9037fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/6f77fabc1a37c2dceecc6f78cca44772705dc52f", - "reference": "6f77fabc1a37c2dceecc6f78cca44772705dc52f", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f9fc93c4f12e2fd7dea37f7b5840deb34e9037fc", + "reference": "f9fc93c4f12e2fd7dea37f7b5840deb34e9037fc", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/log": "^1|^2", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/error-handler": "^4.4|^5.0|^6.0", - "symfony/event-dispatcher": "^5.0|^6.0", - "symfony/http-foundation": "^5.3.7|^6.0", - "symfony/polyfill-ctype": "^1.8", - "symfony/polyfill-php73": "^1.9", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2", + "psr/log": "^1|^2|^3", + "symfony/error-handler": "^5.4|^6.0", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/polyfill-ctype": "^1.8" }, "conflict": { "symfony/browser-kit": "<5.4", - "symfony/cache": "<5.0", - "symfony/config": "<5.0", - "symfony/console": "<4.4", - "symfony/dependency-injection": "<5.3", - "symfony/doctrine-bridge": "<5.0", - "symfony/form": "<5.0", - "symfony/http-client": "<5.0", - "symfony/mailer": "<5.0", - "symfony/messenger": "<5.0", - "symfony/translation": "<5.0", - "symfony/twig-bridge": "<5.0", - "symfony/validator": "<5.0", + "symfony/cache": "<5.4", + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/doctrine-bridge": "<5.4", + "symfony/form": "<5.4", + "symfony/http-client": "<5.4", + "symfony/mailer": "<5.4", + "symfony/messenger": "<5.4", + "symfony/translation": "<5.4", + "symfony/twig-bridge": "<5.4", + "symfony/validator": "<5.4", "twig/twig": "<2.13" }, "provide": { - "psr/log-implementation": "1.0|2.0" + "psr/log-implementation": "1.0|2.0|3.0" }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", "symfony/browser-kit": "^5.4|^6.0", - "symfony/config": "^5.0|^6.0", - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/css-selector": "^4.4|^5.0|^6.0", - "symfony/dependency-injection": "^5.3|^6.0", - "symfony/dom-crawler": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/css-selector": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/dom-crawler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", "symfony/http-client-contracts": "^1.1|^2|^3", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/routing": "^4.4|^5.0|^6.0", - "symfony/stopwatch": "^4.4|^5.0|^6.0", - "symfony/translation": "^4.4|^5.0|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/routing": "^5.4|^6.0", + "symfony/stopwatch": "^5.4|^6.0", + "symfony/translation": "^5.4|^6.0", "symfony/translation-contracts": "^1.1|^2|^3", "twig/twig": "^2.13|^3.0.4" }, @@ -5931,7 +5747,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.4.14" + "source": "https://github.com/symfony/http-kernel/tree/v6.0.14" }, "funding": [ { @@ -5947,42 +5763,114 @@ "type": "tidelift" } ], - "time": "2022-10-12T07:12:21+00:00" + "time": "2022-10-12T07:43:45+00:00" }, { - "name": "symfony/mime", - "version": "v5.4.14", + "name": "symfony/mailer", + "version": "v6.0.13", "source": { "type": "git", - "url": "https://github.com/symfony/mime.git", - "reference": "1c118b253bb3495d81e95a6e3ec6c2766a98a0c4" + "url": "https://github.com/symfony/mailer.git", + "reference": "6269c872ab4792e8facbf8af27a2fbee8429f217" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/1c118b253bb3495d81e95a6e3ec6c2766a98a0c4", - "reference": "1c118b253bb3495d81e95a6e3ec6c2766a98a0c4", + "url": "https://api.github.com/repos/symfony/mailer/zipball/6269c872ab4792e8facbf8af27a2fbee8429f217", + "reference": "6269c872ab4792e8facbf8af27a2fbee8429f217", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", + "egulias/email-validator": "^2.1.10|^3", + "php": ">=8.0.2", + "psr/event-dispatcher": "^1", + "psr/log": "^1|^2|^3", + "symfony/event-dispatcher": "^5.4|^6.0", + "symfony/mime": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3" + }, + "conflict": { + "symfony/http-kernel": "<5.4" + }, + "require-dev": { + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/messenger": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mailer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps sending emails", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/mailer/tree/v6.0.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-08-29T06:49:22+00:00" + }, + { + "name": "symfony/mime", + "version": "v6.0.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "c01b88b63418131daf2edd0bdc17fc8a6d1c939a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/c01b88b63418131daf2edd0bdc17fc8a6d1c939a", + "reference": "c01b88b63418131daf2edd0bdc17fc8a6d1c939a", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", "symfony/polyfill-intl-idn": "^1.10", - "symfony/polyfill-mbstring": "^1.0", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "^1.0" }, "conflict": { "egulias/email-validator": "~3.0.0", "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", - "symfony/mailer": "<4.4", + "symfony/mailer": "<5.4", "symfony/serializer": "<5.4.14|>=6.0,<6.0.14|>=6.1,<6.1.6" }, "require-dev": { "egulias/email-validator": "^2.1.10|^3.1", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/property-access": "^4.4|^5.1|^6.0", - "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/property-access": "^5.4|^6.0", + "symfony/property-info": "^5.4|^6.0", "symfony/serializer": "^5.4.14|~6.0.14|^6.1.6" }, "type": "library", @@ -6015,7 +5903,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.4.14" + "source": "https://github.com/symfony/mime/tree/v6.0.14" }, "funding": [ { @@ -6031,7 +5919,7 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:01:20+00:00" + "time": "2022-10-07T08:02:12+00:00" }, { "name": "symfony/polyfill-ctype", @@ -6115,89 +6003,6 @@ ], "time": "2022-05-24T11:49:31+00:00" }, - { - "name": "symfony/polyfill-iconv", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "143f1881e655bebca1312722af8068de235ae5dc" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/143f1881e655bebca1312722af8068de235ae5dc", - "reference": "143f1881e655bebca1312722af8068de235ae5dc", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "provide": { - "ext-iconv": "*" - }, - "suggest": { - "ext-iconv": "For best performance" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Iconv\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill for the Iconv extension", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "iconv", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.26.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-24T11:49:31+00:00" - }, { "name": "symfony/polyfill-intl-grapheme", "version": "v1.26.0", @@ -6609,85 +6414,6 @@ ], "time": "2022-05-24T11:49:31+00:00" }, - { - "name": "symfony/polyfill-php73", - "version": "v1.26.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", - "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", - "shasum": "" - }, - "require": { - "php": ">=7.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.26-dev" - }, - "thanks": { - "name": "symfony/polyfill", - "url": "https://github.com/symfony/polyfill" - } - }, - "autoload": { - "files": [ - "bootstrap.php" - ], - "psr-4": { - "Symfony\\Polyfill\\Php73\\": "" - }, - "classmap": [ - "Resources/stubs" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", - "homepage": "https://symfony.com", - "keywords": [ - "compatibility", - "polyfill", - "portable", - "shim" - ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2022-05-24T11:49:31+00:00" - }, { "name": "symfony/polyfill-php80", "version": "v1.26.0", @@ -6851,22 +6577,103 @@ "time": "2022-05-24T11:49:31+00:00" }, { - "name": "symfony/process", - "version": "v5.4.11", + "name": "symfony/polyfill-uuid", + "version": "v1.26.0", "source": { "type": "git", - "url": "https://github.com/symfony/process.git", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1" + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "a41886c1c81dc075a09c71fe6db5b9d68c79de23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/6e75fe6874cbc7e4773d049616ab450eff537bf1", - "reference": "6e75fe6874cbc7e4773d049616ab450eff537bf1", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/a41886c1c81dc075a09c71fe6db5b9d68c79de23", + "reference": "a41886c1c81dc075a09c71fe6db5b9d68c79de23", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=7.1" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/process", + "version": "v6.0.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "44270a08ccb664143dede554ff1c00aaa2247a43" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/44270a08ccb664143dede554ff1c00aaa2247a43", + "reference": "44270a08ccb664143dede554ff1c00aaa2247a43", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" }, "type": "library", "autoload": { @@ -6894,7 +6701,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.11" + "source": "https://github.com/symfony/process/tree/v6.0.11" }, "funding": [ { @@ -6910,7 +6717,7 @@ "type": "tidelift" } ], - "time": "2022-06-27T16:58:25+00:00" + "time": "2022-06-27T17:10:44+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -7002,37 +6809,35 @@ }, { "name": "symfony/routing", - "version": "v5.4.11", + "version": "v6.0.11", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "3e01ccd9b2a3a4167ba2b3c53612762300300226" + "reference": "434b64f7d3a582ec33fcf69baaf085473e67d639" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/3e01ccd9b2a3a4167ba2b3c53612762300300226", - "reference": "3e01ccd9b2a3a4167ba2b3c53612762300300226", + "url": "https://api.github.com/repos/symfony/routing/zipball/434b64f7d3a582ec33fcf69baaf085473e67d639", + "reference": "434b64f7d3a582ec33fcf69baaf085473e67d639", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1|^3", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2" }, "conflict": { "doctrine/annotations": "<1.12", - "symfony/config": "<5.3", - "symfony/dependency-injection": "<4.4", - "symfony/yaml": "<4.4" + "symfony/config": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/yaml": "<5.4" }, "require-dev": { "doctrine/annotations": "^1.12", "psr/log": "^1|^2|^3", - "symfony/config": "^5.3|^6.0", - "symfony/dependency-injection": "^4.4|^5.0|^6.0", - "symfony/expression-language": "^4.4|^5.0|^6.0", - "symfony/http-foundation": "^4.4|^5.0|^6.0", - "symfony/yaml": "^4.4|^5.0|^6.0" + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/yaml": "^5.4|^6.0" }, "suggest": { "symfony/config": "For using the all-in-one router or any loader", @@ -7072,7 +6877,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.11" + "source": "https://github.com/symfony/routing/tree/v6.0.11" }, "funding": [ { @@ -7088,26 +6893,25 @@ "type": "tidelift" } ], - "time": "2022-07-20T13:00:38+00:00" + "time": "2022-07-20T13:45:53+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.2", + "version": "v3.0.2", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", - "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d78d39c1599bd1188b8e26bb341da52c3c6d8a66", + "reference": "d78d39c1599bd1188b8e26bb341da52c3c6d8a66", "shasum": "" }, "require": { - "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1|^3" + "php": ">=8.0.2", + "psr/container": "^2.0" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -7118,7 +6922,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.0-dev" }, "thanks": { "name": "symfony/contracts", @@ -7155,7 +6959,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + "source": "https://github.com/symfony/service-contracts/tree/v3.0.2" }, "funding": [ { @@ -7171,7 +6975,7 @@ "type": "tidelift" } ], - "time": "2022-05-30T19:17:29+00:00" + "time": "2022-05-30T19:17:58+00:00" }, { "name": "symfony/string", @@ -7432,33 +7236,106 @@ "time": "2022-06-27T17:10:44+00:00" }, { - "name": "symfony/var-dumper", - "version": "v5.4.14", + "name": "symfony/uid", + "version": "v6.0.13", "source": { "type": "git", - "url": "https://github.com/symfony/var-dumper.git", - "reference": "6894d06145fefebd9a4c7272baa026a1c394a430" + "url": "https://github.com/symfony/uid.git", + "reference": "db426b27173f5e2d8b960dd10fa8ce19ea9ca5f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/6894d06145fefebd9a4c7272baa026a1c394a430", - "reference": "6894d06145fefebd9a4c7272baa026a1c394a430", + "url": "https://api.github.com/repos/symfony/uid/zipball/db426b27173f5e2d8b960dd10fa8ce19ea9ca5f3", + "reference": "db426b27173f5e2d8b960dd10fa8ce19ea9ca5f3", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v6.0.13" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-09-09T09:33:56+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.0.14", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "72af925ddd41ca0372d166d004bc38a00c4608cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/72af925ddd41ca0372d166d004bc38a00c4608cc", + "reference": "72af925ddd41ca0372d166d004bc38a00c4608cc", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-mbstring": "~1.0" }, "conflict": { "phpunit/phpunit": "<5.4.3", - "symfony/console": "<4.4" + "symfony/console": "<5.4" }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^4.4|^5.0|^6.0", - "symfony/process": "^4.4|^5.0|^6.0", - "symfony/uid": "^5.1|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", "twig/twig": "^2.13|^3.0.4" }, "suggest": { @@ -7502,7 +7379,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.4.14" + "source": "https://github.com/symfony/var-dumper/tree/v6.0.14" }, "funding": [ { @@ -7518,43 +7395,50 @@ "type": "tidelift" } ], - "time": "2022-10-07T08:01:20+00:00" + "time": "2022-10-07T08:02:12+00:00" }, { "name": "thecodingmachine/safe", - "version": "v1.3.3", + "version": "v2.4.0", "source": { "type": "git", "url": "https://github.com/thecodingmachine/safe.git", - "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc" + "reference": "e788f3d09dcd36f806350aedb77eac348fafadd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/a8ab0876305a4cdaef31b2350fcb9811b5608dbc", - "reference": "a8ab0876305a4cdaef31b2350fcb9811b5608dbc", + "url": "https://api.github.com/repos/thecodingmachine/safe/zipball/e788f3d09dcd36f806350aedb77eac348fafadd3", + "reference": "e788f3d09dcd36f806350aedb77eac348fafadd3", "shasum": "" }, "require": { - "php": ">=7.2" + "php": "^8.0" }, "require-dev": { - "phpstan/phpstan": "^0.12", + "phpstan/phpstan": "^1.5", + "phpunit/phpunit": "^9.5", "squizlabs/php_codesniffer": "^3.2", - "thecodingmachine/phpstan-strict-rules": "^0.12" + "thecodingmachine/phpstan-strict-rules": "^1.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "0.1-dev" + "dev-master": "2.2.x-dev" } }, "autoload": { "files": [ "deprecated/apc.php", + "deprecated/array.php", + "deprecated/datetime.php", "deprecated/libevent.php", + "deprecated/misc.php", + "deprecated/password.php", "deprecated/mssql.php", "deprecated/stats.php", + "deprecated/strings.php", "lib/special_cases.php", + "deprecated/mysqli.php", "generated/apache.php", "generated/apcu.php", "generated/array.php", @@ -7575,6 +7459,7 @@ "generated/fpm.php", "generated/ftp.php", "generated/funchand.php", + "generated/gettext.php", "generated/gmp.php", "generated/gnupg.php", "generated/hash.php", @@ -7584,7 +7469,6 @@ "generated/image.php", "generated/imap.php", "generated/info.php", - "generated/ingres-ii.php", "generated/inotify.php", "generated/json.php", "generated/ldap.php", @@ -7593,20 +7477,14 @@ "generated/mailparse.php", "generated/mbstring.php", "generated/misc.php", - "generated/msql.php", "generated/mysql.php", - "generated/mysqli.php", - "generated/mysqlndMs.php", - "generated/mysqlndQc.php", "generated/network.php", "generated/oci8.php", "generated/opcache.php", "generated/openssl.php", "generated/outcontrol.php", - "generated/password.php", "generated/pcntl.php", "generated/pcre.php", - "generated/pdf.php", "generated/pgsql.php", "generated/posix.php", "generated/ps.php", @@ -7617,7 +7495,6 @@ "generated/sem.php", "generated/session.php", "generated/shmop.php", - "generated/simplexml.php", "generated/sockets.php", "generated/sodium.php", "generated/solr.php", @@ -7640,13 +7517,13 @@ "generated/zip.php", "generated/zlib.php" ], - "psr-4": { - "Safe\\": [ - "lib/", - "deprecated/", - "generated/" - ] - } + "classmap": [ + "lib/DateTime.php", + "lib/DateTimeImmutable.php", + "lib/Exceptions/", + "deprecated/Exceptions/", + "generated/Exceptions/" + ] }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -7655,9 +7532,9 @@ "description": "PHP core functions that throw exceptions instead of returning FALSE on error", "support": { "issues": "https://github.com/thecodingmachine/safe/issues", - "source": "https://github.com/thecodingmachine/safe/tree/v1.3.3" + "source": "https://github.com/thecodingmachine/safe/tree/v2.4.0" }, - "time": "2020-10-28T17:51:34+00:00" + "time": "2022-10-07T14:02:17+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -7714,16 +7591,16 @@ }, { "name": "vlucas/phpdotenv", - "version": "v5.4.1", + "version": "v5.5.0", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f" + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/264dce589e7ce37a7ba99cb901eed8249fbec92f", - "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", + "reference": "1a7ea2afc49c3ee6d87061f5a233e3a035d0eae7", "shasum": "" }, "require": { @@ -7738,15 +7615,19 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.4.1", "ext-filter": "*", - "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" + "phpunit/phpunit": "^7.5.20 || ^8.5.30 || ^9.5.25" }, "suggest": { "ext-filter": "Required to use the boolean validator." }, "type": "library", "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": true + }, "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "5.5-dev" } }, "autoload": { @@ -7778,7 +7659,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.5.0" }, "funding": [ { @@ -7790,20 +7671,20 @@ "type": "tidelift" } ], - "time": "2021-12-12T23:22:04+00:00" + "time": "2022-10-16T01:01:54+00:00" }, { "name": "voku/portable-ascii", - "version": "1.6.1", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/voku/portable-ascii.git", - "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a" + "reference": "b56450eed252f6801410d810c8e1727224ae0743" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/voku/portable-ascii/zipball/87337c91b9dfacee02452244ee14ab3c43bc485a", - "reference": "87337c91b9dfacee02452244ee14ab3c43bc485a", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/b56450eed252f6801410d810c8e1727224ae0743", + "reference": "b56450eed252f6801410d810c8e1727224ae0743", "shasum": "" }, "require": { @@ -7840,7 +7721,7 @@ ], "support": { "issues": "https://github.com/voku/portable-ascii/issues", - "source": "https://github.com/voku/portable-ascii/tree/1.6.1" + "source": "https://github.com/voku/portable-ascii/tree/2.0.1" }, "funding": [ { @@ -7864,221 +7745,7 @@ "type": "tidelift" } ], - "time": "2022-01-24T18:55:24+00:00" - }, - { - "name": "web-auth/cose-lib", - "version": "v3.3.12", - "source": { - "type": "git", - "url": "https://github.com/web-auth/cose-lib.git", - "reference": "efa6ec2ba4e840bc1316a493973c9916028afeeb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/web-auth/cose-lib/zipball/efa6ec2ba4e840bc1316a493973c9916028afeeb", - "reference": "efa6ec2ba4e840bc1316a493973c9916028afeeb", - "shasum": "" - }, - "require": { - "beberlei/assert": "^3.2", - "ext-json": "*", - "ext-mbstring": "*", - "ext-openssl": "*", - "fgrosse/phpasn1": "^2.1", - "php": ">=7.2" - }, - "type": "library", - "autoload": { - "psr-4": { - "Cose\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Florent Morselli", - "homepage": "https://github.com/Spomky" - }, - { - "name": "All contributors", - "homepage": "https://github.com/web-auth/cose/contributors" - } - ], - "description": "CBOR Object Signing and Encryption (COSE) For PHP", - "homepage": "https://github.com/web-auth", - "keywords": [ - "COSE", - "RFC8152" - ], - "support": { - "source": "https://github.com/web-auth/cose-lib/tree/v3.3.12" - }, - "funding": [ - { - "url": "https://github.com/Spomky", - "type": "github" - }, - { - "url": "https://www.patreon.com/FlorentMorselli", - "type": "patreon" - } - ], - "time": "2021-12-04T12:13:35+00:00" - }, - { - "name": "web-auth/metadata-service", - "version": "v3.3.12", - "source": { - "type": "git", - "url": "https://github.com/web-auth/webauthn-metadata-service.git", - "reference": "ef40d2b7b68c4964247d13fab52e2fa8dbd65246" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/web-auth/webauthn-metadata-service/zipball/ef40d2b7b68c4964247d13fab52e2fa8dbd65246", - "reference": "ef40d2b7b68c4964247d13fab52e2fa8dbd65246", - "shasum": "" - }, - "require": { - "beberlei/assert": "^3.2", - "ext-json": "*", - "league/uri": "^6.0", - "php": ">=7.2", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/log": "^1.1" - }, - "suggest": { - "web-token/jwt-key-mgmt": "Mandatory for fetching Metadata Statement from distant sources", - "web-token/jwt-signature-algorithm-ecdsa": "Mandatory for fetching Metadata Statement from distant sources" - }, - "type": "library", - "autoload": { - "psr-4": { - "Webauthn\\MetadataService\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Florent Morselli", - "homepage": "https://github.com/Spomky" - }, - { - "name": "All contributors", - "homepage": "https://github.com/web-auth/metadata-service/contributors" - } - ], - "description": "Metadata Service for FIDO2/Webauthn", - "homepage": "https://github.com/web-auth", - "keywords": [ - "FIDO2", - "fido", - "webauthn" - ], - "support": { - "source": "https://github.com/web-auth/webauthn-metadata-service/tree/v3.3.12" - }, - "funding": [ - { - "url": "https://github.com/Spomky", - "type": "github" - }, - { - "url": "https://www.patreon.com/FlorentMorselli", - "type": "patreon" - } - ], - "time": "2021-11-21T11:14:31+00:00" - }, - { - "name": "web-auth/webauthn-lib", - "version": "v3.3.12", - "source": { - "type": "git", - "url": "https://github.com/web-auth/webauthn-lib.git", - "reference": "5ef9b21c8e9f8a817e524ac93290d08a9f065b33" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/web-auth/webauthn-lib/zipball/5ef9b21c8e9f8a817e524ac93290d08a9f065b33", - "reference": "5ef9b21c8e9f8a817e524ac93290d08a9f065b33", - "shasum": "" - }, - "require": { - "beberlei/assert": "^3.2", - "ext-json": "*", - "ext-mbstring": "*", - "ext-openssl": "*", - "fgrosse/phpasn1": "^2.1", - "php": ">=7.2", - "psr/http-client": "^1.0", - "psr/http-factory": "^1.0", - "psr/http-message": "^1.0", - "psr/log": "^1.1", - "ramsey/uuid": "^3.8|^4.0", - "spomky-labs/base64url": "^2.0", - "spomky-labs/cbor-php": "^1.0|^2.0", - "symfony/process": "^3.0|^4.0|^5.0", - "thecodingmachine/safe": "^1.1", - "web-auth/cose-lib": "self.version", - "web-auth/metadata-service": "self.version" - }, - "suggest": { - "psr/log-implementation": "Recommended to receive logs from the library", - "web-token/jwt-key-mgmt": "Mandatory for the AndroidSafetyNet Attestation Statement support", - "web-token/jwt-signature-algorithm-ecdsa": "Recommended for the AndroidSafetyNet Attestation Statement support", - "web-token/jwt-signature-algorithm-eddsa": "Recommended for the AndroidSafetyNet Attestation Statement support", - "web-token/jwt-signature-algorithm-rsa": "Mandatory for the AndroidSafetyNet Attestation Statement support" - }, - "type": "library", - "autoload": { - "psr-4": { - "Webauthn\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Florent Morselli", - "homepage": "https://github.com/Spomky" - }, - { - "name": "All contributors", - "homepage": "https://github.com/web-auth/webauthn-library/contributors" - } - ], - "description": "FIDO2/Webauthn Support For PHP", - "homepage": "https://github.com/web-auth", - "keywords": [ - "FIDO2", - "fido", - "webauthn" - ], - "support": { - "source": "https://github.com/web-auth/webauthn-lib/tree/v3.3.12" - }, - "funding": [ - { - "url": "https://github.com/Spomky", - "type": "github" - }, - { - "url": "https://www.patreon.com/FlorentMorselli", - "type": "patreon" - } - ], - "time": "2022-02-18T07:13:44+00:00" + "time": "2022-03-08T17:03:00+00:00" }, { "name": "webmozart/assert", @@ -8286,336 +7953,6 @@ }, "time": "2018-12-13T10:34:14+00:00" }, - { - "name": "composer/ca-bundle", - "version": "1.3.4", - "source": { - "type": "git", - "url": "https://github.com/composer/ca-bundle.git", - "reference": "69098eca243998b53eed7a48d82dedd28b447cd5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/69098eca243998b53eed7a48d82dedd28b447cd5", - "reference": "69098eca243998b53eed7a48d82dedd28b447cd5", - "shasum": "" - }, - "require": { - "ext-openssl": "*", - "ext-pcre": "*", - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "psr/log": "^1.0", - "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\CaBundle\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.", - "keywords": [ - "cabundle", - "cacert", - "certificate", - "ssl", - "tls" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.4" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-10-12T12:08:29+00:00" - }, - { - "name": "composer/class-map-generator", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/class-map-generator.git", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/class-map-generator/zipball/1e1cb2b791facb2dfe32932a7718cf2571187513", - "reference": "1e1cb2b791facb2dfe32932a7718cf2571187513", - "shasum": "" - }, - "require": { - "composer/pcre": "^2 || ^3", - "php": "^7.2 || ^8.0", - "symfony/finder": "^4.4 || ^5.3 || ^6" - }, - "require-dev": { - "phpstan/phpstan": "^1.6", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/filesystem": "^5.4 || ^6", - "symfony/phpunit-bridge": "^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\ClassMapGenerator\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Utilities to scan PHP code and generate class maps.", - "keywords": [ - "classmap" - ], - "support": { - "issues": "https://github.com/composer/class-map-generator/issues", - "source": "https://github.com/composer/class-map-generator/tree/1.0.0" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-06-19T11:31:27+00:00" - }, - { - "name": "composer/composer", - "version": "2.4.2", - "source": { - "type": "git", - "url": "https://github.com/composer/composer.git", - "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/7d887621e69a0311eb50aed4a16f7044b2b385b9", - "reference": "7d887621e69a0311eb50aed4a16f7044b2b385b9", - "shasum": "" - }, - "require": { - "composer/ca-bundle": "^1.0", - "composer/class-map-generator": "^1.0", - "composer/metadata-minifier": "^1.0", - "composer/pcre": "^2 || ^3", - "composer/semver": "^3.0", - "composer/spdx-licenses": "^1.5.7", - "composer/xdebug-handler": "^2.0.2 || ^3.0.3", - "justinrainbow/json-schema": "^5.2.11", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1.0 || ^2.0 || ^3.0", - "react/promise": "^2.8", - "seld/jsonlint": "^1.4", - "seld/phar-utils": "^1.2", - "seld/signal-handler": "^2.0", - "symfony/console": "^5.4.11 || ^6.0.11", - "symfony/filesystem": "^5.4 || ^6.0", - "symfony/finder": "^5.4 || ^6.0", - "symfony/polyfill-php73": "^1.24", - "symfony/polyfill-php80": "^1.24", - "symfony/process": "^5.4 || ^6.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.4.1", - "phpstan/phpstan-deprecation-rules": "^1", - "phpstan/phpstan-phpunit": "^1.0", - "phpstan/phpstan-strict-rules": "^1", - "phpstan/phpstan-symfony": "^1.2.10", - "symfony/phpunit-bridge": "^6.0" - }, - "suggest": { - "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages", - "ext-zip": "Enabling the zip extension allows you to unzip archives", - "ext-zlib": "Allow gzip compression of HTTP requests" - }, - "bin": [ - "bin/composer" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.4-dev" - }, - "phpstan": { - "includes": [ - "phpstan/rules.neon" - ] - } - }, - "autoload": { - "psr-4": { - "Composer\\": "src/Composer" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "https://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "https://seld.be" - } - ], - "description": "Composer helps you declare, manage and install dependencies of PHP projects. It ensures you have the right stack everywhere.", - "homepage": "https://getcomposer.org/", - "keywords": [ - "autoload", - "dependency", - "package" - ], - "support": { - "irc": "ircs://irc.libera.chat:6697/composer", - "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.4.2" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-09-14T14:11:15+00:00" - }, - { - "name": "composer/metadata-minifier", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/composer/metadata-minifier.git", - "reference": "c549d23829536f0d0e984aaabbf02af91f443207" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/metadata-minifier/zipball/c549d23829536f0d0e984aaabbf02af91f443207", - "reference": "c549d23829536f0d0e984aaabbf02af91f443207", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "composer/composer": "^2", - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\MetadataMinifier\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "Small utility library that handles metadata minification and expansion.", - "keywords": [ - "composer", - "compression" - ], - "support": { - "issues": "https://github.com/composer/metadata-minifier/issues", - "source": "https://github.com/composer/metadata-minifier/tree/1.0.0" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-04-07T13:37:33+00:00" - }, { "name": "composer/pcre", "version": "3.0.0", @@ -8687,233 +8024,6 @@ ], "time": "2022-02-25T20:21:48+00:00" }, - { - "name": "composer/semver", - "version": "3.3.2", - "source": { - "type": "git", - "url": "https://github.com/composer/semver.git", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/semver/zipball/3953f23262f2bff1919fc82183ad9acb13ff62c9", - "reference": "3953f23262f2bff1919fc82183ad9acb13ff62c9", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.4", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Semver\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "Semver library that offers utilities, version constraint parsing and validation.", - "keywords": [ - "semantic", - "semver", - "validation", - "versioning" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/semver/issues", - "source": "https://github.com/composer/semver/tree/3.3.2" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-04-01T19:23:25+00:00" - }, - { - "name": "composer/spdx-licenses", - "version": "1.5.7", - "source": { - "type": "git", - "url": "https://github.com/composer/spdx-licenses.git", - "reference": "c848241796da2abf65837d51dce1fae55a960149" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", - "reference": "c848241796da2abf65837d51dce1fae55a960149", - "shasum": "" - }, - "require": { - "php": "^5.3.2 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Composer\\Spdx\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nils Adermann", - "email": "naderman@naderman.de", - "homepage": "http://www.naderman.de" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - }, - { - "name": "Rob Bast", - "email": "rob.bast@gmail.com", - "homepage": "http://robbast.nl" - } - ], - "description": "SPDX licenses list and validation library.", - "keywords": [ - "license", - "spdx", - "validator" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-05-23T07:37:50+00:00" - }, - { - "name": "composer/xdebug-handler", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/composer/xdebug-handler.git", - "reference": "ced299686f41dce890debac69273b47ffe98a40c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", - "reference": "ced299686f41dce890debac69273b47ffe98a40c", - "shasum": "" - }, - "require": { - "composer/pcre": "^1 || ^2 || ^3", - "php": "^7.2.5 || ^8.0", - "psr/log": "^1 || ^2 || ^3" - }, - "require-dev": { - "phpstan/phpstan": "^1.0", - "phpstan/phpstan-strict-rules": "^1.1", - "symfony/phpunit-bridge": "^6.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Composer\\XdebugHandler\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "John Stevenson", - "email": "john-stevenson@blueyonder.co.uk" - } - ], - "description": "Restarts a process without Xdebug.", - "keywords": [ - "Xdebug", - "performance" - ], - "support": { - "irc": "irc://irc.freenode.org/composer", - "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/3.0.3" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2022-02-25T21:32:43+00:00" - }, { "name": "doctrine/instantiator", "version": "1.4.1", @@ -8984,202 +8094,6 @@ ], "time": "2022-03-03T08:28:38+00:00" }, - { - "name": "facade/flare-client-php", - "version": "1.10.0", - "source": { - "type": "git", - "url": "https://github.com/facade/flare-client-php.git", - "reference": "213fa2c69e120bca4c51ba3e82ed1834ef3f41b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/flare-client-php/zipball/213fa2c69e120bca4c51ba3e82ed1834ef3f41b8", - "reference": "213fa2c69e120bca4c51ba3e82ed1834ef3f41b8", - "shasum": "" - }, - "require": { - "facade/ignition-contracts": "~1.0", - "illuminate/pipeline": "^5.5|^6.0|^7.0|^8.0", - "php": "^7.1|^8.0", - "symfony/http-foundation": "^3.3|^4.1|^5.0", - "symfony/mime": "^3.4|^4.0|^5.1", - "symfony/var-dumper": "^3.4|^4.0|^5.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.14", - "phpunit/phpunit": "^7.5", - "spatie/phpunit-snapshot-assertions": "^2.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Facade\\FlareClient\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Send PHP errors to Flare", - "homepage": "https://github.com/facade/flare-client-php", - "keywords": [ - "exception", - "facade", - "flare", - "reporting" - ], - "support": { - "issues": "https://github.com/facade/flare-client-php/issues", - "source": "https://github.com/facade/flare-client-php/tree/1.10.0" - }, - "funding": [ - { - "url": "https://github.com/spatie", - "type": "github" - } - ], - "time": "2022-08-09T11:23:57+00:00" - }, - { - "name": "facade/ignition", - "version": "2.17.6", - "source": { - "type": "git", - "url": "https://github.com/facade/ignition.git", - "reference": "6acd82e986a2ecee89e2e68adfc30a1936d1ab7c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/ignition/zipball/6acd82e986a2ecee89e2e68adfc30a1936d1ab7c", - "reference": "6acd82e986a2ecee89e2e68adfc30a1936d1ab7c", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "ext-json": "*", - "ext-mbstring": "*", - "facade/flare-client-php": "^1.9.1", - "facade/ignition-contracts": "^1.0.2", - "illuminate/support": "^7.0|^8.0", - "monolog/monolog": "^2.0", - "php": "^7.2.5|^8.0", - "symfony/console": "^5.0", - "symfony/var-dumper": "^5.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.14", - "livewire/livewire": "^2.4", - "mockery/mockery": "^1.3", - "orchestra/testbench": "^5.0|^6.0", - "psalm/plugin-laravel": "^1.2" - }, - "suggest": { - "laravel/telescope": "^3.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - }, - "laravel": { - "providers": [ - "Facade\\Ignition\\IgnitionServiceProvider" - ], - "aliases": { - "Flare": "Facade\\Ignition\\Facades\\Flare" - } - } - }, - "autoload": { - "files": [ - "src/helpers.php" - ], - "psr-4": { - "Facade\\Ignition\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A beautiful error page for Laravel applications.", - "homepage": "https://github.com/facade/ignition", - "keywords": [ - "error", - "flare", - "laravel", - "page" - ], - "support": { - "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", - "forum": "https://twitter.com/flareappio", - "issues": "https://github.com/facade/ignition/issues", - "source": "https://github.com/facade/ignition" - }, - "time": "2022-06-30T18:26:59+00:00" - }, - { - "name": "facade/ignition-contracts", - "version": "1.0.2", - "source": { - "type": "git", - "url": "https://github.com/facade/ignition-contracts.git", - "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267", - "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267", - "shasum": "" - }, - "require": { - "php": "^7.3|^8.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^v2.15.8", - "phpunit/phpunit": "^9.3.11", - "vimeo/psalm": "^3.17.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "Facade\\IgnitionContracts\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Freek Van der Herten", - "email": "freek@spatie.be", - "homepage": "https://flareapp.io", - "role": "Developer" - } - ], - "description": "Solution contracts for Ignition", - "homepage": "https://github.com/facade/ignition-contracts", - "keywords": [ - "contracts", - "flare", - "ignition" - ], - "support": { - "issues": "https://github.com/facade/ignition-contracts/issues", - "source": "https://github.com/facade/ignition-contracts/tree/1.0.2" - }, - "time": "2020-10-16T08:27:54+00:00" - }, { "name": "fakerphp/faker", "version": "v1.20.0", @@ -9369,76 +8283,6 @@ }, "time": "2020-07-09T08:09:16+00:00" }, - { - "name": "justinrainbow/json-schema", - "version": "5.2.12", - "source": { - "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "~2.2.20||~2.15.1", - "json-schema/json-schema-test-suite": "1.2.0", - "phpunit/phpunit": "^4.8.35" - }, - "bin": [ - "bin/validate-json" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "JsonSchema\\": "src/JsonSchema/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bruno Prieto Reis", - "email": "bruno.p.reis@gmail.com" - }, - { - "name": "Justin Rainbow", - "email": "justin.rainbow@gmail.com" - }, - { - "name": "Igor Wiedler", - "email": "igor@wiedler.ch" - }, - { - "name": "Robert Schönthal", - "email": "seroscho@googlemail.com" - } - ], - "description": "A library to validate a json schema.", - "homepage": "https://github.com/justinrainbow/json-schema", - "keywords": [ - "json", - "schema" - ], - "support": { - "issues": "https://github.com/justinrainbow/json-schema/issues", - "source": "https://github.com/justinrainbow/json-schema/tree/5.2.12" - }, - "time": "2022-04-13T08:02:27+00:00" - }, { "name": "mockery/mockery", "version": "1.5.1", @@ -9572,37 +8416,38 @@ }, { "name": "nunomaduro/collision", - "version": "v5.11.0", + "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "8b610eef8582ccdc05d8f2ab23305e2d37049461" + "reference": "0f6349c3ed5dd28467087b08fb59384bb458a22b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/8b610eef8582ccdc05d8f2ab23305e2d37049461", - "reference": "8b610eef8582ccdc05d8f2ab23305e2d37049461", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/0f6349c3ed5dd28467087b08fb59384bb458a22b", + "reference": "0f6349c3ed5dd28467087b08fb59384bb458a22b", "shasum": "" }, "require": { - "facade/ignition-contracts": "^1.0", - "filp/whoops": "^2.14.3", - "php": "^7.3 || ^8.0", - "symfony/console": "^5.0" + "filp/whoops": "^2.14.5", + "php": "^8.0.0", + "symfony/console": "^6.0.2" }, "require-dev": { - "brianium/paratest": "^6.1", - "fideloper/proxy": "^4.4.1", - "fruitcake/laravel-cors": "^2.0.3", - "laravel/framework": "8.x-dev", - "nunomaduro/larastan": "^0.6.2", - "nunomaduro/mock-final-classes": "^1.0", - "orchestra/testbench": "^6.0", - "phpstan/phpstan": "^0.12.64", - "phpunit/phpunit": "^9.5.0" + "brianium/paratest": "^6.4.1", + "laravel/framework": "^9.26.1", + "laravel/pint": "^1.1.1", + "nunomaduro/larastan": "^1.0.3", + "nunomaduro/mock-final-classes": "^1.1.0", + "orchestra/testbench": "^7.7", + "phpunit/phpunit": "^9.5.23", + "spatie/ignition": "^1.4.1" }, "type": "library", "extra": { + "branch-alias": { + "dev-develop": "6.x-dev" + }, "laravel": { "providers": [ "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" @@ -9655,41 +8500,41 @@ "type": "patreon" } ], - "time": "2022-01-10T16:22:52+00:00" + "time": "2022-09-29T12:29:49+00:00" }, { "name": "nunomaduro/larastan", - "version": "1.0.3", + "version": "2.2.5", "source": { "type": "git", "url": "https://github.com/nunomaduro/larastan.git", - "reference": "f5ce15319da184a5e461ef12c60489c15a9cf65b" + "reference": "42ee94bc30f3501a1d01a47222b49c1fbb54a316" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/larastan/zipball/f5ce15319da184a5e461ef12c60489c15a9cf65b", - "reference": "f5ce15319da184a5e461ef12c60489c15a9cf65b", + "url": "https://api.github.com/repos/nunomaduro/larastan/zipball/42ee94bc30f3501a1d01a47222b49c1fbb54a316", + "reference": "42ee94bc30f3501a1d01a47222b49c1fbb54a316", "shasum": "" }, "require": { - "composer/composer": "^1.0 || ^2.0", + "composer/pcre": "^3.0", "ext-json": "*", - "illuminate/console": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "illuminate/container": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "illuminate/contracts": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "illuminate/database": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "illuminate/http": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "illuminate/pipeline": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "illuminate/support": "^6.0 || ^7.0 || ^8.0 || ^9.0", - "mockery/mockery": "^0.9 || ^1.0", - "php": "^7.2 || ^8.0", - "phpstan/phpstan": "^1.0", - "symfony/process": "^4.3 || ^5.0 || ^6.0" + "illuminate/console": "^9", + "illuminate/container": "^9", + "illuminate/contracts": "^9", + "illuminate/database": "^9", + "illuminate/http": "^9", + "illuminate/pipeline": "^9", + "illuminate/support": "^9", + "mockery/mockery": "^1.4.4", + "php": "^8.0.2", + "phpmyadmin/sql-parser": "^5.5", + "phpstan/phpstan": "^1.8.7" }, "require-dev": { - "nikic/php-parser": "^4.13.0", - "orchestra/testbench": "^4.0 || ^5.0 || ^6.0 || ^7.0", - "phpunit/phpunit": "^7.3 || ^8.2 || ^9.3" + "nikic/php-parser": "^4.13.2", + "orchestra/testbench": "^7.0.0", + "phpunit/phpunit": "^9.5.11" }, "suggest": { "orchestra/testbench": "Using Larastan for analysing a package needs Testbench" @@ -9697,7 +8542,7 @@ "type": "phpstan-extension", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "2.0-dev" }, "phpstan": { "includes": [ @@ -9733,7 +8578,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/larastan/issues", - "source": "https://github.com/nunomaduro/larastan/tree/1.0.3" + "source": "https://github.com/nunomaduro/larastan/tree/2.2.5" }, "funding": [ { @@ -9753,7 +8598,7 @@ "type": "patreon" } ], - "time": "2022-01-20T19:33:48+00:00" + "time": "2022-10-18T10:13:18+00:00" }, { "name": "phar-io/manifest", @@ -9975,17 +8820,90 @@ "time": "2022-10-14T12:47:21+00:00" }, { - "name": "phpstan/phpstan", - "version": "1.8.9", + "name": "phpmyadmin/sql-parser", + "version": "5.5.0", "source": { "type": "git", - "url": "https://github.com/phpstan/phpstan.git", - "reference": "3a72d9d9f2528fbd50c2d8fcf155fd9f74ade3f2" + "url": "https://github.com/phpmyadmin/sql-parser.git", + "reference": "8ab99cd0007d880f49f5aa1807033dbfa21b1cb5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3a72d9d9f2528fbd50c2d8fcf155fd9f74ade3f2", - "reference": "3a72d9d9f2528fbd50c2d8fcf155fd9f74ade3f2", + "url": "https://api.github.com/repos/phpmyadmin/sql-parser/zipball/8ab99cd0007d880f49f5aa1807033dbfa21b1cb5", + "reference": "8ab99cd0007d880f49f5aa1807033dbfa21b1cb5", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "symfony/polyfill-mbstring": "^1.3" + }, + "conflict": { + "phpmyadmin/motranslator": "<3.0" + }, + "require-dev": { + "phpmyadmin/coding-standard": "^3.0", + "phpmyadmin/motranslator": "^4.0 || ^5.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.2", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/php-code-coverage": "*", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "^0.16.1", + "vimeo/psalm": "^4.11", + "zumba/json-serializer": "^3.0" + }, + "suggest": { + "ext-mbstring": "For best performance", + "phpmyadmin/motranslator": "Translate messages to your favorite locale" + }, + "bin": [ + "bin/highlight-query", + "bin/lint-query", + "bin/tokenize-query" + ], + "type": "library", + "autoload": { + "psr-4": { + "PhpMyAdmin\\SqlParser\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "The phpMyAdmin Team", + "email": "developers@phpmyadmin.net", + "homepage": "https://www.phpmyadmin.net/team/" + } + ], + "description": "A validating SQL lexer and parser with a focus on MySQL dialect.", + "homepage": "https://github.com/phpmyadmin/sql-parser", + "keywords": [ + "analysis", + "lexer", + "parser", + "sql" + ], + "support": { + "issues": "https://github.com/phpmyadmin/sql-parser/issues", + "source": "https://github.com/phpmyadmin/sql-parser" + }, + "time": "2021-12-09T04:31:52+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "1.8.10", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "0c4459dc42c568b818b3f25186589f3acddc1823" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/0c4459dc42c568b818b3f25186589f3acddc1823", + "reference": "0c4459dc42c568b818b3f25186589f3acddc1823", "shasum": "" }, "require": { @@ -10015,7 +8933,7 @@ ], "support": { "issues": "https://github.com/phpstan/phpstan/issues", - "source": "https://github.com/phpstan/phpstan/tree/1.8.9" + "source": "https://github.com/phpstan/phpstan/tree/1.8.10" }, "funding": [ { @@ -10031,7 +8949,7 @@ "type": "tidelift" } ], - "time": "2022-10-13T13:40:18+00:00" + "time": "2022-10-17T14:23:35+00:00" }, { "name": "phpunit/php-code-coverage", @@ -10453,82 +9371,6 @@ ], "time": "2022-09-25T03:44:45+00:00" }, - { - "name": "react/promise", - "version": "v2.9.0", - "source": { - "type": "git", - "url": "https://github.com/reactphp/promise.git", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "reference": "234f8fd1023c9158e2314fa9d7d0e6a83db42910", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.3 || ^5.7 || ^4.8.36" - }, - "type": "library", - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "React\\Promise\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jan Sorgalla", - "email": "jsorgalla@gmail.com", - "homepage": "https://sorgalla.com/" - }, - { - "name": "Christian Lück", - "email": "christian@clue.engineering", - "homepage": "https://clue.engineering/" - }, - { - "name": "Cees-Jan Kiewiet", - "email": "reactphp@ceesjankiewiet.nl", - "homepage": "https://wyrihaximus.net/" - }, - { - "name": "Chris Boden", - "email": "cboden@gmail.com", - "homepage": "https://cboden.dev/" - } - ], - "description": "A lightweight implementation of CommonJS Promises/A for PHP", - "keywords": [ - "promise", - "promises" - ], - "support": { - "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.9.0" - }, - "funding": [ - { - "url": "https://github.com/WyriHaximus", - "type": "github" - }, - { - "url": "https://github.com/clue", - "type": "github" - } - ], - "time": "2022-02-11T10:27:51+00:00" - }, { "name": "sebastian/cli-parser", "version": "1.0.1", @@ -11494,151 +10336,31 @@ "time": "2020-09-28T06:39:44+00:00" }, { - "name": "seld/jsonlint", - "version": "1.9.0", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "4211420d25eba80712bff236a98960ef68b866b7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/4211420d25eba80712bff236a98960ef68b866b7", - "reference": "4211420d25eba80712bff236a98960ef68b866b7", - "shasum": "" - }, - "require": { - "php": "^5.3 || ^7.0 || ^8.0" - }, - "require-dev": { - "phpstan/phpstan": "^1.5", - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^8.5.13" - }, - "bin": [ - "bin/jsonlint" - ], - "type": "library", - "autoload": { - "psr-4": { - "Seld\\JsonLint\\": "src/Seld/JsonLint/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" - } - ], - "description": "JSON Linter", - "keywords": [ - "json", - "linter", - "parser", - "validator" - ], - "support": { - "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.9.0" - }, - "funding": [ - { - "url": "https://github.com/Seldaek", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/seld/jsonlint", - "type": "tidelift" - } - ], - "time": "2022-04-01T13:37:23+00:00" - }, - { - "name": "seld/phar-utils", + "name": "spatie/backtrace", "version": "1.2.1", "source": { "type": "git", - "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c" + "url": "https://github.com/spatie/backtrace.git", + "reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", - "reference": "ea2f4014f163c1be4c601b9b7bd6af81ba8d701c", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/4ee7d41aa5268107906ea8a4d9ceccde136dbd5b", + "reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b", "shasum": "" }, "require": { - "php": ">=5.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "Seld\\PharUtils\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "PHAR file format utilities, for when PHP phars you up", - "keywords": [ - "phar" - ], - "support": { - "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.2.1" - }, - "time": "2022-08-31T10:31:18+00:00" - }, - { - "name": "seld/signal-handler", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/Seldaek/signal-handler.git", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Seldaek/signal-handler/zipball/f69d119511dc0360440cdbdaa71829c149b7be75", - "reference": "f69d119511dc0360440cdbdaa71829c149b7be75", - "shasum": "" - }, - "require": { - "php": ">=7.2.0" + "php": "^7.3|^8.0" }, "require-dev": { - "phpstan/phpstan": "^1", - "phpstan/phpstan-deprecation-rules": "^1.0", - "phpstan/phpstan-phpunit": "^1", - "phpstan/phpstan-strict-rules": "^1.3", - "phpunit/phpunit": "^7.5.20 || ^8.5.23", - "psr/log": "^1 || ^2 || ^3" + "ext-json": "*", + "phpunit/phpunit": "^9.3", + "symfony/var-dumper": "^5.1" }, "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.x-dev" - } - }, "autoload": { "psr-4": { - "Seld\\Signal\\": "src/" + "Spatie\\Backtrace\\": "src" } }, "notification-url": "https://packagist.org/downloads/", @@ -11647,87 +10369,267 @@ ], "authors": [ { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" } ], - "description": "Simple unix signal handler that silently fails where signals are not supported for easy cross-platform development", + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", "keywords": [ - "posix", - "sigint", - "signal", - "sigterm", - "unix" + "Backtrace", + "spatie" ], "support": { - "issues": "https://github.com/Seldaek/signal-handler/issues", - "source": "https://github.com/Seldaek/signal-handler/tree/2.0.1" - }, - "time": "2022-07-20T18:31:45+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v6.0.13", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "3adca49133bd055ebe6011ed1e012be3c908af79" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/3adca49133bd055ebe6011ed1e012be3c908af79", - "reference": "3adca49133bd055ebe6011ed1e012be3c908af79", - "shasum": "" - }, - "require": { - "php": ">=8.0.2", - "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-mbstring": "~1.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Provides basic utilities for the filesystem", - "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/filesystem/tree/v6.0.13" + "issues": "https://github.com/spatie/backtrace/issues", + "source": "https://github.com/spatie/backtrace/tree/1.2.1" }, "funding": [ { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", + "url": "https://github.com/sponsors/spatie", "type": "github" }, { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" + "url": "https://spatie.be/open-source/support-us", + "type": "other" } ], - "time": "2022-09-21T20:25:27+00:00" + "time": "2021-11-09T10:57:15+00:00" + }, + { + "name": "spatie/flare-client-php", + "version": "1.3.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/flare-client-php.git", + "reference": "b1b974348750925b717fa8c8b97a0db0d1aa40ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/flare-client-php/zipball/b1b974348750925b717fa8c8b97a0db0d1aa40ca", + "reference": "b1b974348750925b717fa8c8b97a0db0d1aa40ca", + "shasum": "" + }, + "require": { + "illuminate/pipeline": "^8.0|^9.0", + "php": "^8.0", + "spatie/backtrace": "^1.2", + "symfony/http-foundation": "^5.0|^6.0", + "symfony/mime": "^5.2|^6.0", + "symfony/process": "^5.2|^6.0", + "symfony/var-dumper": "^5.2|^6.0" + }, + "require-dev": { + "dms/phpunit-arraysubset-asserts": "^0.3.0", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/phpunit-snapshot-assertions": "^4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.1.x-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\FlareClient\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Send PHP errors to Flare", + "homepage": "https://github.com/spatie/flare-client-php", + "keywords": [ + "exception", + "flare", + "reporting", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/flare-client-php/issues", + "source": "https://github.com/spatie/flare-client-php/tree/1.3.0" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-08-08T10:10:20+00:00" + }, + { + "name": "spatie/ignition", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/ignition.git", + "reference": "dd3d456779108d7078baf4e43f8c2b937d9794a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ignition/zipball/dd3d456779108d7078baf4e43f8c2b937d9794a1", + "reference": "dd3d456779108d7078baf4e43f8c2b937d9794a1", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-mbstring": "*", + "monolog/monolog": "^2.0", + "php": "^8.0", + "spatie/flare-client-php": "^1.1", + "symfony/console": "^5.4|^6.0", + "symfony/var-dumper": "^5.4|^6.0" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "symfony/process": "^5.4|^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Spatie\\Ignition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for PHP applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/ignition/issues", + "source": "https://github.com/spatie/ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-08-26T11:51:15+00:00" + }, + { + "name": "spatie/laravel-ignition", + "version": "1.5.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ignition.git", + "reference": "f2336fc79d99aab5cf27fa4aebe5e9c9ecf3808a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ignition/zipball/f2336fc79d99aab5cf27fa4aebe5e9c9ecf3808a", + "reference": "f2336fc79d99aab5cf27fa4aebe5e9c9ecf3808a", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/support": "^8.77|^9.27", + "monolog/monolog": "^2.3", + "php": "^8.0", + "spatie/flare-client-php": "^1.0.1", + "spatie/ignition": "^1.4.1", + "symfony/console": "^5.0|^6.0", + "symfony/var-dumper": "^5.0|^6.0" + }, + "require-dev": { + "filp/whoops": "^2.14", + "livewire/livewire": "^2.8|dev-develop", + "mockery/mockery": "^1.4", + "nunomaduro/larastan": "^1.0", + "orchestra/testbench": "^6.23|^7.0", + "pestphp/pest": "^1.20", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan-deprecation-rules": "^1.0", + "phpstan/phpstan-phpunit": "^1.0", + "spatie/laravel-ray": "^1.27" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelIgnition\\IgnitionServiceProvider" + ], + "aliases": { + "Flare": "Spatie\\LaravelIgnition\\Facades\\Flare" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Spatie\\LaravelIgnition\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Spatie", + "email": "info@spatie.be", + "role": "Developer" + } + ], + "description": "A beautiful error page for Laravel applications.", + "homepage": "https://flareapp.io/ignition", + "keywords": [ + "error", + "flare", + "laravel", + "page" + ], + "support": { + "docs": "https://flareapp.io/docs/ignition-for-laravel/introduction", + "forum": "https://twitter.com/flareappio", + "issues": "https://github.com/spatie/laravel-ignition/issues", + "source": "https://github.com/spatie/laravel-ignition" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2022-10-14T12:24:21+00:00" }, { "name": "theseer/tokenizer", @@ -11786,7 +10688,7 @@ "prefer-stable": true, "prefer-lowest": false, "platform": { - "php": "^8.0", + "php": "^8.0.2", "ext-bcmath": "*", "ext-ctype": "*", "ext-dom": "*", diff --git a/config/auth.php b/config/auth.php index 9c8b558f..113a7c4a 100644 --- a/config/auth.php +++ b/config/auth.php @@ -87,8 +87,9 @@ 'providers' => [ 'users' => [ - 'driver' => 'eloquent-2fauth', + 'driver' => 'eloquent-webauthn', 'model' => App\Models\User::class, + // 'password_fallback' => true, ], 'remote-user' => [ 'driver' => 'remote-user', @@ -122,7 +123,7 @@ // for WebAuthn 'webauthn' => [ 'provider' => 'users', // The user provider using WebAuthn. - 'table' => 'web_authn_recoveries', // The table to store the recoveries. + 'table' => 'webauthn_recoveries', // The table to store the recoveries. 'expire' => 60, 'throttle' => 60, ], diff --git a/config/larapass.php b/config/larapass.php deleted file mode 100644 index 651f3dae..00000000 --- a/config/larapass.php +++ /dev/null @@ -1,174 +0,0 @@ - [ - 'name' => env('WEBAUTHN_NAME', env('APP_NAME')), - 'id' => env('WEBAUTHN_ID'), - 'icon' => env('WEBAUTHN_ICON'), - ], - - /* - |-------------------------------------------------------------------------- - | Challenge configuration - |-------------------------------------------------------------------------- - | - | When making challenges your application needs to push at least 16 bytes - | of randomness. Since we need to later check them, we'll also store the - | bytes for a sensible amount of seconds inside your default app cache. - | - */ - - 'bytes' => 16, - 'timeout' => 60, - 'cache' => env('WEBAUTHN_CACHE'), - - /* - |-------------------------------------------------------------------------- - | Algorithms - |-------------------------------------------------------------------------- - | - | Here are default algorithms to use when asking to create sign and encrypt - | binary objects like a public key and a challenge. These works almost in - | any device, but you can add or change these depending on your devices. - | - | @see https://www.iana.org/assignments/cose/cose.xhtml#algorithms - | - */ - - 'algorithms' => [ - \Cose\Algorithm\Signature\ECDSA\ES256::class, // ECDSA with SHA-256 - \Cose\Algorithm\Signature\EdDSA\Ed25519::class, // EdDSA - \Cose\Algorithm\Signature\ECDSA\ES384::class, // ECDSA with SHA-384 - \Cose\Algorithm\Signature\ECDSA\ES512::class, // ECDSA with SHA-512 - \Cose\Algorithm\Signature\RSA\RS256::class, // RSASSA-PKCS1-v1_5 with SHA-256 - ], - - - /* - |-------------------------------------------------------------------------- - | Credentials Attachment. - |-------------------------------------------------------------------------- - | - | Authentication can be tied to the current device (like when using Windows - | Hello or Touch ID) or a cross-platform device (like USB Key). When this - | is "null" the user will decide where to store his authentication info. - | - | By default, the user decides what to use for registration. If you wish - | to exclusively use a cross-platform authentication (like USB Keys, CA - | Servers or Certificates) set this to true, or false if you want to - | enforce device-only authentication. - | - | Supported: "null", "cross-platform", "platform". - | - */ - - 'attachment' => null, - - /* - |-------------------------------------------------------------------------- - | Attestation Conveyance - |-------------------------------------------------------------------------- - | - | The attestation is the data about the device and the public key used to - | sign. Using "none" means the data is meaningless, "indirect" allows to - | receive anonymized data, and "direct" means to receive the real data. - | - | Attestation Conveyance represents if the device key should be verified - | by you or not. While most of the time is not needed, you can change this - | to indirect (you verify it comes from a trustful source) or direct - | (the device includes validation data). - | - | Supported: "none", "indirect", "direct". - | - */ - - 'conveyance' => 'none', - - /* - |-------------------------------------------------------------------------- - | User presence and verification - |-------------------------------------------------------------------------- - | - | Most authenticators and smartphones will ask the user to actively verify - | themselves for log in. For example, through a touch plus pin code, - | password entry, or biometric recognition (e.g., presenting a fingerprint). - | The intent is to distinguish individual users. - | - | Supported: "required", "preferred", "discouraged". - | - | Use "required" to always ask verify, "preferred" - | to ask when possible, and "discouraged" to just ask for user presence. - | - */ - - 'login_verify' => env('WEBAUTHN_USER_VERIFICATION', 'preferred'), - - - /* - |-------------------------------------------------------------------------- - | Userless (One touch, Typeless) login - |-------------------------------------------------------------------------- - | - | By default, users must input their email to receive a list of credentials - | ID to use for authentication, but they can also login without specifying - | one if the device can remember them, allowing for true one-touch login. - | - | If required or preferred, login verification will be always required. - | - | Supported: "null", "required", "preferred", "discouraged". - | - */ - - 'userless' => null, - - /* - |-------------------------------------------------------------------------- - | Credential limit - |-------------------------------------------------------------------------- - | - | Authenticators can have multiple credentials for the same user account. - | To limit one device per user account, you can set this to true. This - | will force the attest to fail when registering another credential. - | - */ - - 'unique' => false, - - /* - |-------------------------------------------------------------------------- - | Password Fallback - |-------------------------------------------------------------------------- - | - | When using the `eloquent-webauthn´ user provider you will be able to use - | the same user provider to authenticate users using their password. When - | disabling this, users will be strictly authenticated only by WebAuthn. - | - */ - - 'fallback' => false, - - /* - |-------------------------------------------------------------------------- - | Device Confirmation - |-------------------------------------------------------------------------- - | - | If you're using the "webauthn.confirm" middleware in your routes you may - | want to adjust the time the confirmation is remembered in the browser. - | This is measured in seconds, but it can be overridden in the route. - | - */ - - 'confirm_timeout' => 10800, // 3 hours -]; diff --git a/config/webauthn.php b/config/webauthn.php new file mode 100644 index 00000000..c54e5a26 --- /dev/null +++ b/config/webauthn.php @@ -0,0 +1,37 @@ + [ + 'name' => env('WEBAUTHN_NAME', config('app.name')), + 'id' => env('WEBAUTHN_ID'), + ], + + /* + |-------------------------------------------------------------------------- + | Challenge configuration + |-------------------------------------------------------------------------- + | + | When making challenges your application needs to push at least 16 bytes + | of randomness. Since we need to later check them, we'll also store the + | bytes for a small amount of time inside this current request session. + | + */ + + 'challenge' => [ + 'bytes' => 16, + 'timeout' => 60, + 'key' => '_webauthn', + ], +]; diff --git a/database/migrations/2021_12_03_220140_create_web_authn_tables.php b/database/migrations/2021_12_03_220140_create_web_authn_tables.php index 05d0bcc7..4814b4e3 100644 --- a/database/migrations/2021_12_03_220140_create_web_authn_tables.php +++ b/database/migrations/2021_12_03_220140_create_web_authn_tables.php @@ -1,6 +1,5 @@ uuid('user_handle')->nullable(); $table->timestamps(); - $table->softDeletes(WebAuthnCredential::DELETED_AT); + $table->softDeletes('disabled_at'); $table->primary(['id', 'user_id']); }); diff --git a/database/migrations/2022_10_20_122032_create_webauthn_credentials.php b/database/migrations/2022_10_20_122032_create_webauthn_credentials.php new file mode 100644 index 00000000..c38fa5f5 --- /dev/null +++ b/database/migrations/2022_10_20_122032_create_webauthn_credentials.php @@ -0,0 +1,101 @@ +where('key', 'useWebauthnOnly')->delete(); + + Schema::create('webauthn_credentials', static function (Blueprint $table): void { + static::defaultBlueprint($table); + }); + + Schema::dropIfExists('web_authn_credentials'); + Schema::rename('web_authn_recoveries', 'webauthn_recoveries'); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::dropIfExists('webauthn_credentials'); + Schema::rename('webauthn_recoveries', 'web_authn_recoveries'); + + Schema::create('web_authn_credentials', function (Blueprint $table) { + // This must be the exact same definition as migration 2021_12_03_220140_create_web_authn_tables.php + $table->string('id', 191); + $table->unsignedBigInteger('user_id'); + $table->string('name')->nullable(); + $table->string('type', 16); + $table->json('transports'); + $table->string('attestation_type'); + $table->json('trust_path'); + $table->uuid('aaguid'); + $table->binary('public_key'); + $table->unsignedInteger('counter')->default(0); + $table->uuid('user_handle')->nullable(); + $table->timestamps(); + $table->softDeletes('disabled_at'); + $table->primary(['id', 'user_id']); + }); + } + + /** + * Generate the default blueprint for the WebAuthn credentials table. + * + * @param \Illuminate\Database\Schema\Blueprint $table + * @return void + */ + protected static function defaultBlueprint(Blueprint $table): void + { + $table->string('id')->primary(); + + $table->morphs('authenticatable', 'webauthn_user_index'); + + // This is the user UUID that is generated automatically when a credential for the + // given user is created. If a second credential is created, this UUID is queried + // and then copied on top of the new one, this way the real User ID doesn't change. + $table->uuid('user_id'); + + // The app may allow the user to name or rename a credential to a friendly name, + // like "John's iPhone" or "Office Computer". + $table->string('alias')->nullable(); + + // Allows to detect cloned credentials when the assertion does not have this same counter. + $table->unsignedBigInteger('counter')->nullable(); + // Who created the credential. Should be the same reported by the Authenticator. + $table->string('rp_id'); + // Where the credential was created. Should be the same reported by the Authenticator. + $table->string('origin'); + $table->json('transports')->nullable(); + $table->uuid('aaguid')->nullable(); // GUID are essentially UUID + + // This is the public key the credential uses to verify the challenges. + $table->text('public_key'); + // The attestation of the public key. + $table->string('attestation_format')->default('none'); + // This would hold the certificate chain for other different attestation formats. + $table->json('certificates')->nullable(); + + // A way to disable the credential without deleting it. + $table->timestamp('disabled_at')->nullable(); + $table->timestamps(); + } +}; diff --git a/resources/js/components/WebAuthn.js b/resources/js/components/WebAuthn.js new file mode 100644 index 00000000..8b95fee7 --- /dev/null +++ b/resources/js/components/WebAuthn.js @@ -0,0 +1,161 @@ +/** + * MIT License + * + * Copyright (c) Italo Israel Baeza Cabrera + * https://github.com/Laragear/WebAuthn + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +export default class WebAuthn { + + /** + * Create a new WebAuthn instance. + * + */ + constructor () { + + } + + /** + * Parses the Public Key Options received from the Server for the browser. + * + * @param publicKey {Object} + * @returns {Object} + */ + parseIncomingServerOptions(publicKey) { + publicKey.challenge = WebAuthn.uint8Array(publicKey.challenge); + + if ('user' in publicKey) { + publicKey.user = { + ...publicKey.user, + id: WebAuthn.uint8Array(publicKey.user.id) + }; + } + + [ + "excludeCredentials", + "allowCredentials" + ] + .filter(key => key in publicKey) + .forEach(key => { + publicKey[key] = publicKey[key].map(data => { + return {...data, id: WebAuthn.uint8Array(data.id)}; + }); + }); + + return publicKey; + } + + + /** + * Parses the outgoing credentials from the browser to the server. + * + * @param credentials {Credential|PublicKeyCredential} + * @return {{response: {string}, rawId: string, id: string, type: string}} + */ + parseOutgoingCredentials(credentials) { + let parseCredentials = { + id: credentials.id, + type: credentials.type, + rawId: WebAuthn.arrayToBase64String(credentials.rawId), + response: {} + }; + + [ + "clientDataJSON", + "attestationObject", + "authenticatorData", + "signature", + "userHandle" + ] + .filter(key => key in credentials.response) + .forEach(key => parseCredentials.response[key] = WebAuthn.arrayToBase64String(credentials.response[key])); + + return parseCredentials; + } + + + /** + * Transform a string into Uint8Array instance. + * + * @param input {string} + * @param useAtob {boolean} + * @returns {Uint8Array} + */ + static uint8Array(input, useAtob = false) { + return Uint8Array.from( + useAtob ? atob(input) : WebAuthn.base64UrlDecode(input), c => c.charCodeAt(0) + ); + } + + + /** + * Encodes an array of bytes to a BASE64 URL string + * + * @param arrayBuffer {ArrayBuffer|Uint8Array} + * @returns {string} + */ + static arrayToBase64String(arrayBuffer) { + return btoa(String.fromCharCode(...new Uint8Array(arrayBuffer))); + } + + + /** + * Decodes a BASE64 URL string into a normal string. + * + * @param input {string} + * @returns {string|Iterable} + */ + static base64UrlDecode(input) { + input = input.replace(/-/g, "+").replace(/_/g, "/"); + + const pad = input.length % 4; + + if (pad) { + if (pad === 1) { + throw new Error("InvalidLengthError: Input base64url string is the wrong length to determine padding"); + } + + input += new Array(5 - pad).join("="); + } + + return atob(input); + } + + + /** + * Checks if the browser supports WebAuthn. + * + * @returns {boolean} + */ + static supportsWebAuthn() { + return typeof PublicKeyCredential != "undefined"; + } + + + /** + * Checks if the browser doesn't support WebAuthn. + * + * @returns {boolean} + */ + static doesntSupportWebAuthn() { + return !this.supportsWebAuthn(); + } +} diff --git a/resources/js/mixins.js b/resources/js/mixins.js index 89a3af26..6fc65b2b 100644 --- a/resources/js/mixins.js +++ b/resources/js/mixins.js @@ -45,120 +45,7 @@ Vue.mixin({ }, /** - * Parses the Public Key Options received from the Server for the browser. - * - * @param publicKey {Object} - * @returns {Object} - */ - parseIncomingServerOptions(publicKey) { - publicKey.challenge = this.uint8Array(publicKey.challenge); - - if (publicKey.user !== undefined) { - publicKey.user = { - ...publicKey.user, - id: this.uint8Array(publicKey.user.id, true) - }; - } - - ["excludeCredentials", "allowCredentials"] - .filter((key) => publicKey[key] !== undefined) - .forEach((key) => { - publicKey[key] = publicKey[key].map((data) => { - return { ...data, id: this.uint8Array(data.id) }; - }); - }); - - return publicKey; - }, - - /** - * Parses the outgoing credentials from the browser to the server. - * - * @param credentials {Credential|PublicKeyCredential} - * @return {{response: {string}, rawId: string, id: string, type: string}} - */ - parseOutgoingCredentials(credentials) { - let parseCredentials = { - id: credentials.id, - type: credentials.type, - rawId: this.arrayToBase64String(credentials.rawId), - response: {} - }; - [ - "clientDataJSON", - "attestationObject", - "authenticatorData", - "signature", - "userHandle" - ] - .filter((key) => credentials.response[key] !== undefined) - .forEach((key) => { - if (credentials.response[key] === null) { - parseCredentials.response[key] = null - } - else { - parseCredentials.response[key] = this.arrayToBase64String( - credentials.response[key] - ); - } - }); - - return parseCredentials; - }, - - /** - * Transform an string into Uint8Array instance. - * - * @param input {string} - * @param atob {boolean} - * @returns {Uint8Array} - */ - uint8Array(input, atob = false) { - return Uint8Array.from( - atob ? window.atob(input) : this.base64UrlDecode(input), - (c) => c.charCodeAt(0) - ); - }, - - /** - * Encodes an array of bytes to a BASE64 URL string - * - * @param arrayBuffer {ArrayBuffer|Uint8Array} - * @returns {string} - */ - arrayToBase64String(arrayBuffer) { - return btoa(String.fromCharCode(...new Uint8Array(arrayBuffer))); - }, - - /** - * - * Decodes a BASE64 URL string into a normal string. - * - * @param input {string} - * @returns {string|Iterable} - */ - base64UrlDecode(input) { - input = input.replace(/-/g, "+").replace(/_/g, "/"); - const pad = input.length % 4; - - if (pad) { - if (pad === 1) { - throw new Error( - "InvalidLengthError: Input base64url string is the wrong length to determine padding" - ); - } - - input += new Array(5 - pad).join("="); - } - - return window.atob(input); - }, - - /** - * Encodes an array of bytes to a BASE64 URL string - * - * @param arrayBuffer {ArrayBuffer|Uint8Array} - * @returns {string} + * */ inputId(fieldType, fieldName) { let prefix diff --git a/resources/js/views/auth/Login.vue b/resources/js/views/auth/Login.vue index 605e0e89..80934024 100644 --- a/resources/js/views/auth/Login.vue +++ b/resources/js/views/auth/Login.vue @@ -44,6 +44,7 @@ \ No newline at end of file diff --git a/resources/js/views/settings/WebAuthn.vue b/resources/js/views/settings/WebAuthn.vue index 789362e5..2e317733 100644 --- a/resources/js/views/settings/WebAuthn.vue +++ b/resources/js/views/settings/WebAuthn.vue @@ -60,6 +60,7 @@