{ "translations": { "Shared with %1$s" : "Shared with %1$s", "Shared with {email}" : "Shared with {email}", "Shared with %1$s by %2$s" : "Shared with %1$s by %2$s", "Shared with {email} by {actor}" : "Shared with {email} by {actor}", "Password for mail share sent to %1$s" : "Password for mail share sent to %1$s", "Password for mail share sent to {email}" : "Password for mail share sent to {email}", "Password for mail share sent to you" : "Password for mail share sent to you", "You shared %1$s with %2$s by mail" : "You shared %1$s with %2$s by mail", "You shared {file} with {email} by mail" : "You shared {file} with {email} by mail", "%3$s shared %1$s with %2$s by mail" : "%3$s shared %1$s with %2$s by mail", "{actor} shared {file} with {email} by mail" : "{actor} shared {file} with {email} by mail", "Password to access %1$s was sent to %2s" : "Password to access %1$s was sent to %2s", "Password to access {file} was sent to {email}" : "Password to access {file} was sent to {email}", "Password to access %1$s was sent to you" : "Password to access %1$s was sent to you", "Password to access {file} was sent to you" : "Password to access {file} was sent to you", "Sharing %s failed, this item is already shared with %s" : "Sharing %s failed, this item is already shared with %s", "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again." : "We can't send you the auto-generated password. Please set a valid email address in your personal settings and try again.", "Failed to send share by E-mail" : "Failed to send share by E-mail", "%s shared »%s« with you" : "%s shared »%s« with you", "%s shared »%s« with you." : "%s shared »%s« with you.", "Click the button below to open it." : "Click the button below to open it.", "Open »%s«" : "Open »%s«", "%s via %s" : "%s via %s", "Password to access »%s« shared to you by %s" : "Password to access »%s« shared to you by %s", "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n" : "%s shared »%s« with you.\nYou should have already received a separate mail with a link to access it.\n", "%s shared »%s« with you. You should have already received a separate mail with a link to access it." : "%s shared »%s« with you. You should have already received a separate mail with a link to access it.", "Password to access »%s«" : "Password to access »%s«", "It is protected with the following password: %s" : "It is protected with the following password: %s", "Password to access »%s« shared with %s" : "Password to access »%s« shared with %s", "You just shared »%s« with %s. The share was already send to the recipient. Due to the security policies defined by the administrator of %s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient." : "You just shared »%s« with %s. The share was already send to the recipient. Due to the security policies defined by the administrator of %s each share needs to be protected by password and it is not allowed to send the password directly to the recipient. Therefore you need to forward the password manually to the recipient.", "This is the password: %s" : "This is the password: %s", "You can choose a different password at any time in the share dialog." : "You can choose a different password at any time in the share dialog.", "Could not find share" : "Could not find share", "Share by mail" : "Share by mail", "Allows users to share a personalized link to a file or folder by putting in an email address." : "Allows users to share a personalised link to a file or folder by putting in an email address.", "Send password by mail" : "Send password by mail", "Enforce password protection" : "Enforce password protection", "%s shared »%s« with you on behalf of %s" : "%s shared »%s« with you on behalf of %s", "Failed to create the E-mail" : "Failed to create the E-mail", "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n" : "Hey there,\n\n%s shared »%s« with you on behalf of %s.\n\n%s\n\n", "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n" : "Hey there,\n\n%s shared »%s« with you.\n\n%s\n\n", "Cheers!" : "Cheers!", "Hey there,

%s shared %s with you on behalf of %s.

" : "Hey there,

%s shared %s with you on behalf of %s.

", "Hey there,

%s shared %s with you.

" : "Hey there,

%s shared %s with you.

" },"pluralForm" :"nplurals=2; plural=(n != 1);" }artonge/fix/remove_unnecessary_formating'>artonge/fix/remove_unnecessary_formating Nextcloud server, a safe home for all your data: https://github.com/nextcloud/serverwww-data
summaryrefslogtreecommitdiffstats
path: root/core/Controller/SvgController.php
blob: 1fad9c39c3b383c903d65f21d127c74eff7c8d31 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?php
declare (strict_types = 1);
/**
 * @copyright Copyright (c) 2018, John Molakvoæ (skjnldsv@protonmail.com)
 *
 * @author John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
 *
 * @license GNU AGPL version 3 or any later version
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

namespace OC\Core\Controller;

use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\DataDisplayResponse;
use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Files\NotFoundException;
use OCP\App\IAppManager;
use OCP\IRequest;

class SvgController extends Controller {

	/** @var string */
	protected $serverRoot;

	/** @var ITimeFactory */
	protected $timeFactory;

	/** @var IAppManager */
	protected $appManager;

	public function __construct(string $appName,
								IRequest $request,
								ITimeFactory $timeFactory,
								IAppManager $appManager) {
		parent::__construct($appName, $request);

		$this->serverRoot  = \OC::$SERVERROOT;
		$this->timeFactory = $timeFactory;
		$this->appManager = $appManager;
	}

	/**
	 * @PublicPage
	 * @NoCSRFRequired
	 *
	 * Generate svg from filename with the requested color
	 *
	 * @param string $folder
	 * @param string $fileName
	 * @param string $color
	 * @return DataDisplayResponse|NotFoundResponse
	 */
	public function getSvgFromCore(string $folder, string $fileName, string $color = 'ffffff') {
		$path = $this->serverRoot . "/core/img/$folder/$fileName.svg";
		return $this->getSvg($path, $color, $fileName);
	}

	/**
	 * @PublicPage
	 * @NoCSRFRequired
	 *
	 * Generate svg from filename with the requested color
	 *
	 * @param string $app
	 * @param string $fileName
	 * @param string $color
	 * @return DataDisplayResponse|NotFoundResponse
	 */
	public function getSvgFromApp(string $app, string $fileName, string $color = 'ffffff') {

		if ($app === 'settings') {
			$path = $this->serverRoot . "/settings/img/$fileName.svg";
			return $this->getSvg($path, $color, $fileName);
		}

		$appRootPath = $this->appManager->getAppPath($app);
		$appPath = substr($appRootPath, strlen($this->serverRoot));
		
		if (!$appPath) {
			return new NotFoundResponse();
		}
		$path = $this->serverRoot . $appPath ."/img/$fileName.svg";
		return $this->getSvg($path, $color, $fileName);
	}


	/**
	 * Generate svg from filename with the requested color
	 *
	 * @param string $path
	 * @param string $color
	 * @return DataDisplayResponse|NotFoundResponse
	 */
	private function getSvg(string $path, string $color, string $fileName) {
		if (!file_exists($path)) {
			return new NotFoundResponse();
		}

		$svg = file_get_contents($path);

		if (is_null($svg)) {
			return new NotFoundResponse();
		}

		// add fill (fill is not present on black elements)
		$fillRe = '/<((circle|rect|path)((?!fill)[a-z0-9 =".\-#():;])+)\/>/mi';

		$svg = preg_replace($fillRe, '<$1 fill="#' . $color . '"/>', $svg);

		// replace any fill or stroke colors
		$svg = preg_replace('/stroke="#([a-z0-9]{3,6})"/mi', 'stroke="#' . $color . '"', $svg);
		$svg = preg_replace('/fill="#([a-z0-9]{3,6})"/mi', 'fill="#' . $color . '"', $svg);

		$response = new DataDisplayResponse($svg, Http::STATUS_OK, ['Content-Type' => 'image/svg+xml']);

		// Set cache control
		$ttl = 31536000;
		$response->cacheFor($ttl);
		$response->addHeader('Content-Disposition', 'inline; filename="' . $fileName . '.svg"');
		$expires = new \DateTime();
		$expires->setTimestamp($this->timeFactory->getTime());
		$expires->add(new \DateInterval('PT' . $ttl . 'S'));
		$response->addHeader('Expires', $expires->format(\DateTime::RFC1123));
		$response->addHeader('Pragma', 'cache');

		return $response;
	}
}