Completed
Push — master ( 186d9b...7aa9e4 )
by Richard
14s
created

FileStorage::__construct()   A

Complexity

Conditions 3
Paths 4

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 2
nc 4
nop 2
dl 0
loc 4
ccs 3
cts 3
cp 1
crap 3
rs 10
c 0
b 0
f 0
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 or later (http://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 4
    public function __construct($storagePath = null, $systemSecret = null)
46
    {
47 4
        $this->storagePath = (null === $storagePath) ? XOOPS_VAR_PATH . '/data' : $storagePath;
48 4
        $this->systemSecret = (null === $systemSecret) ? $this->generateSystemSecret() : $systemSecret;
49 4
    }
50
51
    /**
52
     * Fetch key data by name
53
     *
54
     * @param string $name key name
55
     *
56
     * @return string file name
57
     */
58 4
    protected function fileName($name)
59
    {
60 4
        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();
0 ignored issues
show
Deprecated Code introduced by
The function XoopsDatabase::prefix() has been deprecated: since version 2.6.0 - alpha 3. Switch to doctrine connector. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

71
        $prefix = /** @scrutinizer ignore-deprecated */ $db->prefix();

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
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 4
    public function save($name, $data)
86
    {
87 4
        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 4
            . "return '{$data}';\n";
92 4
        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 2
    public function fetch($name)
103
    {
104 2
        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 2
    public function exists($name)
115
    {
116 2
        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 4
    public function delete($name)
127
    {
128 4
        return unlink($this->fileName($name));
129
    }
130
}
131