aboutsummaryrefslogtreecommitdiffhomepage
path: root/application/config/ConfigPhp.php
blob: 53d6a7a357c910ab0f2789fdacac5728f85da817 (plain) (blame)
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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?php

namespace Shaarli\Config;

/**
 * Class ConfigPhp (ConfigIO implementation)
 *
 * Handle Shaarli's legacy PHP configuration file.
 * Note: this is only designed to support the transition to JSON configuration.
 */
class ConfigPhp implements ConfigIO
{
    /**
     * @var array List of config key without group.
     */
    public static $ROOT_KEYS = [
        'login',
        'hash',
        'salt',
        'timezone',
        'title',
        'titleLink',
        'redirector',
        'disablesessionprotection',
        'privateLinkByDefault',
    ];

    /**
     * Map legacy config keys with the new ones.
     * If ConfigPhp is used, getting <newkey> will actually look for <legacykey>.
     * The updater will use this array to transform keys when switching to JSON.
     *
     * @var array current key => legacy key.
     */
    public static $LEGACY_KEYS_MAPPING = [
        'credentials.login' => 'login',
        'credentials.hash' => 'hash',
        'credentials.salt' => 'salt',
        'resource.data_dir' => 'config.DATADIR',
        'resource.config' => 'config.CONFIG_FILE',
        'resource.datastore' => 'config.DATASTORE',
        'resource.updates' => 'config.UPDATES_FILE',
        'resource.log' => 'config.LOG_FILE',
        'resource.update_check' => 'config.UPDATECHECK_FILENAME',
        'resource.raintpl_tpl' => 'config.RAINTPL_TPL',
        'resource.theme' => 'config.theme',
        'resource.raintpl_tmp' => 'config.RAINTPL_TMP',
        'resource.thumbnails_cache' => 'config.CACHEDIR',
        'resource.page_cache' => 'config.PAGECACHE',
        'resource.ban_file' => 'config.IPBANS_FILENAME',
        'security.session_protection_disabled' => 'disablesessionprotection',
        'security.ban_after' => 'config.BAN_AFTER',
        'security.ban_duration' => 'config.BAN_DURATION',
        'general.title' => 'title',
        'general.timezone' => 'timezone',
        'general.header_link' => 'titleLink',
        'updates.check_updates' => 'config.ENABLE_UPDATECHECK',
        'updates.check_updates_branch' => 'config.UPDATECHECK_BRANCH',
        'updates.check_updates_interval' => 'config.UPDATECHECK_INTERVAL',
        'privacy.default_private_links' => 'privateLinkByDefault',
        'feed.rss_permalinks' => 'config.ENABLE_RSS_PERMALINKS',
        'general.links_per_page' => 'config.LINKS_PER_PAGE',
        'thumbnail.enable_thumbnails' => 'config.ENABLE_THUMBNAILS',
        'thumbnail.enable_localcache' => 'config.ENABLE_LOCALCACHE',
        'general.enabled_plugins' => 'config.ENABLED_PLUGINS',
        'redirector.url' => 'redirector',
        'redirector.encode_url' => 'config.REDIRECTOR_URLENCODE',
        'feed.show_atom' => 'config.SHOW_ATOM',
        'privacy.hide_public_links' => 'config.HIDE_PUBLIC_LINKS',
        'privacy.hide_timestamps' => 'config.HIDE_TIMESTAMPS',
        'security.open_shaarli' => 'config.OPEN_SHAARLI',
    ];

    /**
     * @inheritdoc
     */
    public function read($filepath)
    {
        if (! file_exists($filepath) || ! is_readable($filepath)) {
            return [];
        }

        include $filepath;

        $out = [];
        foreach (self::$ROOT_KEYS as $key) {
            $out[$key] = isset($GLOBALS[$key]) ? $GLOBALS[$key] : '';
        }
        $out['config'] = isset($GLOBALS['config']) ? $GLOBALS['config'] : [];
        $out['plugins'] = isset($GLOBALS['plugins']) ? $GLOBALS['plugins'] : [];
        return $out;
    }

    /**
     * @inheritdoc
     */
    public function write($filepath, $conf)
    {
        $configStr = '<?php ' . PHP_EOL;
        foreach (self::$ROOT_KEYS as $key) {
            if (isset($conf[$key])) {
                $configStr .= '$GLOBALS[\'' . $key . '\'] = ' . var_export($conf[$key], true) . ';' . PHP_EOL;
            }
        }

        // Store all $conf['config']
        foreach ($conf['config'] as $key => $value) {
            $configStr .= '$GLOBALS[\'config\'][\''
                . $key
                . '\'] = '
                . var_export($conf['config'][$key], true) . ';'
                . PHP_EOL;
        }

        if (isset($conf['plugins'])) {
            foreach ($conf['plugins'] as $key => $value) {
                $configStr .= '$GLOBALS[\'plugins\'][\''
                    . $key
                    . '\'] = '
                    . var_export($conf['plugins'][$key], true) . ';'
                    . PHP_EOL;
            }
        }

        if (
            !file_put_contents($filepath, $configStr)
            || strcmp(file_get_contents($filepath), $configStr) != 0
        ) {
            throw new \Shaarli\Exceptions\IOException(
                $filepath,
                t('Shaarli could not create the config file. ' .
                  'Please make sure Shaarli has the right to write in the folder is it installed in.')
            );
        }
    }

    /**
     * @inheritdoc
     */
    public function getExtension()
    {
        return '.php';
    }
}