From ba558649b2230da61b1b3e84a6bcb16d93e6d13d Mon Sep 17 00:00:00 2001 From: dingo thirteen Date: Wed, 24 Feb 2021 23:08:29 +0000 Subject: [PATCH 1/8] Translated using Weblate (Dutch) Currently translated at 100.0% (3377 of 3377 strings) [ci skip] Translation: phpMyAdmin/5.1 Translate-URL: https://hosted.weblate.org/projects/phpmyadmin/5-1/nl/ Signed-off-by: dingo thirteen --- po/nl.po | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/po/nl.po b/po/nl.po index 3d4d2da417ac..3ef5a26309e6 100644 --- a/po/nl.po +++ b/po/nl.po @@ -4,16 +4,16 @@ msgstr "" "Project-Id-Version: phpMyAdmin 5.1.1-dev\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2021-02-24 10:09+0100\n" -"PO-Revision-Date: 2021-01-26 06:32+0000\n" +"PO-Revision-Date: 2021-02-25 23:50+0000\n" "Last-Translator: dingo thirteen \n" -"Language-Team: Dutch \n" +"Language-Team: Dutch " +"\n" "Language: nl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5\n" #: libraries/advisory_rules_generic.php:9 msgid "Uptime below one day" @@ -12497,6 +12497,8 @@ msgid "" "The routing cache could not be written, you need to adjust permissions on " "the folder/file \"%s\"" msgstr "" +"De routing cache kon niet weggeschreven worden, u moet de rechten op map/" +"bestand \"%s\" aanpassen" #: libraries/classes/Routing.php:164 #, php-format From 29c31be315c7b91efae03a5d0f603438a6cce70a Mon Sep 17 00:00:00 2001 From: William Desportes Date: Mon, 1 Mar 2021 18:43:25 +0100 Subject: [PATCH 2/8] Ref #16694 - Cover currentUserHasUserPrivilege with new tests Signed-off-by: William Desportes --- test/classes/UtilTest.php | 207 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 207 insertions(+) diff --git a/test/classes/UtilTest.php b/test/classes/UtilTest.php index a5067cea070d..adffbc7d8daa 100644 --- a/test/classes/UtilTest.php +++ b/test/classes/UtilTest.php @@ -2393,4 +2393,211 @@ public function testHandleDisableFKCheckCleanup(bool $fkChecksValue, string $set $GLOBALS['dbi'] = $oldDbi; } + + public function testCurrentUserHasPrivilegeSkipGrantTables(): void + { + $dbi = $this->getMockBuilder(DatabaseInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $dbi->expects($this->once()) + ->method('getCurrentUserAndHost') + ->will($this->returnValue(['', ''])); + + $oldDbi = $GLOBALS['dbi']; + $GLOBALS['dbi'] = $dbi; + $this->assertTrue(Util::currentUserHasPrivilege('EVENT')); + $GLOBALS['dbi'] = $oldDbi; + } + + public function testCurrentUserHasUserPrivilege(): void + { + $dbi = $this->getMockBuilder(DatabaseInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $dbi->expects($this->once()) + ->method('getCurrentUserAndHost') + ->will($this->returnValue(['groot_%', '%'])); + $dbi->expects($this->once()) + ->method('fetchValue') + ->with( + 'SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`USER_PRIVILEGES`' + . " WHERE GRANTEE='''groot_%''@''%''' AND PRIVILEGE_TYPE='EVENT'" + ) + ->will($this->returnValue('EVENT')); + + $oldDbi = $GLOBALS['dbi']; + $GLOBALS['dbi'] = $dbi; + $this->assertTrue(Util::currentUserHasPrivilege('EVENT')); + $GLOBALS['dbi'] = $oldDbi; + } + + public function testCurrentUserHasNotUserPrivilege(): void + { + $dbi = $this->getMockBuilder(DatabaseInterface::class) + ->disableOriginalConstructor() + ->getMock(); + $dbi->expects($this->once()) + ->method('getCurrentUserAndHost') + ->will($this->returnValue(['groot_%', '%'])); + $dbi->expects($this->once()) + ->method('fetchValue') + ->with( + 'SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`USER_PRIVILEGES`' + . " WHERE GRANTEE='''groot_%''@''%''' AND PRIVILEGE_TYPE='EVENT'" + ) + ->will($this->returnValue(false)); + + $oldDbi = $GLOBALS['dbi']; + $GLOBALS['dbi'] = $dbi; + $this->assertFalse(Util::currentUserHasPrivilege('EVENT')); + $GLOBALS['dbi'] = $oldDbi; + } + + public function testCurrentUserHasNotUserPrivilegeButDbPrivilege(): void + { + $dbi = $this->getMockBuilder(DatabaseInterface::class) + ->setMethods(['getCurrentUserAndHost', 'fetchValue']) + ->disableOriginalConstructor() + ->getMock(); + + $dbi->expects($this->once()) + ->method('getCurrentUserAndHost') + ->will($this->returnValue(['groot_%', '%'])); + $dbi->expects($this->exactly(2)) + ->method('fetchValue') + ->withConsecutive( + [ + 'SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`USER_PRIVILEGES`' + . " WHERE GRANTEE='''groot_%''@''%''' AND PRIVILEGE_TYPE='EVENT'", + ], + [ + 'SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`SCHEMA_PRIVILEGES`' + . " WHERE GRANTEE='''groot_%''@''%''' AND PRIVILEGE_TYPE='EVENT'" + . " AND 'my_data_base' LIKE `TABLE_SCHEMA`", + ] + ) + ->willReturnOnConsecutiveCalls( + false, + 'EVENT' + ); + + $oldDbi = $GLOBALS['dbi']; + $GLOBALS['dbi'] = $dbi; + $this->assertTrue(Util::currentUserHasPrivilege('EVENT', 'my_data_base')); + $GLOBALS['dbi'] = $oldDbi; + } + + public function testCurrentUserHasNotUserPrivilegeAndNotDbPrivilege(): void + { + $dbi = $this->getMockBuilder(DatabaseInterface::class) + ->setMethods(['getCurrentUserAndHost', 'fetchValue']) + ->disableOriginalConstructor() + ->getMock(); + + $dbi->expects($this->once()) + ->method('getCurrentUserAndHost') + ->will($this->returnValue(['groot_%', '%'])); + $dbi->expects($this->exactly(2)) + ->method('fetchValue') + ->withConsecutive( + [ + 'SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`USER_PRIVILEGES`' + . " WHERE GRANTEE='''groot_%''@''%''' AND PRIVILEGE_TYPE='EVENT'", + ], + [ + 'SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`SCHEMA_PRIVILEGES`' + . " WHERE GRANTEE='''groot_%''@''%''' AND PRIVILEGE_TYPE='EVENT'" + . " AND 'my_data_base' LIKE `TABLE_SCHEMA`", + ] + ) + ->willReturnOnConsecutiveCalls( + false, + false + ); + + $oldDbi = $GLOBALS['dbi']; + $GLOBALS['dbi'] = $dbi; + $this->assertFalse(Util::currentUserHasPrivilege('EVENT', 'my_data_base')); + $GLOBALS['dbi'] = $oldDbi; + } + + public function testCurrentUserHasNotUserPrivilegeAndNotDbPrivilegeButTablePrivilege(): void + { + $dbi = $this->getMockBuilder(DatabaseInterface::class) + ->setMethods(['getCurrentUserAndHost', 'fetchValue']) + ->disableOriginalConstructor() + ->getMock(); + + $dbi->expects($this->once()) + ->method('getCurrentUserAndHost') + ->will($this->returnValue(['groot_%', '%'])); + $dbi->expects($this->exactly(3)) + ->method('fetchValue') + ->withConsecutive( + [ + 'SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`USER_PRIVILEGES`' + . " WHERE GRANTEE='''groot_%''@''%''' AND PRIVILEGE_TYPE='EVENT'", + ], + [ + 'SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`SCHEMA_PRIVILEGES`' + . " WHERE GRANTEE='''groot_%''@''%''' AND PRIVILEGE_TYPE='EVENT'" + . " AND 'my_data_base' LIKE `TABLE_SCHEMA`", + ], + [ + 'SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`TABLE_PRIVILEGES`' + . " WHERE GRANTEE='''groot_%''@''%''' AND PRIVILEGE_TYPE='EVENT'" + . " AND 'my_data_base' LIKE `TABLE_SCHEMA` AND TABLE_NAME='my\_data\_table'", + ] + ) + ->willReturnOnConsecutiveCalls( + false, + false, + 'EVENT' + ); + + $oldDbi = $GLOBALS['dbi']; + $GLOBALS['dbi'] = $dbi; + $this->assertTrue(Util::currentUserHasPrivilege('EVENT', 'my_data_base', 'my_data_table')); + $GLOBALS['dbi'] = $oldDbi; + } + + public function testCurrentUserHasNotUserPrivilegeAndNotDbPrivilegeAndNotTablePrivilege(): void + { + $dbi = $this->getMockBuilder(DatabaseInterface::class) + ->setMethods(['getCurrentUserAndHost', 'fetchValue']) + ->disableOriginalConstructor() + ->getMock(); + + $dbi->expects($this->once()) + ->method('getCurrentUserAndHost') + ->will($this->returnValue(['groot_%', '%'])); + $dbi->expects($this->exactly(3)) + ->method('fetchValue') + ->withConsecutive( + [ + 'SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`USER_PRIVILEGES`' + . " WHERE GRANTEE='''groot_%''@''%''' AND PRIVILEGE_TYPE='EVENT'", + ], + [ + 'SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`SCHEMA_PRIVILEGES`' + . " WHERE GRANTEE='''groot_%''@''%''' AND PRIVILEGE_TYPE='EVENT'" + . " AND 'my_data_base' LIKE `TABLE_SCHEMA`", + ], + [ + 'SELECT `PRIVILEGE_TYPE` FROM `INFORMATION_SCHEMA`.`TABLE_PRIVILEGES`' + . " WHERE GRANTEE='''groot_%''@''%''' AND PRIVILEGE_TYPE='EVENT'" + . " AND 'my_data_base' LIKE `TABLE_SCHEMA` AND TABLE_NAME='my\_data\_table'", + ] + ) + ->willReturnOnConsecutiveCalls( + false, + false, + false + ); + + $oldDbi = $GLOBALS['dbi']; + $GLOBALS['dbi'] = $dbi; + $this->assertFalse(Util::currentUserHasPrivilege('EVENT', 'my_data_base', 'my_data_table')); + $GLOBALS['dbi'] = $oldDbi; + } } From cd251b9e3a0826b5809ca7f3274a3f8e998bca7a Mon Sep 17 00:00:00 2001 From: Petr Duda Date: Tue, 2 Mar 2021 17:11:28 +0000 Subject: [PATCH 3/8] Translated using Weblate (Czech) Currently translated at 100.0% (3377 of 3377 strings) [ci skip] Translation: phpMyAdmin/5.1 Translate-URL: https://hosted.weblate.org/projects/phpmyadmin/5-1/cs/ Signed-off-by: Petr Duda --- po/cs.po | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/po/cs.po b/po/cs.po index 1fada87d6627..f49c634020e6 100644 --- a/po/cs.po +++ b/po/cs.po @@ -6,16 +6,16 @@ msgstr "" "Project-Id-Version: phpMyAdmin 5.1.1-dev\n" "Report-Msgid-Bugs-To: translators@phpmyadmin.net\n" "POT-Creation-Date: 2021-02-24 10:09+0100\n" -"PO-Revision-Date: 2021-02-13 22:50+0000\n" +"PO-Revision-Date: 2021-03-02 18:02+0000\n" "Last-Translator: Petr Duda \n" -"Language-Team: Czech \n" +"Language-Team: Czech " +"\n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.5-dev\n" +"X-Generator: Weblate 4.5\n" #: libraries/advisory_rules_generic.php:9 msgid "Uptime below one day" @@ -12240,7 +12240,7 @@ msgstr "Neznámá chyba" #: libraries/classes/ReplicationGui.php:536 #, php-format msgid "Unable to connect to master %s." -msgstr "Nepodařilo se připojit k nadřízenému %s." +msgstr "Nepodařilo se připojit k nadřízenému serveru %s." #: libraries/classes/ReplicationGui.php:547 msgid "" @@ -12251,12 +12251,12 @@ msgstr "" #: libraries/classes/ReplicationGui.php:565 msgid "Unable to change master!" -msgstr "Nepodařilo se změnit nadřízeného!" +msgstr "Nepodařilo se změnit nadřízený server!" #: libraries/classes/ReplicationGui.php:569 #, php-format msgid "Master server changed successfully to %s." -msgstr "Nadřízený server bych úspěšně změněn na %s." +msgstr "Nadřízený server byl úspěšně změněn na %s." #: libraries/classes/Routing.php:101 #, php-format @@ -12264,6 +12264,8 @@ msgid "" "The routing cache could not be written, you need to adjust permissions on " "the folder/file \"%s\"" msgstr "" +"Nelze zapisovat do mezipaměti směrování, je třeba upravit oprávnění pro slož" +"ku/soubor „%s“" #: libraries/classes/Routing.php:164 #, php-format @@ -12733,7 +12735,7 @@ msgstr "Zobrazit podřízené servery" #: libraries/classes/Server/Status/Data.php:200 #: templates/server/replication/master_replication.twig:9 msgid "Show master status" -msgstr "Zobrazit stav nadřízeného" +msgstr "Zobrazit stav nadřízeného serveru" #: libraries/classes/Server/Status/Data.php:206 msgid "Show slave status" @@ -16375,12 +16377,12 @@ msgstr "Žádná oprávnění k vytváření databází" #: templates/server/replication/index.twig:18 #: templates/server/replication/master_replication.twig:3 msgid "Master replication" -msgstr "Replikace nadřízeného" +msgstr "Replikace nadřízeného serveru" #: templates/server/databases/index.twig:163 #: templates/server/replication/slave_configuration.twig:2 msgid "Slave replication" -msgstr "Replikace podřízeného" +msgstr "Replikace podřízeného serveru" #: templates/server/databases/index.twig:184 #, php-format @@ -16922,7 +16924,7 @@ msgstr "Vytvořit heslo:" #: templates/server/replication/master_configuration.twig:2 msgid "Master configuration" -msgstr "Nastavení nadřízeného" +msgstr "Nastavení nadřízeného serveru" #: templates/server/replication/master_configuration.twig:4 msgid "" @@ -17058,7 +17060,7 @@ msgstr "" #: templates/server/replication/status_table.twig:6 msgid "Master status" -msgstr "Stav nadřízeného" +msgstr "Stav nadřízeného serveru" #: templates/server/replication/status_table.twig:8 msgid "Slave status" From 0406e47128048aac428dfb966613631d47c8a8d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Meneghini=20Fauth?= Date: Wed, 3 Mar 2021 21:42:15 -0300 Subject: [PATCH 4/8] Fix type error when exporting triggers to ODF MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Introduced by a78a7a0c9c0081f6bc19f9779cd4401bfa77a09d. Signed-off-by: Maurício Meneghini Fauth --- libraries/classes/Plugins/Export/ExportOdt.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/classes/Plugins/Export/ExportOdt.php b/libraries/classes/Plugins/Export/ExportOdt.php index dc78d57be11e..f9940034865a 100644 --- a/libraries/classes/Plugins/Export/ExportOdt.php +++ b/libraries/classes/Plugins/Export/ExportOdt.php @@ -727,7 +727,7 @@ public function exportStructure( ); break; case 'triggers': - $triggers = $dbi->getTriggers($db, $table, $aliases); + $triggers = $dbi->getTriggers($db, $table); if ($triggers) { $GLOBALS['odt_buffer'] .= ' Date: Thu, 4 Mar 2021 17:50:44 +0100 Subject: [PATCH 5/8] Add a test for #16706 Signed-off-by: William Desportes --- test/classes/Gis/GisVisualizationTest.php | 70 +++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/test/classes/Gis/GisVisualizationTest.php b/test/classes/Gis/GisVisualizationTest.php index 1cdefc60fa04..67ad7a3e2fef 100644 --- a/test/classes/Gis/GisVisualizationTest.php +++ b/test/classes/Gis/GisVisualizationTest.php @@ -9,6 +9,76 @@ class GisVisualizationTest extends AbstractTestCase { + /** + * Scale the data set + */ + public function testScaleDataSet(): void + { + $gis = GisVisualization::getByData([], [ + 'mysqlVersion' => 50500, + 'spatialColumn' => 'abc', + 'isMariaDB' => false, + ]); + $this->callFunction( + $gis, + GisVisualization::class, + 'handleOptions', + [] + ); + $dataSet = $this->callFunction( + $gis, + GisVisualization::class, + 'scaleDataSet', + [ + [ + ['abc' => null],// The column is nullable + ['abc' => 2],// Some impossible test case + ], + ] + ); + $this->assertSame( + [ + 'scale' => 1, + 'x' => -15.0, + 'y' => -210.0, + 'minX' => 0.0, + 'maxX' => 0.0, + 'minY' => 0.0, + 'maxY' => 0.0, + 'height' => 450, + ], + $dataSet + ); + $dataSet = $this->callFunction( + $gis, + GisVisualization::class, + 'scaleDataSet', + [ + [ + ['abc' => null],// The column is nullable + ['abc' => 2],// Some impossible test case + ['abc' => 'MULTILINESTRING((36 140,47 233,62 75),(36 100,17 233,178 93))'], + ['abc' => 'POINT(100 250)'], + ['abc' => 'MULTIPOINT(125 50,156 250,178 143,175 80)'], + ], + ] + ); + $this->assertSame( + [ + 'scale' => 2.1, + 'x' => -38.21428571428572, + 'y' => 42.85714285714286, + 'minX' => 17.0, + 'maxX' => 178.0, + 'minY' => 50.0 , + 'maxY' => 250.0, + 'height' => 450, + + ], + $dataSet + ); + } + /** * Modify the query for an old version */ From 97f0b169389b1538191e1847266b114b6287757c Mon Sep 17 00:00:00 2001 From: William Desportes Date: Thu, 4 Mar 2021 17:51:18 +0100 Subject: [PATCH 6/8] Fix #16706 - Error when visualizing nullable geometry column Fixes: #16706 Signed-off-by: William Desportes --- libraries/classes/Gis/GisVisualization.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/libraries/classes/Gis/GisVisualization.php b/libraries/classes/Gis/GisVisualization.php index 29c829d48a5a..0fc4f816e4af 100644 --- a/libraries/classes/Gis/GisVisualization.php +++ b/libraries/classes/Gis/GisVisualization.php @@ -28,6 +28,7 @@ use function mb_substr; use function ob_get_clean; use function ob_start; +use function is_string; /** * Handles visualization of GIS data @@ -623,6 +624,9 @@ private function scaleDataSet(array $data) foreach ($data as $row) { // Figure out the data type $ref_data = $row[$this->settings['spatialColumn']]; + if (! is_string($ref_data)) { + continue; + } $type_pos = mb_strpos($ref_data, '('); if ($type_pos === false) { continue; From 12936969dcb1fe1e1d2e62925230435f95e1d765 Mon Sep 17 00:00:00 2001 From: William Desportes Date: Thu, 4 Mar 2021 20:44:48 +0100 Subject: [PATCH 7/8] Add a ChangeLog entry for #16706 Signed-off-by: William Desportes --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index e1ae5e37ac60..74dc948b5fce 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,7 @@ phpMyAdmin - ChangeLog 5.1.1 (not yet released) - issue #13325 Fixed created procedure shows up in triggers and events and vice-versa - issue Fixed adding an event shows an empty row +- issue #16706 Fixed a PHP error when visualizing a nullable geometry column 5.1.0 (2021-02-24) - issue #15350 Change Media (MIME) type references to Media type From 92fd1d1f62024db27bfa3eb8e073c23464fad1df Mon Sep 17 00:00:00 2001 From: William Desportes Date: Thu, 4 Mar 2021 20:46:32 +0100 Subject: [PATCH 8/8] Add a ChangeLog entry for 272e747e0c Ref: 272e747e0c22699b250b7125be2cf6cafeae6e60 Pull-request: #16710 Signed-off-by: William Desportes --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 74dc948b5fce..bbac78b3c64a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -5,6 +5,7 @@ phpMyAdmin - ChangeLog - issue #13325 Fixed created procedure shows up in triggers and events and vice-versa - issue Fixed adding an event shows an empty row - issue #16706 Fixed a PHP error when visualizing a nullable geometry column +- issue Fixed a PHP type error when exporting triggers to ODF 5.1.0 (2021-02-24) - issue #15350 Change Media (MIME) type references to Media type