Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpmyadmin/phpmyadmin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--js/src/modules/console.js3
-rw-r--r--libraries/classes/Controllers/Console/Bookmark/AddController.php58
-rw-r--r--libraries/classes/Controllers/Import/ImportController.php27
-rw-r--r--libraries/routes.php7
-rw-r--r--libraries/services_controllers.php4
-rw-r--r--test/classes/Controllers/Console/Bookmark/AddControllerTest.php97
6 files changed, 165 insertions, 31 deletions
diff --git a/js/src/modules/console.js b/js/src/modules/console.js
index 24cc89036a..d1f47b6d50 100644
--- a/js/src/modules/console.js
+++ b/js/src/modules/console.js
@@ -1086,10 +1086,9 @@ var ConsoleBookmarks = {
return;
}
$(this).prop('disabled', true);
- $.post('index.php?route=/import',
+ $.post('index.php?route=/console/bookmark/add',
{
'ajax_request': true,
- 'console_bookmark_add': 'true',
'label': $('#pma_bookmarks').find('.card.add [name=label]').val(),
'server': window.CommonParams.get('server'),
'db': $('#pma_bookmarks').find('.card.add [name=targetdb]').val(),
diff --git a/libraries/classes/Controllers/Console/Bookmark/AddController.php b/libraries/classes/Controllers/Console/Bookmark/AddController.php
new file mode 100644
index 0000000000..42b7ee6c09
--- /dev/null
+++ b/libraries/classes/Controllers/Console/Bookmark/AddController.php
@@ -0,0 +1,58 @@
+<?php
+
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Controllers\Console\Bookmark;
+
+use PhpMyAdmin\Bookmark;
+use PhpMyAdmin\Controllers\AbstractController;
+use PhpMyAdmin\DatabaseInterface;
+use PhpMyAdmin\Http\ServerRequest;
+use PhpMyAdmin\ResponseRenderer;
+use PhpMyAdmin\Template;
+
+use function __;
+use function is_string;
+
+final class AddController extends AbstractController
+{
+ /** @var DatabaseInterface */
+ private $dbi;
+
+ public function __construct(ResponseRenderer $response, Template $template, DatabaseInterface $dbi)
+ {
+ parent::__construct($response, $template);
+ $this->dbi = $dbi;
+ }
+
+ public function __invoke(ServerRequest $request): void
+ {
+ $db = $request->getParsedBodyParam('db');
+ $label = $request->getParsedBodyParam('label');
+ $bookmarkQuery = $request->getParsedBodyParam('bookmark_query');
+ $shared = $request->getParsedBodyParam('shared');
+
+ if (! is_string($label) || ! is_string($db) || ! is_string($bookmarkQuery) || ! is_string($shared)) {
+ $this->response->addJSON('message', __('Incomplete params'));
+
+ return;
+ }
+
+ $bookmarkFields = [
+ 'bkm_database' => $db,
+ 'bkm_user' => $GLOBALS['cfg']['Server']['user'],
+ 'bkm_sql_query' => $bookmarkQuery,
+ 'bkm_label' => $label,
+ ];
+ $bookmark = Bookmark::createBookmark($this->dbi, $bookmarkFields, $shared === 'true');
+ if ($bookmark === false || ! $bookmark->save()) {
+ $this->response->addJSON('message', __('Failed'));
+
+ return;
+ }
+
+ $this->response->addJSON('message', __('Succeeded'));
+ $this->response->addJSON('data', $bookmarkFields);
+ $this->response->addJSON('isShared', $shared === 'true');
+ }
+}
diff --git a/libraries/classes/Controllers/Import/ImportController.php b/libraries/classes/Controllers/Import/ImportController.php
index f4b1deaf03..a317f15e55 100644
--- a/libraries/classes/Controllers/Import/ImportController.php
+++ b/libraries/classes/Controllers/Import/ImportController.php
@@ -118,33 +118,6 @@ final class ImportController extends AbstractController
$GLOBALS['local_import_file'] = $_POST['local_import_file'] ?? null;
$GLOBALS['show_as_php'] = $_POST['show_as_php'] ?? null;
- // If it's a console bookmark add request
- if (isset($_POST['console_bookmark_add'])) {
- if (! isset($_POST['label'], $_POST['db'], $_POST['bookmark_query'], $_POST['shared'])) {
- $this->response->addJSON('message', __('Incomplete params'));
-
- return;
- }
-
- $bookmarkFields = [
- 'bkm_database' => $_POST['db'],
- 'bkm_user' => $GLOBALS['cfg']['Server']['user'],
- 'bkm_sql_query' => $_POST['bookmark_query'],
- 'bkm_label' => $_POST['label'],
- ];
- $isShared = ($_POST['shared'] === 'true');
- $bookmark = Bookmark::createBookmark($this->dbi, $bookmarkFields, $isShared);
- if ($bookmark !== false && $bookmark->save()) {
- $this->response->addJSON('message', __('Succeeded'));
- $this->response->addJSON('data', $bookmarkFields);
- $this->response->addJSON('isShared', $isShared);
- } else {
- $this->response->addJSON('message', __('Failed'));
- }
-
- return;
- }
-
// reset import messages for ajax request
$_SESSION['Import_message']['message'] = null;
$_SESSION['Import_message']['go_back_url'] = null;
diff --git a/libraries/routes.php b/libraries/routes.php
index 05d18944d4..9eadbe66bd 100644
--- a/libraries/routes.php
+++ b/libraries/routes.php
@@ -9,7 +9,7 @@ use PhpMyAdmin\Controllers\CheckRelationsController;
use PhpMyAdmin\Controllers\CollationConnectionController;
use PhpMyAdmin\Controllers\ColumnController;
use PhpMyAdmin\Controllers\Config;
-use PhpMyAdmin\Controllers\Console\Bookmark\RefreshController;
+use PhpMyAdmin\Controllers\Console\Bookmark;
use PhpMyAdmin\Controllers\Database;
use PhpMyAdmin\Controllers\DatabaseController;
use PhpMyAdmin\Controllers\ErrorReportController;
@@ -54,7 +54,10 @@ return static function (RouteCollector $routes): void {
$routes->post('/get', Config\GetConfigController::class);
$routes->post('/set', Config\SetConfigController::class);
});
- $routes->get('/console/bookmark/refresh', RefreshController::class);
+ $routes->addGroup('/console/bookmark', static function (RouteCollector $routes): void {
+ $routes->post('/add', Bookmark\AddController::class);
+ $routes->get('/refresh', Bookmark\RefreshController::class);
+ });
$routes->addGroup('/database', static function (RouteCollector $routes): void {
$routes->addGroup('/central-columns', static function (RouteCollector $routes): void {
$routes->addRoute(['GET', 'POST'], '', Database\CentralColumnsController::class);
diff --git a/libraries/services_controllers.php b/libraries/services_controllers.php
index ffbb1f6772..75ea182533 100644
--- a/libraries/services_controllers.php
+++ b/libraries/services_controllers.php
@@ -96,6 +96,10 @@ return [
'$config' => '@config',
],
],
+ Console\Bookmark\AddController::class => [
+ 'class' => Console\Bookmark\AddController::class,
+ 'arguments' => ['$response' => '@response', '$template' => '@template', '$dbi' => '@dbi'],
+ ],
Console\Bookmark\RefreshController::class => [
'class' => Console\Bookmark\RefreshController::class,
'arguments' => ['$response' => '@response', '$template' => '@template'],
diff --git a/test/classes/Controllers/Console/Bookmark/AddControllerTest.php b/test/classes/Controllers/Console/Bookmark/AddControllerTest.php
new file mode 100644
index 0000000000..29b2cf29de
--- /dev/null
+++ b/test/classes/Controllers/Console/Bookmark/AddControllerTest.php
@@ -0,0 +1,97 @@
+<?php
+
+declare(strict_types=1);
+
+namespace PhpMyAdmin\Tests\Controllers\Console\Bookmark;
+
+use PhpMyAdmin\ConfigStorage\RelationParameters;
+use PhpMyAdmin\Controllers\Console\Bookmark\AddController;
+use PhpMyAdmin\Http\ServerRequest;
+use PhpMyAdmin\Template;
+use PhpMyAdmin\Tests\AbstractTestCase;
+use PhpMyAdmin\Tests\Stubs\ResponseRenderer;
+
+/**
+ * @covers \PhpMyAdmin\Controllers\Console\Bookmark\AddController
+ */
+class AddControllerTest extends AbstractTestCase
+{
+ public function testWithInvalidParams(): void
+ {
+ $dbi = $this->createDatabaseInterface();
+ $GLOBALS['dbi'] = $dbi;
+ $response = new ResponseRenderer();
+ $request = $this->createStub(ServerRequest::class);
+ $request->method('getParsedBodyParam')->willReturnMap([
+ ['db', null, null],
+ ['label', null, null],
+ ['bookmark_query', null, null],
+ ['shared', null, null],
+ ]);
+ $controller = new AddController($response, new Template(), $dbi);
+ $controller($request);
+ $this->assertSame(['message' => 'Incomplete params'], $response->getJSONResult());
+ }
+
+ public function testWithoutRelationParameters(): void
+ {
+ $GLOBALS['cfg']['Server']['user'] = 'user';
+ $_SESSION['relation'] = [];
+ $dbi = $this->createDatabaseInterface();
+ $GLOBALS['dbi'] = $dbi;
+ $response = new ResponseRenderer();
+ $request = $this->createStub(ServerRequest::class);
+ $request->method('getParsedBodyParam')->willReturnMap([
+ ['db', null, 'test'],
+ ['label', null, 'test'],
+ ['bookmark_query', null, 'test'],
+ ['shared', null, 'test'],
+ ]);
+ $controller = new AddController($response, new Template(), $dbi);
+ $controller($request);
+ $this->assertSame(['message' => 'Failed'], $response->getJSONResult());
+ }
+
+ public function testWithValidParameters(): void
+ {
+ $GLOBALS['cfg']['Server']['user'] = 'test_user';
+ $GLOBALS['server'] = 1;
+ $_SESSION['relation'] = [];
+ $_SESSION['relation'][$GLOBALS['server']] = RelationParameters::fromArray([
+ 'user' => 'test_user',
+ 'db' => 'pmadb',
+ 'bookmarkwork' => true,
+ 'bookmark' => 'bookmark',
+ ])->toArray();
+
+ $dbiDummy = $this->createDbiDummy();
+ // phpcs:ignore Generic.Files.LineLength.TooLong
+ $dbiDummy->addResult('INSERT INTO `pmadb`.`bookmark` (id, dbase, user, query, label) VALUES (NULL, \'test_db\', \'\', \'test_query\', \'test_label\')', []);
+ $dbi = $this->createDatabaseInterface($dbiDummy);
+ $GLOBALS['dbi'] = $dbi;
+ $response = new ResponseRenderer();
+ $request = $this->createStub(ServerRequest::class);
+ $request->method('getParsedBodyParam')->willReturnMap([
+ ['db', null, 'test_db'],
+ ['label', null, 'test_label'],
+ ['bookmark_query', null, 'test_query'],
+ ['shared', null, 'true'],
+ ]);
+ $controller = new AddController($response, new Template(), $dbi);
+ $controller($request);
+ $this->assertSame(
+ [
+ 'message' => 'Succeeded',
+ 'data' => [
+ 'bkm_database' => 'test_db',
+ 'bkm_user' => 'test_user',
+ 'bkm_sql_query' => 'test_query',
+ 'bkm_label' => 'test_label',
+ ],
+ 'isShared' => true,
+ ],
+ $response->getJSONResult()
+ );
+ $dbiDummy->assertAllQueriesConsumed();
+ }
+}