From a2261b8ad0d1326d76d2a67c9a38787386deb911 Mon Sep 17 00:00:00 2001 From: Ebenezer Don Date: Mon, 7 Jul 2025 13:22:52 +0100 Subject: [PATCH 01/29] Clarify userId param in endpoints that create accounts --- app/controllers/api/account.php | 2 +- docs/references/account/create-token-email.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index ab68bf9f02..f6f8cbf0d7 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -2100,7 +2100,7 @@ App::post('/v1/account/tokens/email') )) ->label('abuse-limit', 10) ->label('abuse-key', ['url:{url},email:{param-email}', 'url:{url},ip:{ip}']) - ->param('userId', '', new CustomId(), 'User ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.') + ->param('userId', '', new CustomId(), 'User ID. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars. If the email address has never been used, a new account is created using the provided userId. Otherwise, if the email address is already attached to an account, the user ID is ignored.') ->param('email', '', new Email(), 'User email.') ->param('phrase', false, new Boolean(), 'Toggle for security phrase. If enabled, email will be send with a randomly generated phrase and the phrase will also be included in the response. Confirming phrases match increases the security of your authentication flow.', true) ->inject('request') diff --git a/docs/references/account/create-token-email.md b/docs/references/account/create-token-email.md index 3e49899888..3ed175c7f9 100644 --- a/docs/references/account/create-token-email.md +++ b/docs/references/account/create-token-email.md @@ -1,3 +1,3 @@ -Sends the user an email with a secret key for creating a session. If the provided user ID has not be registered, a new user will be created. Use the returned user ID and secret and submit a request to the [POST /v1/account/sessions/token](https://appwrite.io/docs/references/cloud/client-web/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes. +Sends the user an email with a secret key for creating a session. If the email address has never been used, a **new account is created** using the provided `userId`. Otherwise, if the email address is already attached to an account, the **user ID is ignored**. Then, the user will receive an email with the one-time password. Use the returned user ID and secret and submit a request to the [POST /v1/account/sessions/token](https://appwrite.io/docs/references/cloud/client-web/account#createSession) endpoint to complete the login process. The secret sent to the user's email is valid for 15 minutes. -A user is limited to 10 active sessions at a time by default. [Learn more about session limits](https://appwrite.io/docs/authentication-security#limits). \ No newline at end of file +A user is limited to 10 active sessions at a time by default. [Learn more about session limits](https://appwrite.io/docs/authentication-security#limits). From 73da590d659c7e5da4e7396c66f4c915390483d5 Mon Sep 17 00:00:00 2001 From: Steven Nguyen <1477010+stnguyen90@users.noreply.github.com> Date: Wed, 23 Jul 2025 12:31:28 -0700 Subject: [PATCH 02/29] docs: update CONTRIBUTING.md to clarify how to start --- CONTRIBUTING.md | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 277a509447..c6837673d5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,7 +9,31 @@ You can [find issues using this query](https://github.com/search?q=org%3Aappwrit ## How to Start? -If you are worried or don’t know where to start, check out the next section that explains what kind of help we could use and where you can get involved. You can send your questions to [@appwrite on Twitter](https://twitter.com/appwrite) or to anyone from the [Appwrite team on Discord](https://appwrite.io/discord). You can also submit an issue, and a maintainer can guide you! +Welcome! We're excited that you're interested in contributing to Appwrite. To make sure your time is valued and your contributions are successful, please follow these steps before writing any code: + +### 🔍 Step 1: Find an Issue + +Browse open issues and look for ones labeled [good first issue](https://github.com/search?q=org%3Aappwrite+is%3Aopen+type%3Aissue+label%3A%22good+first+issue%22&type=issues) or [help wanted](https://github.com/search?q=org%3Aappwrite+is%3Aopen+type%3Aissue+label%3A%22help+wanted%22&type=issues). + +If you're not sure which issue to pick, ask in our ⁠[maintainers channel](https://discord.com/channels/564160730845151244/636852860709240842) on Discord. + +### 📝 Step 2: Ask to Be Assigned + +Before working on an issue, comment on the GitHub issue asking to be assigned. This prevents multiple people working on the same task. + +Then, create a thread in the ⁠[maintainers channel](https://discord.com/channels/564160730845151244/636852860709240842) on Discord with a link to the issue. + +Our team is small and may not see your GitHub comment right away - posting in the ⁠[maintainers channel](https://discord.com/channels/564160730845151244/636852860709240842) ensures it gets seen. + +### 💬 Step 3: Don’t Submit Random PRs + +If you're not working on an assigned issue, create a GitHub issue first. + +PRs submitted without context or discussion may not align with our roadmap and may be closed without review. + +### ⚠️ Please Note + +We’re a very small team managing a large project. Many PRs are submitted, and while we appreciate every effort, we can only review contributions that follow the process above. This helps us keep things fair and organized. ## Code of Conduct From b323b3a110fbd9d2a7b6cf59bd340288d0179370 Mon Sep 17 00:00:00 2001 From: Veeresh <75656445+Veera-mulge@users.noreply.github.com> Date: Thu, 31 Jul 2025 14:36:08 +0530 Subject: [PATCH 03/29] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 07e8464ea0..49a3290667 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ -> We just announced Auto-increment support for Appwrite Databases - [Learn more](https://appwrite.io/blog/post/announcing-auto-increment-support) - > [Get started with Appwrite](https://apwr.dev/appcloud)
From 0bf4aa2ce50ba9817cf3fb7e5d73104e61ae04b3 Mon Sep 17 00:00:00 2001 From: Veeresh <75656445+Veera-mulge@users.noreply.github.com> Date: Mon, 4 Aug 2025 16:50:11 +0530 Subject: [PATCH 04/29] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 49a3290667..ff5db8f183 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ - +> We just announced Atomic numeric operations for Appwrite Databases - [Learn more](https://appwrite.io/blog/post/announcing-atomic-numeric-operations) > [Get started with Appwrite](https://apwr.dev/appcloud)
From 5095f7555d1a77a7103c9732255030abfa291dfd Mon Sep 17 00:00:00 2001 From: Veeresh <75656445+Veera-mulge@users.noreply.github.com> Date: Mon, 4 Aug 2025 16:53:07 +0530 Subject: [PATCH 05/29] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ff5db8f183..50fba206ed 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ > We just announced Atomic numeric operations for Appwrite Databases - [Learn more](https://appwrite.io/blog/post/announcing-atomic-numeric-operations) + > [Get started with Appwrite](https://apwr.dev/appcloud)
From ec8faccf29e434606ac250e9bd6d161028a47e47 Mon Sep 17 00:00:00 2001 From: Laura Du Ry <123562732+LauraDuRy@users.noreply.github.com> Date: Wed, 6 Aug 2025 12:28:24 +0200 Subject: [PATCH 06/29] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 50fba206ed..1641a6d500 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -> We just announced Atomic numeric operations for Appwrite Databases - [Learn more](https://appwrite.io/blog/post/announcing-atomic-numeric-operations) +> Appwrite Cloud is now Generally Available - [Learn more](https://appwrite.io/cloud-ga) > [Get started with Appwrite](https://apwr.dev/appcloud) From a217bd1d0fe1f77ab03aeb36605b7f7b9f9f5595 Mon Sep 17 00:00:00 2001 From: Aditya Oberai Date: Fri, 8 Aug 2025 14:04:20 +0000 Subject: [PATCH 07/29] Add native sign in with Apple function template --- app/config/templates/function.php | 60 +++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/app/config/templates/function.php b/app/config/templates/function.php index d8426ad900..b7fe1f7d5f 100644 --- a/app/config/templates/function.php +++ b/app/config/templates/function.php @@ -2078,5 +2078,65 @@ return [ ] ], 'scopes' => ['users.read', 'users.write'] + ], + [ + 'icon' => 'icon-apple', + 'id' => 'sign-in-with-apple', + 'name' => 'Sign in with Apple', + 'score' => 6, + 'tagline' => 'Use native Apple sign-in APIs on Apple devices with Appwrite Auth', + 'permissions' => ['any'], + 'events' => [], + 'cron' => '', + 'timeout' => 15, + 'useCases' => ['auth'], + 'runtimes' => [ + ...getRuntimes( + $templateRuntimes['DART'], + 'dart pub get', + 'lib/main.dart', + 'dart/sign_in_with_apple' + ), + ], + 'instructions' => 'For documentation and instructions check out file.', + 'vcsProvider' => 'github', + 'providerRepositoryId' => 'templates', + 'providerOwner' => 'appwrite', + 'providerVersion' => '0.2.*', + 'variables' => [ + [ + 'name' => 'BUNDLE_ID', + 'description' => 'Bundle ID of the app. Learn more.', + 'value' => '', + 'placeholder' => 'com.companyname.appname', + 'required' => true, + 'type' => 'password' + ], + [ + 'name' => 'TEAM_ID', + 'description' => 'Team ID of the Apple Developer account.', + 'value' => '', + 'placeholder' => '6K3...5PH', + 'required' => true, + 'type' => 'password' + ], + [ + 'name' => 'KEY_ID', + 'description' => 'Key ID required to communicate with Apple Developer services. Learn more.', + 'value' => '', + 'placeholder' => '9G8...6YF', + 'required' => true, + 'type' => 'password' + ], + [ + 'name' => 'KEY_CONTENTS_ENCODED', + 'description' => 'Contents of Key required to communicated with Appwrite Developer services, encoded in Base64. Learn more.', + 'value' => '', + 'placeholder' => '7x8aA...Ab7c', + 'required' => true, + 'type' => 'password' + ] + ], + 'scopes' => ['users.read', 'users.write'] ] ]; From d85cd09d1a84df71502d34a4440537e498d3c554 Mon Sep 17 00:00:00 2001 From: Aditya Oberai Date: Fri, 8 Aug 2025 14:19:21 +0000 Subject: [PATCH 08/29] Update lemon squeezy payments template scopes --- app/config/templates/function.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/templates/function.php b/app/config/templates/function.php index b7fe1f7d5f..934decc47c 100644 --- a/app/config/templates/function.php +++ b/app/config/templates/function.php @@ -2077,7 +2077,7 @@ return [ 'type' => 'text' ] ], - 'scopes' => ['users.read', 'users.write'] + 'scopes' => ['databases.read', 'databases.write', 'collections.write', 'attributes.write', 'documents.read', 'documents.write', 'users.read', 'users.write'] ], [ 'icon' => 'icon-apple', From 7929684c94cd80c90fb69423d420d95e46ad68fb Mon Sep 17 00:00:00 2001 From: Aditya Oberai Date: Fri, 8 Aug 2025 14:20:41 +0000 Subject: [PATCH 09/29] fix variable types and description --- app/config/templates/function.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/config/templates/function.php b/app/config/templates/function.php index 934decc47c..4417e332b1 100644 --- a/app/config/templates/function.php +++ b/app/config/templates/function.php @@ -2110,7 +2110,7 @@ return [ 'value' => '', 'placeholder' => 'com.companyname.appname', 'required' => true, - 'type' => 'password' + 'type' => 'text' ], [ 'name' => 'TEAM_ID', @@ -2118,7 +2118,7 @@ return [ 'value' => '', 'placeholder' => '6K3...5PH', 'required' => true, - 'type' => 'password' + 'type' => 'text' ], [ 'name' => 'KEY_ID', @@ -2126,11 +2126,11 @@ return [ 'value' => '', 'placeholder' => '9G8...6YF', 'required' => true, - 'type' => 'password' + 'type' => 'text' ], [ 'name' => 'KEY_CONTENTS_ENCODED', - 'description' => 'Contents of Key required to communicated with Appwrite Developer services, encoded in Base64. Learn more.', + 'description' => 'Contents of Key required to communicated with Apple Developer services, encoded in Base64. Learn more.', 'value' => '', 'placeholder' => '7x8aA...Ab7c', 'required' => true, From 93db3a9979f68ad934aec0ba0cabecfeb1bccb85 Mon Sep 17 00:00:00 2001 From: Aditya Oberai Date: Fri, 8 Aug 2025 14:30:36 +0000 Subject: [PATCH 10/29] remove users scope for lemon squeezy payments template --- app/config/templates/function.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/templates/function.php b/app/config/templates/function.php index 4417e332b1..849ee021ba 100644 --- a/app/config/templates/function.php +++ b/app/config/templates/function.php @@ -2077,7 +2077,7 @@ return [ 'type' => 'text' ] ], - 'scopes' => ['databases.read', 'databases.write', 'collections.write', 'attributes.write', 'documents.read', 'documents.write', 'users.read', 'users.write'] + 'scopes' => ['databases.read', 'databases.write', 'collections.write', 'attributes.write', 'documents.read', 'documents.write'] ], [ 'icon' => 'icon-apple', From 890be673d9b06bc3131ba2e6c97a1bfcca50054c Mon Sep 17 00:00:00 2001 From: Aditya Oberai Date: Fri, 8 Aug 2025 15:55:50 +0000 Subject: [PATCH 11/29] formatting --- app/config/templates/function.php | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/app/config/templates/function.php b/app/config/templates/function.php index 849ee021ba..3a91fdfbb3 100644 --- a/app/config/templates/function.php +++ b/app/config/templates/function.php @@ -2091,14 +2091,9 @@ return [ 'timeout' => 15, 'useCases' => ['auth'], 'runtimes' => [ - ...getRuntimes( - $templateRuntimes['DART'], - 'dart pub get', - 'lib/main.dart', - 'dart/sign_in_with_apple' - ), + ...getRuntimes($templateRuntimes['DART'], 'dart pub get', 'lib/main.dart', 'dart/sign_in_with_apple') ], - 'instructions' => 'For documentation and instructions check out file.', + 'instructions' => 'For documentation and instructions, check out file.', 'vcsProvider' => 'github', 'providerRepositoryId' => 'templates', 'providerOwner' => 'appwrite', From f2f0ef2656209397ab2819ad68923c4787381e3c Mon Sep 17 00:00:00 2001 From: Veeresh <75656445+Veera-mulge@users.noreply.github.com> Date: Wed, 13 Aug 2025 15:54:13 +0530 Subject: [PATCH 12/29] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 1641a6d500..27d6dd9006 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +> We just announced Timestamp Overrides for Appwrite Databases - [Learn more](https://appwrite.io/blog/post/announcing-timestamp-overrides) + > Appwrite Cloud is now Generally Available - [Learn more](https://appwrite.io/cloud-ga) > [Get started with Appwrite](https://apwr.dev/appcloud) From 3f55b461652bacd3e669612c7a30a13789302fad Mon Sep 17 00:00:00 2001 From: Ebenezer Don Date: Mon, 18 Aug 2025 17:18:12 +0100 Subject: [PATCH 13/29] clarify userId behavior for magic-url and phone tokens --- app/controllers/api/account.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/account.php b/app/controllers/api/account.php index e28641ad4f..66327e2f3d 100644 --- a/app/controllers/api/account.php +++ b/app/controllers/api/account.php @@ -1905,7 +1905,7 @@ App::post('/v1/account/tokens/magic-url') )) ->label('abuse-limit', 60) ->label('abuse-key', ['url:{url},email:{param-email}', 'url:{url},ip:{ip}']) - ->param('userId', '', new CustomId(), 'Unique Id. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.') + ->param('userId', '', new CustomId(), 'Unique Id. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars. If the email address has never been used, a new account is created using the provided userId. Otherwise, if the email address is already attached to an account, the user ID is ignored.') ->param('email', '', new Email(), 'User email.') ->param('url', '', fn ($platforms, $devKey) => $devKey->isEmpty() ? new Redirect($platforms) : new URL(), 'URL to redirect the user back to your app from the magic URL login. Only URLs from hostnames in your project platform list are allowed. This requirement helps to prevent an [open redirect](https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html) attack against your project API.', true, ['platforms', 'devKey']) ->param('phrase', false, new Boolean(), 'Toggle for security phrase. If enabled, email will be send with a randomly generated phrase and the phrase will also be included in the response. Confirming phrases match increases the security of your authentication flow.', true) @@ -2459,7 +2459,7 @@ App::post('/v1/account/tokens/phone') )) ->label('abuse-limit', 10) ->label('abuse-key', ['url:{url},phone:{param-phone}', 'url:{url},ip:{ip}']) - ->param('userId', '', new CustomId(), 'Unique Id. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars.') + ->param('userId', '', new CustomId(), 'Unique Id. Choose a custom ID or generate a random ID with `ID.unique()`. Valid chars are a-z, A-Z, 0-9, period, hyphen, and underscore. Can\'t start with a special char. Max length is 36 chars. If the phone number has never been used, a new account is created using the provided userId. Otherwise, if the phone number is already attached to an account, the user ID is ignored.') ->param('phone', '', new Phone(), 'Phone number. Format this number with a leading \'+\' and a country code, e.g., +16175551212.') ->inject('request') ->inject('response') From 2718deac0f94b354deabcf17500d39d2aa05afb2 Mon Sep 17 00:00:00 2001 From: fogelito Date: Tue, 19 Aug 2025 12:09:18 +0300 Subject: [PATCH 14/29] database 0.71.15 --- composer.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/composer.lock b/composer.lock index cd3eb5fef7..0855905a4a 100644 --- a/composer.lock +++ b/composer.lock @@ -3548,16 +3548,16 @@ }, { "name": "utopia-php/database", - "version": "0.71.14", + "version": "0.71.15", "source": { "type": "git", "url": "https://github.com/utopia-php/database.git", - "reference": "20998e268ec528ebbf06adb77ec4230f70469fa7" + "reference": "638e3fb74524970bc589aa7be564aa0783857ee0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/database/zipball/20998e268ec528ebbf06adb77ec4230f70469fa7", - "reference": "20998e268ec528ebbf06adb77ec4230f70469fa7", + "url": "https://api.github.com/repos/utopia-php/database/zipball/638e3fb74524970bc589aa7be564aa0783857ee0", + "reference": "638e3fb74524970bc589aa7be564aa0783857ee0", "shasum": "" }, "require": { @@ -3598,9 +3598,9 @@ ], "support": { "issues": "https://github.com/utopia-php/database/issues", - "source": "https://github.com/utopia-php/database/tree/0.71.14" + "source": "https://github.com/utopia-php/database/tree/0.71.15" }, - "time": "2025-08-14T07:15:06+00:00" + "time": "2025-08-19T08:35:32+00:00" }, { "name": "utopia-php/detector", @@ -4917,16 +4917,16 @@ "packages-dev": [ { "name": "appwrite/sdk-generator", - "version": "0.41.29", + "version": "0.41.30", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "4af563f3b0879747efc8434eb8ed8bf97e75039f" + "reference": "14a6e52d0d1075d176f4c80cafde9afe506e7455" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/4af563f3b0879747efc8434eb8ed8bf97e75039f", - "reference": "4af563f3b0879747efc8434eb8ed8bf97e75039f", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/14a6e52d0d1075d176f4c80cafde9afe506e7455", + "reference": "14a6e52d0d1075d176f4c80cafde9afe506e7455", "shasum": "" }, "require": { @@ -4962,9 +4962,9 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/0.41.29" + "source": "https://github.com/appwrite/sdk-generator/tree/0.41.30" }, - "time": "2025-08-04T04:34:45+00:00" + "time": "2025-08-18T01:39:09+00:00" }, { "name": "doctrine/annotations", @@ -8426,5 +8426,5 @@ "platform-overrides": { "php": "8.3" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } From 8672e6f1581a91c1b622e5a55bbd493d7bb059ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 19 Aug 2025 13:13:04 +0200 Subject: [PATCH 15/29] http fix to double slashes and new domain validator --- composer.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index 0855905a4a..922f5bf5ee 100644 --- a/composer.lock +++ b/composer.lock @@ -3852,16 +3852,16 @@ }, { "name": "utopia-php/framework", - "version": "0.33.20", + "version": "0.33.21", "source": { "type": "git", "url": "https://github.com/utopia-php/http.git", - "reference": "e1c7ab4e0b5b0a9a70256b1e00912e101e76a131" + "reference": "eb0e82e90b8fa493f99b8d131bdd25173422c493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/http/zipball/e1c7ab4e0b5b0a9a70256b1e00912e101e76a131", - "reference": "e1c7ab4e0b5b0a9a70256b1e00912e101e76a131", + "url": "https://api.github.com/repos/utopia-php/http/zipball/eb0e82e90b8fa493f99b8d131bdd25173422c493", + "reference": "eb0e82e90b8fa493f99b8d131bdd25173422c493", "shasum": "" }, "require": { @@ -3893,9 +3893,9 @@ ], "support": { "issues": "https://github.com/utopia-php/http/issues", - "source": "https://github.com/utopia-php/http/tree/0.33.20" + "source": "https://github.com/utopia-php/http/tree/0.33.21" }, - "time": "2025-05-18T23:51:21+00:00" + "time": "2025-08-19T10:52:15+00:00" }, { "name": "utopia-php/image", @@ -8426,5 +8426,5 @@ "platform-overrides": { "php": "8.3" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.3.0" } From 09383f068f94b31b642197d5e60429880006cc14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 19 Aug 2025 13:13:28 +0200 Subject: [PATCH 16/29] Revert "http fix to double slashes and new domain validator" This reverts commit 8672e6f1581a91c1b622e5a55bbd493d7bb059ff. --- composer.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index 922f5bf5ee..0855905a4a 100644 --- a/composer.lock +++ b/composer.lock @@ -3852,16 +3852,16 @@ }, { "name": "utopia-php/framework", - "version": "0.33.21", + "version": "0.33.20", "source": { "type": "git", "url": "https://github.com/utopia-php/http.git", - "reference": "eb0e82e90b8fa493f99b8d131bdd25173422c493" + "reference": "e1c7ab4e0b5b0a9a70256b1e00912e101e76a131" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/http/zipball/eb0e82e90b8fa493f99b8d131bdd25173422c493", - "reference": "eb0e82e90b8fa493f99b8d131bdd25173422c493", + "url": "https://api.github.com/repos/utopia-php/http/zipball/e1c7ab4e0b5b0a9a70256b1e00912e101e76a131", + "reference": "e1c7ab4e0b5b0a9a70256b1e00912e101e76a131", "shasum": "" }, "require": { @@ -3893,9 +3893,9 @@ ], "support": { "issues": "https://github.com/utopia-php/http/issues", - "source": "https://github.com/utopia-php/http/tree/0.33.21" + "source": "https://github.com/utopia-php/http/tree/0.33.20" }, - "time": "2025-08-19T10:52:15+00:00" + "time": "2025-05-18T23:51:21+00:00" }, { "name": "utopia-php/image", @@ -8426,5 +8426,5 @@ "platform-overrides": { "php": "8.3" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } From 79375ad5b5f46ed49408357c4c8505d6455b8b1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 19 Aug 2025 13:13:41 +0200 Subject: [PATCH 17/29] Reapply "http fix to double slashes and new domain validator" This reverts commit 09383f068f94b31b642197d5e60429880006cc14. --- composer.lock | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/composer.lock b/composer.lock index 0855905a4a..922f5bf5ee 100644 --- a/composer.lock +++ b/composer.lock @@ -3852,16 +3852,16 @@ }, { "name": "utopia-php/framework", - "version": "0.33.20", + "version": "0.33.21", "source": { "type": "git", "url": "https://github.com/utopia-php/http.git", - "reference": "e1c7ab4e0b5b0a9a70256b1e00912e101e76a131" + "reference": "eb0e82e90b8fa493f99b8d131bdd25173422c493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/utopia-php/http/zipball/e1c7ab4e0b5b0a9a70256b1e00912e101e76a131", - "reference": "e1c7ab4e0b5b0a9a70256b1e00912e101e76a131", + "url": "https://api.github.com/repos/utopia-php/http/zipball/eb0e82e90b8fa493f99b8d131bdd25173422c493", + "reference": "eb0e82e90b8fa493f99b8d131bdd25173422c493", "shasum": "" }, "require": { @@ -3893,9 +3893,9 @@ ], "support": { "issues": "https://github.com/utopia-php/http/issues", - "source": "https://github.com/utopia-php/http/tree/0.33.20" + "source": "https://github.com/utopia-php/http/tree/0.33.21" }, - "time": "2025-05-18T23:51:21+00:00" + "time": "2025-08-19T10:52:15+00:00" }, { "name": "utopia-php/image", @@ -8426,5 +8426,5 @@ "platform-overrides": { "php": "8.3" }, - "plugin-api-version": "2.6.0" + "plugin-api-version": "2.3.0" } From 6f5d0383409b4e63bbc33392ef53543022a1cd68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 19 Aug 2025 14:42:41 +0200 Subject: [PATCH 18/29] adjust tests to new domain validator --- tests/e2e/Services/Health/HealthCustomServerTest.php | 2 +- tests/e2e/Services/Proxy/ProxyCustomServerTest.php | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/tests/e2e/Services/Health/HealthCustomServerTest.php b/tests/e2e/Services/Health/HealthCustomServerTest.php index 4b7062dc22..04f4c63ca1 100644 --- a/tests/e2e/Services/Health/HealthCustomServerTest.php +++ b/tests/e2e/Services/Health/HealthCustomServerTest.php @@ -453,7 +453,7 @@ class HealthCustomServerTest extends Scope $this->assertIsInt($response['body']['validFrom']); $this->assertIsInt($response['body']['validTo']); - $response = $this->client->call(Client::METHOD_GET, '/health/certificate?domain=https://google.com', array_merge([ + $response = $this->client->call(Client::METHOD_GET, '/health/certificate?domain=google.com', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), []); diff --git a/tests/e2e/Services/Proxy/ProxyCustomServerTest.php b/tests/e2e/Services/Proxy/ProxyCustomServerTest.php index ea310d5449..da23b9ab7c 100644 --- a/tests/e2e/Services/Proxy/ProxyCustomServerTest.php +++ b/tests/e2e/Services/Proxy/ProxyCustomServerTest.php @@ -109,15 +109,11 @@ class ProxyCustomServerTest extends Scope $rule = $this->createAPIRule('https://' . $domain); $this->assertEquals(400, $rule['headers']['status-code']); - // Unexpected I would say, but it is the current behaviour $rule = $this->createAPIRule('wss://' . $domain); - $this->assertEquals(201, $rule['headers']['status-code']); - $this->cleanupRule($rule['body']['$id']); + $this->assertEquals(400, $rule['headers']['status-code']); - // Unexpected I would say, but it is the current behaviour $rule = $this->createAPIRule($domain . '/some-path'); - $this->assertEquals(201, $rule['headers']['status-code']); - $this->cleanupRule($rule['body']['$id']); + $this->assertEquals(400, $rule['headers']['status-code']); } public function testCreateRedirectRule(): void From 52af439cacb0e9044b6bc0ba0ec75b1f6c7a0f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Tue, 19 Aug 2025 16:43:31 +0200 Subject: [PATCH 19/29] Fix backwards comptibility --- app/controllers/api/health.php | 4 +++- tests/e2e/Services/Health/HealthCustomServerTest.php | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/health.php b/app/controllers/api/health.php index 32b77433f0..975db909c6 100644 --- a/app/controllers/api/health.php +++ b/app/controllers/api/health.php @@ -23,10 +23,12 @@ use Utopia\Storage\Device; use Utopia\Storage\Device\Local; use Utopia\Storage\Storage; use Utopia\System\System; +use Utopia\Validator\AnyOf; use Utopia\Validator\Domain; use Utopia\Validator\Integer; use Utopia\Validator\Multiple; use Utopia\Validator\Text; +use Utopia\Validator\URL; use Utopia\Validator\WhiteList; App::get('/v1/health') @@ -397,7 +399,7 @@ App::get('/v1/health/certificate') ], contentType: ContentType::JSON )) - ->param('domain', null, new Multiple([new Domain(), new PublicDomain()]), Multiple::TYPE_STRING, 'Domain name') + ->param('domain', null, new Multiple([new AnyOf([new URL(), new Domain()]), new PublicDomain()]), Multiple::TYPE_STRING, 'Domain name') ->inject('response') ->action(function (string $domain, Response $response) { if (filter_var($domain, FILTER_VALIDATE_URL)) { diff --git a/tests/e2e/Services/Health/HealthCustomServerTest.php b/tests/e2e/Services/Health/HealthCustomServerTest.php index 04f4c63ca1..4b7062dc22 100644 --- a/tests/e2e/Services/Health/HealthCustomServerTest.php +++ b/tests/e2e/Services/Health/HealthCustomServerTest.php @@ -453,7 +453,7 @@ class HealthCustomServerTest extends Scope $this->assertIsInt($response['body']['validFrom']); $this->assertIsInt($response['body']['validTo']); - $response = $this->client->call(Client::METHOD_GET, '/health/certificate?domain=google.com', array_merge([ + $response = $this->client->call(Client::METHOD_GET, '/health/certificate?domain=https://google.com', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), []); From bd4bb06c7e2e626e12486a4d0ada1d01e6314c6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 20 Aug 2025 11:11:39 +0200 Subject: [PATCH 20/29] Remove bunnyCDN and Alpine external dependency --- app/views/general/404.phtml | 24 +++++++++++++-- app/views/general/error.phtml | 55 ++++++++++++++++++++++++++++++----- 2 files changed, 69 insertions(+), 10 deletions(-) diff --git a/app/views/general/404.phtml b/app/views/general/404.phtml index 03fdedb261..6dbf158205 100644 --- a/app/views/general/404.phtml +++ b/app/views/general/404.phtml @@ -6,8 +6,28 @@ 404 Not Found - - + + + <?php echo $this->print($title); ?> - +
-
+
print($label); ?>

print($message); ?>

@@ -462,14 +490,14 @@ switch ($type) { - +
-
-
Error trace
@@ -500,6 +528,17 @@ switch ($type) {
+ \ No newline at end of file From 79a0b6b6c387a5b786eeae1bf2b550db8039f120 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Wed, 20 Aug 2025 11:21:21 +0200 Subject: [PATCH 21/29] Fix during QA --- app/views/general/error.phtml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/views/general/error.phtml b/app/views/general/error.phtml index c21cb6dd26..8eab2d62cf 100644 --- a/app/views/general/error.phtml +++ b/app/views/general/error.phtml @@ -496,7 +496,7 @@ switch ($type) {
-
+