Completed
Branch master (6a6544)
by Pierre-Henry
33:43
created

_install/controllers/InstallController.php (8 issues)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
0 ignored issues
show
Coding Style Compatibility introduced by
For compatibility and reusability of your code, PSR1 recommends that a file should introduce either new symbols (like classes, functions, etc.) or have side-effects (like outputting something, or including other files), but not both at the same time. The first symbol is defined on line 17 and the first side effect is on line 12.

The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.

The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.

To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.

Loading history...
2
/**
3
 * @title            InstallController Class
4
 *
5
 * @author           Pierre-Henry Soria <[email protected]>
6
 * @copyright        (c) 2012-2017, Pierre-Henry Soria. All Rights Reserved.
7
 * @license          GNU General Public License; See PH7.LICENSE.txt and PH7.COPYRIGHT.txt in the root directory.
8
 * @package          PH7 / Install / Controller
9
 */
10
11
namespace PH7;
12
defined('PH7') or exit('Restricted access');
13
14
// Reset the time limit
15
@set_time_limit(0);
16
17
class InstallController extends Controller
18
{
19
    /**
20
     * Enable/Disable Modules according to the chosen niche
21
     */
22
    const SOCIAL_MODS = [
23
        'connect' => '0',
24
        'affiliate' => '0',
25
        'game' => '1',
26
        'chat' => '0',
27
        'chatroulette' => '0',
28
        'picture' => '1',
29
        'video' => '1',
30
        'hotornot' => '0',
31
        'forum' => '1',
32
        'note' => '1',
33
        'blog' => '1',
34
        'newsletter' => '0',
35
        'invite' => '1',
36
        'webcam' => '1',
37
        'love-calculator' => '0',
38
        'mail' => '1',
39
        'im' => '1',
40
        'user-dashboard' => '0',
41
        'related-profile' => '1',
42
        'friend' => '1'
43
    ];
44
45
    const DATING_MODS = [
46
        'connect' => '0',
47
        'affiliate' => '1',
48
        'game' => '0',
49
        'chat' => '1',
50
        'chatroulette' => '1',
51
        'picture' => '1',
52
        'video' => '0',
53
        'hotornot' => '1',
54
        'forum' => '0',
55
        'note' => '0',
56
        'blog' => '1',
57
        'newsletter' => '1',
58
        'invite' => '0',
59
        'webcam' => '0',
60
        'love-calculator' => '1',
61
        'mail' => '1',
62
        'im' => '1',
63
        'user-dashboard' => '1',
64
        'related-profile' => '1',
65
        'friend' => '0'
66
    ];
67
68
    /**
69
     * Enable/Disable Site Settings according to the chosen niche
70
     */
71
    const SOCIAL_SETTINGS = [
72
        'social_media_widgets' => '1'
73
    ];
74
75
    const DATING_SETTINGS = [
76
        'social_media_widgets' => '0'
77
    ];
78
79
80
    /********************* STEP 1 *********************/
81
    public function index()
82
    {
83
        $aLangs = get_dir_list(PH7_ROOT_INSTALL . 'langs/');
84
        $aLangsList = include PH7_ROOT_INSTALL . 'inc/lang_list.inc.php';
85
        $sLangSelect = '';
86
87
        foreach ($aLangs as $sLang)
88
        {
89
            $sSel = (empty($_REQUEST['l']) ? $sLang == $this->sCurrentLang ? '" selected="selected' : '' : ($sLang == $_REQUEST['l']) ? '" selected="selected' : '');
90
            $sLangSelect .= '<option value="?l=' . $sLang . $sSel . '">' . $aLangsList[$sLang] . '</option>';
91
        }
92
93
        $this->oView->assign('lang_select', $sLangSelect);
94
        $this->oView->assign('sept_number', 1);
95
        $this->oView->display('index.tpl');
96
    }
97
98
    /********************* STEP 2 *********************/
99
    public function config_path()
100
    {
101
        global $LANG;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
102
103
        if (empty($_SESSION['val']['path_protected']))
104
            $_SESSION['val']['path_protected'] = PH7_ROOT_PUBLIC . '_protected' . PH7_DS;
105
106
        if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['path_protected']))
107
        {
108
            $_SESSION['val']['path_protected'] = check_ext_start(check_ext_end(trim($_POST['path_protected'])));
109
110
            if (is_dir($_SESSION['val']['path_protected']))
111
            {
112
                if (is_readable($_SESSION['val']['path_protected']))
113
                {
114
                    $sConstantContent = file_get_contents(PH7_ROOT_INSTALL . 'data/configs/constants.php');
115
116
                    $sConstantContent = str_replace('%path_protected%', addslashes($_SESSION['val']['path_protected']), $sConstantContent);
117
118
                    if (!@file_put_contents(PH7_ROOT_PUBLIC . '_constants.php', $sConstantContent))
119
                    {
120
                        $aErrors[] = $LANG['no_public_writable'];
121
                    }
122
                    else
123
                    {
124
                        $_SESSION['step2'] = 1;
125
                        unset($_SESSION['val']);
126
127
                        redirect(PH7_URL_SLUG_INSTALL . 'config_system');
128
                    }
129
                }
130
                else
131
                {
132
                    $aErrors[] = $LANG['no_protected_readable'];
133
                }
134
            }
135
            else
136
            {
137
                $aErrors[] = $LANG['no_protected_exist'];
138
            }
139
        }
140
141
        $this->oView->assign('sept_number', 2);
142
        $this->oView->assign('errors', @$aErrors);
143
        unset($aErrors);
144
        $this->oView->display('config_path.tpl');
145
    }
146
147
    /********************* STEP 3 *********************/
148
    public function config_system()
149
    {
150
        global $LANG;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
151
152
        if (!empty($_SESSION['step2']) && is_file(PH7_ROOT_PUBLIC . '_constants.php'))
153
        {
154
            session_regenerate_id(true);
155
156
            if (empty($_SESSION['val']))
157
            {
158
                $_SESSION['db']['type_name'] = 'MySQL';
159
                $_SESSION['db']['type'] = 'mysql';
160
                $_SESSION['db']['hostname'] = 'localhost';
161
                $_SESSION['db']['username'] = 'root';
162
                $_SESSION['db']['name'] = 'ph7cms';
163
                $_SESSION['db']['prefix'] = 'PH7_';
164
                $_SESSION['db']['port'] = '3306';
165
                $_SESSION['db']['charset'] = 'UTF8';
166
167
                $_SESSION['val']['bug_report_email'] = '';
168
                $_SESSION['val']['ffmpeg_path'] = ffmpeg_path();
169
            }
170
171
            if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['config_system_submit']))
172
            {
173
                if (filled_out($_POST))
174
                {
175
                    foreach ($_POST as $sKey => $sVal)
176
                        $_SESSION['db'][str_replace('db_', '', $sKey)] = trim($sVal);
177
178
                    $_SESSION['val']['bug_report_email'] = trim($_POST['bug_report_email']);
179
                    $_SESSION['val']['ffmpeg_path'] = trim($_POST['ffmpeg_path']);
180
181
                    if (validate_email($_SESSION['val']['bug_report_email']))
182
                    {
183
                        try
184
                        {
185
                            require_once PH7_ROOT_INSTALL . 'inc/_db_connect.inc.php';
186
                            @require_once PH7_ROOT_PUBLIC . '_constants.php';
187
                            @require_once PH7_PATH_APP . 'configs/constants.php';
188
189
                            // Config File
190
                            @chmod(PH7_PATH_APP_CONFIG, 0777);
191
                            $sConfigContent = file_get_contents(PH7_ROOT_INSTALL . 'data/configs/config.ini');
192
193
                            $sConfigContent = str_replace('%bug_report_email%', $_SESSION['val']['bug_report_email'], $sConfigContent);
194
                            $sConfigContent = str_replace('%ffmpeg_path%', clean_string($_SESSION['val']['ffmpeg_path']), $sConfigContent);
195
196
                            $sConfigContent = str_replace('%db_type_name%', $_SESSION['db']['type_name'], $sConfigContent);
197
                            $sConfigContent = str_replace('%db_type%', $_SESSION['db']['type'], $sConfigContent);
198
                            $sConfigContent = str_replace('%db_hostname%', $_SESSION['db']['hostname'], $sConfigContent);
199
                            $sConfigContent = str_replace('%db_username%', clean_string($_SESSION['db']['username']), $sConfigContent);
200
                            $sConfigContent = str_replace('%db_password%', clean_string($_SESSION['db']['password']), $sConfigContent);
201
                            $sConfigContent = str_replace('%db_name%', clean_string($_SESSION['db']['name']), $sConfigContent);
202
                            $sConfigContent = str_replace('%db_prefix%', clean_string($_SESSION['db']['prefix']), $sConfigContent);
203
                            $sConfigContent = str_replace('%db_charset%', $_SESSION['db']['charset'], $sConfigContent);
204
                            $sConfigContent = str_replace('%db_port%', $_SESSION['db']['port'], $sConfigContent);
205
206
                            $sConfigContent = str_replace('%private_key%', generate_hash(40), $sConfigContent);
207
                            $sConfigContent = str_replace('%rand_id%', generate_hash(5), $sConfigContent);
208
209
                            if (!@file_put_contents(PH7_PATH_APP_CONFIG . 'config.ini', $sConfigContent))
210
                            {
211
                                $aErrors[] = $LANG['no_app_config_writable'];
212
                            }
213
                            else
214
                            {
215
                                if (!($DB->getAttribute(\PDO::ATTR_DRIVER_NAME) == 'mysql' && version_compare($DB->getAttribute(\PDO::ATTR_SERVER_VERSION), PH7_REQUIRE_SQL_VERSION, '>=')))
216
                                {
217
                                    $aErrors[] = $LANG['require_mysql_version'];
218
                                }
219
                                else
220
                                {
221
                                    $aDumps = [
222
                                        /*** Game ***/
223
                                        // We need to install the Game before the Core SQL for "foreign keys" that work are correct.
224
                                        'pH7_SchemaGame',
225
                                        'pH7_DataGame',
226
                                        /*** Core ***/
227
                                        'pH7_Core',
228
                                        // --- GeoIp (exec_query_file() function executes these files only if they existens otherwise it does nothing) --- //
229
                                        'pH7_GeoCountry',
230
                                        'pH7_GeoCity',
231
                                        'pH7_GeoCity2',
232
                                        'pH7_GeoCity3',
233
                                        'pH7_GeoCity4',
234
                                        'pH7_GeoCity5',
235
                                        'pH7_GeoCity6',
236
                                        'pH7_GeoCity7',
237
                                        'pH7_GeoCity8',
238
                                        'pH7_GeoState',
239
                                        // --- Execute this file if there is something --- //
240
                                        'pH7_SampleData'
241
                                    ];
242
243
                                    for ($i = 0, $iCount = count($aDumps); $i < $iCount; $i++)
244
                                        exec_query_file($DB, PH7_ROOT_INSTALL . 'data/sql/' . $_SESSION['db']['type_name'] . '/' . $aDumps[$i] . '.sql');
245
246
                                    unset($DB);
247
248
                                    $_SESSION['step3'] = 1;
249
                                    unset($_SESSION['val']);
250
251
                                    redirect(PH7_URL_SLUG_INSTALL . 'config_site');
252
                                }
253
                            }
254
                        }
255
                        catch (\PDOException $oE)
256
                        {
257
                            $aErrors[] = $LANG['database_error'] . escape($oE->getMessage());
258
                        }
259
                    }
260
                    else
261
                    {
262
                        $aErrors[] = $LANG['bad_email'];
263
                    }
264
                }
265
                else
266
                {
267
                    $aErrors[] = $LANG['all_fields_mandatory'];
268
                }
269
            }
270
        }
271
        else
272
        {
273
            redirect(PH7_URL_SLUG_INSTALL . 'config_path');
274
        }
275
276
        $this->oView->assign('sept_number', 3);
277
        $this->oView->assign('errors', @$aErrors);
278
        unset($aErrors);
279
        $this->oView->display('config_system.tpl');
280
    }
281
282
    /********************* STEP 4 *********************/
283
    public function config_site()
284
    {
285
        global $LANG;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
286
287
        if (empty($_SESSION['step4']))
288
        {
289
            if (!empty($_SESSION['step3']) && is_file(PH7_ROOT_PUBLIC . '_constants.php'))
290
            {
291
                session_regenerate_id(true);
292
293
                if (empty($_SESSION['val']))
294
                {
295
                    $_SESSION['val']['site_name'] = 'My Social Dating Site';
296
                    $_SESSION['val']['admin_login_email'] = '';
297
                    $_SESSION['val']['admin_email'] = '';
298
                    $_SESSION['val']['admin_feedback_email'] = '';
299
                    $_SESSION['val']['admin_return_email'] = '';
300
                    $_SESSION['val']['admin_username'] = 'administrator';
301
                    $_SESSION['val']['admin_first_name'] = '';
302
                    $_SESSION['val']['admin_last_name'] = '';
303
                }
304
305
                if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['config_site_submit']))
306
                {
307
                    if (filled_out($_POST))
308
                    {
309
                        foreach ($_POST as $sKey => $sVal)
310
                            $_SESSION['val'][$sKey] = trim($sVal);
311
312
                        if (validate_email($_SESSION['val']['admin_login_email']) && validate_email($_SESSION['val']['admin_email']) && validate_email($_SESSION['val']['admin_feedback_email']) && validate_email($_SESSION['val']['admin_return_email']))
313
                        {
314
                            if (validate_username($_SESSION['val']['admin_username']) == 0)
315
                            {
316
                                if (validate_password($_SESSION['val']['admin_password']) == 0)
317
                                {
318
                                    if (validate_identical($_SESSION['val']['admin_password'], $_SESSION['val']['admin_passwords']))
319
                                    {
320
                                        if (!find($_SESSION['val']['admin_password'], $_SESSION['val']['admin_username']) && !find($_SESSION['val']['admin_password'], $_SESSION['val']['admin_first_name']) && !find($_SESSION['val']['admin_password'], $_SESSION['val']['admin_last_name']))
321
                                        {
322
                                            if (validate_name($_SESSION['val']['admin_first_name']))
323
                                            {
324
                                                if (validate_name($_SESSION['val']['admin_last_name']))
325
                                                {
326
                                                    @require_once PH7_ROOT_PUBLIC . '_constants.php';
327
                                                    @require_once PH7_PATH_APP . 'configs/constants.php';
328
329
                                                    require PH7_PATH_APP . 'includes/helpers/misc.php';
330
                                                    require PH7_PATH_FRAMEWORK . 'Loader/Autoloader.php';
331
                                                    // To load "\PH7\Framework\Security\Security" class
332
                                                    Framework\Loader\Autoloader::getInstance()->init();
333
334
                                                    try
335
                                                    {
336
                                                        require_once PH7_ROOT_INSTALL . 'inc/_db_connect.inc.php';
337
338
                                                        // SQL EXECUTE
339
                                                        $rStmt = $DB->prepare('INSERT INTO ' . $_SESSION['db']['prefix'] . 'Admins
340
                                                        (profileId , username, password, email, firstName, lastName, joinDate, lastActivity, ip)
341
                                                        VALUES (1, :username, :password, :email, :firstName, :lastName, :joinDate, :lastActivity, :ip)');
342
343
                                                        $sCurrentDate = date('Y-m-d H:i:s');
344
                                                        $rStmt->execute([
345
                                                            'username' => $_SESSION['val']['admin_username'],
346
                                                            'password' => Framework\Security\Security::hashPwd($_SESSION['val']['admin_password']),
347
                                                            'email' => $_SESSION['val']['admin_login_email'],
348
                                                            'firstName'=> $_SESSION['val']['admin_first_name'],
349
                                                            'lastName'=> $_SESSION['val']['admin_last_name'],
350
                                                            'joinDate'=> $sCurrentDate,
351
                                                            'lastActivity' => $sCurrentDate,
352
                                                            'ip' => client_ip()
353
                                                        ]);
354
355
                                                        $rStmt = $DB->prepare('UPDATE ' . $_SESSION['db']['prefix'] . 'Settings SET value = :siteName WHERE name = \'siteName\' LIMIT 1');
356
                                                        $rStmt->execute(['siteName' => $_SESSION['val']['site_name']]);
357
358
                                                        $rStmt = $DB->prepare('UPDATE ' . $_SESSION['db']['prefix'] . 'Settings SET value = :adminEmail WHERE name = \'adminEmail\'  LIMIT 1');
359
                                                        $rStmt->execute(['adminEmail' => $_SESSION['val']['admin_email']]);
360
361
                                                        $rStmt = $DB->prepare('UPDATE ' . $_SESSION['db']['prefix'] . 'Settings SET value = :feedbackEmail WHERE name = \'feedbackEmail\'  LIMIT 1');
362
                                                        $rStmt->execute(['feedbackEmail' => $_SESSION['val']['admin_feedback_email']]);
363
364
                                                        $rStmt = $DB->prepare('UPDATE ' . $_SESSION['db']['prefix'] . 'Settings SET value = :returnEmail WHERE name = \'returnEmail\'  LIMIT 1');
365
                                                        $rStmt->execute(['returnEmail' => $_SESSION['val']['admin_return_email']]);
366
367
                                                        // We finalise by putting the correct permission to the config files
368
                                                        $this->_chmodConfigFiles();
369
370
                                                        $_SESSION['step4'] = 1;
371
372
                                                        redirect(PH7_URL_SLUG_INSTALL . 'niche');
373
                                                    }
374
                                                    catch (\PDOException $oE)
375
                                                    {
376
                                                        $aErrors[] = $LANG['database_error'] . escape($oE->getMessage());
377
                                                    }
378
                                                }
379
                                                else
380
                                                {
381
                                                    $aErrors[] = $LANG['bad_last_name'];
382
                                                }
383
                                            }
384
                                            else
385
                                            {
386
                                                $aErrors[] = $LANG['bad_first_name'];
387
                                            }
388
                                        }
389
                                        else
390
                                        {
391
                                            $aErrors[] = $LANG['insecure_password'];
392
                                        }
393
                                    }
394
                                    else
395
                                    {
396
                                        $aErrors[] = $LANG['passwords_different'];
397
                                    }
398
                                }
399
                                elseif (validate_password($_SESSION['val']['admin_password']) == 1)
400
                                {
401
                                    $aErrors[] = $LANG['password_too_short'];
402
                                }
403
                                elseif (validate_password($_SESSION['val']['admin_password']) == 2)
404
                                {
405
                                    $aErrors[] = $LANG['password_too_long'];
406
                                }
407
                                elseif (validate_password($_SESSION['val']['admin_password']) ==  3)
408
                                {
409
                                    $aErrors[] = $LANG['password_no_number'];
410
                                }
411
                                elseif (validate_password($_SESSION['val']['admin_password']) ==  4)
412
                                {
413
                                    $aErrors[] = $LANG['password_no_upper'];
414
                                }
415
                            }
416
                            elseif (validate_username($_SESSION['val']['admin_username']) == 1)
417
                            {
418
                                $aErrors[] = $LANG['username_too_short'];
419
                            }
420
                            elseif (validate_username($_SESSION['val']['admin_username']) == 2)
421
                            {
422
                                $aErrors[] = $LANG['username_too_long'];
423
                            }
424
                            elseif (validate_username($_SESSION['val']['admin_username']) == 3)
425
                            {
426
                                $aErrors[] = $LANG['bad_username'];
427
                            }
428
                        }
429
                        else
430
                        {
431
                            $aErrors[] = $LANG['bad_email'];
432
                        }
433
                    }
434
                    else
435
                    {
436
                        $aErrors[] = $LANG['all_fields_mandatory'];
437
                    }
438
                }
439
            }
440
            else
441
            {
442
                redirect(PH7_URL_SLUG_INSTALL . 'config_system');
443
            }
444
        }
445
        else
446
        {
447
            redirect(PH7_URL_SLUG_INSTALL . 'niche');
448
        }
449
450
        $this->oView->assign('sept_number', 4);
451
        $this->oView->assign('errors', @$aErrors);
452
        unset($aErrors);
453
        $this->oView->display('config_site.tpl');
454
    }
455
456
    /********************* STEP 5 *********************/
457
    public function niche()
458
    {
459
        global $LANG;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
460
461
        if (empty($_SESSION['step5']))
462
        {
463
            if (!empty($_SESSION['step4']) && is_file(PH7_ROOT_PUBLIC . '_constants.php'))
464
            {
465
                session_regenerate_id(true);
466
467
                if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['niche_submit']))
468
                {
469
                    $bUpdateNeeded = false; // Value by default. Don't need to update the DB for the Social/Dating Niche
470
471
                    switch ($_POST['niche_submit'])
472
                    {
473
                        case 'zendate':
474
                            $bUpdateNeeded = true;
475
                            $sTheme = 'zendate';
476
                            $aModUpdate = self::SOCIAL_MODS;
477
                            $aSettingUpdate = self::SOCIAL_SETTINGS;
478
                        break;
479
480
                        case 'datelove':
481
                            $bUpdateNeeded = true;
482
                            $sTheme = 'datelove';
483
                            $aModUpdate = self::DATING_MODS;
484
                            $aSettingUpdate = self::DATING_SETTINGS;
485
                        break;
486
487
                        // Or for 'base', don't do anything. Just use the default settings already setup in the database
488
                    }
489
490
                    if ($bUpdateNeeded)
491
                    {
492
                        @require_once PH7_ROOT_PUBLIC . '_constants.php';
493
                        @require_once PH7_PATH_APP . 'configs/constants.php';
494
495
                        require PH7_PATH_APP . 'includes/helpers/misc.php';
496
                        require PH7_PATH_FRAMEWORK . 'Loader/Autoloader.php';
497
                        // To load "PH7\Framework\Mvc\Model\DbConfig" class
498
                        Framework\Loader\Autoloader::getInstance()->init();
499
500
                        try
501
                        {
502
                            require_once PH7_ROOT_INSTALL . 'inc/_db_connect.inc.php';
503
504
                            // Enable/Disable the modules according to the chosen niche
505
                            foreach ($aModUpdate as $sModName => $sStatus)
506
                                $this->_updateMods($DB, $sModName, $sStatus);
507
508
                            $this->_updateSettings($aSettingUpdate);
509
510
                            // Set the theme for the chosen niche
511
                            $sSql = 'UPDATE ' . $_SESSION['db']['prefix'] . 'Settings SET value = :theme WHERE name = \'defaultTemplate\' LIMIT 1';
512
                            $rStmt = $DB->prepare($sSql);
513
                            $rStmt->execute(['theme' => $sTheme]);
514
                        }
515
                        catch (\PDOException $oE)
516
                        {
517
                            $aErrors[] = $LANG['database_error'] . escape($oE->getMessage());
518
                        }
519
                    }
520
                    $_SESSION['step5'] = 1;
521
522
                    redirect(PH7_URL_SLUG_INSTALL . 'service');
523
                }
524
            }
525
            else
526
            {
527
                redirect(PH7_URL_SLUG_INSTALL . 'config_site');
528
            }
529
        }
530
        else
531
        {
532
            redirect(PH7_URL_SLUG_INSTALL . 'service');
533
        }
534
535
        $this->oView->assign('sept_number', 5);
536
        $this->oView->assign('errors', @$aErrors);
537
        unset($aErrors);
538
        $this->oView->display('niche.tpl');
539
    }
540
541
    /********************* STEP 6 *********************/
542
    public function service()
543
    {
544
        $this->oView->assign('sept_number', 6);
545
        $this->oView->display('service.tpl');
546
    }
547
548
    /********************* STEP 7 *********************/
549
    public function license()
550
    {
551
        global $LANG;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
552
553
        if (!empty($_SESSION['step5']) && is_file(PH7_ROOT_PUBLIC . '_constants.php'))
554
        {
555
            if (empty($_SESSION['val']['license']))
556
                $_SESSION['val']['license'] = '';
557
558
            if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['license']))
559
            {
560
                $sKey = trim($_POST['license']);
561
                if (check_license($sKey))
562
                {
563
                    @require_once PH7_ROOT_PUBLIC . '_constants.php';
564
                    @require_once PH7_PATH_APP . 'configs/constants.php';
565
566
                    try
567
                    {
568
                        require_once PH7_ROOT_INSTALL . 'inc/_db_connect.inc.php';
569
570
                        $rStmt = $DB->prepare('UPDATE ' . $_SESSION['db']['prefix'] . 'License SET licenseKey = :key WHERE licenseId = 1');
571
                        $rStmt->execute(['key' => $sKey]);
572
573
                        redirect(PH7_URL_SLUG_INSTALL . 'finish');
574
                    }
575
                    catch (\PDOException $oE)
576
                    {
577
                        $aErrors[] = $LANG['database_error'] . escape($oE->getMessage());
578
                    }
579
                }
580
                else
581
                {
582
                    $aErrors[] = $LANG['failure_license'];
583
                }
584
            }
585
        }
586
        else
587
        {
588
            redirect(PH7_URL_SLUG_INSTALL . 'niche');
589
        }
590
591
        $this->oView->assign('sept_number', 7);
592
        $this->oView->assign('errors', @$aErrors);
593
        unset($aErrors);
594
        $this->oView->display('license.tpl');
595
    }
596
597
    /********************* STEP 8 *********************/
598
    public function finish()
599
    {
600
        global $LANG;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
601
602
        @require_once PH7_ROOT_PUBLIC . '_constants.php';
603
604
        if (!empty($_SESSION['val']['admin_login_email']))
605
        {
606
            // Send an email to say the installation is now done, and give some information...
607
            $aParams = [
608
                'to' => $_SESSION['val']['admin_login_email'],
609
                'subject' => $LANG['title_email_finish_install'],
610
                'body' => $LANG['content_email_finish_install']
611
            ];
612
            send_mail($aParams);
613
        }
614
615
        $this->_removeSessions();
616
        $this->_removeCookies();
617
618
        if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['confirm_remove_install']))
619
        {
620
            remove_install_dir();
621
            clearstatcache(); // We remove the files status cache as the "_install" folder doesn't exist anymore by now.
622
            exit(header('Location: ' . PH7_URL_ROOT));
623
        }
624
625
        $this->oView->assign('sept_number', 8);
626
        $this->oView->display('finish.tpl');
627
    }
628
629
    /**
630
     * Update module status (enabled/disabled).
631
     *
632
     * @param object \PH7\Db $oDb
633
     * @param string $sModName Module Name.
634
     * @param string $sStatus '1' = Enabled | '0' = Disabled (need to be string because in DB it is an "enum").
635
     * @return mixed (integer | boolean) Returns the number of rows on success or FALSE on failure.
636
     */
637
    private function _updateMods(Db $oDb, $sModName, $sStatus)
638
    {
639
        $sSql = 'UPDATE ' . $_SESSION['db']['prefix'] . 'SysModsEnabled SET enabled = :status WHERE folderName = :modName LIMIT 1';
640
        $rStmt = $oDb->prepare($sSql);
641
        return $rStmt->execute(['modName' => $sModName, 'status' => $sStatus]);
642
    }
643
644
    /**
645
     * Update Settings.
646
     *
647
     * @param array $aParams
648
     * @return void
649
     */
650
    private function _updateSettings(array $aParams)
651
    {
652
        // Initialize the site's database to get "\PH7\Framework\Mvc\Model\Engine\Db" class working (as it uses that DB and not the installer one)
653
        Framework\Mvc\Router\FrontController::getInstance()->_databaseInitialize();
654
655
        // Enable/Disable Social Media Widgets according to the chosen niche
656
        Framework\Mvc\Model\DbConfig::setSocialWidgets($aParams['social_media_widgets']);
657
    }
658
659
    /***** Get the loading image *****/
660
    private function _loadImg()
661
    {
662
        global $LANG;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
663
664
        return '<div style="text-align:center"><p>' . $LANG['wait_importing_database'] . '</p>
665
        <p><img src="data:image/gif;base64,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" alt="' . $LANG['loading'] . '" /></p>
666
        </div>';
667
    }
668
669
    /***** Set the correct permission to the config files *****/
670
    private function _chmodConfigFiles()
671
    {
672
        @chmod(PH7_PATH_APP_CONFIG . 'config.ini', 0644);
673
        @chmod(PH7_ROOT_PUBLIC . '_constants.php', 0644);
674
    }
675
676
    private function _removeSessions()
677
    {
678
        $_SESSION = [];
679
        session_unset();
680
        session_destroy();
681
    }
682
683
    private function _removeCookies()
684
    {
685
        $sCookieName = Controller::SOFTWARE_PREFIX_COOKIE_NAME . '_install_lang';
686
        // We are asking the browser to delete the cookie.
687
        setcookie($sCookieName, 0, 0);
688
        // and then, we delete the cookie value locally to avoid using it by mistake in following our script.
689
        unset($_COOKIE[$sCookieName]);
690
    }
691
}
692