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 <richard@geekwright.com> |
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: |