summaryrefslogtreecommitdiffstats
path: root/public/install.php
blob: 09cbe639c54b567f91f914bdde8fb149504c23b0 (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
<?php
require_once '../app/app.php';

// This is an helper function returning an html table row to avoid code duplication
function installStatus(string $str, string $msg, bool $result) : string
{
    $class = ($result) ? 'ok' : 'fail';
    return '<tr><td>' . $str . '</td><td class="' . $class . '">' . $msg . '</td></tr>';
}

// If the config file exists and the auth variables are set, moonmoon is already installed
if ($PlanetConfig::isInstalled()) {
    $status = 'installed';
} elseif (isset($_POST['url'])) {
    // Do no try to use the file of an invalid locale
    if (strstr($_POST['locale'], '..') !== false
    || !file_exists(__DIR__ . "/app/l10n/${_REQUEST['locale']}.lang")) {
        $_POST['locale'] = 'en';
    }

    $save = array();
    //Save config file
    $config = array_merge(PlanetConfig::$defaultConfig, [
        'url'    => $_POST['url'],
        'name'   => filter_var($_POST['title'], FILTER_SANITIZE_SPECIAL_CHARS),
        'locale' => $_POST['locale'],
    ]);

    $CreatePlanetConfig = new PlanetConfig($config);
    $save['config'] = file_put_contents(config_path('config.yml'), $CreatePlanetConfig->toYaml());

    OpmlManager::save(new Opml(), config_path('people.opml'));

    //Save password
    $save['password'] = file_put_contents(
        config_path('pwd.inc.php'),
        sprintf('<?php $login="admin"; $password="%s"; ?>', hash('sha256', $_POST['password']))
    );

    if (0 != ($save['config'] + $save['password'])) {
        $status = 'installed';
    }
} else {
    // We start by malking sure we have PHP5 as a base requirement
    if (version_compare(PHP_VERSION, '7.2.0') >= 0) {
        $strInstall = installStatus('Server is running at least PHP 7.2', 'OK', true);
        $strRecommendation = '';
    } else {
        $strInstall = installStatus('Server is running at least PHP 7.2', 'FAIL', false);
        $strRecommendation = '<li>Check your server documentation to activate at least PHP 7.2</li>';
    }

    $required_extensions = [
        'dom',       // moonmoon, simplepie
        'curl',      // simplepie
        'iconv',     // simplepie
        'libxml',    // moonmoon, simplepie
        'mbstring',  // simplepie
        'pcre',      // moonmoon
        'xml',       // moonmoon, simplepie
        'xmlreader', // moonmoon, simplepie
        'zlib'       // simplepie
    ];
    foreach ($required_extensions as $ext) {
        if (extension_loaded($ext) === true) {
            $strInstall .= installStatus("PHP extension <code>$ext</code> is present", 'OK', true);
        } else {
            $strInstall .= installStatus("PHP extension <code>$ext</code> is present", 'FAIL', false);
            $strRecommendation .= "<li>Install PHP extension <code>$ext</code> on your server</li>";
        }
    }

    // Writable file requirements
    $tests = array(
        config_path('config.yml'),
        config_path('people.opml'),
        config_path('pwd.inc.php'),
        cache_path('test_cache'),
    );

    // We now test that all required files and directories are writable.
    foreach ($tests as $filename) {
        if (touch($filename)) {
            $strInstall .= installStatus("<code>$filename</code> is writable", 'OK', true);
            if (is_file($filename)) {
                unlink($filename);
            }
        } else {
            $strInstall .= installStatus("<code>$filename</code> is writable", 'FAIL', false);
            $strRecommendation .= "<li>Make <code>$filename</code> writable with CHMOD</li>";
        }
    }

    // We can now decide if we install moonmoon or not
    $status = ($strRecommendation != '') ? 'error' : 'install';
}

require_once views_path('install.tpl.php');