1 | <?php |
||||
2 | |||||
3 | namespace Sunnysideup\UnderConstruction\Api; |
||||
4 | |||||
5 | use SilverStripe\Assets\Image; |
||||
6 | |||||
7 | use SilverStripe\Control\Controller; |
||||
8 | |||||
9 | use SilverStripe\Control\Director; |
||||
10 | |||||
11 | use SilverStripe\Core\Config\Config; |
||||
12 | |||||
13 | |||||
14 | use SilverStripe\ORM\ArrayList; |
||||
15 | use SilverStripe\SiteConfig\SiteConfig; |
||||
0 ignored issues
–
show
|
|||||
16 | |||||
17 | use SilverStripe\View\ArrayData; |
||||
18 | use SilverStripe\View\Requirements; |
||||
19 | use SilverStripe\View\SSViewer; |
||||
20 | use SilverStripe\View\ViewableData; |
||||
21 | |||||
22 | |||||
23 | use Sunnysideup\UnderConstruction\Tasks\GoOffline; |
||||
24 | |||||
25 | use Sunnysideup\UnderConstruction\Tasks\GoOnline; |
||||
26 | |||||
27 | class CalculatedValues extends ViewableData |
||||
28 | { |
||||
29 | /** |
||||
30 | * @var string |
||||
31 | */ |
||||
32 | private const UNDER_CONSTRUCTION_FOLDER_NAME = 'offline'; |
||||
33 | |||||
34 | /** |
||||
35 | * @var string |
||||
36 | */ |
||||
37 | private const UNDER_CONSTRUCTION_FILE_NAME = 'offline.php'; |
||||
38 | |||||
39 | protected $sc; |
||||
40 | |||||
41 | private static $under_construction_bg_options = [ |
||||
42 | '#000' => 'black', |
||||
43 | '#222' => 'off black', |
||||
44 | '#ddd' => 'off white', |
||||
45 | '#fff' => 'white', |
||||
46 | 'linear-gradient(to left, rgb(195, 20, 50), rgb(36, 11, 54))' => 'witching hour', |
||||
47 | 'linear-gradient(to left, rgb(189, 195, 199), rgb(44, 62, 80))' => 'grade grey', |
||||
48 | 'linear-gradient(to left, rgb(55, 59, 68), rgb(66, 134, 244))' => 'dark ocean', |
||||
49 | 'linear-gradient(to left, rgb(30, 150, 0), rgb(255, 242, 0), rgb(255, 0, 0))' => 'rastafari', |
||||
50 | 'linear-gradient(to left, rgb(253, 200, 48), rgb(243, 115, 53))' => 'citrus peel', |
||||
51 | 'linear-gradient(to left, rgb(0, 0, 0), rgb(15, 155, 15))' => 'terminal', |
||||
52 | 'linear-gradient(to left, rgb(0, 0, 70), rgb(28, 181, 224))' => 'vision of grandeur', |
||||
53 | 'linear-gradient(to left, rgb(247, 151, 30), rgb(255, 210, 0))' => 'learning and leading', |
||||
54 | 'linear-gradient(to left, rgb(93, 65, 87), rgb(168, 202, 186))' => 'forever lost', |
||||
55 | 'linear-gradient(to left, rgb(0, 4, 40), rgb(0, 78, 146))' => 'frost', |
||||
56 | ]; |
||||
57 | |||||
58 | private static $under_construction_fg_options = [ |
||||
59 | '#fff' => 'white', |
||||
60 | '#ddd' => 'off white', |
||||
61 | '#222' => 'off black', |
||||
62 | '#000' => 'black', |
||||
63 | ]; |
||||
64 | |||||
65 | public function __construct(SiteConfig $siteConfig) |
||||
66 | { |
||||
67 | parent::__construct(); |
||||
68 | $this->sc = $siteConfig; |
||||
69 | } |
||||
70 | |||||
71 | public static function go_offline_link(): string |
||||
72 | { |
||||
73 | return '/dev/tasks/' . Config::inst()->get(GoOffline::class, 'segment'); |
||||
74 | } |
||||
75 | |||||
76 | public static function go_online_link(): string |
||||
77 | { |
||||
78 | return '/dev/tasks/' . Config::inst()->get(GoOnline::class, 'segment'); |
||||
79 | } |
||||
80 | |||||
81 | public function getSiteConfig(): SiteConfig |
||||
82 | { |
||||
83 | return $this->sc; |
||||
84 | } |
||||
85 | |||||
86 | public function CreateFiles() |
||||
87 | { |
||||
88 | //create html |
||||
89 | if ($this->CreateDirAndTest()) { |
||||
90 | $this->CreateFilesInner(); |
||||
91 | } |
||||
92 | } |
||||
93 | |||||
94 | public function CreateDirAndTest(): bool |
||||
95 | { |
||||
96 | $this->CreateFilesInner(); |
||||
97 | $dir = dirname($this->UnderConstructionFilePath()); |
||||
98 | @mkdir($dir); |
||||
0 ignored issues
–
show
It seems like you do not handle an error condition for
mkdir() . This can introduce security issues, and is generally not recommended.
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
If you suppress an error, we recommend checking for the error condition explicitly: // For example instead of
@mkdir($dir);
// Better use
if (@mkdir($dir) === false) {
throw new \RuntimeException('The directory '.$dir.' could not be created.');
}
![]() |
|||||
99 | $messages = []; |
||||
100 | if (!file_exists($dir)) { |
||||
101 | $messages[] = 'Could not create offline folder (' . $this->UnderConstructionFolderName() . ').'; |
||||
102 | } |
||||
103 | if (!is_writable($dir)) { |
||||
104 | $messages[] = 'Could not writes files in offline folder (' . $this->UnderConstructionFolderName() . ').'; |
||||
105 | } |
||||
106 | if (!file_exists($this->getHtAccessPath())) { |
||||
107 | $messages[] = 'Could not find .htaccess file (' . $this->getHtAccessPath() . ').'; |
||||
108 | } |
||||
109 | if (!is_writable($this->getHtAccessPath())) { |
||||
110 | $messages[] = 'Could not write .htaccess file (' . $this->getHtAccessPath() . ').'; |
||||
111 | } |
||||
112 | if (!file_exists($this->UnderConstructionFilePath())) { |
||||
113 | $messages[] = 'Offline file does not exist yet (' . $this->UnderConstructionFilePath() . ').'; |
||||
114 | } |
||||
115 | if (!is_writable($this->UnderConstructionFilePath())) { |
||||
116 | $messages[] = 'Offline file can not be altered (' . $this->UnderConstructionFilePath() . ').'; |
||||
117 | } |
||||
118 | if (count($messages) === 0) { |
||||
119 | $outcome = true; |
||||
120 | $messages[] = 'All files are in order.'; |
||||
121 | } else { |
||||
122 | $outcome = false; |
||||
123 | } |
||||
124 | $this->sc->UnderConstructionOutcome = implode(' ', $messages); |
||||
125 | $this->sc->write(); |
||||
126 | |||||
127 | return $outcome; |
||||
128 | } |
||||
129 | |||||
130 | /** |
||||
131 | * arraylist of ips with two values: Ip and IpEscaped |
||||
132 | * @return ArrayList [description] |
||||
133 | */ |
||||
134 | public function UnderConstructionIpAddresses(): ArrayList |
||||
135 | { |
||||
136 | $array = explode(',', $this->sc->UnderConstructionExcludedIps); |
||||
137 | $al = ArrayList::create(); |
||||
138 | foreach ($array as $ip) { |
||||
139 | $ip = trim($ip); |
||||
140 | $ipEscaped = str_replace('.', '\\.', $ip); |
||||
141 | $al->push(ArrayData::create(['Ip' => $ip, 'IpEscaped' => $ipEscaped])); |
||||
142 | } |
||||
143 | |||||
144 | return $al; |
||||
145 | } |
||||
146 | |||||
147 | /** |
||||
148 | * something like /var/www/mysite/public/offline/offline.php |
||||
149 | */ |
||||
150 | public function UnderConstructionFilePath(): string |
||||
151 | { |
||||
152 | return Controller::join_links( |
||||
153 | Director::baseFolder(), |
||||
154 | Director::publicDir(), |
||||
155 | $this->UnderConstructionFolderName(), |
||||
156 | $this->UnderConstructionFileName() |
||||
157 | ); |
||||
158 | } |
||||
159 | |||||
160 | /** |
||||
161 | * something like https://mysite.com/offline/offline.php. |
||||
162 | */ |
||||
163 | public function UnderConstructionUrlPath(): string |
||||
164 | { |
||||
165 | return Controller::join_links( |
||||
166 | Director::absoluteBaseURL(), |
||||
167 | $this->UnderConstructionFolderName(), |
||||
168 | $this->UnderConstructionFileName() |
||||
169 | ); |
||||
170 | } |
||||
171 | |||||
172 | /** |
||||
173 | * something like /var/www/mysite/public/offline/offline.php.img |
||||
174 | */ |
||||
175 | public function UnderConstructionImagePath(): string |
||||
176 | { |
||||
177 | $extension = $this->sc->UnderConstructionImage()->getExtension(); |
||||
178 | |||||
179 | return $this->UnderConstructionFilePath() . '.' . $extension; |
||||
180 | } |
||||
181 | |||||
182 | /** |
||||
183 | * something like offline |
||||
184 | */ |
||||
185 | public function UnderConstructionFolderName(): string |
||||
186 | { |
||||
187 | return self::UNDER_CONSTRUCTION_FOLDER_NAME; |
||||
188 | } |
||||
189 | |||||
190 | /** |
||||
191 | * something like offline |
||||
192 | */ |
||||
193 | public function UnderConstructionFileName(): string |
||||
194 | { |
||||
195 | return self::UNDER_CONSTRUCTION_FILE_NAME; |
||||
196 | } |
||||
197 | |||||
198 | /** |
||||
199 | * something like offline.php.png. |
||||
200 | */ |
||||
201 | public function UnderConstructionImageName(): string |
||||
202 | { |
||||
203 | $path = $this->UnderConstructionImagePath(); |
||||
204 | if (file_exists($path)) { |
||||
205 | return basename($path); |
||||
206 | } |
||||
207 | return ''; |
||||
208 | } |
||||
209 | |||||
210 | /** |
||||
211 | * something like offline.php.png. |
||||
212 | */ |
||||
213 | public function UnderConstructionOriginalImagePath(): string |
||||
214 | { |
||||
215 | if ($this->sc->UnderConstructionImageID) { |
||||
216 | if ($this->sc->UnderConstructionImage()->exists()) { |
||||
217 | $name = $this->sc->UnderConstructionImage()->getFilename(); |
||||
218 | return Controller::join_links( |
||||
219 | Director::baseFolder(), |
||||
220 | Director::publicDir(), |
||||
221 | ASSETS_DIR, |
||||
222 | $name |
||||
223 | ); |
||||
224 | } |
||||
225 | } |
||||
226 | return ''; |
||||
227 | } |
||||
228 | |||||
229 | public function getHtAccessContent(): string |
||||
230 | { |
||||
231 | // SSViewer::config()->update('theme_enabled', true); |
||||
232 | Requirements::clear(); |
||||
233 | Config::modify()->set(SSViewer::class, 'source_file_comments', false); |
||||
234 | $txt = $this->renderWith('Sunnysideup\\UnderConstruction\\UnderConstructionHtAccess'); |
||||
235 | // SSViewer::config()->update('theme_enabled', false); |
||||
236 | |||||
237 | $array = explode(PHP_EOL, $txt); |
||||
238 | |||||
239 | return PHP_EOL . implode(PHP_EOL, $array) . PHP_EOL; |
||||
240 | } |
||||
241 | |||||
242 | public function UnderConstructionIsReady(): bool |
||||
243 | { |
||||
244 | return file_exists($this->UnderConstructionFilePath()); |
||||
245 | } |
||||
246 | |||||
247 | public function UnderConstructionForegroundColour() |
||||
248 | { |
||||
249 | return $this->sc->UnderConstructionForegroundColour ?: '#333'; |
||||
250 | } |
||||
251 | |||||
252 | public function UnderConstructionBackgroundColour() |
||||
253 | { |
||||
254 | return $this->sc->UnderConstructionBackgroundColour ?: '#333'; |
||||
255 | } |
||||
256 | |||||
257 | public function getHtAccessPath(): string |
||||
258 | { |
||||
259 | return Controller::join_links(Director::baseFolder(), Director::publicDir(), '.htaccess'); |
||||
260 | } |
||||
261 | |||||
262 | public function CreateFilesInner() |
||||
263 | { |
||||
264 | // SSViewer::config()->update('theme_enabled', false); |
||||
265 | Config::modify()->set(SSViewer::class, 'source_file_comments', false); |
||||
266 | Requirements::clear(); |
||||
267 | $html = $this->renderWith('Sunnysideup\\UnderConstruction\\UnderConstructionPage'); |
||||
268 | // SSViewer::config()->update('theme_enabled', false); |
||||
269 | $fileName = $this->UnderConstructionFilePath(); |
||||
270 | if (file_exists($fileName)) { |
||||
271 | unlink($fileName); |
||||
272 | } |
||||
273 | //delete timestamp |
||||
274 | if (file_exists($fileName . '.txt')) { |
||||
275 | unlink($fileName . '.txt'); |
||||
276 | } |
||||
277 | //create image |
||||
278 | file_put_contents($fileName, $html); |
||||
279 | $image = $this->sc->UnderConstructionImage(); |
||||
280 | if ($image && $image->exists()) { |
||||
281 | $originalImagePath = $this->UnderConstructionOriginalImagePath(); |
||||
282 | $newImagePath = $this->UnderConstructionImagePath(); |
||||
283 | if (file_exists($newImagePath)) { |
||||
284 | unlink($newImagePath); |
||||
285 | } |
||||
286 | copy($originalImagePath, $newImagePath); |
||||
287 | } |
||||
288 | } |
||||
289 | } |
||||
290 |
The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g.
excluded_paths: ["lib/*"]
, you can move it to the dependency path list as follows:For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths