summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/files_external/lib/Lib/Storage/SMB.php70
-rw-r--r--apps/files_external/tests/Storage/SmbTest.php19
-rw-r--r--apps/theming/lib/Controller/ThemingController.php19
-rw-r--r--apps/theming/tests/Controller/ThemingControllerTest.php50
-rw-r--r--core/css/styles.scss1
-rw-r--r--core/js/login/authpicker.js4
-rw-r--r--core/js/share.js87
-rw-r--r--core/js/systemtags/systemtagsinputfield.js6
-rw-r--r--core/js/tags.js371
-rw-r--r--core/shipped.json4
-rw-r--r--core/templates/layout.user.php4
-rw-r--r--settings/templates/admin/additional-mail.php2
12 files changed, 146 insertions, 491 deletions
diff --git a/apps/files_external/lib/Lib/Storage/SMB.php b/apps/files_external/lib/Lib/Storage/SMB.php
index cc4cd641ce5..7afdb746a98 100644
--- a/apps/files_external/lib/Lib/Storage/SMB.php
+++ b/apps/files_external/lib/Lib/Storage/SMB.php
@@ -31,6 +31,7 @@
namespace OCA\Files_External\Lib\Storage;
+use Icewind\SMB\Exception\AlreadyExistsException;
use Icewind\SMB\Exception\ConnectException;
use Icewind\SMB\Exception\Exception;
use Icewind\SMB\Exception\ForbiddenException;
@@ -90,6 +91,7 @@ class SMB extends Common implements INotifyStorage {
throw new \Exception('Invalid configuration');
}
$this->statCache = new CappedMemoryCache();
+ parent::__construct($params);
}
/**
@@ -162,10 +164,42 @@ class SMB extends Common implements INotifyStorage {
* @return array
*/
protected function formatInfo($info) {
- return array(
+ $result = [
'size' => $info->getSize(),
- 'mtime' => $info->getMTime()
- );
+ 'mtime' => $info->getMTime(),
+ ];
+ if ($info->isDirectory()) {
+ $result['type'] = 'dir';
+ } else {
+ $result['type'] = 'file';
+ }
+ return $result;
+ }
+
+ /**
+ * Rename the files. If the source or the target is the root, the rename won't happen.
+ *
+ * @param string $source the old name of the path
+ * @param string $target the new name of the path
+ * @return bool true if the rename is successful, false otherwise
+ */
+ public function rename($source, $target) {
+ if ($this->isRootDir($source) || $this->isRootDir($target)) {
+ return false;
+ }
+
+ $absoluteSource = $this->buildPath($source);
+ $absoluteTarget = $this->buildPath($target);
+ try {
+ $result = $this->share->rename($absoluteSource, $absoluteTarget);
+ } catch (AlreadyExistsException $e) {
+ $this->remove($target);
+ $result = $this->share->rename($absoluteSource, $absoluteTarget);
+ } catch (\Exception $e) {
+ return false;
+ }
+ unset($this->statCache[$absoluteSource], $this->statCache[$absoluteTarget]);
+ return $result;
}
/**
@@ -220,6 +254,10 @@ class SMB extends Common implements INotifyStorage {
* @return bool
*/
public function unlink($path) {
+ if ($this->isRootDir($path)) {
+ return false;
+ }
+
try {
if ($this->is_dir($path)) {
return $this->rmdir($path);
@@ -239,26 +277,6 @@ class SMB extends Common implements INotifyStorage {
}
/**
- * @param string $path1 the old name
- * @param string $path2 the new name
- * @return bool
- */
- public function rename($path1, $path2) {
- try {
- $this->remove($path2);
- $path1 = $this->buildPath($path1);
- $path2 = $this->buildPath($path2);
- return $this->share->rename($path1, $path2);
- } catch (NotFoundException $e) {
- return false;
- } catch (ForbiddenException $e) {
- return false;
- } catch (ConnectException $e) {
- throw new StorageNotAvailableException($e->getMessage(), $e->getCode(), $e);
- }
- }
-
- /**
* check if a file or folder has been updated since $time
*
* @param string $path
@@ -266,7 +284,7 @@ class SMB extends Common implements INotifyStorage {
* @return bool
*/
public function hasUpdated($path, $time) {
- if (!$path and $this->root == '/') {
+ if (!$path and $this->root === '/') {
// mtime doesn't work for shares, but giving the nature of the backend,
// doing a full update is still just fast enough
return true;
@@ -343,6 +361,10 @@ class SMB extends Common implements INotifyStorage {
}
public function rmdir($path) {
+ if ($this->isRootDir($path)) {
+ return false;
+ }
+
try {
$this->statCache = array();
$content = $this->share->dir($this->buildPath($path));
diff --git a/apps/files_external/tests/Storage/SmbTest.php b/apps/files_external/tests/Storage/SmbTest.php
index 45c01a0c59e..037c4cd4d39 100644
--- a/apps/files_external/tests/Storage/SmbTest.php
+++ b/apps/files_external/tests/Storage/SmbTest.php
@@ -132,4 +132,23 @@ class SmbTest extends \Test\Files\Storage\Storage {
$this->assertEquals(new Change(IChange::ADDED, 'newfile.txt'), $result);
}
+
+ public function testRenameRoot() {
+ // root can't be renamed
+ $this->assertFalse($this->instance->rename('', 'foo1'));
+
+ $this->instance->mkdir('foo2');
+ $this->assertFalse($this->instance->rename('foo2', ''));
+ $this->instance->rmdir('foo2');
+ }
+
+ public function testUnlinkRoot() {
+ // root can't be deleted
+ $this->assertFalse($this->instance->unlink(''));
+ }
+
+ public function testRmdirRoot() {
+ // root can't be deleted
+ $this->assertFalse($this->instance->rmdir(''));
+ }
}
diff --git a/apps/theming/lib/Controller/ThemingController.php b/apps/theming/lib/Controller/ThemingController.php
index cffc628e9b9..faaff1f2174 100644
--- a/apps/theming/lib/Controller/ThemingController.php
+++ b/apps/theming/lib/Controller/ThemingController.php
@@ -40,6 +40,7 @@ use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Files\File;
use OCP\Files\IAppData;
use OCP\Files\NotFoundException;
+use OCP\Files\NotPermittedException;
use OCP\IConfig;
use OCP\IL10N;
use OCP\ILogger;
@@ -265,6 +266,24 @@ class ThemingController extends Controller {
$value = $this->themingDefaults->undo($setting);
// reprocess server scss for preview
$cssCached = $this->scssCacher->process(\OC::$SERVERROOT, '/core/css/server.scss', 'core');
+
+ if($setting === 'logoMime') {
+ try {
+ $file = $this->appData->getFolder('images')->getFile('logo');
+ $file->delete();
+ } catch (NotFoundException $e) {
+ } catch (NotPermittedException $e) {
+ }
+ }
+ if($setting === 'backgroundMime') {
+ try {
+ $file = $this->appData->getFolder('images')->getFile('background');
+ $file->delete();
+ } catch (NotFoundException $e) {
+ } catch (NotPermittedException $e) {
+ }
+ }
+
return new DataResponse(
[
'data' =>
diff --git a/apps/theming/tests/Controller/ThemingControllerTest.php b/apps/theming/tests/Controller/ThemingControllerTest.php
index 0aa9ead3742..f22c317d73d 100644
--- a/apps/theming/tests/Controller/ThemingControllerTest.php
+++ b/apps/theming/tests/Controller/ThemingControllerTest.php
@@ -385,6 +385,56 @@ class ThemingControllerTest extends TestCase {
$this->assertEquals($expected, $this->themingController->undo('MySetting'));
}
+ public function dataUndoDelete() {
+ return [
+ [ 'backgroundMime', 'background' ],
+ [ 'logoMime', 'logo' ]
+ ];
+ }
+
+ /** @dataProvider dataUndoDelete */
+ public function testUndoDelete($value, $filename) {
+ $this->l10n
+ ->expects($this->once())
+ ->method('t')
+ ->with('Saved')
+ ->willReturn('Saved');
+ $this->themingDefaults
+ ->expects($this->once())
+ ->method('undo')
+ ->with($value)
+ ->willReturn($value);
+ $folder = $this->createMock(ISimpleFolder::class);
+ $file = $this->createMock(ISimpleFile::class);
+ $this->appData
+ ->expects($this->once())
+ ->method('getFolder')
+ ->with('images')
+ ->willReturn($folder);
+ $folder
+ ->expects($this->once())
+ ->method('getFile')
+ ->with($filename)
+ ->willReturn($file);
+ $file
+ ->expects($this->once())
+ ->method('delete');
+
+ $expected = new DataResponse(
+ [
+ 'data' =>
+ [
+ 'value' => $value,
+ 'message' => 'Saved',
+ ],
+ 'status' => 'success'
+ ]
+ );
+ $this->assertEquals($expected, $this->themingController->undo($value));
+ }
+
+
+
public function testGetLogoNotExistent() {
$this->appData->method('getFolder')
->with($this->equalTo('images'))
diff --git a/core/css/styles.scss b/core/css/styles.scss
index f85ae93ccc8..3468cf6900a 100644
--- a/core/css/styles.scss
+++ b/core/css/styles.scss
@@ -1072,6 +1072,7 @@ span.ui-icon {
/* show ~4.5 entries */
height: 278px;
width: 350px;
+ max-width: 90%;
right: 13px;
&::after {
diff --git a/core/js/login/authpicker.js b/core/js/login/authpicker.js
index 6d8a6bb4160..666a63da365 100644
--- a/core/js/login/authpicker.js
+++ b/core/js/login/authpicker.js
@@ -8,6 +8,8 @@ jQuery(document).ready(function() {
$('#submit-app-token-login').click(function(e) {
e.preventDefault();
- window.location.href = 'nc://' + encodeURIComponent($('#user').val()) + ':' + encodeURIComponent($('#password').val()) + '@' + encodeURIComponent($('#serverHost').val());
+ window.location.href = 'nc://'
+ + encodeURIComponent($('#user').val()) + ':' + encodeURIComponent($('#password').val())
+ + '@' + encodeURIComponent($('#serverHost').val());
});
});
diff --git a/core/js/share.js b/core/js/share.js
index 194eba5fbd4..1f2126b8f51 100644
--- a/core/js/share.js
+++ b/core/js/share.js
@@ -315,93 +315,6 @@ OC.Share = _.extend(OC.Share || {}, {
}
icon.removeClass('icon-shared icon-public').addClass(iconClass);
},
- /**
- *
- * @param itemType
- * @param itemSource
- * @param callback - optional. If a callback is given this method works
- * asynchronous and the callback will be provided with data when the request
- * is done.
- * @returns {OC.Share.Types.ShareInfo}
- */
- loadItem:function(itemType, itemSource, callback) {
- var data = '';
- var checkReshare = true;
- var async = !_.isUndefined(callback);
- if (typeof OC.Share.statuses[itemSource] === 'undefined') {
- // NOTE: Check does not always work and misses some shares, fix later
- var checkShares = true;
- } else {
- var checkShares = true;
- }
- $.ajax({type: 'GET', url: OC.filePath('core', 'ajax', 'share.php'), data: { fetch: 'getItem', itemType: itemType, itemSource: itemSource, checkReshare: checkReshare, checkShares: checkShares }, async: async, success: function(result) {
- if (result && result.status === 'success') {
- data = result.data;
- } else {
- data = false;
- }
- if(async) {
- callback(data);
- }
- }});
-
- return data;
- },
- share:function(itemType, itemSource, shareType, shareWith, permissions, itemSourceName, expirationDate, callback, errorCallback) {
- // Add a fallback for old share() calls without expirationDate.
- // We should remove this in a later version,
- // after the Apps have been updated.
- if (typeof callback === 'undefined' &&
- typeof expirationDate === 'function') {
- callback = expirationDate;
- expirationDate = '';
- console.warn(
- "Call to 'OC.Share.share()' with too few arguments. " +
- "'expirationDate' was assumed to be 'callback'. " +
- "Please revisit the call and fix the list of arguments."
- );
- }
-
- return $.post(OC.filePath('core', 'ajax', 'share.php'),
- {
- action: 'share',
- itemType: itemType,
- itemSource: itemSource,
- shareType: shareType,
- shareWith: shareWith,
- permissions: permissions,
- itemSourceName: itemSourceName,
- expirationDate: expirationDate
- }, function (result) {
- if (result && result.status === 'success') {
- if (callback) {
- callback(result.data);
- }
- } else {
- if (_.isUndefined(errorCallback)) {
- var msg = t('core', 'Error');
- if (result.data && result.data.message) {
- msg = result.data.message;
- }
- OC.dialogs.alert(msg, t('core', 'Error while sharing'));
- } else {
- errorCallback(result);
- }
- }
- }
- );
- },
- unshare:function(itemType, itemSource, shareType, shareWith, callback) {
- $.post(OC.filePath('core', 'ajax', 'share.php'), { action: 'unshare', itemType: itemType, itemSource: itemSource, shareType: shareType, shareWith: shareWith }, function(result) {
- if (result && result.status === 'success') {
- if (callback) {
- callback();
- }
- } else {
- OC.dialogs.alert(t('core', 'Error while unsharing'), t('core', 'Error'));
- }
- });
- },
showDropDown:function(itemType, itemSource, appendTo, link, possiblePermissions, filename) {
var configModel = new OC.Share.ShareConfigModel();
var attributes = {itemType: itemType, itemSource: itemSource, possiblePermissions: possiblePermissions};
diff --git a/core/js/systemtags/systemtagsinputfield.js b/core/js/systemtags/systemtagsinputfield.js
index 62dae1e0a8f..ba72d486204 100644
--- a/core/js/systemtags/systemtagsinputfield.js
+++ b/core/js/systemtags/systemtagsinputfield.js
@@ -240,7 +240,11 @@
self.collection.fetch({
success: function(collection) {
// find the tag in the collection
- var model = collection.where({name: e.object.name.trim(), userVisible: true, userAssignable: true});
+ var model = collection.where({
+ name: e.object.name.trim(),
+ userVisible: true,
+ userAssignable: true
+ });
if (model.length) {
model = model[0];
// the tag already exists or was already assigned,
diff --git a/core/js/tags.js b/core/js/tags.js
deleted file mode 100644
index b4c2c220df2..00000000000
--- a/core/js/tags.js
+++ /dev/null
@@ -1,371 +0,0 @@
-OC.Tags= {
- edit:function(type, cb) {
- if(!type && !this.type) {
- throw {
- name: 'MissingParameter',
- message: t(
- 'core',
- 'The object type is not specified.'
- )
- };
- }
- type = type ? type : this.type;
- var self = this;
- $.when(this._getTemplate()).then(function($tmpl) {
- if(self.$dialog) {
- self.$dialog.ocdialog('close');
- }
- self.$dialog = $tmpl.octemplate({
- addText: t('core', 'Enter new')
- });
- $('body').append(self.$dialog);
-
- self.$dialog.ready(function() {
- self.$taglist = self.$dialog.find('.taglist');
- self.$taginput = self.$dialog.find('.addinput');
- self.$taglist.on('change', 'input:checkbox', function(event) {
- self._handleChanges(self.$taglist, self.$taginput);
- });
- self.$taginput.on('input', function(event) {
- self._handleChanges(self.$taglist, self.$taginput);
- });
- self.deleteButton = {
- text: t('core', 'Delete'),
- click: function() {
- self._deleteTags(
- self,
- type,
- self._selectedIds()
- );
- }
- };
- self.addButton = {
- text: t('core', 'Add'),
- click: function() {
- self._addTag(
- self,
- type,
- self.$taginput.val()
- );
- }
- };
-
- self._fillTagList(type, self.$taglist);
- });
-
- self.$dialog.ocdialog({
- title: t('core', 'Edit tags'),
- closeOnEscape: true,
- width: 250,
- height: 'auto',
- modal: true,
- //buttons: buttonlist,
- close: function(event, ui) {
- try {
- $(this).ocdialog('destroy').remove();
- } catch(e) {console.warn(e);}
- self.$dialog = null;
- }
- });
- })
- .fail(function(status, error) {
- // If the method is called while navigating away
- // from the page, it is probably not needed ;)
- if(status !== 0) {
- alert(t('core', 'Error loading dialog template: {error}', {error: error}));
- }
- });
- },
- /**
- * @param {string} type
- * @param {string} tag
- * @return jQuery.Promise which resolves with an array of ids
- */
- getIdsForTag:function(type, tag) {
- if(!type && !this.type) {
- throw new Error('The object type is not specified.');
- }
- type = type ? type : this.type;
- var defer = $.Deferred(),
- url = OC.generateUrl('/tags/{type}/ids', {type: type});
- $.getJSON(url, {tag: tag}, function(response) {
- if(response.status === 'success') {
- defer.resolve(response.ids);
- } else {
- defer.reject(response);
- }
- });
- return defer.promise();
- },
- /**
- * @param {string} type
- * @return {*} jQuery.Promise which resolves with an array of ids
- */
- getFavorites:function(type) {
- if(!type && !this.type) {
- throw new Error('The object type is not specified.');
- }
- type = type ? type : this.type;
- var defer = $.Deferred(),
- url = OC.generateUrl('/tags/{type}/favorites', {type: type});
- $.getJSON(url, function(response) {
- if(response.status === 'success') {
- defer.resolve(response.ids);
- } else {
- defer.reject(response);
- }
- });
- return defer.promise();
- },
- /**
- * @param {string} type
- * @return {*} jQuery.Promise which resolves with an array of id/name objects
- */
- getTags:function(type) {
- if(!type && !this.type) {
- throw new Error('The object type is not specified.');
- }
- type = type ? type : this.type;
- var defer = $.Deferred(),
- url = OC.generateUrl('/tags/{type}', {type: type});
- $.getJSON(url, function(response) {
- if(response.status === 'success') {
- defer.resolve(response.tags);
- } else {
- defer.reject(response);
- }
- });
- return defer.promise();
- },
- /**
- * @param {number} id
- * @param {string} tag
- * @param {string} type
- * @return {*} jQuery.Promise
- */
- tagAs:function(id, tag, type) {
- if(!type && !this.type) {
- throw new Error('The object type is not specified.');
- }
- type = type ? type : this.type;
- var defer = $.Deferred(),
- url = OC.generateUrl('/tags/{type}/tag/{id}/', {type: type, id: id});
- $.post(url, {tag: tag}, function(response) {
- if(response.status === 'success') {
- defer.resolve(response);
- } else {
- defer.reject(response);
- }
- }).fail(function(jqXHR, textStatus, errorThrown) {
- defer.reject(jqXHR.status, errorThrown);
- });
- return defer.promise();
- },
- /**
- * @param {number} id
- * @param {string} tag
- * @param {string} type
- * @return {*} jQuery.Promise
- */
- unTag:function(id, tag, type) {
- if(!type && !this.type) {
- throw new Error('The object type is not specified.');
- }
- type = type ? type : this.type;
- var defer = $.Deferred(),
- self = this,
- url = OC.generateUrl('/tags/{type}/untag/{id}/', {type: type, id: id});
- $.post(url, {tag: tag}, function(response) {
- if(response.status === 'success') {
- defer.resolve(response);
- } else {
- defer.reject(response);
- }
- }).fail(function(jqXHR, textStatus, errorThrown) {
- defer.reject(jqXHR.status, errorThrown);
- });
- return defer.promise();
- },
- /**
- * @param {number} id
- * @param {string} type
- * @return {*} jQuery.Promise
- */
- addToFavorites:function(id, type) {
- if(!type && !this.type) {
- throw new Error('The object type is not specified.');
- }
- type = type ? type : this.type;
- var defer = $.Deferred(),
- url = OC.generateUrl(
- '/tags/{type}/favorite/{id}/',
- {type: type, id: id}
- );
- $.post(url, function(response) {
- if(response.status === 'success') {
- defer.resolve(response);
- } else {
- defer.reject(response);
- }
- }).fail(function(jqXHR, textStatus, errorThrown) {
- defer.reject(jqXHR.status, errorThrown);
- });
- return defer.promise();
- },
- /**
- * @param {number} id
- * @param {string} type
- * @return {*} jQuery.Promise
- */
- removeFromFavorites:function(id, type) {
- if(!type && !this.type) {
- throw new Error('The object type is not specified.');
- }
- type = type ? type : this.type;
- var defer = $.Deferred(),
- url = OC.generateUrl(
- '/tags/{type}/unfavorite/{id}/',
- {type: type, id: id}
- );
- $.post(url, function(response) {
- if(response.status === 'success') {
- defer.resolve();
- } else {
- defer.reject(response);
- }
- }).fail(function(jqXHR, textStatus, errorThrown) {
- defer.reject(jqXHR.status, errorThrown);
- });
- return defer.promise();
- },
- /**
- * @param {string} tag
- * @param {string} type
- * @return {*} jQuery.Promise which resolves with an object with the name and the new id
- */
- addTag:function(tag, type) {
- if(!type && !this.type) {
- throw new Error('The object type is not specified.');
- }
- type = type ? type : this.type;
- var defer = $.Deferred(),
- url = OC.generateUrl('/tags/{type}/add', {type: type});
- $.post(url,{tag:tag}, function(response) {
- if(typeof cb == 'function') {
- cb(response);
- }
- if(response.status === 'success') {
- defer.resolve({id:response.id, name: tag});
- } else {
- defer.reject(response);
- }
- }).fail(function(jqXHR, textStatus, errorThrown) {
- defer.reject(jqXHR.status, errorThrown);
- });
- return defer.promise();
- },
- /**
- * @param {array} tags
- * @param {string} type
- * @return {*} jQuery.Promise
- */
- deleteTags:function(tags, type) {
- if(!type && !this.type) {
- throw new Error('The object type is not specified.');
- }
- type = type ? type : this.type;
- var defer = $.Deferred(),
- url = OC.generateUrl('/tags/{type}/delete', {type: type});
- if(!tags || !tags.length) {
- throw new Error(t('core', 'No tags selected for deletion.'));
- }
- $.post(url, {tags:tags}, function(response) {
- if(response.status === 'success') {
- defer.resolve(response.tags);
- } else {
- defer.reject(response);
- }
- }).fail(function(jqXHR, textStatus, errorThrown) {
- defer.reject(jqXHR.status, errorThrown);
- });
- return defer.promise();
- },
- _update:function(tags, type) {
- if(!this.$dialog) {
- return;
- }
- var $taglist = this.$dialog.find('.taglist'),
- self = this;
- $taglist.empty();
- $.each(tags, function(idx, tag) {
- var $item = self.$listTmpl.octemplate({id: tag.id, name: tag.name});
- $item.appendTo($taglist);
- });
- $(this).trigger('change', {type: type, tags: tags});
- if(typeof this.changed === 'function') {
- this.changed(tags);
- }
- },
- _getTemplate: function() {
- var defer = $.Deferred();
- if(!this.$template) {
- var self = this;
- $.get(OC.filePath('core', 'templates', 'tags.html'), function(tmpl) {
- self.$template = $(tmpl);
- self.$listTmpl = self.$template.find('.taglist li:first-child').detach();
- defer.resolve(self.$template);
- })
- .fail(function(jqXHR, textStatus, errorThrown) {
- defer.reject(jqXHR.status, errorThrown);
- });
- } else {
- defer.resolve(this.$template);
- }
- return defer.promise();
- },
- _fillTagList: function(type) {
- var self = this;
- $.when(this.getTags(type))
- .then(function(tags) {
- self._update(tags, type);
- })
- .fail(function(response) {
- console.warn(response);
- });
- },
- _selectedIds: function() {
- return $.map(this.$taglist.find('input:checked'), function(b) {return $(b).val();});
- },
- _handleChanges: function($list, $input) {
- var ids = this._selectedIds();
- var buttons = [];
- if($input.val().length) {
- buttons.push(this.addButton);
- }
- if(ids.length) {
- buttons.push(this.deleteButton);
- }
- this.$dialog.ocdialog('option', 'buttons', buttons);
- },
- _deleteTags: function(self, type, ids) {
- $.when(self.deleteTags(ids, type))
- .then(function() {
- self._fillTagList(type);
- self.$dialog.ocdialog('option', 'buttons', []);
- })
- .fail(function(response) {
- console.warn(response);
- });
- },
- _addTag: function(self, type, tag) {
- $.when(self.addTag(tag, type))
- .then(function(tag) {
- self._fillTagList(type);
- self.$taginput.val('').trigger('input');
- })
- .fail(function(response) {
- console.warn(response);
- });
- }
-};
-
diff --git a/core/shipped.json b/core/shipped.json
index 679e1c7f706..e114ec769e7 100644
--- a/core/shipped.json
+++ b/core/shipped.json
@@ -2,7 +2,6 @@
"shippedApps": [
"activity",
"admin_audit",
- "bruteforcesettings",
"comments",
"dav",
"encryption",
@@ -10,11 +9,8 @@
"federatedfilesharing",
"federation",
"files",
- "files_accesscontrol",
- "files_automatedtagging",
"files_external",
"files_pdfviewer",
- "files_retention",
"files_sharing",
"files_texteditor",
"files_trashbin",
diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php
index 426ed4b1125..978534b869c 100644
--- a/core/templates/layout.user.php
+++ b/core/templates/layout.user.php
@@ -85,7 +85,7 @@
</ul>
<nav role="navigation">
- <div id="navigation">
+ <div id="navigation" style="display: none;">
<div id="apps">
<ul>
<?php foreach($_['navigation'] as $entry): ?>
@@ -134,7 +134,7 @@
</div>
<div id="expandDisplayName" class="icon-settings-white"></div>
</div>
- <div id="expanddiv">
+ <div id="expanddiv" style="display:none;">
<ul>
<?php foreach($_['settingsnavigation'] as $entry):?>
<li>
diff --git a/settings/templates/admin/additional-mail.php b/settings/templates/admin/additional-mail.php
index 249252dc694..bce7e5adeee 100644
--- a/settings/templates/admin/additional-mail.php
+++ b/settings/templates/admin/additional-mail.php
@@ -61,7 +61,7 @@ if ($_['mail_smtpmode'] === 'qmail') {
<p>
<label for="mail_smtpmode"><?php p($l->t('Send mode')); ?></label>
- <select name="mail_smtpmode" id="mail_smtpmode'>
+ <select name="mail_smtpmode" id="mail_smtpmode">
<?php foreach ($mail_smtpmode as $smtpmode):
$selected = '';
if ($smtpmode[0] == $_['mail_smtpmode']):