aboutsummaryrefslogtreecommitdiff
path: root/cli/reconfigure.php
blob: 7450b564c3345a22f10fcc2d9a8001c269cdabd3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/usr/bin/env php
<?php
declare(strict_types=1);
require __DIR__ . '/_cli.php';

$cliOptions = new class extends CliOptionsParser {
	public string $defaultUser;
	public string $environment;
	public string $baseUrl;
	public string $language;
	public string $title;
	public bool $allowAnonymous;
	public bool $allowAnonymousRefresh;
	public string $authType;
	public bool $apiEnabled;
	public bool $allowRobots;
	public bool $disableUpdate;
	public string $dbType;
	public string $dbHost;
	public string $dbUser;
	public string $dbPassword;
	public string $dbBase;
	public string $dbPrefix;

	public function __construct() {
		$this->addOption('defaultUser', (new CliOption('default-user'))->deprecatedAs('default_user'));
		$this->addOption('environment', (new CliOption('environment')));
		$this->addOption('baseUrl', (new CliOption('base-url'))->deprecatedAs('base_url'));
		$this->addOption('language', (new CliOption('language')));
		$this->addOption('title', (new CliOption('title')));
		$this->addOption(
			'allowAnonymous',
			(new CliOption('allow-anonymous'))->withValueOptional('true')->deprecatedAs('allow_anonymous')->typeOfBool()
		);
		$this->addOption(
			'allowAnonymousRefresh',
			(new CliOption('allow-anonymous-refresh'))->withValueOptional('true')->deprecatedAs('allow_anonymous_refresh')->typeOfBool()
		);
		$this->addOption('authType', (new CliOption('auth-type'))->deprecatedAs('auth_type'));
		$this->addOption(
			'apiEnabled',
			(new CliOption('api-enabled'))->withValueOptional('true')->deprecatedAs('api_enabled')->typeOfBool()
		);
		$this->addOption(
			'allowRobots',
			(new CliOption('allow-robots'))->withValueOptional('true')->deprecatedAs('allow_robots')->typeOfBool()
		);
		$this->addOption(
			'disableUpdate',
			(new CliOption('disable-update'))->withValueOptional('true')->deprecatedAs('disable_update')->typeOfBool()
		);
		$this->addOption('dbType', (new CliOption('db-type')));
		$this->addOption('dbHost', (new CliOption('db-host')));
		$this->addOption('dbUser', (new CliOption('db-user')));
		$this->addOption('dbPassword', (new CliOption('db-password')));
		$this->addOption('dbBase', (new CliOption('db-base')));
		$this->addOption('dbPrefix', (new CliOption('db-prefix'))->withValueOptional());
		parent::__construct();
	}
};

if (!empty($cliOptions->errors)) {
	fail('FreshRSS error: ' . array_shift($cliOptions->errors) . "\n" . $cliOptions->usage);
}

fwrite(STDERR, 'Reconfiguring FreshRSS…' . "\n");

$values = [
	'default_user' => $cliOptions->defaultUser ?? null,
	'environment' => $cliOptions->environment ?? null,
	'base_url' => $cliOptions->baseUrl ?? null,
	'language' => $cliOptions->language ?? null,
	'title' => $cliOptions->title ?? null,
	'allow_anonymous' => $cliOptions->allowAnonymous ?? null,
	'allow_anonymous_refresh' => $cliOptions->allowAnonymousRefresh ?? null,
	'auth_type' => $cliOptions->authType ?? null,
	'api_enabled' => $cliOptions->apiEnabled ?? null,
	'allow_robots' => $cliOptions->allowRobots ?? null,
	'disable_update' => $cliOptions->disableUpdate ?? null,
];

$dbValues = [
	'type' => $cliOptions->dbType ?? null,
	'host' => $cliOptions->dbHost ?? null,
	'user' => $cliOptions->dbUser ?? null,
	'password' => $cliOptions->dbPassword ?? null,
	'base' => $cliOptions->dbBase ?? null,
	'prefix' => $cliOptions->dbPrefix ?? null,
];

$systemConf = FreshRSS_Context::systemConf();
foreach ($values as $name => $value) {
	if ($value !== null) {
		switch ($name) {
			case 'default_user':
				if (!FreshRSS_user_Controller::checkUsername($value)) {
					fail('FreshRSS invalid default username! default_user must be ASCII alphanumeric');
				}
				break;
			case 'environment':
				if (!in_array($value, ['development', 'production', 'silent'], true)) {
					fail('FreshRSS invalid environment! environment must be one of { development, production, silent }');
				}
				break;
			case 'auth_type':
				if (!in_array($value, ['form', 'http_auth', 'none'], true)) {
					fail('FreshRSS invalid authentication method! auth_type must be one of { form, http_auth, none }');
				}
				break;
		}
		// @phpstan-ignore assign.propertyType, property.dynamicName
		$systemConf->$name = $value;
	}
}

$db = array_merge(FreshRSS_Context::systemConf()->db,
	array_filter($dbValues, fn(?string $v): bool => $v !== null && trim($v) !== ''));

performRequirementCheck($db['type']);

assert(in_array($db['type'], ['mysql', 'pgsql', 'sqlite'], true));
FreshRSS_Context::systemConf()->db = $db;

FreshRSS_Context::systemConf()->save();

done();