diff --git a/lib/Alchemy/Phrasea/Controller/Admin/DataboxesController.php b/lib/Alchemy/Phrasea/Controller/Admin/DataboxesController.php index a58e37671a..63e9a05cec 100644 --- a/lib/Alchemy/Phrasea/Controller/Admin/DataboxesController.php +++ b/lib/Alchemy/Phrasea/Controller/Admin/DataboxesController.php @@ -110,26 +110,14 @@ class DataboxesController extends Controller */ public function createDatabase(Request $request) { - if ('' === $dbName = $request->request->get('new_dbname', '')) { - return $this->app->redirectPath('admin_databases', ['error' => 'no-empty']); - } - - if (\p4string::hasAccent($dbName)) { - return $this->app->redirectPath('admin_databases', ['error' => 'special-chars']); - } - + $dbName = $request->request->get('new_dbname', ''); /** @var DataboxService $databoxService */ $databoxService = $this->app['databox.service']; $dataTemplate = $request->request->get('new_data_template'); - $connectionSettings = $request->request->get('new_settings') == false ? null : new DataboxConnectionSettings( - $request->request->get('new_hostname'), - $request->request->get('new_port'), - $request->request->get('new_user'), - $request->request->get('new_password') - ); try { + $connectionSettings = $this->buildSettingsFromRequest($request); $databox = $databoxService->createDatabox( $dbName, $dataTemplate, @@ -143,11 +131,17 @@ class DataboxesController extends Controller 'reload-tree' => 1 ]); } + catch (\InvalidArgumentException $exception) { + return $this->handleInvalidArgument($exception); + } catch (DBALException $e) { return $this->app->redirectPath('admin_databases', ['success' => 0, 'error' => 'database-failed']); } catch (\Exception $e) { - return $this->app->redirectPath('admin_databases', ['success' => 0, 'error' => 'base-failed']); + return $this->app->redirectPath('admin_databases', [ + 'success' => 0, + 'error' => 'base-failed' + ]); } } @@ -159,25 +153,13 @@ class DataboxesController extends Controller */ public function databaseMount(Request $request) { - if ('' === $dbName = trim($request->request->get('new_dbname', ''))) { - return $this->app->redirectPath('admin_databases', ['success' => 0, 'error' => 'no-empty']); - } - - if (\p4string::hasAccent($dbName)) { - return $this->app->redirectPath('admin_databases', ['success' => 0, 'error' => 'special-chars']); - } + $dbName = trim($request->request->get('new_dbname', '')); /** @var DataboxService $databoxService */ $databoxService = $this->app['databox.service']; - $connectionSettings = $request->request->get('new_settings') == false ? null : new DataboxConnectionSettings( - $request->request->get('new_hostname'), - $request->request->get('new_port'), - $request->request->get('new_user'), - $request->request->get('new_password') - ); - try { + $connectionSettings = $this->buildSettingsFromRequest($request); $databox = $databoxService->mountDatabox($dbName, $this->app->getAuthenticatedUser(), $connectionSettings); return $this->app->redirectPath('admin_database', [ @@ -185,11 +167,48 @@ class DataboxesController extends Controller 'success' => 1, 'reload-tree' => 1, ]); - } catch (\Exception $exception) { + } + catch (\InvalidArgumentException $exception) { + return $this->handleInvalidArgument($exception); + } + catch (\Exception $exception) { return $this->app->redirectPath('admin_databases', [ 'success' => 0, 'error' => 'mount-failed' ]); } } + + /** + * @param Request $request + * @return DataboxConnectionSettings|null + */ + protected function buildSettingsFromRequest(Request $request) + { + $connectionSettings = $request->request->get('new_settings') == false ? null : new DataboxConnectionSettings( + $request->request->get('new_hostname'), + $request->request->get('new_port'), + $request->request->get('new_user'), + $request->request->get('new_password') + ); + + return $connectionSettings; + } + + /** + * @param $exception + * @return RedirectResponse + */ + protected function handleInvalidArgument(\InvalidArgumentException $exception) + { + if ($exception->getCode() == DataboxService::EMPTY_DB_NAME) { + return $this->app->redirectPath('admin_databases', ['success' => 0, 'error' => 'no-empty']); + } + + if ($exception->getCode() == DataboxService::INVALID_DB_NAME) { + return $this->app->redirectPath('admin_databases', ['success' => 0, 'error' => 'special-chars']); + } + + throw new \InvalidArgumentException($exception->getMessage(), $exception->getCode(), $exception); + } } diff --git a/lib/Alchemy/Phrasea/Databox/DataboxService.php b/lib/Alchemy/Phrasea/Databox/DataboxService.php index 85348ac785..110b657f2f 100644 --- a/lib/Alchemy/Phrasea/Databox/DataboxService.php +++ b/lib/Alchemy/Phrasea/Databox/DataboxService.php @@ -13,6 +13,10 @@ use Doctrine\DBAL\Connection; */ class DataboxService { + + const EMPTY_DB_NAME = 0; + const INVALID_DB_NAME = 1; + /** * @var Application */ @@ -80,6 +84,8 @@ class DataboxService User $owner, DataboxConnectionSettings $connectionSettings = null ) { + $this->validateDatabaseName($databaseName); + $dataTemplate = new \SplFileInfo($this->rootPath . '/lib/conf.d/data_templates/' . $dataTemplate . '.xml'); $connectionSettings = $connectionSettings ?: DataboxConnectionSettings::fromArray( $this->configuration->get(['main', 'database']) @@ -113,6 +119,8 @@ class DataboxService */ public function mountDatabox($databaseName, User $owner, DataboxConnectionSettings $connectionSettings = null) { + $this->validateDatabaseName($databaseName); + $connectionSettings = $connectionSettings ?: DataboxConnectionSettings::fromArray( $this->configuration->get(['main', 'database']) ); @@ -141,4 +149,18 @@ class DataboxService throw new \RuntimeException($exception->getMessage(), 0, $exception); } } + + private function validateDatabaseName($databaseName) + { + if (trim($databaseName) == '') { + throw new \InvalidArgumentException('Database name cannot be empty.', self::EMPTY_DB_NAME); + } + + if (\p4string::hasAccent($databaseName)) { + throw new \InvalidArgumentException( + 'Database name cannot contain special characters.', + self::INVALID_DB_NAME + ); + } + } }