From fe38ce6f517b7d822cb50b0f61434ca5a8deb8ec Mon Sep 17 00:00:00 2001 From: Lucas Eduardo Date: Wed, 18 Jun 2025 08:52:01 -0300 Subject: [PATCH 001/195] feat(service): add Miniflux service (#5843) --- public/svgs/miniflux.svg | 1 + templates/compose/miniflux.yaml | 36 +++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 public/svgs/miniflux.svg create mode 100644 templates/compose/miniflux.yaml diff --git a/public/svgs/miniflux.svg b/public/svgs/miniflux.svg new file mode 100644 index 000000000..33ae73a87 --- /dev/null +++ b/public/svgs/miniflux.svg @@ -0,0 +1 @@ +icon \ No newline at end of file diff --git a/templates/compose/miniflux.yaml b/templates/compose/miniflux.yaml new file mode 100644 index 000000000..4ed61a6fc --- /dev/null +++ b/templates/compose/miniflux.yaml @@ -0,0 +1,36 @@ +# documentation: https://miniflux.app/docs/index.html +# slogan: Miniflux is a minimalist and opinionated feed reader. +# tags: miniflux,rss,feed,self,hosted +# logo: svgs/miniflux.svg +# port: 8080 + +services: + miniflux: + image: ghcr.io/miniflux/miniflux:latest + environment: + - SERVICE_FQDN_MINIFLUX + - PORT=8080 + - RUN_MIGRATIONS=${RUN_MIGRATIONS:-1} + - CREATE_ADMIN=${CREATE_ADMIN:-1} + - ADMIN_USERNAME=${ADMIN_USERNAME:-admin} + - ADMIN_PASSWORD=${SERVICE_PASSWORD_64_ADMIN} + - BASE_URL=$SERVICE_FQDN_MINIFLUX + - DATABASE_URL=host=postgresql user=$SERVICE_USER_POSTGRES dbname=miniflux password=$SERVICE_PASSWORD_POSTGRES sslmode=disable + healthcheck: + test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:8080/"] + interval: 5s + timeout: 20s + retries: 10 + postgresql: + image: postgres:16-alpine + volumes: + - postgresql-data:/var/lib/postgresql/data + environment: + - POSTGRES_USER=$SERVICE_USER_POSTGRES + - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES + - POSTGRES_DB=${POSTGRES_DB:-miniflux} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 5s + timeout: 20s + retries: 10 From f734ff31a78adb303397a422820cfcf341357294 Mon Sep 17 00:00:00 2001 From: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> Date: Wed, 18 Jun 2025 13:53:23 +0200 Subject: [PATCH 002/195] refactor(service): karakeep naming and formatting --- public/svgs/{hoarder.svg => karakeep.svg} | 0 templates/compose/karakeep.yaml | 6 +++--- 2 files changed, 3 insertions(+), 3 deletions(-) rename public/svgs/{hoarder.svg => karakeep.svg} (100%) diff --git a/public/svgs/hoarder.svg b/public/svgs/karakeep.svg similarity index 100% rename from public/svgs/hoarder.svg rename to public/svgs/karakeep.svg diff --git a/templates/compose/karakeep.yaml b/templates/compose/karakeep.yaml index c215122cc..a0d5e67ed 100644 --- a/templates/compose/karakeep.yaml +++ b/templates/compose/karakeep.yaml @@ -1,7 +1,7 @@ # documentation: https://docs.karakeep.app/ # slogan: A self-hostable bookmark-everything app (links, notes and images) with AI-based automatic tagging and full text search # tags: media,read-it-later,pocket-alternative,omnivore-alternative,instapaper-alternative -# logo: svgs/hoarder.svg +# logo: svgs/karakeep.svg # port: 3000 services: @@ -11,13 +11,13 @@ services: - karakeep-data:/data environment: - SERVICE_FQDN_KARAKEEP + - NEXTAUTH_URL=${SERVICE_FQDN_KARAKEEP} - NEXTAUTH_SECRET=${SERVICE_PASSWORD_KARAKEEPNEXTAUTH} - MEILI_MASTER_KEY=${SERVICE_PASSWORD_MEILI} - - NEXTAUTH_URL=${SERVICE_FQDN_KARAKEEP} - MEILI_ADDR=http://meilisearch:7700 - BROWSER_WEB_URL=http://chrome:9222 - OPENAI_API_KEY=${SERVICE_OPENAI_API_KEY} - - DISABLE_SIGNUPS=${SERVICE_DISABLE_SIGNUPS} + - DISABLE_SIGNUPS=${SERVICE_DISABLE_SIGNUPS:-false} - DATA_DIR=/data chrome: From 28228677dd0caf31e33084f44b8c51d4e26093f8 Mon Sep 17 00:00:00 2001 From: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:02:51 +0200 Subject: [PATCH 003/195] refactor(service): improve miniflux - improve DB url - add depends_on - formatting, naming & order --- templates/compose/miniflux.yaml | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/templates/compose/miniflux.yaml b/templates/compose/miniflux.yaml index 4ed61a6fc..10fa75b63 100644 --- a/templates/compose/miniflux.yaml +++ b/templates/compose/miniflux.yaml @@ -9,26 +9,30 @@ services: image: ghcr.io/miniflux/miniflux:latest environment: - SERVICE_FQDN_MINIFLUX - - PORT=8080 + - BASE_URL=${SERVICE_FQDN_MINIFLUX} + - PORT=${PORT:-8080} - RUN_MIGRATIONS=${RUN_MIGRATIONS:-1} - CREATE_ADMIN=${CREATE_ADMIN:-1} - - ADMIN_USERNAME=${ADMIN_USERNAME:-admin} + - ADMIN_USERNAME=${SERVICE_USER_ADMIN} - ADMIN_PASSWORD=${SERVICE_PASSWORD_64_ADMIN} - - BASE_URL=$SERVICE_FQDN_MINIFLUX - - DATABASE_URL=host=postgresql user=$SERVICE_USER_POSTGRES dbname=miniflux password=$SERVICE_PASSWORD_POSTGRES sslmode=disable + - DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-miniflux-db}?sslmode=disable healthcheck: test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:8080/"] interval: 5s timeout: 20s retries: 10 - postgresql: + depends_on: + postgres: + condition: service_healthy + + postgres: image: postgres:16-alpine volumes: - - postgresql-data:/var/lib/postgresql/data + - miniflux-postgres-data:/var/lib/postgresql/data environment: - - POSTGRES_USER=$SERVICE_USER_POSTGRES - - POSTGRES_PASSWORD=$SERVICE_PASSWORD_POSTGRES - - POSTGRES_DB=${POSTGRES_DB:-miniflux} + - POSTGRES_USER=${SERVICE_USER_POSTGRES} + - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES} + - POSTGRES_DB=${POSTGRES_DB:-miniflux-db} healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 5s From 86ee90a9a7940beb948149a8ed07274deae027c2 Mon Sep 17 00:00:00 2001 From: CrazyTim71 <118295691+CrazyTim71@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:10:00 +0200 Subject: [PATCH 004/195] feat(service): add Pingvin Share service (#5969) --- public/svgs/pingvinshare.svg | 1 + .../compose/pingvinshare-with-clamav.yaml | 30 +++++++++++++++++++ templates/compose/pingvinshare.yaml | 24 +++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 public/svgs/pingvinshare.svg create mode 100644 templates/compose/pingvinshare-with-clamav.yaml create mode 100644 templates/compose/pingvinshare.yaml diff --git a/public/svgs/pingvinshare.svg b/public/svgs/pingvinshare.svg new file mode 100644 index 000000000..4f1f7a7bc --- /dev/null +++ b/public/svgs/pingvinshare.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/compose/pingvinshare-with-clamav.yaml b/templates/compose/pingvinshare-with-clamav.yaml new file mode 100644 index 000000000..1691e190f --- /dev/null +++ b/templates/compose/pingvinshare-with-clamav.yaml @@ -0,0 +1,30 @@ +# documentation: https://github.com/stonith404/pingvin-share +# slogan: A self-hosted file sharing platform that combines lightness and beauty, perfect for seamless and efficient file sharing. +# tags: self-hosted, file-sharing, files, cloud, sharing +# logo: svgs/pingvinshare.svg +# port: 3000 + +services: + pingvinshare: + image: ghcr.io/stonith404/pingvin-share + environment: + - SERVICE_FQDN_PINGVINSHARE_3000 + - TRUST_PROXY=${TRUST_PROXY:-true} + volumes: + - pingvinshare_data:/opt/app/backend/data + - pingvinshare_images:/opt/app/frontend/public/img + depends_on: + clamav: + condition: service_healthy + healthcheck: + test: + [ + "CMD-SHELL", + "wget --quiet --tries=1 --spider http://localhost:3000/api/health || exit 1", + ] + interval: 5s + timeout: 20s + retries: 10 + + clamav: + image: clamav/clamav diff --git a/templates/compose/pingvinshare.yaml b/templates/compose/pingvinshare.yaml new file mode 100644 index 000000000..870694f9e --- /dev/null +++ b/templates/compose/pingvinshare.yaml @@ -0,0 +1,24 @@ +# documentation: https://github.com/stonith404/pingvin-share +# slogan: A self-hosted file sharing platform that combines lightness and beauty, perfect for seamless and efficient file sharing. +# tags: self-hosted, file-sharing, files, cloud, sharing +# logo: svgs/pingvinshare.svg +# port: 3000 + +services: + pingvinshare: + image: ghcr.io/stonith404/pingvin-share + environment: + - SERVICE_FQDN_PINGVINSHARE_3000 + - TRUST_PROXY=${TRUST_PROXY:-true} + volumes: + - pingvinshare_data:/opt/app/backend/data + - pingvinshare_images:/opt/app/frontend/public/img + healthcheck: + test: + [ + "CMD-SHELL", + "wget --quiet --tries=1 --spider http://localhost:3000/api/health || exit 1", + ] + interval: 5s + timeout: 20s + retries: 10 From 8048c6692420e4f5efe05de9ecbedbb803815619 Mon Sep 17 00:00:00 2001 From: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:14:50 +0200 Subject: [PATCH 005/195] fix(service): pingvinshare-with-clamav - add platform to make clamav work - formatting --- templates/compose/pingvinshare-with-clamav.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/templates/compose/pingvinshare-with-clamav.yaml b/templates/compose/pingvinshare-with-clamav.yaml index 1691e190f..f8dd992c6 100644 --- a/templates/compose/pingvinshare-with-clamav.yaml +++ b/templates/compose/pingvinshare-with-clamav.yaml @@ -13,9 +13,6 @@ services: volumes: - pingvinshare_data:/opt/app/backend/data - pingvinshare_images:/opt/app/frontend/public/img - depends_on: - clamav: - condition: service_healthy healthcheck: test: [ @@ -25,6 +22,10 @@ services: interval: 5s timeout: 20s retries: 10 + depends_on: + clamav: + condition: service_healthy clamav: image: clamav/clamav + platform: linux/amd64 From 4375f52c5d7df4e5d2ce3cec5fdfcf5a80beadc1 Mon Sep 17 00:00:00 2001 From: Yassir Elmarissi Date: Wed, 18 Jun 2025 14:19:01 +0200 Subject: [PATCH 006/195] feat(auth): Add Discord OAuth Provider (#5552) --- .cursor/rules/security-patterns.mdc | 1 + .cursor/rules/technology-stack.mdc | 2 +- app/Livewire/Server/Security/Patches.php | 1 + app/Livewire/Subscription/Index.php | 2 +- app/Providers/EventServiceProvider.php | 2 + bootstrap/helpers/socialite.php | 1 + composer.json | 1 + composer.lock | 50 ++++++++++++++++++++++++ database/seeders/OauthSettingSeeder.php | 1 + lang/ar.json | 1 + lang/az.json | 1 + lang/cs.json | 1 + lang/de.json | 1 + lang/en.json | 1 + lang/es.json | 1 + lang/fa.json | 1 + lang/fr.json | 1 + lang/id.json | 1 + lang/it.json | 1 + lang/ja.json | 1 + lang/no.json | 1 + lang/pt-br.json | 1 + lang/pt.json | 1 + lang/ro.json | 1 + lang/tr.json | 1 + lang/vi.json | 1 + lang/zh-cn.json | 1 + lang/zh-tw.json | 1 + 28 files changed, 78 insertions(+), 2 deletions(-) diff --git a/.cursor/rules/security-patterns.mdc b/.cursor/rules/security-patterns.mdc index d47d03375..85c48c035 100644 --- a/.cursor/rules/security-patterns.mdc +++ b/.cursor/rules/security-patterns.mdc @@ -22,6 +22,7 @@ Coolify implements **defense-in-depth security** with multiple layers of protect - Google OAuth - Microsoft Azure AD - Authentik + - Discord - GitHub (via GitHub Apps) - GitLab diff --git a/.cursor/rules/technology-stack.mdc b/.cursor/rules/technology-stack.mdc index 1e894720c..3082b9c3e 100644 --- a/.cursor/rules/technology-stack.mdc +++ b/.cursor/rules/technology-stack.mdc @@ -90,7 +90,7 @@ alwaysApply: false - **Purpose**: OAuth provider integration - **Providers**: - GitHub, GitLab, Google - - Microsoft Azure, Authentik + - Microsoft Azure, Authentik, Discord - Custom OAuth implementations ## Background Processing diff --git a/app/Livewire/Server/Security/Patches.php b/app/Livewire/Server/Security/Patches.php index 9392fc351..b7d17a61d 100644 --- a/app/Livewire/Server/Security/Patches.php +++ b/app/Livewire/Server/Security/Patches.php @@ -69,6 +69,7 @@ public function updateAllPackages() { if (! $this->packageManager || ! $this->osId) { $this->dispatch('error', message: 'Run “Check for updates” first.'); + return; } diff --git a/app/Livewire/Subscription/Index.php b/app/Livewire/Subscription/Index.php index 8a9cc456f..ac37cca05 100644 --- a/app/Livewire/Subscription/Index.php +++ b/app/Livewire/Subscription/Index.php @@ -75,7 +75,7 @@ public function getStripeStatus() } } catch (\Exception $e) { // Log the error - logger()->error('Stripe API error: ' . $e->getMessage()); + logger()->error('Stripe API error: '.$e->getMessage()); // Set a flag to show an error message to the user $this->addError('stripe', 'Could not retrieve subscription information. Please try again later.'); } finally { diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index b960dd8e3..0678100df 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -9,6 +9,7 @@ use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use SocialiteProviders\Authentik\AuthentikExtendSocialite; use SocialiteProviders\Azure\AzureExtendSocialite; +use SocialiteProviders\Discord\DiscordExtendSocialite; use SocialiteProviders\Google\GoogleExtendSocialite; use SocialiteProviders\Infomaniak\InfomaniakExtendSocialite; use SocialiteProviders\Manager\SocialiteWasCalled; @@ -25,6 +26,7 @@ class EventServiceProvider extends ServiceProvider SocialiteWasCalled::class => [ AzureExtendSocialite::class.'@handle', AuthentikExtendSocialite::class.'@handle', + DiscordExtendSocialite::class.'@handle', GoogleExtendSocialite::class.'@handle', InfomaniakExtendSocialite::class.'@handle', ], diff --git a/bootstrap/helpers/socialite.php b/bootstrap/helpers/socialite.php index fe19752cb..2ed1ed1c3 100644 --- a/bootstrap/helpers/socialite.php +++ b/bootstrap/helpers/socialite.php @@ -53,6 +53,7 @@ function get_socialite_provider(string $provider) $provider_class_map = [ 'bitbucket' => \Laravel\Socialite\Two\BitbucketProvider::class, + 'discord' => \SocialiteProviders\Discord\Provider::class, 'github' => \Laravel\Socialite\Two\GithubProvider::class, 'gitlab' => \Laravel\Socialite\Two\GitlabProvider::class, 'infomaniak' => \SocialiteProviders\Infomaniak\Provider::class, diff --git a/composer.json b/composer.json index 3fb1206ce..2495dc1c8 100644 --- a/composer.json +++ b/composer.json @@ -39,6 +39,7 @@ "resend/resend-laravel": "^0.17.0", "sentry/sentry-laravel": "^4.13", "socialiteproviders/authentik": "^5.2", + "socialiteproviders/discord": "^4.2", "socialiteproviders/google": "^4.1", "socialiteproviders/infomaniak": "^4.0", "socialiteproviders/microsoft-azure": "^5.2", diff --git a/composer.lock b/composer.lock index 14ae57fcb..5794ac482 100644 --- a/composer.lock +++ b/composer.lock @@ -7482,6 +7482,56 @@ }, "time": "2023-11-07T22:21:16+00:00" }, + { + "name": "socialiteproviders/discord", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/SocialiteProviders/Discord.git", + "reference": "c71c379acfdca5ba4aa65a3db5ae5222852a919c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SocialiteProviders/Discord/zipball/c71c379acfdca5ba4aa65a3db5ae5222852a919c", + "reference": "c71c379acfdca5ba4aa65a3db5ae5222852a919c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.4 || ^8.0", + "socialiteproviders/manager": "~4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "SocialiteProviders\\Discord\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christopher Eklund", + "email": "eklundchristopher@gmail.com" + } + ], + "description": "Discord OAuth2 Provider for Laravel Socialite", + "keywords": [ + "discord", + "laravel", + "oauth", + "provider", + "socialite" + ], + "support": { + "docs": "https://socialiteproviders.com/discord", + "issues": "https://github.com/socialiteproviders/providers/issues", + "source": "https://github.com/socialiteproviders/providers" + }, + "time": "2023-07-24T23:28:47+00:00" + }, { "name": "socialiteproviders/google", "version": "4.1.0", diff --git a/database/seeders/OauthSettingSeeder.php b/database/seeders/OauthSettingSeeder.php index fa692d2dc..9adcb04d4 100644 --- a/database/seeders/OauthSettingSeeder.php +++ b/database/seeders/OauthSettingSeeder.php @@ -17,6 +17,7 @@ public function run(): void $providers = collect([ 'azure', 'bitbucket', + 'discord', 'github', 'gitlab', 'google', diff --git a/lang/ar.json b/lang/ar.json index 9befd1e4a..3a0e32fc3 100644 --- a/lang/ar.json +++ b/lang/ar.json @@ -3,6 +3,7 @@ "auth.login.authentik": "تسجيل الدخول باستخدام Authentik", "auth.login.azure": "تسجيل الدخول باستخدام Microsoft", "auth.login.bitbucket": "تسجيل الدخول باستخدام Bitbucket", + "auth.login.discord": "تسجيل الدخول باستخدام Discord", "auth.login.github": "تسجيل الدخول باستخدام GitHub", "auth.login.gitlab": "تسجيل الدخول باستخدام Gitlab", "auth.login.google": "تسجيل الدخول باستخدام Google", diff --git a/lang/az.json b/lang/az.json index 973c70c2f..4bd437f6a 100644 --- a/lang/az.json +++ b/lang/az.json @@ -3,6 +3,7 @@ "auth.login.authentik": "Authentik ilə daxil ol", "auth.login.azure": "Azure ilə daxil ol", "auth.login.bitbucket": "Bitbucket ilə daxil ol", + "auth.login.discord": "Discord ilə daxil ol", "auth.login.github": "Github ilə daxil ol", "auth.login.gitlab": "GitLab ilə daxil ol", "auth.login.google": "Google ilə daxil ol", diff --git a/lang/cs.json b/lang/cs.json index 270fd272b..83f7c3c55 100644 --- a/lang/cs.json +++ b/lang/cs.json @@ -2,6 +2,7 @@ "auth.login": "Přihlásit se", "auth.login.azure": "Přihlásit se pomocí Microsoftu", "auth.login.bitbucket": "Přihlásit se pomocí Bitbucketu", + "auth.login.discord": "Přihlásit se pomocí Discordu", "auth.login.github": "Přihlásit se pomocí GitHubu", "auth.login.gitlab": "Přihlásit se pomocí Gitlabu", "auth.login.google": "Přihlásit se pomocí Google", diff --git a/lang/de.json b/lang/de.json index c5644e3a7..8388a2b08 100644 --- a/lang/de.json +++ b/lang/de.json @@ -2,6 +2,7 @@ "auth.login": "Anmelden", "auth.login.azure": "Mit Microsoft anmelden", "auth.login.bitbucket": "Mit Bitbucket anmelden", + "auth.login.discord": "Mit Discord anmelden", "auth.login.github": "Mit GitHub anmelden", "auth.login.gitlab": "Mit GitLab anmelden", "auth.login.google": "Mit Google anmelden", diff --git a/lang/en.json b/lang/en.json index cdca68601..d127de5a9 100644 --- a/lang/en.json +++ b/lang/en.json @@ -3,6 +3,7 @@ "auth.login.authentik": "Login with Authentik", "auth.login.azure": "Login with Microsoft", "auth.login.bitbucket": "Login with Bitbucket", + "auth.login.discord": "Login with Discord", "auth.login.github": "Login with GitHub", "auth.login.gitlab": "Login with Gitlab", "auth.login.google": "Login with Google", diff --git a/lang/es.json b/lang/es.json index aceacd462..fde5b8805 100644 --- a/lang/es.json +++ b/lang/es.json @@ -2,6 +2,7 @@ "auth.login": "Iniciar Sesión", "auth.login.azure": "Acceder con Microsoft", "auth.login.bitbucket": "Acceder con Bitbucket", + "auth.login.discord": "Acceder con Discord", "auth.login.github": "Acceder con GitHub", "auth.login.gitlab": "Acceder con Gitlab", "auth.login.google": "Acceder con Google", diff --git a/lang/fa.json b/lang/fa.json index 7a714e626..48d7facc3 100644 --- a/lang/fa.json +++ b/lang/fa.json @@ -2,6 +2,7 @@ "auth.login": "ورود", "auth.login.azure": "ورود با مایکروسافت", "auth.login.bitbucket": "ورود با Bitbucket", + "auth.login.discord": "ورود با Discord", "auth.login.github": "ورود با گیت هاب", "auth.login.gitlab": "ورود با گیت لب", "auth.login.google": "ورود با گوگل", diff --git a/lang/fr.json b/lang/fr.json index 68763d5e0..ef2b26b9b 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -3,6 +3,7 @@ "auth.login.authentik": "Connexion avec Authentik", "auth.login.azure": "Connexion avec Microsoft", "auth.login.bitbucket": "Connexion avec Bitbucket", + "auth.login.discord": "Connexion avec Discord", "auth.login.github": "Connexion avec GitHub", "auth.login.gitlab": "Connexion avec Gitlab", "auth.login.google": "Connexion avec Google", diff --git a/lang/id.json b/lang/id.json index d35556402..c77d65679 100644 --- a/lang/id.json +++ b/lang/id.json @@ -3,6 +3,7 @@ "auth.login.authentik": "Masuk dengan Authentik", "auth.login.azure": "Masuk dengan Microsoft", "auth.login.bitbucket": "Masuk dengan Bitbucket", + "auth.login.discord": "Masuk dengan Discord", "auth.login.github": "Masuk dengan GitHub", "auth.login.gitlab": "Masuk dengan Gitlab", "auth.login.google": "Masuk dengan Google", diff --git a/lang/it.json b/lang/it.json index 1923251a5..f867d2696 100644 --- a/lang/it.json +++ b/lang/it.json @@ -3,6 +3,7 @@ "auth.login.authentik": "Accedi con Authentik", "auth.login.azure": "Accedi con Microsoft", "auth.login.bitbucket": "Accedi con Bitbucket", + "auth.login.discord": "Accedi con Discord", "auth.login.github": "Accedi con GitHub", "auth.login.gitlab": "Accedi con Gitlab", "auth.login.google": "Accedi con Google", diff --git a/lang/ja.json b/lang/ja.json index 4d4589900..7afdb05c1 100644 --- a/lang/ja.json +++ b/lang/ja.json @@ -2,6 +2,7 @@ "auth.login": "ログイン", "auth.login.azure": "Microsoftでログイン", "auth.login.bitbucket": "Bitbucketでログイン", + "auth.login.discord": "Discordでログイン", "auth.login.github": "GitHubでログイン", "auth.login.gitlab": "Gitlabでログイン", "auth.login.google": "Googleでログイン", diff --git a/lang/no.json b/lang/no.json index 29d5af124..fa3693f5f 100644 --- a/lang/no.json +++ b/lang/no.json @@ -3,6 +3,7 @@ "auth.login.authentik": "Logg inn med Authentik", "auth.login.azure": "Logg inn med Microsoft", "auth.login.bitbucket": "Logg inn med Bitbucket", + "auth.login.discord": "Logg inn med Discord", "auth.login.github": "Logg inn med GitHub", "auth.login.gitlab": "Logg inn med Gitlab", "auth.login.google": "Logg inn med Google", diff --git a/lang/pt-br.json b/lang/pt-br.json index 2e793890f..efd97c496 100644 --- a/lang/pt-br.json +++ b/lang/pt-br.json @@ -3,6 +3,7 @@ "auth.login.authentik": "Entrar com Authentik", "auth.login.azure": "Entrar com Microsoft", "auth.login.bitbucket": "Entrar com Bitbucket", + "auth.login.discord": "Entrar com Discord", "auth.login.github": "Entrar com GitHub", "auth.login.gitlab": "Entrar com Gitlab", "auth.login.google": "Entrar com Google", diff --git a/lang/pt.json b/lang/pt.json index c5f393e65..d39390f7f 100644 --- a/lang/pt.json +++ b/lang/pt.json @@ -2,6 +2,7 @@ "auth.login": "Entrar", "auth.login.azure": "Entrar com Microsoft", "auth.login.bitbucket": "Entrar com Bitbucket", + "auth.login.discord": "Entrar com Discord", "auth.login.github": "Entrar com GitHub", "auth.login.gitlab": "Entrar com Gitlab", "auth.login.google": "Entrar com Google", diff --git a/lang/ro.json b/lang/ro.json index 4c7968cfa..499c5d60f 100644 --- a/lang/ro.json +++ b/lang/ro.json @@ -2,6 +2,7 @@ "auth.login": "Autentificare", "auth.login.azure": "Autentificare prin Microsoft", "auth.login.bitbucket": "Autentificare prin Bitbucket", + "auth.login.discord": "Autentificare prin Discord", "auth.login.github": "Autentificare prin GitHub", "auth.login.gitlab": "Autentificare prin Gitlab", "auth.login.google": "Autentificare prin Google", diff --git a/lang/tr.json b/lang/tr.json index 663c756f9..ef9ad216a 100644 --- a/lang/tr.json +++ b/lang/tr.json @@ -2,6 +2,7 @@ "auth.login": "Giriş", "auth.login.azure": "Microsoft ile Giriş Yap", "auth.login.bitbucket": "Bitbucket ile Giriş Yap", + "auth.login.discord": "Discord ile Giriş Yap", "auth.login.github": "GitHub ile Giriş Yap", "auth.login.gitlab": "GitLab ile Giriş Yap", "auth.login.google": "Google ile Giriş Yap", diff --git a/lang/vi.json b/lang/vi.json index bb43fd34d..050ef337f 100644 --- a/lang/vi.json +++ b/lang/vi.json @@ -2,6 +2,7 @@ "auth.login": "Đăng Nhập", "auth.login.azure": "Đăng Nhập Bằng Microsoft", "auth.login.bitbucket": "Đăng Nhập Bằng Bitbucket", + "auth.login.discord": "Đăng Nhập Bằng Discord", "auth.login.github": "Đăng Nhập Bằng GitHub", "auth.login.gitlab": "Đăng Nhập Bằng Gitlab", "auth.login.google": "Đăng Nhập Bằng Google", diff --git a/lang/zh-cn.json b/lang/zh-cn.json index 944887a5f..7908b53ee 100644 --- a/lang/zh-cn.json +++ b/lang/zh-cn.json @@ -2,6 +2,7 @@ "auth.login": "登录", "auth.login.azure": "使用 Microsoft 登录", "auth.login.bitbucket": "使用 Bitbucket 登录", + "auth.login.discord": "使用 Discord 登录", "auth.login.github": "使用 GitHub 登录", "auth.login.gitlab": "使用 Gitlab 登录", "auth.login.google": "使用 Google 登录", diff --git a/lang/zh-tw.json b/lang/zh-tw.json index c42ebb33e..470680824 100644 --- a/lang/zh-tw.json +++ b/lang/zh-tw.json @@ -2,6 +2,7 @@ "auth.login": "登入", "auth.login.azure": "使用 Microsoft 登入", "auth.login.bitbucket": "使用 Bitbucket 登入", + "auth.login.discord": "使用 Discord 登入", "auth.login.github": "使用 GitHub 登入", "auth.login.gitlab": "使用 Gitlab 登入", "auth.login.google": "使用 Google 登入", From a77bd8825824fbc4d1cfc8a949613a7f74356edf Mon Sep 17 00:00:00 2001 From: Yassir Elmarissi Date: Wed, 18 Jun 2025 14:29:46 +0200 Subject: [PATCH 007/195] feat(auth): Add Clerk OAuth Provider (#5553) --- .cursor/rules/security-patterns.mdc | 1 + .cursor/rules/technology-stack.mdc | 2 +- app/Models/OauthSetting.php | 1 + app/Providers/EventServiceProvider.php | 2 ++ bootstrap/helpers/socialite.php | 6 ++-- composer.json | 1 + composer.lock | 28 +++++++++++++++++-- config/services.php | 7 +++++ database/seeders/OauthSettingSeeder.php | 1 + lang/ar.json | 1 + lang/az.json | 1 + lang/cs.json | 1 + lang/de.json | 1 + lang/en.json | 1 + lang/es.json | 1 + lang/fa.json | 1 + lang/fr.json | 1 + lang/id.json | 1 + lang/it.json | 1 + lang/ja.json | 1 + lang/no.json | 1 + lang/pt-br.json | 1 + lang/pt.json | 1 + lang/ro.json | 1 + lang/tr.json | 1 + lang/vi.json | 1 + lang/zh-cn.json | 1 + lang/zh-tw.json | 1 + .../views/livewire/settings-oauth.blade.php | 2 +- 29 files changed, 63 insertions(+), 7 deletions(-) diff --git a/.cursor/rules/security-patterns.mdc b/.cursor/rules/security-patterns.mdc index 85c48c035..9cdbcaa0c 100644 --- a/.cursor/rules/security-patterns.mdc +++ b/.cursor/rules/security-patterns.mdc @@ -21,6 +21,7 @@ Coolify implements **defense-in-depth security** with multiple layers of protect - **Supported Providers**: - Google OAuth - Microsoft Azure AD + - Clerk - Authentik - Discord - GitHub (via GitHub Apps) diff --git a/.cursor/rules/technology-stack.mdc b/.cursor/rules/technology-stack.mdc index 3082b9c3e..81a2e3bb3 100644 --- a/.cursor/rules/technology-stack.mdc +++ b/.cursor/rules/technology-stack.mdc @@ -90,7 +90,7 @@ alwaysApply: false - **Purpose**: OAuth provider integration - **Providers**: - GitHub, GitLab, Google - - Microsoft Azure, Authentik, Discord + - Microsoft Azure, Authentik, Discord, Clerk - Custom OAuth implementations ## Background Processing diff --git a/app/Models/OauthSetting.php b/app/Models/OauthSetting.php index bfd332c87..08e08d85b 100644 --- a/app/Models/OauthSetting.php +++ b/app/Models/OauthSetting.php @@ -27,6 +27,7 @@ public function couldBeEnabled(): bool case 'azure': return filled($this->client_id) && filled($this->client_secret) && filled($this->tenant); case 'authentik': + case 'clerk': return filled($this->client_id) && filled($this->client_secret) && filled($this->base_url); default: return filled($this->client_id) && filled($this->client_secret); diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 0678100df..48c3c3e4f 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -9,6 +9,7 @@ use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use SocialiteProviders\Authentik\AuthentikExtendSocialite; use SocialiteProviders\Azure\AzureExtendSocialite; +use SocialiteProviders\Clerk\ClerkExtendSocialite; use SocialiteProviders\Discord\DiscordExtendSocialite; use SocialiteProviders\Google\GoogleExtendSocialite; use SocialiteProviders\Infomaniak\InfomaniakExtendSocialite; @@ -26,6 +27,7 @@ class EventServiceProvider extends ServiceProvider SocialiteWasCalled::class => [ AzureExtendSocialite::class.'@handle', AuthentikExtendSocialite::class.'@handle', + ClerkExtendSocialite::class.'@handle', DiscordExtendSocialite::class.'@handle', GoogleExtendSocialite::class.'@handle', InfomaniakExtendSocialite::class.'@handle', diff --git a/bootstrap/helpers/socialite.php b/bootstrap/helpers/socialite.php index 2ed1ed1c3..3ae70c9d6 100644 --- a/bootstrap/helpers/socialite.php +++ b/bootstrap/helpers/socialite.php @@ -22,15 +22,15 @@ function get_socialite_provider(string $provider) return Socialite::driver('azure')->setConfig($azure_config); } - if ($provider == 'authentik') { - $authentik_config = new \SocialiteProviders\Manager\Config( + if ($provider == 'authentik' || $provider == 'clerk') { + $authentik_clerk_config = new \SocialiteProviders\Manager\Config( $oauth_setting->client_id, $oauth_setting->client_secret, $oauth_setting->redirect_uri, ['base_url' => $oauth_setting->base_url], ); - return Socialite::driver('authentik')->setConfig($authentik_config); + return Socialite::driver($provider)->setConfig($authentik_clerk_config); } if ($provider == 'google') { diff --git a/composer.json b/composer.json index 2495dc1c8..bfe2b98b4 100644 --- a/composer.json +++ b/composer.json @@ -39,6 +39,7 @@ "resend/resend-laravel": "^0.17.0", "sentry/sentry-laravel": "^4.13", "socialiteproviders/authentik": "^5.2", + "socialiteproviders/clerk": "^5.0", "socialiteproviders/discord": "^4.2", "socialiteproviders/google": "^4.1", "socialiteproviders/infomaniak": "^4.0", diff --git a/composer.lock b/composer.lock index 5794ac482..22a0b2f35 100644 --- a/composer.lock +++ b/composer.lock @@ -7483,6 +7483,17 @@ "time": "2023-11-07T22:21:16+00:00" }, { + "name": "socialiteproviders/clerk", + "version": "5.0.0", + "source": { + "type": "git", + "url": "https://github.com/SocialiteProviders/Clerk.git", + "reference": "41e123036001ff37851b9622a910010c0e487d6a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SocialiteProviders/Clerk/zipball/41e123036001ff37851b9622a910010c0e487d6a", + "reference": "41e123036001ff37851b9622a910010c0e487d6a", "name": "socialiteproviders/discord", "version": "4.2.0", "source": { @@ -7498,12 +7509,13 @@ }, "require": { "ext-json": "*", - "php": "^7.4 || ^8.0", - "socialiteproviders/manager": "~4.0" + "php": "^8.0", + "socialiteproviders/manager": "^4.4" }, "type": "library", "autoload": { "psr-4": { + "SocialiteProviders\\Clerk\\": "" "SocialiteProviders\\Discord\\": "" } }, @@ -7513,6 +7525,13 @@ ], "authors": [ { + "name": "Ignacio Cano", + "email": "dev@nacho.sh" + } + ], + "description": "Clerk OAuth2 Provider for Laravel Socialite", + "keywords": [ + "clerk", "name": "Christopher Eklund", "email": "eklundchristopher@gmail.com" } @@ -7526,6 +7545,11 @@ "socialite" ], "support": { + "docs": "https://socialiteproviders.com/clerk", + "issues": "https://github.com/socialiteproviders/providers/issues", + "source": "https://github.com/socialiteproviders/providers" + }, + "time": "2024-02-19T12:17:59+00:00" "docs": "https://socialiteproviders.com/discord", "issues": "https://github.com/socialiteproviders/providers/issues", "source": "https://github.com/socialiteproviders/providers" diff --git a/config/services.php b/config/services.php index d1c4a3699..cb1929bec 100644 --- a/config/services.php +++ b/config/services.php @@ -46,6 +46,13 @@ 'redirect' => env('AUTHENTIK_REDIRECT_URI'), ], + 'clerk' => [ + 'client_id' => env('CLERK_CLIENT_ID'), + 'client_secret' => env('CLERK_CLIENT_SECRET'), + 'redirect' => env('CLERK_REDIRECT_URI'), + 'base_url' => env('CLERK_BASE_URL'), + ], + 'google' => [ 'client_id' => env('GOOGLE_CLIENT_ID'), 'client_secret' => env('GOOGLE_CLIENT_SECRET'), diff --git a/database/seeders/OauthSettingSeeder.php b/database/seeders/OauthSettingSeeder.php index 9adcb04d4..06b37ca44 100644 --- a/database/seeders/OauthSettingSeeder.php +++ b/database/seeders/OauthSettingSeeder.php @@ -17,6 +17,7 @@ public function run(): void $providers = collect([ 'azure', 'bitbucket', + 'clerk', 'discord', 'github', 'gitlab', diff --git a/lang/ar.json b/lang/ar.json index 3a0e32fc3..263924c24 100644 --- a/lang/ar.json +++ b/lang/ar.json @@ -3,6 +3,7 @@ "auth.login.authentik": "تسجيل الدخول باستخدام Authentik", "auth.login.azure": "تسجيل الدخول باستخدام Microsoft", "auth.login.bitbucket": "تسجيل الدخول باستخدام Bitbucket", + "auth.login.clerk": "تسجيل الدخول باستخدام Clerk", "auth.login.discord": "تسجيل الدخول باستخدام Discord", "auth.login.github": "تسجيل الدخول باستخدام GitHub", "auth.login.gitlab": "تسجيل الدخول باستخدام Gitlab", diff --git a/lang/az.json b/lang/az.json index 4bd437f6a..92f56ddbc 100644 --- a/lang/az.json +++ b/lang/az.json @@ -3,6 +3,7 @@ "auth.login.authentik": "Authentik ilə daxil ol", "auth.login.azure": "Azure ilə daxil ol", "auth.login.bitbucket": "Bitbucket ilə daxil ol", + "auth.login.clerk": "Clerk ilə daxil ol", "auth.login.discord": "Discord ilə daxil ol", "auth.login.github": "Github ilə daxil ol", "auth.login.gitlab": "GitLab ilə daxil ol", diff --git a/lang/cs.json b/lang/cs.json index 83f7c3c55..00455aa81 100644 --- a/lang/cs.json +++ b/lang/cs.json @@ -2,6 +2,7 @@ "auth.login": "Přihlásit se", "auth.login.azure": "Přihlásit se pomocí Microsoftu", "auth.login.bitbucket": "Přihlásit se pomocí Bitbucketu", + "auth.login.clerk": "Přihlásit se pomocí Clerk", "auth.login.discord": "Přihlásit se pomocí Discordu", "auth.login.github": "Přihlásit se pomocí GitHubu", "auth.login.gitlab": "Přihlásit se pomocí Gitlabu", diff --git a/lang/de.json b/lang/de.json index 8388a2b08..9bb11fdb4 100644 --- a/lang/de.json +++ b/lang/de.json @@ -2,6 +2,7 @@ "auth.login": "Anmelden", "auth.login.azure": "Mit Microsoft anmelden", "auth.login.bitbucket": "Mit Bitbucket anmelden", + "auth.login.clerk": "Mit Clerk anmelden", "auth.login.discord": "Mit Discord anmelden", "auth.login.github": "Mit GitHub anmelden", "auth.login.gitlab": "Mit GitLab anmelden", diff --git a/lang/en.json b/lang/en.json index d127de5a9..ae7c4a2c2 100644 --- a/lang/en.json +++ b/lang/en.json @@ -3,6 +3,7 @@ "auth.login.authentik": "Login with Authentik", "auth.login.azure": "Login with Microsoft", "auth.login.bitbucket": "Login with Bitbucket", + "auth.login.clerk": "Login with Clerk", "auth.login.discord": "Login with Discord", "auth.login.github": "Login with GitHub", "auth.login.gitlab": "Login with Gitlab", diff --git a/lang/es.json b/lang/es.json index fde5b8805..73363a9bf 100644 --- a/lang/es.json +++ b/lang/es.json @@ -2,6 +2,7 @@ "auth.login": "Iniciar Sesión", "auth.login.azure": "Acceder con Microsoft", "auth.login.bitbucket": "Acceder con Bitbucket", + "auth.login.clerk": "Acceder con Clerk", "auth.login.discord": "Acceder con Discord", "auth.login.github": "Acceder con GitHub", "auth.login.gitlab": "Acceder con Gitlab", diff --git a/lang/fa.json b/lang/fa.json index 48d7facc3..d68049e77 100644 --- a/lang/fa.json +++ b/lang/fa.json @@ -2,6 +2,7 @@ "auth.login": "ورود", "auth.login.azure": "ورود با مایکروسافت", "auth.login.bitbucket": "ورود با Bitbucket", + "auth.login.clerk": "ورود با Clerk", "auth.login.discord": "ورود با Discord", "auth.login.github": "ورود با گیت هاب", "auth.login.gitlab": "ورود با گیت لب", diff --git a/lang/fr.json b/lang/fr.json index ef2b26b9b..2516d0f69 100644 --- a/lang/fr.json +++ b/lang/fr.json @@ -3,6 +3,7 @@ "auth.login.authentik": "Connexion avec Authentik", "auth.login.azure": "Connexion avec Microsoft", "auth.login.bitbucket": "Connexion avec Bitbucket", + "auth.login.clerk": "Connexion avec Clerk", "auth.login.discord": "Connexion avec Discord", "auth.login.github": "Connexion avec GitHub", "auth.login.gitlab": "Connexion avec Gitlab", diff --git a/lang/id.json b/lang/id.json index c77d65679..b0e38197a 100644 --- a/lang/id.json +++ b/lang/id.json @@ -3,6 +3,7 @@ "auth.login.authentik": "Masuk dengan Authentik", "auth.login.azure": "Masuk dengan Microsoft", "auth.login.bitbucket": "Masuk dengan Bitbucket", + "auth.login.clerk": "Masuk dengan Clerk", "auth.login.discord": "Masuk dengan Discord", "auth.login.github": "Masuk dengan GitHub", "auth.login.gitlab": "Masuk dengan Gitlab", diff --git a/lang/it.json b/lang/it.json index f867d2696..c0edc314b 100644 --- a/lang/it.json +++ b/lang/it.json @@ -3,6 +3,7 @@ "auth.login.authentik": "Accedi con Authentik", "auth.login.azure": "Accedi con Microsoft", "auth.login.bitbucket": "Accedi con Bitbucket", + "auth.login.clerk": "Accedi con Clerk", "auth.login.discord": "Accedi con Discord", "auth.login.github": "Accedi con GitHub", "auth.login.gitlab": "Accedi con Gitlab", diff --git a/lang/ja.json b/lang/ja.json index 7afdb05c1..87d87d99b 100644 --- a/lang/ja.json +++ b/lang/ja.json @@ -2,6 +2,7 @@ "auth.login": "ログイン", "auth.login.azure": "Microsoftでログイン", "auth.login.bitbucket": "Bitbucketでログイン", + "auth.login.clerk": "Clerkでログイン", "auth.login.discord": "Discordでログイン", "auth.login.github": "GitHubでログイン", "auth.login.gitlab": "Gitlabでログイン", diff --git a/lang/no.json b/lang/no.json index fa3693f5f..a84f6aa6c 100644 --- a/lang/no.json +++ b/lang/no.json @@ -3,6 +3,7 @@ "auth.login.authentik": "Logg inn med Authentik", "auth.login.azure": "Logg inn med Microsoft", "auth.login.bitbucket": "Logg inn med Bitbucket", + "auth.login.clerk": "Logg inn med Clerk", "auth.login.discord": "Logg inn med Discord", "auth.login.github": "Logg inn med GitHub", "auth.login.gitlab": "Logg inn med Gitlab", diff --git a/lang/pt-br.json b/lang/pt-br.json index efd97c496..c3a102995 100644 --- a/lang/pt-br.json +++ b/lang/pt-br.json @@ -3,6 +3,7 @@ "auth.login.authentik": "Entrar com Authentik", "auth.login.azure": "Entrar com Microsoft", "auth.login.bitbucket": "Entrar com Bitbucket", + "auth.login.clerk": "Entrar com Clerk", "auth.login.discord": "Entrar com Discord", "auth.login.github": "Entrar com GitHub", "auth.login.gitlab": "Entrar com Gitlab", diff --git a/lang/pt.json b/lang/pt.json index d39390f7f..80ff8c146 100644 --- a/lang/pt.json +++ b/lang/pt.json @@ -2,6 +2,7 @@ "auth.login": "Entrar", "auth.login.azure": "Entrar com Microsoft", "auth.login.bitbucket": "Entrar com Bitbucket", + "auth.login.clerk": "Entrar com Clerk", "auth.login.discord": "Entrar com Discord", "auth.login.github": "Entrar com GitHub", "auth.login.gitlab": "Entrar com Gitlab", diff --git a/lang/ro.json b/lang/ro.json index 499c5d60f..5588ea6f4 100644 --- a/lang/ro.json +++ b/lang/ro.json @@ -2,6 +2,7 @@ "auth.login": "Autentificare", "auth.login.azure": "Autentificare prin Microsoft", "auth.login.bitbucket": "Autentificare prin Bitbucket", + "auth.login.clerk": "Autentificare prin Clerk", "auth.login.discord": "Autentificare prin Discord", "auth.login.github": "Autentificare prin GitHub", "auth.login.gitlab": "Autentificare prin Gitlab", diff --git a/lang/tr.json b/lang/tr.json index ef9ad216a..74f693dc9 100644 --- a/lang/tr.json +++ b/lang/tr.json @@ -2,6 +2,7 @@ "auth.login": "Giriş", "auth.login.azure": "Microsoft ile Giriş Yap", "auth.login.bitbucket": "Bitbucket ile Giriş Yap", + "auth.login.clerk": "Clerk ile Giriş Yap", "auth.login.discord": "Discord ile Giriş Yap", "auth.login.github": "GitHub ile Giriş Yap", "auth.login.gitlab": "GitLab ile Giriş Yap", diff --git a/lang/vi.json b/lang/vi.json index 050ef337f..46edac599 100644 --- a/lang/vi.json +++ b/lang/vi.json @@ -2,6 +2,7 @@ "auth.login": "Đăng Nhập", "auth.login.azure": "Đăng Nhập Bằng Microsoft", "auth.login.bitbucket": "Đăng Nhập Bằng Bitbucket", + "auth.login.clerk": "Đăng Nhập Bằng Clerk", "auth.login.discord": "Đăng Nhập Bằng Discord", "auth.login.github": "Đăng Nhập Bằng GitHub", "auth.login.gitlab": "Đăng Nhập Bằng Gitlab", diff --git a/lang/zh-cn.json b/lang/zh-cn.json index 7908b53ee..d46c71e07 100644 --- a/lang/zh-cn.json +++ b/lang/zh-cn.json @@ -2,6 +2,7 @@ "auth.login": "登录", "auth.login.azure": "使用 Microsoft 登录", "auth.login.bitbucket": "使用 Bitbucket 登录", + "auth.login.clerk": "使用 Clerk 登录", "auth.login.discord": "使用 Discord 登录", "auth.login.github": "使用 GitHub 登录", "auth.login.gitlab": "使用 Gitlab 登录", diff --git a/lang/zh-tw.json b/lang/zh-tw.json index 470680824..c0784c7b7 100644 --- a/lang/zh-tw.json +++ b/lang/zh-tw.json @@ -2,6 +2,7 @@ "auth.login": "登入", "auth.login.azure": "使用 Microsoft 登入", "auth.login.bitbucket": "使用 Bitbucket 登入", + "auth.login.clerk": "使用 Clerk 登入", "auth.login.discord": "使用 Discord 登入", "auth.login.github": "使用 GitHub 登入", "auth.login.gitlab": "使用 Gitlab 登入", diff --git a/resources/views/livewire/settings-oauth.blade.php b/resources/views/livewire/settings-oauth.blade.php index 76d03dc14..f559f57ac 100644 --- a/resources/views/livewire/settings-oauth.blade.php +++ b/resources/views/livewire/settings-oauth.blade.php @@ -37,7 +37,7 @@ helper="Optional parameter that supplies a hosted domain (HD) to Google, which
triggers a login hint to be displayed on the OAuth screen with this domain.

Google Documentation" label="Tenant" /> @endif - @if ($oauth_setting->provider == 'authentik') + @if ($oauth_setting->provider == 'authentik' || $oauth_setting->provider == 'clerk') @endif From 1968d4d49428acae64a567105170989bab2e6961 Mon Sep 17 00:00:00 2001 From: Hauke Schnau Date: Wed, 18 Jun 2025 14:35:54 +0200 Subject: [PATCH 008/195] feat(auth): add Zitadel OAuth Provider (#5490) --- app/Providers/EventServiceProvider.php | 2 ++ bootstrap/helpers/socialite.php | 11 +++++++++++ composer.json | 1 + config/services.php | 7 +++++++ database/seeders/OauthSettingSeeder.php | 1 + lang/de.json | 1 + lang/en.json | 1 + resources/views/livewire/settings-oauth.blade.php | 2 +- 8 files changed, 25 insertions(+), 1 deletion(-) diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 48c3c3e4f..2d9910add 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -14,6 +14,7 @@ use SocialiteProviders\Google\GoogleExtendSocialite; use SocialiteProviders\Infomaniak\InfomaniakExtendSocialite; use SocialiteProviders\Manager\SocialiteWasCalled; +use SocialiteProviders\Zitadel\ZitadelExtendSocialite; class EventServiceProvider extends ServiceProvider { @@ -31,6 +32,7 @@ class EventServiceProvider extends ServiceProvider DiscordExtendSocialite::class.'@handle', GoogleExtendSocialite::class.'@handle', InfomaniakExtendSocialite::class.'@handle', + ZitadelExtendSocialite::class.'@handle', ], ]; diff --git a/bootstrap/helpers/socialite.php b/bootstrap/helpers/socialite.php index 3ae70c9d6..961f6809b 100644 --- a/bootstrap/helpers/socialite.php +++ b/bootstrap/helpers/socialite.php @@ -33,6 +33,17 @@ function get_socialite_provider(string $provider) return Socialite::driver($provider)->setConfig($authentik_clerk_config); } + if ($provider == 'zitadel') { + $zitadel_config = new \SocialiteProviders\Manager\Config( + $oauth_setting->client_id, + $oauth_setting->client_secret, + $oauth_setting->redirect_uri, + ['base_url' => $oauth_setting->base_url], + ); + + return Socialite::driver('zitadel')->setConfig($zitadel_config); + } + if ($provider == 'google') { $google_config = new \SocialiteProviders\Manager\Config( $oauth_setting->client_id, diff --git a/composer.json b/composer.json index bfe2b98b4..e3d2ae780 100644 --- a/composer.json +++ b/composer.json @@ -44,6 +44,7 @@ "socialiteproviders/google": "^4.1", "socialiteproviders/infomaniak": "^4.0", "socialiteproviders/microsoft-azure": "^5.2", + "socialiteproviders/zitadel": "^4.1", "spatie/laravel-activitylog": "^4.10.1", "spatie/laravel-data": "^4.13.1", "spatie/laravel-ray": "^1.39.1", diff --git a/config/services.php b/config/services.php index cb1929bec..7add50a5c 100644 --- a/config/services.php +++ b/config/services.php @@ -60,4 +60,11 @@ 'tenant' => env('GOOGLE_TENANT'), ], + 'zitadel' => [ + 'client_id' => env('ZITADEL_CLIENT_ID'), + 'client_secret' => env('ZITADEL_CLIENT_SECRET'), + 'redirect' => env('ZITADEL_REDIRECT_URI'), + 'base_url' => env('ZITADEL_BASE_URL'), + ] + ]; diff --git a/database/seeders/OauthSettingSeeder.php b/database/seeders/OauthSettingSeeder.php index 06b37ca44..2e5e6fcc4 100644 --- a/database/seeders/OauthSettingSeeder.php +++ b/database/seeders/OauthSettingSeeder.php @@ -24,6 +24,7 @@ public function run(): void 'google', 'authentik', 'infomaniak', + 'zitadel', ]); $isOauthSeeded = OauthSetting::count() > 0; diff --git a/lang/de.json b/lang/de.json index 9bb11fdb4..f56b21710 100644 --- a/lang/de.json +++ b/lang/de.json @@ -8,6 +8,7 @@ "auth.login.gitlab": "Mit GitLab anmelden", "auth.login.google": "Mit Google anmelden", "auth.login.infomaniak": "Mit Infomaniak anmelden", + "auth.login.zitadel": "Mit Zitadel anmelden", "auth.already_registered": "Bereits registriert?", "auth.confirm_password": "Passwort bestätigen", "auth.forgot_password": "Passwort vergessen", diff --git a/lang/en.json b/lang/en.json index ae7c4a2c2..4a398a9f9 100644 --- a/lang/en.json +++ b/lang/en.json @@ -9,6 +9,7 @@ "auth.login.gitlab": "Login with Gitlab", "auth.login.google": "Login with Google", "auth.login.infomaniak": "Login with Infomaniak", + "auth.login.zitadel": "Login with Zitadel", "auth.already_registered": "Already registered?", "auth.confirm_password": "Confirm password", "auth.forgot_password": "Forgot password", diff --git a/resources/views/livewire/settings-oauth.blade.php b/resources/views/livewire/settings-oauth.blade.php index f559f57ac..8ffad258f 100644 --- a/resources/views/livewire/settings-oauth.blade.php +++ b/resources/views/livewire/settings-oauth.blade.php @@ -37,7 +37,7 @@ helper="Optional parameter that supplies a hosted domain (HD) to Google, which
triggers a login hint to be displayed on the OAuth screen with this domain.

Google Documentation" label="Tenant" /> @endif - @if ($oauth_setting->provider == 'authentik' || $oauth_setting->provider == 'clerk') + @if ($oauth_setting->provider == 'authentik' || $oauth_setting->provider == 'clerk' || $oauth_setting->provider == 'zitadel') @endif From 221b82cf0675eab08a36874623727d9194fc5ddb Mon Sep 17 00:00:00 2001 From: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:38:28 +0200 Subject: [PATCH 009/195] Update composer.lock --- composer.lock | 507 +++++++++++++++++++++++++++++--------------------- 1 file changed, 290 insertions(+), 217 deletions(-) diff --git a/composer.lock b/composer.lock index 22a0b2f35..c8eb533c4 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": "ae74a752b941c9b981288c2934479eb8", + "content-hash": "b436e0a37ecdd772387fec6838b2582f", "packages": [ { "name": "amphp/amp", @@ -870,16 +870,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.343.20", + "version": "3.345.0", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "bf40b00d2e1cbd2a5d8c903743073440d8ebb5dc" + "reference": "61b4675bc02db8d7f3e1ba6931dc827c5ae23aa8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/bf40b00d2e1cbd2a5d8c903743073440d8ebb5dc", - "reference": "bf40b00d2e1cbd2a5d8c903743073440d8ebb5dc", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/61b4675bc02db8d7f3e1ba6931dc827c5ae23aa8", + "reference": "61b4675bc02db8d7f3e1ba6931dc827c5ae23aa8", "shasum": "" }, "require": { @@ -961,9 +961,9 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.343.20" + "source": "https://github.com/aws/aws-sdk-php/tree/3.345.0" }, - "time": "2025-05-28T18:10:03+00:00" + "time": "2025-06-17T18:09:42+00:00" }, { "name": "bacon/bacon-qr-code", @@ -1021,16 +1021,16 @@ }, { "name": "brick/math", - "version": "0.12.3", + "version": "0.13.1", "source": { "type": "git", "url": "https://github.com/brick/math.git", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba" + "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/brick/math/zipball/866551da34e9a618e64a819ee1e01c20d8a588ba", - "reference": "866551da34e9a618e64a819ee1e01c20d8a588ba", + "url": "https://api.github.com/repos/brick/math/zipball/fc7ed316430118cc7836bf45faff18d5dfc8de04", + "reference": "fc7ed316430118cc7836bf45faff18d5dfc8de04", "shasum": "" }, "require": { @@ -1069,7 +1069,7 @@ ], "support": { "issues": "https://github.com/brick/math/issues", - "source": "https://github.com/brick/math/tree/0.12.3" + "source": "https://github.com/brick/math/tree/0.13.1" }, "funding": [ { @@ -1077,7 +1077,7 @@ "type": "github" } ], - "time": "2025-02-28T13:11:00+00:00" + "time": "2025-03-29T13:50:30+00:00" }, { "name": "carbonphp/carbon-doctrine-types", @@ -1373,16 +1373,16 @@ }, { "name": "doctrine/dbal", - "version": "4.2.3", + "version": "4.2.4", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "33d2d7fe1269b2301640c44cf2896ea607b30e3e" + "reference": "b37d160498ea91a2382a2ebe825c4ea6254fc0ec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/33d2d7fe1269b2301640c44cf2896ea607b30e3e", - "reference": "33d2d7fe1269b2301640c44cf2896ea607b30e3e", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/b37d160498ea91a2382a2ebe825c4ea6254fc0ec", + "reference": "b37d160498ea91a2382a2ebe825c4ea6254fc0ec", "shasum": "" }, "require": { @@ -1392,15 +1392,15 @@ "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "12.0.0", + "doctrine/coding-standard": "13.0.0", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.2", - "phpstan/phpstan": "2.1.1", - "phpstan/phpstan-phpunit": "2.0.3", + "phpstan/phpstan": "2.1.17", + "phpstan/phpstan-phpunit": "2.0.6", "phpstan/phpstan-strict-rules": "^2", - "phpunit/phpunit": "10.5.39", - "slevomat/coding-standard": "8.13.1", - "squizlabs/php_codesniffer": "3.10.2", + "phpunit/phpunit": "10.5.46", + "slevomat/coding-standard": "8.16.2", + "squizlabs/php_codesniffer": "3.13.1", "symfony/cache": "^6.3.8|^7.0", "symfony/console": "^5.4|^6.3|^7.0" }, @@ -1459,7 +1459,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.2.3" + "source": "https://github.com/doctrine/dbal/tree/4.2.4" }, "funding": [ { @@ -1475,7 +1475,7 @@ "type": "tidelift" } ], - "time": "2025-03-07T18:29:05+00:00" + "time": "2025-06-15T23:15:01+00:00" }, { "name": "doctrine/deprecations", @@ -2613,16 +2613,16 @@ }, { "name": "laravel/fortify", - "version": "v1.25.4", + "version": "v1.27.0", "source": { "type": "git", "url": "https://github.com/laravel/fortify.git", - "reference": "f185600e2d3a861834ad00ee3b7863f26ac25d3f" + "reference": "0fb2ec99dfee77ed66884668fc06683acca91ebd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/fortify/zipball/f185600e2d3a861834ad00ee3b7863f26ac25d3f", - "reference": "f185600e2d3a861834ad00ee3b7863f26ac25d3f", + "url": "https://api.github.com/repos/laravel/fortify/zipball/0fb2ec99dfee77ed66884668fc06683acca91ebd", + "reference": "0fb2ec99dfee77ed66884668fc06683acca91ebd", "shasum": "" }, "require": { @@ -2674,24 +2674,24 @@ "issues": "https://github.com/laravel/fortify/issues", "source": "https://github.com/laravel/fortify" }, - "time": "2025-01-26T19:34:46+00:00" + "time": "2025-06-11T14:30:52+00:00" }, { "name": "laravel/framework", - "version": "v12.16.0", + "version": "v12.19.2", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "293bb1c70224faebfd3d4328e201c37115da055f" + "reference": "97c581cb23bdc3147aab0d5087b19167d329991e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/293bb1c70224faebfd3d4328e201c37115da055f", - "reference": "293bb1c70224faebfd3d4328e201c37115da055f", + "url": "https://api.github.com/repos/laravel/framework/zipball/97c581cb23bdc3147aab0d5087b19167d329991e", + "reference": "97c581cb23bdc3147aab0d5087b19167d329991e", "shasum": "" }, "require": { - "brick/math": "^0.11|^0.12", + "brick/math": "^0.11|^0.12|^0.13", "composer-runtime-api": "^2.2", "doctrine/inflector": "^2.0.5", "dragonmantank/cron-expression": "^3.4", @@ -2889,20 +2889,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-05-27T15:49:44+00:00" + "time": "2025-06-17T23:44:27+00:00" }, { "name": "laravel/horizon", - "version": "v5.32.1", + "version": "v5.33.1", "source": { "type": "git", "url": "https://github.com/laravel/horizon.git", - "reference": "e78d9689d85b3d4769dc64def5eb6d94e5776beb" + "reference": "50057bca1f1dcc9fbd5ff6d65143833babd784b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/horizon/zipball/e78d9689d85b3d4769dc64def5eb6d94e5776beb", - "reference": "e78d9689d85b3d4769dc64def5eb6d94e5776beb", + "url": "https://api.github.com/repos/laravel/horizon/zipball/50057bca1f1dcc9fbd5ff6d65143833babd784b3", + "reference": "50057bca1f1dcc9fbd5ff6d65143833babd784b3", "shasum": "" }, "require": { @@ -2967,22 +2967,22 @@ ], "support": { "issues": "https://github.com/laravel/horizon/issues", - "source": "https://github.com/laravel/horizon/tree/v5.32.1" + "source": "https://github.com/laravel/horizon/tree/v5.33.1" }, - "time": "2025-05-19T13:13:30+00:00" + "time": "2025-06-16T13:48:30+00:00" }, { "name": "laravel/pail", - "version": "v1.2.2", + "version": "v1.2.3", "source": { "type": "git", "url": "https://github.com/laravel/pail.git", - "reference": "f31f4980f52be17c4667f3eafe034e6826787db2" + "reference": "8cc3d575c1f0e57eeb923f366a37528c50d2385a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pail/zipball/f31f4980f52be17c4667f3eafe034e6826787db2", - "reference": "f31f4980f52be17c4667f3eafe034e6826787db2", + "url": "https://api.github.com/repos/laravel/pail/zipball/8cc3d575c1f0e57eeb923f366a37528c50d2385a", + "reference": "8cc3d575c1f0e57eeb923f366a37528c50d2385a", "shasum": "" }, "require": { @@ -3002,7 +3002,7 @@ "orchestra/testbench-core": "^8.13|^9.0|^10.0", "pestphp/pest": "^2.20|^3.0", "pestphp/pest-plugin-type-coverage": "^2.3|^3.0", - "phpstan/phpstan": "^1.10", + "phpstan/phpstan": "^1.12.27", "symfony/var-dumper": "^6.3|^7.0" }, "type": "library", @@ -3038,6 +3038,7 @@ "description": "Easily delve into your Laravel application's log files directly from the command line.", "homepage": "https://github.com/laravel/pail", "keywords": [ + "dev", "laravel", "logs", "php", @@ -3047,7 +3048,7 @@ "issues": "https://github.com/laravel/pail/issues", "source": "https://github.com/laravel/pail" }, - "time": "2025-01-28T15:15:15+00:00" + "time": "2025-06-05T13:55:57+00:00" }, { "name": "laravel/prompts", @@ -4695,16 +4696,16 @@ }, { "name": "nesbot/carbon", - "version": "3.9.1", + "version": "3.10.0", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "ced71f79398ece168e24f7f7710462f462310d4d" + "reference": "c1397390dd0a7e0f11660f0ae20f753d88c1f3d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ced71f79398ece168e24f7f7710462f462310d4d", - "reference": "ced71f79398ece168e24f7f7710462f462310d4d", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/c1397390dd0a7e0f11660f0ae20f753d88c1f3d9", + "reference": "c1397390dd0a7e0f11660f0ae20f753d88c1f3d9", "shasum": "" }, "require": { @@ -4712,9 +4713,9 @@ "ext-json": "*", "php": "^8.1", "psr/clock": "^1.0", - "symfony/clock": "^6.3 || ^7.0", + "symfony/clock": "^6.3.12 || ^7.0", "symfony/polyfill-mbstring": "^1.0", - "symfony/translation": "^4.4.18 || ^5.2.1|| ^6.0 || ^7.0" + "symfony/translation": "^4.4.18 || ^5.2.1 || ^6.0 || ^7.0" }, "provide": { "psr/clock-implementation": "1.0" @@ -4722,14 +4723,13 @@ "require-dev": { "doctrine/dbal": "^3.6.3 || ^4.0", "doctrine/orm": "^2.15.2 || ^3.0", - "friendsofphp/php-cs-fixer": "^3.57.2", + "friendsofphp/php-cs-fixer": "^3.75.0", "kylekatarnls/multi-tester": "^2.5.3", - "ondrejmirtes/better-reflection": "^6.25.0.4", "phpmd/phpmd": "^2.15.0", - "phpstan/extension-installer": "^1.3.1", - "phpstan/phpstan": "^1.11.2", - "phpunit/phpunit": "^10.5.20", - "squizlabs/php_codesniffer": "^3.9.0" + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^2.1.17", + "phpunit/phpunit": "^10.5.46", + "squizlabs/php_codesniffer": "^3.13.0" }, "bin": [ "bin/carbon" @@ -4797,7 +4797,7 @@ "type": "tidelift" } ], - "time": "2025-05-01T19:51:51+00:00" + "time": "2025-06-12T10:24:28+00:00" }, { "name": "nette/schema", @@ -4863,16 +4863,16 @@ }, { "name": "nette/utils", - "version": "v4.0.6", + "version": "v4.0.7", "source": { "type": "git", "url": "https://github.com/nette/utils.git", - "reference": "ce708655043c7050eb050df361c5e313cf708309" + "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nette/utils/zipball/ce708655043c7050eb050df361c5e313cf708309", - "reference": "ce708655043c7050eb050df361c5e313cf708309", + "url": "https://api.github.com/repos/nette/utils/zipball/e67c4061eb40b9c113b218214e42cb5a0dda28f2", + "reference": "e67c4061eb40b9c113b218214e42cb5a0dda28f2", "shasum": "" }, "require": { @@ -4943,22 +4943,22 @@ ], "support": { "issues": "https://github.com/nette/utils/issues", - "source": "https://github.com/nette/utils/tree/v4.0.6" + "source": "https://github.com/nette/utils/tree/v4.0.7" }, - "time": "2025-03-30T21:06:30+00:00" + "time": "2025-06-03T04:55:08+00:00" }, { "name": "nikic/php-parser", - "version": "v5.4.0", + "version": "v5.5.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + "reference": "ae59794362fe85e051a58ad36b289443f57be7a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9", + "reference": "ae59794362fe85e051a58ad36b289443f57be7a9", "shasum": "" }, "require": { @@ -5001,9 +5001,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0" }, - "time": "2024-12-30T11:07:19+00:00" + "time": "2025-05-31T08:24:38+00:00" }, { "name": "nubs/random-name-generator", @@ -5488,16 +5488,16 @@ }, { "name": "php-di/php-di", - "version": "7.0.10", + "version": "7.0.11", "source": { "type": "git", "url": "https://github.com/PHP-DI/PHP-DI.git", - "reference": "0d1ed64126577e9a095b3204dcaee58cf76432c2" + "reference": "32f111a6d214564520a57831d397263e8946c1d2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/0d1ed64126577e9a095b3204dcaee58cf76432c2", - "reference": "0d1ed64126577e9a095b3204dcaee58cf76432c2", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/32f111a6d214564520a57831d397263e8946c1d2", + "reference": "32f111a6d214564520a57831d397263e8946c1d2", "shasum": "" }, "require": { @@ -5545,7 +5545,7 @@ ], "support": { "issues": "https://github.com/PHP-DI/PHP-DI/issues", - "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.10" + "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.11" }, "funding": [ { @@ -5557,23 +5557,24 @@ "type": "tidelift" } ], - "time": "2025-04-22T08:53:15+00:00" + "time": "2025-06-03T07:45:57+00:00" }, { "name": "phpdocumentor/reflection", - "version": "6.1.0", + "version": "6.3.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/Reflection.git", - "reference": "bb4dea805a645553d6d989b23dad9f8041f39502" + "reference": "d91b3270832785602adcc24ae2d0974ba99a8ff8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/bb4dea805a645553d6d989b23dad9f8041f39502", - "reference": "bb4dea805a645553d6d989b23dad9f8041f39502", + "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/d91b3270832785602adcc24ae2d0974ba99a8ff8", + "reference": "d91b3270832785602adcc24ae2d0974ba99a8ff8", "shasum": "" }, "require": { + "composer-runtime-api": "^2", "nikic/php-parser": "~4.18 || ^5.0", "php": "8.1.*|8.2.*|8.3.*|8.4.*", "phpdocumentor/reflection-common": "^2.1", @@ -5584,7 +5585,8 @@ }, "require-dev": { "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "doctrine/coding-standard": "^12.0", + "doctrine/coding-standard": "^13.0", + "eliashaeussler/phpunit-attributes": "^1.7", "mikey179/vfsstream": "~1.2", "mockery/mockery": "~1.6.0", "phpspec/prophecy-phpunit": "^2.0", @@ -5592,7 +5594,7 @@ "phpstan/phpstan": "^1.8", "phpstan/phpstan-webmozart-assert": "^1.2", "phpunit/phpunit": "^10.0", - "psalm/phar": "^5.24", + "psalm/phar": "^6.0", "rector/rector": "^1.0.0", "squizlabs/php_codesniffer": "^3.8" }, @@ -5604,6 +5606,9 @@ } }, "autoload": { + "files": [ + "src/php-parser/Modifiers.php" + ], "psr-4": { "phpDocumentor\\": "src/phpDocumentor" } @@ -5622,9 +5627,9 @@ ], "support": { "issues": "https://github.com/phpDocumentor/Reflection/issues", - "source": "https://github.com/phpDocumentor/Reflection/tree/6.1.0" + "source": "https://github.com/phpDocumentor/Reflection/tree/6.3.0" }, - "time": "2024-11-22T15:11:54+00:00" + "time": "2025-06-06T13:39:18+00:00" }, { "name": "phpdocumentor/reflection-common", @@ -5878,16 +5883,16 @@ }, { "name": "phpseclib/phpseclib", - "version": "3.0.43", + "version": "3.0.44", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "709ec107af3cb2f385b9617be72af8cf62441d02" + "reference": "1d0b5e7e1434678411787c5a0535e68907cf82d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/709ec107af3cb2f385b9617be72af8cf62441d02", - "reference": "709ec107af3cb2f385b9617be72af8cf62441d02", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/1d0b5e7e1434678411787c5a0535e68907cf82d9", + "reference": "1d0b5e7e1434678411787c5a0535e68907cf82d9", "shasum": "" }, "require": { @@ -5968,7 +5973,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.43" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.44" }, "funding": [ { @@ -5984,7 +5989,7 @@ "type": "tidelift" } ], - "time": "2024-12-14T21:12:59+00:00" + "time": "2025-06-15T09:59:26+00:00" }, { "name": "phpstan/phpdoc-parser", @@ -6966,20 +6971,20 @@ }, { "name": "ramsey/uuid", - "version": "4.7.6", + "version": "4.8.1", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088" + "reference": "fdf4dd4e2ff1813111bd0ad58d7a1ddbb5b56c28" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/91039bc1faa45ba123c4328958e620d382ec7088", - "reference": "91039bc1faa45ba123c4328958e620d382ec7088", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/fdf4dd4e2ff1813111bd0ad58d7a1ddbb5b56c28", + "reference": "fdf4dd4e2ff1813111bd0ad58d7a1ddbb5b56c28", "shasum": "" }, "require": { - "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12", + "brick/math": "^0.8.8 || ^0.9 || ^0.10 || ^0.11 || ^0.12 || ^0.13", "ext-json": "*", "php": "^8.0", "ramsey/collection": "^1.2 || ^2.0" @@ -6988,26 +6993,23 @@ "rhumsaa/uuid": "self.version" }, "require-dev": { - "captainhook/captainhook": "^5.10", + "captainhook/captainhook": "^5.25", "captainhook/plugin-composer": "^5.3", - "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", - "doctrine/annotations": "^1.8", - "ergebnis/composer-normalize": "^2.15", - "mockery/mockery": "^1.3", + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "ergebnis/composer-normalize": "^2.47", + "mockery/mockery": "^1.6", "paragonie/random-lib": "^2", - "php-mock/php-mock": "^2.2", - "php-mock/php-mock-mockery": "^1.3", - "php-parallel-lint/php-parallel-lint": "^1.1", - "phpbench/phpbench": "^1.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-mockery": "^1.1", - "phpstan/phpstan-phpunit": "^1.1", - "phpunit/phpunit": "^8.5 || ^9", - "ramsey/composer-repl": "^1.4", - "slevomat/coding-standard": "^8.4", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.9" + "php-mock/php-mock": "^2.6", + "php-mock/php-mock-mockery": "^1.5", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "phpbench/phpbench": "^1.2.14", + "phpstan/extension-installer": "^1.4", + "phpstan/phpstan": "^2.1", + "phpstan/phpstan-mockery": "^2.0", + "phpstan/phpstan-phpunit": "^2.0", + "phpunit/phpunit": "^9.6", + "slevomat/coding-standard": "^8.18", + "squizlabs/php_codesniffer": "^3.13" }, "suggest": { "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", @@ -7042,19 +7044,9 @@ ], "support": { "issues": "https://github.com/ramsey/uuid/issues", - "source": "https://github.com/ramsey/uuid/tree/4.7.6" + "source": "https://github.com/ramsey/uuid/tree/4.8.1" }, - "funding": [ - { - "url": "https://github.com/ramsey", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", - "type": "tidelift" - } - ], - "time": "2024-04-27T21:32:50+00:00" + "time": "2025-06-01T06:28:46+00:00" }, { "name": "resend/resend-laravel", @@ -7256,16 +7248,16 @@ }, { "name": "sentry/sentry", - "version": "4.11.1", + "version": "4.14.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "53dc0bcb6a667cac5b760b46f98d5380e63e02ca" + "reference": "f8c50304bd2f1640704345274bdd5af150b6945d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/53dc0bcb6a667cac5b760b46f98d5380e63e02ca", - "reference": "53dc0bcb6a667cac5b760b46f98d5380e63e02ca", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/f8c50304bd2f1640704345274bdd5af150b6945d", + "reference": "f8c50304bd2f1640704345274bdd5af150b6945d", "shasum": "" }, "require": { @@ -7329,7 +7321,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/4.11.1" + "source": "https://github.com/getsentry/sentry-php/tree/4.14.0" }, "funding": [ { @@ -7341,27 +7333,27 @@ "type": "custom" } ], - "time": "2025-05-12T11:30:33+00:00" + "time": "2025-06-13T17:22:57+00:00" }, { "name": "sentry/sentry-laravel", - "version": "4.13.0", + "version": "4.15.0", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-laravel.git", - "reference": "d232ac494258e0d50a77c575a5af5f1a426d3f87" + "reference": "481398f05e4b0f5886f6092e1b95b626a438deff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/d232ac494258e0d50a77c575a5af5f1a426d3f87", - "reference": "d232ac494258e0d50a77c575a5af5f1a426d3f87", + "url": "https://api.github.com/repos/getsentry/sentry-laravel/zipball/481398f05e4b0f5886f6092e1b95b626a438deff", + "reference": "481398f05e4b0f5886f6092e1b95b626a438deff", "shasum": "" }, "require": { "illuminate/support": "^6.0 | ^7.0 | ^8.0 | ^9.0 | ^10.0 | ^11.0 | ^12.0", "nyholm/psr7": "^1.0", "php": "^7.2 | ^8.0", - "sentry/sentry": "^4.10", + "sentry/sentry": "^4.13", "symfony/psr-http-message-bridge": "^1.0 | ^2.0 | ^6.0 | ^7.0" }, "require-dev": { @@ -7418,7 +7410,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-laravel/issues", - "source": "https://github.com/getsentry/sentry-laravel/tree/4.13.0" + "source": "https://github.com/getsentry/sentry-laravel/tree/4.15.0" }, "funding": [ { @@ -7430,7 +7422,7 @@ "type": "custom" } ], - "time": "2025-02-18T10:09:29+00:00" + "time": "2025-06-12T20:56:36+00:00" }, { "name": "socialiteproviders/authentik", @@ -7494,17 +7486,6 @@ "type": "zip", "url": "https://api.github.com/repos/SocialiteProviders/Clerk/zipball/41e123036001ff37851b9622a910010c0e487d6a", "reference": "41e123036001ff37851b9622a910010c0e487d6a", - "name": "socialiteproviders/discord", - "version": "4.2.0", - "source": { - "type": "git", - "url": "https://github.com/SocialiteProviders/Discord.git", - "reference": "c71c379acfdca5ba4aa65a3db5ae5222852a919c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/SocialiteProviders/Discord/zipball/c71c379acfdca5ba4aa65a3db5ae5222852a919c", - "reference": "c71c379acfdca5ba4aa65a3db5ae5222852a919c", "shasum": "" }, "require": { @@ -7516,7 +7497,6 @@ "autoload": { "psr-4": { "SocialiteProviders\\Clerk\\": "" - "SocialiteProviders\\Discord\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -7532,6 +7512,49 @@ "description": "Clerk OAuth2 Provider for Laravel Socialite", "keywords": [ "clerk", + "laravel", + "oauth", + "provider", + "socialite" + ], + "support": { + "docs": "https://socialiteproviders.com/clerk", + "issues": "https://github.com/socialiteproviders/providers/issues", + "source": "https://github.com/socialiteproviders/providers" + }, + "time": "2024-02-19T12:17:59+00:00" + }, + { + "name": "socialiteproviders/discord", + "version": "4.2.0", + "source": { + "type": "git", + "url": "https://github.com/SocialiteProviders/Discord.git", + "reference": "c71c379acfdca5ba4aa65a3db5ae5222852a919c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SocialiteProviders/Discord/zipball/c71c379acfdca5ba4aa65a3db5ae5222852a919c", + "reference": "c71c379acfdca5ba4aa65a3db5ae5222852a919c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.4 || ^8.0", + "socialiteproviders/manager": "~4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "SocialiteProviders\\Discord\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { "name": "Christopher Eklund", "email": "eklundchristopher@gmail.com" } @@ -7545,11 +7568,6 @@ "socialite" ], "support": { - "docs": "https://socialiteproviders.com/clerk", - "issues": "https://github.com/socialiteproviders/providers/issues", - "source": "https://github.com/socialiteproviders/providers" - }, - "time": "2024-02-19T12:17:59+00:00" "docs": "https://socialiteproviders.com/discord", "issues": "https://github.com/socialiteproviders/providers/issues", "source": "https://github.com/socialiteproviders/providers" @@ -7773,6 +7791,49 @@ }, "time": "2024-03-15T03:02:10+00:00" }, + { + "name": "socialiteproviders/zitadel", + "version": "4.1.0", + "source": { + "type": "git", + "url": "https://github.com/SocialiteProviders/Zitadel.git", + "reference": "2e1c0843a9531eb0e31a04b31683a63f1a7d1865" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/SocialiteProviders/Zitadel/zipball/2e1c0843a9531eb0e31a04b31683a63f1a7d1865", + "reference": "2e1c0843a9531eb0e31a04b31683a63f1a7d1865", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^8.1", + "socialiteproviders/manager": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Socialiteproviders\\Zitadel\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gurkirat Singh", + "email": "tbhaxor@gmail.com" + } + ], + "description": "Zitadel OAuth2 Provider for Laravel Socialite", + "support": { + "docs": "https://socialiteproviders.com/zoho", + "issues": "https://github.com/socialiteproviders/providers/issues", + "source": "https://github.com/socialiteproviders/providers" + }, + "time": "2024-08-26T06:14:57+00:00" + }, { "name": "spatie/backtrace", "version": "1.7.4", @@ -7838,16 +7899,16 @@ }, { "name": "spatie/laravel-activitylog", - "version": "4.10.1", + "version": "4.10.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-activitylog.git", - "reference": "466f30f7245fe3a6e328ad5e6812bd43b4bddea5" + "reference": "bb879775d487438ed9a99e64f09086b608990c10" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/466f30f7245fe3a6e328ad5e6812bd43b4bddea5", - "reference": "466f30f7245fe3a6e328ad5e6812bd43b4bddea5", + "url": "https://api.github.com/repos/spatie/laravel-activitylog/zipball/bb879775d487438ed9a99e64f09086b608990c10", + "reference": "bb879775d487438ed9a99e64f09086b608990c10", "shasum": "" }, "require": { @@ -7913,7 +7974,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-activitylog/issues", - "source": "https://github.com/spatie/laravel-activitylog/tree/4.10.1" + "source": "https://github.com/spatie/laravel-activitylog/tree/4.10.2" }, "funding": [ { @@ -7925,20 +7986,20 @@ "type": "github" } ], - "time": "2025-02-10T15:38:25+00:00" + "time": "2025-06-15T06:59:49+00:00" }, { "name": "spatie/laravel-data", - "version": "4.15.1", + "version": "4.15.2", "source": { "type": "git", "url": "https://github.com/spatie/laravel-data.git", - "reference": "cb97afe6c0dadeb2e76ea1b7220cd04ed33dcca9" + "reference": "50f5abe716ff1ad9a3e96dcfdeb4ad00f014bf8d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-data/zipball/cb97afe6c0dadeb2e76ea1b7220cd04ed33dcca9", - "reference": "cb97afe6c0dadeb2e76ea1b7220cd04ed33dcca9", + "url": "https://api.github.com/repos/spatie/laravel-data/zipball/50f5abe716ff1ad9a3e96dcfdeb4ad00f014bf8d", + "reference": "50f5abe716ff1ad9a3e96dcfdeb4ad00f014bf8d", "shasum": "" }, "require": { @@ -8000,7 +8061,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-data/issues", - "source": "https://github.com/spatie/laravel-data/tree/4.15.1" + "source": "https://github.com/spatie/laravel-data/tree/4.15.2" }, "funding": [ { @@ -8008,7 +8069,7 @@ "type": "github" } ], - "time": "2025-04-10T06:06:27+00:00" + "time": "2025-06-12T09:42:08+00:00" }, { "name": "spatie/laravel-package-tools", @@ -12309,16 +12370,16 @@ }, { "name": "filp/whoops", - "version": "2.18.0", + "version": "2.18.3", "source": { "type": "git", "url": "https://github.com/filp/whoops.git", - "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e" + "reference": "59a123a3d459c5a23055802237cb317f609867e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/filp/whoops/zipball/a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e", - "reference": "a7de6c3c6c3c022f5cfc337f8ede6a14460cf77e", + "url": "https://api.github.com/repos/filp/whoops/zipball/59a123a3d459c5a23055802237cb317f609867e5", + "reference": "59a123a3d459c5a23055802237cb317f609867e5", "shasum": "" }, "require": { @@ -12368,7 +12429,7 @@ ], "support": { "issues": "https://github.com/filp/whoops/issues", - "source": "https://github.com/filp/whoops/tree/2.18.0" + "source": "https://github.com/filp/whoops/tree/2.18.3" }, "funding": [ { @@ -12376,7 +12437,7 @@ "type": "github" } ], - "time": "2025-03-15T12:00:00+00:00" + "time": "2025-06-16T00:02:10+00:00" }, { "name": "hamcrest/hamcrest-php", @@ -12431,16 +12492,16 @@ }, { "name": "laravel/dusk", - "version": "v8.3.2", + "version": "v8.3.3", "source": { "type": "git", "url": "https://github.com/laravel/dusk.git", - "reference": "bb701836357bf6f6c6658ef90b5a0f8232affb0f" + "reference": "077d448cd993a08f97bfccf0ea3d6478b3908f7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/dusk/zipball/bb701836357bf6f6c6658ef90b5a0f8232affb0f", - "reference": "bb701836357bf6f6c6658ef90b5a0f8232affb0f", + "url": "https://api.github.com/repos/laravel/dusk/zipball/077d448cd993a08f97bfccf0ea3d6478b3908f7e", + "reference": "077d448cd993a08f97bfccf0ea3d6478b3908f7e", "shasum": "" }, "require": { @@ -12499,9 +12560,9 @@ ], "support": { "issues": "https://github.com/laravel/dusk/issues", - "source": "https://github.com/laravel/dusk/tree/v8.3.2" + "source": "https://github.com/laravel/dusk/tree/v8.3.3" }, - "time": "2025-02-20T14:42:00+00:00" + "time": "2025-06-10T13:59:27+00:00" }, { "name": "laravel/pint", @@ -12571,16 +12632,16 @@ }, { "name": "laravel/telescope", - "version": "v5.8.0", + "version": "v5.9.1", "source": { "type": "git", "url": "https://github.com/laravel/telescope.git", - "reference": "9be1b8851b8ffe67689e7960135f8b32a966f23d" + "reference": "403d4ad1ecfe126139f5cf29cabd6b1c816c46a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/telescope/zipball/9be1b8851b8ffe67689e7960135f8b32a966f23d", - "reference": "9be1b8851b8ffe67689e7960135f8b32a966f23d", + "url": "https://api.github.com/repos/laravel/telescope/zipball/403d4ad1ecfe126139f5cf29cabd6b1c816c46a2", + "reference": "403d4ad1ecfe126139f5cf29cabd6b1c816c46a2", "shasum": "" }, "require": { @@ -12634,9 +12695,9 @@ ], "support": { "issues": "https://github.com/laravel/telescope/issues", - "source": "https://github.com/laravel/telescope/tree/v5.8.0" + "source": "https://github.com/laravel/telescope/tree/v5.9.1" }, - "time": "2025-05-26T17:22:18+00:00" + "time": "2025-06-10T21:42:27+00:00" }, { "name": "mockery/mockery", @@ -12783,23 +12844,23 @@ }, { "name": "nunomaduro/collision", - "version": "v8.8.0", + "version": "v8.8.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "4cf9f3b47afff38b139fb79ce54fc71799022ce8" + "reference": "44ccb82e3e21efb5446748d2a3c81a030ac22bd5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/4cf9f3b47afff38b139fb79ce54fc71799022ce8", - "reference": "4cf9f3b47afff38b139fb79ce54fc71799022ce8", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/44ccb82e3e21efb5446748d2a3c81a030ac22bd5", + "reference": "44ccb82e3e21efb5446748d2a3c81a030ac22bd5", "shasum": "" }, "require": { - "filp/whoops": "^2.18.0", - "nunomaduro/termwind": "^2.3.0", + "filp/whoops": "^2.18.1", + "nunomaduro/termwind": "^2.3.1", "php": "^8.2.0", - "symfony/console": "^7.2.5" + "symfony/console": "^7.3.0" }, "conflict": { "laravel/framework": "<11.44.2 || >=13.0.0", @@ -12807,15 +12868,15 @@ }, "require-dev": { "brianium/paratest": "^7.8.3", - "larastan/larastan": "^3.2", - "laravel/framework": "^11.44.2 || ^12.6", - "laravel/pint": "^1.21.2", - "laravel/sail": "^1.41.0", - "laravel/sanctum": "^4.0.8", + "larastan/larastan": "^3.4.2", + "laravel/framework": "^11.44.2 || ^12.18", + "laravel/pint": "^1.22.1", + "laravel/sail": "^1.43.1", + "laravel/sanctum": "^4.1.1", "laravel/tinker": "^2.10.1", - "orchestra/testbench-core": "^9.12.0 || ^10.1", - "pestphp/pest": "^3.8.0", - "sebastian/environment": "^7.2.0 || ^8.0" + "orchestra/testbench-core": "^9.12.0 || ^10.4", + "pestphp/pest": "^3.8.2", + "sebastian/environment": "^7.2.1 || ^8.0" }, "type": "library", "extra": { @@ -12878,7 +12939,7 @@ "type": "patreon" } ], - "time": "2025-04-03T14:33:09+00:00" + "time": "2025-06-11T01:04:21+00:00" }, { "name": "pestphp/pest", @@ -13518,16 +13579,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "11.0.9", + "version": "11.0.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7" + "reference": "1a800a7446add2d79cc6b3c01c45381810367d76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/14d63fbcca18457e49c6f8bebaa91a87e8e188d7", - "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/1a800a7446add2d79cc6b3c01c45381810367d76", + "reference": "1a800a7446add2d79cc6b3c01c45381810367d76", "shasum": "" }, "require": { @@ -13584,15 +13645,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.9" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/show" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage", + "type": "tidelift" } ], - "time": "2025-02-25T13:26:39+00:00" + "time": "2025-06-18T08:56:18+00:00" }, { "name": "phpunit/php-file-iterator", @@ -13942,21 +14015,21 @@ }, { "name": "rector/rector", - "version": "2.0.16", + "version": "2.0.18", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "f1366d1f8c7490541c8f7af6e5c7cef7cca1b5a2" + "reference": "be3a452085b524a04056e3dfe72d861948711062" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/f1366d1f8c7490541c8f7af6e5c7cef7cca1b5a2", - "reference": "f1366d1f8c7490541c8f7af6e5c7cef7cca1b5a2", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/be3a452085b524a04056e3dfe72d861948711062", + "reference": "be3a452085b524a04056e3dfe72d861948711062", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.1.14" + "phpstan/phpstan": "^2.1.17" }, "conflict": { "rector/rector-doctrine": "*", @@ -13989,7 +14062,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.0.16" + "source": "https://github.com/rectorphp/rector/tree/2.0.18" }, "funding": [ { @@ -13997,7 +14070,7 @@ "type": "github" } ], - "time": "2025-05-12T16:37:16+00:00" + "time": "2025-06-11T11:19:37+00:00" }, { "name": "sebastian/cli-parser", From 8fa0409a372196be28079c84ad9dc7410132c1a4 Mon Sep 17 00:00:00 2001 From: Darren Sisson <74752850+djsisson@users.noreply.github.com> Date: Wed, 18 Jun 2025 14:10:21 +0100 Subject: [PATCH 010/195] fix(ssh): scp requires square brackets for ipv6 (#6001) --- app/Helpers/SshMultiplexingHelper.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/Helpers/SshMultiplexingHelper.php b/app/Helpers/SshMultiplexingHelper.php index 8da476b9e..8caa2880a 100644 --- a/app/Helpers/SshMultiplexingHelper.php +++ b/app/Helpers/SshMultiplexingHelper.php @@ -103,7 +103,11 @@ public static function generateScpCommand(Server $server, string $source, string } $scp_command .= self::getCommonSshOptions($server, $sshKeyLocation, config('constants.ssh.connection_timeout'), config('constants.ssh.server_interval'), isScp: true); - $scp_command .= "{$source} {$server->user}@{$server->ip}:{$dest}"; + if ($server->isIpv6()) { + $scp_command .= "{$source} {$server->user}@[{$server->ip}]:{$dest}"; + } else { + $scp_command .= "{$source} {$server->user}@{$server->ip}:{$dest}"; + } return $scp_command; } From e0f16e9539bb9dc5d246409a805a305e5cbbd496 Mon Sep 17 00:00:00 2001 From: Alfred Nutile <365385+alnutile@users.noreply.github.com> Date: Wed, 18 Jun 2025 09:19:33 -0400 Subject: [PATCH 011/195] feat(core): set custom API rate limit (#5984) --- app/Providers/RouteServiceProvider.php | 2 +- config/api.php | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 config/api.php diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index c85960746..d1fccf416 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -49,7 +49,7 @@ protected function configureRateLimiting(): void return Limit::perMinute(1000)->by($request->user()?->id ?: $request->ip()); } - return Limit::perMinute(200)->by($request->user()?->id ?: $request->ip()); + return Limit::perMinute(config('api.throttle'))->by($request->user()?->id ?: $request->ip()); }); RateLimiter::for('5', function (Request $request) { return Limit::perMinute(5)->by($request->user()?->id ?: $request->ip()); diff --git a/config/api.php b/config/api.php new file mode 100644 index 000000000..72d50f4ff --- /dev/null +++ b/config/api.php @@ -0,0 +1,5 @@ + env('API_THROTTLE', 200), +]; From 04aec48495696108c203e1df55e2d3c8b76a1bff Mon Sep 17 00:00:00 2001 From: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> Date: Wed, 18 Jun 2025 15:23:44 +0200 Subject: [PATCH 012/195] refactor(core): rename API rate limit ENV --- app/Providers/RouteServiceProvider.php | 2 +- config/api.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index d1fccf416..378305af1 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -49,7 +49,7 @@ protected function configureRateLimiting(): void return Limit::perMinute(1000)->by($request->user()?->id ?: $request->ip()); } - return Limit::perMinute(config('api.throttle'))->by($request->user()?->id ?: $request->ip()); + return Limit::perMinute(config('api.rate_limit'))->by($request->user()?->id ?: $request->ip()); }); RateLimiter::for('5', function (Request $request) { return Limit::perMinute(5)->by($request->user()?->id ?: $request->ip()); diff --git a/config/api.php b/config/api.php index 72d50f4ff..83bac8f03 100644 --- a/config/api.php +++ b/config/api.php @@ -1,5 +1,5 @@ env('API_THROTTLE', 200), + 'rate_limit' => env('API_RATE_LIMIT', 200), ]; From 7d985e3915cf206c2e27279741c89836a3d0ec43 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 20 Jun 2025 09:35:39 +0200 Subject: [PATCH 013/195] refactor(ui): simplify container selection form in execute-container-command view --- .../execute-container-command.blade.php | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/resources/views/livewire/project/shared/execute-container-command.blade.php b/resources/views/livewire/project/shared/execute-container-command.blade.php index 2c95acc67..9ff5cccc5 100644 --- a/resources/views/livewire/project/shared/execute-container-command.blade.php +++ b/resources/views/livewire/project/shared/execute-container-command.blade.php @@ -20,23 +20,21 @@ @if (count($containers) === 0)
No containers are running or terminal access is disabled on this server.
@else - @foreach ($containers as $container) -
- - @foreach ($containers as $container) - @if ($loop->first) - - @endif - - @endforeach - - {{ $isConnecting ? 'Connecting...' : 'Connect' }} -
- @endforeach +
+ + @foreach ($containers as $container) + @if ($loop->first) + + @endif + + @endforeach + + {{ $isConnecting ? 'Connecting...' : 'Connect' }} +
From 81efd9442ec67f7dc7a1bfa5a5a5ea20c97a5949 Mon Sep 17 00:00:00 2001 From: Alkesh Das <67038642+smad-bro@users.noreply.github.com> Date: Fri, 20 Jun 2025 20:35:25 +0400 Subject: [PATCH 014/195] chore(service): Update Evolution API image to the official one (#6031) --- templates/compose/evolution-api.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/compose/evolution-api.yaml b/templates/compose/evolution-api.yaml index 9ec70c76c..87db576f9 100644 --- a/templates/compose/evolution-api.yaml +++ b/templates/compose/evolution-api.yaml @@ -7,7 +7,7 @@ version: '3.8' services: api: - image: 'atendai/evolution-api:latest' # Change to specific version if needed. + image: 'evoapicloud/evolution-api:latest' # Change to specific version if needed. restart: always depends_on: - redis From 56ee0ea192400dfbf964bdd8b8874ee982b74637 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Sat, 21 Jun 2025 19:27:56 +0200 Subject: [PATCH 015/195] chore(versions): bump coolify versions to v4.0.0-beta.420 and v4.0.0-beta.421 --- versions.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/versions.json b/versions.json index eda548570..9fde1e53b 100644 --- a/versions.json +++ b/versions.json @@ -1,10 +1,10 @@ { "coolify": { "v4": { - "version": "4.0.0-beta.419" + "version": "4.0.0-beta.420" }, "nightly": { - "version": "4.0.0-beta.420" + "version": "4.0.0-beta.421" }, "helper": { "version": "1.0.8" From 3643a388bfb34d28f5857c491fc027235509c96c Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Sat, 21 Jun 2025 19:28:38 +0200 Subject: [PATCH 016/195] fix(github): changing github app breaks the webhook. it does not anymore --- app/Jobs/ApplicationDeploymentJob.php | 4 ++-- app/Livewire/Project/Application/Source.php | 13 ++++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php index eb7686c06..c9b7c9992 100644 --- a/app/Jobs/ApplicationDeploymentJob.php +++ b/app/Jobs/ApplicationDeploymentJob.php @@ -1381,8 +1381,8 @@ private function check_git_if_build_needed() if (is_object($this->source) && $this->source->getMorphClass() === \App\Models\GithubApp::class && $this->source->is_public === false) { $repository = githubApi($this->source, "repos/{$this->customRepository}"); $data = data_get($repository, 'data'); - if (isset($data->id)) { - $repository_project_id = $data->id; + $repository_project_id = data_get($data, 'id'); + if (isset($repository_project_id)) { if (blank($this->application->repository_project_id) || $this->application->repository_project_id !== $repository_project_id) { $this->application->repository_project_id = $repository_project_id; $this->application->save(); diff --git a/app/Livewire/Project/Application/Source.php b/app/Livewire/Project/Application/Source.php index e27a550c1..932a302ad 100644 --- a/app/Livewire/Project/Application/Source.php +++ b/app/Livewire/Project/Application/Source.php @@ -111,8 +111,19 @@ public function changeSource($sourceId, $sourceType) $this->application->update([ 'source_id' => $sourceId, 'source_type' => $sourceType, - 'repository_project_id' => null, ]); + + ['repository' => $customRepository] = $this->application->customRepository(); + $repository = githubApi($this->application->source, "repos/{$customRepository}"); + $data = data_get($repository, 'data'); + $repository_project_id = data_get($data, 'id'); + if (isset($repository_project_id)) { + if ($this->application->repository_project_id !== $repository_project_id) { + $this->application->repository_project_id = $repository_project_id; + $this->application->save(); + } + } + $this->application->refresh(); $this->getSources(); $this->dispatch('success', 'Source updated!'); From 8fc79022f3146ad0dbcc37e2279f4b36083ed554 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Tue, 24 Jun 2025 12:52:22 +0200 Subject: [PATCH 017/195] feat(service): enhance service status handling and UI updates --- app/Actions/Service/StartService.php | 2 +- app/Livewire/Project/Service/Heading.php | 9 ++++----- app/Models/Service.php | 18 ++++++++++++++++++ .../views/components/status/services.blade.php | 2 ++ .../livewire/project/resource/index.blade.php | 9 +++++++++ .../livewire/project/service/heading.blade.php | 4 ++-- 6 files changed, 36 insertions(+), 8 deletions(-) diff --git a/app/Actions/Service/StartService.php b/app/Actions/Service/StartService.php index 1e7779a75..d48594e62 100644 --- a/app/Actions/Service/StartService.php +++ b/app/Actions/Service/StartService.php @@ -41,6 +41,6 @@ public function handle(Service $service, bool $pullLatestImages = false, bool $s } } - return remote_process($commands, $service->server, type_uuid: $service->uuid); + return remote_process($commands, $service->server, type_uuid: $service->uuid, callEventOnFinish: 'ServiceStatusChanged'); } } diff --git a/app/Livewire/Project/Service/Heading.php b/app/Livewire/Project/Service/Heading.php index eb7f469a8..d78fbe9ed 100644 --- a/app/Livewire/Project/Service/Heading.php +++ b/app/Livewire/Project/Service/Heading.php @@ -6,7 +6,6 @@ use App\Actions\Service\StartService; use App\Actions\Service\StopService; use App\Enums\ProcessStatus; -use App\Events\ServiceStatusChanged; use App\Models\Service; use Illuminate\Support\Facades\Auth; use Livewire\Component; @@ -96,7 +95,7 @@ public function checkDeployments() public function start() { $activity = StartService::run($this->service, pullLatestImages: true); - $this->dispatch('activityMonitor', $activity->id, ServiceStatusChanged::class); + $this->dispatch('activityMonitor', $activity->id); } public function forceDeploy() @@ -112,7 +111,7 @@ public function forceDeploy() $activity->save(); } $activity = StartService::run($this->service, pullLatestImages: true, stopBeforeStart: true); - $this->dispatch('activityMonitor', $activity->id, ServiceStatusChanged::class); + $this->dispatch('activityMonitor', $activity->id); } catch (\Exception $e) { $this->dispatch('error', $e->getMessage()); } @@ -136,7 +135,7 @@ public function restart() return; } $activity = StartService::run($this->service, stopBeforeStart: true); - $this->dispatch('activityMonitor', $activity->id, ServiceStatusChanged::class); + $this->dispatch('activityMonitor', $activity->id); } public function pullAndRestartEvent() @@ -148,7 +147,7 @@ public function pullAndRestartEvent() return; } $activity = StartService::run($this->service, pullLatestImages: true, stopBeforeStart: true); - $this->dispatch('activityMonitor', $activity->id, ServiceStatusChanged::class); + $this->dispatch('activityMonitor', $activity->id); } public function render() diff --git a/app/Models/Service.php b/app/Models/Service.php index c3c8f3215..a9302d7e7 100644 --- a/app/Models/Service.php +++ b/app/Models/Service.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Enums\ProcessStatus; use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Relations\HasMany; @@ -9,6 +10,7 @@ use Illuminate\Support\Collection; use Illuminate\Support\Facades\Storage; use OpenApi\Attributes as OA; +use Spatie\Activitylog\Models\Activity; use Spatie\Url\Url; use Visus\Cuid2\Cuid2; @@ -116,6 +118,18 @@ public function isExited() return (bool) str($this->status)->contains('exited'); } + public function isStarting(): bool + { + try { + $activity = Activity::where('properties->type_uuid', $this->uuid)->latest()->first(); + $status = data_get($activity, 'properties.status'); + + return $status === ProcessStatus::QUEUED->value || $status === ProcessStatus::IN_PROGRESS->value; + } catch (\Throwable) { + return false; + } + } + public function type() { return 'service'; @@ -159,6 +173,10 @@ public function deleteConnectedNetworks() public function getStatusAttribute() { + if ($this->isStarting()) { + return 'starting:unhealthy'; + } + $applications = $this->applications; $databases = $this->databases; diff --git a/resources/views/components/status/services.blade.php b/resources/views/components/status/services.blade.php index 5a52335a7..557fbfbfe 100644 --- a/resources/views/components/status/services.blade.php +++ b/resources/views/components/status/services.blade.php @@ -1,5 +1,7 @@ @if (str($complexStatus)->contains('running')) +@elseif(str($complexStatus)->contains('starting')) + @elseif(str($complexStatus)->contains('restarting')) @elseif(str($complexStatus)->contains('degraded')) diff --git a/resources/views/livewire/project/resource/index.blade.php b/resources/views/livewire/project/resource/index.blade.php index 421f74f8b..b508b7bae 100644 --- a/resources/views/livewire/project/resource/index.blade.php +++ b/resources/views/livewire/project/resource/index.blade.php @@ -72,6 +72,9 @@ class="grid grid-cols-1 gap-4 pt-4 lg:grid-cols-2 xl:grid-cols-3"> + @@ -118,6 +121,9 @@ class="grid grid-cols-1 gap-4 pt-4 lg:grid-cols-2 xl:grid-cols-3"> + @@ -164,6 +170,9 @@ class="grid grid-cols-1 gap-4 pt-4 lg:grid-cols-2 xl:grid-cols-3"> + diff --git a/resources/views/livewire/project/service/heading.blade.php b/resources/views/livewire/project/service/heading.blade.php index c13ca59b7..e3c9129fa 100644 --- a/resources/views/livewire/project/service/heading.blade.php +++ b/resources/views/livewire/project/service/heading.blade.php @@ -136,7 +136,7 @@