diff --git a/apps/theming/css/settings-admin.css b/apps/theming/css/settings-admin.css
index b0fdb79b291a4..33393527279a0 100644
--- a/apps/theming/css/settings-admin.css
+++ b/apps/theming/css/settings-admin.css
@@ -27,7 +27,7 @@
visibility: hidden;
}
form.uploadButton {
- width: 356px;
+ width: 411px;
}
#theming form .theme-undo,
#theming .theme-remove-bg {
@@ -51,7 +51,7 @@ form.uploadButton {
#theming label span {
display: inline-block;
- min-width: 120px;
+ min-width: 175px;
padding: 8px 0px;
vertical-align: top;
}
@@ -91,7 +91,7 @@ form.uploadButton {
background-size: cover;
background-position: center center;
text-align: center;
- margin-left: 123px;
+ margin-left: 178px;
margin-top: 10px;
cursor: pointer;
}
@@ -104,4 +104,4 @@ form.uploadButton {
.theming-hints {
margin-top: 20px;
-}
\ No newline at end of file
+}
diff --git a/apps/theming/js/settings-admin.js b/apps/theming/js/settings-admin.js
index 7df1bbf11254b..c34da3ff87430 100644
--- a/apps/theming/js/settings-admin.js
+++ b/apps/theming/js/settings-admin.js
@@ -95,7 +95,8 @@ function hideUndoButton(setting, value) {
url: 'https://nextcloud.com',
color: '#0082c9',
logoMime: '',
- backgroundMime: ''
+ backgroundMime: '',
+ imprintUrl: ''
};
if (value === themingDefaults[setting] || value === '') {
@@ -195,6 +196,16 @@ $(document).ready(function () {
}
});
+ $('#theming-imprintUrl').change(function(e) {
+ var el = $(this);
+ $.when(el.focusout()).then(function () {
+ setThemingValue('imprintUrl', $(this).val());
+ });
+ if (e.keyCode == 13) {
+ setThemingValue('imprintUrl', $(this).val());
+ }
+ });
+
$('#theming-slogan').change(function(e) {
var el = $(this);
$.when(el.focusout()).then(function() {
diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php
index 3ac8b7fe587be..80eab2b215342 100644
--- a/apps/theming/lib/Controller/ThemingController.php
+++ b/apps/theming/lib/Controller/ThemingController.php
@@ -157,6 +157,16 @@ public function updateStylesheet($setting, $value) {
]);
}
break;
+ case 'imprintUrl':
+ if (strlen($value) > 500) {
+ return new DataResponse([
+ 'data' => [
+ 'message' => $this->l10n->t('The given legal notice address is too long'),
+ ],
+ 'status' => 'error'
+ ]);
+ }
+ break;
case 'slogan':
if (strlen($value) > 500) {
return new DataResponse([
@@ -459,6 +469,7 @@ public function getJavascript() {
url: ' . json_encode($this->themingDefaults->getBaseUrl()) . ',
slogan: ' . json_encode($this->themingDefaults->getSlogan()) . ',
color: ' . json_encode($this->themingDefaults->getColorPrimary()) . ',
+ imprintUrl: ' . json_encode($this->themingDefaults->getImprintUrl()) . ',
inverted: ' . json_encode($this->util->invertTextColor($this->themingDefaults->getColorPrimary())) . ',
cacheBuster: ' . json_encode($cacheBusterValue) . '
};
diff --git a/apps/theming/lib/Settings/Admin.php b/apps/theming/lib/Settings/Admin.php
index 708bf1914ea0c..469d4b3d6a93d 100644
--- a/apps/theming/lib/Settings/Admin.php
+++ b/apps/theming/lib/Settings/Admin.php
@@ -83,7 +83,8 @@ public function getForm() {
'backgroundMime' => $this->config->getAppValue('theming', 'backgroundMime', ''),
'uploadLogoRoute' => $path,
'canThemeIcons' => $this->themingDefaults->shouldReplaceIcons(),
- 'iconDocs' => $this->urlGenerator->linkToDocs('admin-theming-icons')
+ 'iconDocs' => $this->urlGenerator->linkToDocs('admin-theming-icons'),
+ 'imprintUrl' => $this->themingDefaults->getImprintUrl(),
];
return new TemplateResponse('theming', 'settings-admin', $parameters, '');
diff --git a/apps/theming/lib/ThemingDefaults.php b/apps/theming/lib/ThemingDefaults.php
index ce4ab0abb5540..b2d31b90836a3 100644
--- a/apps/theming/lib/ThemingDefaults.php
+++ b/apps/theming/lib/ThemingDefaults.php
@@ -142,12 +142,26 @@ public function getSlogan() {
return \OCP\Util::sanitizeHTML($this->config->getAppValue('theming', 'slogan', $this->slogan));
}
+ public function getImprintUrl() {
+ return $this->config->getAppValue('theming', 'imprintUrl', '');
+ }
+
public function getShortFooter() {
$slogan = $this->getSlogan();
$footer = '' .$this->getEntity() . ''.
($slogan !== '' ? ' – ' . $slogan : '');
+ $imprintUrl = (string)$this->getImprintUrl();
+ if($imprintUrl !== ''
+ && filter_var($imprintUrl, FILTER_VALIDATE_URL, [
+ 'flags' => FILTER_FLAG_SCHEME_REQUIRED | FILTER_FLAG_HOST_REQUIRED
+ ])
+ ) {
+ $footer .= '
' . $this->l->t('Legal notice') . '';
+ }
+
return $footer;
}
diff --git a/apps/theming/templates/settings-admin.php b/apps/theming/templates/settings-admin.php
index 1b8ed87bb0ded..907c8662efe5f 100644
--- a/apps/theming/templates/settings-admin.php
+++ b/apps/theming/templates/settings-admin.php
@@ -47,7 +47,7 @@
diff --git a/apps/theming/tests/Controller/ThemingControllerTest.php b/apps/theming/tests/Controller/ThemingControllerTest.php
index debc1b71e4740..43f3d1aa2aed9 100644
--- a/apps/theming/tests/Controller/ThemingControllerTest.php
+++ b/apps/theming/tests/Controller/ThemingControllerTest.php
@@ -876,6 +876,7 @@ public function testGetJavascript() {
url: "",
slogan: "",
color: "#000",
+ imprintUrl: null,
inverted: false,
cacheBuster: null
};
@@ -910,6 +911,7 @@ public function testGetJavascriptInverted() {
url: "nextcloudurl",
slogan: "awesome",
color: "#ffffff",
+ imprintUrl: null,
inverted: true,
cacheBuster: null
};
diff --git a/apps/theming/tests/Settings/AdminTest.php b/apps/theming/tests/Settings/AdminTest.php
index bb68651d1431d..f1fda94eb2d0d 100644
--- a/apps/theming/tests/Settings/AdminTest.php
+++ b/apps/theming/tests/Settings/AdminTest.php
@@ -76,6 +76,10 @@ public function testGetFormNoErrors() {
->expects($this->once())
->method('getBaseUrl')
->willReturn('https://example.com');
+ $this->themingDefaults
+ ->expects($this->once())
+ ->method('getImprintUrl')
+ ->willReturn('');
$this->themingDefaults
->expects($this->once())
->method('getSlogan')
@@ -103,6 +107,7 @@ public function testGetFormNoErrors() {
'backgroundMime' => null,
'canThemeIcons' => null,
'iconDocs' => null,
+ 'imprintUrl' => '',
];
$expected = new TemplateResponse('theming', 'settings-admin', $params, '');
@@ -128,6 +133,10 @@ public function testGetFormWithErrors() {
->expects($this->once())
->method('getBaseUrl')
->willReturn('https://example.com');
+ $this->themingDefaults
+ ->expects($this->once())
+ ->method('getImprintUrl')
+ ->willReturn('');
$this->themingDefaults
->expects($this->once())
->method('getSlogan')
@@ -155,6 +164,7 @@ public function testGetFormWithErrors() {
'backgroundMime' => null,
'canThemeIcons' => null,
'iconDocs' => null,
+ 'imprintUrl' => '',
];
$expected = new TemplateResponse('theming', 'settings-admin', $params, '');
diff --git a/apps/theming/tests/ThemingDefaultsTest.php b/apps/theming/tests/ThemingDefaultsTest.php
index 637591b18d42e..9c876b2c0d202 100644
--- a/apps/theming/tests/ThemingDefaultsTest.php
+++ b/apps/theming/tests/ThemingDefaultsTest.php
@@ -193,6 +193,27 @@ public function testGetBaseUrlWithCustom() {
$this->assertEquals('https://example.com/', $this->template->getBaseUrl());
}
+ public function imprintUrlProvider() {
+ return [
+ [ '' ],
+ [ 'https://example.com/imprint.html']
+ ];
+ }
+
+ /**
+ * @param $imprintUrl
+ * @dataProvider imprintUrlProvider
+ */
+ public function testGetImprintURL($imprintUrl) {
+ $this->config
+ ->expects($this->once())
+ ->method('getAppValue')
+ ->with('theming', 'imprintUrl', '')
+ ->willReturn($imprintUrl);
+
+ $this->assertEquals($imprintUrl, $this->template->getImprintUrl());
+ }
+
public function testGetSloganWithDefault() {
$this->config
->expects($this->once())
@@ -215,12 +236,13 @@ public function testGetSloganWithCustom() {
public function testGetShortFooter() {
$this->config
- ->expects($this->exactly(3))
+ ->expects($this->exactly(4))
->method('getAppValue')
->willReturnMap([
['theming', 'url', $this->defaults->getBaseUrl(), 'url'],
['theming', 'name', 'Nextcloud', 'Name'],
['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'],
+ ['theming', 'imprintUrl', '', ''],
]);
$this->assertEquals('Name – Slogan', $this->template->getShortFooter());
@@ -228,17 +250,62 @@ public function testGetShortFooter() {
public function testGetShortFooterEmptySlogan() {
$this->config
- ->expects($this->exactly(3))
+ ->expects($this->exactly(4))
->method('getAppValue')
->willReturnMap([
['theming', 'url', $this->defaults->getBaseUrl(), 'url'],
['theming', 'name', 'Nextcloud', 'Name'],
['theming', 'slogan', $this->defaults->getSlogan(), ''],
+ ['theming', 'imprintUrl', '', ''],
]);
$this->assertEquals('Name', $this->template->getShortFooter());
}
+ public function testGetShortFooterImprint() {
+ $this->config
+ ->expects($this->exactly(4))
+ ->method('getAppValue')
+ ->willReturnMap([
+ ['theming', 'url', $this->defaults->getBaseUrl(), 'url'],
+ ['theming', 'name', 'Nextcloud', 'Name'],
+ ['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'],
+ ['theming', 'imprintUrl', '', 'https://example.com/imprint'],
+ ]);
+
+ $this->l10n
+ ->expects($this->any())
+ ->method('t')
+ ->willReturnArgument(0);
+
+ $this->assertEquals('Name – Slogan
Legal notice', $this->template->getShortFooter());
+ }
+
+ public function invalidImprintUrlProvider() {
+ return [
+ ['example.com/imprint'], # missing scheme
+ ['https:///imprint'], # missing host
+ ];
+ }
+
+ /**
+ * @param $invalidImprintUrl
+ * @dataProvider invalidImprintUrlProvider
+ */
+ public function testGetShortFooterInvalidImprint($invalidImprintUrl) {
+ $this->config
+ ->expects($this->exactly(4))
+ ->method('getAppValue')
+ ->willReturnMap([
+ ['theming', 'url', $this->defaults->getBaseUrl(), 'url'],
+ ['theming', 'name', 'Nextcloud', 'Name'],
+ ['theming', 'slogan', $this->defaults->getSlogan(), 'Slogan'],
+ ['theming', 'imprintUrl', '', $invalidImprintUrl],
+ ]);
+
+ $this->assertEquals('Name – Slogan', $this->template->getShortFooter());
+ }
+
public function testgetColorPrimaryWithDefault() {
$this->config
->expects($this->once())
diff --git a/core/css/guest.css b/core/css/guest.css
index ecc3da9d08166..d95e74fae5b03 100644
--- a/core/css/guest.css
+++ b/core/css/guest.css
@@ -741,6 +741,10 @@ footer .info a {
overflow: hidden;
}
+a.legal {
+ font-size: smaller;
+}
+
/* for low-res screens, use Regular font-weight instead of Light */
@media (-webkit-max-device-pixel-ratio: 1.3), (max-resolution: 124.8dpi) {
@font-face {