Files
Phraseanet/lib/Alchemy/Phrasea/Controller/Admin/Root.php
Nicolas Le Goff a8da584666 Merge branch '3.8'
Conflicts:
	composer.json
	composer.lock
	config/configuration.sample.yml
	lib/Alchemy/Phrasea/Application.php
	lib/Alchemy/Phrasea/Application/Api.php
	lib/Alchemy/Phrasea/Controller/Admin/Collection.php
	lib/Alchemy/Phrasea/Controller/Admin/Users.php
	lib/Alchemy/Phrasea/Controller/Prod/DoDownload.php
	lib/Alchemy/Phrasea/Controller/Prod/Export.php
	lib/Alchemy/Phrasea/Controller/Prod/Language.php
	lib/Alchemy/Phrasea/Controller/Prod/Push.php
	lib/Alchemy/Phrasea/Controller/Prod/Tooltip.php
	lib/Alchemy/Phrasea/Controller/Report/Informations.php
	lib/Alchemy/Phrasea/Controller/Report/Root.php
	lib/Alchemy/Phrasea/Controller/Root/Developers.php
	lib/Alchemy/Phrasea/Controller/Root/Login.php
	lib/Alchemy/Phrasea/Controller/Root/Session.php
	lib/Alchemy/Phrasea/Controller/Thesaurus/Xmlhttp.php
	lib/Alchemy/Phrasea/Controller/Utils/ConnectionTest.php
	lib/Alchemy/Phrasea/Controller/Utils/PathFileTest.php
	lib/Alchemy/Phrasea/Core/Version.php
	lib/Alchemy/Phrasea/Form/Login/PhraseaAuthenticationForm.php
	lib/Alchemy/Phrasea/SearchEngine/Phrasea/PhraseaEngine.php
	lib/Alchemy/Phrasea/SearchEngine/SphinxSearch/SphinxSearchEngine.php
	lib/classes/API/OAuth2/Application.php
	lib/classes/API/V1/adapter.php
	lib/classes/Feed/Adapter.php
	lib/classes/Feed/Aggregate.php
	lib/classes/Feed/Collection.php
	lib/classes/Feed/Entry/Adapter.php
	lib/classes/ZipArchiveImproved.php
	lib/classes/caption/Field/Value.php
	lib/classes/caption/record.php
	lib/classes/eventsmanager/notify/feed.php
	lib/classes/media/subdef.php
	lib/classes/module/report/connexion.php
	lib/classes/module/report/download.php
	lib/classes/record/adapter.php
	lib/classes/registry.php
	lib/classes/set/export.php
	lib/classes/setup.php
	lib/classes/task/abstract.php
	lib/classes/task/period/emptyColl.php
	lib/classes/uuid.php
	lib/conf.d/_GV_template.inc
	lib/conf.d/bases_structure.xml
	lib/conf.d/configuration.yml
	lib/conf.d/minifyGroupsConfig.php
	locale/de_DE/LC_MESSAGES/phraseanet.mo
	locale/de_DE/LC_MESSAGES/phraseanet.po
	locale/en_GB/LC_MESSAGES/phraseanet.mo
	locale/en_GB/LC_MESSAGES/phraseanet.po
	locale/fr_FR/LC_MESSAGES/phraseanet.mo
	locale/fr_FR/LC_MESSAGES/phraseanet.po
	locale/nl_NL/LC_MESSAGES/phraseanet.mo
	locale/nl_NL/LC_MESSAGES/phraseanet.po
	locale/phraseanet.pot
	templates/web/account/account.html.twig
	templates/web/account/base.html.twig
	templates/web/admin/databox/databox.html.twig
	templates/web/admin/index.html.twig
	templates/web/admin/setup.html.twig
	templates/web/admin/tree.html.twig
	templates/web/client/index.html.twig
	templates/web/common/caption.html.twig
	templates/web/common/caption_templates/answer.html.twig
	templates/web/common/caption_templates/basket_element.html.twig
	templates/web/common/caption_templates/internal_publi.html.twig
	templates/web/common/caption_templates/lazaret.html.twig
	templates/web/common/caption_templates/overview.html.twig
	templates/web/common/caption_templates/preview.html.twig
	templates/web/common/index_bootstrap.html.twig
	templates/web/common/indexfloat.html.twig
	templates/web/common/thumbnail.html.twig
	templates/web/developers/application_form.html.twig
	templates/web/lightbox/IE6/feed.html.twig
	templates/web/lightbox/IE6/validate.html.twig
	templates/web/lightbox/feed.html.twig
	templates/web/lightbox/validate.html.twig
	templates/web/prod/actions/Download/prepare.html.twig
	templates/web/prod/actions/publish/publish.html.twig
	templates/web/prod/index.html.twig
	templates/web/prod/preview/caption.html.twig
	templates/web/prod/results/answerlist.html.twig
	templates/web/thesaurus/accept.html.twig
	templates/web/thesaurus/export-text-dialog.html.twig
	templates/web/thesaurus/export-text.html.twig
	templates/web/thesaurus/export-topics-dialog.html.twig
	templates/web/thesaurus/export-topics.html.twig
	templates/web/thesaurus/index.html.twig
	templates/web/thesaurus/link-field-step1.html.twig
	templates/web/thesaurus/link-field-step2.html.twig
	templates/web/thesaurus/link-field-step3.html.twig
	templates/web/thesaurus/new-term.html.twig
	templates/web/thesaurus/properties.html.twig
	templates/web/thesaurus/search.html.twig
	templates/web/thesaurus/thesaurus.html.twig
	tests/Alchemy/Tests/Phrasea/Application/ApiJsonTest.php
	tests/Alchemy/Tests/Phrasea/Application/ApiYamlTest.php
	tests/Alchemy/Tests/Phrasea/Application/LightboxTest.php
	tests/Alchemy/Tests/Phrasea/Application/OAuth2Test.php
	tests/Alchemy/Tests/Phrasea/Application/OverviewTest.php
	tests/Alchemy/Tests/Phrasea/Authentication/PersistentCookie/ManagerTest.php
	tests/Alchemy/Tests/Phrasea/Cache/RedisCacheTest.php
	tests/Alchemy/Tests/Phrasea/Command/Compile/ConfigurationTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Admin/FieldsTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Admin/PublicationTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Admin/SubdefsTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Admin/UsersTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Api/ApiJSONPTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/BasketTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/BridgeTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/EditTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/FeedTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/LanguageTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/MoveCollectionTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/PrinterTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/PushTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/RootTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/StoryTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/ToolsTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/TooltipTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/UploadTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/UsrListsTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Prod/WorkZoneTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Root/LoginTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Root/RSSFeedTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Utils/ConnectionTestTest.php
	tests/Alchemy/Tests/Phrasea/Controller/Utils/PathFileTestTest.php
	tests/Alchemy/Tests/Phrasea/Core/Provider/FTPServiceProviderTest.php
	tests/Alchemy/Tests/Phrasea/Core/Provider/LocaleServiceProviderTest.php
	tests/Alchemy/Tests/Phrasea/Core/Provider/PhraseanetServiceProviderTest.php
	tests/Alchemy/Tests/Phrasea/Core/Provider/RegistrationServiceProviderTest.php
	tests/Alchemy/Tests/Phrasea/Core/Provider/TaskManagerServiceProviderTest.php
	tests/Alchemy/Tests/Phrasea/Http/XSendFile/NginxModeTest.php
	tests/Alchemy/Tests/Phrasea/Metadata/Tag/TfEditDateTest.php
	tests/Alchemy/Tests/Phrasea/Metadata/Tag/TfMimeTypeTest.php
	tests/Alchemy/Tests/Phrasea/SearchEngine/SearchEngineAbstractTest.php
	tests/classes/Feed/Feed_AggregateTest.php
	tests/classes/PhraseanetPHPUnitAbstract.php
	tests/db-ref.sqlite
2014-06-17 15:30:41 +02:00

472 lines
19 KiB
PHP

<?php
/*
* This file is part of Phraseanet
*
* (c) 2005-2014 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Alchemy\Phrasea\Controller\Admin;
use Alchemy\Phrasea\Exception\SessionNotFound;
use Alchemy\Phrasea\Helper\DatabaseHelper;
use Alchemy\Phrasea\Helper\PathHelper;
use Silex\Application;
use Silex\ControllerProviderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
class Root implements ControllerProviderInterface
{
public function connect(Application $app)
{
$app['controller.admin.root'] = $this;
$controllers = $app['controllers_factory'];
$app['firewall']->addMandatoryAuthentication($controllers);
$controllers->before(function (Request $request) use ($app) {
$app['firewall']->requireAccessToModule('admin');
});
$controllers->get('/', function (Application $app, Request $request) {
try {
\Session_Logger::updateClientInfos($app, 3);
} catch (SessionNotFound $e) {
return $app->redirectPath('logout');
}
$section = $request->query->get('section', false);
$available = [
'connected',
'registrations',
'taskmanager',
'base',
'bases',
'collection',
'user',
'users'
];
$feature = 'connected';
$featured = false;
$position = explode(':', $section);
if (count($position) > 0) {
if (in_array($position[0], $available)) {
$feature = $position[0];
if (isset($position[1])) {
$featured = $position[1];
}
}
}
$databoxes = $off_databoxes = [];
foreach ($app['phraseanet.appbox']->get_databoxes() as $databox) {
try {
if (!$app['acl']->get($app['authentication']->getUser())->has_access_to_sbas($databox->get_sbas_id())) {
continue;
}
$databox->get_connection();
} catch (\Exception $e) {
$off_databoxes[] = $databox;
continue;
}
$databoxes[] = $databox;
}
$params = [
'feature' => $feature,
'featured' => $featured,
'databoxes' => $databoxes,
'off_databoxes' => $off_databoxes
];
return $app['twig']->render('admin/index.html.twig', [
'module' => 'admin',
'events' => $app['events-manager'],
'module_name' => 'Admin',
'notice' => $request->query->get("notice"),
'feature' => $feature,
'featured' => $featured,
'databoxes' => $databoxes,
'off_databoxes' => $off_databoxes,
'tree' => $app['twig']->render('admin/tree.html.twig', $params),
]);
})->bind('admin');
$controllers->get('/tree/', function (Application $app, Request $request) {
try {
\Session_Logger::updateClientInfos($app, 3);
} catch (SessionNotFound $e) {
return $app->redirectPath('logout');
}
$available = [
'connected',
'registrations',
'taskmanager',
'base',
'bases',
'collection',
'user',
'users'
];
$feature = 'connected';
$featured = false;
$position = explode(':', $request->query->get('position', false));
if (count($position) > 0) {
if (in_array($position[0], $available)) {
$feature = $position[0];
if (isset($position[1])) {
$featured = $position[1];
}
}
}
$databoxes = $off_databoxes = [];
foreach ($app['phraseanet.appbox']->get_databoxes() as $databox) {
try {
if (!$app['acl']->get($app['authentication']->getUser())->has_access_to_sbas($databox->get_sbas_id())) {
continue;
}
$databox->get_connection();
} catch (\Exception $e) {
$off_databoxes[] = $databox;
continue;
}
$databoxes[] = $databox;
}
$params = [
'feature' => $feature,
'featured' => $featured,
'databoxes' => $databoxes,
'off_databoxes' => $off_databoxes
];
return $app['twig']->render('admin/tree.html.twig', $params);
})->bind('admin_display_tree');
$controllers->get('/test-paths/', function (Application $app, Request $request) {
if (!$request->isXmlHttpRequest() || !array_key_exists($request->getMimeType('json'), array_flip($request->getAcceptableContentTypes()))) {
$app->abort(400, $app->trans('Bad request format, only JSON is allowed'));
}
if (0 !== count($tests = $request->query->get('tests', []))) {
$app->abort(400, $app->trans('Missing tests parameter'));
}
if (null !== $path = $request->query->get('path')) {
$app->abort(400, $app->trans('Missing path parameter'));
}
foreach ($tests as $test) {
switch ($test) {
case 'writeable':
if (!is_writable($path)) {
$result = false;
}
break;
case 'readable':
default:
if (!is_readable($path)) {
$result = true;
}
break;
}
}
return $app->json(['results' => $result]);
})
->bind('admin_test_paths');
$controllers->get('/structure/{databox_id}/', function (Application $app, Request $request, $databox_id) {
if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
$app->abort(403);
}
$databox = $app['phraseanet.appbox']->get_databox((int) $databox_id);
$structure = $databox->get_structure();
$errors = \databox::get_structure_errors($app['translator'], $structure);
if ($updateOk = !!$request->query->get('success', false)) {
$updateOk = true;
}
if (false !== $errorsStructure = $request->query->get('error', false)) {
$errorsStructure = true;
}
return $app['twig']->render('admin/structure.html.twig', [
'databox' => $databox,
'errors' => $errors,
'structure' => $structure,
'errorsStructure' => $errorsStructure,
'updateOk' => $updateOk
]);
})->assert('databox_id', '\d+')
->bind('database_display_stucture');
$controllers->post('/structure/{databox_id}/', function (Application $app, Request $request, $databox_id) {
if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
$app->abort(403);
}
if (null === $structure = $request->request->get('structure')) {
$app->abort(400, $app->trans('Missing "structure" parameter'));
}
$errors = \databox::get_structure_errors($app['translator'], $structure);
$domst = new \DOMDocument('1.0', 'UTF-8');
$domst->preserveWhiteSpace = false;
$domst->formatOutput = true;
if (count($errors) == 0 && $domst->loadXML($structure)) {
$databox = $app['phraseanet.appbox']->get_databox($databox_id);
$databox->saveStructure($domst);
return $app->redirectPath('database_display_stucture', ['databox_id' => $databox_id, 'success' => 1]);
} else {
return $app->redirectPath('database_display_stucture', ['databox_id' => $databox_id, 'success' => 0, 'error' => 'struct']);
}
})->assert('databox_id', '\d+')
->bind('database_submit_stucture');
$controllers->get('/statusbit/{databox_id}/', function (Application $app, Request $request, $databox_id) {
if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
$app->abort(403);
}
return $app['twig']->render('admin/statusbit.html.twig', [
'databox' => $app['phraseanet.appbox']->get_databox($databox_id),
]);
})->assert('databox_id', '\d+')
->bind('database_display_statusbit');
$controllers->get('/statusbit/{databox_id}/status/{bit}/', function (Application $app, Request $request, $databox_id, $bit) {
if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
$app->abort(403);
}
$databox = $app['phraseanet.appbox']->get_databox($databox_id);
$status = $databox->get_statusbits();
switch ($errorMsg = $request->query->get('error')) {
case 'rights':
$errorMsg = $app->trans('You do not enough rights to update status');
break;
case 'too-big':
$errorMsg = $app->trans('File is too big : 64k max');
break;
case 'upload-error':
$errorMsg = $app->trans('Status icon upload failed : upload error');
break;
case 'wright-error':
$errorMsg = $app->trans('Status icon upload failed : can not write on disk');
break;
case 'unknow-error':
$errorMsg = $app->trans('Something wrong happend');
break;
}
if (isset($status[$bit])) {
$status = $status[$bit];
} else {
$status = [
"labeloff" => '',
"labelon" => '',
"img_off" => '',
"img_on" => '',
"path_off" => '',
"path_on" => '',
"searchable" => false,
"printable" => false,
];
foreach ($app['locales.available'] as $code => $language) {
$status['labels_on'][$code] = null;
$status['labels_off'][$code] = null;
}
}
return $app['twig']->render('admin/statusbit/edit.html.twig', [
'status' => $status,
'errorMsg' => $errorMsg
]);
})->assert('databox_id', '\d+')
->assert('bit', '\d+')
->bind('database_display_statusbit_form');
$controllers->post('/statusbit/{databox_id}/status/{bit}/delete/', function (Application $app, Request $request, $databox_id, $bit) {
if (!$request->isXmlHttpRequest() || !array_key_exists($request->getMimeType('json'), array_flip($request->getAcceptableContentTypes()))) {
$app->abort(400, $app->trans('Bad request format, only JSON is allowed'));
}
if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
$app->abort(403);
}
$error = false;
try {
\databox_status::deleteStatus($app, $app['phraseanet.appbox']->get_databox($databox_id), $bit);
} catch (\Exception $e) {
$error = true;
}
return $app->json(['success' => !$error]);
})
->bind('admin_statusbit_delete')
->assert('databox_id', '\d+')
->assert('bit', '\d+');
$controllers->post('/statusbit/{databox_id}/status/{bit}/', function (Application $app, Request $request, $databox_id, $bit) {
if (!$app['acl']->get($app['authentication']->getUser())->has_right_on_sbas($databox_id, 'bas_modify_struct')) {
$app->abort(403);
}
$properties = [
'searchable' => $request->request->get('searchable') ? '1' : '0',
'printable' => $request->request->get('printable') ? '1' : '0',
'name' => $request->request->get('name', ''),
'labelon' => $request->request->get('label_on', ''),
'labeloff' => $request->request->get('label_off', ''),
'labels_on' => $request->request->get('labels_on', []),
'labels_off' => $request->request->get('labels_off', []),
];
\databox_status::updateStatus($app, $databox_id, $bit, $properties);
if (null !== $request->request->get('delete_icon_off')) {
\databox_status::deleteIcon($app, $databox_id, $bit, 'off');
}
if (null !== $file = $request->files->get('image_off')) {
try {
\databox_status::updateIcon($app, $databox_id, $bit, 'off', $file);
} catch (AccessDeniedHttpException $e) {
return $app->redirectPath('database_display_statusbit_form', [
'databox_id' => $databox_id,
'bit' => $bit,
'error' => 'rights',
]);
} catch (\Exception_InvalidArgument $e) {
return $app->redirectPath('database_display_statusbit_form', [
'databox_id' => $databox_id,
'bit' => $bit,
'error' => 'unknow-error',
]);
} catch (\Exception_Upload_FileTooBig $e) {
return $app->redirectPath('database_display_statusbit_form', [
'databox_id' => $databox_id,
'bit' => $bit,
'error' => 'too-big',
]);
} catch (\Exception_Upload_Error $e) {
return $app->redirectPath('database_display_statusbit_form', [
'databox_id' => $databox_id,
'bit' => $bit,
'error' => 'upload-error',
]);
} catch (\Exception_Upload_CannotWriteFile $e) {
return $app->redirectPath('database_display_statusbit_form', [
'databox_id' => $databox_id,
'bit' => $bit,
'error' => 'wright-error',
]);
} catch (\Exception $e) {
return $app->redirectPath('database_display_statusbit_form', [
'databox_id' => $databox_id,
'bit' => $bit,
'error' => 'unknow-error',
]);
}
}
if (null !== $request->request->get('delete_icon_on')) {
\databox_status::deleteIcon($app, $databox_id, $bit, 'on');
}
if (null !== $file = $request->files->get('image_on')) {
try {
\databox_status::updateIcon($app, $databox_id, $bit, 'on', $file);
} catch (AccessDeniedHttpException $e) {
return $app->redirectPath('database_display_statusbit_form', [
'databox_id' => $databox_id,
'bit' => $bit,
'error' => 'rights',
]);
} catch (\Exception_InvalidArgument $e) {
return $app->redirectPath('database_display_statusbit_form', [
'databox_id' => $databox_id,
'bit' => $bit,
'error' => 'unknow-error',
]);
} catch (\Exception_Upload_FileTooBig $e) {
return $app->redirectPath('database_display_statusbit_form', [
'databox_id' => $databox_id,
'bit' => $bit,
'error' => 'too-big',
]);
} catch (\Exception_Upload_Error $e) {
return $app->redirectPath('database_display_statusbit_form', [
'databox_id' => $databox_id,
'bit' => $bit,
'error' => 'upload-error',
]);
} catch (\Exception_Upload_CannotWriteFile $e) {
return $app->redirectPath('database_display_statusbit_form', [
'databox_id' => $databox_id,
'bit' => $bit,
'error' => 'wright-error',
]);
} catch (\Exception $e) {
return $app->redirectPath('database_display_statusbit_form', [
'databox_id' => $databox_id,
'bit' => $bit,
'error' => 'unknow-error',
]);
}
}
return $app->redirectPath('database_display_statusbit', ['databox_id' => $databox_id, 'success' => 1]);
})->assert('databox_id', '\d+')
->assert('bit', '\d+')
->bind('database_submit_statusbit');
$controllers->get('/tests/connection/mysql/', function (Application $app, Request $request) {
$dbHelper = new DatabaseHelper($app, $request);
return $app->json($dbHelper->checkConnection());
});
$controllers->get('/tests/pathurl/path/', function (Application $app, Request $request) {
$pathHelper = new PathHelper($app, $request);
return $app->json($pathHelper->checkPath());
});
$controllers->get('/tests/pathurl/url/', function (Application $app, Request $request) {
$pathHelper = new PathHelper($app, $request);
return $app->json($pathHelper->checkUrl());
});
return $controllers;
}
}