Completed
Push — master ( 2a2261...f4ffa1 )
by Morris
15:06
created

ThemingDefaults::getPrivacyUrl()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
nc 1
nop 0
dl 0
loc 3
rs 10
c 0
b 0
f 0
1
<?php
2
/**
3
 * @copyright Copyright (c) 2016 Bjoern Schiessle <[email protected]>
4
 * @copyright Copyright (c) 2017 Lukas Reschke <[email protected]>
5
 *
6
 * @author Arthur Schiwon <[email protected]>
7
 * @author Bjoern Schiessle <[email protected]>
8
 * @author Jan-Christoph Borchardt <[email protected]>
9
 * @author Joachim Bauch <[email protected]>
10
 * @author Joas Schilling <[email protected]>
11
 * @author Julius Haertl <[email protected]>
12
 * @author Julius Härtl <[email protected]>
13
 * @author Lukas Reschke <[email protected]>
14
 * @author Morris Jobke <[email protected]>
15
 * @author Roeland Jago Douma <[email protected]>
16
 *
17
 * @license GNU AGPL version 3 or any later version
18
 *
19
 * This program is free software: you can redistribute it and/or modify
20
 * it under the terms of the GNU Affero General Public License as
21
 * published by the Free Software Foundation, either version 3 of the
22
 * License, or (at your option) any later version.
23
 *
24
 * This program is distributed in the hope that it will be useful,
25
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
27
 * GNU Affero General Public License for more details.
28
 *
29
 * You should have received a copy of the GNU Affero General Public License
30
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
31
 *
32
 */
33
34
namespace OCA\Theming;
35
36
37
use OCP\App\AppPathNotFoundException;
38
use OCP\App\IAppManager;
39
use OCP\Files\NotFoundException;
40
use OCP\ICacheFactory;
41
use OCP\IConfig;
42
use OCP\IL10N;
43
use OCP\IURLGenerator;
44
45
class ThemingDefaults extends \OC_Defaults {
46
47
	/** @var IConfig */
48
	private $config;
49
	/** @var IL10N */
50
	private $l;
0 ignored issues
show
Comprehensibility introduced by
Consider using a different property name as you override a private property of the parent class.
Loading history...
51
	/** @var ImageManager */
52
	private $imageManager;
53
	/** @var IURLGenerator */
54
	private $urlGenerator;
55
	/** @var ICacheFactory */
56
	private $cacheFactory;
57
	/** @var Util */
58
	private $util;
59
	/** @var IAppManager */
60
	private $appManager;
61
	/** @var string */
62
	private $name;
63
	/** @var string */
64
	private $title;
65
	/** @var string */
66
	private $entity;
67
	/** @var string */
68
	private $url;
69
	/** @var string */
70
	private $slogan;
71
	/** @var string */
72
	private $color;
73
74
	/** @var string */
75
	private $iTunesAppId;
76
	/** @var string */
77
	private $iOSClientUrl;
78
	/** @var string */
79
	private $AndroidClientUrl;
80
81
	/**
82
	 * ThemingDefaults constructor.
83
	 *
84
	 * @param IConfig $config
85
	 * @param IL10N $l
86
	 * @param ImageManager $imageManager
87
	 * @param IURLGenerator $urlGenerator
88
	 * @param ICacheFactory $cacheFactory
89
	 * @param Util $util
90
	 * @param IAppManager $appManager
91
	 */
92
	public function __construct(IConfig $config,
93
								IL10N $l,
94
								IURLGenerator $urlGenerator,
95
								ICacheFactory $cacheFactory,
96
								Util $util,
97
								ImageManager $imageManager,
98
								IAppManager $appManager
99
	) {
100
		parent::__construct();
101
		$this->config = $config;
102
		$this->l = $l;
103
		$this->imageManager = $imageManager;
104
		$this->urlGenerator = $urlGenerator;
105
		$this->cacheFactory = $cacheFactory;
106
		$this->util = $util;
107
		$this->appManager = $appManager;
108
109
		$this->name = parent::getName();
0 ignored issues
show
Comprehensibility Bug introduced by
It seems like you call parent on a different method (getName() instead of __construct()). Are you sure this is correct? If so, you might want to change this to $this->getName().

This check looks for a call to a parent method whose name is different than the method from which it is called.

Consider the following code:

class Daddy
{
    protected function getFirstName()
    {
        return "Eidur";
    }

    protected function getSurName()
    {
        return "Gudjohnsen";
    }
}

class Son
{
    public function getFirstName()
    {
        return parent::getSurname();
    }
}

The getFirstName() method in the Son calls the wrong method in the parent class.

Loading history...
110
		$this->title = parent::getTitle();
0 ignored issues
show
Comprehensibility Bug introduced by
It seems like you call parent on a different method (getTitle() instead of __construct()). Are you sure this is correct? If so, you might want to change this to $this->getTitle().

This check looks for a call to a parent method whose name is different than the method from which it is called.

Consider the following code:

class Daddy
{
    protected function getFirstName()
    {
        return "Eidur";
    }

    protected function getSurName()
    {
        return "Gudjohnsen";
    }
}

class Son
{
    public function getFirstName()
    {
        return parent::getSurname();
    }
}

The getFirstName() method in the Son calls the wrong method in the parent class.

Loading history...
111
		$this->entity = parent::getEntity();
0 ignored issues
show
Comprehensibility Bug introduced by
It seems like you call parent on a different method (getEntity() instead of __construct()). Are you sure this is correct? If so, you might want to change this to $this->getEntity().

This check looks for a call to a parent method whose name is different than the method from which it is called.

Consider the following code:

class Daddy
{
    protected function getFirstName()
    {
        return "Eidur";
    }

    protected function getSurName()
    {
        return "Gudjohnsen";
    }
}

class Son
{
    public function getFirstName()
    {
        return parent::getSurname();
    }
}

The getFirstName() method in the Son calls the wrong method in the parent class.

Loading history...
112
		$this->url = parent::getBaseUrl();
0 ignored issues
show
Comprehensibility Bug introduced by
It seems like you call parent on a different method (getBaseUrl() instead of __construct()). Are you sure this is correct? If so, you might want to change this to $this->getBaseUrl().

This check looks for a call to a parent method whose name is different than the method from which it is called.

Consider the following code:

class Daddy
{
    protected function getFirstName()
    {
        return "Eidur";
    }

    protected function getSurName()
    {
        return "Gudjohnsen";
    }
}

class Son
{
    public function getFirstName()
    {
        return parent::getSurname();
    }
}

The getFirstName() method in the Son calls the wrong method in the parent class.

Loading history...
113
		$this->slogan = parent::getSlogan();
0 ignored issues
show
Comprehensibility Bug introduced by
It seems like you call parent on a different method (getSlogan() instead of __construct()). Are you sure this is correct? If so, you might want to change this to $this->getSlogan().

This check looks for a call to a parent method whose name is different than the method from which it is called.

Consider the following code:

class Daddy
{
    protected function getFirstName()
    {
        return "Eidur";
    }

    protected function getSurName()
    {
        return "Gudjohnsen";
    }
}

class Son
{
    public function getFirstName()
    {
        return parent::getSurname();
    }
}

The getFirstName() method in the Son calls the wrong method in the parent class.

Loading history...
114
		$this->color = parent::getColorPrimary();
0 ignored issues
show
Comprehensibility Bug introduced by
It seems like you call parent on a different method (getColorPrimary() instead of __construct()). Are you sure this is correct? If so, you might want to change this to $this->getColorPrimary().

This check looks for a call to a parent method whose name is different than the method from which it is called.

Consider the following code:

class Daddy
{
    protected function getFirstName()
    {
        return "Eidur";
    }

    protected function getSurName()
    {
        return "Gudjohnsen";
    }
}

class Son
{
    public function getFirstName()
    {
        return parent::getSurname();
    }
}

The getFirstName() method in the Son calls the wrong method in the parent class.

Loading history...
115
		$this->iTunesAppId = parent::getiTunesAppId();
0 ignored issues
show
Comprehensibility Bug introduced by
It seems like you call parent on a different method (getiTunesAppId() instead of __construct()). Are you sure this is correct? If so, you might want to change this to $this->getiTunesAppId().

This check looks for a call to a parent method whose name is different than the method from which it is called.

Consider the following code:

class Daddy
{
    protected function getFirstName()
    {
        return "Eidur";
    }

    protected function getSurName()
    {
        return "Gudjohnsen";
    }
}

class Son
{
    public function getFirstName()
    {
        return parent::getSurname();
    }
}

The getFirstName() method in the Son calls the wrong method in the parent class.

Loading history...
116
		$this->iOSClientUrl = parent::getiOSClientUrl();
0 ignored issues
show
Comprehensibility Bug introduced by
It seems like you call parent on a different method (getiOSClientUrl() instead of __construct()). Are you sure this is correct? If so, you might want to change this to $this->getiOSClientUrl().

This check looks for a call to a parent method whose name is different than the method from which it is called.

Consider the following code:

class Daddy
{
    protected function getFirstName()
    {
        return "Eidur";
    }

    protected function getSurName()
    {
        return "Gudjohnsen";
    }
}

class Son
{
    public function getFirstName()
    {
        return parent::getSurname();
    }
}

The getFirstName() method in the Son calls the wrong method in the parent class.

Loading history...
117
		$this->AndroidClientUrl = parent::getAndroidClientUrl();
0 ignored issues
show
Comprehensibility Bug introduced by
It seems like you call parent on a different method (getAndroidClientUrl() instead of __construct()). Are you sure this is correct? If so, you might want to change this to $this->getAndroidClientUrl().

This check looks for a call to a parent method whose name is different than the method from which it is called.

Consider the following code:

class Daddy
{
    protected function getFirstName()
    {
        return "Eidur";
    }

    protected function getSurName()
    {
        return "Gudjohnsen";
    }
}

class Son
{
    public function getFirstName()
    {
        return parent::getSurname();
    }
}

The getFirstName() method in the Son calls the wrong method in the parent class.

Loading history...
118
	}
119
120
	public function getName() {
121
		return strip_tags($this->config->getAppValue('theming', 'name', $this->name));
122
	}
123
124
	public function getHTMLName() {
125
		return $this->config->getAppValue('theming', 'name', $this->name);
126
	}
127
128
	public function getTitle() {
129
		return strip_tags($this->config->getAppValue('theming', 'name', $this->title));
130
	}
131
132
	public function getEntity() {
133
		return strip_tags($this->config->getAppValue('theming', 'name', $this->entity));
134
	}
135
136
	public function getBaseUrl() {
137
		return $this->config->getAppValue('theming', 'url', $this->url);
138
	}
139
140
	public function getSlogan() {
141
		return \OCP\Util::sanitizeHTML($this->config->getAppValue('theming', 'slogan', $this->slogan));
0 ignored issues
show
Bug Compatibility introduced by
The expression \OCP\Util::sanitizeHTML(...ogan', $this->slogan)); of type array|string adds the type array to the return on line 141 which is incompatible with the return type of the parent method OC_Defaults::getSlogan of type string.
Loading history...
142
	}
143
144
	public function getImprintUrl() {
145
		return (string)$this->config->getAppValue('theming', 'imprintUrl', '');
146
	}
147
148
	public function getPrivacyUrl() {
149
		return (string)$this->config->getAppValue('theming', 'privacyUrl', '');
150
	}
151
152
	public function getShortFooter() {
153
		$slogan = $this->getSlogan();
154
		$baseUrl = $this->getBaseUrl();
155
		if ($baseUrl !== '') {
156
			$footer = '<a href="' . $baseUrl . '" target="_blank"' .
157
				' rel="noreferrer noopener" class="entity-name">' . $this->getEntity() . '</a>';
158
		} else {
159
			$footer = '<span class="entity-name">' .$this->getEntity() . '</span>';
160
		}
161
		$footer .= ($slogan !== '' ? ' – ' . $slogan : '');
162
163
		$links = [
164
			[
165
				'text' => $this->l->t('Legal notice'),
166
				'url' => (string)$this->getImprintUrl()
167
			],
168
			[
169
				'text' => $this->l->t('Privacy policy'),
170
				'url' => (string)$this->getPrivacyUrl()
171
			],
172
		];
173
174
		$legalLinks = ''; $divider = '';
175
		foreach($links as $link) {
176
			if($link['url'] !== ''
177
				&& filter_var($link['url'], FILTER_VALIDATE_URL, [
178
					'flags' => FILTER_FLAG_SCHEME_REQUIRED | FILTER_FLAG_HOST_REQUIRED
179
				])
180
			) {
181
				$legalLinks .= $divider . '<a href="' . $link['url'] . '" class="legal" target="_blank"' .
182
					' rel="noreferrer noopener">' . $link['text'] . '</a>';
183
				$divider = ' · ';
184
			}
185
		}
186
		if($legalLinks !== '' ) {
187
			$footer .= '<br/>' . $legalLinks;
188
		}
189
190
		return $footer;
191
	}
192
193
	/**
194
	 * Color that is used for the header as well as for mail headers
195
	 *
196
	 * @return string
197
	 */
198
	public function getColorPrimary() {
199
		return $this->config->getAppValue('theming', 'color', $this->color);
200
	}
201
202
	/**
203
	 * Themed logo url
204
	 *
205
	 * @param bool $useSvg Whether to point to the SVG image or a fallback
206
	 * @return string
207
	 */
208
	public function getLogo($useSvg = true): string {
209
		$logo = $this->config->getAppValue('theming', 'logoMime', false);
0 ignored issues
show
Documentation introduced by
false is of type boolean, but the function expects a string.

It seems like the type of the argument is not accepted by the function/method which you are calling.

In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug.

We suggest to add an explicit type cast like in the following example:

function acceptsInteger($int) { }

$x = '123'; // string "123"

// Instead of
acceptsInteger($x);

// we recommend to use
acceptsInteger((integer) $x);
Loading history...
210
211
		$logoExists = true;
212
		try {
213
			$this->imageManager->getImage('logo', $useSvg);
214
		} catch (\Exception $e) {
215
			$logoExists = false;
216
		}
217
218
		$cacheBusterCounter = $this->config->getAppValue('theming', 'cachebuster', '0');
219
220
		if(!$logo || !$logoExists) {
221
			if($useSvg) {
222
				$logo = $this->urlGenerator->imagePath('core', 'logo.svg');
223
			} else {
224
				$logo = $this->urlGenerator->imagePath('core', 'logo.png');
225
			}
226
			return $logo . '?v=' . $cacheBusterCounter;
227
		}
228
229
		return $this->urlGenerator->linkToRoute('theming.Theming.getImage', [ 'key' => 'logo', 'useSvg' => $useSvg, 'v' => $cacheBusterCounter ]);
230
	}
231
232
	/**
233
	 * Themed background image url
234
	 *
235
	 * @return string
236
	 */
237
	public function getBackground(): string {
238
		return $this->imageManager->getImageUrl('background');
239
	}
240
241
	/**
242
	 * @return string
243
	 */
244
	public function getiTunesAppId() {
245
		return $this->config->getAppValue('theming', 'iTunesAppId', $this->iTunesAppId);
246
	}
247
248
	/**
249
	 * @return string
250
	 */
251
	public function getiOSClientUrl() {
252
		return $this->config->getAppValue('theming', 'iOSClientUrl', $this->iOSClientUrl);
253
	}
254
255
	/**
256
	 * @return string
257
	 */
258
	public function getAndroidClientUrl() {
259
		return $this->config->getAppValue('theming', 'AndroidClientUrl', $this->AndroidClientUrl);
260
	}
261
262
263
	/**
264
	 * @return array scss variables to overwrite
265
	 */
266
	public function getScssVariables() {
267
		$cache = $this->cacheFactory->createDistributed('theming-' . $this->urlGenerator->getBaseUrl());
268
		if ($value = $cache->get('getScssVariables')) {
269
			return $value;
270
		}
271
272
		$variables = [
273
			'theming-cachebuster' => "'" . $this->config->getAppValue('theming', 'cachebuster', '0') . "'",
274
			'theming-logo-mime' => "'" . $this->config->getAppValue('theming', 'logoMime') . "'",
275
			'theming-background-mime' => "'" . $this->config->getAppValue('theming', 'backgroundMime') . "'",
276
			'theming-logoheader-mime' => "'" . $this->config->getAppValue('theming', 'logoheaderMime') . "'",
277
			'theming-favicon-mime' => "'" . $this->config->getAppValue('theming', 'faviconMime') . "'"
278
		];
279
280
		$variables['image-logo'] = "url('".$this->imageManager->getImageUrl('logo')."')";
281
		$variables['image-logoheader'] = "'".$this->imageManager->getImageUrl('logoheader')."'";
282
		$variables['image-favicon'] = "'".$this->imageManager->getImageUrl('favicon')."'";
283
		$variables['image-login-background'] = "url('".$this->imageManager->getImageUrl('background')."')";
284
		$variables['image-login-plain'] = 'false';
285
286
		if ($this->config->getAppValue('theming', 'color', null) !== null) {
287
			$variables['color-primary'] = $this->getColorPrimary();
288
			$variables['color-primary-text'] = $this->getTextColorPrimary();
289
			$variables['color-primary-element'] = $this->util->elementColor($this->getColorPrimary());
290
		}
291
292
		if ($this->config->getAppValue('theming', 'backgroundMime', null) === 'backgroundColor') {
293
			$variables['image-login-plain'] = 'true';
294
		}
295
296
		$variables['has-legal-links'] = 'false';
297
		if($this->getImprintUrl() !== '' || $this->getPrivacyUrl() !== '') {
298
			$variables['has-legal-links'] = 'true';
299
		}
300
301
		$cache->set('getScssVariables', $variables);
302
		return $variables;
303
	}
304
305
	/**
306
	 * Check if the image should be replaced by the theming app
307
	 * and return the new image location then
308
	 *
309
	 * @param string $app name of the app
310
	 * @param string $image filename of the image
311
	 * @return bool|string false if image should not replaced, otherwise the location of the image
312
	 */
313
	public function replaceImagePath($app, $image) {
314
		if($app==='') {
315
			$app = 'core';
316
		}
317
		$cacheBusterValue = $this->config->getAppValue('theming', 'cachebuster', '0');
318
319
		try {
320
			$customFavicon = $this->imageManager->getImage('favicon');
321
		} catch (NotFoundException $e) {
322
			$customFavicon = null;
323
		}
324
325 View Code Duplication
		if ($image === 'favicon.ico' && ($customFavicon !== null || $this->imageManager->shouldReplaceIcons())) {
326
			return $this->urlGenerator->linkToRoute('theming.Icon.getFavicon', ['app' => $app]) . '?v=' . $cacheBusterValue;
327
		}
328 View Code Duplication
		if ($image === 'favicon-touch.png' && ($customFavicon !== null || $this->imageManager->shouldReplaceIcons())) {
329
			return $this->urlGenerator->linkToRoute('theming.Icon.getTouchIcon', ['app' => $app]) . '?v=' . $cacheBusterValue;
330
		}
331
		if ($image === 'manifest.json') {
332
			try {
333
				$appPath = $this->appManager->getAppPath($app);
334
				if (file_exists($appPath . '/img/manifest.json')) {
335
					return false;
336
				}
337
			} catch (AppPathNotFoundException $e) {}
0 ignored issues
show
Coding Style Comprehensibility introduced by
Consider adding a comment why this CATCH block is empty.
Loading history...
338
			return $this->urlGenerator->linkToRoute('theming.Theming.getManifest') . '?v=' . $cacheBusterValue;
339
		}
340
		return false;
341
	}
342
	
343
	/**
344
	 * Increases the cache buster key
345
	 */
346
	private function increaseCacheBuster() {
347
		$cacheBusterKey = $this->config->getAppValue('theming', 'cachebuster', '0');
348
		$this->config->setAppValue('theming', 'cachebuster', (int)$cacheBusterKey+1);
349
		$this->cacheFactory->createDistributed('theming-')->clear();
350
		$this->cacheFactory->createDistributed('imagePath')->clear();
351
352
	}
353
354
	/**
355
	 * Update setting in the database
356
	 *
357
	 * @param string $setting
358
	 * @param string $value
359
	 */
360
	public function set($setting, $value) {
361
		$this->config->setAppValue('theming', $setting, $value);
362
		$this->increaseCacheBuster();
363
	}
364
365
	/**
366
	 * Revert settings to the default value
367
	 *
368
	 * @param string $setting setting which should be reverted
369
	 * @return string default value
370
	 */
371
	public function undo($setting) {
372
		$this->config->deleteAppValue('theming', $setting);
373
		$this->increaseCacheBuster();
374
375
		switch ($setting) {
376
			case 'name':
377
				$returnValue = $this->getEntity();
378
				break;
379
			case 'url':
380
				$returnValue = $this->getBaseUrl();
381
				break;
382
			case 'slogan':
383
				$returnValue = $this->getSlogan();
384
				break;
385
			case 'color':
386
				$returnValue = $this->getColorPrimary();
387
				break;
388
			default:
389
				$returnValue = '';
390
				break;
391
		}
392
393
		return $returnValue;
394
	}
395
396
	/**
397
	 * Color of text in the header and primary buttons
398
	 *
399
	 * @return string
400
	 */
401
	public function getTextColorPrimary() {
402
		return $this->util->invertTextColor($this->getColorPrimary()) ? '#000000' : '#ffffff';
403
	}
404
}
405