aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--apps/dav/lib/Upload/UploadHome.php3
-rw-r--r--apps/files/js/file-upload.js14
-rw-r--r--apps/files/l10n/fr.js2
-rw-r--r--apps/files/l10n/fr.json2
-rw-r--r--apps/files/lib/AppInfo/Application.php5
-rw-r--r--apps/files/lib/Service/TagService.php16
-rw-r--r--apps/files/tests/Service/TagServiceTest.php8
-rw-r--r--apps/files_sharing/lib/External/Mount.php10
-rw-r--r--apps/theming/css/theming.scss16
-rw-r--r--build/files-checker.php1
-rw-r--r--core/css/apps.scss1
-rw-r--r--core/js/js.js7
-rw-r--r--core/js/public/comments.js2
-rw-r--r--core/js/tests/specs/coreSpec.js61
-rw-r--r--core/templates/layout.user.php14
-rw-r--r--lib/l10n/ru.js4
-rw-r--r--lib/l10n/ru.json4
-rw-r--r--lib/private/Settings/Manager.php3
-rw-r--r--lib/private/Share20/DefaultShareProvider.php6
-rw-r--r--lib/private/Template/JSConfigHelper.php1
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'),