diff options
-rw-r--r-- | apps/dav/lib/Upload/UploadHome.php | 3 | ||||
-rw-r--r-- | apps/files/js/file-upload.js | 14 | ||||
-rw-r--r-- | apps/files/l10n/fr.js | 2 | ||||
-rw-r--r-- | apps/files/l10n/fr.json | 2 | ||||
-rw-r--r-- | apps/files/lib/AppInfo/Application.php | 5 | ||||
-rw-r--r-- | apps/files/lib/Service/TagService.php | 16 | ||||
-rw-r--r-- | apps/files/tests/Service/TagServiceTest.php | 8 | ||||
-rw-r--r-- | apps/files_sharing/lib/External/Mount.php | 10 | ||||
-rw-r--r-- | apps/theming/css/theming.scss | 16 | ||||
-rw-r--r-- | build/files-checker.php | 1 | ||||
-rw-r--r-- | core/css/apps.scss | 1 | ||||
-rw-r--r-- | core/js/js.js | 7 | ||||
-rw-r--r-- | core/js/public/comments.js | 2 | ||||
-rw-r--r-- | core/js/tests/specs/coreSpec.js | 61 | ||||
-rw-r--r-- | core/templates/layout.user.php | 14 | ||||
-rw-r--r-- | lib/l10n/ru.js | 4 | ||||
-rw-r--r-- | lib/l10n/ru.json | 4 | ||||
-rw-r--r-- | lib/private/Settings/Manager.php | 3 | ||||
-rw-r--r-- | lib/private/Share20/DefaultShareProvider.php | 6 | ||||
-rw-r--r-- | lib/private/Template/JSConfigHelper.php | 1 |
20 files changed, 143 insertions, 37 deletions
diff --git a/apps/dav/lib/Upload/UploadHome.php b/apps/dav/lib/Upload/UploadHome.php index 9f4ae0e8a2c..ec31e93f4f9 100644 --- a/apps/dav/lib/Upload/UploadHome.php +++ b/apps/dav/lib/Upload/UploadHome.php @@ -66,7 +66,8 @@ class UploadHome implements ICollection { } function getName() { - return 'uploads'; + list(,$name) = \Sabre\Uri\split($this->principalInfo['uri']); + return $name; } function setName($name) { diff --git a/apps/files/js/file-upload.js b/apps/files/js/file-upload.js index 8e95abcb5e8..ad56492730e 100644 --- a/apps/files/js/file-upload.js +++ b/apps/files/js/file-upload.js @@ -235,7 +235,7 @@ OC.FileUpload.prototype = { ) { data.isChunked = true; chunkFolderPromise = this.uploader.davClient.createDirectory( - 'uploads/' + encodeURIComponent(OC.getCurrentUser().uid) + '/' + encodeURIComponent(this.getId()) + 'uploads/' + OC.getCurrentUser().uid + '/' + this.getId() ); // TODO: if fails, it means same id already existed, need to retry } else { @@ -272,8 +272,8 @@ OC.FileUpload.prototype = { } return this.uploader.davClient.move( - 'uploads/' + encodeURIComponent(uid) + '/' + encodeURIComponent(this.getId()) + '/.file', - 'files/' + encodeURIComponent(uid) + '/' + OC.joinPaths(this.getFullPath(), this.getFileName()), + 'uploads/' + uid + '/' + this.getId() + '/.file', + 'files/' + uid + '/' + OC.joinPaths(this.getFullPath(), this.getFileName()), true, headers ); @@ -282,7 +282,7 @@ OC.FileUpload.prototype = { _deleteChunkFolder: function() { // delete transfer directory for this upload this.uploader.davClient.remove( - 'uploads/' + encodeURIComponent(OC.getCurrentUser().uid) + '/' + encodeURIComponent(this.getId()) + 'uploads/' + OC.getCurrentUser().uid + '/' + this.getId() ); }, @@ -1166,9 +1166,9 @@ OC.Uploader.prototype = _.extend({ var chunkId = range.split('/')[0].split('-')[0]; data.url = OC.getRootPath() + '/remote.php/dav/uploads' + - '/' + encodeURIComponent(OC.getCurrentUser().uid) + - '/' + encodeURIComponent(upload.getId()) + - '/' + encodeURIComponent(chunkId); + '/' + OC.getCurrentUser().uid + + '/' + upload.getId() + + '/' + chunkId; delete data.contentRange; delete data.headers['Content-Range']; }); diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js index b5035e6a1a3..ccce056d631 100644 --- a/apps/files/l10n/fr.js +++ b/apps/files/l10n/fr.js @@ -62,9 +62,11 @@ OC.L10N.register( "You don’t have permission to upload or create files here" : "Vous n'avez pas la permission d'envoyer ou de créer des fichiers ici", "_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Téléversement de %n fichiers"], "New" : "Nouveau", + "{used} of {quota} used" : "{used} de {quota} utilisé", "{used} used" : "{used} utilisé", "\"{name}\" is an invalid file name." : "\"{name}\" n'est pas un nom de fichier valide.", "File name cannot be empty." : "Le nom de fichier ne peut être vide.", + "\"/\" is not allowed inside a file name." : "\"/\" n'est pas autorisé dans les noms de fichier.", "\"{name}\" is not an allowed filetype" : "\"{name}\" n'est pas un nom de fichier autorisé.", "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'espace de stockage de {owner} est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !", "Your storage is full, files can not be updated or synced anymore!" : "Votre espace de stockage est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !", diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json index d65a471164e..d1e1320c0dc 100644 --- a/apps/files/l10n/fr.json +++ b/apps/files/l10n/fr.json @@ -60,9 +60,11 @@ "You don’t have permission to upload or create files here" : "Vous n'avez pas la permission d'envoyer ou de créer des fichiers ici", "_Uploading %n file_::_Uploading %n files_" : ["Téléversement de %n fichier","Téléversement de %n fichiers"], "New" : "Nouveau", + "{used} of {quota} used" : "{used} de {quota} utilisé", "{used} used" : "{used} utilisé", "\"{name}\" is an invalid file name." : "\"{name}\" n'est pas un nom de fichier valide.", "File name cannot be empty." : "Le nom de fichier ne peut être vide.", + "\"/\" is not allowed inside a file name." : "\"/\" n'est pas autorisé dans les noms de fichier.", "\"{name}\" is not an allowed filetype" : "\"{name}\" n'est pas un nom de fichier autorisé.", "Storage of {owner} is full, files can not be updated or synced anymore!" : "L'espace de stockage de {owner} est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !", "Your storage is full, files can not be updated or synced anymore!" : "Votre espace de stockage est plein. Les fichiers ne peuvent plus être mis à jour ni synchronisés !", diff --git a/apps/files/lib/AppInfo/Application.php b/apps/files/lib/AppInfo/Application.php index 7042af10ca2..e55d1c549a5 100644 --- a/apps/files/lib/AppInfo/Application.php +++ b/apps/files/lib/AppInfo/Application.php @@ -81,13 +81,14 @@ class Application extends App { $container->registerService('Tagger', function(IContainer $c) { return $c->query('ServerContainer')->getTagManager()->load('files'); }); - $container->registerService('TagService', function(IContainer $c) { + $container->registerService('TagService', function(IContainer $c) use ($server) { $homeFolder = $c->query('ServerContainer')->getUserFolder(); return new TagService( $c->query('ServerContainer')->getUserSession(), $c->query('ServerContainer')->getActivityManager(), $c->query('Tagger'), - $homeFolder + $homeFolder, + $server->getEventDispatcher() ); }); diff --git a/apps/files/lib/Service/TagService.php b/apps/files/lib/Service/TagService.php index d812b16c30e..7437f0c31ad 100644 --- a/apps/files/lib/Service/TagService.php +++ b/apps/files/lib/Service/TagService.php @@ -31,6 +31,8 @@ use OCP\Files\Folder; use OCP\ITags; use OCP\IUser; use OCP\IUserSession; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; +use Symfony\Component\EventDispatcher\GenericEvent; /** * Service class to manage tags on files. @@ -45,23 +47,28 @@ class TagService { private $tagger; /** @var Folder */ private $homeFolder; + /** @var EventDispatcherInterface */ + private $dispatcher; /** * @param IUserSession $userSession * @param IManager $activityManager * @param ITags $tagger * @param Folder $homeFolder + * @param EventDispatcherInterface $dispatcher */ public function __construct( IUserSession $userSession, IManager $activityManager, ITags $tagger, - Folder $homeFolder + Folder $homeFolder, + EventDispatcherInterface $dispatcher ) { $this->userSession = $userSession; $this->activityManager = $activityManager; $this->tagger = $tagger; $this->homeFolder = $homeFolder; + $this->dispatcher = $dispatcher; } /** @@ -114,6 +121,13 @@ class TagService { return; } + $eventName = $addToFavorite ? 'addFavorite' : 'removeFavorite'; + $this->dispatcher->dispatch(self::class . '::' . $eventName, new GenericEvent(null, [ + 'userId' => $user->getUID(), + 'fileId' => $fileId, + 'path' => $path, + ])); + $event = $this->activityManager->generateEvent(); try { $event->setApp('files') diff --git a/apps/files/tests/Service/TagServiceTest.php b/apps/files/tests/Service/TagServiceTest.php index 1c4ac2328ec..4e2aeb84246 100644 --- a/apps/files/tests/Service/TagServiceTest.php +++ b/apps/files/tests/Service/TagServiceTest.php @@ -28,6 +28,7 @@ use OC\Tags; use OCA\Files\Service\TagService; use OCP\Activity\IManager; use OCP\IUserSession; +use Symfony\Component\EventDispatcher\EventDispatcherInterface; /** * Class TagServiceTest @@ -54,6 +55,9 @@ class TagServiceTest extends \Test\TestCase { */ private $root; + /** @var EventDispatcherInterface|\PHPUnit_Framework_MockObject_MockObject */ + private $dispatcher; + /** * @var \OCA\Files\Service\TagService|\PHPUnit_Framework_MockObject_MockObject */ @@ -66,7 +70,7 @@ class TagServiceTest extends \Test\TestCase { protected function setUp() { parent::setUp(); - $this->user = $this->getUniqueID('user'); + $this->user = static::getUniqueID('user'); $this->activityManager = $this->createMock(IManager::class); \OC::$server->getUserManager()->createUser($this->user, 'test'); \OC_User::setUserId($this->user); @@ -83,6 +87,7 @@ class TagServiceTest extends \Test\TestCase { ->will($this->returnValue($user)); $this->root = \OC::$server->getUserFolder(); + $this->dispatcher = $this->createMock(EventDispatcherInterface::class); $this->tagger = \OC::$server->getTagManager()->load('files'); $this->tagService = $this->getTagService(['addActivity']); @@ -99,6 +104,7 @@ class TagServiceTest extends \Test\TestCase { $this->activityManager, $this->tagger, $this->root, + $this->dispatcher, ]) ->setMethods($methods) ->getMock(); diff --git a/apps/files_sharing/lib/External/Mount.php b/apps/files_sharing/lib/External/Mount.php index d756a1830b2..e12f8823cd8 100644 --- a/apps/files_sharing/lib/External/Mount.php +++ b/apps/files_sharing/lib/External/Mount.php @@ -68,4 +68,14 @@ class Mount extends MountPoint implements MoveableMount { public function removeMount() { return $this->manager->removeShare($this->mountPoint); } + + /** + * Get the type of mount point, used to distinguish things like shares and external storages + * in the web interface + * + * @return string + */ + public function getMountType() { + return 'shared'; + } } diff --git a/apps/theming/css/theming.scss b/apps/theming/css/theming.scss index cabcd5a2e0e..63d466542e1 100644 --- a/apps/theming/css/theming.scss +++ b/apps/theming/css/theming.scss @@ -20,10 +20,12 @@ } @if (luma($color-primary) > 0.6) { - #appmenu img, - #appmenu image { + #appmenu:not(.inverted) svg { filter: invert(1); } + #appmenu.inverted svg { + filter: none; + } .searchbox input[type="search"] { background: transparent url('../../../core/img/actions/search.svg') no-repeat 6px center; } @@ -67,10 +69,12 @@ } } } @else { - #appmenu img, - #appmenu image { - filter: none; - } + #appmenu:not(.inverted) svg { + filter: none; + } + #appmenu.inverted svg { + filter: invert(1); + } } /* Colorized svg images */ diff --git a/build/files-checker.php b/build/files-checker.php index 66c44bd971b..20d8b4b5f33 100644 --- a/build/files-checker.php +++ b/build/files-checker.php @@ -49,6 +49,7 @@ $expectedFiles = [ 'build', 'buildjsdocs.sh', 'CHANGELOG.md', + 'CODE_OF_CONDUCT.md', 'composer.json', 'config', 'console.php', diff --git a/core/css/apps.scss b/core/css/apps.scss index e6ead27e12b..41eea3bb524 100644 --- a/core/css/apps.scss +++ b/core/css/apps.scss @@ -235,6 +235,7 @@ kbd { &:first-child img { margin-right: 11px; width: 16px; + height: 16px; margin-left: -30px; } diff --git a/core/js/js.js b/core/js/js.js index f9a5f2b3381..872761c02bb 100644 --- a/core/js/js.js +++ b/core/js/js.js @@ -1675,13 +1675,16 @@ function initCore() { OC.PasswordConfirmation = { callback: null, - + pageLoadTime: null, init: function() { $('.password-confirm-required').on('click', _.bind(this.requirePasswordConfirmation, this)); + this.pageLoadTime = moment.now(); }, requiresPasswordConfirmation: function() { - var timeSinceLogin = moment.now() - (nc_lastLogin * 1000); + var serverTimeDiff = this.pageLoadTime - (nc_pageLoad * 1000); + var timeSinceLogin = moment.now() - (serverTimeDiff + (nc_lastLogin * 1000)); + // if timeSinceLogin > 30 minutes and user backend allows password confirmation return (backendAllowsPasswordConfirmation && timeSinceLogin > 30 * 60 * 1000); }, diff --git a/core/js/public/comments.js b/core/js/public/comments.js index 955e88c8609..ac0bf8e0ab7 100644 --- a/core/js/public/comments.js +++ b/core/js/public/comments.js @@ -43,7 +43,7 @@ } var linkText = url.replace(self.protocolRegex, ''); - return '<a class="external" target="_blank" href="' + url + '">' + linkText + '</a>'; + return '<a class="external" target="_blank" rel="noopener noreferrer" href="' + url + '">' + linkText + '</a>'; }); }, diff --git a/core/js/tests/specs/coreSpec.js b/core/js/tests/specs/coreSpec.js index b6c617303cf..616e7509f7c 100644 --- a/core/js/tests/specs/coreSpec.js +++ b/core/js/tests/specs/coreSpec.js @@ -1539,4 +1539,65 @@ describe('Core base tests', function() { expect(snapperStub.close.calledTwice).toBe(true); }); }); + describe('Requires password confirmation', function () { + var stubMomentNow; + var stubJsPageLoadTime; + + afterEach(function () { + delete window.nc_pageLoad; + delete window.nc_lastLogin; + delete window.backendAllowsPasswordConfirmation; + + stubMomentNow.restore(); + stubJsPageLoadTime.restore(); + }); + + it('should not show the password confirmation dialog when server time is earlier than local time', function () { + // add server variables + window.nc_pageLoad = parseInt(new Date(2018, 0, 3, 1, 15, 0).getTime() / 1000); + window.nc_lastLogin = parseInt(new Date(2018, 0, 3, 1, 0, 0).getTime() / 1000); + window.backendAllowsPasswordConfirmation = true; + + stubJsPageLoadTime = sinon.stub(OC.PasswordConfirmation, 'pageLoadTime').value(new Date(2018, 0, 3, 12, 15, 0).getTime()); + stubMomentNow = sinon.stub(moment, 'now').returns(new Date(2018, 0, 3, 12, 20, 0).getTime()); + + expect(OC.PasswordConfirmation.requiresPasswordConfirmation()).toBeFalsy(); + }); + + it('should show the password confirmation dialog when server time is earlier than local time', function () { + // add server variables + window.nc_pageLoad = parseInt(new Date(2018, 0, 3, 1, 15, 0).getTime() / 1000); + window.nc_lastLogin = parseInt(new Date(2018, 0, 3, 1, 0, 0).getTime() / 1000); + window.backendAllowsPasswordConfirmation = true; + + stubJsPageLoadTime = sinon.stub(OC.PasswordConfirmation, 'pageLoadTime').value(new Date(2018, 0, 3, 12, 15, 0).getTime()); + stubMomentNow = sinon.stub(moment, 'now').returns(new Date(2018, 0, 3, 12, 31, 0).getTime()); + + expect(OC.PasswordConfirmation.requiresPasswordConfirmation()).toBeTruthy(); + }); + + it('should not show the password confirmation dialog when server time is later than local time', function () { + // add server variables + window.nc_pageLoad = parseInt(new Date(2018, 0, 3, 23, 15, 0).getTime() / 1000); + window.nc_lastLogin = parseInt(new Date(2018, 0, 3, 23, 0, 0).getTime() / 1000); + window.backendAllowsPasswordConfirmation = true; + + stubJsPageLoadTime = sinon.stub(OC.PasswordConfirmation, 'pageLoadTime').value(new Date(2018, 0, 3, 12, 15, 0).getTime()); + stubMomentNow = sinon.stub(moment, 'now').returns(new Date(2018, 0, 3, 12, 20, 0).getTime()); + + expect(OC.PasswordConfirmation.requiresPasswordConfirmation()).toBeFalsy(); + }); + + it('should show the password confirmation dialog when server time is later than local time', function () { + // add server variables + window.nc_pageLoad = parseInt(new Date(2018, 0, 3, 23, 15, 0).getTime() / 1000); + window.nc_lastLogin = parseInt(new Date(2018, 0, 3, 23, 0, 0).getTime() / 1000); + window.backendAllowsPasswordConfirmation = true; + + stubJsPageLoadTime = sinon.stub(OC.PasswordConfirmation, 'pageLoadTime').value(new Date(2018, 0, 3, 12, 15, 0).getTime()); + stubMomentNow = sinon.stub(moment, 'now').returns(new Date(2018, 0, 3, 12, 31, 0).getTime()); + + expect(OC.PasswordConfirmation.requiresPasswordConfirmation()).toBeTruthy(); + }); + }); }); diff --git a/core/templates/layout.user.php b/core/templates/layout.user.php index 127e794e120..32762e2c240 100644 --- a/core/templates/layout.user.php +++ b/core/templates/layout.user.php @@ -41,19 +41,17 @@ </div> </a> - <ul id="appmenu"> + <ul id="appmenu" <?php if ($_['themingInvertMenu']) { ?>class="inverted"<?php } ?>> <?php foreach ($_['navigation'] as $entry): ?> <li data-id="<?php p($entry['id']); ?>" class="hidden"> <a href="<?php print_unescaped($entry['href']); ?>" <?php if ($entry['active']): ?> class="active"<?php endif; ?>> - <?php if ($_['themingInvertMenu']) { ?> <svg width="20" height="20" viewBox="0 0 20 20"> - <defs><filter id="invertMenuMain-<?php p($entry['id']); ?>"><feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" /></filter></defs> - <image x="0" y="0" width="20" height="20" preserveAspectRatio="xMinYMin meet" filter="url(#invertMenuMain-<?php p($entry['id']); ?>)" xlink:href="<?php print_unescaped($entry['icon'] . '?v=' . $_['versionHash']); ?>" class="app-icon" /></svg> - <?php } else { ?> - <img src="<?php print_unescaped($entry['icon'] . '?v=' . $_['versionHash']); ?>" - class="app-icon" alt="<?php p($entry['name']); ?>" /> - <?php } ?> + <?php if ($_['themingInvertMenu']) { ?> + <defs><filter id="invertMenuMain-<?php p($entry['id']); ?>"><feColorMatrix in="SourceGraphic" type="matrix" values="-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0" /></filter></defs> + <?php } ?> + <image x="0" y="0" width="20" height="20" preserveAspectRatio="xMinYMin meet"<?php if ($_['themingInvertMenu']) { ?> filter="url(#invertMenuMain-<?php p($entry['id']); ?>)"<?php } ?> xlink:href="<?php print_unescaped($entry['icon'] . '?v=' . $_['versionHash']); ?>" class="app-icon" /> + </svg> <div class="icon-loading-small-dark" style="display:none;"></div> </a> diff --git a/lib/l10n/ru.js b/lib/l10n/ru.js index ed34349936f..e63656b4494 100644 --- a/lib/l10n/ru.js +++ b/lib/l10n/ru.js @@ -16,8 +16,8 @@ OC.L10N.register( "Enterprise bundle" : "Корпоративный пакет", "Groupware bundle" : "Пакет для групп", "Social sharing bundle" : "Пакет для соц. сетей", - "PHP %s or higher is required." : "Требуется PHP %s или выше", - "PHP with a version lower than %s is required." : "Требуется версия PHP ниже %s.", + "PHP %s or higher is required." : "Требуется PHP версии %s или выше.", + "PHP with a version lower than %s is required." : "Требуется PHP версии ниже %s.", "%sbit or higher PHP required." : "Требуется PHP с разрядностью %s бит или более.", "Following databases are supported: %s" : "Поддерживаются следующие СУБД: %s", "The command line tool %s could not be found" : "Утилита командной строки %s не найдена", diff --git a/lib/l10n/ru.json b/lib/l10n/ru.json index 9b867ec5285..980cd6b46d8 100644 --- a/lib/l10n/ru.json +++ b/lib/l10n/ru.json @@ -14,8 +14,8 @@ "Enterprise bundle" : "Корпоративный пакет", "Groupware bundle" : "Пакет для групп", "Social sharing bundle" : "Пакет для соц. сетей", - "PHP %s or higher is required." : "Требуется PHP %s или выше", - "PHP with a version lower than %s is required." : "Требуется версия PHP ниже %s.", + "PHP %s or higher is required." : "Требуется PHP версии %s или выше.", + "PHP with a version lower than %s is required." : "Требуется PHP версии ниже %s.", "%sbit or higher PHP required." : "Требуется PHP с разрядностью %s бит или более.", "Following databases are supported: %s" : "Поддерживаются следующие СУБД: %s", "The command line tool %s could not be found" : "Утилита командной строки %s не найдена", diff --git a/lib/private/Settings/Manager.php b/lib/private/Settings/Manager.php index cd0af5e7bb2..efeedbe6fcc 100644 --- a/lib/private/Settings/Manager.php +++ b/lib/private/Settings/Manager.php @@ -47,6 +47,7 @@ use OCP\Lock\ILockingProvider; use OCP\Settings\ISettings; use OCP\Settings\IManager; use OCP\Settings\ISection; +use OCP\Util; class Manager implements IManager { /** @var ILogger */ @@ -344,7 +345,7 @@ class Manager implements IManager { try { return \OC::$server->query($className); } catch (QueryException $e) { - $this->log->logException($e); + $this->log->logException($e, ['level' => Util::INFO]); throw $e; } } diff --git a/lib/private/Share20/DefaultShareProvider.php b/lib/private/Share20/DefaultShareProvider.php index 844b36b2994..b9ab7a46873 100644 --- a/lib/private/Share20/DefaultShareProvider.php +++ b/lib/private/Share20/DefaultShareProvider.php @@ -452,9 +452,9 @@ class DefaultShareProvider implements IShareProvider { 'uid_owner' => $qb->createNamedParameter($share->getShareOwner()), 'uid_initiator' => $qb->createNamedParameter($share->getSharedBy()), 'parent' => $qb->createNamedParameter($share->getId()), - 'item_type' => $qb->createNamedParameter($share->getNode() instanceof File ? 'file' : 'folder'), - 'item_source' => $qb->createNamedParameter($share->getNode()->getId()), - 'file_source' => $qb->createNamedParameter($share->getNode()->getId()), + 'item_type' => $qb->createNamedParameter($share->getNodeType()), + 'item_source' => $qb->createNamedParameter($share->getNodeId()), + 'file_source' => $qb->createNamedParameter($share->getNodeId()), 'file_target' => $qb->createNamedParameter($share->getTarget()), 'permissions' => $qb->createNamedParameter($share->getPermissions()), 'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()), diff --git a/lib/private/Template/JSConfigHelper.php b/lib/private/Template/JSConfigHelper.php index bdb747e1c9f..9f93ef784bc 100644 --- a/lib/private/Template/JSConfigHelper.php +++ b/lib/private/Template/JSConfigHelper.php @@ -155,6 +155,7 @@ class JSConfigHelper { "oc_appswebroots" => str_replace('\\/', '/', json_encode($apps_paths)), // Ugly unescape slashes waiting for better solution "datepickerFormatDate" => json_encode($this->l->l('jsdate', null)), 'nc_lastLogin' => $lastConfirmTimestamp, + 'nc_pageLoad' => time(), "dayNames" => json_encode([ (string)$this->l->t('Sunday'), (string)$this->l->t('Monday'), |