3 declare(strict_types
=1);
5 namespace Shaarli\Front\Controller\Admin
;
8 use Shaarli\Render\TemplatePage
;
9 use Shaarli\Render\ThemeUtils
;
10 use Shaarli\Thumbnailer
;
11 use Slim\Http\Request
;
12 use Slim\Http\Response
;
16 * Class ConfigureController
18 * Slim controller used to handle Shaarli configuration page (display + save new config).
20 class ConfigureController
extends ShaarliAdminController
23 * GET /admin/configure - Displays the configuration page
25 public function index(Request
$request, Response
$response): Response
27 $this->assignView('title', $this->container
->conf
->get('general.title', 'Shaarli'));
28 $this->assignView('theme', $this->container
->conf
->get('resource.theme'));
31 ThemeUtils
::getThemes($this->container
->conf
->get('resource.raintpl_tpl'))
33 $this->assignView('formatter_available', ['default', 'markdown', 'markdownExtra']);
34 list($continents, $cities) = generateTimeZoneData(
35 timezone_identifiers_list(),
36 $this->container
->conf
->get('general.timezone')
38 $this->assignView('continents', $continents);
39 $this->assignView('cities', $cities);
40 $this->assignView('retrieve_description', $this->container
->conf
->get('general.retrieve_description', false));
41 $this->assignView('private_links_default', $this->container
->conf
->get('privacy.default_private_links', false));
43 'session_protection_disabled',
44 $this->container
->conf
->get('security.session_protection_disabled', false)
46 $this->assignView('enable_rss_permalinks', $this->container
->conf
->get('feed.rss_permalinks', false));
47 $this->assignView('enable_update_check', $this->container
->conf
->get('updates.check_updates', true));
48 $this->assignView('hide_public_links', $this->container
->conf
->get('privacy.hide_public_links', false));
49 $this->assignView('api_enabled', $this->container
->conf
->get('api.enabled', true));
50 $this->assignView('api_secret', $this->container
->conf
->get('api.secret'));
51 $this->assignView('languages', Languages
::getAvailableLanguages());
52 $this->assignView('gd_enabled', extension_loaded('gd'));
53 $this->assignView('thumbnails_mode', $this->container
->conf
->get('thumbnails.mode', Thumbnailer
::MODE_NONE
));
56 t('Configure') . ' - ' . $this->container
->conf
->get('general.title', 'Shaarli')
59 return $response->write($this->render(TemplatePage
::CONFIGURE
));
63 * POST /admin/configure - Update Shaarli's configuration
65 public function save(Request
$request, Response
$response): Response
67 $this->checkToken($request);
69 $continent = $request->getParam('continent');
70 $city = $request->getParam('city');
72 if (null !== $continent && null !== $city && isTimeZoneValid($continent, $city)) {
73 $tz = $continent . '/' . $city;
76 $this->container
->conf
->set('general.timezone', $tz);
77 $this->container
->conf
->set('general.title', escape($request->getParam('title')));
78 $this->container
->conf
->set('general.header_link', escape($request->getParam('titleLink')));
79 $this->container
->conf
->set('general.retrieve_description', !empty($request->getParam('retrieveDescription')));
80 $this->container
->conf
->set('resource.theme', escape($request->getParam('theme')));
81 $this->container
->conf
->set(
82 'security.session_protection_disabled',
83 !empty($request->getParam('disablesessionprotection'))
85 $this->container
->conf
->set(
86 'privacy.default_private_links',
87 !empty($request->getParam('privateLinkByDefault'))
89 $this->container
->conf
->set('feed.rss_permalinks', !empty($request->getParam('enableRssPermalinks')));
90 $this->container
->conf
->set('updates.check_updates', !empty($request->getParam('updateCheck')));
91 $this->container
->conf
->set('privacy.hide_public_links', !empty($request->getParam('hidePublicLinks')));
92 $this->container
->conf
->set('api.enabled', !empty($request->getParam('enableApi')));
93 $this->container
->conf
->set('api.secret', escape($request->getParam('apiSecret')));
94 $this->container
->conf
->set('formatter', escape($request->getParam('formatter')));
96 if (!empty($request->getParam('language'))) {
97 $this->container
->conf
->set('translation.language', escape($request->getParam('language')));
100 $thumbnailsMode = extension_loaded('gd') ? $request->getParam('enableThumbnails') : Thumbnailer
::MODE_NONE
;
102 $thumbnailsMode !== Thumbnailer
::MODE_NONE
103 && $thumbnailsMode !== $this->container
->conf
->get('thumbnails.mode', Thumbnailer
::MODE_NONE
)
105 $this->saveWarningMessage(
106 t('You have enabled or changed thumbnails mode.') .
107 '<a href="' . $this->container
->basePath
. '/admin/thumbnails">' .
108 t('Please synchronize them.') .
112 $this->container
->conf
->set('thumbnails.mode', $thumbnailsMode);
115 $this->container
->conf
->write($this->container
->loginManager
->isLoggedIn());
116 $this->container
->history
->updateSettings();
117 $this->container
->pageCacheManager
->invalidateCaches();
118 } catch (Throwable
$e) {
119 $this->assignView('message', t('Error while writing config file after configuration update.'));
121 if ($this->container
->conf
->get('dev.debug', false)) {
122 $this->assignView('stacktrace', $e->getMessage() . PHP_EOL
. $e->getTraceAsString());
125 return $response->write($this->render('error'));
128 $this->saveSuccessMessage(t('Configuration was saved.'));
130 return $this->redirect($response, '/admin/configure');