Issues (6)

src/Api/CalculatedValues.php (2 issues)

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
The type SilverStripe\SiteConfig\SiteConfig was not found. Maybe you did not declare it correctly or list all dependencies?

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:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
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
Security Best Practice introduced by
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 ignore-unhandled  annotation

98
        /** @scrutinizer ignore-unhandled */ @mkdir($dir);

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.');
}
Loading history...
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