FileStorage::exists()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
eloc 1
nc 1
nop 1
1
<?php
2
/*
3
 You may not change or alter any portion of this comment or credits
4
 of supporting developers from this source code or any supporting source code
5
 which is considered copyrighted (c) material of the original comment or credit authors.
6
7
 This program is distributed in the hope that it will be useful,
8
 but WITHOUT ANY WARRANTY; without even the implied warranty of
9
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10
 */
11
12
namespace Xmf\Key;
13
14
/**
15
 * Xmf\Key\StorageInterface
16
 *
17
 * load a database table
18
 *
19
 * @category  Xmf\Key\FileStorage
20
 * @package   Xmf
21
 * @author    Richard Griffith <[email protected]>
22
 * @copyright 2016-2018 XOOPS Project (https://xoops.org)
23
 * @license   GNU GPL 2.0 or later (https://www.gnu.org/licenses/gpl-2.0.html)
24
 * @link      https://xoops.org
25
 */
26
class FileStorage implements StorageInterface
27
{
28
29
    /**
30
     * @var string $storagePath filesystem path to storage
31
     */
32
    protected $storagePath;
33
34
    /**
35
     * @var string $systemSecret prefix unique to this system
36
     */
37
    protected $systemSecret;
38
39
    /**
40
     * FileStorage constructor.
41
     *
42
     * @param string|null $storagePath  filesystem path to storage (without trailing slash)
43
     * @param string|null $systemSecret prefix unique to this system
44
     */
45
    public function __construct($storagePath = null, $systemSecret = null)
46
    {
47
        $this->storagePath = (null === $storagePath) ? XOOPS_VAR_PATH . '/data' : $storagePath;
48
        $this->systemSecret = (null === $systemSecret) ? $this->generateSystemSecret() : $systemSecret;
49
    }
50
51
    /**
52
     * Fetch key data by name
53
     *
54
     * @param string $name key name
55
     *
56
     * @return string file name
57
     */
58
    protected function fileName($name)
59
    {
60
        return $this->storagePath . "/{$this->systemSecret}-key-{$name}.php";
61
    }
62
63
    /**
64
     * Construct a string related to the system to make name less predictable
65
     *
66
     * @return string
67
     */
68
    protected function generateSystemSecret()
69
    {
70
        $db = \XoopsDatabaseFactory::getDatabaseConnection();
71
        $prefix = $db->prefix();
72
        $secret = md5($prefix);
73
        $secret = substr($secret, 8, 8);
74
        return $secret;
75
    }
76
77
    /**
78
     * Save key data by name
79
     *
80
     * @param string $name key name
81
     * @param string $data key data, serialized to string if required
82
     *
83
     * @return boolean true if key saved, otherwise false
84
     */
85
    public function save($name, $data)
86
    {
87
        if (empty($data) || !is_string($data)) {
88
            throw new \DomainException('Invalid key data');
89
        }
90
        $fileContents = "<?php\n//**Warning** modifying this file will break things!\n"
91
            . "return '{$data}';\n";
92
        return (false !== file_put_contents($this->fileName($name), $fileContents));
93
    }
94
95
    /**
96
     * Fetch key data by name
97
     *
98
     * @param string $name key name
99
     *
100
     * @return string|false key data (possibly serialized) or false on error
101
     */
102
    public function fetch($name)
103
    {
104
        return include $this->fileName($name);
105
    }
106
107
    /**
108
     * Check if key data exists
109
     *
110
     * @param string $name key name
111
     *
112
     * @return boolean true if key exists, otherwise false
113
     */
114
    public function exists($name)
115
    {
116
        return file_exists($this->fileName($name));
117
    }
118
119
    /**
120
     * Delete a key
121
     *
122
     * @param string $name key name
123
     *
124
     * @return boolean true if key deleted, otherwise false
125
     */
126
    public function delete($name)
127
    {
128
        return unlink($this->fileName($name));
129
    }
130
}
131