]> git.mxchange.org Git - friendica.git/blob - src/Module/Install.php
Merge pull request #7044 from MrPetovan/task/router
[friendica.git] / src / Module / Install.php
1 <?php
2
3 namespace Friendica\Module;
4
5 use Friendica\App;
6 use Friendica\BaseModule;
7 use Friendica\Core;
8 use Friendica\Core\Config\Cache\IConfigCache;
9 use Friendica\Core\L10n;
10 use Friendica\Core\Renderer;
11 use Friendica\Util\BasePath;
12 use Friendica\Util\BaseURL;
13 use Friendica\Util\Strings;
14 use Friendica\Util\Temporal;
15
16 class Install extends BaseModule
17 {
18         /**
19          * Step one - System check
20          */
21         const SYSTEM_CHECK = 1;
22         /**
23          * Step two - Base information
24          */
25         const BASE_CONFIG = 2;
26         /**
27          * Step three - Database configuration
28          */
29         const DATABASE_CONFIG = 3;
30         /**
31          * Step four - Adapt site settings
32          */
33         const SITE_SETTINGS = 4;
34         /**
35          * Step five - All steps finished
36          */
37         const FINISHED = 5;
38
39         /**
40          * @var int The current step of the wizard
41          */
42         private static $currentWizardStep;
43
44         /**
45          * @var Core\Installer The installer
46          */
47         private static $installer;
48
49         public static function init()
50         {
51                 $a = self::getApp();
52
53                 if (!$a->getMode()->isInstall()) {
54                         Core\System::httpExit(403);
55                 }
56
57                 // route: install/testrwrite
58                 // $baseurl/install/testrwrite to test if rewrite in .htaccess is working
59                 // @TODO: Replace with parameter from router
60                 if ($a->getArgumentValue(1, '') == 'testrewrite') {
61                         // Status Code 204 means that it worked without content
62                         Core\System::httpExit(204);
63                 }
64
65                 self::$installer = new Core\Installer();
66
67                 // get basic installation information and save them to the config cache
68                 $configCache = $a->getConfigCache();
69                 self::$installer->setUpCache($configCache, BasePath::create($a->getBasePath(), $_SERVER));
70
71                 // We overwrite current theme css, because during install we may not have a working mod_rewrite
72                 // so we may not have a css at all. Here we set a static css file for the install procedure pages
73                 Renderer::$theme['stylesheet'] = $a->getBaseURL() . '/view/install/style.css';
74
75                 self::$currentWizardStep = defaults($_POST, 'pass', self::SYSTEM_CHECK);
76         }
77
78         public static function post()
79         {
80                 $a = self::getApp();
81                 $configCache = $a->getConfigCache();
82
83                 switch (self::$currentWizardStep) {
84                         case self::SYSTEM_CHECK:
85                         case self::BASE_CONFIG:
86                                 self::checkSetting($configCache, $_POST, 'config', 'php_path');
87                                 break;
88
89                         case self::DATABASE_CONFIG:
90                                 self::checkSetting($configCache, $_POST, 'config', 'php_path');
91
92                                 self::checkSetting($configCache, $_POST, 'config', 'hostname');
93                                 self::checkSetting($configCache, $_POST, 'system', 'ssl_policy');
94                                 self::checkSetting($configCache, $_POST, 'system', 'basepath');
95                                 self::checkSetting($configCache, $_POST, 'system', 'urlpath');
96                                 break;
97
98                         case self::SITE_SETTINGS:
99                                 self::checkSetting($configCache, $_POST, 'config', 'php_path');
100
101                                 self::checkSetting($configCache, $_POST, 'config', 'hostname');
102                                 self::checkSetting($configCache, $_POST, 'system', 'ssl_policy');
103                                 self::checkSetting($configCache, $_POST, 'system', 'basepath');
104                                 self::checkSetting($configCache, $_POST, 'system', 'urlpath');
105
106                                 self::checkSetting($configCache, $_POST, 'database', 'hostname', Core\Installer::DEFAULT_HOST);
107                                 self::checkSetting($configCache, $_POST, 'database', 'username', '');
108                                 self::checkSetting($configCache, $_POST, 'database', 'password', '');
109                                 self::checkSetting($configCache, $_POST, 'database', 'database', '');
110
111                                 // If we cannot connect to the database, return to the previous step
112                                 if (!self::$installer->checkDB($configCache, $a->getProfiler())) {
113                                         self::$currentWizardStep = self::DATABASE_CONFIG;
114                                 }
115
116                                 break;
117
118                         case self::FINISHED:
119                                 self::checkSetting($configCache, $_POST, 'config', 'php_path');
120
121                                 self::checkSetting($configCache, $_POST, 'config', 'hostname');
122                                 self::checkSetting($configCache, $_POST, 'system', 'ssl_policy');
123                                 self::checkSetting($configCache, $_POST, 'system', 'basepath');
124                                 self::checkSetting($configCache, $_POST, 'system', 'urlpath');
125
126                                 self::checkSetting($configCache, $_POST, 'database', 'hostname', Core\Installer::DEFAULT_HOST);
127                                 self::checkSetting($configCache, $_POST, 'database', 'username', '');
128                                 self::checkSetting($configCache, $_POST, 'database', 'password', '');
129                                 self::checkSetting($configCache, $_POST, 'database', 'database', '');
130
131                                 self::checkSetting($configCache, $_POST, 'system', 'default_timezone', Core\Installer::DEFAULT_TZ);
132                                 self::checkSetting($configCache, $_POST, 'system', 'language', Core\Installer::DEFAULT_LANG);
133                                 self::checkSetting($configCache, $_POST, 'config', 'admin_email', '');
134
135                                 // If we cannot connect to the database, return to the Database config wizard
136                                 if (!self::$installer->checkDB($configCache, $a->getProfiler())) {
137                                         self::$currentWizardStep = self::DATABASE_CONFIG;
138                                         return;
139                                 }
140
141                                 if (!self::$installer->createConfig($configCache)) {
142                                         return;
143                                 }
144
145                                 self::$installer->installDatabase($configCache->get('system', 'basepath'));
146
147                                 break;
148                 }
149         }
150
151         public static function content()
152         {
153                 $a = self::getApp();
154                 $configCache = $a->getConfigCache();
155
156                 $output = '';
157
158                 $install_title = L10n::t('Friendica Communications Server - Setup');
159
160                 switch (self::$currentWizardStep) {
161                         case self::SYSTEM_CHECK:
162                                 $php_path = $configCache->get('config', 'php_path');
163
164                                 $status = self::$installer->checkEnvironment($a->getBaseURL(), $php_path);
165
166                                 $tpl = Renderer::getMarkupTemplate('install_checks.tpl');
167                                 $output .= Renderer::replaceMacros($tpl, [
168                                         '$title'       => $install_title,
169                                         '$pass'        => L10n::t('System check'),
170                                         '$checks'      => self::$installer->getChecks(),
171                                         '$passed'      => $status,
172                                         '$see_install' => L10n::t('Please see the file "INSTALL.txt".'),
173                                         '$next'        => L10n::t('Next'),
174                                         '$reload'      => L10n::t('Check again'),
175                                         '$php_path'    => $php_path,
176                                 ]);
177                                 break;
178
179                         case self::BASE_CONFIG:
180                                 $ssl_choices = [
181                                         BaseURL::SSL_POLICY_NONE     => L10n::t("No SSL policy, links will track page SSL state"),
182                                         BaseURL::SSL_POLICY_FULL     => L10n::t("Force all links to use SSL"),
183                                         BaseURL::SSL_POLICY_SELFSIGN => L10n::t("Self-signed certificate, use SSL for local links only \x28discouraged\x29")
184                                 ];
185
186                                 $tpl = Renderer::getMarkupTemplate('install_base.tpl');
187                                 $output .= Renderer::replaceMacros($tpl, [
188                                         '$title'      => $install_title,
189                                         '$pass'       => L10n::t('Base settings'),
190                                         '$ssl_policy' => ['system-ssl_policy',
191                                                 L10n::t("SSL link policy"),
192                                                 $configCache->get('system', 'ssl_policy'),
193                                                 L10n::t("Determines whether generated links should be forced to use SSL"),
194                                                 $ssl_choices],
195                                         '$hostname'   => ['config-hostname',
196                                                 L10n::t('Host name'),
197                                                 $configCache->get('config', 'hostname'),
198                                                 L10n::t('Overwrite this field in case the determinated hostname isn\'t right, otherweise leave it as is.'),
199                                                 'required'],
200                                         '$basepath'   => ['system-basepath',
201                                                 L10n::t("Base path to installation"),
202                                                 $configCache->get('system', 'basepath'),
203                                                 L10n::t("If the system cannot detect the correct path to your installation, enter the correct path here. This setting should only be set if you are using a restricted system and symbolic links to your webroot."),
204                                                 'required'],
205                                         '$urlpath'    => ['system-urlpath',
206                                                 L10n::t('Sub path of the URL'),
207                                                 $configCache->get('system', 'urlpath'),
208                                                 L10n::t('Overwrite this field in case the sub path determination isn\'t right, otherwise leave it as is. Leaving this field blank means the installation is at the base URL without sub path.'),
209                                                 ''],
210                                         '$php_path'   => $configCache->get('config', 'php_path'),
211                                         '$submit'     => L10n::t('Submit'),
212                                 ]);
213                                 break;
214
215                         case self::DATABASE_CONFIG:
216                                 $tpl = Renderer::getMarkupTemplate('install_db.tpl');
217                                 $output .= Renderer::replaceMacros($tpl, [
218                                         '$title'      => $install_title,
219                                         '$pass'       => L10n::t('Database connection'),
220                                         '$info_01'    => L10n::t('In order to install Friendica we need to know how to connect to your database.'),
221                                         '$info_02'    => L10n::t('Please contact your hosting provider or site administrator if you have questions about these settings.'),
222                                         '$info_03'    => L10n::t('The database you specify below should already exist. If it does not, please create it before continuing.'),
223                                         'checks'      => self::$installer->getChecks(),
224                                         '$hostname'   => $configCache->get('config', 'hostname'),
225                                         '$ssl_policy' => $configCache->get('system', 'ssl_policy'),
226                                         '$basepath'   => $configCache->get('system', 'basepath'),
227                                         '$urlpath'    => $configCache->get('system', 'urlpath'),
228                                         '$dbhost'     => ['database-hostname',
229                                                 L10n::t('Database Server Name'),
230                                                 $configCache->get('database', 'hostname'),
231                                                 '',
232                                                 'required'],
233                                         '$dbuser'     => ['database-username',
234                                                 L10n::t('Database Login Name'),
235                                                 $configCache->get('database', 'username'),
236                                                 '',
237                                                 'required',
238                                                 'autofocus'],
239                                         '$dbpass'     => ['database-password',
240                                                 L10n::t('Database Login Password'),
241                                                 $configCache->get('database', 'password'),
242                                                 L10n::t("For security reasons the password must not be empty"),
243                                                 'required'],
244                                         '$dbdata'     => ['database-database',
245                                                 L10n::t('Database Name'),
246                                                 $configCache->get('database', 'database'),
247                                                 '',
248                                                 'required'],
249                                         '$lbl_10'     => L10n::t('Please select a default timezone for your website'),
250                                         '$php_path'   => $configCache->get('config', 'php_path'),
251                                         '$submit'     => L10n::t('Submit')
252                                 ]);
253                                 break;
254
255                         case self::SITE_SETTINGS:
256                                 /* Installed langs */
257                                 $lang_choices = L10n::getAvailableLanguages();
258
259                                 $tpl = Renderer::getMarkupTemplate('install_settings.tpl');
260                                 $output .= Renderer::replaceMacros($tpl, [
261                                         '$title'      => $install_title,
262                                         '$checks'     => self::$installer->getChecks(),
263                                         '$pass'       => L10n::t('Site settings'),
264                                         '$hostname'   => $configCache->get('config', 'hostname'),
265                                         '$ssl_policy' => $configCache->get('system', 'ssl_policy'),
266                                         '$basepath'   => $configCache->get('system', 'basepath'),
267                                         '$urlpath'    => $configCache->get('system', 'urlpath'),
268                                         '$dbhost'     => $configCache->get('database', 'hostname'),
269                                         '$dbuser'     => $configCache->get('database', 'username'),
270                                         '$dbpass'     => $configCache->get('database', 'password'),
271                                         '$dbdata'     => $configCache->get('database', 'database'),
272                                         '$adminmail'  => ['config-admin_email',
273                                                 L10n::t('Site administrator email address'),
274                                                 $configCache->get('config', 'admin_email'),
275                                                 L10n::t('Your account email address must match this in order to use the web admin panel.'),
276                                                 'required', 'autofocus', 'email'],
277                                         '$timezone'   => Temporal::getTimezoneField('system-default_timezone',
278                                                 L10n::t('Please select a default timezone for your website'),
279                                                 $configCache->get('system', 'default_timezone'),
280                                                 ''),
281                                         '$language'   => ['system-language',
282                                                 L10n::t('System Language:'),
283                                                 $configCache->get('system', 'language'),
284                                                 L10n::t('Set the default language for your Friendica installation interface and to send emails.'),
285                                                 $lang_choices],
286                                         '$php_path'   => $configCache->get('config', 'php_path'),
287                                         '$submit'     => L10n::t('Submit')
288                                 ]);
289                                 break;
290
291                         case self::FINISHED:
292                                 $db_return_text = "";
293
294                                 if (count(self::$installer->getChecks()) == 0) {
295                                         $txt = '<p style="font-size: 130%;">';
296                                         $txt .= L10n::t('Your Friendica site database has been installed.') . EOL;
297                                         $db_return_text .= $txt;
298                                 }
299
300                                 $tpl = Renderer::getMarkupTemplate('install_finished.tpl');
301                                 $output .= Renderer::replaceMacros($tpl, [
302                                         '$title'  => $install_title,
303                                         '$checks' => self::$installer->getChecks(),
304                                         '$pass'   => L10n::t('Installation finished'),
305                                         '$text'   => $db_return_text . self::whatNext($a),
306                                 ]);
307
308                                 break;
309                 }
310
311                 return $output;
312         }
313
314         /**
315          * Creates the text for the next steps
316          *
317          * @param App $a The global App
318          *
319          * @return string The text for the next steps
320          * @throws \Friendica\Network\HTTPException\InternalServerErrorException
321          */
322         private static function whatNext($a)
323         {
324                 $baseurl = $a->getBaseUrl();
325                 return
326                         L10n::t('<h1>What next</h1>')
327                         . "<p>".L10n::t('IMPORTANT: You will need to [manually] setup a scheduled task for the worker.')
328                         . L10n::t('Please see the file "INSTALL.txt".')
329                         . "</p><p>"
330                         . L10n::t('Go to your new Friendica node <a href="%s/register">registration page</a> and register as new user. Remember to use the same email you have entered as administrator email. This will allow you to enter the site admin panel.', $baseurl)
331                         . "</p>";
332         }
333
334         /**
335          * Checks the $_POST settings and updates the config Cache for it
336          *
337          * @param IConfigCache $configCache The current config cache
338          * @param array        $post        The $_POST data
339          * @param string       $cat         The category of the setting
340          * @param string       $key         The key of the setting
341          * @param null|string  $default     The default value
342          */
343         private static function checkSetting(IConfigCache $configCache, array $post, $cat, $key, $default = null)
344         {
345                 $configCache->set($cat, $key,
346                         Strings::escapeTags(
347                                 trim(defaults($post, sprintf('%s-%s', $cat, $key),
348                                                 (!isset($default) ? $configCache->get($cat, $key) : $default))
349                                 )
350                         )
351                 );
352         }
353 }