From 76d8c656dba59dd00c2398a0ebbce04f87e36977 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 10 Jan 2021 02:07:34 +0200 Subject: [PATCH 1/5] Upgrade QR package version --- composer.json | 2 +- composer.lock | 18 +++++++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 043007c735..6db03b544e 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,7 @@ "domnikl/statsd": "3.0.2", "influxdb/influxdb-php": "1.15.1", "phpmailer/phpmailer": "6.1.7", - "chillerlan/php-qrcode": "4.2.0" + "chillerlan/php-qrcode": "4.3.0" }, "require-dev": { "swoole/ide-helper": "4.5.5", diff --git a/composer.lock b/composer.lock index 09483dbca6..d9c5fb0f95 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": "6594e4d32da0196d0bb2e5a1794ea89d", + "content-hash": "249dc088c5f9f74a1c0e91661f93f96b", "packages": [ { "name": "appwrite/php-clamav", @@ -57,16 +57,16 @@ }, { "name": "chillerlan/php-qrcode", - "version": "4.2.0", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/chillerlan/php-qrcode.git", - "reference": "1972af7af51b203bc239d8fb94243f6ed2a1067a" + "reference": "4968063fb3baeedb658293f89f9673fbf2499a3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/1972af7af51b203bc239d8fb94243f6ed2a1067a", - "reference": "1972af7af51b203bc239d8fb94243f6ed2a1067a", + "url": "https://api.github.com/repos/chillerlan/php-qrcode/zipball/4968063fb3baeedb658293f89f9673fbf2499a3e", + "reference": "4968063fb3baeedb658293f89f9673fbf2499a3e", "shasum": "" }, "require": { @@ -119,15 +119,19 @@ ], "support": { "issues": "https://github.com/chillerlan/php-qrcode/issues", - "source": "https://github.com/chillerlan/php-qrcode/tree/4.2.0" + "source": "https://github.com/chillerlan/php-qrcode/tree/4.3.0" }, "funding": [ + { + "url": "https://www.paypal.com/donate?hosted_button_id=WLYUNAT9ZTJZ4", + "type": "custom" + }, { "url": "https://ko-fi.com/codemasher", "type": "ko_fi" } ], - "time": "2020-10-07T14:41:07+00:00" + "time": "2020-11-18T20:49:20+00:00" }, { "name": "chillerlan/php-settings-container", From bdd04ce29263fbf1c2080aa2c54475d72a69ba89 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 10 Jan 2021 02:07:58 +0200 Subject: [PATCH 2/5] Fixed margin value, add png compression --- app/controllers/api/avatars.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/avatars.php b/app/controllers/api/avatars.php index 1059c6e1c7..3a1088ec6a 100644 --- a/app/controllers/api/avatars.php +++ b/app/controllers/api/avatars.php @@ -383,8 +383,10 @@ App::get('/v1/avatars/qr') $download = ($download === '1' || $download === 'true' || $download === 1 || $download === true); $options = new QROptions([ - 'quietzone' => $size, - 'outputType' => QRCode::OUTPUT_IMAGICK + 'addQuietzone' => true, + 'quietzoneSize' => $margin, + 'outputType' => QRCode::OUTPUT_IMAGICK, + 'pngCompression' => 9, ]); $qrcode = new QRCode($options); From 71036ba85fb4f9e6524578ab6e3ad9c0492f179d Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 10 Jan 2021 02:17:44 +0200 Subject: [PATCH 3/5] Fixed resizing --- app/controllers/api/avatars.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/controllers/api/avatars.php b/app/controllers/api/avatars.php index 3a1088ec6a..fe2b53f71f 100644 --- a/app/controllers/api/avatars.php +++ b/app/controllers/api/avatars.php @@ -386,7 +386,6 @@ App::get('/v1/avatars/qr') 'addQuietzone' => true, 'quietzoneSize' => $margin, 'outputType' => QRCode::OUTPUT_IMAGICK, - 'pngCompression' => 9, ]); $qrcode = new QRCode($options); @@ -395,10 +394,14 @@ App::get('/v1/avatars/qr') $response->addHeader('Content-Disposition', 'attachment; filename="qr.png"'); } + $resize = new Resize($qrcode->render($text)); + + $resize->crop((int) $size, (int) $size); + $response ->addHeader('Expires', \date('D, d M Y H:i:s', \time() + (60 * 60 * 24 * 45)).' GMT') // 45 days cache ->setContentType('image/png') - ->send($qrcode->render($text)) + ->send($resize->output('png', 9)) ; }); From 12015a75e03c48022f419bead6109d6e6488be7c Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 10 Jan 2021 07:53:58 +0200 Subject: [PATCH 4/5] Added more tests --- tests/e2e/Services/Avatars/AvatarsBase.php | 28 +++++++++++++++++++ tests/resources/qr/qr-default.png | Bin 0 -> 14593 bytes tests/resources/qr/qr-size-200-margin-10.png | Bin 0 -> 3750 bytes tests/resources/qr/qr-size-200.png | Bin 0 -> 6075 bytes 4 files changed, 28 insertions(+) create mode 100644 tests/resources/qr/qr-default.png create mode 100644 tests/resources/qr/qr-size-200-margin-10.png create mode 100644 tests/resources/qr/qr-size-200.png diff --git a/tests/e2e/Services/Avatars/AvatarsBase.php b/tests/e2e/Services/Avatars/AvatarsBase.php index e27be04e18..62722fbed3 100644 --- a/tests/e2e/Services/Avatars/AvatarsBase.php +++ b/tests/e2e/Services/Avatars/AvatarsBase.php @@ -336,6 +336,13 @@ trait AvatarsBase $this->assertEquals('image/png', $response['headers']['content-type']); $this->assertNotEmpty($response['body']); + $image = new \Imagick(); + $image->readImageBlob($response['body']); + $this->assertEquals(400, $image->getImageWidth()); + $this->assertEquals(400, $image->getImageHeight()); + $this->assertEquals('PNG', $image->getImageFormat()); + $this->assertEquals(strlen(\file_get_contents(__DIR__ . '/../../../resources/qr/qr-default.png')), strlen($response['body'])); + $response = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ 'x-appwrite-project' => $this->getProject()['$id'], ], [ @@ -347,6 +354,13 @@ trait AvatarsBase $this->assertEquals('image/png', $response['headers']['content-type']); $this->assertNotEmpty($response['body']); + $image = new \Imagick(); + $image->readImageBlob($response['body']); + $this->assertEquals(200, $image->getImageWidth()); + $this->assertEquals(200, $image->getImageHeight()); + $this->assertEquals('PNG', $image->getImageFormat()); + $this->assertEquals(strlen(\file_get_contents(__DIR__ . '/../../../resources/qr/qr-size-200.png')), strlen($response['body'])); + $response = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ 'x-appwrite-project' => $this->getProject()['$id'], ], [ @@ -359,6 +373,13 @@ trait AvatarsBase $this->assertEquals('image/png', $response['headers']['content-type']); $this->assertNotEmpty($response['body']); + $image = new \Imagick(); + $image->readImageBlob($response['body']); + $this->assertEquals(200, $image->getImageWidth()); + $this->assertEquals(200, $image->getImageHeight()); + $this->assertEquals('PNG', $image->getImageFormat()); + $this->assertEquals(strlen(\file_get_contents(__DIR__ . '/../../../resources/qr/qr-size-200-margin-10.png')), strlen($response['body'])); + $response = $this->client->call(Client::METHOD_GET, '/avatars/qr', [ 'x-appwrite-project' => $this->getProject()['$id'], ], [ @@ -368,6 +389,13 @@ trait AvatarsBase 'download' => 1, ]); + $image = new \Imagick(); + $image->readImageBlob($response['body']); + $this->assertEquals(200, $image->getImageWidth()); + $this->assertEquals(200, $image->getImageHeight()); + $this->assertEquals('PNG', $image->getImageFormat()); + $this->assertEquals(strlen(\file_get_contents(__DIR__ . '/../../../resources/qr/qr-size-200-margin-10.png')), strlen($response['body'])); + $this->assertEquals(200, $response['headers']['status-code']); $this->assertEquals('attachment; filename="qr.png"', $response['headers']['content-disposition']); $this->assertEquals('image/png', $response['headers']['content-type']); diff --git a/tests/resources/qr/qr-default.png b/tests/resources/qr/qr-default.png new file mode 100644 index 0000000000000000000000000000000000000000..a7da496d9fd62ecb6b0afc8d1f2bfb154a660cbf GIT binary patch literal 14593 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

Mt!Buq3^8#i2Bly&v zEL?p`sI_%U8A(mu@7iYF#-EiWVfIgJcooST((1y+O4hwKo|@N0-L?AI_Pju1>t|u# zEam(yuTuL(1Xl7J>Y(d~gUUo4&8SwZXg<)JG{Y@aG7ku$>7=P&uY)4iAA0w;t|oH!KIN z%It5orz?o*+QU~SBUy`XborZG=S-2cgQpJuPXy1O2%CDBEozdIzeN!@wQPmj#~^xV zK63u0I~q?d<3wApxGtF_sD~dhpDZujQ$&J}hbS}%4cTXSst$a_6! zzYoXlg5pN%EH11lH*SANVF@-q0gwIVm;oo{CD}42@;e;ar-uqpE{=>0Khdu1#ND4w z<|MUno;qA;MnA#jBp8Hpz6)wN1D8Jec8xOWjVF(D1I?If_|Cp#!?c0_n`7kA*-rF` zza~R~X%k{hoxdNKJK3(PqxSA^wf%(($Hp|E6C?F5Y*R5*<8H!`$blwU=t9vX(59!+ zXPIB6kSHV%=;;>9AHYHW2R_}sswVq0YA=**@^+3r)OGLM)mW6d@GQ1k|Kpd%E`4Be zw&*=SV9)k&1Z2C!SY>;WJ43asKaX($o{64oq~iy|V94}G-QHM;IRqN2bA)&@TeGGa9g`wl>CC9lclC)EjMDd(r=Oh2|S}Q(7<_qNoBk|0H!uw0W#C?nq&_yIi+^1RHq7OeD;ro2l zbz9K7g$)RO^cV{4pSxhVYHJu_Y*|+P?$ULvO$pS$Vq74%tKw+H1X1Ap-OsS>an^L* z^dlGO1`XN4NAQ|V)b*>3$`im!7{aC{yz?W!h_Lva&w$HUSRL2-MqA(a{9ioS1aH|v zrzde(uG`0*jDKqMX*#^3YCh?`HOtg}FEa&Cy#H9Ho3E+L?2+x{4DSqn8 ziPinRfWLB^7O8@tFt{{sk^HI~C8J9PEq@f$=6o#zqeyiz%%q(-7e^j^mm;RGEFro# zRs@q<5XKw~zG50|RXFEiMaufZza9(qWiu1cz1k;rWwRBXKA5`j?2U&V1LW3hwMZRH z&uR6k#!^ba<`W_&?AR?^y#u8AZk5hMa3S3TE^pc}_NtFk&&dIh)Y4P_w){6E$(lzb;rzPy^S;}cI0VJt_;J0I{owc z_30=_#f_ZDA%|%-!VenT!a=$O=o+;vSaes6GO)S&iS)2(Jhd>iP_2{h%fpuO84_{uNAdeA zFc8O03{QoZ;q*?m9*lT)tItz*b0D>VEz;!ymKF%-q4%zYka@N-@VzR@L85~W217tP z5OfVOy3;5N4W4|=O=IhfNkaKzQ;vYB1l>0ah~n)%tKDtjt`*fqu}BQO_O4JhF}~u? zS38Q!_$uYJ5WNhf&MD!;WuJGbb%I@;<2IBc2w-A8gMV(ePT{Hoe3#!mhx*%WW)CEG za9RBTawdW4)2CXSZIqm0d^2MpAo>`05yMUh_|RPQ^pVq7VR3Zg&`a9P*sP2=M=ETU zab@OgtnteMxse*dzI(SiB_kaMJY*!dOTIjrbf5k)`}9!yMXd3T*1WHeOmPTpi6@)^ zD^f~Ri!lQ~Y1+lOL4M8@5`pp)1JZ4qo#ADg%uVh=bAwYCY*RbHZXQMB#y@{H1 zQZp54^kpx~@6FWD5zv5?Q|Zm?ts6B`(~pu9XdRXdl2UVyp-P=b!1Nali*r5o+h9+v zGY0_22*Q%woaoswU)`#hvQs5z^b*HT^4(J#>vZ{)vZ#gN1#f6k=hOPUPv@qyuF$6v zmflO-g|W1%@R;R^9bO@tG5_YOgg^Jl!e~PzsJ_&so20Wz4bmP-J%$E*FfuPRfYom^ zRgU*aaZHQQw)N0|XVa#j#xY)X+0^0E8o`b)mte3TAZ1FVY@@*?4f2%1C|bXg#vQps z{JE))=W(grToptPqdv1ed7-)(LqDwB0>c>zB{w4L$48uf-VG=fh5_fPnL`}qGe z62z5lQR(_H$&&S@`GaU^OLTK4x}#kE-B|`eB9JPI2o*&Yge5{9rK*ZTsKXHm6ao>1 zK}?(UsO$SkUo*K-Y0$ v?tq%AhJpW&Wim?>`iEv^VG4NQeB4dZUgE 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 K6HzX29{N8&t~F-> literal 0 HcmV?d00001 From 59c8ae731b375bd80a58ead6f0bf850e90aab739 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sun, 10 Jan 2021 13:56:48 +0200 Subject: [PATCH 5/5] Added missing test --- tests/e2e/Services/Users/UsersBase.php | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/tests/e2e/Services/Users/UsersBase.php b/tests/e2e/Services/Users/UsersBase.php index 14805273e6..ebefa2abb9 100644 --- a/tests/e2e/Services/Users/UsersBase.php +++ b/tests/e2e/Services/Users/UsersBase.php @@ -125,12 +125,12 @@ trait UsersBase /** * @depends testGetUser */ - public function testUpdateUserPrefs(array $data):array + public function testUpdateAndGetUserPrefs(array $data):array { /** * Test for SUCCESS */ - $user = $this->client->call(Client::METHOD_PATCH, '/users/' . $data['userId'] . '/prefs', array_merge([ + $user = $this->client->call(Client::METHOD_PATCH, '/users/'.$data['userId'].'/prefs', array_merge([ 'content-type' => 'application/json', 'x-appwrite-project' => $this->getProject()['$id'], ], $this->getHeaders()), [ @@ -144,6 +144,17 @@ trait UsersBase $this->assertEquals($user['body']['funcKey1'], 'funcValue1'); $this->assertEquals($user['body']['funcKey2'], 'funcValue2'); + $user = $this->client->call(Client::METHOD_GET, '/users/'.$data['userId'].'/prefs', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders())); + + $this->assertEquals($user['headers']['status-code'], 200); + $this->assertEquals($user['body'], [ + 'funcKey1' => 'funcValue1', + 'funcKey2' => 'funcValue2', + ]); + /** * Test for FAILURE */