diff --git a/app/workers/certificates.php b/app/workers/certificates.php
index 515fbb7b0..da3c4ec5c 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 ca82abe59..f654748a6 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 25691a108..cfbc8a671 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 1392b6fdd..297b144e8 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 058/111] Updated Swoole version
---
Dockerfile | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Dockerfile b/Dockerfile
index 63862cfbb..3c990cb8b 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 059/111] 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 f877be39a..049ae9c6c 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 060/111] Updated Travis CI URL
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 198964dcb..fc7020757 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@
[![Hacktoberfest](https://badgen.net/badge/hacktoberfest/friendly/pink)](CONTRIBUTING.md)
[![Discord](https://img.shields.io/discord/564160730845151244?label=discord)](https://discord.gg/GSeTUeA)
[![Docker Pulls](https://badgen.net/docker/pulls/appwrite/appwrite)](https://travis-ci.org/appwrite/appwrite)
-[![Travis CI](https://badgen.net/travis/appwrite/appwrite?label=build)](https://travis-ci.org/appwrite/appwrite)
+[![Travis CI](https://badgen.net/travis/appwrite/appwrite?label=build)](https://travis-ci.com/appwrite/appwrite)
[![Twitter Account](https://badgen.net/twitter/follow/appwrite_io?label=twitter)](https://twitter.com/appwrite_io)
[![Follow Appwrite on StackShare](https://badgen.net/badge/follow%20on/stackshare/blue)](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 061/111] 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 3b3aa4ea6..c1d002601 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 062/111] Updated setup examples
---
README.md | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 6f2147288..aa3707c04 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 063/111] 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 47c09fbb5..895676573 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 3c990cb8b..75c03c3e0 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 9eede27a3..c887493bb 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 000000000..ed4a32973
--- /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 000000000..19e3f1ebf
--- /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 c641709a8..b34f44b7b 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 064/111] Reverted build changes
---
build.sh | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/build.sh b/build.sh
index b34f44b7b..c641709a8 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 065/111] 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 c887493bb..9c9989060 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 066/111] Update README.md
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index aa3707c04..0ef9f3c2d 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 067/111] Updated preloader
---
app/preload.php | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/preload.php b/app/preload.php
index 63d08c3e1..aded885c1 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 068/111] 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 459b62dc4..fb6fa41b2 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 f166b0bc9..03218ac6a 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 a1f54f467..3b1aab75c 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 d1393d5f6..d38520f47 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 4184532fd..e0ca6d29a 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 254582120..00067751f 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 e2c884a3e..6302e3bf3 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 ad6e44f76..ae2da7677 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 5e1c07dab..5d46cac1f 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 198717132..d4799380e 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 612498c39..2ed69d0ef 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 069/111] 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 8431e00f6..8be46d8e4 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 070/111] 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 7a19636db..1cc03b162 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 b5e6cc822..7c65d6bdb 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 1144b36b3..c141200db 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 c77c6245f..be4f79df9 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 071/111] 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 954037543..8f185064e 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 aded885c1..a61e84248 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 f0ce2624c..7f3faed7e 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 297b144e8..2d881b4b1 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 a03c0cb28..000000000
--- 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 072/111] 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 d4799380e..7de4c95e4 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 073/111] 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 5ba9b7a13..f6ae739ca 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 074/111] 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 9637c4381..d44039ec2 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 075/111] 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 a61e84248..6cf308f8c 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 b5e3e412d4c1f2ca5ba9b81e13c1318fe116c9af Mon Sep 17 00:00:00 2001
From: iraj
Date: Fri, 23 Oct 2020 01:01:08 +0300
Subject: [PATCH 076/111] 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 039650da0..d3f289576 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 000000000..e55e8f9f3
--- /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 000000000..af2930ca7
--- /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 000000000..d16593945
--- /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 000000000..dcd33d88a
--- /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 000000000..a89c7decc
--- /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 000000000..b493d5e03
--- /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 d44039ec2..ba4779cdc 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 077/111] 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 6cf308f8c..d58d6717f 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 078/111] 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 af2930ca7..28a5ae0ae 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 079/111] 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 d16593945..35fb30afc 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 080/111] 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 75c03c3e0..184784856 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 8be46d8e4..04524abe5 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 9637c4381..1afa2a837 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 7f3faed7e..8b49062d4 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 2d881b4b1..a7c4e3981 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 081/111] refactored Dockerfile
---
Dockerfile | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/Dockerfile b/Dockerfile
index 184784856..c0f66d1c5 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 082/111] Update CONTRIBUTING.md
---
CONTRIBUTING.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 223312c88..32d528e75 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 083/111] Updated base image
---
Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index 8a86a910f..a94ad16e8 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 084/111] Updated base OS
---
Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index a94ad16e8..fa6e1ed7b 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 085/111] Updated base OS
---
Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index fa6e1ed7b..f7f61030c 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 086/111] Updated base OS
---
Dockerfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index f7f61030c..37c5fd902 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 087/111] Updated certbot setup
---
Dockerfile | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index 37c5fd902..9a58abe89 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 088/111] 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 e92660b5a..3f6735fdb 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 089/111] 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 9a12b5604..853bdade6 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 090/111] 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 c87b14a26..a80a35132 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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