]>
Commit | Line | Data |
---|---|---|
1 | <?php | |
2 | ||
3 | declare(strict_types=1); | |
4 | ||
5 | namespace Shaarli\Front\Controller\Admin; | |
6 | ||
7 | use Shaarli\Languages; | |
8 | use Shaarli\Render\TemplatePage; | |
9 | use Shaarli\Render\ThemeUtils; | |
10 | use Shaarli\Thumbnailer; | |
11 | use Slim\Http\Request; | |
12 | use Slim\Http\Response; | |
13 | use Throwable; | |
14 | ||
15 | /** | |
16 | * Class ConfigureController | |
17 | * | |
18 | * Slim controller used to handle Shaarli configuration page (display + save new config). | |
19 | */ | |
20 | class ConfigureController extends ShaarliAdminController | |
21 | { | |
22 | /** | |
23 | * GET /admin/configure - Displays the configuration page | |
24 | */ | |
25 | public function index(Request $request, Response $response): Response | |
26 | { | |
27 | $this->assignView('title', $this->container->conf->get('general.title', 'Shaarli')); | |
28 | $this->assignView('theme', $this->container->conf->get('resource.theme')); | |
29 | $this->assignView( | |
30 | 'theme_available', | |
31 | ThemeUtils::getThemes($this->container->conf->get('resource.raintpl_tpl')) | |
32 | ); | |
33 | $this->assignView('formatter_available', ['default', 'markdown', 'markdownExtra']); | |
34 | list($continents, $cities) = generateTimeZoneData( | |
35 | timezone_identifiers_list(), | |
36 | $this->container->conf->get('general.timezone') | |
37 | ); | |
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)); | |
42 | $this->assignView( | |
43 | 'session_protection_disabled', | |
44 | $this->container->conf->get('security.session_protection_disabled', false) | |
45 | ); | |
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)); | |
54 | $this->assignView( | |
55 | 'pagetitle', | |
56 | t('Configure') . ' - ' . $this->container->conf->get('general.title', 'Shaarli') | |
57 | ); | |
58 | ||
59 | return $response->write($this->render(TemplatePage::CONFIGURE)); | |
60 | } | |
61 | ||
62 | /** | |
63 | * POST /admin/configure - Update Shaarli's configuration | |
64 | */ | |
65 | public function save(Request $request, Response $response): Response | |
66 | { | |
67 | $this->checkToken($request); | |
68 | ||
69 | $continent = $request->getParam('continent'); | |
70 | $city = $request->getParam('city'); | |
71 | $tz = 'UTC'; | |
72 | if (null !== $continent && null !== $city && isTimeZoneValid($continent, $city)) { | |
73 | $tz = $continent . '/' . $city; | |
74 | } | |
75 | ||
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')) | |
84 | ); | |
85 | $this->container->conf->set( | |
86 | 'privacy.default_private_links', | |
87 | !empty($request->getParam('privateLinkByDefault')) | |
88 | ); | |
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'))); | |
95 | ||
96 | if (!empty($request->getParam('language'))) { | |
97 | $this->container->conf->set('translation.language', escape($request->getParam('language'))); | |
98 | } | |
99 | ||
100 | $thumbnailsMode = extension_loaded('gd') ? $request->getParam('enableThumbnails') : Thumbnailer::MODE_NONE; | |
101 | if ( | |
102 | $thumbnailsMode !== Thumbnailer::MODE_NONE | |
103 | && $thumbnailsMode !== $this->container->conf->get('thumbnails.mode', Thumbnailer::MODE_NONE) | |
104 | ) { | |
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.') . | |
109 | '</a>' | |
110 | ); | |
111 | } | |
112 | $this->container->conf->set('thumbnails.mode', $thumbnailsMode); | |
113 | ||
114 | try { | |
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.')); | |
120 | ||
121 | if ($this->container->conf->get('dev.debug', false)) { | |
122 | $this->assignView('stacktrace', $e->getMessage() . PHP_EOL . $e->getTraceAsString()); | |
123 | } | |
124 | ||
125 | return $response->write($this->render('error')); | |
126 | } | |
127 | ||
128 | $this->saveSuccessMessage(t('Configuration was saved.')); | |
129 | ||
130 | return $this->redirect($response, '/admin/configure'); | |
131 | } | |
132 | } |