diff --git a/app/workers/certificates.php b/app/workers/certificates.php
index 515fbb7b0d..da3c4ec5c4 100644
--- a/app/workers/certificates.php
+++ b/app/workers/certificates.php
@@ -52,8 +52,8 @@ class CertificatesV1
$domain = $this->args['domain'];
// Validation Args
- $validateTarget = (isset($this->args['validateTarget'])) ? $this->args['validateTarget'] : true;
- $validateCNAME = (isset($this->args['validateCNAME'])) ? $this->args['validateCNAME'] : true;
+ $validateTarget = $this->args['validateTarget'] ?? true;
+ $validateCNAME = $this->args['validateCNAME'] ?? true;
// Options
$domain = new Domain((!empty($domain)) ? $domain : '');
diff --git a/app/workers/tasks.php b/app/workers/tasks.php
index ca82abe59b..f654748a6d 100644
--- a/app/workers/tasks.php
+++ b/app/workers/tasks.php
@@ -48,9 +48,9 @@ class TasksV1
* If error count bigger than allowed change status to pause
*/
- $taskId = (isset($this->args['$id'])) ? $this->args['$id'] : null;
- $updated = (isset($this->args['updated'])) ? $this->args['updated'] : null;
- $next = (isset($this->args['next'])) ? $this->args['next'] : null;
+ $taskId = $this->args['$id'] ?? null;
+ $updated = $this->args['updated'] ?? null;
+ $next = $this->args['next'] ?? null;
$delay = \time() - $next;
$errors = [];
$timeout = 60 * 5; // 5 minutes
diff --git a/app/workers/webhooks.php b/app/workers/webhooks.php
index 25691a108c..cfbc8a6712 100644
--- a/app/workers/webhooks.php
+++ b/app/workers/webhooks.php
@@ -55,12 +55,12 @@ class WebhooksV1
continue;
}
- $name = (isset($webhook['name'])) ? $webhook['name'] : '';
- $signature = (isset($webhook['signature'])) ? $webhook['signature'] : 'not-yet-implemented';
- $url = (isset($webhook['url'])) ? $webhook['url'] : '';
- $security = (isset($webhook['security'])) ? (bool) $webhook['security'] : true;
- $httpUser = (isset($webhook['httpUser'])) ? $webhook['httpUser'] : null;
- $httpPass = (isset($webhook['httpPass'])) ? $webhook['httpPass'] : null;
+ $name = $webhook['name'] ?? '';
+ $signature = $webhook['signature'] ?? 'not-yet-implemented';
+ $url = $webhook['url'] ?? '';
+ $security = (bool) $webhook['security'] ?? true;
+ $httpUser = $webhook['httpUser'] ?? null;
+ $httpPass = $webhook['httpPass'] ?? null;
$ch = \curl_init($url);
diff --git a/composer.lock b/composer.lock
index 1392b6fdd0..297b144e81 100644
--- a/composer.lock
+++ b/composer.lock
@@ -102,16 +102,16 @@
},
{
"name": "colinmollenhour/credis",
- "version": "1.11.2",
+ "version": "v1.11.4",
"source": {
"type": "git",
"url": "https://github.com/colinmollenhour/credis.git",
- "reference": "b8b2bd6b87d2d4df67065f3510efb80d5f9c4e53"
+ "reference": "b458b7c65d156744f5f0c4667c0f8ce45d955435"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/colinmollenhour/credis/zipball/b8b2bd6b87d2d4df67065f3510efb80d5f9c4e53",
- "reference": "b8b2bd6b87d2d4df67065f3510efb80d5f9c4e53",
+ "url": "https://api.github.com/repos/colinmollenhour/credis/zipball/b458b7c65d156744f5f0c4667c0f8ce45d955435",
+ "reference": "b458b7c65d156744f5f0c4667c0f8ce45d955435",
"shasum": ""
},
"require": {
@@ -138,7 +138,7 @@
],
"description": "Credis is a lightweight interface to the Redis key-value store which wraps the phpredis library when available for better performance.",
"homepage": "https://github.com/colinmollenhour/credis",
- "time": "2020-06-15T19:25:47+00:00"
+ "time": "2020-10-13T23:55:13+00:00"
},
{
"name": "composer/ca-bundle",
@@ -212,16 +212,16 @@
},
{
"name": "dasprid/enum",
- "version": "1.0.2",
+ "version": "1.0.3",
"source": {
"type": "git",
"url": "https://github.com/DASPRiD/Enum.git",
- "reference": "6ccc0d7141a7f149e3c56cb0ce5f05d9152cfd07"
+ "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/6ccc0d7141a7f149e3c56cb0ce5f05d9152cfd07",
- "reference": "6ccc0d7141a7f149e3c56cb0ce5f05d9152cfd07",
+ "url": "https://api.github.com/repos/DASPRiD/Enum/zipball/5abf82f213618696dda8e3bf6f64dd042d8542b2",
+ "reference": "5abf82f213618696dda8e3bf6f64dd042d8542b2",
"shasum": ""
},
"require-dev": {
@@ -251,7 +251,7 @@
"enum",
"map"
],
- "time": "2020-07-30T16:37:13+00:00"
+ "time": "2020-10-02T16:03:48+00:00"
},
{
"name": "domnikl/statsd",
@@ -412,23 +412,23 @@
},
{
"name": "guzzlehttp/guzzle",
- "version": "dev-master",
+ "version": "7.2.0",
"source": {
"type": "git",
"url": "https://github.com/guzzle/guzzle.git",
- "reference": "616288af85deea154a61f5b996b0df69f7252e36"
+ "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/guzzle/zipball/616288af85deea154a61f5b996b0df69f7252e36",
- "reference": "616288af85deea154a61f5b996b0df69f7252e36",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/0aa74dfb41ae110835923ef10a9d803a22d50e79",
+ "reference": "0aa74dfb41ae110835923ef10a9d803a22d50e79",
"shasum": ""
},
"require": {
"ext-json": "*",
"guzzlehttp/promises": "^1.4",
"guzzlehttp/psr7": "^1.7",
- "php": "^7.2.5",
+ "php": "^7.2.5 || ^8.0",
"psr/http-client": "^1.0"
},
"provide": {
@@ -436,8 +436,8 @@
},
"require-dev": {
"ext-curl": "*",
- "php-http/client-integration-tests": "dev-phpunit8",
- "phpunit/phpunit": "^8.5.5",
+ "php-http/client-integration-tests": "^3.0",
+ "phpunit/phpunit": "^8.5.5 || ^9.3.5",
"psr/log": "^1.1"
},
"suggest": {
@@ -506,7 +506,7 @@
"type": "github"
}
],
- "time": "2020-09-30T15:03:52+00:00"
+ "time": "2020-10-10T11:47:56+00:00"
},
{
"name": "guzzlehttp/promises",
@@ -693,23 +693,23 @@
},
{
"name": "maxmind-db/reader",
- "version": "v1.7.0",
+ "version": "v1.8.0",
"source": {
"type": "git",
"url": "https://github.com/maxmind/MaxMind-DB-Reader-php.git",
- "reference": "942553da239f12051275f9c666538b5dd09e2908"
+ "reference": "b566d429ac9aec10594b0935be8ff38302f8d5c8"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/942553da239f12051275f9c666538b5dd09e2908",
- "reference": "942553da239f12051275f9c666538b5dd09e2908",
+ "url": "https://api.github.com/repos/maxmind/MaxMind-DB-Reader-php/zipball/b566d429ac9aec10594b0935be8ff38302f8d5c8",
+ "reference": "b566d429ac9aec10594b0935be8ff38302f8d5c8",
"shasum": ""
},
"require": {
"php": ">=7.2"
},
"conflict": {
- "ext-maxminddb": "<1.7.0,>=2.0.0"
+ "ext-maxminddb": "<1.8.0,>=2.0.0"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "2.*",
@@ -749,31 +749,31 @@
"geolocation",
"maxmind"
],
- "time": "2020-08-07T22:10:05+00:00"
+ "time": "2020-10-01T17:30:21+00:00"
},
{
"name": "maxmind/web-service-common",
- "version": "v0.7.0",
+ "version": "v0.8.0",
"source": {
"type": "git",
"url": "https://github.com/maxmind/web-service-common-php.git",
- "reference": "74c996c218ada5c639c8c2f076756e059f5552fc"
+ "reference": "ba67d9532cfaf499bd71774b8170d05df4f75fb7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/74c996c218ada5c639c8c2f076756e059f5552fc",
- "reference": "74c996c218ada5c639c8c2f076756e059f5552fc",
+ "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/ba67d9532cfaf499bd71774b8170d05df4f75fb7",
+ "reference": "ba67d9532cfaf499bd71774b8170d05df4f75fb7",
"shasum": ""
},
"require": {
"composer/ca-bundle": "^1.0.3",
"ext-curl": "*",
"ext-json": "*",
- "php": ">=5.6"
+ "php": ">=7.2"
},
"require-dev": {
"friendsofphp/php-cs-fixer": "2.*",
- "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0",
+ "phpunit/phpunit": "^8.0 || ^9.0",
"squizlabs/php_codesniffer": "3.*"
},
"type": "library",
@@ -795,7 +795,7 @@
],
"description": "Internal MaxMind Web Service API",
"homepage": "https://github.com/maxmind/web-service-common-php",
- "time": "2020-05-06T14:07:26+00:00"
+ "time": "2020-10-01T15:28:36+00:00"
},
{
"name": "mustangostang/spyc",
@@ -1665,7 +1665,7 @@
"source": {
"type": "git",
"url": "https://github.com/appwrite/sdk-generator",
- "reference": "552f9d872210c8a689727dd3a661c163b3816686"
+ "reference": "a57b3cd56c4bfe1538276cfc77456cf95d8835cb"
},
"require": {
"ext-curl": "*",
@@ -1695,7 +1695,7 @@
}
],
"description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms",
- "time": "2020-09-08T12:57:50+00:00"
+ "time": "2020-10-14T12:07:25+00:00"
},
{
"name": "doctrine/instantiator",
@@ -1882,12 +1882,12 @@
"source": {
"type": "git",
"url": "https://github.com/myclabs/DeepCopy.git",
- "reference": "a3409d10079990eeb489c3fead0ac070b5b38895"
+ "reference": "00aba97fc36feabc8d94667eebd5d43959e60008"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/a3409d10079990eeb489c3fead0ac070b5b38895",
- "reference": "a3409d10079990eeb489c3fead0ac070b5b38895",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/00aba97fc36feabc8d94667eebd5d43959e60008",
+ "reference": "00aba97fc36feabc8d94667eebd5d43959e60008",
"shasum": ""
},
"require": {
@@ -1928,7 +1928,7 @@
"type": "tidelift"
}
],
- "time": "2020-08-28T16:31:07+00:00"
+ "time": "2020-10-01T09:35:15+00:00"
},
{
"name": "nikic/php-parser",
@@ -2300,12 +2300,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "a6037d775070cc82732c21809664c63fb4f19916"
+ "reference": "ece0c3ceee73810bd95226401bbfaea9e0f64de7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/a6037d775070cc82732c21809664c63fb4f19916",
- "reference": "a6037d775070cc82732c21809664c63fb4f19916",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ece0c3ceee73810bd95226401bbfaea9e0f64de7",
+ "reference": "ece0c3ceee73810bd95226401bbfaea9e0f64de7",
"shasum": ""
},
"require": {
@@ -2365,7 +2365,7 @@
"type": "github"
}
],
- "time": "2020-09-27T04:42:46+00:00"
+ "time": "2020-10-09T14:34:55+00:00"
},
{
"name": "phpunit/php-file-iterator",
@@ -2594,16 +2594,16 @@
},
{
"name": "phpunit/phpunit",
- "version": "9.3.11",
+ "version": "dev-master",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "f7316ea106df7c9507f4fdaa88c47bc10a3b27a1"
+ "reference": "8b79c2a70ae855e582cef1ca63a849fe07bdb01d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f7316ea106df7c9507f4fdaa88c47bc10a3b27a1",
- "reference": "f7316ea106df7c9507f4fdaa88c47bc10a3b27a1",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8b79c2a70ae855e582cef1ca63a849fe07bdb01d",
+ "reference": "8b79c2a70ae855e582cef1ca63a849fe07bdb01d",
"shasum": ""
},
"require": {
@@ -2618,23 +2618,23 @@
"phar-io/manifest": "^2.0.1",
"phar-io/version": "^3.0.2",
"php": ">=7.3",
- "phpspec/prophecy": "^1.11.1",
- "phpunit/php-code-coverage": "^9.1.11",
- "phpunit/php-file-iterator": "^3.0.4",
- "phpunit/php-invoker": "^3.1",
- "phpunit/php-text-template": "^2.0.2",
- "phpunit/php-timer": "^5.0.1",
- "sebastian/cli-parser": "^1.0",
- "sebastian/code-unit": "^1.0.5",
- "sebastian/comparator": "^4.0.3",
- "sebastian/diff": "^4.0.2",
- "sebastian/environment": "^5.1.2",
- "sebastian/exporter": "^4.0.2",
- "sebastian/global-state": "^5.0",
- "sebastian/object-enumerator": "^4.0.2",
- "sebastian/resource-operations": "^3.0.2",
- "sebastian/type": "^2.2.1",
- "sebastian/version": "^3.0.1"
+ "phpspec/prophecy": "^1.12.1",
+ "phpunit/php-code-coverage": "^9.2",
+ "phpunit/php-file-iterator": "^3.0.5",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.3",
+ "phpunit/php-timer": "^5.0.2",
+ "sebastian/cli-parser": "^1.0.1",
+ "sebastian/code-unit": "^1.0.6",
+ "sebastian/comparator": "^4.0.5",
+ "sebastian/diff": "^4.0.3",
+ "sebastian/environment": "^5.1.3",
+ "sebastian/exporter": "^4.0.3",
+ "sebastian/global-state": "^5.0.1",
+ "sebastian/object-enumerator": "^4.0.3",
+ "sebastian/resource-operations": "^3.0.3",
+ "sebastian/type": "^2.3",
+ "sebastian/version": "^3.0.2"
},
"require-dev": {
"ext-pdo": "*",
@@ -2650,7 +2650,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "9.3-dev"
+ "dev-master": "9.5-dev"
}
},
"autoload": {
@@ -2689,7 +2689,7 @@
"type": "github"
}
],
- "time": "2020-09-24T08:08:49+00:00"
+ "time": "2020-10-11T07:43:20+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -2749,12 +2749,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit.git",
- "reference": "d3a241b6028ff9d8e97d2b6ebd4090d01f92fad8"
+ "reference": "59236be62b1bb9919e6d7f60b0b832dc05cef9ab"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/d3a241b6028ff9d8e97d2b6ebd4090d01f92fad8",
- "reference": "d3a241b6028ff9d8e97d2b6ebd4090d01f92fad8",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/59236be62b1bb9919e6d7f60b0b832dc05cef9ab",
+ "reference": "59236be62b1bb9919e6d7f60b0b832dc05cef9ab",
"shasum": ""
},
"require": {
@@ -2793,7 +2793,7 @@
"type": "github"
}
],
- "time": "2020-09-28T05:28:46+00:00"
+ "time": "2020-10-02T14:47:54+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
@@ -2975,12 +2975,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "ffc949a1a2aae270ea064453d7535b82e4c32092"
+ "reference": "e3ec6059b3fe483d42fbaf1fe6eefa201f7b4a6d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ffc949a1a2aae270ea064453d7535b82e4c32092",
- "reference": "ffc949a1a2aae270ea064453d7535b82e4c32092",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/e3ec6059b3fe483d42fbaf1fe6eefa201f7b4a6d",
+ "reference": "e3ec6059b3fe483d42fbaf1fe6eefa201f7b4a6d",
"shasum": ""
},
"require": {
@@ -3029,7 +3029,7 @@
"type": "github"
}
],
- "time": "2020-09-28T05:32:55+00:00"
+ "time": "2020-10-13T11:48:30+00:00"
},
{
"name": "sebastian/environment",
@@ -3496,12 +3496,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
- "reference": "e494dcaeb89d1458c9ccd8c819745245a1669aea"
+ "reference": "fa592377f3923946cb90bf1f6a71ba2e5f229909"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/e494dcaeb89d1458c9ccd8c819745245a1669aea",
- "reference": "e494dcaeb89d1458c9ccd8c819745245a1669aea",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fa592377f3923946cb90bf1f6a71ba2e5f229909",
+ "reference": "fa592377f3923946cb90bf1f6a71ba2e5f229909",
"shasum": ""
},
"require": {
@@ -3513,7 +3513,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.2-dev"
+ "dev-master": "2.3-dev"
}
},
"autoload": {
@@ -3540,7 +3540,7 @@
"type": "github"
}
],
- "time": "2020-09-28T06:01:38+00:00"
+ "time": "2020-10-06T08:41:03+00:00"
},
{
"name": "sebastian/version",
@@ -3830,12 +3830,12 @@
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
- "reference": "f4aacffcbb556d443a15c4e49d62070903c05270"
+ "reference": "fa2f1ccdb44a973571235c4a78487c040f26f116"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/f4aacffcbb556d443a15c4e49d62070903c05270",
- "reference": "f4aacffcbb556d443a15c4e49d62070903c05270",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/fa2f1ccdb44a973571235c4a78487c040f26f116",
+ "reference": "fa2f1ccdb44a973571235c4a78487c040f26f116",
"shasum": ""
},
"require": {
@@ -3897,7 +3897,7 @@
"type": "tidelift"
}
],
- "time": "2020-09-27T05:01:29+00:00"
+ "time": "2020-10-14T06:37:57+00:00"
},
{
"name": "webmozart/assert",
From 22a6e25ddc290ea147df4aaac94913c8c651874c Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Thu, 15 Oct 2020 00:45:31 +0300
Subject: [PATCH 055/133] Updated Swoole version
---
Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Dockerfile b/Dockerfile
index 63862cfbb4..3c990cb8bc 100755
--- a/Dockerfile
+++ b/Dockerfile
@@ -16,7 +16,7 @@ FROM php:7.4-cli-alpine as step1
ENV TZ=Asia/Tel_Aviv \
PHP_REDIS_VERSION=5.3.0 \
- PHP_SWOOLE_VERSION=4.5.3 \
+ PHP_SWOOLE_VERSION=4.5.5 \
PHP_XDEBUG_VERSION=sdebug_2_9-beta
RUN \
From c45bf0bfa4f8be95cd46be477730328707b39520 Mon Sep 17 00:00:00 2001
From: "Andhika H. Santoso"
Date: Thu, 15 Oct 2020 07:35:55 +0700
Subject: [PATCH 056/133] Fix translatain for Democratic Republic of the Congo.
---
app/config/locale/translations/id.countries.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/config/locale/translations/id.countries.php b/app/config/locale/translations/id.countries.php
index f877be39a1..049ae9c6c5 100644
--- a/app/config/locale/translations/id.countries.php
+++ b/app/config/locale/translations/id.countries.php
@@ -36,7 +36,7 @@ return [
'CN' => 'Cina',
'CI' => 'Pantai Gading',
'CM' => 'Kamerun',
- 'CD' => 'DR Kongo',
+ 'CD' => 'Republik Demokratik Kongo',
'CG' => 'Republik Kongo',
'CO' => 'Kolombia',
'KM' => 'Komoro',
From 074551169ce94fdf95a587bc6ff249b09d8c90a5 Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Thu, 15 Oct 2020 07:30:47 +0300
Subject: [PATCH 057/133] Updated Travis CI URL
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 198964dcbd..fc70207572 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
[](CONTRIBUTING.md)
[](https://discord.gg/GSeTUeA)
[](https://travis-ci.org/appwrite/appwrite)
-[](https://travis-ci.org/appwrite/appwrite)
+[](https://travis-ci.com/appwrite/appwrite)
[](https://twitter.com/appwrite_io)
[](https://stackshare.io/appwrite)
@@ -34,9 +34,9 @@ Table of Contents:
- [SDKs](#sdks)
- [Client](#client)
- [Server](#server)
+- [Contributing](#contributing)
- [Security](#security)
- [Follow Us](#follow-us)
-- [Contributing](#contributing)
- [License](#license)
## Installation
From 2df1a4f8b16444b70d5a386cb1ffaf5e286527f9 Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Thu, 15 Oct 2020 07:38:46 +0300
Subject: [PATCH 058/133] Updated setup script
---
app/tasks/install.php | 23 ++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/app/tasks/install.php b/app/tasks/install.php
index 3b3aa4ea67..c1d0026010 100644
--- a/app/tasks/install.php
+++ b/app/tasks/install.php
@@ -6,12 +6,14 @@ use Appwrite\Docker\Compose;
use Appwrite\Docker\Env;
use Utopia\CLI\Console;
use Utopia\Config\Config;
+use Utopia\Validator\Mock;
use Utopia\View;
$cli
->task('install')
->desc('Install Appwrite')
- ->action(function () {
+ ->param('version', APP_VERSION_STABLE, new Mock(), 'Appwrite version', true)
+ ->action(function ($version) {
/**
* 1. Start - DONE
* 2. Check for older setup and get older version - DONE
@@ -30,10 +32,9 @@ $cli
*/
$vars = Config::getParam('variables');
$path = '/usr/src/code/appwrite';
- $version = null;
$defaultHTTPPort = '80';
$defaultHTTPSPort = '443';
-
+
Console::success('Starting Appwrite installation...');
// Create directory with write permissions
@@ -49,10 +50,10 @@ $cli
if($data !== false) {
$compose = new Compose($data);
$appwrite = $compose->getService('appwrite');
- $version = ($appwrite) ? $appwrite->getImageVersion() : $version;
+ $oldVersion = ($appwrite) ? $appwrite->getImageVersion() : null;
$ports = $compose->getService('traefik')->getPorts();
- if($version) {
+ if($oldVersion) {
foreach($compose->getServices() as $service) { // Fetch all env vars from previous compose file
if(!$service) {
continue;
@@ -99,7 +100,7 @@ $cli
$httpPort = ($httpPort) ? $httpPort : $defaultHTTPPort;
$httpsPort = Console::confirm('Choose your server HTTPS port: (default: '.$defaultHTTPSPort.')');
- $httpsPort = ($httpsPort) ? $httpsPort : $defaultHTTPPort;
+ $httpsPort = ($httpsPort) ? $httpsPort : $defaultHTTPSPort;
$input = [];
@@ -118,11 +119,11 @@ $cli
$templateForCompose = new View(__DIR__.'/../views/install/compose.phtml');
$templateForEnv = new View(__DIR__.'/../views/install/env.phtml');
-
+
$templateForCompose
->setParam('httpPort', $httpPort)
->setParam('httpsPort', $httpsPort)
- ->setParam('version', APP_VERSION_STABLE)
+ ->setParam('version', $version)
;
$templateForEnv
@@ -141,11 +142,11 @@ $cli
$stdout = '';
$stderr = '';
+ $exit = Console::execute("docker-compose -f {$path}/docker-compose.yml up -d --remove-orphans", null, $stdout, $stderr);
- //Console::execute("docker-compose -f {$path}.'/docker-compose.yml up -d --remove-orphans", null, $stdout, $stderr);
-
- if ($stderr !== '') {
+ if ($exit !== 0) {
Console::error("Failed to install Appwrite dockers");
+ exit($exit);
} else {
Console::success("Appwrite installed successfully");
}
From fdf0f9a3efd99d297f81abea07427b878db93ca2 Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Thu, 15 Oct 2020 07:43:52 +0300
Subject: [PATCH 059/133] Updated setup examples
---
README.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 6f21472886..aa3707c042 100644
--- a/README.md
+++ b/README.md
@@ -35,9 +35,9 @@ Table of Contents:
- [SDKs](#sdks)
- [Client](#client)
- [Server](#server)
+- [Contributing](#contributing)
- [Security](#security)
- [Follow Us](#follow-us)
-- [Contributing](#contributing)
- [License](#license)
## Installation
@@ -53,7 +53,7 @@ docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
- appwrite/appwrite:0.7.0
+ appwrite/appwrite:0.7.0 --version=0.7.0
```
### Windows
@@ -65,7 +65,7 @@ docker run -it --rm ^
--volume //var/run/docker.sock:/var/run/docker.sock ^
--volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^
--entrypoint="install" ^
- appwrite/appwrite:0.7.0
+ appwrite/appwrite:0.7.0 --version=0.7.0
```
#### PowerShell
@@ -75,7 +75,7 @@ docker run -it --rm ,
--volume /var/run/docker.sock:/var/run/docker.sock ,
--volume ${pwd}/appwrite:/usr/src/code/appwrite:rw ,
--entrypoint="install" ,
- appwrite/appwrite:0.7.0
+ appwrite/appwrite:0.7.0 --version=0.7.0
```
Once the Docker installation completes, go to http://localhost to access the Appwrite console from your browser. Please note that on non-linux native hosts, the server might take a few minutes to start after installation completes.
From 56d4c84cd39a306d213c44b6028498d613395ef9 Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Thu, 15 Oct 2020 08:03:38 +0300
Subject: [PATCH 060/133] Added vars debugger
---
.travis.yml | 1 +
Dockerfile | 1 +
app/cli.php | 1 +
app/tasks/vars.php | 18 ++++++++++++++++++
bin/vars | 3 +++
build.sh | 4 ++--
6 files changed, 26 insertions(+), 2 deletions(-)
create mode 100644 app/tasks/vars.php
create mode 100644 bin/vars
diff --git a/.travis.yml b/.travis.yml
index 47c09fbb5b..895676573e 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -37,4 +37,5 @@ install:
script:
- docker ps
- docker-compose logs appwrite
+- docker exec appwrite vars
- docker exec appwrite test
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 3c990cb8bc..75c03c3e05 100755
--- a/Dockerfile
+++ b/Dockerfile
@@ -149,6 +149,7 @@ RUN chmod +x /usr/local/bin/doctor && \
chmod +x /usr/local/bin/schedule && \
chmod +x /usr/local/bin/ssl && \
chmod +x /usr/local/bin/test && \
+ chmod +x /usr/local/bin/vars && \
chmod +x /usr/local/bin/worker-audits && \
chmod +x /usr/local/bin/worker-certificates && \
chmod +x /usr/local/bin/worker-deletes && \
diff --git a/app/cli.php b/app/cli.php
index 9eede27a34..c887493bbb 100644
--- a/app/cli.php
+++ b/app/cli.php
@@ -14,6 +14,7 @@ include 'tasks/install.php';
include 'tasks/migrate.php';
include 'tasks/sdks.php';
include 'tasks/ssl.php';
+include 'tasks/vars.php';
$cli
->task('version')
diff --git a/app/tasks/vars.php b/app/tasks/vars.php
new file mode 100644
index 0000000000..ed4a329735
--- /dev/null
+++ b/app/tasks/vars.php
@@ -0,0 +1,18 @@
+task('vars')
+ ->desc('List all the server environment variables')
+ ->action(function () {
+ $variables = Config::getParam('variables', []);
+
+ foreach ($variables as $key => $value) {
+ Console::log('- '.$value['name'].'='.App::getEnv($value['name'], ''));
+ }
+ });
\ No newline at end of file
diff --git a/bin/vars b/bin/vars
new file mode 100644
index 0000000000..19e3f1ebf2
--- /dev/null
+++ b/bin/vars
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+php /usr/src/code/app/cli.php vars $@
\ No newline at end of file
diff --git a/build.sh b/build.sh
index c641709a8f..b34f44b7bd 100644
--- a/build.sh
+++ b/build.sh
@@ -17,8 +17,8 @@ fi
echo "Updating git repository $1 / $2"
-git fetch origin
-git reset --hard origin/master
+# git fetch origin
+# git reset --hard origin/master
if test $(find "./app/db/DBIP/dbip-country-lite-2020-01.mmdb" -mmin +259200)
then
From 0b4827f597c1389310ad2be502ab01933acec197 Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Thu, 15 Oct 2020 08:05:54 +0300
Subject: [PATCH 061/133] Reverted build changes
---
build.sh | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/build.sh b/build.sh
index b34f44b7bd..c641709a8f 100644
--- a/build.sh
+++ b/build.sh
@@ -17,8 +17,8 @@ fi
echo "Updating git repository $1 / $2"
-# git fetch origin
-# git reset --hard origin/master
+git fetch origin
+git reset --hard origin/master
if test $(find "./app/db/DBIP/dbip-country-lite-2020-01.mmdb" -mmin +259200)
then
From 27983ad2c83c80e63f6e533cc62b0d21b326e32b Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Thu, 15 Oct 2020 11:00:14 +0300
Subject: [PATCH 062/133] Updated CLI tools
---
app/cli.php | 1 -
app/tasks/sdks.php | 13 ++-----------
2 files changed, 2 insertions(+), 12 deletions(-)
diff --git a/app/cli.php b/app/cli.php
index c887493bbb..9c99890602 100644
--- a/app/cli.php
+++ b/app/cli.php
@@ -1,4 +1,3 @@
-#!/bin/env php
task('generate')
+ ->task('sdks')
->action(function () {
function getSSLPage($url)
{
@@ -211,6 +204,4 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
}
exit();
- });
-
-$cli->run();
\ No newline at end of file
+ });
\ No newline at end of file
From 7538da1be37c4eba73d3fba0279943f2e8bdcade Mon Sep 17 00:00:00 2001
From: Sascha Greuel
Date: Thu, 15 Oct 2020 17:36:04 +0200
Subject: [PATCH 063/133] Update README.md
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index aa3707c042..0ef9f3c2d4 100644
--- a/README.md
+++ b/README.md
@@ -53,7 +53,7 @@ docker run -it --rm \
--volume /var/run/docker.sock:/var/run/docker.sock \
--volume "$(pwd)"/appwrite:/usr/src/code/appwrite:rw \
--entrypoint="install" \
- appwrite/appwrite:0.7.0 --version=0.7.0
+ appwrite/appwrite:0.7.0 --version 0.7.0
```
### Windows
@@ -65,7 +65,7 @@ docker run -it --rm ^
--volume //var/run/docker.sock:/var/run/docker.sock ^
--volume "%cd%"/appwrite:/usr/src/code/appwrite:rw ^
--entrypoint="install" ^
- appwrite/appwrite:0.7.0 --version=0.7.0
+ appwrite/appwrite:0.7.0 --version 0.7.0
```
#### PowerShell
@@ -75,7 +75,7 @@ docker run -it --rm ,
--volume /var/run/docker.sock:/var/run/docker.sock ,
--volume ${pwd}/appwrite:/usr/src/code/appwrite:rw ,
--entrypoint="install" ,
- appwrite/appwrite:0.7.0 --version=0.7.0
+ appwrite/appwrite:0.7.0 --version 0.7.0
```
Once the Docker installation completes, go to http://localhost to access the Appwrite console from your browser. Please note that on non-linux native hosts, the server might take a few minutes to start after installation completes.
From 92a1332476e75099e5988205db7c911b37fcbd85 Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Fri, 16 Oct 2020 10:52:54 +0300
Subject: [PATCH 064/133] Updated preloader
---
app/preload.php | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/preload.php b/app/preload.php
index 63d08c3e13..aded885c10 100644
--- a/app/preload.php
+++ b/app/preload.php
@@ -27,6 +27,7 @@ include __DIR__.'/controllers/general.php';
->ignore(realpath(__DIR__ . '/../vendor/twig/twig'))
->ignore(realpath(__DIR__ . '/../vendor/guzzlehttp/guzzle'))
->ignore(realpath(__DIR__ . '/../vendor/geoip2'))
+ ->ignore(realpath(__DIR__ . '/../vendor/domnikl'))
->ignore(realpath(__DIR__ . '/../vendor/maxmind'))
->ignore(realpath(__DIR__ . '/../vendor/maxmind-db'))
->ignore(realpath(__DIR__ . '/../vendor/psr/log'))
From 76d8636126b67da646f78020de03270f39e416c6 Mon Sep 17 00:00:00 2001
From: mananapeejay <42414965+mananapeejay@users.noreply.github.com>
Date: Fri, 16 Oct 2020 19:34:22 +0530
Subject: [PATCH 065/133] Probable Condescending language removed
---
docs/references/account/create-session-oauth2.md | 2 +-
docs/references/account/create-session.md | 2 +-
docs/references/account/create.md | 2 +-
docs/references/account/delete-session-current.md | 2 +-
docs/references/account/delete-session.md | 2 +-
docs/references/database/delete-document.md | 2 +-
docs/references/teams/delete-team-membership.md | 2 +-
docs/references/teams/update-team-membership-status.md | 2 +-
docs/tutorials/add-oauth2-provider.md | 6 +++---
docs/tutorials/environment-variables.md | 4 ++--
docs/tutorials/running-in-production.md | 2 +-
11 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/docs/references/account/create-session-oauth2.md b/docs/references/account/create-session-oauth2.md
index 459b62dc4a..fb6fa41b27 100644
--- a/docs/references/account/create-session-oauth2.md
+++ b/docs/references/account/create-session-oauth2.md
@@ -1 +1 @@
-Allow the user to login to his account using the OAuth2 provider of his choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed.
\ No newline at end of file
+Allow the user to login to their account using the OAuth2 provider of their choice. Each OAuth2 provider should be enabled from the Appwrite console first. Use the success and failure arguments to provide a redirect URL's back to your app when login is completed.
\ No newline at end of file
diff --git a/docs/references/account/create-session.md b/docs/references/account/create-session.md
index f166b0bc9f..03218ac6a9 100644
--- a/docs/references/account/create-session.md
+++ b/docs/references/account/create-session.md
@@ -1 +1 @@
-Allow the user to login into his account by providing a valid email and password combination. This route will create a new session for the user.
\ No newline at end of file
+Allow the user to login into their account by providing a valid email and password combination. This route will create a new session for the user.
\ No newline at end of file
diff --git a/docs/references/account/create.md b/docs/references/account/create.md
index a1f54f4677..3b1aab75cd 100644
--- a/docs/references/account/create.md
+++ b/docs/references/account/create.md
@@ -1 +1 @@
-Use this endpoint to allow a new user to register a new account in your project. After the user registration completes successfully, you can use the [/account/verfication](/docs/client/account#createVerification) route to start verifying the user email address. To allow your new user to login to his new account, you need to create a new [account session](/docs/client/account#createSession).
\ No newline at end of file
+Use this endpoint to allow a new user to register a new account in your project. After the user registration completes successfully, you can use the [/account/verfication](/docs/client/account#createVerification) route to start verifying the user email address. To allow the new user to login to their new account, you need to create a new [account session](/docs/client/account#createSession).
\ No newline at end of file
diff --git a/docs/references/account/delete-session-current.md b/docs/references/account/delete-session-current.md
index d1393d5f64..d38520f479 100644
--- a/docs/references/account/delete-session-current.md
+++ b/docs/references/account/delete-session-current.md
@@ -1 +1 @@
-Use this endpoint to log out the currently logged in user from his account. When successful this endpoint will delete the user session and remove the session secret cookie from the user client.
\ No newline at end of file
+Use this endpoint to log out the currently logged in user from their account. When successful this endpoint will delete the user session and remove the session secret cookie from the user client.
\ No newline at end of file
diff --git a/docs/references/account/delete-session.md b/docs/references/account/delete-session.md
index 4184532fd9..e0ca6d29ac 100644
--- a/docs/references/account/delete-session.md
+++ b/docs/references/account/delete-session.md
@@ -1 +1 @@
-Use this endpoint to log out the currently logged in user from all his account sessions across all his different devices. When using the option id argument, only the session unique ID provider will be deleted.
\ No newline at end of file
+Use this endpoint to log out the currently logged in user from all their account sessions across all of their different devices. When using the option id argument, only the session unique ID provider will be deleted.
\ No newline at end of file
diff --git a/docs/references/database/delete-document.md b/docs/references/database/delete-document.md
index 2545821205..00067751f7 100644
--- a/docs/references/database/delete-document.md
+++ b/docs/references/database/delete-document.md
@@ -1 +1 @@
-Delete document by its unique ID. This endpoint deletes only the parent documents, his attributes and relations to other documents. Child documents **will not** be deleted.
\ No newline at end of file
+Delete document by its unique ID. This endpoint deletes only the parent documents, its attributes and relations to other documents. Child documents **will not** be deleted.
\ No newline at end of file
diff --git a/docs/references/teams/delete-team-membership.md b/docs/references/teams/delete-team-membership.md
index e2c884a3e7..6302e3bf30 100644
--- a/docs/references/teams/delete-team-membership.md
+++ b/docs/references/teams/delete-team-membership.md
@@ -1 +1 @@
-This endpoint allows a user to leave a team or for a team owner to delete the membership of any other team member. You can also use this endpoint to delete a user membership even if he didn't accept it.
\ No newline at end of file
+This endpoint allows a user to leave a team or for a team owner to delete the membership of any other team member. You can also use this endpoint to delete a user membership even if it is not accepted.
\ No newline at end of file
diff --git a/docs/references/teams/update-team-membership-status.md b/docs/references/teams/update-team-membership-status.md
index ad6e44f765..ae2da76774 100644
--- a/docs/references/teams/update-team-membership-status.md
+++ b/docs/references/teams/update-team-membership-status.md
@@ -1 +1 @@
-Use this endpoint to allow a user to accept an invitation to join a team after he is being redirected back to your app from the invitation email he was sent.
\ No newline at end of file
+Use this endpoint to allow a user to accept an invitation to join a team after being redirected back to your app from the invitation email recieved by the user.
\ No newline at end of file
diff --git a/docs/tutorials/add-oauth2-provider.md b/docs/tutorials/add-oauth2-provider.md
index 5e1c07dabc..5d46cac1f2 100644
--- a/docs/tutorials/add-oauth2-provider.md
+++ b/docs/tutorials/add-oauth2-provider.md
@@ -6,7 +6,7 @@ This document is part of the Appwrite contributors' guide. Before you continue r
### Agenda
-OAuth2 providers help users to log in easily to apps and websites without the need to provide passwords or any other type of credentials. Appwrite's goal is to have support from as many **major** OAuth2 providers as possible.
+OAuth2 providers help users to log in to the apps and websites without the need to provide passwords or any other type of credentials. Appwrite's goal is to have support from as many **major** OAuth2 providers as possible.
As of the writing of these lines, we do not accept any minor OAuth2 providers. For us to accept some smaller and potentially unlimited number of OAuth2 providers, some product design and software architecture changes must be applied first.
@@ -47,10 +47,10 @@ Please mention in your documentation what resources or API docs you used to impl
After you finished adding your new provider to Appwrite you should be able to see it in your Appwrite console. Navigate to 'Project > Users > Providers' and check your new provider's settings form.
-Add credentials and check both a successful and a failed login (where the user rejects integration on provider page).
+Add credentials and check both a successful and a failed login (where the user denies integration on provider page).
You can test your OAuth2 provider by trying to login using the [OAuth2 method](https://appwrite.io/docs/client/account#createOAuth2Session) when integrating the Appwrite JS SDK in a demo app.
Pass your new adapter name as the provider parameter. If login is successful, you will be redirected to your success URL parameter. Otherwise, you will be redirected to your failure URL.
-If everything goes well, just submit a pull request and be ready to respond to any feedback which can arise during our code review.
+If everything goes well, submit a pull request and be ready to respond to any feedback which can arise during our code review.
diff --git a/docs/tutorials/environment-variables.md b/docs/tutorials/environment-variables.md
index 1987171324..d4799380e5 100644
--- a/docs/tutorials/environment-variables.md
+++ b/docs/tutorials/environment-variables.md
@@ -1,6 +1,6 @@
# Environment Variables
-Appwrite environment variables allow you to edit your server setup configuration and customize it. You can easily change the environment variables by changing them when running Appwrite using Docker CLI or Docker-Compose.
+Appwrite environment variables allow you to edit your server setup configuration and customize it. You can change the environment variables by changing them when running Appwrite using Docker CLI or Docker-Compose.
## General Options
@@ -10,7 +10,7 @@ Set your server running environment. By default, the var is set to 'development'
### _APP_OPTIONS_ABUSE
-Allows you to disable abuse checks and API rate limiting. By default, set to 'enabled'. To cancel the abuse checking, set to 'disabled'. It is not recommended to disable this feature in a production environment.
+Allows you to turn off abuse checks and API rate limiting. By default, set to 'enabled'. To cancel the abuse checking, set to 'disabled'. It is not recommended to turn off this feature in a production environment.
### _APP_OPTIONS_FORCE_HTTPS
diff --git a/docs/tutorials/running-in-production.md b/docs/tutorials/running-in-production.md
index 612498c397..2ed69d0ef4 100644
--- a/docs/tutorials/running-in-production.md
+++ b/docs/tutorials/running-in-production.md
@@ -28,7 +28,7 @@ Appwrite uses a few containers to run, where each container has its job. Most of
If you decide to set up a load balancer for a specific container, make sure that the containers that are trying to communicate with it are accessing it through a load balancer and not directly. All connections between Appwrite different containers are set using Docker environment variables.
-There are three Appwrite containers that do keep their state are the MariaDB, Redis, and InfluxDB containers that are used for storing data, cache, and stats (in this order). To scale them out, all you need to do is set up a standard cluster (just like you would with any other app using these technologies) according to your needs and performance.
+There are three Appwrite containers that do keep their state are the MariaDB, Redis, and InfluxDB containers that are used for storing data, cache, and stats (in this order). To scale them out, all you need to do is set up a standard cluster (same as you would with any other app using these technologies) according to your needs and performance.
## Sending Emails
From fefef52dae5a4bf623a578f25f17c064a91aee4c Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Sat, 17 Oct 2020 09:58:40 +0300
Subject: [PATCH 066/133] Removde hard-coded IP
---
app/controllers/api/locale.php | 6 +-----
1 file changed, 1 insertion(+), 5 deletions(-)
diff --git a/app/controllers/api/locale.php b/app/controllers/api/locale.php
index 8431e00f6a..8be46d8e47 100644
--- a/app/controllers/api/locale.php
+++ b/app/controllers/api/locale.php
@@ -24,11 +24,7 @@ App::get('/v1/locale')
$time = (60 * 60 * 24 * 45); // 45 days cache
$countries = $locale->getText('countries');
$continents = $locale->getText('continents');
-
- if (!App::isProduction()) {
- $ip = '79.177.241.94';
- }
-
+
$output['ip'] = $ip;
$currency = null;
From bdd3976d7da6fd2dbdce55ea0922095ef8206b01 Mon Sep 17 00:00:00 2001
From: fanlan1210
Date: Sun, 18 Oct 2020 21:20:53 +0800
Subject: [PATCH 067/133] fix chinese (taiwan) translation
---
.../locales/templates/zh-tw.email.auth.confirm.tpl | 6 +++---
.../locales/templates/zh-tw.email.auth.invitation.tpl | 6 +++---
.../locales/templates/zh-tw.email.auth.recovery.tpl | 9 ++++-----
app/config/locales/zh-tw.php | 6 +++---
4 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/app/config/locales/templates/zh-tw.email.auth.confirm.tpl b/app/config/locales/templates/zh-tw.email.auth.confirm.tpl
index 7a19636dbb..1cc03b1629 100644
--- a/app/config/locales/templates/zh-tw.email.auth.confirm.tpl
+++ b/app/config/locales/templates/zh-tw.email.auth.confirm.tpl
@@ -2,14 +2,14 @@
{{name}} 你好,
- 請點擊下方的鏈接驗證你的電子郵箱地址。
+ 請點擊下方的連結驗證你的電子郵箱地址。
{{cta}}
- 如果你沒有請求驗證本郵箱,請忽略這份郵件。
+ 如果你沒有請求驗證本電子信箱,請忽略這份信件。
謝謝。
來自 {{project}}
-
\ No newline at end of file
+
diff --git a/app/config/locales/templates/zh-tw.email.auth.invitation.tpl b/app/config/locales/templates/zh-tw.email.auth.invitation.tpl
index b5e6cc8225..7c65d6bdb6 100644
--- a/app/config/locales/templates/zh-tw.email.auth.invitation.tpl
+++ b/app/config/locales/templates/zh-tw.email.auth.invitation.tpl
@@ -2,17 +2,17 @@
你好,
- {{owner}}邀請您加入{{project}}項目的{{team}}小組。
+ {{owner}}邀請您加入{{project}}專案的{{team}}小組。
請點擊下方的鏈接加入{{team}}小組:
{{cta}}
- 如果您沒有加入該小組的計劃,請忽略本郵件。
+ 如果您沒有加入該小組的計劃,請忽略本信件。
謝謝。
來自 {{project}}
-
\ No newline at end of file
+
diff --git a/app/config/locales/templates/zh-tw.email.auth.recovery.tpl b/app/config/locales/templates/zh-tw.email.auth.recovery.tpl
index 1144b36b3c..c141200dbe 100644
--- a/app/config/locales/templates/zh-tw.email.auth.recovery.tpl
+++ b/app/config/locales/templates/zh-tw.email.auth.recovery.tpl
@@ -2,15 +2,14 @@
{{name}} 你好,
- 请点击下方的链接重新设置{{project}}的密码。
- Follow this link to reset your {{project}} password.
+ 請點擊下方的連結重設 {{project}} 的密碼。
{{cta}}
- 如果您未曾申请重设密码,请忽略本邮件。
+ 如果你未曾申請重設密碼,請忽略本信件。
- 谢谢。
+ 謝謝。
- 来自 {{project}}
+ 來自 {{project}}
diff --git a/app/config/locales/zh-tw.php b/app/config/locales/zh-tw.php
index c77c6245fe..be4f79df95 100644
--- a/app/config/locales/zh-tw.php
+++ b/app/config/locales/zh-tw.php
@@ -1,13 +1,13 @@
'"懂得取舍,方顯睿智。"', // This is the line printed in the homepage and console 'view-source'
+ 'settings.inspire' => '"懂得取捨,方顯睿智。"', // This is the line printed in the homepage and console 'view-source'
'settings.locale' => 'zh-tw',
'settings.direction' => 'ltr',
// Service - Users
'account.emails.team' => '%s 小組',
- 'account.emails.verification.title' => '賬戶確認',
+ 'account.emails.verification.title' => '帳戶確認',
'account.emails.verification.body' => 'zh-tw.email.auth.confirm.tpl',
'account.emails.recovery.title' => '重設密碼',
'account.emails.recovery.body' => 'zh.email.auth.recovery.tpl',
@@ -16,4 +16,4 @@ return [
'locale.country.unknown' => '未知',
'countries' => include 'zh-tw.countries.php',
'continents' => include 'zh-tw.continents.php',
-];
\ No newline at end of file
+];
From 9aed144ac588f4ba73b29cb46240ba4227b7bed7 Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Mon, 19 Oct 2020 19:54:21 +0300
Subject: [PATCH 068/133] External preloader
---
app/http.php | 3 +-
app/preload.php | 2 +-
composer.json | 1 +
composer.lock | 210 ++++++++++++++++-----------
src/Appwrite/Preloader/Preloader.php | 139 ------------------
5 files changed, 132 insertions(+), 223 deletions(-)
delete mode 100644 src/Appwrite/Preloader/Preloader.php
diff --git a/app/http.php b/app/http.php
index 9540375430..8f185064e8 100644
--- a/app/http.php
+++ b/app/http.php
@@ -30,7 +30,6 @@ $http
'open_http2_protocol' => true,
// 'document_root' => __DIR__.'/../public',
// 'enable_static_handler' => true,
- 'timeout' => 7,
'http_compression' => true,
'http_compression_level' => 6,
'package_max_length' => $payloadSize,
@@ -111,4 +110,4 @@ $http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swo
}
});
-$http->start();
+$http->start();
\ No newline at end of file
diff --git a/app/preload.php b/app/preload.php
index aded885c10..a61e84248d 100644
--- a/app/preload.php
+++ b/app/preload.php
@@ -16,7 +16,7 @@ if (file_exists(__DIR__.'/../vendor/autoload.php')) {
require __DIR__.'/../vendor/autoload.php';
}
-use Appwrite\Preloader\Preloader;
+use Utopia\Preloader\Preloader;
include __DIR__.'/controllers/general.php';
diff --git a/composer.json b/composer.json
index f0ce2624cb..7f3faed7ee 100644
--- a/composer.json
+++ b/composer.json
@@ -41,6 +41,7 @@
"utopia-php/config": "0.2.*",
"utopia-php/locale": "0.3.*",
"utopia-php/registry": "0.2.*",
+ "utopia-php/preloader": "0.2.*",
"utopia-php/domains": "1.1.*",
"resque/php-resque": "1.3.6",
diff --git a/composer.lock b/composer.lock
index 297b144e81..2d881b4b19 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": "07a5b2d2e742e8651d58889c3253c3b5",
+ "content-hash": "19f7cef86ddc98623cd3ffffa2be2cae",
"packages": [
{
"name": "appwrite/php-clamav",
@@ -1610,6 +1610,54 @@
],
"time": "2020-06-29T20:53:16+00:00"
},
+ {
+ "name": "utopia-php/preloader",
+ "version": "0.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/utopia-php/preloader.git",
+ "reference": "e710e7cf38605dd67c6cc599dd1150735765ad2e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/utopia-php/preloader/zipball/e710e7cf38605dd67c6cc599dd1150735765ad2e",
+ "reference": "e710e7cf38605dd67c6cc599dd1150735765ad2e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^7.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Utopia\\Preloader\\": "src/Preloader"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Eldad Fux",
+ "email": "team@appwrite.io"
+ }
+ ],
+ "description": "Utopia Preloader library is simple and lite library for managing PHP preloading configuration",
+ "keywords": [
+ "framework",
+ "php",
+ "preload",
+ "preloader",
+ "preloading",
+ "upf",
+ "utopia"
+ ],
+ "time": "2020-08-14T23:17:55+00:00"
+ },
{
"name": "utopia-php/registry",
"version": "0.2.3",
@@ -2300,12 +2348,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "ece0c3ceee73810bd95226401bbfaea9e0f64de7"
+ "reference": "e33667ac376b7f4dbe97ab556f8e7c8daee383d3"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ece0c3ceee73810bd95226401bbfaea9e0f64de7",
- "reference": "ece0c3ceee73810bd95226401bbfaea9e0f64de7",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e33667ac376b7f4dbe97ab556f8e7c8daee383d3",
+ "reference": "e33667ac376b7f4dbe97ab556f8e7c8daee383d3",
"shasum": ""
},
"require": {
@@ -2365,7 +2413,7 @@
"type": "github"
}
],
- "time": "2020-10-09T14:34:55+00:00"
+ "time": "2020-10-15T05:14:52+00:00"
},
{
"name": "phpunit/php-file-iterator",
@@ -2373,12 +2421,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8"
+ "reference": "8a1b0bfa74eba894f241e23261febb84c7ffbd8d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8",
- "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/8a1b0bfa74eba894f241e23261febb84c7ffbd8d",
+ "reference": "8a1b0bfa74eba894f241e23261febb84c7ffbd8d",
"shasum": ""
},
"require": {
@@ -2421,7 +2469,7 @@
"type": "github"
}
],
- "time": "2020-09-28T05:57:25+00:00"
+ "time": "2020-10-15T05:05:12+00:00"
},
{
"name": "phpunit/php-invoker",
@@ -2429,12 +2477,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-invoker.git",
- "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ "reference": "dcc4b2e39d6cb5ba5435a0177ebe947c0c0d05ff"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
- "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/dcc4b2e39d6cb5ba5435a0177ebe947c0c0d05ff",
+ "reference": "dcc4b2e39d6cb5ba5435a0177ebe947c0c0d05ff",
"shasum": ""
},
"require": {
@@ -2480,7 +2528,7 @@
"type": "github"
}
],
- "time": "2020-09-28T05:58:55+00:00"
+ "time": "2020-10-15T05:05:21+00:00"
},
{
"name": "phpunit/php-text-template",
@@ -2488,12 +2536,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-text-template.git",
- "reference": "18c887016e60e52477e54534956d7b47bc52cd84"
+ "reference": "0b11f04dcd54d149c3904cda577ea8ef8735e377"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/18c887016e60e52477e54534956d7b47bc52cd84",
- "reference": "18c887016e60e52477e54534956d7b47bc52cd84",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0b11f04dcd54d149c3904cda577ea8ef8735e377",
+ "reference": "0b11f04dcd54d149c3904cda577ea8ef8735e377",
"shasum": ""
},
"require": {
@@ -2535,7 +2583,7 @@
"type": "github"
}
],
- "time": "2020-09-28T06:03:05+00:00"
+ "time": "2020-10-15T05:06:00+00:00"
},
{
"name": "phpunit/php-timer",
@@ -2543,12 +2591,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
- "reference": "c9ff14f493699e2f6adee9fd06a0245b276643b7"
+ "reference": "7fe57355ba7462b1cd940d93aa003660b4e6db20"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/c9ff14f493699e2f6adee9fd06a0245b276643b7",
- "reference": "c9ff14f493699e2f6adee9fd06a0245b276643b7",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/7fe57355ba7462b1cd940d93aa003660b4e6db20",
+ "reference": "7fe57355ba7462b1cd940d93aa003660b4e6db20",
"shasum": ""
},
"require": {
@@ -2590,7 +2638,7 @@
"type": "github"
}
],
- "time": "2020-09-28T06:00:25+00:00"
+ "time": "2020-10-15T05:05:31+00:00"
},
{
"name": "phpunit/phpunit",
@@ -2598,12 +2646,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "8b79c2a70ae855e582cef1ca63a849fe07bdb01d"
+ "reference": "338bf27b4510498c4b0ab70c7cbc292a591dc0df"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/8b79c2a70ae855e582cef1ca63a849fe07bdb01d",
- "reference": "8b79c2a70ae855e582cef1ca63a849fe07bdb01d",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/338bf27b4510498c4b0ab70c7cbc292a591dc0df",
+ "reference": "338bf27b4510498c4b0ab70c7cbc292a591dc0df",
"shasum": ""
},
"require": {
@@ -2689,7 +2737,7 @@
"type": "github"
}
],
- "time": "2020-10-11T07:43:20+00:00"
+ "time": "2020-10-19T09:25:00+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -2697,12 +2745,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/cli-parser.git",
- "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2"
+ "reference": "bb13fcea306b784ef38fc1cda21c1395c233f4bc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2",
- "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/bb13fcea306b784ef38fc1cda21c1395c233f4bc",
+ "reference": "bb13fcea306b784ef38fc1cda21c1395c233f4bc",
"shasum": ""
},
"require": {
@@ -2741,7 +2789,7 @@
"type": "github"
}
],
- "time": "2020-09-28T06:08:49+00:00"
+ "time": "2020-10-15T05:19:54+00:00"
},
{
"name": "sebastian/code-unit",
@@ -2749,12 +2797,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit.git",
- "reference": "59236be62b1bb9919e6d7f60b0b832dc05cef9ab"
+ "reference": "46a6ff3fabc0449fa17ca3ec485c44ab792f65c1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/59236be62b1bb9919e6d7f60b0b832dc05cef9ab",
- "reference": "59236be62b1bb9919e6d7f60b0b832dc05cef9ab",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/46a6ff3fabc0449fa17ca3ec485c44ab792f65c1",
+ "reference": "46a6ff3fabc0449fa17ca3ec485c44ab792f65c1",
"shasum": ""
},
"require": {
@@ -2793,7 +2841,7 @@
"type": "github"
}
],
- "time": "2020-10-02T14:47:54+00:00"
+ "time": "2020-10-15T05:03:44+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
@@ -2801,12 +2849,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
- "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
+ "reference": "a801a24d7681090e8334c631b99181df063ea457"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
- "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/a801a24d7681090e8334c631b99181df063ea457",
+ "reference": "a801a24d7681090e8334c631b99181df063ea457",
"shasum": ""
},
"require": {
@@ -2844,7 +2892,7 @@
"type": "github"
}
],
- "time": "2020-09-28T05:30:19+00:00"
+ "time": "2020-10-15T05:03:53+00:00"
},
{
"name": "sebastian/comparator",
@@ -2852,12 +2900,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "7a8ff306445707539c1a6397372a982a1ec55120"
+ "reference": "d43148f588efca5b5dd0c3d98da467f5aafdac6b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/7a8ff306445707539c1a6397372a982a1ec55120",
- "reference": "7a8ff306445707539c1a6397372a982a1ec55120",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/d43148f588efca5b5dd0c3d98da467f5aafdac6b",
+ "reference": "d43148f588efca5b5dd0c3d98da467f5aafdac6b",
"shasum": ""
},
"require": {
@@ -2914,7 +2962,7 @@
"type": "github"
}
],
- "time": "2020-09-30T06:47:25+00:00"
+ "time": "2020-10-15T05:04:03+00:00"
},
{
"name": "sebastian/complexity",
@@ -2922,12 +2970,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/complexity.git",
- "reference": "ba8cc2da0c0bfbc813d03b56406734030c7f1eff"
+ "reference": "6d4cf3e8224f1e8527ab434b4ba902978af523db"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ba8cc2da0c0bfbc813d03b56406734030c7f1eff",
- "reference": "ba8cc2da0c0bfbc813d03b56406734030c7f1eff",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/6d4cf3e8224f1e8527ab434b4ba902978af523db",
+ "reference": "6d4cf3e8224f1e8527ab434b4ba902978af523db",
"shasum": ""
},
"require": {
@@ -2967,7 +3015,7 @@
"type": "github"
}
],
- "time": "2020-09-28T06:05:03+00:00"
+ "time": "2020-10-15T05:06:11+00:00"
},
{
"name": "sebastian/diff",
@@ -2975,12 +3023,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "e3ec6059b3fe483d42fbaf1fe6eefa201f7b4a6d"
+ "reference": "c25d82b5b776a3ba4e3b232a8688e969477444e0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/e3ec6059b3fe483d42fbaf1fe6eefa201f7b4a6d",
- "reference": "e3ec6059b3fe483d42fbaf1fe6eefa201f7b4a6d",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c25d82b5b776a3ba4e3b232a8688e969477444e0",
+ "reference": "c25d82b5b776a3ba4e3b232a8688e969477444e0",
"shasum": ""
},
"require": {
@@ -3029,7 +3077,7 @@
"type": "github"
}
],
- "time": "2020-10-13T11:48:30+00:00"
+ "time": "2020-10-15T05:04:12+00:00"
},
{
"name": "sebastian/environment",
@@ -3037,12 +3085,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "388b6ced16caa751030f6a69e588299fa09200ac"
+ "reference": "40fcf803a36737ce1d2c46c489fb5d1ec2db45d4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac",
- "reference": "388b6ced16caa751030f6a69e588299fa09200ac",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/40fcf803a36737ce1d2c46c489fb5d1ec2db45d4",
+ "reference": "40fcf803a36737ce1d2c46c489fb5d1ec2db45d4",
"shasum": ""
},
"require": {
@@ -3088,7 +3136,7 @@
"type": "github"
}
],
- "time": "2020-09-28T05:52:38+00:00"
+ "time": "2020-10-15T05:04:22+00:00"
},
{
"name": "sebastian/exporter",
@@ -3096,12 +3144,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65"
+ "reference": "dbdc89af25883b35be6ddd4b88a8bc5d22bb819d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/d89cc98761b8cb5a1a235a6b703ae50d34080e65",
- "reference": "d89cc98761b8cb5a1a235a6b703ae50d34080e65",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/dbdc89af25883b35be6ddd4b88a8bc5d22bb819d",
+ "reference": "dbdc89af25883b35be6ddd4b88a8bc5d22bb819d",
"shasum": ""
},
"require": {
@@ -3161,7 +3209,7 @@
"type": "github"
}
],
- "time": "2020-09-28T05:24:23+00:00"
+ "time": "2020-10-15T05:04:32+00:00"
},
{
"name": "sebastian/global-state",
@@ -3169,12 +3217,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "ea779cb749a478b22a2564ac41cd7bda79c78dc7"
+ "reference": "3a606041b47fb201c1d62ae03078d0e8a62569a6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/ea779cb749a478b22a2564ac41cd7bda79c78dc7",
- "reference": "ea779cb749a478b22a2564ac41cd7bda79c78dc7",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3a606041b47fb201c1d62ae03078d0e8a62569a6",
+ "reference": "3a606041b47fb201c1d62ae03078d0e8a62569a6",
"shasum": ""
},
"require": {
@@ -3221,7 +3269,7 @@
"type": "github"
}
],
- "time": "2020-09-28T05:54:06+00:00"
+ "time": "2020-10-15T05:04:42+00:00"
},
{
"name": "sebastian/lines-of-code",
@@ -3229,12 +3277,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/lines-of-code.git",
- "reference": "6514b8f21906b8b46f520d1fbd17a4523fa59a54"
+ "reference": "5835b6f4707e022ae53a2a67420a3388b318715a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/6514b8f21906b8b46f520d1fbd17a4523fa59a54",
- "reference": "6514b8f21906b8b46f520d1fbd17a4523fa59a54",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/5835b6f4707e022ae53a2a67420a3388b318715a",
+ "reference": "5835b6f4707e022ae53a2a67420a3388b318715a",
"shasum": ""
},
"require": {
@@ -3274,7 +3322,7 @@
"type": "github"
}
],
- "time": "2020-09-28T06:07:27+00:00"
+ "time": "2020-10-15T05:06:21+00:00"
},
{
"name": "sebastian/object-enumerator",
@@ -3282,12 +3330,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
- "reference": "f6f5957013d84725427d361507e13513702888a4"
+ "reference": "192362c78b33b0231e1e8841678be93ce6f31830"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f6f5957013d84725427d361507e13513702888a4",
- "reference": "f6f5957013d84725427d361507e13513702888a4",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/192362c78b33b0231e1e8841678be93ce6f31830",
+ "reference": "192362c78b33b0231e1e8841678be93ce6f31830",
"shasum": ""
},
"require": {
@@ -3327,7 +3375,7 @@
"type": "github"
}
],
- "time": "2020-09-28T05:55:06+00:00"
+ "time": "2020-10-15T05:04:51+00:00"
},
{
"name": "sebastian/object-reflector",
@@ -3335,12 +3383,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-reflector.git",
- "reference": "d9d0ab3b12acb1768bc1e0a89b23c90d2043cbe5"
+ "reference": "da3d1ade6fef132f2486d297c35cf61e45930a0b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/d9d0ab3b12acb1768bc1e0a89b23c90d2043cbe5",
- "reference": "d9d0ab3b12acb1768bc1e0a89b23c90d2043cbe5",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/da3d1ade6fef132f2486d297c35cf61e45930a0b",
+ "reference": "da3d1ade6fef132f2486d297c35cf61e45930a0b",
"shasum": ""
},
"require": {
@@ -3378,7 +3426,7 @@
"type": "github"
}
],
- "time": "2020-09-28T05:56:16+00:00"
+ "time": "2020-10-15T05:05:01+00:00"
},
{
"name": "sebastian/recursion-context",
@@ -3386,12 +3434,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "7e70f3d32a3058d4ad5226c1371f2dd4677dc073"
+ "reference": "3767a68ada0fc1d50b22db067cd2256b1b722faa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/7e70f3d32a3058d4ad5226c1371f2dd4677dc073",
- "reference": "7e70f3d32a3058d4ad5226c1371f2dd4677dc073",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3767a68ada0fc1d50b22db067cd2256b1b722faa",
+ "reference": "3767a68ada0fc1d50b22db067cd2256b1b722faa",
"shasum": ""
},
"require": {
@@ -3437,7 +3485,7 @@
"type": "github"
}
],
- "time": "2020-09-28T05:27:00+00:00"
+ "time": "2020-10-15T05:05:41+00:00"
},
{
"name": "sebastian/resource-operations",
@@ -3496,12 +3544,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
- "reference": "fa592377f3923946cb90bf1f6a71ba2e5f229909"
+ "reference": "5eb6a85e349cab8a411886cb52c070393d71bc7e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/fa592377f3923946cb90bf1f6a71ba2e5f229909",
- "reference": "fa592377f3923946cb90bf1f6a71ba2e5f229909",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/5eb6a85e349cab8a411886cb52c070393d71bc7e",
+ "reference": "5eb6a85e349cab8a411886cb52c070393d71bc7e",
"shasum": ""
},
"require": {
@@ -3540,7 +3588,7 @@
"type": "github"
}
],
- "time": "2020-10-06T08:41:03+00:00"
+ "time": "2020-10-15T05:05:50+00:00"
},
{
"name": "sebastian/version",
diff --git a/src/Appwrite/Preloader/Preloader.php b/src/Appwrite/Preloader/Preloader.php
deleted file mode 100644
index a03c0cb28e..0000000000
--- a/src/Appwrite/Preloader/Preloader.php
+++ /dev/null
@@ -1,139 +0,0 @@
-paths = $paths;
-
- $classMap = require __DIR__.'/../../../vendor/composer/autoload_classmap.php';
-
- $this->paths = \array_merge(
- $this->paths,
- \array_values($classMap)
- );
- }
-
- public function paths(string ...$paths): self
- {
- $this->paths = \array_merge(
- $this->paths,
- $paths
- );
-
- return $this;
- }
-
- public function ignore(string ...$names): self
- {
- foreach($names as $name) {
- if(is_readable($name)) {
- $this->ignores[] = $name;
- }
- else {
- echo "[Preloader] Failed to ignore path `{$name}`".PHP_EOL;
- }
- }
-
- return $this;
- }
-
- public function load(): void
- {
- $this->included = get_included_files();
-
- foreach ($this->paths as $path) {
- $this->loadPath(\rtrim($path, '/'));
- }
-
- $already = count($this->included);
-
- echo "[Preloader] Preloaded {$already} files.".PHP_EOL;
- }
-
- private function loadPath(string $path): void
- {
- if (\is_dir($path)) {
- $this->loadDir($path);
-
- return;
- }
-
- $this->loadFile($path);
- }
-
- private function loadDir(string $path): void
- {
- $handle = \opendir($path);
-
- while ($file = \readdir($handle)) {
- if (\in_array($file, ['.', '..'])) {
- continue;
- }
-
- $this->loadPath("{$path}/{$file}");
- }
-
- \closedir($handle);
- }
-
- private function loadFile(string $path): void
- {
- if ($this->shouldIgnore($path)) {
- return;
- }
-
- if(in_array(realpath($path), $this->included)) {
- // echo "[Preloader] Skiped `{$path}`".PHP_EOL;
- return;
- }
-
- // echo "[Preloader] Preloaded `{$path}`".PHP_EOL;
-
- try {
- // opcache_compile_file($path);
- require $path;
- } catch (\Throwable $th) {
- echo "[Preloader] Failed to load `{$path}`: ".$th->getMessage().PHP_EOL;
- return;
- }
-
- $this->included = array_merge(get_included_files(), [realpath($path)]);
- }
-
- private function shouldIgnore(?string $path): bool
- {
- if($path === null) {
- return true;
- }
-
- if(!\in_array(\pathinfo($path, PATHINFO_EXTENSION), ['php'])) {
- return true;
- }
-
- foreach ($this->ignores as $ignore) {
- if (\strpos($path, $ignore) === 0) {
- return true;
- }
- }
-
- return false;
- }
-}
\ No newline at end of file
From 4c44e3a36e5a20693f41c3d2a2c52598a4337ef7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Daniel=20Bj=C3=B8rnbakk?=
Date: Tue, 20 Oct 2020 12:04:36 +0200
Subject: [PATCH 069/133] Update environment-variables.md
Sounded like it was set to enabled to cancel scans by default. Re-phrased the the sentence to make the intention more clear.
---
docs/tutorials/environment-variables.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docs/tutorials/environment-variables.md b/docs/tutorials/environment-variables.md
index d4799380e5..7de4c95e49 100644
--- a/docs/tutorials/environment-variables.md
+++ b/docs/tutorials/environment-variables.md
@@ -26,7 +26,7 @@ Maximum file size allowed for file upload. The default value is 100MB limitation
### _APP_STORAGE_ANTIVIRUS
-This variable allows you to disable the internal anti-virus scans. By default, this value is set to 'enabled' to cancel the scans, set the value to 'disabled'. When disabled, it's recommended to turn off the ClamAV container for better resource usage.
+This variable allows you to disable the internal anti-virus scans. This value is set to 'enabled' by default, to cancel the scans set the value to 'disabled'. When disabled, it's recommended to turn off the ClamAV container for better resource usage.
### _APP_CONSOLE_WHITELIST_EMAILS
From da17d0bfbb260fe9fb5f2b3481b0e7f62a971141 Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Tue, 20 Oct 2020 16:24:29 +0300
Subject: [PATCH 070/133] Fixed quotes
---
app/config/locale/translations/bg.countries.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/config/locale/translations/bg.countries.php b/app/config/locale/translations/bg.countries.php
index 5ba9b7a139..f6ae739ca3 100644
--- a/app/config/locale/translations/bg.countries.php
+++ b/app/config/locale/translations/bg.countries.php
@@ -34,7 +34,7 @@ return [
'CH' => 'Швейцария',
'CL' => 'Чили',
'CN' => 'Китай',
- 'CI' => `Кот д'Ивоар`,
+ 'CI' => 'Кот д\'Ивоар',
'CM' => 'Камерун',
'CD' => 'ДР Конго',
'CG' => 'Република Конго',
From e89a87152822d240df04fe6d315608ab75e0b0db Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Wed, 21 Oct 2020 21:52:52 +0300
Subject: [PATCH 071/133] Fix for redis persistent connection
---
app/init.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/init.php b/app/init.php
index 9637c4381c..d44039ec23 100644
--- a/app/init.php
+++ b/app/init.php
@@ -166,8 +166,8 @@ $register->set('statsd', function () { // Register DB connection
});
$register->set('cache', function () { // Register cache connection
$redis = new Redis();
- $redis->pconnect(App::getEnv('_APP_REDIS_HOST', '', 2.5),
- App::getEnv('_APP_REDIS_PORT', ''));
+ $redis->pconnect(App::getEnv('_APP_REDIS_HOST', ''), App::getEnv('_APP_REDIS_PORT', ''));
+ $redis->setOption(Redis::OPT_READ_TIMEOUT, -1);
return $redis;
});
From 8ee187c3c9dd68dc966a4bc2a5dbde05e2dd74df Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Thu, 22 Oct 2020 15:34:13 +0300
Subject: [PATCH 072/133] Fix for broken dev paths
---
app/preload.php | 33 +++++++++++++++++++++++----------
1 file changed, 23 insertions(+), 10 deletions(-)
diff --git a/app/preload.php b/app/preload.php
index a61e84248d..6cf308f8c6 100644
--- a/app/preload.php
+++ b/app/preload.php
@@ -20,17 +20,30 @@ use Utopia\Preloader\Preloader;
include __DIR__.'/controllers/general.php';
-(new Preloader())
+$preloader = new Preloader();
+
+foreach ([
+ realpath(__DIR__ . '/../app/config'),
+ realpath(__DIR__ . '/../app/controllers'),
+ realpath(__DIR__ . '/../src'),
+ realpath(__DIR__ . '/../vendor/twig/twig'),
+ realpath(__DIR__ . '/../vendor/guzzlehttp/guzzle'),
+ realpath(__DIR__ . '/../vendor/domnikl'),
+ realpath(__DIR__ . '/../vendor/geoip2'),
+ realpath(__DIR__ . '/../vendor/domnikl'),
+ realpath(__DIR__ . '/../vendor/maxmind'),
+ realpath(__DIR__ . '/../vendor/maxmind-db'),
+ realpath(__DIR__ . '/../vendor/psr/log'),
+ realpath(__DIR__ . '/../vendor/piwik'),
+ realpath(__DIR__ . '/../vendor/symfony'),
+] as $key => $value) {
+ if($value !== false) {
+ $preloader->ignore($value);
+ }
+}
+
+$preloader
->paths(realpath(__DIR__ . '/../app/config'))
->paths(realpath(__DIR__ . '/../app/controllers'))
->paths(realpath(__DIR__ . '/../src'))
- ->ignore(realpath(__DIR__ . '/../vendor/twig/twig'))
- ->ignore(realpath(__DIR__ . '/../vendor/guzzlehttp/guzzle'))
- ->ignore(realpath(__DIR__ . '/../vendor/geoip2'))
- ->ignore(realpath(__DIR__ . '/../vendor/domnikl'))
- ->ignore(realpath(__DIR__ . '/../vendor/maxmind'))
- ->ignore(realpath(__DIR__ . '/../vendor/maxmind-db'))
- ->ignore(realpath(__DIR__ . '/../vendor/psr/log'))
- ->ignore(realpath(__DIR__ . '/../vendor/piwik'))
- ->ignore(realpath(__DIR__ . '/../vendor/symfony'))
->load();
\ No newline at end of file
From f91a64103225abfd09242062701d7764e369048f Mon Sep 17 00:00:00 2001
From: Pedro Cisneros Santana
<37348419+PedroCisnerosSantana@users.noreply.github.com>
Date: Thu, 22 Oct 2020 20:50:57 +0200
Subject: [PATCH 073/133] Added QRCode dependency
---
app/controllers/api/avatars.php | 20 ++++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)
diff --git a/app/controllers/api/avatars.php b/app/controllers/api/avatars.php
index 0930806983..c0ccbcb2d4 100644
--- a/app/controllers/api/avatars.php
+++ b/app/controllers/api/avatars.php
@@ -11,12 +11,15 @@ use Utopia\Cache\Cache;
use Utopia\Cache\Adapter\Filesystem;
use Appwrite\Resize\Resize;
use Appwrite\URL\URL as URLParse;
-use BaconQrCode\Renderer\ImageRenderer;
+/* use BaconQrCode\Renderer\ImageRenderer;
use BaconQrCode\Renderer\Image\ImagickImageBackEnd;
use BaconQrCode\Renderer\RendererStyle\RendererStyle;
-use BaconQrCode\Writer;
+use BaconQrCode\Writer; */
use Utopia\Config\Config;
use Utopia\Validator\HexColor;
+use chillerlan\QRCode\QRCode;
+use chillerlan\QRCode\QROptions;
+/* use SebastianBergmann\CodeCoverage\Report\Html\Renderer; */
$avatarCallback = function ($type, $code, $width, $height, $quality, $response) {
/** @var Utopia\Response $response */
@@ -366,12 +369,17 @@ App::get('/v1/avatars/qr')
$download = ($download === '1' || $download === 'true' || $download === 1 || $download === true);
- $renderer = new ImageRenderer(
+ /* $renderer = new ImageRenderer(
new RendererStyle($size, $margin),
new ImagickImageBackEnd('png', 100)
- );
+ ); */
+ $qropts = new QROptions([
+ 'quietzone' => $size
+ ]);
+ $qrcode = new QRCode($qropts);
+ $qrcode->render($text);
- $writer = new Writer($renderer);
+ /* $writer = new Writer($renderer); */
if ($download) {
$response->addHeader('Content-Disposition', 'attachment; filename="qr.png"');
@@ -380,7 +388,7 @@ App::get('/v1/avatars/qr')
$response
->addHeader('Expires', \date('D, d M Y H:i:s', \time() + (60 * 60 * 24 * 45)).' GMT') // 45 days cache
->setContentType('image/png')
- ->send($writer->writeString($text))
+ /* ->send($writer->writeString($text)) */
;
}, ['response']);
From b5e3e412d4c1f2ca5ba9b81e13c1318fe116c9af Mon Sep 17 00:00:00 2001
From: iraj
Date: Fri, 23 Oct 2020 01:01:08 +0300
Subject: [PATCH 074/133] Adding Farsi/Persian language.
---
app/config/locale/codes.php | 1 +
.../locale/translations/fa.continents.php | 11 +
.../locale/translations/fa.countries.php | 198 ++++++++++++++++++
app/config/locale/translations/fa.php | 21 ++
.../templates/fa.email.auth.confirm.tpl | 16 ++
.../templates/fa.email.auth.invitation.tpl | 18 ++
.../templates/fa.email.auth.recovery.tpl | 15 ++
app/init.php | 1 +
8 files changed, 281 insertions(+)
create mode 100644 app/config/locale/translations/fa.continents.php
create mode 100644 app/config/locale/translations/fa.countries.php
create mode 100644 app/config/locale/translations/fa.php
create mode 100644 app/config/locale/translations/templates/fa.email.auth.confirm.tpl
create mode 100644 app/config/locale/translations/templates/fa.email.auth.invitation.tpl
create mode 100644 app/config/locale/translations/templates/fa.email.auth.recovery.tpl
diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php
index 039650da02..d3f289576c 100644
--- a/app/config/locale/codes.php
+++ b/app/config/locale/codes.php
@@ -12,6 +12,7 @@ return [
'de', // German
'en', // English
'es', // Spanish
+ 'fa', // Farsi/Persian
'fi', // Finnish
'fo', // Faroese
'fr', // French
diff --git a/app/config/locale/translations/fa.continents.php b/app/config/locale/translations/fa.continents.php
new file mode 100644
index 0000000000..e55e8f9f3c
--- /dev/null
+++ b/app/config/locale/translations/fa.continents.php
@@ -0,0 +1,11 @@
+ 'آفریقا',
+ 'AN' => 'قطب جنوب',
+ 'AS' => 'آسیا',
+ 'EU' => 'اروپا',
+ 'NA' => 'آمریکای شمالی',
+ 'OC' => 'اقیانوسیه',
+ 'SA' => 'آمریکای جنوبی',
+];
diff --git a/app/config/locale/translations/fa.countries.php b/app/config/locale/translations/fa.countries.php
new file mode 100644
index 0000000000..af2930ca7d
--- /dev/null
+++ b/app/config/locale/translations/fa.countries.php
@@ -0,0 +1,198 @@
+ 'افقانستان',
+ 'AO' => 'آنگولا',
+ 'AL' => 'آلبانی',
+ 'AD' => 'آندورا',
+ 'AE' => 'امارات متحده عربی',
+ 'AR' => 'آرژانتین',
+ 'AM' => 'ارمنستان',
+ 'AG' => 'آنتیگوا و باربودا',
+ 'AU' => 'استرالیا',
+ 'AT' => 'اتریش',
+ 'AZ' => 'آذربایجان',
+ 'BI' => 'بوروندی',
+ 'BE' => 'بلژیک',
+ 'BJ' => 'بنین',
+ 'BF' => 'بورکینافاسو',
+ 'BD' => 'بنگلادش',
+ 'BG' => 'بلغارستان',
+ 'BH' => 'بحرین',
+ 'BS' => 'باهاما',
+ 'BA' => 'بوسنی و هرزگوین',
+ 'BY' => 'بلاروس',
+ 'BZ' => 'بلیز',
+ 'BO' => 'بولیوی',
+ 'BR' => 'برزیل',
+ 'BB' => 'باربادوس',
+ 'BN' => 'برونئی',
+ 'BT' => 'بوتان',
+ 'BW' => 'بوتسوانا',
+ 'CF' => 'جمهوری آفریقای مرکزی',
+ 'CA' => 'کانادا',
+ 'CH' => 'سوئیس',
+ 'CL' => 'شیلی',
+ 'CN' => ']dk',
+ 'CI' => 'ساحل عاج',
+ 'CM' => 'کامرون',
+ 'CD' => 'کنگو',
+ 'CG' => 'جمهوری کنگو',
+ 'CO' => 'کلمبیا',
+ 'KM' => 'کومور',
+ 'CV' => 'کیپ ورد',
+ 'CR' => 'کاستاریکا',
+ 'CU' => 'کوبا',
+ 'CY' => 'قبرس',
+ 'CZ' => 'جمهوری چک',
+ 'DE' => 'آلمان',
+ 'DJ' => 'جیبوتی',
+ 'DM' => 'دومینیکا',
+ 'DK' => 'دانمارک',
+ 'DO' => 'جمهوری دومینیکا',
+ 'DZ' => 'الجزیره',
+ 'EC' => 'اکوادور',
+ 'EG' => 'مصر',
+ 'ER' => 'اریتره',
+ 'ES' => 'اسپانیا',
+ 'EE' => 'استونی',
+ 'ET' => 'اتیوپی',
+ 'FI' => 'فنلاند',
+ 'FJ' => 'فیجی',
+ 'FR' => 'فرانسه',
+ 'FM' => 'میکرونزی',
+ 'GA' => 'گابن',
+ 'GB' => 'انگلستان',
+ 'GE' => 'گرجستان',
+ 'GH' => 'غنا',
+ 'GN' => 'گینه',
+ 'GM' => 'گامبیا',
+ 'GW' => 'گینه بیسائو',
+ 'GQ' => 'گینه استوایی',
+ 'GR' => 'یونان',
+ 'GD' => 'گرنادا',
+ 'GT' => 'گواتمالا',
+ 'GY' => 'گویان',
+ 'HN' => 'هندوراس',
+ 'HR' => 'کرواسی',
+ 'HT' => 'هائیتی',
+ 'HU' => 'مجارستان',
+ 'ID' => 'اندونزی',
+ 'IN' => 'هند',
+ 'IE' => 'ایرلند',
+ 'IR' => 'ایران',
+ 'IQ' => 'عراث',
+ 'IS' => 'ایسلند',
+ 'IL' => 'اسرائیل',
+ 'IT' => 'ایتالیا',
+ 'JM' => 'جاماییکا',
+ 'JO' => 'اردن',
+ 'JP' => 'جاپن',
+ 'KZ' => 'قزاقستان',
+ 'KE' => 'کنیا',
+ 'KG' => 'قرقیزستان',
+ 'KH' => 'کامبوج',
+ 'KI' => 'کیریباتی',
+ 'KN' => 'سنت کیتس و نویس',
+ 'KR' => 'کرخ جنوبی',
+ 'KW' => 'کویت',
+ 'LA' => 'لائوس',
+ 'LB' => 'لبنان',
+ 'LR' => 'لیبریا',
+ 'LY' => 'لیبی',
+ 'LC' => 'سنت لوسیا',
+ 'LI' => 'لیختن اشتاین',
+ 'LK' => 'سریلانکا',
+ 'LS' => 'لسوتو',
+ 'LT' => 'لیتوانی',
+ 'LU' => 'لوکزامبورگ',
+ 'LV' => 'لتونی',
+ 'MA' => 'مراکش',
+ 'MC' => 'موناکو',
+ 'MD' => 'مولداوی',
+ 'MG' => 'ماداگاسکار',
+ 'MV' => 'مالدیو',
+ 'MX' => 'مکزیک',
+ 'MH' => 'جزایر مارشال',
+ 'MK' => 'مقدونیه',
+ 'ML' => 'مالی',
+ 'MT' => 'مالتا',
+ 'MM' => 'میانمار',
+ 'ME' => 'مونته نگرو',
+ 'MN' => 'مغولستان',
+ 'MZ' => 'موزامبیک',
+ 'MR' => 'موریتانی',
+ 'MU' => 'موریس',
+ 'MW' => 'مالاوی',
+ 'MY' => 'مالزی',
+ 'NA' => 'نامیبیا',
+ 'NE' => 'نیجر',
+ 'NG' => 'نیجریه',
+ 'NI' => 'نیکاراگوئه',
+ 'NL' => 'هلند',
+ 'NO' => 'نروژ',
+ 'NP' => 'نپال',
+ 'NR' => 'نائورو',
+ 'NZ' => 'نیوزلند',
+ 'OM' => 'عمان',
+ 'PK' => 'پاکستان',
+ 'PA' => 'پاناما',
+ 'PE' => 'پرو',
+ 'PH' => 'فیلیپین',
+ 'PW' => 'پالائو',
+ 'PG' => 'پاپوآ گینه نو',
+ 'PL' => 'لهستان',
+ 'KP' => 'کره شمالی',
+ 'PT' => 'پرتغال',
+ 'PY' => 'پاراگوئه',
+ 'QA' => 'قطر',
+ 'RO' => 'رومانی',
+ 'RU' => 'روسیه',
+ 'RW' => 'رواندا',
+ 'SA' => 'عربستان سعودی',
+ 'SD' => 'سودان',
+ 'SN' => 'سنگال',
+ 'SG' => 'سنگاپور',
+ 'SB' => 'جزایر سلیمان',
+ 'SL' => 'سیرا لئون',
+ 'SV' => 'السالوادور',
+ 'SM' => 'سان مارینو',
+ 'SO' => 'سومالی',
+ 'RS' => 'صربستان',
+ 'SS' => 'سودان جنوبی',
+ 'ST' => 'سائو تومه و پرنسیپ',
+ 'SR' => 'سورینام',
+ 'SK' => 'اسلواکی',
+ 'SI' => 'اسلوونی',
+ 'SE' => 'سوئد',
+ 'SZ' => 'سوئیس',
+ 'SC' => 'سیشل',
+ 'SY' => 'سوریه',
+ 'TD' => 'چاد',
+ 'TG' => 'توگپ',
+ 'TH' => 'تایلند',
+ 'TJ' => 'تاجیکستان',
+ 'TM' => 'ترکمنستان',
+ 'TL' => 'تیمور-لسته',
+ 'TO' => 'تونگا',
+ 'TT' => 'ترینیداد و توباگو',
+ 'TN' => 'تونس',
+ 'TR' => 'ترکیه',
+ 'TV' => 'تووالو',
+ 'TZ' => 'تانزانیا',
+ 'UG' => 'اوگاندا',
+ 'UA' => 'اوکراین',
+ 'UY' => 'اوگوئه',
+ 'US' => 'ایالات متحده آمریکا',
+ 'UZ' => 'ازبکستان',
+ 'VA' => 'شهر واتیکان',
+ 'VC' => 'سنت وینسنت و گرنادین ها',
+ 'VE' => 'ونزوئلا',
+ 'VN' => 'ویتنام',
+ 'VU' => 'وانواتو',
+ 'WS' => 'ساموآ',
+ 'YE' => 'یمن',
+ 'ZA' => 'آفریقای جنوبی',
+ 'ZM' => 'زامبیا',
+ 'ZW' => 'زیمباوه',
+];
diff --git a/app/config/locale/translations/fa.php b/app/config/locale/translations/fa.php
new file mode 100644
index 0000000000..d16593945a
--- /dev/null
+++ b/app/config/locale/translations/fa.php
@@ -0,0 +1,21 @@
+ '"هنر خردمند بودن، هنر دانستن چیزی است که باید از آن غافل شد."', // This is the line printed in the homepage and console 'view-source'
+ 'settings.locale' => 'fa',
+ 'settings.direction' => 'rtl',
+
+ // Service - Users
+ 'account.emails.team' => 'تیم %s',
+ 'account.emails.verification.title' => 'تاییدیه حساب کاربری',
+ 'account.emails.verification.body' => 'fa.email.auth.confirm.tpl',
+ 'account.emails.recovery.title' => 'بازیابی رمز عبور',
+ 'account.emails.recovery.body' => 'fa.email.auth.recovery.tpl',
+ 'account.emails.invitation.title' => 'دعوتنامه به تیم %s در %s',
+ 'account.emails.invitation.body' => 'fa.email.auth.invitation.tpl',
+
+ 'locale.country.unknown' => 'ناشناس',
+
+ 'countries' => include 'fa.countries.php',
+ 'continents' => include 'fa.continents.php',
+];
diff --git a/app/config/locale/translations/templates/fa.email.auth.confirm.tpl b/app/config/locale/translations/templates/fa.email.auth.confirm.tpl
new file mode 100644
index 0000000000..dcd33d88a8
--- /dev/null
+++ b/app/config/locale/translations/templates/fa.email.auth.confirm.tpl
@@ -0,0 +1,16 @@
+
+
+سلام {{name}}،
+
+
+ برای تأیید آدرس ایمیل خود، روی این لینک کلیک کنید.
+
+{{cta}}
+
+اگر از شما خواسته نشده است این آدرس ایمیل را تأیید کنید، می توانید این پیام را نادیده بگیرید.
+
+
+ متشکریم,
+
+ تیم {{project}}
+
\ No newline at end of file
diff --git a/app/config/locale/translations/templates/fa.email.auth.invitation.tpl b/app/config/locale/translations/templates/fa.email.auth.invitation.tpl
new file mode 100644
index 0000000000..a89c7decc1
--- /dev/null
+++ b/app/config/locale/translations/templates/fa.email.auth.invitation.tpl
@@ -0,0 +1,18 @@
+
+ سلام،
+
+
+ این نامه برای شما ارسال شد زیرا {{owner}} میخواهد شما را به عضویت تیم {{team}} در {{project}} دعوت کند.
+
+
+ برای عضویت در تیم {{team}} بر روی لینک زیر کلیک کنید :
+
+{{cta}}
+
+اگر علاقهای ندارید، می توانید این پیام را نادیده بگیرید.
+
+
+ متشکریم,
+
+ {{project}} تیم
+
\ No newline at end of file
diff --git a/app/config/locale/translations/templates/fa.email.auth.recovery.tpl b/app/config/locale/translations/templates/fa.email.auth.recovery.tpl
new file mode 100644
index 0000000000..b493d5e033
--- /dev/null
+++ b/app/config/locale/translations/templates/fa.email.auth.recovery.tpl
@@ -0,0 +1,15 @@
+
+ سلام {{name}}،
+
+
+ لینک زیر را کلیک کنید تا رمز عبور {{project}} را بازیابی کنید.
+
+{{cta}}
+
+ اگر علاقهای ندارید، می توانید این پیام را نادیده بگیرید.
+
+
+ متشکریم،
+
+ تیم {{project}}
+
diff --git a/app/init.php b/app/init.php
index d44039ec23..ba4779cdc9 100644
--- a/app/init.php
+++ b/app/init.php
@@ -233,6 +233,7 @@ Locale::setLanguage('cz', include __DIR__.'/config/locale/translations/cz.php');
Locale::setLanguage('de', include __DIR__.'/config/locale/translations/de.php');
Locale::setLanguage('en', include __DIR__.'/config/locale/translations/en.php');
Locale::setLanguage('es', include __DIR__.'/config/locale/translations/es.php');
+Locale::setLanguage('fa', include __DIR__.'/config/locale/translations/fa.php');
Locale::setLanguage('fi', include __DIR__.'/config/locale/translations/fi.php');
Locale::setLanguage('fo', include __DIR__.'/config/locale/translations/fo.php');
Locale::setLanguage('fr', include __DIR__.'/config/locale/translations/fr.php');
From 2e6b8684eb5c3f2dccb580d4b33896002d3a873f Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Fri, 23 Oct 2020 03:42:16 +0300
Subject: [PATCH 075/133] Fixed preloading ignore path list
---
app/preload.php | 3 ---
1 file changed, 3 deletions(-)
diff --git a/app/preload.php b/app/preload.php
index 6cf308f8c6..d58d6717fb 100644
--- a/app/preload.php
+++ b/app/preload.php
@@ -23,9 +23,6 @@ include __DIR__.'/controllers/general.php';
$preloader = new Preloader();
foreach ([
- realpath(__DIR__ . '/../app/config'),
- realpath(__DIR__ . '/../app/controllers'),
- realpath(__DIR__ . '/../src'),
realpath(__DIR__ . '/../vendor/twig/twig'),
realpath(__DIR__ . '/../vendor/guzzlehttp/guzzle'),
realpath(__DIR__ . '/../vendor/domnikl'),
From 5df60549befb2df1fa3597fc26ccb907c38b3d79 Mon Sep 17 00:00:00 2001
From: iraj
Date: Fri, 23 Oct 2020 14:15:32 +0300
Subject: [PATCH 076/133] Fix China translation typo in Farsi countries file.
---
app/config/locale/translations/fa.countries.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/config/locale/translations/fa.countries.php b/app/config/locale/translations/fa.countries.php
index af2930ca7d..28a5ae0ae1 100644
--- a/app/config/locale/translations/fa.countries.php
+++ b/app/config/locale/translations/fa.countries.php
@@ -33,7 +33,7 @@ return [
'CA' => 'کانادا',
'CH' => 'سوئیس',
'CL' => 'شیلی',
- 'CN' => ']dk',
+ 'CN' => 'چین',
'CI' => 'ساحل عاج',
'CM' => 'کامرون',
'CD' => 'کنگو',
From 3a296ccb2544fc6f40d06a57425b6ca876f38425 Mon Sep 17 00:00:00 2001
From: iraj
Date: Fri, 23 Oct 2020 18:56:06 +0300
Subject: [PATCH 077/133] improve Farsi translation.
---
app/config/locale/translations/fa.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/config/locale/translations/fa.php b/app/config/locale/translations/fa.php
index d16593945a..35fb30afc7 100644
--- a/app/config/locale/translations/fa.php
+++ b/app/config/locale/translations/fa.php
@@ -7,14 +7,14 @@ return [
// Service - Users
'account.emails.team' => 'تیم %s',
- 'account.emails.verification.title' => 'تاییدیه حساب کاربری',
+ 'account.emails.verification.title' => 'تایید حساب کاربری',
'account.emails.verification.body' => 'fa.email.auth.confirm.tpl',
'account.emails.recovery.title' => 'بازیابی رمز عبور',
'account.emails.recovery.body' => 'fa.email.auth.recovery.tpl',
'account.emails.invitation.title' => 'دعوتنامه به تیم %s در %s',
'account.emails.invitation.body' => 'fa.email.auth.invitation.tpl',
- 'locale.country.unknown' => 'ناشناس',
+ 'locale.country.unknown' => 'ناشناخته',
'countries' => include 'fa.countries.php',
'continents' => include 'fa.continents.php',
From 21eacb8a63f0da9fdd7d3308a2020d03960be3b3 Mon Sep 17 00:00:00 2001
From: hack3r-0m
Date: Fri, 23 Oct 2020 17:36:52 +0000
Subject: [PATCH 078/133] Replace .mmdb reader with maxmind and native C
extension
---
Dockerfile | 33 +++++
app/controllers/api/locale.php | 14 +-
app/init.php | 2 +-
composer.json | 4 +-
composer.lock | 233 +++++----------------------------
5 files changed, 75 insertions(+), 211 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index 75c03c3e05..1847848560 100755
--- a/Dockerfile
+++ b/Dockerfile
@@ -34,6 +34,16 @@ RUN \
RUN docker-php-ext-install sockets
+RUN wget https://github.com/maxmind/libmaxminddb/releases/download/1.4.3/libmaxminddb-1.4.3.tar.gz
+RUN tar -xvf libmaxminddb-1.4.3.tar.gz && \
+ cd ./libmaxminddb-1.4.3 && \
+ ./configure && \
+ make && \
+ make check && \
+ make install && \
+ ldconfig ./libmaxminddb-1.4.3
+
+
RUN \
# Redis Extension
wget -q https://github.com/phpredis/phpredis/archive/$PHP_REDIS_VERSION.tar.gz && \
@@ -128,6 +138,29 @@ COPY ./docs /usr/src/code/docs
COPY ./public /usr/src/code/public
COPY ./src /usr/src/code/src
+RUN \
+ apk add --no-cache --virtual .deps \
+ make \
+ automake \
+ autoconf \
+ gcc \
+ g++ \
+ tar \
+ wget \
+ git \
+ zlib-dev \
+ brotli-dev
+
+RUN apk add libmaxminddb-dev && \
+ cd vendor/maxmind-db/reader/ext && ls -a && \
+ phpize && \
+ ./configure && \
+ make && \
+ make test && \
+ make install
+
+RUN echo extension=maxminddb.so >> /usr/local/etc/php/php.ini
+
# Set Volumes
RUN mkdir -p /storage/uploads && \
mkdir -p /storage/cache && \
diff --git a/app/controllers/api/locale.php b/app/controllers/api/locale.php
index 8be46d8e47..04524abe5d 100644
--- a/app/controllers/api/locale.php
+++ b/app/controllers/api/locale.php
@@ -30,16 +30,16 @@ App::get('/v1/locale')
$currency = null;
try {
- $record = $geodb->country($ip);
- $output['countryCode'] = $record->country->isoCode;
- $output['country'] = (isset($countries[$record->country->isoCode])) ? $countries[$record->country->isoCode] : $locale->getText('locale.country.unknown');
+ $record = $geodb->get($ip);
+ $output['countryCode'] = $record['country']['iso_code'];
+ $output['country'] = (isset($countries[$record['country']['iso_code']])) ? $countries[$record['country']['iso_code']] : $locale->getText('locale.country.unknown');
//$output['countryTimeZone'] = DateTimeZone::listIdentifiers(DateTimeZone::PER_COUNTRY, $record->country->isoCode);
- $output['continent'] = (isset($continents[$record->continent->code])) ? $continents[$record->continent->code] : $locale->getText('locale.country.unknown');
- $output['continentCode'] = $record->continent->code;
- $output['eu'] = (\in_array($record->country->isoCode, $eu)) ? true : false;
+ $output['continent'] = (isset($continents[$record['continent']['code']])) ? $continents[$record['continent']['code']] : $locale->getText('locale.country.unknown');
+ $output['continentCode'] = $record['continent']['code'];
+ $output['eu'] = (\in_array($record['country']['iso_code'], $eu)) ? true : false;
foreach ($currencies as $code => $element) {
- if (isset($element['locations']) && isset($element['code']) && \in_array($record->country->isoCode, $element['locations'])) {
+ if (isset($element['locations']) && isset($element['code']) && \in_array($record['country']['iso_code'], $element['locations'])) {
$currency = $element['code'];
}
}
diff --git a/app/init.php b/app/init.php
index 9637c4381c..1afa2a837f 100644
--- a/app/init.php
+++ b/app/init.php
@@ -25,7 +25,7 @@ use Utopia\View;
use Utopia\Config\Config;
use Utopia\Locale\Locale;
use Utopia\Registry\Registry;
-use GeoIp2\Database\Reader;
+use MaxMind\Db\Reader;
use PHPMailer\PHPMailer\PHPMailer;
use PDO as PDONative;
diff --git a/composer.json b/composer.json
index 7f3faed7ee..8b49062d46 100644
--- a/composer.json
+++ b/composer.json
@@ -45,7 +45,7 @@
"utopia-php/domains": "1.1.*",
"resque/php-resque": "1.3.6",
- "geoip2/geoip2": "2.10.0",
+ "maxmind-db/reader": "1.8.*",
"piwik/device-detector": "3.13.0",
"dragonmantank/cron-expression": "3.0.1",
"domnikl/statsd": "3.0.*",
@@ -73,4 +73,4 @@
"php": "7.4"
}
}
-}
\ No newline at end of file
+}
diff --git a/composer.lock b/composer.lock
index 2d881b4b19..a7c4e39810 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": "19f7cef86ddc98623cd3ffffa2be2cae",
+ "content-hash": "555bdf22c5a6417b7336ce7e616eba50",
"packages": [
{
"name": "appwrite/php-clamav",
@@ -140,76 +140,6 @@
"homepage": "https://github.com/colinmollenhour/credis",
"time": "2020-10-13T23:55:13+00:00"
},
- {
- "name": "composer/ca-bundle",
- "version": "dev-master",
- "source": {
- "type": "git",
- "url": "https://github.com/composer/ca-bundle.git",
- "reference": "8a7ecad675253e4654ea05505233285377405215"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/composer/ca-bundle/zipball/8a7ecad675253e4654ea05505233285377405215",
- "reference": "8a7ecad675253e4654ea05505233285377405215",
- "shasum": ""
- },
- "require": {
- "ext-openssl": "*",
- "ext-pcre": "*",
- "php": "^5.3.2 || ^7.0 || ^8.0"
- },
- "require-dev": {
- "phpunit/phpunit": "^4.8.35 || ^5.7 || 6.5 - 8",
- "psr/log": "^1.0",
- "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0"
- },
- "type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "1.x-dev"
- }
- },
- "autoload": {
- "psr-4": {
- "Composer\\CaBundle\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Jordi Boggiano",
- "email": "j.boggiano@seld.be",
- "homepage": "http://seld.be"
- }
- ],
- "description": "Lets you find a path to the system CA bundle, and includes a fallback to the Mozilla CA bundle.",
- "keywords": [
- "cabundle",
- "cacert",
- "certificate",
- "ssl",
- "tls"
- ],
- "funding": [
- {
- "url": "https://packagist.com",
- "type": "custom"
- },
- {
- "url": "https://github.com/composer",
- "type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
- "type": "tidelift"
- }
- ],
- "time": "2020-08-23T12:54:47+00:00"
- },
{
"name": "dasprid/enum",
"version": "1.0.3",
@@ -357,59 +287,6 @@
],
"time": "2020-08-21T02:30:13+00:00"
},
- {
- "name": "geoip2/geoip2",
- "version": "v2.10.0",
- "source": {
- "type": "git",
- "url": "https://github.com/maxmind/GeoIP2-php.git",
- "reference": "419557cd21d9fe039721a83490701a58c8ce784a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/maxmind/GeoIP2-php/zipball/419557cd21d9fe039721a83490701a58c8ce784a",
- "reference": "419557cd21d9fe039721a83490701a58c8ce784a",
- "shasum": ""
- },
- "require": {
- "ext-json": "*",
- "maxmind-db/reader": "~1.5",
- "maxmind/web-service-common": "~0.6",
- "php": ">=5.6"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "2.*",
- "phpunit/phpunit": "5.*",
- "squizlabs/php_codesniffer": "3.*"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "GeoIp2\\": "src"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "Gregory J. Oschwald",
- "email": "goschwald@maxmind.com",
- "homepage": "https://www.maxmind.com/"
- }
- ],
- "description": "MaxMind GeoIP2 PHP API",
- "homepage": "https://github.com/maxmind/GeoIP2-php",
- "keywords": [
- "IP",
- "geoip",
- "geoip2",
- "geolocation",
- "maxmind"
- ],
- "time": "2019-12-12T18:48:39+00:00"
- },
{
"name": "guzzlehttp/guzzle",
"version": "7.2.0",
@@ -514,12 +391,12 @@
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
- "reference": "60d379c243457e073cff02bc323a2a86cb355631"
+ "reference": "ddfeedfff2a52661429437da0702979f708e6ac6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/promises/zipball/60d379c243457e073cff02bc323a2a86cb355631",
- "reference": "60d379c243457e073cff02bc323a2a86cb355631",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/ddfeedfff2a52661429437da0702979f708e6ac6",
+ "reference": "ddfeedfff2a52661429437da0702979f708e6ac6",
"shasum": ""
},
"require": {
@@ -557,7 +434,7 @@
"keywords": [
"promise"
],
- "time": "2020-09-30T07:37:28+00:00"
+ "time": "2020-10-19T16:50:15+00:00"
},
{
"name": "guzzlehttp/psr7",
@@ -565,12 +442,12 @@
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
- "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3"
+ "reference": "25f7f893f0b52b7b14e244a16679d72b1f0088de"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/guzzle/psr7/zipball/53330f47520498c0ae1f61f7e2c90f55690c06a3",
- "reference": "53330f47520498c0ae1f61f7e2c90f55690c06a3",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/25f7f893f0b52b7b14e244a16679d72b1f0088de",
+ "reference": "25f7f893f0b52b7b14e244a16679d72b1f0088de",
"shasum": ""
},
"require": {
@@ -628,7 +505,7 @@
"uri",
"url"
],
- "time": "2020-09-30T07:37:11+00:00"
+ "time": "2020-10-22T07:42:05+00:00"
},
{
"name": "influxdb/influxdb-php",
@@ -751,52 +628,6 @@
],
"time": "2020-10-01T17:30:21+00:00"
},
- {
- "name": "maxmind/web-service-common",
- "version": "v0.8.0",
- "source": {
- "type": "git",
- "url": "https://github.com/maxmind/web-service-common-php.git",
- "reference": "ba67d9532cfaf499bd71774b8170d05df4f75fb7"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/maxmind/web-service-common-php/zipball/ba67d9532cfaf499bd71774b8170d05df4f75fb7",
- "reference": "ba67d9532cfaf499bd71774b8170d05df4f75fb7",
- "shasum": ""
- },
- "require": {
- "composer/ca-bundle": "^1.0.3",
- "ext-curl": "*",
- "ext-json": "*",
- "php": ">=7.2"
- },
- "require-dev": {
- "friendsofphp/php-cs-fixer": "2.*",
- "phpunit/phpunit": "^8.0 || ^9.0",
- "squizlabs/php_codesniffer": "3.*"
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "MaxMind\\Exception\\": "src/Exception",
- "MaxMind\\WebService\\": "src/WebService"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "Apache-2.0"
- ],
- "authors": [
- {
- "name": "Gregory Oschwald",
- "email": "goschwald@maxmind.com"
- }
- ],
- "description": "Internal MaxMind Web Service API",
- "homepage": "https://github.com/maxmind/web-service-common-php",
- "time": "2020-10-01T15:28:36+00:00"
- },
{
"name": "mustangostang/spyc",
"version": "dev-master",
@@ -1713,7 +1544,7 @@
"source": {
"type": "git",
"url": "https://github.com/appwrite/sdk-generator",
- "reference": "a57b3cd56c4bfe1538276cfc77456cf95d8835cb"
+ "reference": "ad1ee55f61967546c0889d377b628e244182311e"
},
"require": {
"ext-curl": "*",
@@ -1743,7 +1574,7 @@
}
],
"description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms",
- "time": "2020-10-14T12:07:25+00:00"
+ "time": "2020-10-20T10:23:43+00:00"
},
{
"name": "doctrine/instantiator",
@@ -2646,12 +2477,12 @@
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "338bf27b4510498c4b0ab70c7cbc292a591dc0df"
+ "reference": "b2a9914fd2057a72ec65bc9b3cd963c831a1b14b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/338bf27b4510498c4b0ab70c7cbc292a591dc0df",
- "reference": "338bf27b4510498c4b0ab70c7cbc292a591dc0df",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b2a9914fd2057a72ec65bc9b3cd963c831a1b14b",
+ "reference": "b2a9914fd2057a72ec65bc9b3cd963c831a1b14b",
"shasum": ""
},
"require": {
@@ -2737,7 +2568,7 @@
"type": "github"
}
],
- "time": "2020-10-19T09:25:00+00:00"
+ "time": "2020-10-22T06:06:02+00:00"
},
{
"name": "sebastian/cli-parser",
@@ -3675,16 +3506,16 @@
},
{
"name": "symfony/polyfill-ctype",
- "version": "dev-master",
+ "version": "dev-main",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
- "reference": "1c302646f6efc070cd46856e600e5e0684d6b454"
+ "reference": "325e20642232b66e3f140a76f795b58b50a08787"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/1c302646f6efc070cd46856e600e5e0684d6b454",
- "reference": "1c302646f6efc070cd46856e600e5e0684d6b454",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/325e20642232b66e3f140a76f795b58b50a08787",
+ "reference": "325e20642232b66e3f140a76f795b58b50a08787",
"shasum": ""
},
"require": {
@@ -3696,7 +3527,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.18-dev"
+ "dev-main": "1.19-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -3747,20 +3578,20 @@
"type": "tidelift"
}
],
- "time": "2020-07-14T12:35:20+00:00"
+ "time": "2020-10-21T09:57:48+00:00"
},
{
"name": "symfony/polyfill-mbstring",
- "version": "dev-master",
+ "version": "dev-main",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
- "reference": "48928d471ede0548b399f54b0286fe0d0ed79267"
+ "reference": "15e533d0893e58cc6c7a1971046a3dfc219435f2"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/48928d471ede0548b399f54b0286fe0d0ed79267",
- "reference": "48928d471ede0548b399f54b0286fe0d0ed79267",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/15e533d0893e58cc6c7a1971046a3dfc219435f2",
+ "reference": "15e533d0893e58cc6c7a1971046a3dfc219435f2",
"shasum": ""
},
"require": {
@@ -3772,7 +3603,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.18-dev"
+ "dev-main": "1.19-dev"
},
"thanks": {
"name": "symfony/polyfill",
@@ -3824,7 +3655,7 @@
"type": "tidelift"
}
],
- "time": "2020-09-14T11:01:58+00:00"
+ "time": "2020-10-21T09:57:48+00:00"
},
{
"name": "theseer/tokenizer",
@@ -3878,16 +3709,16 @@
"source": {
"type": "git",
"url": "https://github.com/twigphp/Twig.git",
- "reference": "fa2f1ccdb44a973571235c4a78487c040f26f116"
+ "reference": "78173b3c850e344cb8515fc2a05138d39a6c39e0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/twigphp/Twig/zipball/fa2f1ccdb44a973571235c4a78487c040f26f116",
- "reference": "fa2f1ccdb44a973571235c4a78487c040f26f116",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/78173b3c850e344cb8515fc2a05138d39a6c39e0",
+ "reference": "78173b3c850e344cb8515fc2a05138d39a6c39e0",
"shasum": ""
},
"require": {
- "php": ">=7.1.3",
+ "php": ">=7.2.5",
"symfony/polyfill-ctype": "^1.8",
"symfony/polyfill-mbstring": "^1.3"
},
@@ -3945,7 +3776,7 @@
"type": "tidelift"
}
],
- "time": "2020-10-14T06:37:57+00:00"
+ "time": "2020-10-21T12:45:52+00:00"
},
{
"name": "webmozart/assert",
From 198b6e02b27e73868952f2a95cd0841a5c435884 Mon Sep 17 00:00:00 2001
From: hack3r-0m
Date: Fri, 23 Oct 2020 17:46:51 +0000
Subject: [PATCH 079/133] refactored Dockerfile
---
Dockerfile | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/Dockerfile b/Dockerfile
index 1847848560..c0f66d1c54 100755
--- a/Dockerfile
+++ b/Dockerfile
@@ -34,6 +34,8 @@ RUN \
RUN docker-php-ext-install sockets
+# install C extension for .mmdb reader
+# https://github.com/maxmind/libmaxminddb
RUN wget https://github.com/maxmind/libmaxminddb/releases/download/1.4.3/libmaxminddb-1.4.3.tar.gz
RUN tar -xvf libmaxminddb-1.4.3.tar.gz && \
cd ./libmaxminddb-1.4.3 && \
@@ -43,7 +45,6 @@ RUN tar -xvf libmaxminddb-1.4.3.tar.gz && \
make install && \
ldconfig ./libmaxminddb-1.4.3
-
RUN \
# Redis Extension
wget -q https://github.com/phpredis/phpredis/archive/$PHP_REDIS_VERSION.tar.gz && \
@@ -151,6 +152,7 @@ RUN \
zlib-dev \
brotli-dev
+# Enabling C extension for .mmdb reader and adding loading it
RUN apk add libmaxminddb-dev && \
cd vendor/maxmind-db/reader/ext && ls -a && \
phpize && \
From 9e7d7911253bb59ab8cb8e5a69ef9e2e00622e81 Mon Sep 17 00:00:00 2001
From: "Eldad A. Fux"
Date: Sat, 24 Oct 2020 00:24:20 +0300
Subject: [PATCH 080/133] Update CONTRIBUTING.md
---
CONTRIBUTING.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 223312c88d..32d528e755 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -239,7 +239,7 @@ docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t appwrite/
To run tests manually, use the Appwrite Docker CLI from your terminal:
```bash
-docker exec appwrite test
+docker-compose exec appwrite test
```
## Code Maintenance
From eb2018b99e520df1e4a443b8efbfac4e707d11e7 Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Sat, 24 Oct 2020 01:50:13 +0300
Subject: [PATCH 081/133] Updated base image
---
Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index 8a86a910fc..a94ad16e87 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:18.04 AS builder
+FROM ubuntu:20.04 AS builder
LABEL maintainer="team@appwrite.io"
@@ -43,7 +43,7 @@ RUN composer update --ignore-platform-reqs --optimize-autoloader \
--no-plugins --no-scripts --prefer-dist \
`if [ "$TESTING" != "true" ]; then echo "--no-dev"; fi`
-FROM ubuntu:18.04
+FROM ubuntu:20.04
LABEL maintainer="team@appwrite.io"
ARG VERSION=dev
From f97af2e5d2c53879dbb8f5697de28358fb755d4e Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Sat, 24 Oct 2020 01:58:27 +0300
Subject: [PATCH 082/133] Updated base OS
---
Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index a94ad16e87..fa6e1ed7b1 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:20.04 AS builder
+FROM ubuntu:19.04 AS builder
LABEL maintainer="team@appwrite.io"
@@ -43,7 +43,7 @@ RUN composer update --ignore-platform-reqs --optimize-autoloader \
--no-plugins --no-scripts --prefer-dist \
`if [ "$TESTING" != "true" ]; then echo "--no-dev"; fi`
-FROM ubuntu:20.04
+FROM ubuntu:19.04
LABEL maintainer="team@appwrite.io"
ARG VERSION=dev
From f74d9258ddafa6d67ad235730f8e4644cd600432 Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Sat, 24 Oct 2020 02:03:47 +0300
Subject: [PATCH 083/133] Updated base OS
---
Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index fa6e1ed7b1..f7f61030cb 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:19.04 AS builder
+FROM ubuntu:19.10 AS builder
LABEL maintainer="team@appwrite.io"
@@ -43,7 +43,7 @@ RUN composer update --ignore-platform-reqs --optimize-autoloader \
--no-plugins --no-scripts --prefer-dist \
`if [ "$TESTING" != "true" ]; then echo "--no-dev"; fi`
-FROM ubuntu:19.04
+FROM ubuntu:19.10
LABEL maintainer="team@appwrite.io"
ARG VERSION=dev
From c97ebbe52c59e5228a959dde5b973cb891f8ca1a Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Sat, 24 Oct 2020 02:06:58 +0300
Subject: [PATCH 084/133] Updated base OS
---
Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index f7f61030cb..37c5fd9028 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:19.10 AS builder
+FROM ubuntu:20.10 AS builder
LABEL maintainer="team@appwrite.io"
@@ -43,7 +43,7 @@ RUN composer update --ignore-platform-reqs --optimize-autoloader \
--no-plugins --no-scripts --prefer-dist \
`if [ "$TESTING" != "true" ]; then echo "--no-dev"; fi`
-FROM ubuntu:19.10
+FROM ubuntu:20.10
LABEL maintainer="team@appwrite.io"
ARG VERSION=dev
From c3511b00804bceb63a4a198a4edde7e6d679057f Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Sat, 24 Oct 2020 02:34:33 +0300
Subject: [PATCH 085/133] Updated certbot setup
---
Dockerfile | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index 37c5fd9028..9a58abe89e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM ubuntu:20.10 AS builder
+FROM ubuntu:20.04 AS builder
LABEL maintainer="team@appwrite.io"
@@ -43,7 +43,7 @@ RUN composer update --ignore-platform-reqs --optimize-autoloader \
--no-plugins --no-scripts --prefer-dist \
`if [ "$TESTING" != "true" ]; then echo "--no-dev"; fi`
-FROM ubuntu:20.10
+FROM ubuntu:20.04
LABEL maintainer="team@appwrite.io"
ARG VERSION=dev
@@ -91,7 +91,6 @@ RUN \
apt-get install -y --no-install-recommends --no-install-suggests wget ca-certificates software-properties-common build-essential libpcre3-dev zlib1g-dev libssl-dev openssl gnupg htop supervisor && \
LC_ALL=C.UTF-8 add-apt-repository -y ppa:ondrej/php && \
add-apt-repository universe && \
- add-apt-repository ppa:certbot/certbot && \
apt-get update && \
apt-get install -y --no-install-recommends --no-install-suggests php$PHP_VERSION php$PHP_VERSION-fpm \
php$PHP_VERSION-mysqlnd php$PHP_VERSION-curl php$PHP_VERSION-imagick php$PHP_VERSION-mbstring php$PHP_VERSION-dom webp certbot && \
From cfbc32122f2b72ca733f53012427c34d9739f796 Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Sat, 24 Oct 2020 07:48:19 +0300
Subject: [PATCH 086/133] Fixed domain lib
---
app/app.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/app.php b/app/app.php
index e92660b5a0..3f6735fdbb 100644
--- a/app/app.php
+++ b/app/app.php
@@ -67,7 +67,7 @@ $utopia->init(function () use ($utopia, $request, $response, &$user, $project, $
? $origin : 'localhost') . (!empty($port) ? ':'.$port : '');
$selfDomain = new Domain(Config::getParam('hostname'));
- $endDomain = new Domain($origin);
+ $endDomain = new Domain((string)$origin);
Config::setParam('domainVerification',
($selfDomain->getRegisterable() === $endDomain->getRegisterable()) &&
From eb1e44cb0582c579505d64c2f39177e42fb4c189 Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Sat, 24 Oct 2020 08:24:47 +0300
Subject: [PATCH 087/133] Updated preview controller
---
app/controllers/api/storage.php | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/app/controllers/api/storage.php b/app/controllers/api/storage.php
index 9a12b56048..853bdade6a 100644
--- a/app/controllers/api/storage.php
+++ b/app/controllers/api/storage.php
@@ -429,18 +429,16 @@ $utopia->get('/v1/storage/files/:fileId/preview')
$output = (empty($output)) ? $type : $output;
- $response
- ->setContentType($outputs[$output])
- ->addHeader('Expires', $date)
- ->addHeader('X-Appwrite-Cache', 'miss')
- ->send('')
- ;
-
$data = $resize->output($output, $quality);
$cache->save($key, $data);
- echo $data;
+ $response
+ ->setContentType($outputs[$output])
+ ->addHeader('Expires', $date)
+ ->addHeader('X-Appwrite-Cache', 'miss')
+ ->send($data)
+ ;
unset($resize);
}
From b34dd6714ed380bf09738faacf4c4a632408fdd0 Mon Sep 17 00:00:00 2001
From: Eldad Fux
Date: Sat, 24 Oct 2020 08:42:15 +0300
Subject: [PATCH 088/133] Updated cropping tests
---
public/index.php | 6 +++---
tests/resources/resize/100x100-q30.jpg | Bin 797 -> 799 bytes
tests/resources/resize/100x100.gif | Bin 608220 -> 610124 bytes
tests/resources/resize/100x100.jpg | Bin 9254 -> 9417 bytes
tests/resources/resize/100x100.png | Bin 20148 -> 20085 bytes
tests/resources/resize/100x100.webp | Bin 5094 -> 5134 bytes
tests/resources/resize/100x400.jpg | Bin 31166 -> 31830 bytes
tests/resources/resize/400x100.jpg | Bin 22863 -> 23841 bytes
8 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/public/index.php b/public/index.php
index c87b14a26e..a80a351324 100644
--- a/public/index.php
+++ b/public/index.php
@@ -11,9 +11,9 @@
error_reporting(0);
ini_set('display_errors', 0);
-// ini_set('display_errors', 1);
-// ini_set('display_startup_errors', 1);
-// error_reporting(E_ALL);
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
$path = (isset($_GET['q'])) ? explode('/', $_GET['q']) : [];
diff --git a/tests/resources/resize/100x100-q30.jpg b/tests/resources/resize/100x100-q30.jpg
index 67cfd6b9512cf9b32c92e8765900db091c05a5c7..23933efc869efbc67db35051e6d8adce919c19d6 100644
GIT binary patch
delta 530
zcmV+t0`2{s2A>9y&m|`i00II60s;a80R;d600000009CK10fPI1VJKUQE?L#BSL|Z
z^Gtugr_tDwj8a~aT(SO4O)l2Z93TJy*9I4n+tgS6H1d*!BN(K%5y}7n002k9XokZ7xd9R@qThlu}7jM<1B)
zDqnwQrh1mwYm6OPa&_xvTBBzP#qs~1H
znIj(dbG%V*($E~_nsANQiFnfd1!qVX;J$zrLgokm;@F{Pyi4A+0)DCH2?qr
delta 528
zcmV+r0`L8w2Au|w&m<-g00II60s;a80s{a500000009CK10fPI1VJKUQE?L#BSMk%
zOn=Mi^mZhp6qlq|EPs;|OSQBI2mk;z!G+{@^%egBO+2Kb2*xQbgmQoY000sIP_z}z
zFS4eX70%zFI^4cRli8I%cj&sZ1hC_qwyX44`jEXgT}myb$yut~Dk_qSNh(O=^Bv_&
z@Q%93E2t04@C>Fa(eQ00e*nhL{~p%zv~kO;8`d=-~1t&m&-BK_CbK0U&}xhS+hrJAD~KE>fg+#ynz>
z1=)10vPy|dWJP!~>q}*bDCE!NZ-gK1oVR`UZ{_3RJ4%x|zz_fc024&UExJaE3V%!E
zD*cv(IJ>mMw#NmEKV+$XOx8r*H?qhhWh7gYFtX6QAlH(zc@X*tqMk%l@jY~T$DxxX
zW8ThpiY?k&1Dumi5xUVY8ef2{sRK?6=mB0%n)Xa4$X?S5G{_=*nPoZ0-J-IhUel8)Y+3hB{rdmRY9Z#`I??$@c81T${FPvU)MM
z>_@$kS}RW9LQmwWke#ZcT|r;4B2%Y8t7*Gn1M0-vumB=&bN~pqO<7df06)|%!~h|Z
S0Y$E&MYidHL1dKx0RP#1i0eH7
diff --git a/tests/resources/resize/100x100.gif b/tests/resources/resize/100x100.gif
index 30ef716cd040db04cbd4d09cd690c902ad48e19a..864dc7c0242a7ac0100036291547e42c5f47469a 100644
GIT binary patch
literal 610124
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