Completed
Push — openstreetmap ( a371f7...06e980 )
by Greg
17:44 queued 07:41
created

AdminSiteController::mailForm()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 7

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 7
nc 1
nop 1
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
1
<?php
2
/**
3
 * webtrees: online genealogy
4
 * Copyright (C) 2018 webtrees development team
5
 * This program is free software: you can redistribute it and/or modify
6
 * it under the terms of the GNU General Public License as published by
7
 * the Free Software Foundation, either version 3 of the License, or
8
 * (at your option) any later version.
9
 * This program is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
 * GNU General Public License for more details.
13
 * You should have received a copy of the GNU General Public License
14
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15
 */
16
declare(strict_types=1);
17
18
namespace Fisharebest\Webtrees\Http\Controllers;
19
20
use DirectoryIterator;
21
use Fisharebest\Webtrees\Database;
22
use Fisharebest\Webtrees\File;
23
use Fisharebest\Webtrees\FlashMessages;
24
use Fisharebest\Webtrees\I18N;
25
use Fisharebest\Webtrees\Site;
26
use Fisharebest\Webtrees\Theme;
27
use Fisharebest\Webtrees\Tree;
28
use Fisharebest\Webtrees\User;
29
use Symfony\Component\HttpFoundation\JsonResponse;
30
use Symfony\Component\HttpFoundation\RedirectResponse;
31
use Symfony\Component\HttpFoundation\Request;
32
use Symfony\Component\HttpFoundation\Response;
33
34
/**
35
 * Controller for site administration.
36
 */
37
class AdminSiteController extends AbstractBaseController {
38
	protected $layout = 'layouts/administration';
39
40
	/**
41
	 * @param Request $request
42
	 *
43
	 * @return Response
44
	 */
45
	public function analyticsForm(Request $request): Response {
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

45
	public function analyticsForm(/** @scrutinizer ignore-unused */ Request $request): Response {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
46
		$title = /* I18N: e.g. http://www.google.com/analytics */
47
			I18N::translate('Tracking and analytics');
48
49
		return $this->viewResponse('admin/site-analytics', [
50
			'title' => $title,
51
		]);
52
	}
53
54
	/**
55
	 * @param Request $request
56
	 *
57
	 * @return RedirectResponse
58
	 */
59
	public function analyticsSave(Request $request): RedirectResponse {
60
		Site::setPreference('BING_WEBMASTER_ID', $request->get('BING_WEBMASTER_ID'));
61
		Site::setPreference('GOOGLE_WEBMASTER_ID', $request->get('GOOGLE_WEBMASTER_ID'));
62
		Site::setPreference('GOOGLE_ANALYTICS_ID', $request->get('GOOGLE_ANALYTICS_ID'));
63
		Site::setPreference('PIWIK_URL', $request->get('PIWIK_URL'));
64
		Site::setPreference('PIWIK_SITE_ID', $request->get('PIWIK_SITE_ID'));
65
		Site::setPreference('STATCOUNTER_PROJECT_ID', $request->get('STATCOUNTER_PROJECT_ID'));
66
		Site::setPreference('STATCOUNTER_SECURITY_ID', $request->get('STATCOUNTER_SECURITY_ID'));
67
68
		FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
69
		$url = route('admin-control-panel');
70
71
		return new RedirectResponse($url);
72
	}
73
74
	/**
75
	 * Show old user files in the data folder.
76
	 *
77
	 * @return Response
78
	 */
79
	public function cleanData(): Response {
80
		$protected = [
81
			'.htaccess',
82
			'.gitignore',
83
			'index.php',
84
			'config.ini.php',
85
		];
86
87
		// If we are storing the media in the data folder (this is the default), then don’t delete it.
88
		foreach (Tree::getAll() as $tree) {
89
			$MEDIA_DIRECTORY = $tree->getPreference('MEDIA_DIRECTORY');
90
			list($folder) = explode('/', $MEDIA_DIRECTORY);
91
92
			if ($folder !== '..') {
93
				$protected[] = $folder;
94
			}
95
		}
96
97
		$entries = [];
98
99
		foreach (new DirectoryIterator(WT_DATA_DIR) as $file) {
100
			$entries[] = $file->getFilename();
101
		}
102
		$entries = array_diff($entries, [
103
			'.',
104
			'..',
105
		]);
106
107
		return $this->viewResponse('admin/clean-data', [
108
			'title'     => I18N::translate('Clean up data folder'),
109
			'entries'   => $entries,
110
			'protected' => $protected,
111
		]);
112
	}
113
114
	/**
115
	 * Delete old user files in the data folder.
116
	 *
117
	 * @param Request $request
118
	 *
119
	 * @return RedirectResponse
120
	 */
121
	public function cleanDataAction(Request $request): RedirectResponse {
122
		$to_delete = (array) $request->get('to_delete');
123
		$to_delete = array_filter($to_delete);
124
125
		foreach ($to_delete as $path) {
126
			// Show different feedback message for files and folders.
127
			$is_dir = is_dir(WT_DATA_DIR . $path);
128
129
			if (File::delete(WT_DATA_DIR . $path)) {
130
				if ($is_dir) {
131
					FlashMessages::addMessage(I18N::translate('The folder %s has been deleted.', e($path)), 'success');
132
				} else {
133
					FlashMessages::addMessage(I18N::translate('The file %s has been deleted.', e($path)), 'success');
134
				}
135
			} else {
136
				if ($is_dir) {
137
					FlashMessages::addMessage(I18N::translate('The folder %s could not be deleted.', e($path)), 'danger');
138
				} else {
139
					FlashMessages::addMessage(I18N::translate('The file %s could not be deleted.', e($path)), 'danger');
140
				}
141
			}
142
		}
143
144
		return new RedirectResponse(route('admin-control-panel'));
145
	}
146
147
	/**
148
	 * @param Request $request
149
	 *
150
	 * @return Response
151
	 */
152
	public function languagesForm(Request $request): Response {
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

152
	public function languagesForm(/** @scrutinizer ignore-unused */ Request $request): Response {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
153
		$language_tags = [];
154
		foreach (I18N::activeLocales() as $active_locale) {
155
			$language_tags[] = $active_locale->languageTag();
156
		}
157
158
		$title = I18N::translate('Languages');
159
160
		return $this->viewResponse('admin/site-languages', [
161
			'language_tags' => $language_tags,
162
			'title'         => $title,
163
		]);
164
	}
165
166
	/**
167
	 * @param Request $request
168
	 *
169
	 * @return RedirectResponse
170
	 */
171
	public function languagesSave(Request $request): RedirectResponse {
172
		Site::setPreference('LANGUAGES', implode(',', $request->get('LANGUAGES', [])));
173
174
		FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
175
		$url = route('admin-control-panel');
176
177
		return new RedirectResponse($url);
178
	}
179
180
	/**
181
	 * @param Request $request
182
	 *
183
	 * @return Response
184
	 */
185
	public function logs(Request $request): Response {
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

185
	public function logs(/** @scrutinizer ignore-unused */ Request $request): Response {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
186
		$tree_options = ['' => ''] + Tree::getNameList();
187
188
		$user_options = ['' => ''];
189
		foreach (User::all() as $tmp_user) {
190
			$user_options[$tmp_user->getUserName()] = $tmp_user->getUserName();
191
		}
192
193
		$title = I18N::translate('Website logs');
194
195
		return $this->viewResponse('admin/site-logs', [
196
			'tree_options' => $tree_options,
197
			'title'        => $title,
198
			'user_options' => $user_options,
199
		]);
200
	}
201
202
	/**
203
	 * @param Request $request
204
	 *
205
	 * @return JsonResponse
206
	 */
207
	public function logsData(Request $request): JsonResponse {
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

207
	public function logsData(/** @scrutinizer ignore-unused */ Request $request): JsonResponse {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
208
209
		$data = null;
210
211
		return new JsonResponse($data);
212
	}
213
214
	/**
215
	 * @param Request $request
216
	 *
217
	 * @return Response
218
	 */
219
	public function logsExport(Request $request): Response {
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

219
	public function logsExport(/** @scrutinizer ignore-unused */ Request $request): Response {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
220
221
		$data = '';
222
223
		return new Response($data);
224
	}
225
226
	/**
227
	 * @param Request $request
228
	 *
229
	 * @return Response
230
	 */
231
	public function mailForm(Request $request): Response {
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

231
	public function mailForm(/** @scrutinizer ignore-unused */ Request $request): Response {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
232
		$mail_ssl_options       = $this->mailSslOptions();
233
		$mail_transport_options = $this->mailTransportOptions();
234
235
		$title = I18N::translate('Sending email');
236
237
		return $this->viewResponse('admin/site-mail', [
238
			'mail_ssl_options'       => $mail_ssl_options,
239
			'mail_transport_options' => $mail_transport_options,
240
			'title'                  => $title,
241
		]);
242
	}
243
244
	/**
245
	 * @param Request $request
246
	 *
247
	 * @return RedirectResponse
248
	 */
249
	public function mailSave(Request $request): RedirectResponse {
250
		Site::setPreference('SMTP_ACTIVE', $request->get('SMTP_ACTIVE'));
251
		Site::setPreference('SMTP_FROM_NAME', $request->get('SMTP_FROM_NAME'));
252
		Site::setPreference('SMTP_HOST', $request->get('SMTP_HOST'));
253
		Site::setPreference('SMTP_PORT', $request->get('SMTP_PORT'));
254
		Site::setPreference('SMTP_AUTH', $request->get('SMTP_AUTH'));
255
		Site::setPreference('SMTP_AUTH_USER', $request->get('SMTP_AUTH_USER'));
256
		Site::setPreference('SMTP_SSL', $request->get('SMTP_SSL'));
257
		Site::setPreference('SMTP_HELO', $request->get('SMTP_HELO'));
258
		if ($request->get('SMTP_AUTH_PASS', '') !== '') {
259
			Site::setPreference('SMTP_AUTH_PASS', $request->get('SMTP_AUTH_PASS'));
260
		}
261
262
		FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
263
		$url = route('admin-control-panel');
264
265
		return new RedirectResponse($url);
266
	}
267
268
	/**
269
	 * @param Request $request
270
	 *
271
	 * @return Response
272
	 */
273
	public function preferencesForm(Request $request): Response {
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

273
	public function preferencesForm(/** @scrutinizer ignore-unused */ Request $request): Response {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
274
		$all_themes = Theme::themeNames();
275
276
		$title = I18N::translate('Website preferences');
277
278
		return $this->viewResponse('admin/site-preferences', [
279
			'all_themes' => $all_themes,
280
			'title'      => $title,
281
		]);
282
	}
283
284
	/**
285
	 * @param Request $request
286
	 *
287
	 * @return RedirectResponse
288
	 */
289
	public function preferencesSave(Request $request): RedirectResponse {
290
		$INDEX_DIRECTORY = $request->get('INDEX_DIRECTORY');
291
		if (substr($INDEX_DIRECTORY, -1) !== '/') {
292
			$INDEX_DIRECTORY .= '/';
293
		}
294
		if (File::mkdir($INDEX_DIRECTORY)) {
295
			Site::setPreference('INDEX_DIRECTORY', $INDEX_DIRECTORY);
296
		} else {
297
			FlashMessages::addMessage(I18N::translate('The folder %s does not exist, and it could not be created.', e($INDEX_DIRECTORY)), 'danger');
298
		}
299
300
		Site::setPreference('MEMORY_LIMIT', $request->get('MEMORY_LIMIT'));
301
		Site::setPreference('MAX_EXECUTION_TIME', (string) (int) $request->get('MAX_EXECUTION_TIME'));
302
		Site::setPreference('ALLOW_USER_THEMES', (string) (bool) $request->get('ALLOW_USER_THEMES'));
303
		Site::setPreference('THEME_DIR', $request->get('THEME_DIR'));
304
		Site::setPreference('ALLOW_CHANGE_GEDCOM', (string) (bool) $request->get('ALLOW_CHANGE_GEDCOM'));
305
		Site::setPreference('SESSION_TIME', (string) (int) $request->get('SESSION_TIME'));
306
		Site::setPreference('TIMEZONE', $request->get('TIMEZONE'));
307
308
		FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
309
		$url = route('admin-control-panel');
310
311
		return new RedirectResponse($url);
312
	}
313
314
	/**
315
	 * @param Request $request
316
	 *
317
	 * @return Response
318
	 */
319
	public function registrationForm(Request $request): Response {
0 ignored issues
show
Unused Code introduced by
The parameter $request is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

319
	public function registrationForm(/** @scrutinizer ignore-unused */ Request $request): Response {

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
320
		$title = I18N::translate('Sign-in and registration');
321
322
		$registration_text_options = $this->registrationTextOptions();
323
324
		return $this->viewResponse('admin/site-registration', [
325
			'registration_text_options' => $registration_text_options,
326
			'title'                     => $title,
327
		]);
328
	}
329
330
	/**
331
	 * @param Request $request
332
	 *
333
	 * @return RedirectResponse
334
	 */
335
	public function registrationSave(Request $request): RedirectResponse {
336
		Site::setPreference('WELCOME_TEXT_AUTH_MODE', $request->get('WELCOME_TEXT_AUTH_MODE'));
337
		Site::setPreference('WELCOME_TEXT_AUTH_MODE_' . WT_LOCALE, $request->get('WELCOME_TEXT_AUTH_MODE_4'));
338
		Site::setPreference('USE_REGISTRATION_MODULE', (string) (bool) $request->get('USE_REGISTRATION_MODULE'));
339
		Site::setPreference('SHOW_REGISTER_CAUTION', (string) (bool) $request->get('SHOW_REGISTER_CAUTION'));
340
341
		FlashMessages::addMessage(I18N::translate('The website preferences have been updated.'), 'success');
342
		$url = route('admin-control-panel');
343
344
		return new RedirectResponse($url);
345
	}
346
347
	/**
348
	 * Show the server information page.
349
	 *
350
	 * @return Response
351
	 */
352
	public function serverInformation(): Response {
353
		$mysql_variables = Database::prepare("SHOW VARIABLES")->fetchAssoc();
354
		$mysql_variables = array_map(function ($text) {
355
			return str_replace(',', ', ', $text);
356
		}, $mysql_variables);
357
358
		ob_start();
359
		phpinfo(INFO_ALL & ~INFO_CREDITS & ~INFO_LICENSE);
360
		$phpinfo = ob_get_clean();
361
		preg_match('%<body>(.*)</body>%s', $phpinfo, $matches);
362
		$phpinfo = $matches[1];
363
364
		return $this->viewResponse('admin/server-information', [
365
			'title'           => I18N::translate('Server information'),
366
			'phpinfo'         => $phpinfo,
367
			'mysql_variables' => $mysql_variables,
368
		]);
369
	}
370
371
	/**
372
	 * A list SSL modes (e.g. for an edit control).
373
	 *
374
	 * @return string[]
375
	 */
376
	private function mailSslOptions() {
377
		return [
378
			'none' => I18N::translate('none'),
379
			/* I18N: Secure Sockets Layer - a secure communications protocol*/
380
			'ssl'  => I18N::translate('ssl'),
381
			/* I18N: Transport Layer Security - a secure communications protocol */
382
			'tls'  => I18N::translate('tls'),
383
		];
384
	}
385
386
	/**
387
	 * A list SSL modes (e.g. for an edit control).
388
	 *
389
	 * @return string[]
390
	 */
391
	private function mailTransportOptions() {
392
		$options = [
393
			'internal' => I18N::translate('Use PHP mail to send messages'),
394
			'sendmail' => /* I18N: "sendmail" is the name of some mail software */
395
				I18N::translate('Use sendmail to send messages'),
396
			'external' => I18N::translate('Use SMTP to send messages'),
397
		];
398
399
		if (!function_exists('proc_open')) {
400
			unset($options['sendmail']);
401
		}
402
403
		return $options;
404
	}
405
406
	/**
407
	 * A list of registration rules (e.g. for an edit control).
408
	 *
409
	 * @return string[]
410
	 */
411
	private function registrationTextOptions() {
412
		return [
413
			0 => I18N::translate('No predefined text'),
414
			1 => I18N::translate('Predefined text that states all users can request a user account'),
415
			2 => I18N::translate('Predefined text that states admin will decide on each request for a user account'),
416
			3 => I18N::translate('Predefined text that states only family members can request a user account'),
417
			4 => I18N::translate('Choose user defined welcome text typed below'),
418
		];
419
	}
420
}
421