Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/server.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.tx/config213
-rw-r--r--apps/admin_audit/l10n/mk.js6
-rw-r--r--apps/admin_audit/l10n/mk.json4
-rw-r--r--apps/dav/lib/CalDAV/BirthdayService.php6
-rw-r--r--apps/dav/lib/CalDAV/CalendarHome.php11
-rw-r--r--apps/dav/lib/CalDAV/CalendarImpl.php32
-rw-r--r--apps/dav/lib/CardDAV/AddressBookImpl.php2
-rw-r--r--apps/dav/lib/CardDAV/SyncService.php4
-rw-r--r--apps/dav/tests/unit/CalDAV/CalendarHomeTest.php48
-rw-r--r--apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php3
-rw-r--r--apps/dav/tests/unit/Connector/Sabre/FileTest.php4
-rw-r--r--apps/federatedfilesharing/l10n/fr.js2
-rw-r--r--apps/federatedfilesharing/l10n/fr.json2
-rw-r--r--apps/federation/lib/SyncFederationAddressBooks.php13
-rw-r--r--apps/federation/lib/SyncJob.php2
-rw-r--r--apps/federation/tests/SyncFederationAddressbooksTest.php16
-rw-r--r--apps/files/l10n/fi.js1
-rw-r--r--apps/files/l10n/fi.json1
-rw-r--r--apps/files/l10n/fr.js4
-rw-r--r--apps/files/l10n/fr.json4
-rw-r--r--apps/files/lib/Controller/ViewController.php2
-rw-r--r--apps/files_sharing/css/public.css12
-rw-r--r--apps/files_sharing/css/public.css.map2
-rw-r--r--apps/files_sharing/css/public.scss15
-rw-r--r--apps/files_sharing/css/publicView.css12
-rw-r--r--apps/files_sharing/css/publicView.css.map2
-rw-r--r--apps/files_sharing/js/sharedfilelist.js5
-rw-r--r--apps/files_sharing/l10n/fi.js3
-rw-r--r--apps/files_sharing/l10n/fi.json3
-rw-r--r--apps/files_sharing/l10n/fr.js4
-rw-r--r--apps/files_sharing/l10n/fr.json4
-rw-r--r--apps/files_sharing/lib/Controller/ShareAPIController.php4
-rw-r--r--apps/settings/l10n/eu.js1
-rw-r--r--apps/settings/l10n/eu.json1
-rw-r--r--apps/settings/l10n/mk.js21
-rw-r--r--apps/settings/l10n/mk.json21
-rw-r--r--apps/theming/css/default.css4
-rw-r--r--apps/theming/fonts/OpenDyslexic-Bold.otfbin42408 -> 230716 bytes
-rw-r--r--apps/theming/fonts/OpenDyslexic-Bold.ttfbin142508 -> 311772 bytes
-rw-r--r--apps/theming/fonts/OpenDyslexic-Bold.woffbin16592 -> 135076 bytes
-rw-r--r--apps/theming/fonts/OpenDyslexic-Regular.otfbin41088 -> 215772 bytes
-rw-r--r--apps/theming/fonts/OpenDyslexic-Regular.ttfbin138312 -> 308524 bytes
-rw-r--r--apps/theming/fonts/OpenDyslexic-Regular.woffbin16636 -> 128784 bytes
-rw-r--r--apps/theming/img/dark-highcontrast.jpgbin432490 -> 428814 bytes
-rw-r--r--apps/theming/img/dark.jpgbin377505 -> 420278 bytes
-rw-r--r--apps/theming/img/default.jpgbin57394 -> 57588 bytes
-rw-r--r--apps/theming/img/highcontrast.jpgbin429052 -> 0 bytes
-rw-r--r--apps/theming/img/light-highcontrast.jpgbin0 -> 453601 bytes
-rw-r--r--apps/theming/img/light.jpgbin391078 -> 438455 bytes
-rw-r--r--apps/theming/l10n/eu.js1
-rw-r--r--apps/theming/l10n/eu.json1
-rw-r--r--apps/theming/l10n/fi.js3
-rw-r--r--apps/theming/l10n/fi.json3
-rw-r--r--apps/theming/l10n/fr.js1
-rw-r--r--apps/theming/l10n/fr.json1
-rw-r--r--apps/theming/l10n/pl.js2
-rw-r--r--apps/theming/l10n/pl.json2
-rw-r--r--apps/theming/lib/Themes/CommonThemeTrait.php4
-rw-r--r--apps/user_ldap/l10n/fr.js2
-rw-r--r--apps/user_ldap/l10n/fr.json2
-rw-r--r--build/psalm-baseline.xml21
-rw-r--r--config/config.sample.php6
-rw-r--r--core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php4
-rw-r--r--core/Controller/ReferenceApiController.php2
-rw-r--r--core/l10n/fr.js22
-rw-r--r--core/l10n/fr.json22
-rw-r--r--core/l10n/gl.js6
-rw-r--r--core/l10n/gl.json6
-rw-r--r--core/l10n/mk.js3
-rw-r--r--core/l10n/mk.json3
-rw-r--r--dist/files_sharing-files_sharing.js4
-rw-r--r--dist/files_sharing-files_sharing.js.map2
-rw-r--r--lib/base.php12
-rw-r--r--lib/l10n/fi.js1
-rw-r--r--lib/l10n/fi.json1
-rw-r--r--lib/l10n/zh_TW.js4
-rw-r--r--lib/l10n/zh_TW.json4
-rw-r--r--lib/private/Collaboration/Collaborators/MailPlugin.php16
-rw-r--r--lib/private/ContactsManager.php18
-rw-r--r--lib/private/DB/ConnectionFactory.php4
-rw-r--r--lib/private/Files/Cache/Propagator.php46
-rw-r--r--lib/private/Files/Filesystem.php19
-rw-r--r--lib/private/Files/Storage/Local.php9
-rw-r--r--lib/private/Files/View.php12
-rw-r--r--lib/public/Calendar/ICalendar.php16
-rw-r--r--lib/public/Collaboration/Reference/IReference.php2
-rw-r--r--lib/public/Collaboration/Reference/Reference.php4
-rw-r--r--lib/public/Contacts/IManager.php9
-rw-r--r--lib/public/Util.php21
-rw-r--r--ocs/v1.php1
-rw-r--r--tests/lib/ContactsManagerTest.php4
-rw-r--r--tests/lib/Files/ViewTest.php19
92 files changed, 479 insertions, 360 deletions
diff --git a/.tx/config b/.tx/config
index 828b643d435..a87088a5813 100644
--- a/.tx/config
+++ b/.tx/config
@@ -1,177 +1,178 @@
[main]
-host = https://www.transifex.com
-lang_map = bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja
+host = https://www.transifex.com
+lang_map = fi_FI: fi, hu_HU: hu, nb_NO: nb, sk_SK: sk, th_TH: th, ja_JP: ja, bg_BG: bg, cs_CZ: cs
-[nextcloud.core]
-file_filter = translationfiles/<lang>/core.po
-source_file = translationfiles/templates/core.pot
+[o:nextcloud:p:nextcloud:r:admin_audit]
+file_filter = translationfiles/<lang>/admin_audit.po
+source_file = translationfiles/templates/admin_audit.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.files]
-file_filter = translationfiles/<lang>/files.po
-source_file = translationfiles/templates/files.pot
+[o:nextcloud:p:nextcloud:r:cloud_federation_api]
+file_filter = translationfiles/<lang>/cloud_federation_api.po
+source_file = translationfiles/templates/cloud_federation_api.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.settings-1]
-file_filter = translationfiles/<lang>/settings.po
-source_file = translationfiles/templates/settings.pot
+[o:nextcloud:p:nextcloud:r:comments]
+file_filter = translationfiles/<lang>/comments.po
+source_file = translationfiles/templates/comments.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.lib]
-file_filter = translationfiles/<lang>/lib.po
-source_file = translationfiles/templates/lib.pot
+[o:nextcloud:p:nextcloud:r:contactsinteraction]
+file_filter = translationfiles/<lang>/contactsinteraction.po
+source_file = translationfiles/templates/contactsinteraction.pot
+source_lang = en
+type = PO
+
+[o:nextcloud:p:nextcloud:r:core]
+file_filter = translationfiles/<lang>/core.po
+source_file = translationfiles/templates/core.pot
+source_lang = en
+type = PO
+
+[o:nextcloud:p:nextcloud:r:dashboard-shipped-with-server]
+file_filter = translationfiles/<lang>/dashboard.po
+source_file = translationfiles/templates/dashboard.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.dav]
+[o:nextcloud:p:nextcloud:r:dav]
file_filter = translationfiles/<lang>/dav.po
source_file = translationfiles/templates/dav.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.files_encryption]
+[o:nextcloud:p:nextcloud:r:federatedfilesharing]
+file_filter = translationfiles/<lang>/federatedfilesharing.po
+source_file = translationfiles/templates/federatedfilesharing.pot
+source_lang = en
+type = PO
+
+[o:nextcloud:p:nextcloud:r:federation]
+file_filter = translationfiles/<lang>/federation.po
+source_file = translationfiles/templates/federation.pot
+source_lang = en
+type = PO
+
+[o:nextcloud:p:nextcloud:r:files]
+file_filter = translationfiles/<lang>/files.po
+source_file = translationfiles/templates/files.pot
+source_lang = en
+type = PO
+
+[o:nextcloud:p:nextcloud:r:files_encryption]
file_filter = translationfiles/<lang>/encryption.po
source_file = translationfiles/templates/encryption.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.files_external]
+[o:nextcloud:p:nextcloud:r:files_external]
file_filter = translationfiles/<lang>/files_external.po
source_file = translationfiles/templates/files_external.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.files_sharing]
+[o:nextcloud:p:nextcloud:r:files_sharing]
file_filter = translationfiles/<lang>/files_sharing.po
source_file = translationfiles/templates/files_sharing.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.files_trashbin]
+[o:nextcloud:p:nextcloud:r:files_trashbin]
file_filter = translationfiles/<lang>/files_trashbin.po
source_file = translationfiles/templates/files_trashbin.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.files_versions]
+[o:nextcloud:p:nextcloud:r:files_versions]
file_filter = translationfiles/<lang>/files_versions.po
source_file = translationfiles/templates/files_versions.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.user_ldap]
-file_filter = translationfiles/<lang>/user_ldap.po
-source_file = translationfiles/templates/user_ldap.pot
+[o:nextcloud:p:nextcloud:r:lib]
+file_filter = translationfiles/<lang>/lib.po
+source_file = translationfiles/templates/lib.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.comments]
-file_filter = translationfiles/<lang>/comments.po
-source_file = translationfiles/templates/comments.pot
+[o:nextcloud:p:nextcloud:r:lookup_server_connector]
+file_filter = translationfiles/<lang>/lookup_server_connector.po
+source_file = translationfiles/templates/lookup_server_connector.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.federatedfilesharing]
-file_filter = translationfiles/<lang>/federatedfilesharing.po
-source_file = translationfiles/templates/federatedfilesharing.pot
+[o:nextcloud:p:nextcloud:r:oauth2]
+file_filter = translationfiles/<lang>/oauth2.po
+source_file = translationfiles/templates/oauth2.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.federation]
-file_filter = translationfiles/<lang>/federation.po
-source_file = translationfiles/templates/federation.pot
+[o:nextcloud:p:nextcloud:r:provisioning_api]
+file_filter = translationfiles/<lang>/provisioning_api.po
+source_file = translationfiles/templates/provisioning_api.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.oauth2]
-file_filter = translationfiles/<lang>/oauth2.po
-source_file = translationfiles/templates/oauth2.pot
+[o:nextcloud:p:nextcloud:r:settings-1]
+file_filter = translationfiles/<lang>/settings.po
+source_file = translationfiles/templates/settings.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.sharebymail]
+[o:nextcloud:p:nextcloud:r:sharebymail]
file_filter = translationfiles/<lang>/sharebymail.po
source_file = translationfiles/templates/sharebymail.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.systemtags]
+[o:nextcloud:p:nextcloud:r:systemtags]
file_filter = translationfiles/<lang>/systemtags.po
source_file = translationfiles/templates/systemtags.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.updatenotification]
-file_filter = translationfiles/<lang>/updatenotification.po
-source_file = translationfiles/templates/updatenotification.pot
-source_lang = en
-type = PO
-
-[nextcloud.theming]
+[o:nextcloud:p:nextcloud:r:theming]
file_filter = translationfiles/<lang>/theming.po
source_file = translationfiles/templates/theming.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.twofactor_backupcodes]
+[o:nextcloud:p:nextcloud:r:twofactor_backupcodes]
file_filter = translationfiles/<lang>/twofactor_backupcodes.po
source_file = translationfiles/templates/twofactor_backupcodes.pot
source_lang = en
-type = PO
-
-[nextcloud.workflowengine]
-file_filter = translationfiles/<lang>/workflowengine.po
-source_file = translationfiles/templates/workflowengine.pot
-source_lang = en
-type = PO
-
-[nextcloud.provisioning_api]
-file_filter = translationfiles/<lang>/provisioning_api.po
-source_file = translationfiles/templates/provisioning_api.pot
-source_lang = en
-type = PO
-
-[nextcloud.lookup_server_connector]
-file_filter = translationfiles/<lang>/lookup_server_connector.po
-source_file = translationfiles/templates/lookup_server_connector.pot
-source_lang = en
-type = PO
-
-[nextcloud.dashboard-shipped-with-server]
-file_filter = translationfiles/<lang>/dashboard.po
-source_file = translationfiles/templates/dashboard.pot
-source_lang = en
-type = PO
+type = PO
-[nextcloud.contactsinteraction]
-file_filter = translationfiles/<lang>/contactsinteraction.po
-source_file = translationfiles/templates/contactsinteraction.pot
-source_lang = en
-type = PO
-
-[nextcloud.cloud_federation_api]
-file_filter = translationfiles/<lang>/cloud_federation_api.po
-source_file = translationfiles/templates/cloud_federation_api.pot
+[o:nextcloud:p:nextcloud:r:updatenotification]
+file_filter = translationfiles/<lang>/updatenotification.po
+source_file = translationfiles/templates/updatenotification.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.admin_audit]
-file_filter = translationfiles/<lang>/admin_audit.po
-source_file = translationfiles/templates/admin_audit.pot
+[o:nextcloud:p:nextcloud:r:user_ldap]
+file_filter = translationfiles/<lang>/user_ldap.po
+source_file = translationfiles/templates/user_ldap.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.user_status]
+[o:nextcloud:p:nextcloud:r:user_status]
file_filter = translationfiles/<lang>/user_status.po
source_file = translationfiles/templates/user_status.pot
source_lang = en
-type = PO
+type = PO
-[nextcloud.weather_status]
+[o:nextcloud:p:nextcloud:r:weather_status]
file_filter = translationfiles/<lang>/weather_status.po
source_file = translationfiles/templates/weather_status.pot
source_lang = en
-type = PO
+type = PO
+
+[o:nextcloud:p:nextcloud:r:workflowengine]
+file_filter = translationfiles/<lang>/workflowengine.po
+source_file = translationfiles/templates/workflowengine.pot
+source_lang = en
+type = PO
+
diff --git a/apps/admin_audit/l10n/mk.js b/apps/admin_audit/l10n/mk.js
new file mode 100644
index 00000000000..9b1d3676642
--- /dev/null
+++ b/apps/admin_audit/l10n/mk.js
@@ -0,0 +1,6 @@
+OC.L10N.register(
+ "admin_audit",
+ {
+ "Auditing / Logging" : "Ревизија / Евиденција"
+},
+"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;");
diff --git a/apps/admin_audit/l10n/mk.json b/apps/admin_audit/l10n/mk.json
new file mode 100644
index 00000000000..fd0e2f55821
--- /dev/null
+++ b/apps/admin_audit/l10n/mk.json
@@ -0,0 +1,4 @@
+{ "translations": {
+ "Auditing / Logging" : "Ревизија / Евиденција"
+},"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"
+} \ No newline at end of file
diff --git a/apps/dav/lib/CalDAV/BirthdayService.php b/apps/dav/lib/CalDAV/BirthdayService.php
index be6b0911538..df351a47552 100644
--- a/apps/dav/lib/CalDAV/BirthdayService.php
+++ b/apps/dav/lib/CalDAV/BirthdayService.php
@@ -54,6 +54,8 @@ use Sabre\VObject\Reader;
*/
class BirthdayService {
public const BIRTHDAY_CALENDAR_URI = 'contact_birthdays';
+ public const EXCLUDE_FROM_BIRTHDAY_CALENDAR_PROPERTY_NAME = 'X-NC-EXCLUDE-FROM-BIRTHDAY-CALENDAR';
+
private GroupPrincipalBackend $principalBackend;
private CalDavBackend $calDavBackEnd;
private CardDavBackend $cardDavBackEnd;
@@ -180,6 +182,10 @@ class BirthdayService {
return null;
}
+ if (isset($doc->{self::EXCLUDE_FROM_BIRTHDAY_CALENDAR_PROPERTY_NAME})) {
+ return null;
+ }
+
if (!isset($doc->{$dateField})) {
return null;
}
diff --git a/apps/dav/lib/CalDAV/CalendarHome.php b/apps/dav/lib/CalDAV/CalendarHome.php
index cd6ae1c2f7f..a59e76d121f 100644
--- a/apps/dav/lib/CalDAV/CalendarHome.php
+++ b/apps/dav/lib/CalDAV/CalendarHome.php
@@ -159,7 +159,16 @@ class CalendarHome extends \Sabre\CalDAV\CalendarHome {
return new TrashbinHome($this->caldavBackend, $this->principalInfo);
}
- // Calendars
+ // Calendar - this covers all "regular" calendars, but not shared
+ // only check if the method is available
+ if($this->caldavBackend instanceof CalDavBackend) {
+ $calendar = $this->caldavBackend->getCalendarByUri($this->principalInfo['uri'], $name);
+ if(!empty($calendar)) {
+ return new Calendar($this->caldavBackend, $calendar, $this->l10n, $this->config, $this->logger);
+ }
+ }
+
+ // Fallback to cover shared calendars
foreach ($this->caldavBackend->getCalendarsForUser($this->principalInfo['uri']) as $calendar) {
if ($calendar['uri'] === $name) {
return new Calendar($this->caldavBackend, $calendar, $this->l10n, $this->config, $this->logger);
diff --git a/apps/dav/lib/CalDAV/CalendarImpl.php b/apps/dav/lib/CalDAV/CalendarImpl.php
index a04e520c6bc..4eef1e7f8d3 100644
--- a/apps/dav/lib/CalDAV/CalendarImpl.php
+++ b/apps/dav/lib/CalDAV/CalendarImpl.php
@@ -46,14 +46,10 @@ use function Sabre\Uri\split as uriSplit;
class CalendarImpl implements ICreateFromString {
- /** @var CalDavBackend */
- private $backend;
-
- /** @var Calendar */
- private $calendar;
-
- /** @var array */
- private $calendarInfo;
+ private CalDavBackend $backend;
+ private Calendar $calendar;
+ /** @var array<string, mixed> */
+ private array $calendarInfo;
public function __construct(Calendar $calendar,
array $calendarInfo,
@@ -67,8 +63,8 @@ class CalendarImpl implements ICreateFromString {
* @return string defining the technical unique key
* @since 13.0.0
*/
- public function getKey() {
- return $this->calendarInfo['id'];
+ public function getKey(): string {
+ return (string) $this->calendarInfo['id'];
}
/**
@@ -80,19 +76,17 @@ class CalendarImpl implements ICreateFromString {
/**
* In comparison to getKey() this function returns a human readable (maybe translated) name
- * @return null|string
* @since 13.0.0
*/
- public function getDisplayName() {
+ public function getDisplayName(): ?string {
return $this->calendarInfo['{DAV:}displayname'];
}
/**
* Calendar color
- * @return null|string
* @since 13.0.0
*/
- public function getDisplayColor() {
+ public function getDisplayColor(): ?string {
return $this->calendarInfo['{http://apple.com/ns/ical/}calendar-color'];
}
@@ -101,21 +95,21 @@ class CalendarImpl implements ICreateFromString {
* @param array $searchProperties defines the properties within the query pattern should match
* @param array $options - optional parameters:
* ['timerange' => ['start' => new DateTime(...), 'end' => new DateTime(...)]]
- * @param integer|null $limit - limit number of search results
- * @param integer|null $offset - offset for paging of search results
+ * @param int|null $limit - limit number of search results
+ * @param int|null $offset - offset for paging of search results
* @return array an array of events/journals/todos which are arrays of key-value-pairs
* @since 13.0.0
*/
- public function search($pattern, array $searchProperties = [], array $options = [], $limit = null, $offset = null) {
+ public function search(string $pattern, array $searchProperties = [], array $options = [], $limit = null, $offset = null): array {
return $this->backend->search($this->calendarInfo, $pattern,
$searchProperties, $options, $limit, $offset);
}
/**
- * @return integer build up using \OCP\Constants
+ * @return int build up using \OCP\Constants
* @since 13.0.0
*/
- public function getPermissions() {
+ public function getPermissions(): int {
$permissions = $this->calendar->getACL();
$result = 0;
foreach ($permissions as $permission) {
diff --git a/apps/dav/lib/CardDAV/AddressBookImpl.php b/apps/dav/lib/CardDAV/AddressBookImpl.php
index 2f7f0a22900..c385d0e7b86 100644
--- a/apps/dav/lib/CardDAV/AddressBookImpl.php
+++ b/apps/dav/lib/CardDAV/AddressBookImpl.php
@@ -273,7 +273,7 @@ class AddressBookImpl implements IAddressBook {
];
foreach ($vCard->children() as $property) {
- if ($property->name === 'PHOTO' && $property->getValueType() === 'BINARY') {
+ if ($property->name === 'PHOTO' && in_array($property->getValueType(), ['BINARY', 'URI'])) {
$url = $this->urlGenerator->getAbsoluteURL(
$this->urlGenerator->linkTo('', 'remote.php') . '/dav/');
$url .= implode('/', [
diff --git a/apps/dav/lib/CardDAV/SyncService.php b/apps/dav/lib/CardDAV/SyncService.php
index 5094b7f3f5c..da798c5768e 100644
--- a/apps/dav/lib/CardDAV/SyncService.php
+++ b/apps/dav/lib/CardDAV/SyncService.php
@@ -73,9 +73,11 @@ class SyncService {
if ($ex->getCode() === Http::STATUS_UNAUTHORIZED) {
// remote server revoked access to the address book, remove it
$this->backend->deleteAddressBook($addressBookId);
- $this->logger->info('Authorization failed, remove address book: ' . $url, ['app' => 'dav']);
+ $this->logger->error('Authorization failed, remove address book: ' . $url, ['app' => 'dav']);
throw $ex;
}
+ $this->logger->error('Client exception:', ['app' => 'dav', 'exception' => $ex]);
+ throw $ex;
}
// 3. apply changes
diff --git a/apps/dav/tests/unit/CalDAV/CalendarHomeTest.php b/apps/dav/tests/unit/CalDAV/CalendarHomeTest.php
index ee3bc2b0859..3128e753daa 100644
--- a/apps/dav/tests/unit/CalDAV/CalendarHomeTest.php
+++ b/apps/dav/tests/unit/CalDAV/CalendarHomeTest.php
@@ -88,7 +88,7 @@ class CalendarHomeTest extends TestCase {
$mkCol->method('getRemainingValues')
->willReturn(['... properties ...']);
- $this->backend->expects($this->once())
+ $this->backend->expects(self::once())
->method('createCalendar')
->with('user-principal-123', 'name123', ['... properties ...']);
@@ -117,33 +117,33 @@ class CalendarHomeTest extends TestCase {
public function testGetChildren():void {
$this->backend
- ->expects($this->at(0))
+ ->expects(self::once())
->method('getCalendarsForUser')
->with('user-principal-123')
->willReturn([]);
$this->backend
- ->expects($this->at(1))
+ ->expects(self::once())
->method('getSubscriptionsForUser')
->with('user-principal-123')
->willReturn([]);
$calendarPlugin1 = $this->createMock(ICalendarProvider::class);
$calendarPlugin1
- ->expects($this->once())
+ ->expects(self::once())
->method('fetchAllForCalendarHome')
->with('user-principal-123')
->willReturn(['plugin1calendar1', 'plugin1calendar2']);
$calendarPlugin2 = $this->createMock(ICalendarProvider::class);
$calendarPlugin2
- ->expects($this->once())
+ ->expects(self::once())
->method('fetchAllForCalendarHome')
->with('user-principal-123')
->willReturn(['plugin2calendar1', 'plugin2calendar2']);
$this->pluginManager
- ->expects($this->once())
+ ->expects(self::once())
->method('getCalendarPlugins')
->with()
->willReturn([$calendarPlugin1, $calendarPlugin2]);
@@ -162,19 +162,25 @@ class CalendarHomeTest extends TestCase {
public function testGetChildNonAppGenerated():void {
$this->backend
- ->expects($this->at(0))
+ ->expects(self::once())
+ ->method('getCalendarByUri')
+ ->with('user-principal-123')
+ ->willReturn([]);
+
+ $this->backend
+ ->expects(self::once())
->method('getCalendarsForUser')
->with('user-principal-123')
->willReturn([]);
$this->backend
- ->expects($this->at(1))
+ ->expects(self::once())
->method('getSubscriptionsForUser')
->with('user-principal-123')
->willReturn([]);
$this->pluginManager
- ->expects($this->never())
+ ->expects(self::never())
->method('getCalendarPlugins');
$this->expectException(\Sabre\DAV\Exception\NotFound::class);
@@ -185,51 +191,57 @@ class CalendarHomeTest extends TestCase {
public function testGetChildAppGenerated():void {
$this->backend
- ->expects($this->at(0))
+ ->expects(self::once())
+ ->method('getCalendarByUri')
+ ->with('user-principal-123')
+ ->willReturn([]);
+
+ $this->backend
+ ->expects(self::once())
->method('getCalendarsForUser')
->with('user-principal-123')
->willReturn([]);
$this->backend
- ->expects($this->at(1))
+ ->expects(self::once())
->method('getSubscriptionsForUser')
->with('user-principal-123')
->willReturn([]);
$calendarPlugin1 = $this->createMock(ICalendarProvider::class);
$calendarPlugin1
- ->expects($this->once())
+ ->expects(self::once())
->method('getAppId')
->with()
->willReturn('calendar_plugin_1');
$calendarPlugin1
- ->expects($this->never())
+ ->expects(self::never())
->method('hasCalendarInCalendarHome');
$calendarPlugin1
- ->expects($this->never())
+ ->expects(self::never())
->method('getCalendarInCalendarHome');
$externalCalendarMock = $this->createMock(ExternalCalendar::class);
$calendarPlugin2 = $this->createMock(ICalendarProvider::class);
$calendarPlugin2
- ->expects($this->once())
+ ->expects(self::once())
->method('getAppId')
->with()
->willReturn('calendar_plugin_2');
$calendarPlugin2
- ->expects($this->once())
+ ->expects(self::once())
->method('hasCalendarInCalendarHome')
->with('user-principal-123', 'calendar-uri-from-backend')
->willReturn(true);
$calendarPlugin2
- ->expects($this->once())
+ ->expects(self::once())
->method('getCalendarInCalendarHome')
->with('user-principal-123', 'calendar-uri-from-backend')
->willReturn($externalCalendarMock);
$this->pluginManager
- ->expects($this->once())
+ ->expects(self::once())
->method('getCalendarPlugins')
->with()
->willReturn([$calendarPlugin1, $calendarPlugin2]);
diff --git a/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php b/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php
index 188b82843cd..c1292cbace2 100644
--- a/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php
+++ b/apps/dav/tests/unit/CardDAV/BirthdayServiceTest.php
@@ -438,6 +438,9 @@ class BirthdayServiceTest extends TestCase {
['12345 (*1900)', '19701231', 'BDAY', '0', '1900', 'PT9H', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:19001231\r\nEND:VCARD\r\n", 'BDAY', '', false, 'PT9H'],
['12345 (*1900)', '19701231', 'BDAY', '0', '1900', '-PT15H', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:19001231\r\nEND:VCARD\r\n", 'BDAY', '', false, '-PT15H'],
['12345 (*1900)', '19701231', 'BDAY', '0', '1900', '-P6DT15H', "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:19001231\r\nEND:VCARD\r\n", 'BDAY', '', false, '-P6DT15H'],
+ [null, null, null, null, null, null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nBDAY:19000101\r\nX-NC-EXCLUDE-FROM-BIRTHDAY-CALENDAR;TYPE=boolean:true\r\nEND:VCARD\r\n", 'BDAY', '', true, null],
+ [null, null, null, null, null, null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nX-NC-EXCLUDE-FROM-BIRTHDAY-CALENDAR;TYPE=boolean:true\r\nDEATHDATE:19001231\r\nEND:VCARD\r\n", 'DEATHDATE', '-death', true, null],
+ [null, null, null, null, null, null, "BEGIN:VCARD\r\nVERSION:3.0\r\nPRODID:-//Sabre//Sabre VObject 4.1.1//EN\r\nUID:12345\r\nFN:12345\r\nN:12345;;;;\r\nANNIVERSARY:19001231\r\nX-NC-EXCLUDE-FROM-BIRTHDAY-CALENDAR;TYPE=boolean:true\r\nEND:VCARD\r\n", 'ANNIVERSARY', '-anniversary', true, null],
];
}
}
diff --git a/apps/dav/tests/unit/Connector/Sabre/FileTest.php b/apps/dav/tests/unit/Connector/Sabre/FileTest.php
index 6a954378d02..91e49d331e9 100644
--- a/apps/dav/tests/unit/Connector/Sabre/FileTest.php
+++ b/apps/dav/tests/unit/Connector/Sabre/FileTest.php
@@ -1151,7 +1151,7 @@ class FileTest extends TestCase {
$info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, [
'permissions' => \OCP\Constants::PERMISSION_ALL,
- 'type' => FileInfo::TYPE_FOLDER,
+ 'type' => FileInfo::TYPE_FILE,
], null);
$file = new \OCA\DAV\Connector\Sabre\File($view, $info);
@@ -1172,7 +1172,7 @@ class FileTest extends TestCase {
$info = new \OC\Files\FileInfo('/test.txt', $this->getMockStorage(), null, [
'permissions' => \OCP\Constants::PERMISSION_ALL,
- 'type' => FileInfo::TYPE_FOLDER,
+ 'type' => FileInfo::TYPE_FILE,
], null);
$file = new \OCA\DAV\Connector\Sabre\File($view, $info);
diff --git a/apps/federatedfilesharing/l10n/fr.js b/apps/federatedfilesharing/l10n/fr.js
index 2caf38e72a1..3ae8645aefe 100644
--- a/apps/federatedfilesharing/l10n/fr.js
+++ b/apps/federatedfilesharing/l10n/fr.js
@@ -43,7 +43,9 @@ OC.L10N.register(
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Vous pouvez partager avec quiconque utilise un serveur Nextcloud ou un serveur ou service compatible Open Cloud Mesh (OCM). Renseignez simplement son identifiant sur une instance fédérée dans la boîte de dialogue de partage. Cela prend la forme de utilisateur@cloud.exemple.com.",
"Your Federated Cloud ID:" : "Votre identifiant de Cloud Fédéré :",
"Share it so your friends can share files with you:" : "Partagez-le afin que vos amis puissent partager des fichiers avec vous :",
+ "Facebook" : "Facebook",
"Twitter" : "Twitter",
+ "Diaspora" : "Diaspora",
"Add to your website" : "Ajouter à votre site web",
"Share with me via Nextcloud" : "Partagez avec moi via Nextcloud",
"HTML Code:" : "Code HTML :",
diff --git a/apps/federatedfilesharing/l10n/fr.json b/apps/federatedfilesharing/l10n/fr.json
index 38c0648d860..611b9cc8873 100644
--- a/apps/federatedfilesharing/l10n/fr.json
+++ b/apps/federatedfilesharing/l10n/fr.json
@@ -41,7 +41,9 @@
"You can share with anyone who uses a Nextcloud server or other Open Cloud Mesh (OCM) compatible servers and services! Just put their Federated Cloud ID in the share dialog. It looks like person@cloud.example.com" : "Vous pouvez partager avec quiconque utilise un serveur Nextcloud ou un serveur ou service compatible Open Cloud Mesh (OCM). Renseignez simplement son identifiant sur une instance fédérée dans la boîte de dialogue de partage. Cela prend la forme de utilisateur@cloud.exemple.com.",
"Your Federated Cloud ID:" : "Votre identifiant de Cloud Fédéré :",
"Share it so your friends can share files with you:" : "Partagez-le afin que vos amis puissent partager des fichiers avec vous :",
+ "Facebook" : "Facebook",
"Twitter" : "Twitter",
+ "Diaspora" : "Diaspora",
"Add to your website" : "Ajouter à votre site web",
"Share with me via Nextcloud" : "Partagez avec moi via Nextcloud",
"HTML Code:" : "Code HTML :",
diff --git a/apps/federation/lib/SyncFederationAddressBooks.php b/apps/federation/lib/SyncFederationAddressBooks.php
index c17cb7618bf..401fd19bd75 100644
--- a/apps/federation/lib/SyncFederationAddressBooks.php
+++ b/apps/federation/lib/SyncFederationAddressBooks.php
@@ -29,19 +29,23 @@ use OC\OCS\DiscoveryService;
use OCA\DAV\CardDAV\SyncService;
use OCP\AppFramework\Http;
use OCP\OCS\IDiscoveryService;
+use Psr\Log\LoggerInterface;
class SyncFederationAddressBooks {
protected DbHandler $dbHandler;
private SyncService $syncService;
private DiscoveryService $ocsDiscoveryService;
+ private LoggerInterface $logger;
public function __construct(DbHandler $dbHandler,
SyncService $syncService,
- IDiscoveryService $ocsDiscoveryService
+ IDiscoveryService $ocsDiscoveryService,
+ LoggerInterface $logger
) {
$this->syncService = $syncService;
$this->dbHandler = $dbHandler;
$this->ocsDiscoveryService = $ocsDiscoveryService;
+ $this->logger = $logger;
}
/**
@@ -60,6 +64,7 @@ class SyncFederationAddressBooks {
$addressBookUrl = isset($endPoints['system-address-book']) ? trim($endPoints['system-address-book'], '/') : 'remote.php/dav/addressbooks/system/system/system';
if (is_null($sharedSecret)) {
+ $this->logger->debug("Shared secret for $url is null");
continue;
}
$targetBookId = $trustedServer['url_hash'];
@@ -71,10 +76,16 @@ class SyncFederationAddressBooks {
$newToken = $this->syncService->syncRemoteAddressBook($url, $cardDavUser, $addressBookUrl, $sharedSecret, $syncToken, $targetBookId, $targetPrincipal, $targetBookProperties);
if ($newToken !== $syncToken) {
$this->dbHandler->setServerStatus($url, TrustedServers::STATUS_OK, $newToken);
+ } else {
+ $this->logger->debug("Sync Token for $url unchanged from previous sync");
}
} catch (\Exception $ex) {
if ($ex->getCode() === Http::STATUS_UNAUTHORIZED) {
$this->dbHandler->setServerStatus($url, TrustedServers::STATUS_ACCESS_REVOKED);
+ $this->logger->error("Server sync for $url failed because of revoked access.");
+ } else {
+ $this->dbHandler->setServerStatus($url, TrustedServers::STATUS_FAILURE);
+ $this->logger->error("Server sync for $url failed.");
}
$callback($url, $ex);
}
diff --git a/apps/federation/lib/SyncJob.php b/apps/federation/lib/SyncJob.php
index 2498f309498..82063311f10 100644
--- a/apps/federation/lib/SyncJob.php
+++ b/apps/federation/lib/SyncJob.php
@@ -44,7 +44,7 @@ class SyncJob extends TimedJob {
protected function run($argument) {
$this->syncService->syncThemAll(function ($url, $ex) {
if ($ex instanceof \Exception) {
- $this->logger->info("Error while syncing $url.", [
+ $this->logger->error("Error while syncing $url.", [
'app' => 'fed-sync',
'exception' => $ex,
]);
diff --git a/apps/federation/tests/SyncFederationAddressbooksTest.php b/apps/federation/tests/SyncFederationAddressbooksTest.php
index 73c44c72399..a5da446b931 100644
--- a/apps/federation/tests/SyncFederationAddressbooksTest.php
+++ b/apps/federation/tests/SyncFederationAddressbooksTest.php
@@ -28,28 +28,34 @@
*/
namespace OCA\Federation\Tests;
+use Psr\Log\LoggerInterface;
use OC\OCS\DiscoveryService;
use OCA\Federation\DbHandler;
use OCA\Federation\SyncFederationAddressBooks;
+use PHPUnit\Framework\MockObject\MockObject;
class SyncFederationAddressbooksTest extends \Test\TestCase {
/** @var array */
private $callBacks = [];
- /** @var \PHPUnit\Framework\MockObject\MockObject | DiscoveryService */
+ /** @var MockObject | DiscoveryService */
private $discoveryService;
+ /** @var MockObject|LoggerInterface */
+ private $logger;
+
protected function setUp(): void {
parent::setUp();
$this->discoveryService = $this->getMockBuilder(DiscoveryService::class)
->disableOriginalConstructor()->getMock();
$this->discoveryService->expects($this->any())->method('discover')->willReturn([]);
+ $this->logger = $this->createMock(LoggerInterface::class);
}
public function testSync() {
- /** @var DbHandler | \PHPUnit\Framework\MockObject\MockObject $dbHandler */
+ /** @var DbHandler | MockObject $dbHandler */
$dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler')
->disableOriginalConstructor()
->getMock();
@@ -71,7 +77,7 @@ class SyncFederationAddressbooksTest extends \Test\TestCase {
->willReturn('1');
/** @var \OCA\DAV\CardDAV\SyncService $syncService */
- $s = new SyncFederationAddressBooks($dbHandler, $syncService, $this->discoveryService);
+ $s = new SyncFederationAddressBooks($dbHandler, $syncService, $this->discoveryService, $this->logger);
$s->syncThemAll(function ($url, $ex) {
$this->callBacks[] = [$url, $ex];
});
@@ -79,7 +85,7 @@ class SyncFederationAddressbooksTest extends \Test\TestCase {
}
public function testException() {
- /** @var DbHandler | \PHPUnit\Framework\MockObject\MockObject $dbHandler */
+ /** @var DbHandler | MockObject $dbHandler */
$dbHandler = $this->getMockBuilder('OCA\Federation\DbHandler')->
disableOriginalConstructor()->
getMock();
@@ -99,7 +105,7 @@ class SyncFederationAddressbooksTest extends \Test\TestCase {
->willThrowException(new \Exception('something did not work out'));
/** @var \OCA\DAV\CardDAV\SyncService $syncService */
- $s = new SyncFederationAddressBooks($dbHandler, $syncService, $this->discoveryService);
+ $s = new SyncFederationAddressBooks($dbHandler, $syncService, $this->discoveryService, $this->logger);
$s->syncThemAll(function ($url, $ex) {
$this->callBacks[] = [$url, $ex];
});
diff --git a/apps/files/l10n/fi.js b/apps/files/l10n/fi.js
index 57b94427ba8..8e2ff4c4687 100644
--- a/apps/files/l10n/fi.js
+++ b/apps/files/l10n/fi.js
@@ -36,6 +36,7 @@ OC.L10N.register(
"Move" : "Siirrä",
"Copy" : "Kopioi",
"Choose target folder" : "Valitse kohdekansio",
+ "Edit locally" : "Muokkaa paikallisesti",
"Open" : "Avaa",
"Delete file" : "Poista tiedosto",
"Delete folder" : "Poista kansio",
diff --git a/apps/files/l10n/fi.json b/apps/files/l10n/fi.json
index 76b11966562..e4a9483d68a 100644
--- a/apps/files/l10n/fi.json
+++ b/apps/files/l10n/fi.json
@@ -34,6 +34,7 @@
"Move" : "Siirrä",
"Copy" : "Kopioi",
"Choose target folder" : "Valitse kohdekansio",
+ "Edit locally" : "Muokkaa paikallisesti",
"Open" : "Avaa",
"Delete file" : "Poista tiedosto",
"Delete folder" : "Poista kansio",
diff --git a/apps/files/l10n/fr.js b/apps/files/l10n/fr.js
index 4b5f8786163..f24804fddb5 100644
--- a/apps/files/l10n/fr.js
+++ b/apps/files/l10n/fr.js
@@ -9,8 +9,8 @@ OC.L10N.register(
"Download" : "Télécharger",
"Delete" : "Supprimer",
"Tags" : "Étiquettes",
- "Show list view" : "Afficher la vue en liste",
- "Show grid view" : "Afficher la vue en grille",
+ "Show list view" : "Activer l'affichage liste",
+ "Show grid view" : "Afficher l'affichage mosaïque",
"Home" : "Accueil",
"Close" : "Fermer",
"Favorites" : "Favoris",
diff --git a/apps/files/l10n/fr.json b/apps/files/l10n/fr.json
index 66f35f9d6c9..8a08e7b02a2 100644
--- a/apps/files/l10n/fr.json
+++ b/apps/files/l10n/fr.json
@@ -7,8 +7,8 @@
"Download" : "Télécharger",
"Delete" : "Supprimer",
"Tags" : "Étiquettes",
- "Show list view" : "Afficher la vue en liste",
- "Show grid view" : "Afficher la vue en grille",
+ "Show list view" : "Activer l'affichage liste",
+ "Show grid view" : "Afficher l'affichage mosaïque",
"Home" : "Accueil",
"Close" : "Fermer",
"Favorites" : "Favoris",
diff --git a/apps/files/lib/Controller/ViewController.php b/apps/files/lib/Controller/ViewController.php
index 82f56be9f18..cfbc9afce2b 100644
--- a/apps/files/lib/Controller/ViewController.php
+++ b/apps/files/lib/Controller/ViewController.php
@@ -266,7 +266,7 @@ class ViewController extends Controller {
$nav->assign('quota', $storageInfo['quota']);
$nav->assign('usage_relative', $storageInfo['relative']);
- $nav->assign('webdav_url', \OCP\Util::linkToRemote('dav/files/' . $user));
+ $nav->assign('webdav_url', \OCP\Util::linkToRemote('dav/files/' . rawurlencode($user)));
$contentItems = [];
diff --git a/apps/files_sharing/css/public.css b/apps/files_sharing/css/public.css
index 662e6003ff1..816ee1fb6f9 100644
--- a/apps/files_sharing/css/public.css
+++ b/apps/files_sharing/css/public.css
@@ -47,13 +47,17 @@
}
#imgframe img {
- max-height: calc(100vh - var(--header-height) - 65px - 200px) !important;
+ max-height: calc(100vh - var(--header-height) - 65px - 200px - 16px) !important;
max-width: 100% !important;
width: unset !important;
}
+#imgframe :not(#viewer) img {
+ min-width: 100px;
+}
+
#imgframe video {
- max-height: calc(100vh - var(--header-height) - 65px - 200px);
+ max-height: calc(100vh - var(--header-height) - 65px - 200px - 16px);
}
#imgframe audio {
@@ -94,8 +98,8 @@
max-height: 100%;
}
-.app-files_sharing #app-content {
- max-height: calc(100vh - var(--header-height) - 65px);
+.app-files_sharing #app-content footer {
+ position: sticky !important;
}
/* fix multiselect bar offset on shared page */
diff --git a/apps/files_sharing/css/public.css.map b/apps/files_sharing/css/public.css.map
index 12e6c87421e..59a23875931 100644
--- a/apps/files_sharing/css/public.css.map
+++ b/apps/files_sharing/css/public.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["../../../core/css/variables.scss","public.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACKA;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;;;AAGD;EAEI;;;AAGJ;EACI;;;AAGJ;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;;;AAGD;EACC;;;AAID;EACI;;;AAGJ;AACA;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;AACA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;AACA;EACC;;;AAED;AAAA;AAAA;EAGC;EACA;;;AAED;AAAA;AAAA;AAGC;EACA;;;AAGD;EACC;;;AAIA;EACC;;;AAIF;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;AAAA;EAEC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;AACA;EACC;EACA;;;AAIF;EACC;EACA;;;AAKD;EAII;IACC;;;AAQL;EAGG;IACC","file":"public.css"} \ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["../../../core/css/variables.scss","public.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACMA;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACI;;;AAGJ;EACC;;;AAGD;EACC;EACA;EACA;;;AAGD;EAEI;;;AAGJ;EACI;;;AAGJ;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;;;AAGD;EACC;;;AAID;EACC;;;AAGD;AACA;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;AACA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;AACA;EACC;;;AAED;AAAA;AAAA;EAGC;EACA;;;AAED;AAAA;AAAA;AAGC;EACA;;;AAGD;EACC;;;AAIA;EACC;;;AAIF;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;AAAA;EAEC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;AACA;EACC;EACA;;;AAIF;EACC;EACA;;;AAKD;EAII;IACC;;;AAQL;EAGG;IACC","file":"public.css"} \ No newline at end of file
diff --git a/apps/files_sharing/css/public.scss b/apps/files_sharing/css/public.scss
index 72762bd3bcd..f325622ea2c 100644
--- a/apps/files_sharing/css/public.scss
+++ b/apps/files_sharing/css/public.scss
@@ -1,6 +1,7 @@
@use 'variables';
$footer-height: 65px;
+$footer-padding-height: 16px;
$download-button-section-height: 200px;
#preview {
@@ -30,13 +31,17 @@ $download-button-section-height: 200px;
}
#imgframe img {
- max-height: calc(100vh - var(--header-height) - #{$footer-height} - #{$download-button-section-height}) !important;
+ max-height: calc(100vh - var(--header-height) - #{$footer-height} - #{$download-button-section-height} - #{$footer-padding-height}) !important;
max-width: 100% !important;
width: unset !important;
}
+#imgframe :not(#viewer) img {
+ min-width: 100px;
+}
+
#imgframe video {
- max-height: calc(100vh - var(--header-height) - #{$footer-height} - #{$download-button-section-height});
+ max-height: calc(100vh - var(--header-height) - #{$footer-height} - #{$download-button-section-height} - #{$footer-padding-height});
}
#imgframe audio {
@@ -78,9 +83,9 @@ $download-button-section-height: 200px;
max-height: 100%;
}
-// Fix footer overlapping with app-content
-.app-files_sharing #app-content {
- max-height: calc(100vh - var(--header-height) - #{$footer-height});
+
+.app-files_sharing #app-content footer {
+ position: sticky !important;
}
/* fix multiselect bar offset on shared page */
diff --git a/apps/files_sharing/css/publicView.css b/apps/files_sharing/css/publicView.css
index 6e3b5f5a003..6debc033ede 100644
--- a/apps/files_sharing/css/publicView.css
+++ b/apps/files_sharing/css/publicView.css
@@ -47,13 +47,17 @@
}
#imgframe img {
- max-height: calc(100vh - var(--header-height) - 65px - 200px) !important;
+ max-height: calc(100vh - var(--header-height) - 65px - 200px - 16px) !important;
max-width: 100% !important;
width: unset !important;
}
+#imgframe :not(#viewer) img {
+ min-width: 100px;
+}
+
#imgframe video {
- max-height: calc(100vh - var(--header-height) - 65px - 200px);
+ max-height: calc(100vh - var(--header-height) - 65px - 200px - 16px);
}
#imgframe audio {
@@ -94,8 +98,8 @@
max-height: 100%;
}
-.app-files_sharing #app-content {
- max-height: calc(100vh - var(--header-height) - 65px);
+.app-files_sharing #app-content footer {
+ position: sticky !important;
}
/* fix multiselect bar offset on shared page */
diff --git a/apps/files_sharing/css/publicView.css.map b/apps/files_sharing/css/publicView.css.map
index d83879232ae..c196ee11a5a 100644
--- a/apps/files_sharing/css/publicView.css.map
+++ b/apps/files_sharing/css/publicView.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["../../../core/css/variables.scss","public.scss","mobile.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACKA;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;;;AAGD;EAEI;;;AAGJ;EACI;;;AAGJ;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;;;AAGD;EACC;;;AAID;EACI;;;AAGJ;AACA;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;AACA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;AACA;EACC;;;AAED;AAAA;AAAA;EAGC;EACA;;;AAED;AAAA;AAAA;AAGC;EACA;;;AAGD;EACC;;;AAIA;EACC;;;AAIF;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;AAAA;EAEC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;AACA;EACC;EACA;;;AAIF;EACC;EACA;;;AAKD;EAII;IACC;;;AAQL;EAGG;IACC;;;ADpQJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AEEA;AAEA;EACA;IACC;;;AAGD;EACA;AAAA;AAAA;AAAA;IAIC;;;AAGD;EACA;IACC;;;AAGD;EACA;IACC;IACA;;;AAED;EACA;IACC;;;AAGD;EACA;IACC;;;AAED;EACA;IACC;;;AAGD;EACA;IACC;IACA;IACA;IACA;;;EAGD;IACI;IACA;;;EAEJ;IACC;;;EAGD;IACC","file":"publicView.css"} \ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["../../../core/css/variables.scss","public.scss","mobile.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACMA;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACI;;;AAGJ;EACC;;;AAGD;EACC;EACA;EACA;;;AAGD;EAEI;;;AAGJ;EACI;;;AAGJ;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;;;AAGD;EACC;;;AAID;EACC;;;AAGD;AACA;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;AACA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;AACA;EACC;;;AAED;AAAA;AAAA;EAGC;EACA;;;AAED;AAAA;AAAA;AAGC;EACA;;;AAGD;EACC;;;AAIA;EACC;;;AAIF;EACC;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;AAAA;EAEC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;AACA;EACC;EACA;;;AAIF;EACC;EACA;;;AAKD;EAII;IACC;;;AAQL;EAGG;IACC;;;ADzQJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AEEA;AAEA;EACA;IACC;;;AAGD;EACA;AAAA;AAAA;AAAA;IAIC;;;AAGD;EACA;IACC;;;AAGD;EACA;IACC;IACA;;;AAED;EACA;IACC;;;AAGD;EACA;IACC;;;AAED;EACA;IACC;;;AAGD;EACA;IACC;IACA;IACA;IACA;;;EAGD;IACI;IACA;;;EAEJ;IACC;;;EAGD;IACC","file":"publicView.css"} \ No newline at end of file
diff --git a/apps/files_sharing/js/sharedfilelist.js b/apps/files_sharing/js/sharedfilelist.js
index 7d7e91dd965..c15372eb3b3 100644
--- a/apps/files_sharing/js/sharedfilelist.js
+++ b/apps/files_sharing/js/sharedfilelist.js
@@ -179,11 +179,6 @@
// storage info like free space / used space
},
- updateRow: function($tr, fileInfo, options) {
- // no-op, suppress re-rendering
- return $tr
- },
-
reload: function() {
this.showMask()
if (this._reloadCall) {
diff --git a/apps/files_sharing/l10n/fi.js b/apps/files_sharing/l10n/fi.js
index 532fd788bb1..c3633f18170 100644
--- a/apps/files_sharing/l10n/fi.js
+++ b/apps/files_sharing/l10n/fi.js
@@ -168,14 +168,17 @@ OC.L10N.register(
"Shared with the group {user} by {owner}" : "Jaettu ryhmän {user} kanssa käyttäjältä {owner}",
"Shared with the conversation {user} by {owner}" : "Jaettu keskustelun {user} kanssa käyttäjältä {owner}",
"Shared with {user} by {owner}" : "{owner} jakoi käyttäjälle {user}",
+ "Allow download" : "Salli lataus",
"Added by {initiator}" : "Lisäyksen tehnyt {initiator}",
"Via “{folder}”" : "“{folder}” kautta",
"Internal link" : "Sisäinen linkki",
+ "Copy internal link to clipboard" : "Kopioi sisäinen linkki leikepöydälle",
"Link copied" : "Linkki kopioitu",
"Cannot copy, please copy the link manually" : "Kopioiminen ei onnistu. Kopioi linkki manuaalisesti",
"Copy to clipboard" : "Kopioi leikepöydälle",
"Only works for users with access to this folder" : "Toimii vain käyttäjille, joilla on oikeus tähän kansioon",
"Only works for users with access to this file" : "Toimii vain käyttäjille, joilla on käyttöoikeus tähän tiedostoon",
+ "Copy public link to clipboard" : "Kopioi julkinen linkki leikepöydälle",
"Please enter the following required information before creating the share" : "Anna seuraavat vaaditut tiedot, ennen kuin luot jaon",
"Password protection (enforced)" : "Salasanasuojaus (pakotettu)",
"Password protection" : "Salasanasuojaus",
diff --git a/apps/files_sharing/l10n/fi.json b/apps/files_sharing/l10n/fi.json
index 697c97433e0..502ca22f3c9 100644
--- a/apps/files_sharing/l10n/fi.json
+++ b/apps/files_sharing/l10n/fi.json
@@ -166,14 +166,17 @@
"Shared with the group {user} by {owner}" : "Jaettu ryhmän {user} kanssa käyttäjältä {owner}",
"Shared with the conversation {user} by {owner}" : "Jaettu keskustelun {user} kanssa käyttäjältä {owner}",
"Shared with {user} by {owner}" : "{owner} jakoi käyttäjälle {user}",
+ "Allow download" : "Salli lataus",
"Added by {initiator}" : "Lisäyksen tehnyt {initiator}",
"Via “{folder}”" : "“{folder}” kautta",
"Internal link" : "Sisäinen linkki",
+ "Copy internal link to clipboard" : "Kopioi sisäinen linkki leikepöydälle",
"Link copied" : "Linkki kopioitu",
"Cannot copy, please copy the link manually" : "Kopioiminen ei onnistu. Kopioi linkki manuaalisesti",
"Copy to clipboard" : "Kopioi leikepöydälle",
"Only works for users with access to this folder" : "Toimii vain käyttäjille, joilla on oikeus tähän kansioon",
"Only works for users with access to this file" : "Toimii vain käyttäjille, joilla on käyttöoikeus tähän tiedostoon",
+ "Copy public link to clipboard" : "Kopioi julkinen linkki leikepöydälle",
"Please enter the following required information before creating the share" : "Anna seuraavat vaaditut tiedot, ennen kuin luot jaon",
"Password protection (enforced)" : "Salasanasuojaus (pakotettu)",
"Password protection" : "Salasanasuojaus",
diff --git a/apps/files_sharing/l10n/fr.js b/apps/files_sharing/l10n/fr.js
index 4d01d825cdd..43caa70479f 100644
--- a/apps/files_sharing/l10n/fr.js
+++ b/apps/files_sharing/l10n/fr.js
@@ -35,8 +35,8 @@ OC.L10N.register(
"Delete" : "Supprimer",
"You can upload into this folder" : "Vous pouvez envoyer des fichiers dans ce dossier",
"Terms of service" : "Conditions d'utilisation",
- "Show list view" : "Afficher la vue en liste",
- "Show grid view" : "Afficher la vue en grille",
+ "Show list view" : "Activer l'affichage liste",
+ "Show grid view" : "Activer l'affichage mosaïque",
"No compatible server found at {remote}" : "Aucun serveur compatible trouvé sur {remote}",
"Invalid server URL" : "URL serveur invalide",
"Failed to add the public link to your Nextcloud" : "Échec de l'ajout du lien public à votre Nextcloud",
diff --git a/apps/files_sharing/l10n/fr.json b/apps/files_sharing/l10n/fr.json
index cefd68c3e69..9e70e7c3d22 100644
--- a/apps/files_sharing/l10n/fr.json
+++ b/apps/files_sharing/l10n/fr.json
@@ -33,8 +33,8 @@
"Delete" : "Supprimer",
"You can upload into this folder" : "Vous pouvez envoyer des fichiers dans ce dossier",
"Terms of service" : "Conditions d'utilisation",
- "Show list view" : "Afficher la vue en liste",
- "Show grid view" : "Afficher la vue en grille",
+ "Show list view" : "Activer l'affichage liste",
+ "Show grid view" : "Activer l'affichage mosaïque",
"No compatible server found at {remote}" : "Aucun serveur compatible trouvé sur {remote}",
"Invalid server URL" : "URL serveur invalide",
"Failed to add the public link to your Nextcloud" : "Échec de l'ajout du lien public à votre Nextcloud",
diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php
index d795318cb8b..00f12ea7779 100644
--- a/apps/files_sharing/lib/Controller/ShareAPIController.php
+++ b/apps/files_sharing/lib/Controller/ShareAPIController.php
@@ -370,7 +370,7 @@ class ShareAPIController extends OCSController {
* @return DataResponse
* @throws OCSNotFoundException
*/
- public function getShare(string $id, bool $includeTags = false): DataResponse {
+ public function getShare(string $id, bool $include_tags = false): DataResponse {
try {
$share = $this->getShareById($id);
} catch (ShareNotFound $e) {
@@ -381,7 +381,7 @@ class ShareAPIController extends OCSController {
if ($this->canAccessShare($share)) {
$share = $this->formatShare($share);
- if ($includeTags) {
+ if ($include_tags) {
$share = Helper::populateTags([$share], 'file_source', \OC::$server->getTagManager());
} else {
$share = [$share];
diff --git a/apps/settings/l10n/eu.js b/apps/settings/l10n/eu.js
index 44d4ab1c09b..1b079f4405e 100644
--- a/apps/settings/l10n/eu.js
+++ b/apps/settings/l10n/eu.js
@@ -282,6 +282,7 @@ OC.L10N.register(
"Details" : "Xehetasunak",
"You are a member of the following groups:" : "Honako taldeetako kide zara:",
"You are using <strong>{usage}</strong>" : "<strong>{usage}</strong> erabiltzen ari zara",
+ "You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "<strong>{usage}</strong>/<strong>{totalSpace}</strong> erabiltzen ari zara (<strong>{usageRelative}%</strong>)",
"Your full name" : "Zure izen osoa",
"Email options" : "Posta elektronikoaren aukerak",
"Primary email for password reset and notifications" : "Pasahitz berrezartzeko eta jakinarazpenetarako posta elektroniko nagusia",
diff --git a/apps/settings/l10n/eu.json b/apps/settings/l10n/eu.json
index 300a527a1bb..5423a17c846 100644
--- a/apps/settings/l10n/eu.json
+++ b/apps/settings/l10n/eu.json
@@ -280,6 +280,7 @@
"Details" : "Xehetasunak",
"You are a member of the following groups:" : "Honako taldeetako kide zara:",
"You are using <strong>{usage}</strong>" : "<strong>{usage}</strong> erabiltzen ari zara",
+ "You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "<strong>{usage}</strong>/<strong>{totalSpace}</strong> erabiltzen ari zara (<strong>{usageRelative}%</strong>)",
"Your full name" : "Zure izen osoa",
"Email options" : "Posta elektronikoaren aukerak",
"Primary email for password reset and notifications" : "Pasahitz berrezartzeko eta jakinarazpenetarako posta elektroniko nagusia",
diff --git a/apps/settings/l10n/mk.js b/apps/settings/l10n/mk.js
index 78b4dc201ea..2b3f74a0154 100644
--- a/apps/settings/l10n/mk.js
+++ b/apps/settings/l10n/mk.js
@@ -257,12 +257,26 @@ OC.L10N.register(
"Current password" : "Моментална лозинка",
"New password" : "Нова лозинка",
"Change password" : "Промени лозинка",
+ "Your profile picture" : "Ваша фотографија на профилот",
+ "Upload profile picture" : "Прикачи фотографија на профилот",
+ "Choose profile picture from files" : "Избери фотографија на профилот од датотеките",
+ "Remove profile picture" : "Избриши фотографија на профилот",
"png or jpg, max. 20 MB" : "png или jpg, максимум 20 MB",
"Picture provided by original account" : "Слика обезбедена од оригинална сметка",
"Cancel" : "Откажи",
+ "Set as profile picture" : "Постави фотографија на профилот",
+ "Please note that it can take up to 24 hours for your profile picture to be updated everywhere." : "Имајте предвид дека може да потрае до 24 часа за да се ажурира аватарот насекаде.",
+ "Choose your profile picture" : "Избери за фотографија за профилот",
+ "Please select a valid png or jpg file" : "Изберете png или jpg датотека",
+ "Error setting profile picture" : "Грешка при поставување на фотографија за профилот",
+ "Error cropping profile picture" : "Грешка при сечење на фотографија за профилот",
+ "Error saving profile picture" : "Грешка при зачувување на фотографија за профилот",
+ "Error removing profile picture" : "Грешка при бришење на фотографија за профилот",
"Your biography" : "Ваша биографија",
"Details" : "Детали",
"You are a member of the following groups:" : "Член сте на следниве групи",
+ "You are using <strong>{usage}</strong>" : "Користите <strong>{usage}</strong>",
+ "You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "Користите <strong>{usage}</strong> од <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)",
"Your full name" : "Вашето целосно име",
"Email options" : "Е-пошта параметри",
"Primary email for password reset and notifications" : "Примарна Е-пошта за ресетирање на лозинка и известувања",
@@ -286,6 +300,8 @@ OC.L10N.register(
"Unable to update language" : "Не може да се ажурира јазикот",
"No language set" : "Не е поставен јазик",
"Locale" : "Локација",
+ "Week starts on {firstDayOfWeek}" : "Неделите започнуваат во {firstDayOfWeek}",
+ "Your location" : "Ваша локација",
"Your organisation" : "Вашата организација",
"Your phone number" : "Вашиот телефонски број",
"Edit your Profile visibility" : "Уредете ја видливоста на вашиот профил",
@@ -295,6 +311,9 @@ OC.L10N.register(
"{displayId}" : "{displayId}",
"Unable to update visibility of {displayId}" : "Неможе да се ажурира видливоста на {displayId}",
"Your role" : "Ваша улога",
+ "Your website" : "Ваша вебстрана",
+ "No {property} set" : "Нема поставено {property}",
+ "Unable to update {property}" : "Неможе да се ажурира {property}",
"Add additional email" : "Додади дополнителна е-пошта",
"Add" : "Додади",
"You do not have permissions to see the details of this user" : "Немате дозвола за да ги гледате деталите на овој корисник",
@@ -469,7 +488,7 @@ OC.L10N.register(
"Migration started …" : "Миграцијата е започнаа ...",
"An error occurred while changing your language. Please reload the page and try again." : "настана грешка при промена на јазикот. Ве молиме обидете се повторно.",
"An error occurred while changing your locale. Please reload the page and try again." : "настана грешка при промена на локацијата. Ве молиме обидете се повторно.",
- "Select a profile picture" : "Одбери фотографија за профилот",
+ "Select a profile picture" : "Одбери фотографија на профилот",
"Week starts on {fdow}" : "Неделата започнува во {fdow}",
"Couldn't remove app." : "Не можам да ја отстранам апликацијата.",
"Couldn't update app." : "Не можам да ја надградам апликацијата.",
diff --git a/apps/settings/l10n/mk.json b/apps/settings/l10n/mk.json
index 0572a01aec8..a7820633d21 100644
--- a/apps/settings/l10n/mk.json
+++ b/apps/settings/l10n/mk.json
@@ -255,12 +255,26 @@
"Current password" : "Моментална лозинка",
"New password" : "Нова лозинка",
"Change password" : "Промени лозинка",
+ "Your profile picture" : "Ваша фотографија на профилот",
+ "Upload profile picture" : "Прикачи фотографија на профилот",
+ "Choose profile picture from files" : "Избери фотографија на профилот од датотеките",
+ "Remove profile picture" : "Избриши фотографија на профилот",
"png or jpg, max. 20 MB" : "png или jpg, максимум 20 MB",
"Picture provided by original account" : "Слика обезбедена од оригинална сметка",
"Cancel" : "Откажи",
+ "Set as profile picture" : "Постави фотографија на профилот",
+ "Please note that it can take up to 24 hours for your profile picture to be updated everywhere." : "Имајте предвид дека може да потрае до 24 часа за да се ажурира аватарот насекаде.",
+ "Choose your profile picture" : "Избери за фотографија за профилот",
+ "Please select a valid png or jpg file" : "Изберете png или jpg датотека",
+ "Error setting profile picture" : "Грешка при поставување на фотографија за профилот",
+ "Error cropping profile picture" : "Грешка при сечење на фотографија за профилот",
+ "Error saving profile picture" : "Грешка при зачувување на фотографија за профилот",
+ "Error removing profile picture" : "Грешка при бришење на фотографија за профилот",
"Your biography" : "Ваша биографија",
"Details" : "Детали",
"You are a member of the following groups:" : "Член сте на следниве групи",
+ "You are using <strong>{usage}</strong>" : "Користите <strong>{usage}</strong>",
+ "You are using <strong>{usage}</strong> of <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)" : "Користите <strong>{usage}</strong> од <strong>{totalSpace}</strong> (<strong>{usageRelative}%</strong>)",
"Your full name" : "Вашето целосно име",
"Email options" : "Е-пошта параметри",
"Primary email for password reset and notifications" : "Примарна Е-пошта за ресетирање на лозинка и известувања",
@@ -284,6 +298,8 @@
"Unable to update language" : "Не може да се ажурира јазикот",
"No language set" : "Не е поставен јазик",
"Locale" : "Локација",
+ "Week starts on {firstDayOfWeek}" : "Неделите започнуваат во {firstDayOfWeek}",
+ "Your location" : "Ваша локација",
"Your organisation" : "Вашата организација",
"Your phone number" : "Вашиот телефонски број",
"Edit your Profile visibility" : "Уредете ја видливоста на вашиот профил",
@@ -293,6 +309,9 @@
"{displayId}" : "{displayId}",
"Unable to update visibility of {displayId}" : "Неможе да се ажурира видливоста на {displayId}",
"Your role" : "Ваша улога",
+ "Your website" : "Ваша вебстрана",
+ "No {property} set" : "Нема поставено {property}",
+ "Unable to update {property}" : "Неможе да се ажурира {property}",
"Add additional email" : "Додади дополнителна е-пошта",
"Add" : "Додади",
"You do not have permissions to see the details of this user" : "Немате дозвола за да ги гледате деталите на овој корисник",
@@ -467,7 +486,7 @@
"Migration started …" : "Миграцијата е започнаа ...",
"An error occurred while changing your language. Please reload the page and try again." : "настана грешка при промена на јазикот. Ве молиме обидете се повторно.",
"An error occurred while changing your locale. Please reload the page and try again." : "настана грешка при промена на локацијата. Ве молиме обидете се повторно.",
- "Select a profile picture" : "Одбери фотографија за профилот",
+ "Select a profile picture" : "Одбери фотографија на профилот",
"Week starts on {fdow}" : "Неделата започнува во {fdow}",
"Couldn't remove app." : "Не можам да ја отстранам апликацијата.",
"Couldn't update app." : "Не можам да ја надградам апликацијата.",
diff --git a/apps/theming/css/default.css b/apps/theming/css/default.css
index 559aedd6614..e7403ee69cc 100644
--- a/apps/theming/css/default.css
+++ b/apps/theming/css/default.css
@@ -57,14 +57,14 @@
--color-primary-text: #ffffff;
--color-primary-hover: #329bd3;
--color-primary-light: #e5f2f9;
- --color-primary-light-text: #0082c9;
+ --color-primary-light-text: #003450;
--color-primary-light-hover: #dbe7ee;
--color-primary-text-dark: #ededed;
--color-primary-element: #0082c9;
--color-primary-element-text: #ffffff;
--color-primary-element-hover: #329bd3;
--color-primary-element-light: #e5f2f9;
- --color-primary-element-light-text: #0082c9;
+ --color-primary-element-light-text: #003450;
--color-primary-element-light-hover: #dbe7ee;
--color-primary-element-text-dark: #ededed;
--gradient-primary-background: linear-gradient(40deg, var(--color-primary) 0%, var(--color-primary-hover) 100%);
diff --git a/apps/theming/fonts/OpenDyslexic-Bold.otf b/apps/theming/fonts/OpenDyslexic-Bold.otf
index 4c492e2fcc2..7d074cbddee 100644
--- a/apps/theming/fonts/OpenDyslexic-Bold.otf
+++ b/apps/theming/fonts/OpenDyslexic-Bold.otf
Binary files differ
diff --git a/apps/theming/fonts/OpenDyslexic-Bold.ttf b/apps/theming/fonts/OpenDyslexic-Bold.ttf
index 7c97eb4329b..25cf37f99e2 100644
--- a/apps/theming/fonts/OpenDyslexic-Bold.ttf
+++ b/apps/theming/fonts/OpenDyslexic-Bold.ttf
Binary files differ
diff --git a/apps/theming/fonts/OpenDyslexic-Bold.woff b/apps/theming/fonts/OpenDyslexic-Bold.woff
index 755476f6b4a..41886ae9dda 100644
--- a/apps/theming/fonts/OpenDyslexic-Bold.woff
+++ b/apps/theming/fonts/OpenDyslexic-Bold.woff
Binary files differ
diff --git a/apps/theming/fonts/OpenDyslexic-Regular.otf b/apps/theming/fonts/OpenDyslexic-Regular.otf
index 1226d2ab281..ebef13c4ce3 100644
--- a/apps/theming/fonts/OpenDyslexic-Regular.otf
+++ b/apps/theming/fonts/OpenDyslexic-Regular.otf
Binary files differ
diff --git a/apps/theming/fonts/OpenDyslexic-Regular.ttf b/apps/theming/fonts/OpenDyslexic-Regular.ttf
index e7849348cdb..4b0cb8c46b7 100644
--- a/apps/theming/fonts/OpenDyslexic-Regular.ttf
+++ b/apps/theming/fonts/OpenDyslexic-Regular.ttf
Binary files differ
diff --git a/apps/theming/fonts/OpenDyslexic-Regular.woff b/apps/theming/fonts/OpenDyslexic-Regular.woff
index fdf9e37dd43..26a2934d640 100644
--- a/apps/theming/fonts/OpenDyslexic-Regular.woff
+++ b/apps/theming/fonts/OpenDyslexic-Regular.woff
Binary files differ
diff --git a/apps/theming/img/dark-highcontrast.jpg b/apps/theming/img/dark-highcontrast.jpg
index 5fce8ef0851..67ca457445d 100644
--- a/apps/theming/img/dark-highcontrast.jpg
+++ b/apps/theming/img/dark-highcontrast.jpg
Binary files differ
diff --git a/apps/theming/img/dark.jpg b/apps/theming/img/dark.jpg
index b207c390cfa..403fb085cfb 100644
--- a/apps/theming/img/dark.jpg
+++ b/apps/theming/img/dark.jpg
Binary files differ
diff --git a/apps/theming/img/default.jpg b/apps/theming/img/default.jpg
index bbea0e905b9..ac94f9f94ae 100644
--- a/apps/theming/img/default.jpg
+++ b/apps/theming/img/default.jpg
Binary files differ
diff --git a/apps/theming/img/highcontrast.jpg b/apps/theming/img/highcontrast.jpg
deleted file mode 100644
index e9087e898ee..00000000000
--- a/apps/theming/img/highcontrast.jpg
+++ /dev/null
Binary files differ
diff --git a/apps/theming/img/light-highcontrast.jpg b/apps/theming/img/light-highcontrast.jpg
new file mode 100644
index 00000000000..39d3bfd6a94
--- /dev/null
+++ b/apps/theming/img/light-highcontrast.jpg
Binary files differ
diff --git a/apps/theming/img/light.jpg b/apps/theming/img/light.jpg
index ad3fafd96f2..aa758da908b 100644
--- a/apps/theming/img/light.jpg
+++ b/apps/theming/img/light.jpg
Binary files differ
diff --git a/apps/theming/l10n/eu.js b/apps/theming/l10n/eu.js
index 83bae63943d..b92f8a9ec05 100644
--- a/apps/theming/l10n/eu.js
+++ b/apps/theming/l10n/eu.js
@@ -50,6 +50,7 @@ OC.L10N.register(
"Privacy policy" : "Pribatutasun politika",
"Adjust the Nextcloud theme" : "Doitu Nextcloud gaia",
"Keyboard shortcuts" : "Teklatuaren lasterbideak",
+ "In some cases keyboard shortcuts can interfer with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Zenbait kasutan, teklatuko lasterbideek erabilerraztasun-tresnekin oztopatu dezakete. Zure tresna behar bezala zentratu ahal izateko, hemen teklatuko lasterbide guztiak desgaitu ditzakezu. Honek aplikazioetan erabilgarri dauden lasterbide guztiak ere desgaituko ditu.",
"Disable all keyboard shortcuts" : "Desgaitu teklatuaren lasterbide guztiak",
"Background" : "Atzeko planoa",
"Set a custom background" : "Ezarri atzeko planoko irudi pertsonalizatua",
diff --git a/apps/theming/l10n/eu.json b/apps/theming/l10n/eu.json
index ac708ca8951..508c58ef1ea 100644
--- a/apps/theming/l10n/eu.json
+++ b/apps/theming/l10n/eu.json
@@ -48,6 +48,7 @@
"Privacy policy" : "Pribatutasun politika",
"Adjust the Nextcloud theme" : "Doitu Nextcloud gaia",
"Keyboard shortcuts" : "Teklatuaren lasterbideak",
+ "In some cases keyboard shortcuts can interfer with accessibility tools. In order to allow focusing on your tool correctly you can disable all keyboard shortcuts here. This will also disable all available shortcuts in apps." : "Zenbait kasutan, teklatuko lasterbideek erabilerraztasun-tresnekin oztopatu dezakete. Zure tresna behar bezala zentratu ahal izateko, hemen teklatuko lasterbide guztiak desgaitu ditzakezu. Honek aplikazioetan erabilgarri dauden lasterbide guztiak ere desgaituko ditu.",
"Disable all keyboard shortcuts" : "Desgaitu teklatuaren lasterbide guztiak",
"Background" : "Atzeko planoa",
"Set a custom background" : "Ezarri atzeko planoko irudi pertsonalizatua",
diff --git a/apps/theming/l10n/fi.js b/apps/theming/l10n/fi.js
index 30ceeb1ea24..366ede26d54 100644
--- a/apps/theming/l10n/fi.js
+++ b/apps/theming/l10n/fi.js
@@ -5,6 +5,7 @@ OC.L10N.register(
"Admin" : "Ylläpito",
"Saved" : "Tallennettu",
"a safe home for all your data" : "turvallinen koti kaikille tiedostoillesi",
+ "Error uploading the file" : "Virhe tiedostoa lähettäessä",
"Name cannot be empty" : "Nimi ei voi olla tyhjä",
"The given name is too long" : "Nimi on liian pitkä",
"The given web address is too long" : "Verkko-osoite on liian pitkä",
@@ -49,7 +50,9 @@ OC.L10N.register(
"Privacy policy" : "Yksityisyyskäytäntö",
"Adjust the Nextcloud theme" : "Mukauta Nextcloudin teemaa",
"Keyboard shortcuts" : "Pikanäppäimet",
+ "Disable all keyboard shortcuts" : "Poista käytöstä kaikki pikanäppäimet",
"Background" : "Tausta",
+ "Set a custom background" : "Aseta mukautettu tausta",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Saavutettavuus on erittäin tärkeää meille. Seuraamme verkkostandardeja ja varmistamme, että kaikki on käytettävissä ilman hiirtä sekä avustavien ohjelmistojen kuten ruudunlukijoiden avulla. Pyrimme olemaan yhteensopivia {guidelines}Web Content Accessibility Guidelines{linkend} -ohjeistuksen version 2.1 AA-tason kanssa, suuren kontrastin teemalla pyrimme jopa AAA-tasoon.",
"Pick from Files" : "Valitse tiedostoista",
"Default image" : "Oletuskuva",
diff --git a/apps/theming/l10n/fi.json b/apps/theming/l10n/fi.json
index 69543013773..6f053dd4693 100644
--- a/apps/theming/l10n/fi.json
+++ b/apps/theming/l10n/fi.json
@@ -3,6 +3,7 @@
"Admin" : "Ylläpito",
"Saved" : "Tallennettu",
"a safe home for all your data" : "turvallinen koti kaikille tiedostoillesi",
+ "Error uploading the file" : "Virhe tiedostoa lähettäessä",
"Name cannot be empty" : "Nimi ei voi olla tyhjä",
"The given name is too long" : "Nimi on liian pitkä",
"The given web address is too long" : "Verkko-osoite on liian pitkä",
@@ -47,7 +48,9 @@
"Privacy policy" : "Yksityisyyskäytäntö",
"Adjust the Nextcloud theme" : "Mukauta Nextcloudin teemaa",
"Keyboard shortcuts" : "Pikanäppäimet",
+ "Disable all keyboard shortcuts" : "Poista käytöstä kaikki pikanäppäimet",
"Background" : "Tausta",
+ "Set a custom background" : "Aseta mukautettu tausta",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "Saavutettavuus on erittäin tärkeää meille. Seuraamme verkkostandardeja ja varmistamme, että kaikki on käytettävissä ilman hiirtä sekä avustavien ohjelmistojen kuten ruudunlukijoiden avulla. Pyrimme olemaan yhteensopivia {guidelines}Web Content Accessibility Guidelines{linkend} -ohjeistuksen version 2.1 AA-tason kanssa, suuren kontrastin teemalla pyrimme jopa AAA-tasoon.",
"Pick from Files" : "Valitse tiedostoista",
"Default image" : "Oletuskuva",
diff --git a/apps/theming/l10n/fr.js b/apps/theming/l10n/fr.js
index b699588c1b8..151e6ab814f 100644
--- a/apps/theming/l10n/fr.js
+++ b/apps/theming/l10n/fr.js
@@ -40,6 +40,7 @@ OC.L10N.register(
"Adjust the Nextcloud theme" : "Modifier le thème Nextcloud",
"Keyboard shortcuts" : "Raccourcis clavier",
"Background" : "Arrière-plan",
+ "Set a custom background" : "Définir un arrière-plan personnalisé",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accès universel est très important pour nous. Nous suivons les standards du web et nous assurons que tout soit également utilisable sans souris et avec des logiciels d'assistance technique tels que les lecteurs d'écran. Nous visons à respecter les {guidelines}Règles pour l'accessibilité des contenus Web{linkend} 2.1 de niveau AA et même de niveau AAA avec le thème à fort contraste.",
"Pick from Files" : "Sélectionner dans Fichiers",
"Default image" : "Image par défaut",
diff --git a/apps/theming/l10n/fr.json b/apps/theming/l10n/fr.json
index c0d2d357cf1..43afe5c92ac 100644
--- a/apps/theming/l10n/fr.json
+++ b/apps/theming/l10n/fr.json
@@ -38,6 +38,7 @@
"Adjust the Nextcloud theme" : "Modifier le thème Nextcloud",
"Keyboard shortcuts" : "Raccourcis clavier",
"Background" : "Arrière-plan",
+ "Set a custom background" : "Définir un arrière-plan personnalisé",
"Universal access is very important to us. We follow web standards and check to make everything usable also without mouse, and assistive software such as screenreaders. We aim to be compliant with the {guidelines}Web Content Accessibility Guidelines{linkend} 2.1 on AA level, with the high contrast theme even on AAA level." : "L'accès universel est très important pour nous. Nous suivons les standards du web et nous assurons que tout soit également utilisable sans souris et avec des logiciels d'assistance technique tels que les lecteurs d'écran. Nous visons à respecter les {guidelines}Règles pour l'accessibilité des contenus Web{linkend} 2.1 de niveau AA et même de niveau AAA avec le thème à fort contraste.",
"Pick from Files" : "Sélectionner dans Fichiers",
"Default image" : "Image par défaut",
diff --git a/apps/theming/l10n/pl.js b/apps/theming/l10n/pl.js
index f1207148fc5..31d4cd0bf15 100644
--- a/apps/theming/l10n/pl.js
+++ b/apps/theming/l10n/pl.js
@@ -33,7 +33,7 @@ OC.L10N.register(
"Similar to the high contrast mode, but with dark colours." : "Podobny do trybu wysokiego kontrastu, ale z ciemnymi kolorami.",
"Dark theme" : "Ciemny motyw",
"Enable dark theme" : "Włącz ciemny motyw",
- "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ciemny motyw łagodny dla Twoich oczów, redukując ogólną luminancję i jasność.",
+ "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ciemny motyw łagodny dla Twoich oczu, redukując ogólną luminancję i jasność.",
"System default theme" : "Domyślny motyw systemu",
"Enable the system default" : "Włącz domyślne ustawienia systemu",
"Using the default system appearance." : "Korzystanie z domyślnego wyglądu systemu.",
diff --git a/apps/theming/l10n/pl.json b/apps/theming/l10n/pl.json
index d99ade56568..3f2e4e1b4d5 100644
--- a/apps/theming/l10n/pl.json
+++ b/apps/theming/l10n/pl.json
@@ -31,7 +31,7 @@
"Similar to the high contrast mode, but with dark colours." : "Podobny do trybu wysokiego kontrastu, ale z ciemnymi kolorami.",
"Dark theme" : "Ciemny motyw",
"Enable dark theme" : "Włącz ciemny motyw",
- "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ciemny motyw łagodny dla Twoich oczów, redukując ogólną luminancję i jasność.",
+ "A dark theme to ease your eyes by reducing the overall luminosity and brightness." : "Ciemny motyw łagodny dla Twoich oczu, redukując ogólną luminancję i jasność.",
"System default theme" : "Domyślny motyw systemu",
"Enable the system default" : "Włącz domyślne ustawienia systemu",
"Using the default system appearance." : "Korzystanie z domyślnego wyglądu systemu.",
diff --git a/apps/theming/lib/Themes/CommonThemeTrait.php b/apps/theming/lib/Themes/CommonThemeTrait.php
index a7f7b407d2f..631879ea832 100644
--- a/apps/theming/lib/Themes/CommonThemeTrait.php
+++ b/apps/theming/lib/Themes/CommonThemeTrait.php
@@ -45,7 +45,7 @@ trait CommonThemeTrait {
'--color-primary-text' => $this->util->invertTextColor($this->primaryColor) ? '#000000' : '#ffffff',
'--color-primary-hover' => $this->util->mix($this->primaryColor, $colorMainBackground, 60),
'--color-primary-light' => $colorPrimaryLight,
- '--color-primary-light-text' => $this->primaryColor,
+ '--color-primary-light-text' => $this->util->mix($this->primaryColor, $this->util->invertTextColor($colorPrimaryLight) ? '#000000' : '#ffffff', -20),
'--color-primary-light-hover' => $this->util->mix($colorPrimaryLight, $colorMainText, 90),
'--color-primary-text-dark' => $this->util->darken($this->util->invertTextColor($this->primaryColor) ? '#000000' : '#ffffff', 7),
@@ -54,7 +54,7 @@ trait CommonThemeTrait {
'--color-primary-element-text' => $this->util->invertTextColor($colorPrimaryElement) ? '#000000' : '#ffffff',
'--color-primary-element-hover' => $this->util->mix($colorPrimaryElement, $colorMainBackground, 60),
'--color-primary-element-light' => $colorPrimaryElementLight,
- '--color-primary-element-light-text' => $colorPrimaryElement,
+ '--color-primary-element-light-text' => $this->util->mix($colorPrimaryElement, $this->util->invertTextColor($colorPrimaryElementLight) ? '#000000' : '#ffffff', -20),
'--color-primary-element-light-hover' => $this->util->mix($colorPrimaryElementLight, $colorMainText, 90),
'--color-primary-element-text-dark' => $this->util->darken($this->util->invertTextColor($colorPrimaryElement) ? '#000000' : '#ffffff', 7),
diff --git a/apps/user_ldap/l10n/fr.js b/apps/user_ldap/l10n/fr.js
index 15b83120b8e..50422323f92 100644
--- a/apps/user_ldap/l10n/fr.js
+++ b/apps/user_ldap/l10n/fr.js
@@ -60,6 +60,8 @@ OC.L10N.register(
"Your password will expire today." : "Votre mot de passe va expirer aujourd'hui.",
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Votre mot de passe va expirer dans %n jour.","Votre mot de passe va expirer dans %n jours.","Votre mot de passe va expirer dans %n jours."],
"LDAP/AD integration" : "Integration LDAP/AD ",
+ "_%n group found_::_%n groups found_" : ["%n groupe trouvé","%n groupes trouvés","%n groupes trouvés"],
+ "_%n user found_::_%n users found_" : ["%n utilisateur trouvé","%n utilisateurs trouvés","%n utilisateurs trouvés"],
"Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Impossible de détecter l'attribut contenant le nom d'affichage des utilisateurs. Veuillez l'indiquer vous-même dans les paramètres LDAP avancés.",
"Could not find the desired feature" : "Impossible de trouver la fonction souhaitée",
"Invalid Host" : "Hôte non valide",
diff --git a/apps/user_ldap/l10n/fr.json b/apps/user_ldap/l10n/fr.json
index 2ef8e201750..db8bf10af2e 100644
--- a/apps/user_ldap/l10n/fr.json
+++ b/apps/user_ldap/l10n/fr.json
@@ -58,6 +58,8 @@
"Your password will expire today." : "Votre mot de passe va expirer aujourd'hui.",
"_Your password will expire within %n day._::_Your password will expire within %n days._" : ["Votre mot de passe va expirer dans %n jour.","Votre mot de passe va expirer dans %n jours.","Votre mot de passe va expirer dans %n jours."],
"LDAP/AD integration" : "Integration LDAP/AD ",
+ "_%n group found_::_%n groups found_" : ["%n groupe trouvé","%n groupes trouvés","%n groupes trouvés"],
+ "_%n user found_::_%n users found_" : ["%n utilisateur trouvé","%n utilisateurs trouvés","%n utilisateurs trouvés"],
"Could not detect user display name attribute. Please specify it yourself in advanced LDAP settings." : "Impossible de détecter l'attribut contenant le nom d'affichage des utilisateurs. Veuillez l'indiquer vous-même dans les paramètres LDAP avancés.",
"Could not find the desired feature" : "Impossible de trouver la fonction souhaitée",
"Invalid Host" : "Hôte non valide",
diff --git a/build/psalm-baseline.xml b/build/psalm-baseline.xml
index efcf731e24f..ac4a7fafcdf 100644
--- a/build/psalm-baseline.xml
+++ b/build/psalm-baseline.xml
@@ -2092,10 +2092,8 @@
<code>getAppsNeedingUpgrade</code>
<code>getIncompatibleApps</code>
</InternalMethod>
- <InvalidArgument occurrences="3">
+ <InvalidArgument occurrences="1">
<code>$restrictions</code>
- <code>addServiceListener</code>
- <code>addServiceListener</code>
</InvalidArgument>
<RedundantCondition occurrences="1">
<code>((array)$request-&gt;getParam('appid')) !== ''</code>
@@ -3668,12 +3666,6 @@
</UndefinedThisPropertyFetch>
</file>
<file src="lib/private/Share/Share.php">
- <FalsableReturnStatement occurrences="1">
- <code>false</code>
- </FalsableReturnStatement>
- <InvalidArgument occurrences="1">
- <code>$arguments</code>
- </InvalidArgument>
<InvalidOperand occurrences="1">
<code>!self::isResharingAllowed()</code>
</InvalidOperand>
@@ -3825,9 +3817,6 @@
</NullableReturnStatement>
</file>
<file src="lib/private/Tags.php">
- <InvalidArgument occurrences="1">
- <code>[$this-&gt;user, $this-&gt;type, $chunk]</code>
- </InvalidArgument>
<InvalidScalarArgument occurrences="2">
<code>$from</code>
<code>$names</code>
@@ -3974,14 +3963,6 @@
<code>$appId === null</code>
</TypeDoesNotContainNull>
</file>
- <file src="lib/private/legacy/OC_DB.php">
- <InvalidReturnStatement occurrences="1">
- <code>$result</code>
- </InvalidReturnStatement>
- <InvalidReturnType occurrences="1">
- <code>OC_DB_StatementWrapper</code>
- </InvalidReturnType>
- </file>
<file src="lib/private/legacy/OC_FileChunking.php">
<UndefinedDocblockClass occurrences="1">
<code>\OC\InsufficientStorageException</code>
diff --git a/config/config.sample.php b/config/config.sample.php
index 104b3e32546..3e65008ed3b 100644
--- a/config/config.sample.php
+++ b/config/config.sample.php
@@ -138,6 +138,12 @@ $CONFIG = [
*/
'dbtableprefix' => '',
+/**
+ * Enable persistent connexions to the database.
+ * This setting uses the "persistent" option from doctrine dbal, wich in turns
+ * uses the PDO::ATTR_PERSISTENT option from de pdo driver.
+ */
+'dbpersistent' => '',
/**
* Indicates whether the Nextcloud instance was installed successfully; ``true``
diff --git a/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php b/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php
index 7ab9fb47d54..df5d8de8eb7 100644
--- a/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php
+++ b/core/BackgroundJobs/BackgroundCleanupUpdaterBackupsJob.php
@@ -45,14 +45,14 @@ class BackgroundCleanupUpdaterBackupsJob extends QueuedJob {
* This job cleans up all backups except the latest 3 from the updaters backup directory
*/
public function run($arguments) {
- $dataDir = $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data');
+ $updateDir = $this->config->getSystemValue('updatedirectory', null) ?? $this->config->getSystemValue('datadirectory', \OC::$SERVERROOT . '/data');
$instanceId = $this->config->getSystemValue('instanceid', null);
if (!is_string($instanceId) || empty($instanceId)) {
return;
}
- $updaterFolderPath = $dataDir . '/updater-' . $instanceId;
+ $updaterFolderPath = $updateDir . '/updater-' . $instanceId;
$backupFolderPath = $updaterFolderPath . '/backups';
if (file_exists($backupFolderPath)) {
$this->log->info("$backupFolderPath exists - start to clean it up");
diff --git a/core/Controller/ReferenceApiController.php b/core/Controller/ReferenceApiController.php
index b9706796460..266532113d8 100644
--- a/core/Controller/ReferenceApiController.php
+++ b/core/Controller/ReferenceApiController.php
@@ -61,7 +61,7 @@ class ReferenceApiController extends \OCP\AppFramework\OCSController {
* @NoAdminRequired
*/
public function resolveOne(string $reference): DataResponse {
- $resolvedReference = $this->referenceManager->resolveReference($reference);
+ $resolvedReference = $this->referenceManager->resolveReference(trim($reference));
$response = new DataResponse(['references' => [ $reference => $resolvedReference ]]);
$response->cacheFor(3600, false, true);
diff --git a/core/l10n/fr.js b/core/l10n/fr.js
index b40fa12daf4..b9c84fc70c2 100644
--- a/core/l10n/fr.js
+++ b/core/l10n/fr.js
@@ -26,7 +26,7 @@ OC.L10N.register(
"Invalid app password" : "Mot de passe d'application non valide",
"Could not complete login" : "Impossible de terminer la connexion",
"Your login token is invalid or has expired" : "Votre jeton de connexion est invalide ou a expiré",
- "This community release of Nextcloud is unsupported and push notifications are limited." : "Cette version community de Nextcloud n'est pas prise en charge et les notifications push sont limitées",
+ "This community release of Nextcloud is unsupported and push notifications are limited." : "Cette version communautaire de Nextcloud n'est pas prise en charge et les notifications push sont limitées.",
"Login" : "S'identifier",
"Password reset is disabled" : "La réinitialisation du mot de passe est désactivée",
"Could not reset password because the token is expired" : "Impossible de réinitialiser le mot de passe car le jeton d'authentification est expiré.",
@@ -74,11 +74,11 @@ OC.L10N.register(
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Votre base de données ne fonctionne pas avec le niveau d'isolation de transaction \"READ COMMITED\". Ceci peut causer des problèmes quand plusieurs actions sont exécutées en parallèle.",
"The PHP module \"fileinfo\" is missing. It is strongly recommended to enable this module to get the best results with MIME type detection." : "Le module PHP 'fileinfo' est manquant. Il est vivement recommandé de l'activer afin d'obtenir les meilleurs résultats de détection du type MIME.",
"Transactional file locking is disabled, this might lead to issues with race conditions. Enable \"filelocking.enabled\" in config.php to avoid these problems. See the {linkstart}documentation ↗{linkend} for more information." : "Le verrouillage transactionnel de fichiers est désactivé, cela peut causer des conflits en cas d'accès concurrent. Configurez 'filelocking.enabled' dans config.php pour éviter ces problèmes. Consultez la {linkstart}documentation ↗{linkend} pour plus d'informations.",
- "Please make sure to set the \"overwrite.cli.url\" option in your config.php file to the URL that your users mainly use to access this Nextcloud. Suggestion: \"{suggestedOverwriteCliURL}\". Otherwise there might be problems with the URL generation via cron. (It is possible though that the suggested URL is not the URL that your users mainly use to access this Nextcloud. Best is to double check this in any case.)" : "Veuillez vous assurer que l'adresse \"overwrite.cli.url\" dans votre fichier 'config.php' est celle que vos utilisateur utilisent habituellement pour accéder à Nextcloud. Suggestion : \"{suggestedOverwriteCliURL}\". Autrement, il peut y avoir des problèmes avec la génération d'adresses via les tâches en arrière-plan. (Il est possible que l'adresse suggérée ne soit pas la mieux adaptée à cette instance Nextcloud. Veuillez vous assurer que c'est la meilleure option.)",
+ "Please make sure to set the \"overwrite.cli.url\" option in your config.php file to the URL that your users mainly use to access this Nextcloud. Suggestion: \"{suggestedOverwriteCliURL}\". Otherwise there might be problems with the URL generation via cron. (It is possible though that the suggested URL is not the URL that your users mainly use to access this Nextcloud. Best is to double check this in any case.)" : "Veillez à définir le paramètre \"overwrite.cli.url\" dans votre fichier config.php avec l'URL que vos utilisateurs utilisent principalement pour accéder à ce Nextcloud. Suggestion : \"{suggestedOverwriteCliURL}\". Sinon, il pourrait y avoir des problèmes avec la génération des URL via cron. (Il est toutefois possible que l'URL suggérée ne soit pas l'URL que vos utilisateurs utilisent principalement pour accéder à ce Nextcloud. Le mieux est de le vérifier deux fois dans tous les cas).",
"Your installation has no default phone region set. This is required to validate phone numbers in the profile settings without a country code. To allow numbers without a country code, please add \"default_phone_region\" with the respective {linkstart}ISO 3166-1 code ↗{linkend} of the region to your config file." : "Votre installation n’a pas de préfixe de région par défaut. C’est nécessaire pour valider les numéros de téléphone dans les paramètres du profil sans code pays. Pour autoriser les numéros sans code pays, veuillez ajouter \"default_phone_region\" avec le code {linkstart}ISO 3166-1 respectif {linkend} de la région dans votre fichier de configuration.",
"It was not possible to execute the cron job via CLI. The following technical errors have appeared:" : "La tâche cron n'a pu s'exécuter via CLI. Ces erreurs techniques sont apparues :",
"Last background job execution ran {relativeTime}. Something seems wrong. {linkstart}Check the background job settings ↗{linkend}." : "La dernière tâche de fond a été exécutée {relativeTime}. Quelque chose s'est mal passé. {linkstart}Vérifier le réglage des tâches de fond ↗{linkend}.",
- "This is the unsupported community build of Nextcloud. Given the size of this instance, performance, reliability and scalability cannot be guaranteed. Push notifications are limited to avoid overloading our free service. Learn more about the benefits of Nextcloud Enterprise at {linkstart}https://nextcloud.com/enterprise{linkend}." : "Ceci est la version 'community' non prise en charge de Nextcloud. Compte tenu de la taille de cette instance, la performance, la fiabilité et l’évolutivité ne peuvent être garanties. Les notifications push sont limitées pour éviter de surcharger notre service gratuit. Apprenez-en davantage sur les bénéfices de la version 'Nextcloud Entreprise' à {linkstart}https://nextcloud.com/enterprise{linkend}.",
+ "This is the unsupported community build of Nextcloud. Given the size of this instance, performance, reliability and scalability cannot be guaranteed. Push notifications are limited to avoid overloading our free service. Learn more about the benefits of Nextcloud Enterprise at {linkstart}https://nextcloud.com/enterprise{linkend}." : "Ceci est la version communautaire non prise en charge de Nextcloud. Compte tenu de la taille de cette instance, la performance, la fiabilité et la scalabilité ne peuvent être garanties. Les notifications push sont limitées pour éviter de surcharger notre service gratuit. Apprenez-en davantage sur les bénéfices de la version 'Nextcloud Entreprise' sur {linkstart}https://nextcloud.com/enterprise{linkend}.",
"This server has no working internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the internet to enjoy all features." : "Ce serveur ne peut se connecter à Internet : plusieurs points finaux ne peuvent être atteints. Cela signifie que certaines fonctionnalités, telles que le montage de supports de stockage distants, les notifications de mises à jour ou l'installation d'applications tierces ne fonctionneront pas. L'accès aux fichiers à distance, ainsi que l'envoi de notifications par mail peuvent aussi être indisponibles. Il est recommandé d'activer la connexion internet pour ce serveur si vous souhaitez disposer de l'ensemble des fonctionnalités offertes.",
"No memory cache has been configured. To enhance performance, please configure a memcache, if available. Further information can be found in the {linkstart}documentation ↗{linkend}." : "Pas de mémoire cache configurée. Pour améliorer les performances, merci de configurer un memcache, si disponible. Des informations sont disponibles dans la {linkstart}documentation ↗{linkend}.",
"No suitable source for randomness found by PHP which is highly discouraged for security reasons. Further information can be found in the {linkstart}documentation ↗{linkend}." : "Aucune source appropriée pour l'aléatoire n'a été trouvée par PHP, ce qui est fortement déconseillé pour des raisons de sécurité. Des informations complémentaires peuvent être trouvées dans la {linkstart}documentation ↗{linkend}.",
@@ -97,8 +97,8 @@ OC.L10N.register(
"Missing optional column \"{columnName}\" in table \"{tableName}\"." : "Colonne optionnelle \"{columnName}\" manquante dans la table \"{tableName}\".",
"The database is missing some optional columns. Due to the fact that adding columns on big tables could take some time they were not added automatically when they can be optional. By running \"occ db:add-missing-columns\" those missing columns could be added manually while the instance keeps running. Once the columns are added some features might improve responsiveness or usability." : "Certaines colonnes facultatives sont manquantes dans la base de données. Étant donné qu'ajouter des colonnes sur des grandes tables peut prendre du temps, elles n'ont pas été ajoutées automatiquement lorsqu'elles sont facultatives. En exécutant \"occ db:add-missing-columns\" ces colonnes manquantes peuvent être ajoutées manuellement alors que l'instance continue de fonctionner. Une fois que les colonnes sont ajoutées, la performance ou l'utilisabilité de certaines fonctionnalités pourraient être améliorées.",
"This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them." : "Cette instance ne dispose pas de plusieurs modules PHP recommandés. Il est recommandé de les installer pour améliorer les performances, et la compatibilité.",
- "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Le module PHP \"imagick\" n'est pas actif mais l'application Theming est activée. Pour que la génération de Favicon fonctionne correctement, ce module doit être installé et actif.",
- "The PHP modules \"gmp\" and/or \"bcmath\" are not enabled. If you use WebAuthn passwordless authentication, these modules are required." : "Les modules PHP \"gmp\" et/ou \"bcmatch\" ne sont pas actifs. Si vous utilisez l'authentification sans mot de passe WebAuthn, ces modules sont requis.",
+ "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Le module PHP \"imagick\" n'est pas actif mais l'application Theming est activée. Pour que la génération du Favicon fonctionne correctement, ce module doit être installé et actif.",
+ "The PHP modules \"gmp\" and/or \"bcmath\" are not enabled. If you use WebAuthn passwordless authentication, these modules are required." : "Les modules PHP \"gmp\" et/ou \"bcmath\" ne sont pas actifs. Si vous utilisez l'authentification sans mot de passe WebAuthn, ces modules sont requis.",
"It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit! For further details read {linkstart}the documentation page about this ↗{linkend}." : "Il semble que vous utilisez une version 32-bits de PHP. Nextcloud nécessite une version 64-bits pour bien fonctionner. Merci de mettre à niveau votre système d'exploitation et PHP en 64-bits. Pour plus de détails consultez {linkstart}the documentation page about this ↗{linkend}.",
"Module php-imagick in this instance has no SVG support. For better compatibility it is recommended to install it." : "Le module php-imagick n’a aucun support SVG dans cette instance. Pour une meilleure compatibilité, il est recommandé de l’installer.",
"Some columns in the database are missing a conversion to big int. Due to the fact that changing column types on big tables could take some time they were not changed automatically. By running \"occ db:convert-filecache-bigint\" those pending changes could be applied manually. This operation needs to be made while the instance is offline. For further details read {linkstart}the documentation page about this ↗{linkend}." : "Certaines colonnes de la base de données n'ont pas été converties en 'big int'. Changer le type de colonne dans de grandes tables peut prendre beaucoup de temps, elles n'ont donc pas été converties automatiquement. En exécutant la commande 'occ db:convert-filecache-bigint', ces changements en suspens peuvent être déclenchés manuellement. Cette opération doit être exécutée pendant que l'instance est hors ligne. Pour plus d'information, consulter {linkstart}la page de documentation à ce propos ↗{linkend}.",
@@ -116,7 +116,7 @@ OC.L10N.register(
"Your data directory and files are probably accessible from the internet. The .htaccess file is not working. It is strongly recommended that you configure your web server so that the data directory is no longer accessible, or move the data directory outside the web server document root." : "Votre dossier de données et vos fichiers sont probablement accessibles depuis internet. Le fichier .htaccess ne fonctionne pas. Nous vous recommandons vivement de configurer votre serveur web de façon à ce que ce dossier de données ne soit plus accessible, ou de le déplacer hors de la racine du serveur web.",
"The \"{header}\" HTTP header is not set to \"{expected}\". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly." : "L'en-tête HTTP \"{header}\" n'est pas configurée pour être égale à \"{expected}\". Ceci constitue un risque potentiel relatif à la sécurité et à la vie privée étant donné qu'il est recommandé d'ajuster ce paramètre.",
"The \"{header}\" HTTP header is not set to \"{expected}\". Some features might not work correctly, as it is recommended to adjust this setting accordingly." : "L'en-tête HTTP \"{header}\" n'est pas configurée pour être égale à \"{expected}\". Certaines fonctionnalités peuvent ne pas fonctionner correctement étant donné qu'il est recommandé d'ajuster ce paramètre.",
- "The \"{header}\" HTTP header does not contain \"{expected}\". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly." : "L'entête HTTP \"{header}\" ne contient pas \"{expected}\". Cela constitue un potentiel risque de sécurité ou relatif à la protection de la vie privée, aussi il est recommandé d'ajuster ce paramètre en conséquence. ",
+ "The \"{header}\" HTTP header does not contain \"{expected}\". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly." : "L'entête HTTP \"{header}\" ne contient pas \"{expected}\". Cela constitue potentiellement un risque relatif à la de sécurité ou à la confidentialité, aussi, il est recommandé d'ajuster ce paramètre en conséquence. ",
"The \"{header}\" HTTP header is not set to \"{val1}\", \"{val2}\", \"{val3}\", \"{val4}\" or \"{val5}\". This can leak referer information. See the {linkstart}W3C Recommendation ↗{linkend}." : "L'en-tête HTTP \"{header}\" n'est pas défini sur \"{val1}\", \"{val2}\", \"{val3}\", \"{val4}\" ou \"{val5}\". Cela peut entraîner une fuite d'informations. Se reporter aux {linkstart}recommandations du W3C ↗{linkend}.",
"The \"Strict-Transport-Security\" HTTP header is not set to at least \"{seconds}\" seconds. For enhanced security, it is recommended to enable HSTS as described in the {linkstart}security tips ↗{linkend}." : "L'en-tête HTTP \"Strict-Transport-Security\" n'est pas configuré à au moins \"{seconds}\" secondes. Pour une sécurité renforcée, il est recommandé d'activer HSTS comme indiqué dans les {linkstart}éléments de sécurité ↗{linkend}.",
"Accessing site insecurely via HTTP. You are strongly advised to set up your server to require HTTPS instead, as described in the {linkstart}security tips ↗{linkend}." : "Accès non sécurisé au site via HTTP. Il est fortement conseillé de configurer votre serveur pour exiger HTTPS à la place, comme décrit dans les {linkstart}conseils de sécurité ↗{linkend}.",
@@ -146,7 +146,7 @@ OC.L10N.register(
"An internal error occurred." : "Une erreur interne est survenue.",
"Please try again or contact your administrator." : "Veuillez réessayer ou contactez votre administrateur.",
"Log in to {productName}" : "Se connecter dans {productName}",
- "Account name or email" : "Nom d'utilisateur ou adresse électronique",
+ "Account name or email" : "Nom d'utilisateur ou adresse e-mail",
"Password" : "Mot de passe",
"Wrong username or password." : "Utilisateur ou mot de passe incorrect.",
"User disabled" : "Utilisateur désactivé",
@@ -180,7 +180,7 @@ OC.L10N.register(
"Keep your colleagues and friends in one place without leaking their private info." : "Gardez les contacts de vos collègues et amis au même endroit sans divulguer leurs informations personnelles.",
"Simple email app nicely integrated with Files, Contacts and Calendar." : "Application de messagerie électronique simple et bien intégrée avec Fichiers, Contacts et Calendrier.",
"Chatting, video calls, screensharing, online meetings and web conferencing – in your browser and with mobile apps." : "Discussions, appels vidéo, partage d'écran, réunions en ligne et conférences web – depuis votre navigateur et les applications mobiles.",
- "Collaborative documents, spreadsheets and presentations, built on Collabora Online." : "Documents, feuilles de calculs ou présentations créées sur Collabora Online",
+ "Collaborative documents, spreadsheets and presentations, built on Collabora Online." : "Documents, feuilles de calculs ou présentations créées sur Collabora Online.",
"Forgot password?" : "Mot de passe oublié ?",
"Log in with a device" : "Se connecter avec un appareil",
"Back" : "Retour",
@@ -242,8 +242,8 @@ OC.L10N.register(
"(all selected)" : "(tous sélectionnés)",
"({count} selected)" : "({count} sélectionné(s))",
"Error loading file exists template" : "Erreur lors du chargement du modèle de fichier existant",
- "Show list view" : "Afficher la vue en liste",
- "Show grid view" : "Afficher la vue en grille",
+ "Show list view" : "Activer l'affichage liste",
+ "Show grid view" : "Activer l'affichage mosaïque",
"Pending" : "En attente",
"Copy to {folder}" : "Copier vers {folder}",
"Move to {folder}" : "Déplacer vers {folder}",
@@ -363,7 +363,7 @@ OC.L10N.register(
"Please type in your email address to request a temporary password" : "Veuillez saisir votre adresse e-mail pour recevoir un mot de passe temporaire",
"Email address" : "Adresse e-mail",
"Password sent!" : "Mot de passe envoyé !",
- "You are not authorized to request a password for this share" : "Vous n'êtes pas autorisé a demander un mot de passe pour ce partage",
+ "You are not authorized to request a password for this share" : "Vous n'êtes pas autorisé à demander un mot de passe pour ce partage",
"Go to %s" : "Aller à %s",
"Two-factor authentication" : "Second facteur d'authentification",
"Enhanced security is enabled for your account. Choose a second factor for authentication:" : "La sécurité renforcée est activée pour votre compte. Choisissez un second facteur pour l'authentification :",
diff --git a/core/l10n/fr.json b/core/l10n/fr.json
index 2f5da71e01d..dcb1dc6944c 100644
--- a/core/l10n/fr.json
+++ b/core/l10n/fr.json
@@ -24,7 +24,7 @@
"Invalid app password" : "Mot de passe d'application non valide",
"Could not complete login" : "Impossible de terminer la connexion",
"Your login token is invalid or has expired" : "Votre jeton de connexion est invalide ou a expiré",
- "This community release of Nextcloud is unsupported and push notifications are limited." : "Cette version community de Nextcloud n'est pas prise en charge et les notifications push sont limitées",
+ "This community release of Nextcloud is unsupported and push notifications are limited." : "Cette version communautaire de Nextcloud n'est pas prise en charge et les notifications push sont limitées.",
"Login" : "S'identifier",
"Password reset is disabled" : "La réinitialisation du mot de passe est désactivée",
"Could not reset password because the token is expired" : "Impossible de réinitialiser le mot de passe car le jeton d'authentification est expiré.",
@@ -72,11 +72,11 @@
"Your database does not run with \"READ COMMITTED\" transaction isolation level. This can cause problems when multiple actions are executed in parallel." : "Votre base de données ne fonctionne pas avec le niveau d'isolation de transaction \"READ COMMITED\". Ceci peut causer des problèmes quand plusieurs actions sont exécutées en parallèle.",
"The PHP module \"fileinfo\" is missing. It is strongly recommended to enable this module to get the best results with MIME type detection." : "Le module PHP 'fileinfo' est manquant. Il est vivement recommandé de l'activer afin d'obtenir les meilleurs résultats de détection du type MIME.",
"Transactional file locking is disabled, this might lead to issues with race conditions. Enable \"filelocking.enabled\" in config.php to avoid these problems. See the {linkstart}documentation ↗{linkend} for more information." : "Le verrouillage transactionnel de fichiers est désactivé, cela peut causer des conflits en cas d'accès concurrent. Configurez 'filelocking.enabled' dans config.php pour éviter ces problèmes. Consultez la {linkstart}documentation ↗{linkend} pour plus d'informations.",
- "Please make sure to set the \"overwrite.cli.url\" option in your config.php file to the URL that your users mainly use to access this Nextcloud. Suggestion: \"{suggestedOverwriteCliURL}\". Otherwise there might be problems with the URL generation via cron. (It is possible though that the suggested URL is not the URL that your users mainly use to access this Nextcloud. Best is to double check this in any case.)" : "Veuillez vous assurer que l'adresse \"overwrite.cli.url\" dans votre fichier 'config.php' est celle que vos utilisateur utilisent habituellement pour accéder à Nextcloud. Suggestion : \"{suggestedOverwriteCliURL}\". Autrement, il peut y avoir des problèmes avec la génération d'adresses via les tâches en arrière-plan. (Il est possible que l'adresse suggérée ne soit pas la mieux adaptée à cette instance Nextcloud. Veuillez vous assurer que c'est la meilleure option.)",
+ "Please make sure to set the \"overwrite.cli.url\" option in your config.php file to the URL that your users mainly use to access this Nextcloud. Suggestion: \"{suggestedOverwriteCliURL}\". Otherwise there might be problems with the URL generation via cron. (It is possible though that the suggested URL is not the URL that your users mainly use to access this Nextcloud. Best is to double check this in any case.)" : "Veillez à définir le paramètre \"overwrite.cli.url\" dans votre fichier config.php avec l'URL que vos utilisateurs utilisent principalement pour accéder à ce Nextcloud. Suggestion : \"{suggestedOverwriteCliURL}\". Sinon, il pourrait y avoir des problèmes avec la génération des URL via cron. (Il est toutefois possible que l'URL suggérée ne soit pas l'URL que vos utilisateurs utilisent principalement pour accéder à ce Nextcloud. Le mieux est de le vérifier deux fois dans tous les cas).",
"Your installation has no default phone region set. This is required to validate phone numbers in the profile settings without a country code. To allow numbers without a country code, please add \"default_phone_region\" with the respective {linkstart}ISO 3166-1 code ↗{linkend} of the region to your config file." : "Votre installation n’a pas de préfixe de région par défaut. C’est nécessaire pour valider les numéros de téléphone dans les paramètres du profil sans code pays. Pour autoriser les numéros sans code pays, veuillez ajouter \"default_phone_region\" avec le code {linkstart}ISO 3166-1 respectif {linkend} de la région dans votre fichier de configuration.",
"It was not possible to execute the cron job via CLI. The following technical errors have appeared:" : "La tâche cron n'a pu s'exécuter via CLI. Ces erreurs techniques sont apparues :",
"Last background job execution ran {relativeTime}. Something seems wrong. {linkstart}Check the background job settings ↗{linkend}." : "La dernière tâche de fond a été exécutée {relativeTime}. Quelque chose s'est mal passé. {linkstart}Vérifier le réglage des tâches de fond ↗{linkend}.",
- "This is the unsupported community build of Nextcloud. Given the size of this instance, performance, reliability and scalability cannot be guaranteed. Push notifications are limited to avoid overloading our free service. Learn more about the benefits of Nextcloud Enterprise at {linkstart}https://nextcloud.com/enterprise{linkend}." : "Ceci est la version 'community' non prise en charge de Nextcloud. Compte tenu de la taille de cette instance, la performance, la fiabilité et l’évolutivité ne peuvent être garanties. Les notifications push sont limitées pour éviter de surcharger notre service gratuit. Apprenez-en davantage sur les bénéfices de la version 'Nextcloud Entreprise' à {linkstart}https://nextcloud.com/enterprise{linkend}.",
+ "This is the unsupported community build of Nextcloud. Given the size of this instance, performance, reliability and scalability cannot be guaranteed. Push notifications are limited to avoid overloading our free service. Learn more about the benefits of Nextcloud Enterprise at {linkstart}https://nextcloud.com/enterprise{linkend}." : "Ceci est la version communautaire non prise en charge de Nextcloud. Compte tenu de la taille de cette instance, la performance, la fiabilité et la scalabilité ne peuvent être garanties. Les notifications push sont limitées pour éviter de surcharger notre service gratuit. Apprenez-en davantage sur les bénéfices de la version 'Nextcloud Entreprise' sur {linkstart}https://nextcloud.com/enterprise{linkend}.",
"This server has no working internet connection: Multiple endpoints could not be reached. This means that some of the features like mounting external storage, notifications about updates or installation of third-party apps will not work. Accessing files remotely and sending of notification emails might not work, either. Establish a connection from this server to the internet to enjoy all features." : "Ce serveur ne peut se connecter à Internet : plusieurs points finaux ne peuvent être atteints. Cela signifie que certaines fonctionnalités, telles que le montage de supports de stockage distants, les notifications de mises à jour ou l'installation d'applications tierces ne fonctionneront pas. L'accès aux fichiers à distance, ainsi que l'envoi de notifications par mail peuvent aussi être indisponibles. Il est recommandé d'activer la connexion internet pour ce serveur si vous souhaitez disposer de l'ensemble des fonctionnalités offertes.",
"No memory cache has been configured. To enhance performance, please configure a memcache, if available. Further information can be found in the {linkstart}documentation ↗{linkend}." : "Pas de mémoire cache configurée. Pour améliorer les performances, merci de configurer un memcache, si disponible. Des informations sont disponibles dans la {linkstart}documentation ↗{linkend}.",
"No suitable source for randomness found by PHP which is highly discouraged for security reasons. Further information can be found in the {linkstart}documentation ↗{linkend}." : "Aucune source appropriée pour l'aléatoire n'a été trouvée par PHP, ce qui est fortement déconseillé pour des raisons de sécurité. Des informations complémentaires peuvent être trouvées dans la {linkstart}documentation ↗{linkend}.",
@@ -95,8 +95,8 @@
"Missing optional column \"{columnName}\" in table \"{tableName}\"." : "Colonne optionnelle \"{columnName}\" manquante dans la table \"{tableName}\".",
"The database is missing some optional columns. Due to the fact that adding columns on big tables could take some time they were not added automatically when they can be optional. By running \"occ db:add-missing-columns\" those missing columns could be added manually while the instance keeps running. Once the columns are added some features might improve responsiveness or usability." : "Certaines colonnes facultatives sont manquantes dans la base de données. Étant donné qu'ajouter des colonnes sur des grandes tables peut prendre du temps, elles n'ont pas été ajoutées automatiquement lorsqu'elles sont facultatives. En exécutant \"occ db:add-missing-columns\" ces colonnes manquantes peuvent être ajoutées manuellement alors que l'instance continue de fonctionner. Une fois que les colonnes sont ajoutées, la performance ou l'utilisabilité de certaines fonctionnalités pourraient être améliorées.",
"This instance is missing some recommended PHP modules. For improved performance and better compatibility it is highly recommended to install them." : "Cette instance ne dispose pas de plusieurs modules PHP recommandés. Il est recommandé de les installer pour améliorer les performances, et la compatibilité.",
- "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Le module PHP \"imagick\" n'est pas actif mais l'application Theming est activée. Pour que la génération de Favicon fonctionne correctement, ce module doit être installé et actif.",
- "The PHP modules \"gmp\" and/or \"bcmath\" are not enabled. If you use WebAuthn passwordless authentication, these modules are required." : "Les modules PHP \"gmp\" et/ou \"bcmatch\" ne sont pas actifs. Si vous utilisez l'authentification sans mot de passe WebAuthn, ces modules sont requis.",
+ "The PHP module \"imagick\" is not enabled although the theming app is. For favicon generation to work correctly, you need to install and enable this module." : "Le module PHP \"imagick\" n'est pas actif mais l'application Theming est activée. Pour que la génération du Favicon fonctionne correctement, ce module doit être installé et actif.",
+ "The PHP modules \"gmp\" and/or \"bcmath\" are not enabled. If you use WebAuthn passwordless authentication, these modules are required." : "Les modules PHP \"gmp\" et/ou \"bcmath\" ne sont pas actifs. Si vous utilisez l'authentification sans mot de passe WebAuthn, ces modules sont requis.",
"It seems like you are running a 32-bit PHP version. Nextcloud needs 64-bit to run well. Please upgrade your OS and PHP to 64-bit! For further details read {linkstart}the documentation page about this ↗{linkend}." : "Il semble que vous utilisez une version 32-bits de PHP. Nextcloud nécessite une version 64-bits pour bien fonctionner. Merci de mettre à niveau votre système d'exploitation et PHP en 64-bits. Pour plus de détails consultez {linkstart}the documentation page about this ↗{linkend}.",
"Module php-imagick in this instance has no SVG support. For better compatibility it is recommended to install it." : "Le module php-imagick n’a aucun support SVG dans cette instance. Pour une meilleure compatibilité, il est recommandé de l’installer.",
"Some columns in the database are missing a conversion to big int. Due to the fact that changing column types on big tables could take some time they were not changed automatically. By running \"occ db:convert-filecache-bigint\" those pending changes could be applied manually. This operation needs to be made while the instance is offline. For further details read {linkstart}the documentation page about this ↗{linkend}." : "Certaines colonnes de la base de données n'ont pas été converties en 'big int'. Changer le type de colonne dans de grandes tables peut prendre beaucoup de temps, elles n'ont donc pas été converties automatiquement. En exécutant la commande 'occ db:convert-filecache-bigint', ces changements en suspens peuvent être déclenchés manuellement. Cette opération doit être exécutée pendant que l'instance est hors ligne. Pour plus d'information, consulter {linkstart}la page de documentation à ce propos ↗{linkend}.",
@@ -114,7 +114,7 @@
"Your data directory and files are probably accessible from the internet. The .htaccess file is not working. It is strongly recommended that you configure your web server so that the data directory is no longer accessible, or move the data directory outside the web server document root." : "Votre dossier de données et vos fichiers sont probablement accessibles depuis internet. Le fichier .htaccess ne fonctionne pas. Nous vous recommandons vivement de configurer votre serveur web de façon à ce que ce dossier de données ne soit plus accessible, ou de le déplacer hors de la racine du serveur web.",
"The \"{header}\" HTTP header is not set to \"{expected}\". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly." : "L'en-tête HTTP \"{header}\" n'est pas configurée pour être égale à \"{expected}\". Ceci constitue un risque potentiel relatif à la sécurité et à la vie privée étant donné qu'il est recommandé d'ajuster ce paramètre.",
"The \"{header}\" HTTP header is not set to \"{expected}\". Some features might not work correctly, as it is recommended to adjust this setting accordingly." : "L'en-tête HTTP \"{header}\" n'est pas configurée pour être égale à \"{expected}\". Certaines fonctionnalités peuvent ne pas fonctionner correctement étant donné qu'il est recommandé d'ajuster ce paramètre.",
- "The \"{header}\" HTTP header does not contain \"{expected}\". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly." : "L'entête HTTP \"{header}\" ne contient pas \"{expected}\". Cela constitue un potentiel risque de sécurité ou relatif à la protection de la vie privée, aussi il est recommandé d'ajuster ce paramètre en conséquence. ",
+ "The \"{header}\" HTTP header does not contain \"{expected}\". This is a potential security or privacy risk, as it is recommended to adjust this setting accordingly." : "L'entête HTTP \"{header}\" ne contient pas \"{expected}\". Cela constitue potentiellement un risque relatif à la de sécurité ou à la confidentialité, aussi, il est recommandé d'ajuster ce paramètre en conséquence. ",
"The \"{header}\" HTTP header is not set to \"{val1}\", \"{val2}\", \"{val3}\", \"{val4}\" or \"{val5}\". This can leak referer information. See the {linkstart}W3C Recommendation ↗{linkend}." : "L'en-tête HTTP \"{header}\" n'est pas défini sur \"{val1}\", \"{val2}\", \"{val3}\", \"{val4}\" ou \"{val5}\". Cela peut entraîner une fuite d'informations. Se reporter aux {linkstart}recommandations du W3C ↗{linkend}.",
"The \"Strict-Transport-Security\" HTTP header is not set to at least \"{seconds}\" seconds. For enhanced security, it is recommended to enable HSTS as described in the {linkstart}security tips ↗{linkend}." : "L'en-tête HTTP \"Strict-Transport-Security\" n'est pas configuré à au moins \"{seconds}\" secondes. Pour une sécurité renforcée, il est recommandé d'activer HSTS comme indiqué dans les {linkstart}éléments de sécurité ↗{linkend}.",
"Accessing site insecurely via HTTP. You are strongly advised to set up your server to require HTTPS instead, as described in the {linkstart}security tips ↗{linkend}." : "Accès non sécurisé au site via HTTP. Il est fortement conseillé de configurer votre serveur pour exiger HTTPS à la place, comme décrit dans les {linkstart}conseils de sécurité ↗{linkend}.",
@@ -144,7 +144,7 @@
"An internal error occurred." : "Une erreur interne est survenue.",
"Please try again or contact your administrator." : "Veuillez réessayer ou contactez votre administrateur.",
"Log in to {productName}" : "Se connecter dans {productName}",
- "Account name or email" : "Nom d'utilisateur ou adresse électronique",
+ "Account name or email" : "Nom d'utilisateur ou adresse e-mail",
"Password" : "Mot de passe",
"Wrong username or password." : "Utilisateur ou mot de passe incorrect.",
"User disabled" : "Utilisateur désactivé",
@@ -178,7 +178,7 @@
"Keep your colleagues and friends in one place without leaking their private info." : "Gardez les contacts de vos collègues et amis au même endroit sans divulguer leurs informations personnelles.",
"Simple email app nicely integrated with Files, Contacts and Calendar." : "Application de messagerie électronique simple et bien intégrée avec Fichiers, Contacts et Calendrier.",
"Chatting, video calls, screensharing, online meetings and web conferencing – in your browser and with mobile apps." : "Discussions, appels vidéo, partage d'écran, réunions en ligne et conférences web – depuis votre navigateur et les applications mobiles.",
- "Collaborative documents, spreadsheets and presentations, built on Collabora Online." : "Documents, feuilles de calculs ou présentations créées sur Collabora Online",
+ "Collaborative documents, spreadsheets and presentations, built on Collabora Online." : "Documents, feuilles de calculs ou présentations créées sur Collabora Online.",
"Forgot password?" : "Mot de passe oublié ?",
"Log in with a device" : "Se connecter avec un appareil",
"Back" : "Retour",
@@ -240,8 +240,8 @@
"(all selected)" : "(tous sélectionnés)",
"({count} selected)" : "({count} sélectionné(s))",
"Error loading file exists template" : "Erreur lors du chargement du modèle de fichier existant",
- "Show list view" : "Afficher la vue en liste",
- "Show grid view" : "Afficher la vue en grille",
+ "Show list view" : "Activer l'affichage liste",
+ "Show grid view" : "Activer l'affichage mosaïque",
"Pending" : "En attente",
"Copy to {folder}" : "Copier vers {folder}",
"Move to {folder}" : "Déplacer vers {folder}",
@@ -361,7 +361,7 @@
"Please type in your email address to request a temporary password" : "Veuillez saisir votre adresse e-mail pour recevoir un mot de passe temporaire",
"Email address" : "Adresse e-mail",
"Password sent!" : "Mot de passe envoyé !",
- "You are not authorized to request a password for this share" : "Vous n'êtes pas autorisé a demander un mot de passe pour ce partage",
+ "You are not authorized to request a password for this share" : "Vous n'êtes pas autorisé à demander un mot de passe pour ce partage",
"Go to %s" : "Aller à %s",
"Two-factor authentication" : "Second facteur d'authentification",
"Enhanced security is enabled for your account. Choose a second factor for authentication:" : "La sécurité renforcée est activée pour votre compte. Choisissez un second facteur pour l'authentification :",
diff --git a/core/l10n/gl.js b/core/l10n/gl.js
index 957bf533f1e..92577454d8b 100644
--- a/core/l10n/gl.js
+++ b/core/l10n/gl.js
@@ -123,13 +123,16 @@ OC.L10N.register(
"Please contact your administrator." : "Contacte co administrador.",
"An internal error occurred." : "Produciuse un erro interno",
"Please try again or contact your administrator." : "Ténteo de novo ou póñase en contacto co administrador.",
+ "Account name or email" : "Nome da conta ou correo electrónico",
"Password" : "Contrasinal",
"Wrong username or password." : "Nome de usuario ou contrasinal incorrecto",
"User disabled" : "Usuario desactivado",
"We have detected multiple invalid login attempts from your IP. Therefore your next login is throttled up to 30 seconds." : "Detectamos varias tentativas de acceso non válidas dende o seu IP. Por mor diso, o seu próximo acceso será demorado ata 30 segundos",
"Username or email" : "Nome de usuario ou correo",
"Your account is not setup for passwordless login." : "A súa conta non está configurada para o acceso sen contrasinal.",
+ "Browser not supported" : "Este navegador non é compatíbel",
"Passwordless authentication is not supported in your browser." : "O seu navegador non admite a autenticación sen contrasinal.",
+ "Your connection is not secure" : "A conexión non é segura",
"Passwordless authentication is only available over a secure connection." : "A autenticación sen contrasinal só está dispoñíbel nunha conexión segura.",
"Reset password" : "Restabelecer o contrasinal",
"If it is not there ask your local administrator." : "Se non existe, pregúntelle ao seu administrador local.",
@@ -153,6 +156,7 @@ OC.L10N.register(
"Log in with a device" : "Acceder cun dispositivo",
"Back" : "Atrás",
"Login form is disabled." : "O formulario de inicio de sesión está bloqueado.",
+ "Edit Profile" : "Editar o perfil",
"Reset search" : "Restabelecer a busca",
"Search for {name} only" : "Buscar só por {name}",
"No results for {query}" : "Non hai resultados para {query}",
@@ -295,8 +299,10 @@ OC.L10N.register(
"Skip to main content" : "Ir ao contido principal",
"Skip to navigation of app" : "Ir á navegación da aplicación",
"Get your own free account" : "Obteña a súa propia conta de balde",
+ "%s's homepage" : "Páxina principal de %s",
"Contacts" : "Contactos",
"Contacts menu" : "Menú de contactos",
+ "Open settings menu" : "Abrir o menú de axustes",
"Confirm your password" : "Confirme o seu contrasinal",
"Connect to your account" : "Conectar á sua conta",
"Please log in before granting %1$s access to your %2$s account." : "Inicie sesión antes de concederlle a %1$s acceso á súa conta %2$s.",
diff --git a/core/l10n/gl.json b/core/l10n/gl.json
index f8a4858162e..0cf5012a1f4 100644
--- a/core/l10n/gl.json
+++ b/core/l10n/gl.json
@@ -121,13 +121,16 @@
"Please contact your administrator." : "Contacte co administrador.",
"An internal error occurred." : "Produciuse un erro interno",
"Please try again or contact your administrator." : "Ténteo de novo ou póñase en contacto co administrador.",
+ "Account name or email" : "Nome da conta ou correo electrónico",
"Password" : "Contrasinal",
"Wrong username or password." : "Nome de usuario ou contrasinal incorrecto",
"User disabled" : "Usuario desactivado",
"We have detected multiple invalid login attempts from your IP. Therefore your next login is throttled up to 30 seconds." : "Detectamos varias tentativas de acceso non válidas dende o seu IP. Por mor diso, o seu próximo acceso será demorado ata 30 segundos",
"Username or email" : "Nome de usuario ou correo",
"Your account is not setup for passwordless login." : "A súa conta non está configurada para o acceso sen contrasinal.",
+ "Browser not supported" : "Este navegador non é compatíbel",
"Passwordless authentication is not supported in your browser." : "O seu navegador non admite a autenticación sen contrasinal.",
+ "Your connection is not secure" : "A conexión non é segura",
"Passwordless authentication is only available over a secure connection." : "A autenticación sen contrasinal só está dispoñíbel nunha conexión segura.",
"Reset password" : "Restabelecer o contrasinal",
"If it is not there ask your local administrator." : "Se non existe, pregúntelle ao seu administrador local.",
@@ -151,6 +154,7 @@
"Log in with a device" : "Acceder cun dispositivo",
"Back" : "Atrás",
"Login form is disabled." : "O formulario de inicio de sesión está bloqueado.",
+ "Edit Profile" : "Editar o perfil",
"Reset search" : "Restabelecer a busca",
"Search for {name} only" : "Buscar só por {name}",
"No results for {query}" : "Non hai resultados para {query}",
@@ -293,8 +297,10 @@
"Skip to main content" : "Ir ao contido principal",
"Skip to navigation of app" : "Ir á navegación da aplicación",
"Get your own free account" : "Obteña a súa propia conta de balde",
+ "%s's homepage" : "Páxina principal de %s",
"Contacts" : "Contactos",
"Contacts menu" : "Menú de contactos",
+ "Open settings menu" : "Abrir o menú de axustes",
"Confirm your password" : "Confirme o seu contrasinal",
"Connect to your account" : "Conectar á sua conta",
"Please log in before granting %1$s access to your %2$s account." : "Inicie sesión antes de concederlle a %1$s acceso á súa conta %2$s.",
diff --git a/core/l10n/mk.js b/core/l10n/mk.js
index 61b311704e8..e9fe4057f06 100644
--- a/core/l10n/mk.js
+++ b/core/l10n/mk.js
@@ -117,12 +117,15 @@ OC.L10N.register(
"Continue to {productName}" : "Продолжи кон {productName}",
"_The update was successful. Redirecting you to {productName} in %n second._::_The update was successful. Redirecting you to {productName} in %n seconds._" : ["Ажурирањето беше успешно. Пренасочување кон {productName} за 1 секунда.","Ажурирањето беше успешно. Пренасочување кон {productName} за %n секунди."],
"More apps" : "Повеќе апликации",
+ "_{count} notification_::_{count} notifications_" : ["Едно исзестување","{count} известувања"],
"Log in" : "Најава",
"Logging in …" : "Најава ...",
"Server side authentication failed!" : "Автентификацијата на серверската страна е неуспешна!",
"Please contact your administrator." : "Ве молиме контактирајте го вашиот администратор.",
"An internal error occurred." : "Се случи внатрешна грешка.",
"Please try again or contact your administrator." : "Ве молиме обидете се повторно или контактирајте го вашиот администратор.",
+ "Log in to {productName}" : "Најави се на {productName}",
+ "Account name or email" : "Корисничко име или е-пошта",
"Password" : "Лозинка",
"Wrong username or password." : "Погрешно корисничко име или лозинка.",
"User disabled" : "Корисникот е оневозможен",
diff --git a/core/l10n/mk.json b/core/l10n/mk.json
index dc4f399b014..7e9b325da7a 100644
--- a/core/l10n/mk.json
+++ b/core/l10n/mk.json
@@ -115,12 +115,15 @@
"Continue to {productName}" : "Продолжи кон {productName}",
"_The update was successful. Redirecting you to {productName} in %n second._::_The update was successful. Redirecting you to {productName} in %n seconds._" : ["Ажурирањето беше успешно. Пренасочување кон {productName} за 1 секунда.","Ажурирањето беше успешно. Пренасочување кон {productName} за %n секунди."],
"More apps" : "Повеќе апликации",
+ "_{count} notification_::_{count} notifications_" : ["Едно исзестување","{count} известувања"],
"Log in" : "Најава",
"Logging in …" : "Најава ...",
"Server side authentication failed!" : "Автентификацијата на серверската страна е неуспешна!",
"Please contact your administrator." : "Ве молиме контактирајте го вашиот администратор.",
"An internal error occurred." : "Се случи внатрешна грешка.",
"Please try again or contact your administrator." : "Ве молиме обидете се повторно или контактирајте го вашиот администратор.",
+ "Log in to {productName}" : "Најави се на {productName}",
+ "Account name or email" : "Корисничко име или е-пошта",
"Password" : "Лозинка",
"Wrong username or password." : "Погрешно корисничко име или лозинка.",
"User disabled" : "Корисникот е оневозможен",
diff --git a/dist/files_sharing-files_sharing.js b/dist/files_sharing-files_sharing.js
index b99cfd6dcdc..1000c59d175 100644
--- a/dist/files_sharing-files_sharing.js
+++ b/dist/files_sharing-files_sharing.js
@@ -1,2 +1,2 @@
-!function(){var e={24839:function(){OCA.Sharing||(OCA.Sharing={}),OCA.Sharing.App={_inFileList:null,_outFileList:null,_overviewFileList:null,_pendingFileList:null,initSharingIn:function(e){return this._inFileList||(this._inFileList=new OCA.Sharing.FileList(e,{id:"shares.self",sharedWithUser:!0,fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._inFileList),this._inFileList.appName=t("files_sharing","Shared with you"),this._inFileList.$el.find(".emptyfilelist.emptycontent").html('<div class="icon-shared"></div><h2>'+t("files_sharing","Nothing shared with you yet")+"</h2><p>"+t("files_sharing","Files and folders others share with you will show up here")+"</p>")),this._inFileList},initSharingOut:function(e){return this._outFileList||(this._outFileList=new OCA.Sharing.FileList(e,{id:"shares.others",sharedWithUser:!1,fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._outFileList),this._outFileList.appName=t("files_sharing","Shared with others"),this._outFileList.$el.find(".emptyfilelist.emptycontent").html('<div class="icon-shared"></div><h2>'+t("files_sharing","Nothing shared yet")+"</h2><p>"+t("files_sharing","Files and folders you share will show up here")+"</p>")),this._outFileList},initSharingLinks:function(e){return this._linkFileList||(this._linkFileList=new OCA.Sharing.FileList(e,{id:"shares.link",linksOnly:!0,fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._linkFileList),this._linkFileList.appName=t("files_sharing","Shared by link"),this._linkFileList.$el.find(".emptyfilelist.emptycontent").html('<div class="icon-public"></div><h2>'+t("files_sharing","No shared links")+"</h2><p>"+t("files_sharing","Files and folders you share by link will show up here")+"</p>")),this._linkFileList},initSharingDeleted:function(e){return this._deletedFileList||(this._deletedFileList=new OCA.Sharing.FileList(e,{id:"shares.deleted",defaultFileActionsDisabled:!0,showDeleted:!0,sharedWithUser:!0,fileActions:this._restoreShareAction(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._deletedFileList),this._deletedFileList.appName=t("files_sharing","Deleted shares"),this._deletedFileList.$el.find(".emptyfilelist.emptycontent").html('<div class="icon-share"></div><h2>'+t("files_sharing","No deleted shares")+"</h2><p>"+t("files_sharing","Shares you deleted will show up here")+"</p>")),this._deletedFileList},initSharingPening:function(e){return this._pendingFileList||(this._pendingFileList=new OCA.Sharing.FileList(e,{id:"shares.pending",showPending:!0,detailsViewEnabled:!1,defaultFileActionsDisabled:!0,sharedWithUser:!0,fileActions:this._acceptShareAction(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._pendingFileList),this._pendingFileList.appName=t("files_sharing","Pending shares"),this._pendingFileList.$el.find(".emptyfilelist.emptycontent").html('<div class="icon-share"></div><h2>'+t("files_sharing","No pending shares")+"</h2><p>"+t("files_sharing","Shares you have received but not confirmed will show up here")+"</p>")),this._pendingFileList},initShareingOverview:function(e){return this._overviewFileList||(this._overviewFileList=new OCA.Sharing.FileList(e,{id:"shares.overview",fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),isOverview:!0,shown:!0}),this._extendFileList(this._overviewFileList),this._overviewFileList.appName=t("files_sharing","Shares"),this._overviewFileList.$el.find(".emptyfilelist.emptycontent").html('<div class="icon-share"></div><h2>'+t("files_sharing","No shares")+"</h2><p>"+t("files_sharing","Shares will show up here")+"</p>")),this._overviewFileList},removeSharingIn:function(){this._inFileList&&this._inFileList.$fileList.empty()},removeSharingOut:function(){this._outFileList&&this._outFileList.$fileList.empty()},removeSharingLinks:function(){this._linkFileList&&this._linkFileList.$fileList.empty()},removeSharingDeleted:function(){this._deletedFileList&&this._deletedFileList.$fileList.empty()},removeSharingPending:function(){this._pendingFileList&&this._pendingFileList.$fileList.empty()},removeSharingOverview:function(){this._overviewFileList&&this._overviewFileList.$fileList.empty()},destroy:function(){OCA.Files.fileActions.off("setDefault.app-sharing",this._onActionsUpdated),OCA.Files.fileActions.off("registerAction.app-sharing",this._onActionsUpdated),this.removeSharingIn(),this.removeSharingOut(),this.removeSharingLinks(),this._inFileList=null,this._outFileList=null,this._linkFileList=null,this._overviewFileList=null,delete this._globalActionsInitialized},_createFileActions:function(){var e=new OCA.Files.FileActions;return e.registerDefaultActions(),e.merge(OCA.Files.fileActions),this._globalActionsInitialized||(this._onActionsUpdated=_.bind(this._onActionsUpdated,this),OCA.Files.fileActions.on("setDefault.app-sharing",this._onActionsUpdated),OCA.Files.fileActions.on("registerAction.app-sharing",this._onActionsUpdated),this._globalActionsInitialized=!0),e.register("dir","Open",OC.PERMISSION_READ,"",(function(e,i){OCA.Files.App.setActiveView("files",{silent:!0}),OCA.Files.App.fileList.changeDirectory(OC.joinPaths(i.$file.attr("data-path"),e),!0,!0)})),e.setDefault("dir","Open"),e},_restoreShareAction:function(){var e=new OCA.Files.FileActions;return e.registerAction({name:"Restore",displayName:t("files_sharing","Restore"),altText:t("files_sharing","Restore share"),mime:"all",permissions:OC.PERMISSION_ALL,iconClass:"icon-history",type:OCA.Files.FileActions.TYPE_INLINE,actionHandler:function(e,i){var s=i.$file.data("shareId");$.post(OC.linkToOCS("apps/files_sharing/api/v1/deletedshares",2)+s).success((function(e){i.fileList.remove(i.fileInfoModel.attributes.name)})).fail((function(){OC.Notification.showTemporary(t("files_sharing","Something happened. Unable to restore the share."))}))}}),e},_acceptShareAction:function(){var e=new OCA.Files.FileActions;return e.registerAction({name:"Accept share",displayName:t("files_sharing","Accept share"),mime:"all",permissions:OC.PERMISSION_ALL,iconClass:"icon-checkmark",type:OCA.Files.FileActions.TYPE_INLINE,actionHandler:function(e,i){var s=i.$file.data("shareId"),n="shares/pending";i.$file.attr("data-remote-id")&&(n="remote_shares/pending"),$.post(OC.linkToOCS("apps/files_sharing/api/v1/"+n,2)+s).success((function(e){i.fileList.remove(i.fileInfoModel.attributes.name)})).fail((function(){OC.Notification.showTemporary(t("files_sharing","Something happened. Unable to accept the share."))}))}}),e.registerAction({name:"Reject share",displayName:t("files_sharing","Reject share"),mime:"all",permissions:OC.PERMISSION_ALL,iconClass:"icon-close",type:OCA.Files.FileActions.TYPE_INLINE,shouldRender:function(e){return!e.$file.attr("data-remote-id")||parseInt(e.$file.attr("data-share-type"),10)!==OC.Share.SHARE_TYPE_REMOTE_GROUP},actionHandler:function(e,i){var s=i.$file.data("shareId"),n="shares";i.$file.attr("data-remote-id")&&(n="remote_shares"),$.ajax({url:OC.linkToOCS("apps/files_sharing/api/v1/"+n,2)+s,type:"DELETE"}).success((function(e){i.fileList.remove(i.fileInfoModel.attributes.name)})).fail((function(){OC.Notification.showTemporary(t("files_sharing","Something happened. Unable to reject the share."))}))}}),e},_onActionsUpdated:function(e){_.each([this._inFileList,this._outFileList,this._linkFileList],(function(i){i&&(e.action?i.fileActions.registerAction(e.action):e.defaultAction&&i.fileActions.setDefault(e.defaultAction.mime,e.defaultAction.name))}))},_extendFileList:function(e){e.fileSummary.$el.find(".filesize").remove()}},window.addEventListener("DOMContentLoaded",(function(){$("#app-content-sharingin").on("show",(function(e){OCA.Sharing.App.initSharingIn($(e.target))})),$("#app-content-sharingin").on("hide",(function(){OCA.Sharing.App.removeSharingIn()})),$("#app-content-sharingout").on("show",(function(e){OCA.Sharing.App.initSharingOut($(e.target))})),$("#app-content-sharingout").on("hide",(function(){OCA.Sharing.App.removeSharingOut()})),$("#app-content-sharinglinks").on("show",(function(e){OCA.Sharing.App.initSharingLinks($(e.target))})),$("#app-content-sharinglinks").on("hide",(function(){OCA.Sharing.App.removeSharingLinks()})),$("#app-content-deletedshares").on("show",(function(e){OCA.Sharing.App.initSharingDeleted($(e.target))})),$("#app-content-deletedshares").on("hide",(function(){OCA.Sharing.App.removeSharingDeleted()})),$("#app-content-pendingshares").on("show",(function(e){OCA.Sharing.App.initSharingPening($(e.target))})),$("#app-content-pendingshares").on("hide",(function(){OCA.Sharing.App.removeSharingPending()})),$("#app-content-shareoverview").on("show",(function(e){OCA.Sharing.App.initShareingOverview($(e.target))})),$("#app-content-shareoverview").on("hide",(function(){OCA.Sharing.App.removeSharingOverview()}))}))},46658:function(){var e;(e=function(e,i){this.initialize(e,i)}).prototype=_.extend({},OCA.Files.FileList.prototype,{appName:"Shares",_sharedWithUser:!1,_linksOnly:!1,_showDeleted:!1,_showPending:!1,_clientSideSort:!0,_allowSelection:!1,_isOverview:!1,initialize:function(e,i){OCA.Files.FileList.prototype.initialize.apply(this,arguments),this.initialized||(i&&i.sharedWithUser&&(this._sharedWithUser=!0),i&&i.linksOnly&&(this._linksOnly=!0),i&&i.showDeleted&&(this._showDeleted=!0),i&&i.showPending&&(this._showPending=!0),i&&i.isOverview&&(this._isOverview=!0))},_renderRow:function(){return OCA.Files.FileList.prototype._renderRow.apply(this,arguments)},_createRow:function(e){var i=OCA.Files.FileList.prototype._createRow.apply(this,arguments);if(i.find(".filesize").remove(),i.find("td.date").before(i.children("td:first")),i.find("td.filename input:checkbox").remove(),i.attr("data-share-id",_.pluck(e.shares,"id").join(",")),this._sharedWithUser){i.attr("data-share-owner",e.shareOwner),i.attr("data-mounttype","shared-root");var s=parseInt(i.attr("data-permissions"))|OC.PERMISSION_DELETE;i.attr("data-permissions",s)}if((this._showDeleted||this._showPending)&&(s=e.permissions,i.attr("data-share-permissions",s)),e.remoteId&&i.attr("data-remote-id",e.remoteId),e.shareType&&i.attr("data-share-type",e.shareType),this._linksOnly){var n=0;e.shares&&null!==e.shares[0].expiration&&(n=moment(e.shares[0].expiration).valueOf()),i.attr("data-expiration",n);var a,r,h=Math.round((n-(new Date).getTime())/1e3/60/60/24*5);h>=160&&(h=160),n>0?(a=OC.Util.formatDate(n),r=OC.Util.relativeModifiedDate(n)):(a=t("files_sharing","No expiration date set"),r="",h=160),td=$("<td></td>").attr({class:"date"}),td.append($("<span></span>").attr({class:"modified",title:a,style:"color:rgb("+h+","+h+","+h+")"}).text(r).tooltip({placement:"top"})),i.append(td)}return i},setSharedWithUser:function(e){this._sharedWithUser=!!e},updateEmptyContent:function(){var e=this.getCurrentDirectory();"/"===e?(this.$el.find(".emptyfilelist.emptycontent").toggleClass("hidden",!this.isEmpty),this.$el.find(".files-filestable thead th").toggleClass("hidden",this.isEmpty),this._linksOnly||this.$el.find("th.column-expiration").addClass("hidden")):OCA.Files.FileList.prototype.updateEmptyContent.apply(this,arguments)},getDirectoryPermissions:function(){return OC.PERMISSION_READ|OC.PERMISSION_DELETE},updateStorageStatistics:function(){},updateRow:function(e,i,t){return e},reload:function(){this.showMask(),this._reloadCall&&this._reloadCall.abort(),this._setCurrentDir("/",!1);var e=[],i={url:OC.linkToOCS("apps/files_sharing/api/v1",2)+"deletedshares",data:{format:"json",include_tags:!0},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}},t={url:OC.linkToOCS("apps/files_sharing/api/v1/shares",2)+"pending",data:{format:"json"},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}},s={url:OC.linkToOCS("apps/files_sharing/api/v1/remote_shares",2)+"pending",data:{format:"json"},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}},n={url:OC.linkToOCS("apps/files_sharing/api/v1")+"shares",data:{format:"json",shared_with_me:!1!==this._sharedWithUser,include_tags:!0},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}},a={url:OC.linkToOCS("apps/files_sharing/api/v1")+"remote_shares",data:{format:"json",include_tags:!0},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}};this._showDeleted?e.push($.ajax(i)):this._showPending?(e.push($.ajax(t)),e.push($.ajax(s))):(e.push($.ajax(n)),(!1!==this._sharedWithUser||this._isOverview)&&e.push($.ajax(a)),this._isOverview&&(n.data.shared_with_me=!n.data.shared_with_me,e.push($.ajax(n)))),this._reloadCall=$.when.apply($,e);var r=this.reloadCallback.bind(this);return this._reloadCall.then(r,r)},reloadCallback:function(e,i,s){delete this._reloadCall,this.hideMask(),this.$el.find("#headerSharedWith").text(t("files_sharing",this._sharedWithUser?"Shared by":"Shared with"));var n=[];return e[0]&&e[0].ocs&&(e=e[0]),i&&i[0]&&i[0].ocs&&(i=i[0]),s&&s[0]&&s[0].ocs&&(s=s[0]),e.ocs&&e.ocs.data&&(n=n.concat(this._makeFilesFromShares(e.ocs.data,this._sharedWithUser))),i&&i.ocs&&i.ocs.data&&(n=n.concat(this._makeFilesFromRemoteShares(i.ocs.data))),s&&s.ocs&&s.ocs.data&&(n=this._showPending?n.concat(this._makeFilesFromRemoteShares(s.ocs.data)):n.concat(this._makeFilesFromShares(s.ocs.data,!this._sharedWithUser))),this.setFiles(n),!0},_makeFilesFromRemoteShares:function(e){var i=e;return _.chain(i).map((function(e){var i={shareOwner:e.owner+"@"+e.remote.replace(/.*?:\/\//g,""),name:OC.basename(e.mountpoint),mtime:1e3*e.mtime,mimetype:e.mimetype,type:e.type,shareType:1===parseInt(e.share_type,10)?OC.Share.SHARE_TYPE_REMOTE_GROUP:OC.Share.SHARE_TYPE_REMOTE,id:e.file_id,path:OC.dirname(e.mountpoint),permissions:e.permissions,tags:e.tags||[]};return e.remote_id&&("1"!==e.accepted&&(i.name=OC.basename(e.name),i.path="/"),i.remoteId=e.remote_id,i.shareOwnerId=e.owner),i.mimetype||(i.mimetype="dir-shared"),i.shares=[{id:e.id,type:OC.Share.SHARE_TYPE_REMOTE}],i})).value()},_makeFilesFromShares:function(e,i){var t=e;return this._linksOnly&&(t=_.filter(e,(function(e){return e.share_type===OC.Share.SHARE_TYPE_LINK}))),t=_.chain(t).map((function(e){var t={id:e.file_source,icon:OC.MimeType.getIconUrl(e.mimetype),mimetype:e.mimetype,hasPreview:e.has_preview,tags:e.tags||[]};return"folder"===e.item_type?(t.type="dir",t.mimetype="httpd/unix-directory"):t.type="file",t.share={id:e.id,type:e.share_type,target:e.share_with,stime:1e3*e.stime,expiration:e.expiration},i?(t.shareOwner=e.displayname_owner,t.shareOwnerId=e.uid_owner,t.name=OC.basename(e.file_target),t.path=OC.dirname(e.file_target),t.permissions=e.permissions,t.path&&(t.extraData=e.file_target)):(e.share_type!==OC.Share.SHARE_TYPE_LINK&&(t.share.targetDisplayName=e.share_with_displayname,t.share.targetShareWithId=e.share_with),t.name=OC.basename(e.path),t.path=OC.dirname(e.path),t.permissions=OC.PERMISSION_ALL,t.path&&(t.extraData=e.path)),t})).reduce((function(e,i){var t=e[i.id],s=i.share.targetDisplayName,n=i.share.targetShareWithId;return t?(i.share.stime>t.mtime&&(t.mtime=i.share.stime),t.shares.push(i.share)):((t=e[i.id]=i).shares=[i.share],t.recipients={},t.recipientData={},t.shareTypes={},t.recipientsCount=0,t.mtime=i.share.stime),s&&(t.recipientsCount<4&&(t.recipients[s]=!0,t.recipientData[t.recipientsCount]={shareWith:n,shareWithDisplayName:s}),t.recipientsCount++),t.shareTypes[i.share.type]=!0,delete i.share,e}),{}).values().each((function(e){e.mountType="shared",delete e.recipientsCount,i?delete e.shareTypes:e.shareTypes=_.keys(e.shareTypes)})).value(),t.sort(this._sortComparator)}}),OCA.Sharing.FileList=e}},i={};function s(t){var n=i[t];if(void 0!==n)return n.exports;var a=i[t]={exports:{}};return e[t](a,a.exports,s),a.exports}s.n=function(e){var i=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(i,{a:i}),i},s.d=function(e,i){for(var t in i)s.o(i,t)&&!s.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:i[t]})},s.o=function(e,i){return Object.prototype.hasOwnProperty.call(e,i)},function(){"use strict";s(24839),s(46658)}()}();
-//# sourceMappingURL=files_sharing-files_sharing.js.map?v=22bff80a3da4b2dd754e \ No newline at end of file
+!function(){var e={24839:function(){OCA.Sharing||(OCA.Sharing={}),OCA.Sharing.App={_inFileList:null,_outFileList:null,_overviewFileList:null,_pendingFileList:null,initSharingIn:function(e){return this._inFileList||(this._inFileList=new OCA.Sharing.FileList(e,{id:"shares.self",sharedWithUser:!0,fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._inFileList),this._inFileList.appName=t("files_sharing","Shared with you"),this._inFileList.$el.find(".emptyfilelist.emptycontent").html('<div class="icon-shared"></div><h2>'+t("files_sharing","Nothing shared with you yet")+"</h2><p>"+t("files_sharing","Files and folders others share with you will show up here")+"</p>")),this._inFileList},initSharingOut:function(e){return this._outFileList||(this._outFileList=new OCA.Sharing.FileList(e,{id:"shares.others",sharedWithUser:!1,fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._outFileList),this._outFileList.appName=t("files_sharing","Shared with others"),this._outFileList.$el.find(".emptyfilelist.emptycontent").html('<div class="icon-shared"></div><h2>'+t("files_sharing","Nothing shared yet")+"</h2><p>"+t("files_sharing","Files and folders you share will show up here")+"</p>")),this._outFileList},initSharingLinks:function(e){return this._linkFileList||(this._linkFileList=new OCA.Sharing.FileList(e,{id:"shares.link",linksOnly:!0,fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._linkFileList),this._linkFileList.appName=t("files_sharing","Shared by link"),this._linkFileList.$el.find(".emptyfilelist.emptycontent").html('<div class="icon-public"></div><h2>'+t("files_sharing","No shared links")+"</h2><p>"+t("files_sharing","Files and folders you share by link will show up here")+"</p>")),this._linkFileList},initSharingDeleted:function(e){return this._deletedFileList||(this._deletedFileList=new OCA.Sharing.FileList(e,{id:"shares.deleted",defaultFileActionsDisabled:!0,showDeleted:!0,sharedWithUser:!0,fileActions:this._restoreShareAction(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._deletedFileList),this._deletedFileList.appName=t("files_sharing","Deleted shares"),this._deletedFileList.$el.find(".emptyfilelist.emptycontent").html('<div class="icon-share"></div><h2>'+t("files_sharing","No deleted shares")+"</h2><p>"+t("files_sharing","Shares you deleted will show up here")+"</p>")),this._deletedFileList},initSharingPening:function(e){return this._pendingFileList||(this._pendingFileList=new OCA.Sharing.FileList(e,{id:"shares.pending",showPending:!0,detailsViewEnabled:!1,defaultFileActionsDisabled:!0,sharedWithUser:!0,fileActions:this._acceptShareAction(),config:OCA.Files.App.getFilesConfig(),shown:!0}),this._extendFileList(this._pendingFileList),this._pendingFileList.appName=t("files_sharing","Pending shares"),this._pendingFileList.$el.find(".emptyfilelist.emptycontent").html('<div class="icon-share"></div><h2>'+t("files_sharing","No pending shares")+"</h2><p>"+t("files_sharing","Shares you have received but not confirmed will show up here")+"</p>")),this._pendingFileList},initShareingOverview:function(e){return this._overviewFileList||(this._overviewFileList=new OCA.Sharing.FileList(e,{id:"shares.overview",fileActions:this._createFileActions(),config:OCA.Files.App.getFilesConfig(),isOverview:!0,shown:!0}),this._extendFileList(this._overviewFileList),this._overviewFileList.appName=t("files_sharing","Shares"),this._overviewFileList.$el.find(".emptyfilelist.emptycontent").html('<div class="icon-share"></div><h2>'+t("files_sharing","No shares")+"</h2><p>"+t("files_sharing","Shares will show up here")+"</p>")),this._overviewFileList},removeSharingIn:function(){this._inFileList&&this._inFileList.$fileList.empty()},removeSharingOut:function(){this._outFileList&&this._outFileList.$fileList.empty()},removeSharingLinks:function(){this._linkFileList&&this._linkFileList.$fileList.empty()},removeSharingDeleted:function(){this._deletedFileList&&this._deletedFileList.$fileList.empty()},removeSharingPending:function(){this._pendingFileList&&this._pendingFileList.$fileList.empty()},removeSharingOverview:function(){this._overviewFileList&&this._overviewFileList.$fileList.empty()},destroy:function(){OCA.Files.fileActions.off("setDefault.app-sharing",this._onActionsUpdated),OCA.Files.fileActions.off("registerAction.app-sharing",this._onActionsUpdated),this.removeSharingIn(),this.removeSharingOut(),this.removeSharingLinks(),this._inFileList=null,this._outFileList=null,this._linkFileList=null,this._overviewFileList=null,delete this._globalActionsInitialized},_createFileActions:function(){var e=new OCA.Files.FileActions;return e.registerDefaultActions(),e.merge(OCA.Files.fileActions),this._globalActionsInitialized||(this._onActionsUpdated=_.bind(this._onActionsUpdated,this),OCA.Files.fileActions.on("setDefault.app-sharing",this._onActionsUpdated),OCA.Files.fileActions.on("registerAction.app-sharing",this._onActionsUpdated),this._globalActionsInitialized=!0),e.register("dir","Open",OC.PERMISSION_READ,"",(function(e,i){OCA.Files.App.setActiveView("files",{silent:!0}),OCA.Files.App.fileList.changeDirectory(OC.joinPaths(i.$file.attr("data-path"),e),!0,!0)})),e.setDefault("dir","Open"),e},_restoreShareAction:function(){var e=new OCA.Files.FileActions;return e.registerAction({name:"Restore",displayName:t("files_sharing","Restore"),altText:t("files_sharing","Restore share"),mime:"all",permissions:OC.PERMISSION_ALL,iconClass:"icon-history",type:OCA.Files.FileActions.TYPE_INLINE,actionHandler:function(e,i){var s=i.$file.data("shareId");$.post(OC.linkToOCS("apps/files_sharing/api/v1/deletedshares",2)+s).success((function(e){i.fileList.remove(i.fileInfoModel.attributes.name)})).fail((function(){OC.Notification.showTemporary(t("files_sharing","Something happened. Unable to restore the share."))}))}}),e},_acceptShareAction:function(){var e=new OCA.Files.FileActions;return e.registerAction({name:"Accept share",displayName:t("files_sharing","Accept share"),mime:"all",permissions:OC.PERMISSION_ALL,iconClass:"icon-checkmark",type:OCA.Files.FileActions.TYPE_INLINE,actionHandler:function(e,i){var s=i.$file.data("shareId"),n="shares/pending";i.$file.attr("data-remote-id")&&(n="remote_shares/pending"),$.post(OC.linkToOCS("apps/files_sharing/api/v1/"+n,2)+s).success((function(e){i.fileList.remove(i.fileInfoModel.attributes.name)})).fail((function(){OC.Notification.showTemporary(t("files_sharing","Something happened. Unable to accept the share."))}))}}),e.registerAction({name:"Reject share",displayName:t("files_sharing","Reject share"),mime:"all",permissions:OC.PERMISSION_ALL,iconClass:"icon-close",type:OCA.Files.FileActions.TYPE_INLINE,shouldRender:function(e){return!e.$file.attr("data-remote-id")||parseInt(e.$file.attr("data-share-type"),10)!==OC.Share.SHARE_TYPE_REMOTE_GROUP},actionHandler:function(e,i){var s=i.$file.data("shareId"),n="shares";i.$file.attr("data-remote-id")&&(n="remote_shares"),$.ajax({url:OC.linkToOCS("apps/files_sharing/api/v1/"+n,2)+s,type:"DELETE"}).success((function(e){i.fileList.remove(i.fileInfoModel.attributes.name)})).fail((function(){OC.Notification.showTemporary(t("files_sharing","Something happened. Unable to reject the share."))}))}}),e},_onActionsUpdated:function(e){_.each([this._inFileList,this._outFileList,this._linkFileList],(function(i){i&&(e.action?i.fileActions.registerAction(e.action):e.defaultAction&&i.fileActions.setDefault(e.defaultAction.mime,e.defaultAction.name))}))},_extendFileList:function(e){e.fileSummary.$el.find(".filesize").remove()}},window.addEventListener("DOMContentLoaded",(function(){$("#app-content-sharingin").on("show",(function(e){OCA.Sharing.App.initSharingIn($(e.target))})),$("#app-content-sharingin").on("hide",(function(){OCA.Sharing.App.removeSharingIn()})),$("#app-content-sharingout").on("show",(function(e){OCA.Sharing.App.initSharingOut($(e.target))})),$("#app-content-sharingout").on("hide",(function(){OCA.Sharing.App.removeSharingOut()})),$("#app-content-sharinglinks").on("show",(function(e){OCA.Sharing.App.initSharingLinks($(e.target))})),$("#app-content-sharinglinks").on("hide",(function(){OCA.Sharing.App.removeSharingLinks()})),$("#app-content-deletedshares").on("show",(function(e){OCA.Sharing.App.initSharingDeleted($(e.target))})),$("#app-content-deletedshares").on("hide",(function(){OCA.Sharing.App.removeSharingDeleted()})),$("#app-content-pendingshares").on("show",(function(e){OCA.Sharing.App.initSharingPening($(e.target))})),$("#app-content-pendingshares").on("hide",(function(){OCA.Sharing.App.removeSharingPending()})),$("#app-content-shareoverview").on("show",(function(e){OCA.Sharing.App.initShareingOverview($(e.target))})),$("#app-content-shareoverview").on("hide",(function(){OCA.Sharing.App.removeSharingOverview()}))}))},46658:function(){var e;(e=function(e,i){this.initialize(e,i)}).prototype=_.extend({},OCA.Files.FileList.prototype,{appName:"Shares",_sharedWithUser:!1,_linksOnly:!1,_showDeleted:!1,_showPending:!1,_clientSideSort:!0,_allowSelection:!1,_isOverview:!1,initialize:function(e,i){OCA.Files.FileList.prototype.initialize.apply(this,arguments),this.initialized||(i&&i.sharedWithUser&&(this._sharedWithUser=!0),i&&i.linksOnly&&(this._linksOnly=!0),i&&i.showDeleted&&(this._showDeleted=!0),i&&i.showPending&&(this._showPending=!0),i&&i.isOverview&&(this._isOverview=!0))},_renderRow:function(){return OCA.Files.FileList.prototype._renderRow.apply(this,arguments)},_createRow:function(e){var i=OCA.Files.FileList.prototype._createRow.apply(this,arguments);if(i.find(".filesize").remove(),i.find("td.date").before(i.children("td:first")),i.find("td.filename input:checkbox").remove(),i.attr("data-share-id",_.pluck(e.shares,"id").join(",")),this._sharedWithUser){i.attr("data-share-owner",e.shareOwner),i.attr("data-mounttype","shared-root");var s=parseInt(i.attr("data-permissions"))|OC.PERMISSION_DELETE;i.attr("data-permissions",s)}if((this._showDeleted||this._showPending)&&(s=e.permissions,i.attr("data-share-permissions",s)),e.remoteId&&i.attr("data-remote-id",e.remoteId),e.shareType&&i.attr("data-share-type",e.shareType),this._linksOnly){var n=0;e.shares&&null!==e.shares[0].expiration&&(n=moment(e.shares[0].expiration).valueOf()),i.attr("data-expiration",n);var a,r,h=Math.round((n-(new Date).getTime())/1e3/60/60/24*5);h>=160&&(h=160),n>0?(a=OC.Util.formatDate(n),r=OC.Util.relativeModifiedDate(n)):(a=t("files_sharing","No expiration date set"),r="",h=160),td=$("<td></td>").attr({class:"date"}),td.append($("<span></span>").attr({class:"modified",title:a,style:"color:rgb("+h+","+h+","+h+")"}).text(r).tooltip({placement:"top"})),i.append(td)}return i},setSharedWithUser:function(e){this._sharedWithUser=!!e},updateEmptyContent:function(){var e=this.getCurrentDirectory();"/"===e?(this.$el.find(".emptyfilelist.emptycontent").toggleClass("hidden",!this.isEmpty),this.$el.find(".files-filestable thead th").toggleClass("hidden",this.isEmpty),this._linksOnly||this.$el.find("th.column-expiration").addClass("hidden")):OCA.Files.FileList.prototype.updateEmptyContent.apply(this,arguments)},getDirectoryPermissions:function(){return OC.PERMISSION_READ|OC.PERMISSION_DELETE},updateStorageStatistics:function(){},reload:function(){this.showMask(),this._reloadCall&&this._reloadCall.abort(),this._setCurrentDir("/",!1);var e=[],i={url:OC.linkToOCS("apps/files_sharing/api/v1",2)+"deletedshares",data:{format:"json",include_tags:!0},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}},t={url:OC.linkToOCS("apps/files_sharing/api/v1/shares",2)+"pending",data:{format:"json"},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}},s={url:OC.linkToOCS("apps/files_sharing/api/v1/remote_shares",2)+"pending",data:{format:"json"},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}},n={url:OC.linkToOCS("apps/files_sharing/api/v1")+"shares",data:{format:"json",shared_with_me:!1!==this._sharedWithUser,include_tags:!0},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}},a={url:OC.linkToOCS("apps/files_sharing/api/v1")+"remote_shares",data:{format:"json",include_tags:!0},type:"GET",beforeSend:function(e){e.setRequestHeader("OCS-APIREQUEST","true")}};this._showDeleted?e.push($.ajax(i)):this._showPending?(e.push($.ajax(t)),e.push($.ajax(s))):(e.push($.ajax(n)),(!1!==this._sharedWithUser||this._isOverview)&&e.push($.ajax(a)),this._isOverview&&(n.data.shared_with_me=!n.data.shared_with_me,e.push($.ajax(n)))),this._reloadCall=$.when.apply($,e);var r=this.reloadCallback.bind(this);return this._reloadCall.then(r,r)},reloadCallback:function(e,i,s){delete this._reloadCall,this.hideMask(),this.$el.find("#headerSharedWith").text(t("files_sharing",this._sharedWithUser?"Shared by":"Shared with"));var n=[];return e[0]&&e[0].ocs&&(e=e[0]),i&&i[0]&&i[0].ocs&&(i=i[0]),s&&s[0]&&s[0].ocs&&(s=s[0]),e.ocs&&e.ocs.data&&(n=n.concat(this._makeFilesFromShares(e.ocs.data,this._sharedWithUser))),i&&i.ocs&&i.ocs.data&&(n=n.concat(this._makeFilesFromRemoteShares(i.ocs.data))),s&&s.ocs&&s.ocs.data&&(n=this._showPending?n.concat(this._makeFilesFromRemoteShares(s.ocs.data)):n.concat(this._makeFilesFromShares(s.ocs.data,!this._sharedWithUser))),this.setFiles(n),!0},_makeFilesFromRemoteShares:function(e){var i=e;return _.chain(i).map((function(e){var i={shareOwner:e.owner+"@"+e.remote.replace(/.*?:\/\//g,""),name:OC.basename(e.mountpoint),mtime:1e3*e.mtime,mimetype:e.mimetype,type:e.type,shareType:1===parseInt(e.share_type,10)?OC.Share.SHARE_TYPE_REMOTE_GROUP:OC.Share.SHARE_TYPE_REMOTE,id:e.file_id,path:OC.dirname(e.mountpoint),permissions:e.permissions,tags:e.tags||[]};return e.remote_id&&("1"!==e.accepted&&(i.name=OC.basename(e.name),i.path="/"),i.remoteId=e.remote_id,i.shareOwnerId=e.owner),i.mimetype||(i.mimetype="dir-shared"),i.shares=[{id:e.id,type:OC.Share.SHARE_TYPE_REMOTE}],i})).value()},_makeFilesFromShares:function(e,i){var t=e;return this._linksOnly&&(t=_.filter(e,(function(e){return e.share_type===OC.Share.SHARE_TYPE_LINK}))),t=_.chain(t).map((function(e){var t={id:e.file_source,icon:OC.MimeType.getIconUrl(e.mimetype),mimetype:e.mimetype,hasPreview:e.has_preview,tags:e.tags||[]};return"folder"===e.item_type?(t.type="dir",t.mimetype="httpd/unix-directory"):t.type="file",t.share={id:e.id,type:e.share_type,target:e.share_with,stime:1e3*e.stime,expiration:e.expiration},i?(t.shareOwner=e.displayname_owner,t.shareOwnerId=e.uid_owner,t.name=OC.basename(e.file_target),t.path=OC.dirname(e.file_target),t.permissions=e.permissions,t.path&&(t.extraData=e.file_target)):(e.share_type!==OC.Share.SHARE_TYPE_LINK&&(t.share.targetDisplayName=e.share_with_displayname,t.share.targetShareWithId=e.share_with),t.name=OC.basename(e.path),t.path=OC.dirname(e.path),t.permissions=OC.PERMISSION_ALL,t.path&&(t.extraData=e.path)),t})).reduce((function(e,i){var t=e[i.id],s=i.share.targetDisplayName,n=i.share.targetShareWithId;return t?(i.share.stime>t.mtime&&(t.mtime=i.share.stime),t.shares.push(i.share)):((t=e[i.id]=i).shares=[i.share],t.recipients={},t.recipientData={},t.shareTypes={},t.recipientsCount=0,t.mtime=i.share.stime),s&&(t.recipientsCount<4&&(t.recipients[s]=!0,t.recipientData[t.recipientsCount]={shareWith:n,shareWithDisplayName:s}),t.recipientsCount++),t.shareTypes[i.share.type]=!0,delete i.share,e}),{}).values().each((function(e){e.mountType="shared",delete e.recipientsCount,i?delete e.shareTypes:e.shareTypes=_.keys(e.shareTypes)})).value(),t.sort(this._sortComparator)}}),OCA.Sharing.FileList=e}},i={};function s(t){var n=i[t];if(void 0!==n)return n.exports;var a=i[t]={exports:{}};return e[t](a,a.exports,s),a.exports}s.n=function(e){var i=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(i,{a:i}),i},s.d=function(e,i){for(var t in i)s.o(i,t)&&!s.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:i[t]})},s.o=function(e,i){return Object.prototype.hasOwnProperty.call(e,i)},function(){"use strict";s(24839),s(46658)}()}();
+//# sourceMappingURL=files_sharing-files_sharing.js.map?v=f38cf86715b8bdc3429c \ No newline at end of file
diff --git a/dist/files_sharing-files_sharing.js.map b/dist/files_sharing-files_sharing.js.map
index 4559bc9b152..9cb226da174 100644
--- a/dist/files_sharing-files_sharing.js.map
+++ b/dist/files_sharing-files_sharing.js.map
@@ -1 +1 @@
-{"version":3,"file":"files_sharing-files_sharing.js?v=22bff80a3da4b2dd754e","mappings":"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","sources":["webpack:///nextcloud/apps/files_sharing/js/app.js","webpack:///nextcloud/apps/files_sharing/js/sharedfilelist.js","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand"],"sourcesContent":["/**\n * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n\nif (!OCA.Sharing) {\n\t/**\n\t * @namespace OCA.Sharing\n\t */\n\tOCA.Sharing = {}\n}\n\n/**\n * @namespace\n */\nOCA.Sharing.App = {\n\n\t_inFileList: null,\n\t_outFileList: null,\n\t_overviewFileList: null,\n\t_pendingFileList: null,\n\n\tinitSharingIn($el) {\n\t\tif (this._inFileList) {\n\t\t\treturn this._inFileList\n\t\t}\n\n\t\tthis._inFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.self',\n\t\t\t\tsharedWithUser: true,\n\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._inFileList)\n\t\tthis._inFileList.appName = t('files_sharing', 'Shared with you')\n\t\tthis._inFileList.$el.find('.emptyfilelist.emptycontent').html('<div class=\"icon-shared\"></div>'\n\t\t\t+ '<h2>' + t('files_sharing', 'Nothing shared with you yet') + '</h2>'\n\t\t\t+ '<p>' + t('files_sharing', 'Files and folders others share with you will show up here') + '</p>')\n\t\treturn this._inFileList\n\t},\n\n\tinitSharingOut($el) {\n\t\tif (this._outFileList) {\n\t\t\treturn this._outFileList\n\t\t}\n\t\tthis._outFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.others',\n\t\t\t\tsharedWithUser: false,\n\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._outFileList)\n\t\tthis._outFileList.appName = t('files_sharing', 'Shared with others')\n\t\tthis._outFileList.$el.find('.emptyfilelist.emptycontent').html('<div class=\"icon-shared\"></div>'\n\t\t\t+ '<h2>' + t('files_sharing', 'Nothing shared yet') + '</h2>'\n\t\t\t+ '<p>' + t('files_sharing', 'Files and folders you share will show up here') + '</p>')\n\t\treturn this._outFileList\n\t},\n\n\tinitSharingLinks($el) {\n\t\tif (this._linkFileList) {\n\t\t\treturn this._linkFileList\n\t\t}\n\t\tthis._linkFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.link',\n\t\t\t\tlinksOnly: true,\n\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._linkFileList)\n\t\tthis._linkFileList.appName = t('files_sharing', 'Shared by link')\n\t\tthis._linkFileList.$el.find('.emptyfilelist.emptycontent').html('<div class=\"icon-public\"></div>'\n\t\t\t+ '<h2>' + t('files_sharing', 'No shared links') + '</h2>'\n\t\t\t+ '<p>' + t('files_sharing', 'Files and folders you share by link will show up here') + '</p>')\n\t\treturn this._linkFileList\n\t},\n\n\tinitSharingDeleted($el) {\n\t\tif (this._deletedFileList) {\n\t\t\treturn this._deletedFileList\n\t\t}\n\t\tthis._deletedFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.deleted',\n\t\t\t\tdefaultFileActionsDisabled: true,\n\t\t\t\tshowDeleted: true,\n\t\t\t\tsharedWithUser: true,\n\t\t\t\tfileActions: this._restoreShareAction(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._deletedFileList)\n\t\tthis._deletedFileList.appName = t('files_sharing', 'Deleted shares')\n\t\tthis._deletedFileList.$el.find('.emptyfilelist.emptycontent').html('<div class=\"icon-share\"></div>'\n\t\t\t+ '<h2>' + t('files_sharing', 'No deleted shares') + '</h2>'\n\t\t\t+ '<p>' + t('files_sharing', 'Shares you deleted will show up here') + '</p>')\n\t\treturn this._deletedFileList\n\t},\n\n\tinitSharingPening($el) {\n\t\tif (this._pendingFileList) {\n\t\t\treturn this._pendingFileList\n\t\t}\n\t\tthis._pendingFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.pending',\n\t\t\t\tshowPending: true,\n\t\t\t\tdetailsViewEnabled: false,\n\t\t\t\tdefaultFileActionsDisabled: true,\n\t\t\t\tsharedWithUser: true,\n\t\t\t\tfileActions: this._acceptShareAction(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._pendingFileList)\n\t\tthis._pendingFileList.appName = t('files_sharing', 'Pending shares')\n\t\tthis._pendingFileList.$el.find('.emptyfilelist.emptycontent').html('<div class=\"icon-share\"></div>'\n\t\t\t+ '<h2>' + t('files_sharing', 'No pending shares') + '</h2>'\n\t\t\t+ '<p>' + t('files_sharing', 'Shares you have received but not confirmed will show up here') + '</p>')\n\t\treturn this._pendingFileList\n\t},\n\n\tinitShareingOverview($el) {\n\t\tif (this._overviewFileList) {\n\t\t\treturn this._overviewFileList\n\t\t}\n\t\tthis._overviewFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.overview',\n\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\tisOverview: true,\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._overviewFileList)\n\t\tthis._overviewFileList.appName = t('files_sharing', 'Shares')\n\t\tthis._overviewFileList.$el.find('.emptyfilelist.emptycontent').html('<div class=\"icon-share\"></div>'\n\t\t\t+ '<h2>' + t('files_sharing', 'No shares') + '</h2>'\n\t\t\t+ '<p>' + t('files_sharing', 'Shares will show up here') + '</p>')\n\t\treturn this._overviewFileList\n\t},\n\n\tremoveSharingIn() {\n\t\tif (this._inFileList) {\n\t\t\tthis._inFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingOut() {\n\t\tif (this._outFileList) {\n\t\t\tthis._outFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingLinks() {\n\t\tif (this._linkFileList) {\n\t\t\tthis._linkFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingDeleted() {\n\t\tif (this._deletedFileList) {\n\t\t\tthis._deletedFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingPending() {\n\t\tif (this._pendingFileList) {\n\t\t\tthis._pendingFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingOverview() {\n\t\tif (this._overviewFileList) {\n\t\t\tthis._overviewFileList.$fileList.empty()\n\t\t}\n\t},\n\n\t/**\n\t * Destroy the app\n\t */\n\tdestroy() {\n\t\tOCA.Files.fileActions.off('setDefault.app-sharing', this._onActionsUpdated)\n\t\tOCA.Files.fileActions.off('registerAction.app-sharing', this._onActionsUpdated)\n\t\tthis.removeSharingIn()\n\t\tthis.removeSharingOut()\n\t\tthis.removeSharingLinks()\n\t\tthis._inFileList = null\n\t\tthis._outFileList = null\n\t\tthis._linkFileList = null\n\t\tthis._overviewFileList = null\n\t\tdelete this._globalActionsInitialized\n\t},\n\n\t_createFileActions() {\n\t\t// inherit file actions from the files app\n\t\tconst fileActions = new OCA.Files.FileActions()\n\t\t// note: not merging the legacy actions because legacy apps are not\n\t\t// compatible with the sharing overview and need to be adapted first\n\t\tfileActions.registerDefaultActions()\n\t\tfileActions.merge(OCA.Files.fileActions)\n\n\t\tif (!this._globalActionsInitialized) {\n\t\t\t// in case actions are registered later\n\t\t\tthis._onActionsUpdated = _.bind(this._onActionsUpdated, this)\n\t\t\tOCA.Files.fileActions.on('setDefault.app-sharing', this._onActionsUpdated)\n\t\t\tOCA.Files.fileActions.on('registerAction.app-sharing', this._onActionsUpdated)\n\t\t\tthis._globalActionsInitialized = true\n\t\t}\n\n\t\t// when the user clicks on a folder, redirect to the corresponding\n\t\t// folder in the files app instead of opening it directly\n\t\tfileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function(filename, context) {\n\t\t\tOCA.Files.App.setActiveView('files', { silent: true })\n\t\t\tOCA.Files.App.fileList.changeDirectory(OC.joinPaths(context.$file.attr('data-path'), filename), true, true)\n\t\t})\n\t\tfileActions.setDefault('dir', 'Open')\n\t\treturn fileActions\n\t},\n\n\t_restoreShareAction() {\n\t\tconst fileActions = new OCA.Files.FileActions()\n\t\tfileActions.registerAction({\n\t\t\tname: 'Restore',\n\t\t\tdisplayName: t('files_sharing', 'Restore'),\n\t\t\taltText: t('files_sharing', 'Restore share'),\n\t\t\tmime: 'all',\n\t\t\tpermissions: OC.PERMISSION_ALL,\n\t\t\ticonClass: 'icon-history',\n\t\t\ttype: OCA.Files.FileActions.TYPE_INLINE,\n\t\t\tactionHandler(fileName, context) {\n\t\t\t\tconst shareId = context.$file.data('shareId')\n\t\t\t\t$.post(OC.linkToOCS('apps/files_sharing/api/v1/deletedshares', 2) + shareId)\n\t\t\t\t\t.success(function(result) {\n\t\t\t\t\t\tcontext.fileList.remove(context.fileInfoModel.attributes.name)\n\t\t\t\t\t}).fail(function() {\n\t\t\t\t\t\tOC.Notification.showTemporary(t('files_sharing', 'Something happened. Unable to restore the share.'))\n\t\t\t\t\t})\n\t\t\t},\n\t\t})\n\t\treturn fileActions\n\t},\n\n\t_acceptShareAction() {\n\t\tconst fileActions = new OCA.Files.FileActions()\n\t\tfileActions.registerAction({\n\t\t\tname: 'Accept share',\n\t\t\tdisplayName: t('files_sharing', 'Accept share'),\n\t\t\tmime: 'all',\n\t\t\tpermissions: OC.PERMISSION_ALL,\n\t\t\ticonClass: 'icon-checkmark',\n\t\t\ttype: OCA.Files.FileActions.TYPE_INLINE,\n\t\t\tactionHandler(fileName, context) {\n\t\t\t\tconst shareId = context.$file.data('shareId')\n\t\t\t\tlet shareBase = 'shares/pending'\n\t\t\t\tif (context.$file.attr('data-remote-id')) {\n\t\t\t\t\tshareBase = 'remote_shares/pending'\n\t\t\t\t}\n\t\t\t\t$.post(OC.linkToOCS('apps/files_sharing/api/v1/' + shareBase, 2) + shareId)\n\t\t\t\t\t.success(function(result) {\n\t\t\t\t\t\tcontext.fileList.remove(context.fileInfoModel.attributes.name)\n\t\t\t\t\t}).fail(function() {\n\t\t\t\t\t\tOC.Notification.showTemporary(t('files_sharing', 'Something happened. Unable to accept the share.'))\n\t\t\t\t\t})\n\t\t\t},\n\t\t})\n\t\tfileActions.registerAction({\n\t\t\tname: 'Reject share',\n\t\t\tdisplayName: t('files_sharing', 'Reject share'),\n\t\t\tmime: 'all',\n\t\t\tpermissions: OC.PERMISSION_ALL,\n\t\t\ticonClass: 'icon-close',\n\t\t\ttype: OCA.Files.FileActions.TYPE_INLINE,\n\t\t\tshouldRender(context) {\n\t\t\t\t// disable rejecting group shares from the pending list because they anyway\n\t\t\t\t// land back into that same list\n\t\t\t\tif (context.$file.attr('data-remote-id') && parseInt(context.$file.attr('data-share-type'), 10) === OC.Share.SHARE_TYPE_REMOTE_GROUP) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t},\n\t\t\tactionHandler(fileName, context) {\n\t\t\t\tconst shareId = context.$file.data('shareId')\n\t\t\t\tlet shareBase = 'shares'\n\t\t\t\tif (context.$file.attr('data-remote-id')) {\n\t\t\t\t\tshareBase = 'remote_shares'\n\t\t\t\t}\n\n\t\t\t\t$.ajax({\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1/' + shareBase, 2) + shareId,\n\t\t\t\t\ttype: 'DELETE',\n\t\t\t\t}).success(function(result) {\n\t\t\t\t\tcontext.fileList.remove(context.fileInfoModel.attributes.name)\n\t\t\t\t}).fail(function() {\n\t\t\t\t\tOC.Notification.showTemporary(t('files_sharing', 'Something happened. Unable to reject the share.'))\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\t\treturn fileActions\n\t},\n\n\t_onActionsUpdated(ev) {\n\t\t_.each([this._inFileList, this._outFileList, this._linkFileList], function(list) {\n\t\t\tif (!list) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (ev.action) {\n\t\t\t\tlist.fileActions.registerAction(ev.action)\n\t\t\t} else if (ev.defaultAction) {\n\t\t\t\tlist.fileActions.setDefault(\n\t\t\t\t\tev.defaultAction.mime,\n\t\t\t\t\tev.defaultAction.name\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t},\n\n\t_extendFileList(fileList) {\n\t\t// remove size column from summary\n\t\tfileList.fileSummary.$el.find('.filesize').remove()\n\t},\n}\n\nwindow.addEventListener('DOMContentLoaded', function() {\n\t$('#app-content-sharingin').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingIn($(e.target))\n\t})\n\t$('#app-content-sharingin').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingIn()\n\t})\n\t$('#app-content-sharingout').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingOut($(e.target))\n\t})\n\t$('#app-content-sharingout').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingOut()\n\t})\n\t$('#app-content-sharinglinks').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingLinks($(e.target))\n\t})\n\t$('#app-content-sharinglinks').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingLinks()\n\t})\n\t$('#app-content-deletedshares').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingDeleted($(e.target))\n\t})\n\t$('#app-content-deletedshares').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingDeleted()\n\t})\n\t$('#app-content-pendingshares').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingPening($(e.target))\n\t})\n\t$('#app-content-pendingshares').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingPending()\n\t})\n\t$('#app-content-shareoverview').on('show', function(e) {\n\t\tOCA.Sharing.App.initShareingOverview($(e.target))\n\t})\n\t$('#app-content-shareoverview').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingOverview()\n\t})\n})\n","/* eslint-disable */\n/*\n * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n(function() {\n\n\t/**\n\t * @class OCA.Sharing.FileList\n\t * @augments OCA.Files.FileList\n\t *\n\t * @classdesc Sharing file list.\n\t * Contains both \"shared with others\" and \"shared with you\" modes.\n\t *\n\t * @param $el container element with existing markup for the .files-controls\n\t * and a table\n\t * @param [options] map of options, see other parameters\n\t * @param {boolean} [options.sharedWithUser] true to return files shared with\n\t * the current user, false to return files that the user shared with others.\n\t * Defaults to false.\n\t * @param {boolean} [options.linksOnly] true to return only link shares\n\t */\n\tvar FileList = function($el, options) {\n\t\tthis.initialize($el, options)\n\t}\n\tFileList.prototype = _.extend({}, OCA.Files.FileList.prototype,\n\t\t/** @lends OCA.Sharing.FileList.prototype */ {\n\t\t\tappName: 'Shares',\n\n\t\t\t/**\n\t\t * Whether the list shows the files shared with the user (true) or\n\t\t * the files that the user shared with others (false).\n\t\t */\n\t\t\t_sharedWithUser: false,\n\t\t\t_linksOnly: false,\n\t\t\t_showDeleted: false,\n\t\t\t_showPending: false,\n\t\t\t_clientSideSort: true,\n\t\t\t_allowSelection: false,\n\t\t\t_isOverview: false,\n\n\t\t\t/**\n\t\t * @private\n\t\t */\n\t\t\tinitialize: function($el, options) {\n\t\t\t\tOCA.Files.FileList.prototype.initialize.apply(this, arguments)\n\t\t\t\tif (this.initialized) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// TODO: consolidate both options\n\t\t\t\tif (options && options.sharedWithUser) {\n\t\t\t\t\tthis._sharedWithUser = true\n\t\t\t\t}\n\t\t\t\tif (options && options.linksOnly) {\n\t\t\t\t\tthis._linksOnly = true\n\t\t\t\t}\n\t\t\t\tif (options && options.showDeleted) {\n\t\t\t\t\tthis._showDeleted = true\n\t\t\t\t}\n\t\t\t\tif (options && options.showPending) {\n\t\t\t\t\tthis._showPending = true\n\t\t\t\t}\n\t\t\t\tif (options && options.isOverview) {\n\t\t\t\t\tthis._isOverview = true\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t_renderRow: function() {\n\t\t\t// HACK: needed to call the overridden _renderRow\n\t\t\t// this is because at the time this class is created\n\t\t\t// the overriding hasn't been done yet...\n\t\t\t\treturn OCA.Files.FileList.prototype._renderRow.apply(this, arguments)\n\t\t\t},\n\n\t\t\t_createRow: function(fileData) {\n\t\t\t// TODO: hook earlier and render the whole row here\n\t\t\t\tvar $tr = OCA.Files.FileList.prototype._createRow.apply(this, arguments)\n\t\t\t\t$tr.find('.filesize').remove()\n\t\t\t\t$tr.find('td.date').before($tr.children('td:first'))\n\t\t\t\t$tr.find('td.filename input:checkbox').remove()\n\t\t\t\t$tr.attr('data-share-id', _.pluck(fileData.shares, 'id').join(','))\n\t\t\t\tif (this._sharedWithUser) {\n\t\t\t\t\t$tr.attr('data-share-owner', fileData.shareOwner)\n\t\t\t\t\t$tr.attr('data-mounttype', 'shared-root')\n\t\t\t\t\tvar permission = parseInt($tr.attr('data-permissions')) | OC.PERMISSION_DELETE\n\t\t\t\t\t$tr.attr('data-permissions', permission)\n\t\t\t\t}\n\t\t\t\tif (this._showDeleted || this._showPending) {\n\t\t\t\t\tvar permission = fileData.permissions\n\t\t\t\t\t$tr.attr('data-share-permissions', permission)\n\t\t\t\t}\n\n\t\t\t\tif (fileData.remoteId) {\n\t\t\t\t\t$tr.attr('data-remote-id', fileData.remoteId)\n\t\t\t\t}\n\n\t\t\t\tif (fileData.shareType) {\n\t\t\t\t\t$tr.attr('data-share-type', fileData.shareType)\n\t\t\t\t}\n\n\t\t\t\t// add row with expiration date for link only shares - influenced by _createRow of filelist\n\t\t\t\tif (this._linksOnly) {\n\t\t\t\t\tvar expirationTimestamp = 0\n\t\t\t\t\tif (fileData.shares && fileData.shares[0].expiration !== null) {\n\t\t\t\t\t\texpirationTimestamp = moment(fileData.shares[0].expiration).valueOf()\n\t\t\t\t\t}\n\t\t\t\t\t$tr.attr('data-expiration', expirationTimestamp)\n\n\t\t\t\t\t// date column (1000 milliseconds to seconds, 60 seconds, 60 minutes, 24 hours)\n\t\t\t\t\t// difference in days multiplied by 5 - brightest shade for expiry dates in more than 32 days (160/5)\n\t\t\t\t\tvar modifiedColor = Math.round((expirationTimestamp - (new Date()).getTime()) / 1000 / 60 / 60 / 24 * 5)\n\t\t\t\t\t// ensure that the brightest color is still readable\n\t\t\t\t\tif (modifiedColor >= 160) {\n\t\t\t\t\t\tmodifiedColor = 160\n\t\t\t\t\t}\n\n\t\t\t\t\tvar formatted\n\t\t\t\t\tvar text\n\t\t\t\t\tif (expirationTimestamp > 0) {\n\t\t\t\t\t\tformatted = OC.Util.formatDate(expirationTimestamp)\n\t\t\t\t\t\ttext = OC.Util.relativeModifiedDate(expirationTimestamp)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tformatted = t('files_sharing', 'No expiration date set')\n\t\t\t\t\t\ttext = ''\n\t\t\t\t\t\tmodifiedColor = 160\n\t\t\t\t\t}\n\t\t\t\t\ttd = $('<td></td>').attr({ 'class': 'date' })\n\t\t\t\t\ttd.append($('<span></span>').attr({\n\t\t\t\t\t\t'class': 'modified',\n\t\t\t\t\t\t'title': formatted,\n\t\t\t\t\t\t'style': 'color:rgb(' + modifiedColor + ',' + modifiedColor + ',' + modifiedColor + ')'\n\t\t\t\t\t}).text(text)\n\t\t\t\t\t\t.tooltip({ placement: 'top' })\n\t\t\t\t\t)\n\n\t\t\t\t\t$tr.append(td)\n\t\t\t\t}\n\t\t\t\treturn $tr\n\t\t\t},\n\n\t\t\t/**\n\t\t * Set whether the list should contain outgoing shares\n\t\t * or incoming shares.\n\t\t *\n\t\t * @param state true for incoming shares, false otherwise\n\t\t */\n\t\t\tsetSharedWithUser: function(state) {\n\t\t\t\tthis._sharedWithUser = !!state\n\t\t\t},\n\n\t\t\tupdateEmptyContent: function() {\n\t\t\t\tvar dir = this.getCurrentDirectory()\n\t\t\t\tif (dir === '/') {\n\t\t\t\t// root has special permissions\n\t\t\t\t\tthis.$el.find('.emptyfilelist.emptycontent').toggleClass('hidden', !this.isEmpty)\n\t\t\t\t\tthis.$el.find('.files-filestable thead th').toggleClass('hidden', this.isEmpty)\n\n\t\t\t\t\t// hide expiration date header for non link only shares\n\t\t\t\t\tif (!this._linksOnly) {\n\t\t\t\t\t\tthis.$el.find('th.column-expiration').addClass('hidden')\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tOCA.Files.FileList.prototype.updateEmptyContent.apply(this, arguments)\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tgetDirectoryPermissions: function() {\n\t\t\t\treturn OC.PERMISSION_READ | OC.PERMISSION_DELETE\n\t\t\t},\n\n\t\t\tupdateStorageStatistics: function() {\n\t\t\t// no op because it doesn't have\n\t\t\t// storage info like free space / used space\n\t\t\t},\n\n\t\t\tupdateRow: function($tr, fileInfo, options) {\n\t\t\t// no-op, suppress re-rendering\n\t\t\t\treturn $tr\n\t\t\t},\n\n\t\t\treload: function() {\n\t\t\t\tthis.showMask()\n\t\t\t\tif (this._reloadCall) {\n\t\t\t\t\tthis._reloadCall.abort()\n\t\t\t\t}\n\n\t\t\t\t// there is only root\n\t\t\t\tthis._setCurrentDir('/', false)\n\n\t\t\t\tvar promises = []\n\n\t\t\t\tvar deletedShares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1', 2) + 'deletedshares',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json',\n\t\t\t\t\t\tinclude_tags: true\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar pendingShares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1/shares', 2) + 'pending',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json'\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar pendingRemoteShares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1/remote_shares', 2) + 'pending',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json'\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar shares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1') + 'shares',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json',\n\t\t\t\t\t\tshared_with_me: this._sharedWithUser !== false,\n\t\t\t\t\t\tinclude_tags: true\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar remoteShares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1') + 'remote_shares',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json',\n\t\t\t\t\t\tinclude_tags: true\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Add the proper ajax requests to the list and run them\n\t\t\t\t// and make sure we have 2 promises\n\t\t\t\tif (this._showDeleted) {\n\t\t\t\t\tpromises.push($.ajax(deletedShares))\n\t\t\t\t} else if (this._showPending) {\n\t\t\t\t\tpromises.push($.ajax(pendingShares))\n\t\t\t\t\tpromises.push($.ajax(pendingRemoteShares))\n\t\t\t\t} else {\n\t\t\t\t\tpromises.push($.ajax(shares))\n\n\t\t\t\t\tif (this._sharedWithUser !== false || this._isOverview) {\n\t\t\t\t\t\tpromises.push($.ajax(remoteShares))\n\t\t\t\t\t}\n\t\t\t\t\tif (this._isOverview) {\n\t\t\t\t\t\tshares.data.shared_with_me = !shares.data.shared_with_me\n\t\t\t\t\t\tpromises.push($.ajax(shares))\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._reloadCall = $.when.apply($, promises)\n\t\t\t\tvar callBack = this.reloadCallback.bind(this)\n\t\t\t\treturn this._reloadCall.then(callBack, callBack)\n\t\t\t},\n\n\t\t\treloadCallback: function(shares, remoteShares, additionalShares) {\n\t\t\t\tdelete this._reloadCall\n\t\t\t\tthis.hideMask()\n\n\t\t\t\tthis.$el.find('#headerSharedWith').text(\n\t\t\t\t\tt('files_sharing', this._sharedWithUser ? 'Shared by' : 'Shared with')\n\t\t\t\t)\n\n\t\t\t\tvar files = []\n\n\t\t\t\t// make sure to use the same format\n\t\t\t\tif (shares[0] && shares[0].ocs) {\n\t\t\t\t\tshares = shares[0]\n\t\t\t\t}\n\t\t\t\tif (remoteShares && remoteShares[0] && remoteShares[0].ocs) {\n\t\t\t\t\tremoteShares = remoteShares[0]\n\t\t\t\t}\n\t\t\t\tif (additionalShares && additionalShares[0] && additionalShares[0].ocs) {\n\t\t\t\t\tadditionalShares = additionalShares[0]\n\t\t\t\t}\n\n\t\t\t\tif (shares.ocs && shares.ocs.data) {\n\t\t\t\t\tfiles = files.concat(this._makeFilesFromShares(shares.ocs.data, this._sharedWithUser))\n\t\t\t\t}\n\n\t\t\t\tif (remoteShares && remoteShares.ocs && remoteShares.ocs.data) {\n\t\t\t\t\tfiles = files.concat(this._makeFilesFromRemoteShares(remoteShares.ocs.data))\n\t\t\t\t}\n\n\t\t\t\tif (additionalShares && additionalShares.ocs && additionalShares.ocs.data) {\n\t\t\t\t\tif (this._showPending) {\n\t\t\t\t\t\t// in this case the second callback is about pending remote shares\n\t\t\t\t\t\tfiles = files.concat(this._makeFilesFromRemoteShares(additionalShares.ocs.data))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfiles = files.concat(this._makeFilesFromShares(additionalShares.ocs.data, !this._sharedWithUser))\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.setFiles(files)\n\t\t\t\treturn true\n\t\t\t},\n\n\t\t\t_makeFilesFromRemoteShares: function(data) {\n\t\t\t\tvar files = data\n\n\t\t\t\tfiles = _.chain(files)\n\t\t\t\t// convert share data to file data\n\t\t\t\t\t.map(function(share) {\n\t\t\t\t\t\tvar file = {\n\t\t\t\t\t\t\tshareOwner: share.owner + '@' + share.remote.replace(/.*?:\\/\\//g, ''),\n\t\t\t\t\t\t\tname: OC.basename(share.mountpoint),\n\t\t\t\t\t\t\tmtime: share.mtime * 1000,\n\t\t\t\t\t\t\tmimetype: share.mimetype,\n\t\t\t\t\t\t\ttype: share.type,\n\t\t\t\t\t\t\t// remote share types are different and need to be mapped\n\t\t\t\t\t\t\tshareType: (parseInt(share.share_type, 10) === 1) ? OC.Share.SHARE_TYPE_REMOTE_GROUP : OC.Share.SHARE_TYPE_REMOTE,\n\t\t\t\t\t\t\tid: share.file_id,\n\t\t\t\t\t\t\tpath: OC.dirname(share.mountpoint),\n\t\t\t\t\t\t\tpermissions: share.permissions,\n\t\t\t\t\t\t\ttags: share.tags || []\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (share.remote_id) {\n\t\t\t\t\t\t\t// remote share\n\t\t\t\t\t\t\tif (share.accepted !== '1') {\n\t\t\t\t\t\t\t\tfile.name = OC.basename(share.name)\n\t\t\t\t\t\t\t\tfile.path = '/'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfile.remoteId = share.remote_id\n\t\t\t\t\t\t\tfile.shareOwnerId = share.owner\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!file.mimetype) {\n\t\t\t\t\t\t\t// pending shares usually have no type, so default to showing a directory icon\n\t\t\t\t\t\t\tfile.mimetype = 'dir-shared'\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfile.shares = [{\n\t\t\t\t\t\t\tid: share.id,\n\t\t\t\t\t\t\ttype: OC.Share.SHARE_TYPE_REMOTE\n\t\t\t\t\t\t}]\n\t\t\t\t\t\treturn file\n\t\t\t\t\t})\n\t\t\t\t\t.value()\n\t\t\t\treturn files\n\t\t\t},\n\n\t\t\t/**\n\t\t * Converts the OCS API share response data to a file info\n\t\t * list\n\t\t * @param {Array} data OCS API share array\n\t\t * @param {boolean} sharedWithUser\n\t\t * @returns {Array.<OCA.Sharing.SharedFileInfo>} array of shared file info\n\t\t */\n\t\t\t_makeFilesFromShares: function(data, sharedWithUser) {\n\t\t\t/* jshint camelcase: false */\n\t\t\t\tvar files = data\n\n\t\t\t\tif (this._linksOnly) {\n\t\t\t\t\tfiles = _.filter(data, function(share) {\n\t\t\t\t\t\treturn share.share_type === OC.Share.SHARE_TYPE_LINK\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\t// OCS API uses non-camelcased names\n\t\t\t\tfiles = _.chain(files)\n\t\t\t\t// convert share data to file data\n\t\t\t\t\t.map(function(share) {\n\t\t\t\t\t// TODO: use OC.Files.FileInfo\n\t\t\t\t\t\tvar file = {\n\t\t\t\t\t\t\tid: share.file_source,\n\t\t\t\t\t\t\ticon: OC.MimeType.getIconUrl(share.mimetype),\n\t\t\t\t\t\t\tmimetype: share.mimetype,\n\t\t\t\t\t\t\thasPreview: share.has_preview,\n\t\t\t\t\t\t\ttags: share.tags || []\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (share.item_type === 'folder') {\n\t\t\t\t\t\t\tfile.type = 'dir'\n\t\t\t\t\t\t\tfile.mimetype = 'httpd/unix-directory'\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfile.type = 'file'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfile.share = {\n\t\t\t\t\t\t\tid: share.id,\n\t\t\t\t\t\t\ttype: share.share_type,\n\t\t\t\t\t\t\ttarget: share.share_with,\n\t\t\t\t\t\t\tstime: share.stime * 1000,\n\t\t\t\t\t\t\texpiration: share.expiration\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (sharedWithUser) {\n\t\t\t\t\t\t\tfile.shareOwner = share.displayname_owner\n\t\t\t\t\t\t\tfile.shareOwnerId = share.uid_owner\n\t\t\t\t\t\t\tfile.name = OC.basename(share.file_target)\n\t\t\t\t\t\t\tfile.path = OC.dirname(share.file_target)\n\t\t\t\t\t\t\tfile.permissions = share.permissions\n\t\t\t\t\t\t\tif (file.path) {\n\t\t\t\t\t\t\t\tfile.extraData = share.file_target\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (share.share_type !== OC.Share.SHARE_TYPE_LINK) {\n\t\t\t\t\t\t\t\tfile.share.targetDisplayName = share.share_with_displayname\n\t\t\t\t\t\t\t\tfile.share.targetShareWithId = share.share_with\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfile.name = OC.basename(share.path)\n\t\t\t\t\t\t\tfile.path = OC.dirname(share.path)\n\t\t\t\t\t\t\tfile.permissions = OC.PERMISSION_ALL\n\t\t\t\t\t\t\tif (file.path) {\n\t\t\t\t\t\t\t\tfile.extraData = share.path\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn file\n\t\t\t\t\t})\n\t\t\t\t// Group all files and have a \"shares\" array with\n\t\t\t\t// the share info for each file.\n\t\t\t\t//\n\t\t\t\t// This uses a hash memo to cumulate share information\n\t\t\t\t// inside the same file object (by file id).\n\t\t\t\t\t.reduce(function(memo, file) {\n\t\t\t\t\t\tvar data = memo[file.id]\n\t\t\t\t\t\tvar recipient = file.share.targetDisplayName\n\t\t\t\t\t\tvar recipientId = file.share.targetShareWithId\n\t\t\t\t\t\tif (!data) {\n\t\t\t\t\t\t\tdata = memo[file.id] = file\n\t\t\t\t\t\t\tdata.shares = [file.share]\n\t\t\t\t\t\t\t// using a hash to make them unique,\n\t\t\t\t\t\t\t// this is only a list to be displayed\n\t\t\t\t\t\t\tdata.recipients = {}\n\t\t\t\t\t\t\tdata.recipientData = {}\n\t\t\t\t\t\t\t// share types\n\t\t\t\t\t\t\tdata.shareTypes = {}\n\t\t\t\t\t\t\t// counter is cheaper than calling _.keys().length\n\t\t\t\t\t\t\tdata.recipientsCount = 0\n\t\t\t\t\t\t\tdata.mtime = file.share.stime\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t// always take the most recent stime\n\t\t\t\t\t\t\tif (file.share.stime > data.mtime) {\n\t\t\t\t\t\t\t\tdata.mtime = file.share.stime\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdata.shares.push(file.share)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (recipient) {\n\t\t\t\t\t\t// limit counterparts for output\n\t\t\t\t\t\t\tif (data.recipientsCount < 4) {\n\t\t\t\t\t\t\t// only store the first ones, they will be the only ones\n\t\t\t\t\t\t\t// displayed\n\t\t\t\t\t\t\t\tdata.recipients[recipient] = true\n\t\t\t\t\t\t\t\tdata.recipientData[data.recipientsCount] = {\n\t\t\t\t\t\t\t\t\t'shareWith': recipientId,\n\t\t\t\t\t\t\t\t\t'shareWithDisplayName': recipient\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdata.recipientsCount++\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata.shareTypes[file.share.type] = true\n\n\t\t\t\t\t\tdelete file.share\n\t\t\t\t\t\treturn memo\n\t\t\t\t\t}, {})\n\t\t\t\t// Retrieve only the values of the returned hash\n\t\t\t\t\t.values()\n\t\t\t\t// Clean up\n\t\t\t\t\t.each(function(data) {\n\t\t\t\t\t// convert the recipients map to a flat\n\t\t\t\t\t// array of sorted names\n\t\t\t\t\t\tdata.mountType = 'shared'\n\t\t\t\t\t\tdelete data.recipientsCount\n\t\t\t\t\t\tif (sharedWithUser) {\n\t\t\t\t\t\t// only for outgoing shares\n\t\t\t\t\t\t\tdelete data.shareTypes\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdata.shareTypes = _.keys(data.shareTypes)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t// Finish the chain by getting the result\n\t\t\t\t\t.value()\n\n\t\t\t\t// Sort by expected sort comparator\n\t\t\t\treturn files.sort(this._sortComparator)\n\t\t\t}\n\t\t})\n\n\t/**\n\t * Share info attributes.\n\t *\n\t * @typedef {Object} OCA.Sharing.ShareInfo\n\t *\n\t * @property {number} id share ID\n\t * @property {number} type share type\n\t * @property {String} target share target, either user name or group name\n\t * @property {number} stime share timestamp in milliseconds\n\t * @property {String} [targetDisplayName] display name of the recipient\n\t * (only when shared with others)\n\t * @property {String} [targetShareWithId] id of the recipient\n\t *\n\t */\n\n\t/**\n\t * Recipient attributes\n\t *\n\t * @typedef {Object} OCA.Sharing.RecipientInfo\n\t * @property {String} shareWith the id of the recipient\n\t * @property {String} shareWithDisplayName the display name of the recipient\n\t */\n\n\t/**\n\t * Shared file info attributes.\n\t *\n\t * @typedef {OCA.Files.FileInfo} OCA.Sharing.SharedFileInfo\n\t *\n\t * @property {Array.<OCA.Sharing.ShareInfo>} shares array of shares for\n\t * this file\n\t * @property {number} mtime most recent share time (if multiple shares)\n\t * @property {String} shareOwner name of the share owner\n\t * @property {Array.<String>} recipients name of the first 4 recipients\n\t * (this is mostly for display purposes)\n\t * @property {Object.<OCA.Sharing.RecipientInfo>} recipientData (as object for easier\n\t * passing to HTML data attributes with jQuery)\n\t */\n\n\tOCA.Sharing.FileList = FileList\n})()\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }"],"names":["OCA","Sharing","App","_inFileList","_outFileList","_overviewFileList","_pendingFileList","initSharingIn","$el","this","FileList","id","sharedWithUser","fileActions","_createFileActions","config","Files","getFilesConfig","shown","_extendFileList","appName","t","find","html","initSharingOut","initSharingLinks","_linkFileList","linksOnly","initSharingDeleted","_deletedFileList","defaultFileActionsDisabled","showDeleted","_restoreShareAction","initSharingPening","showPending","detailsViewEnabled","_acceptShareAction","initShareingOverview","isOverview","removeSharingIn","$fileList","empty","removeSharingOut","removeSharingLinks","removeSharingDeleted","removeSharingPending","removeSharingOverview","destroy","off","_onActionsUpdated","_globalActionsInitialized","FileActions","registerDefaultActions","merge","_","bind","on","register","OC","PERMISSION_READ","filename","context","setActiveView","silent","fileList","changeDirectory","joinPaths","$file","attr","setDefault","registerAction","name","displayName","altText","mime","permissions","PERMISSION_ALL","iconClass","type","TYPE_INLINE","actionHandler","fileName","shareId","data","$","post","linkToOCS","success","result","remove","fileInfoModel","attributes","fail","Notification","showTemporary","shareBase","shouldRender","parseInt","Share","SHARE_TYPE_REMOTE_GROUP","ajax","url","ev","each","list","action","defaultAction","fileSummary","window","addEventListener","e","target","options","initialize","prototype","extend","_sharedWithUser","_linksOnly","_showDeleted","_showPending","_clientSideSort","_allowSelection","_isOverview","apply","arguments","initialized","_renderRow","_createRow","fileData","$tr","before","children","pluck","shares","join","shareOwner","permission","PERMISSION_DELETE","remoteId","shareType","expirationTimestamp","expiration","moment","valueOf","formatted","text","modifiedColor","Math","round","Date","getTime","Util","formatDate","relativeModifiedDate","td","append","tooltip","placement","setSharedWithUser","state","updateEmptyContent","dir","getCurrentDirectory","toggleClass","isEmpty","addClass","getDirectoryPermissions","updateStorageStatistics","updateRow","fileInfo","reload","showMask","_reloadCall","abort","_setCurrentDir","promises","deletedShares","format","include_tags","beforeSend","xhr","setRequestHeader","pendingShares","pendingRemoteShares","shared_with_me","remoteShares","push","when","callBack","reloadCallback","then","additionalShares","hideMask","files","ocs","concat","_makeFilesFromShares","_makeFilesFromRemoteShares","setFiles","chain","map","share","file","owner","remote","replace","basename","mountpoint","mtime","mimetype","share_type","SHARE_TYPE_REMOTE","file_id","path","dirname","tags","remote_id","accepted","shareOwnerId","value","filter","SHARE_TYPE_LINK","file_source","icon","MimeType","getIconUrl","hasPreview","has_preview","item_type","share_with","stime","displayname_owner","uid_owner","file_target","extraData","targetDisplayName","share_with_displayname","targetShareWithId","reduce","memo","recipient","recipientId","recipients","recipientData","shareTypes","recipientsCount","values","mountType","keys","sort","_sortComparator","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","hasOwnProperty","call"],"sourceRoot":""} \ No newline at end of file
+{"version":3,"file":"files_sharing-files_sharing.js?v=f38cf86715b8bdc3429c","mappings":"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","sources":["webpack:///nextcloud/apps/files_sharing/js/app.js","webpack:///nextcloud/apps/files_sharing/js/sharedfilelist.js","webpack:///nextcloud/webpack/bootstrap","webpack:///nextcloud/webpack/runtime/compat get default export","webpack:///nextcloud/webpack/runtime/define property getters","webpack:///nextcloud/webpack/runtime/hasOwnProperty shorthand"],"sourcesContent":["/**\n * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n\nif (!OCA.Sharing) {\n\t/**\n\t * @namespace OCA.Sharing\n\t */\n\tOCA.Sharing = {}\n}\n\n/**\n * @namespace\n */\nOCA.Sharing.App = {\n\n\t_inFileList: null,\n\t_outFileList: null,\n\t_overviewFileList: null,\n\t_pendingFileList: null,\n\n\tinitSharingIn($el) {\n\t\tif (this._inFileList) {\n\t\t\treturn this._inFileList\n\t\t}\n\n\t\tthis._inFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.self',\n\t\t\t\tsharedWithUser: true,\n\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._inFileList)\n\t\tthis._inFileList.appName = t('files_sharing', 'Shared with you')\n\t\tthis._inFileList.$el.find('.emptyfilelist.emptycontent').html('<div class=\"icon-shared\"></div>'\n\t\t\t+ '<h2>' + t('files_sharing', 'Nothing shared with you yet') + '</h2>'\n\t\t\t+ '<p>' + t('files_sharing', 'Files and folders others share with you will show up here') + '</p>')\n\t\treturn this._inFileList\n\t},\n\n\tinitSharingOut($el) {\n\t\tif (this._outFileList) {\n\t\t\treturn this._outFileList\n\t\t}\n\t\tthis._outFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.others',\n\t\t\t\tsharedWithUser: false,\n\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._outFileList)\n\t\tthis._outFileList.appName = t('files_sharing', 'Shared with others')\n\t\tthis._outFileList.$el.find('.emptyfilelist.emptycontent').html('<div class=\"icon-shared\"></div>'\n\t\t\t+ '<h2>' + t('files_sharing', 'Nothing shared yet') + '</h2>'\n\t\t\t+ '<p>' + t('files_sharing', 'Files and folders you share will show up here') + '</p>')\n\t\treturn this._outFileList\n\t},\n\n\tinitSharingLinks($el) {\n\t\tif (this._linkFileList) {\n\t\t\treturn this._linkFileList\n\t\t}\n\t\tthis._linkFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.link',\n\t\t\t\tlinksOnly: true,\n\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._linkFileList)\n\t\tthis._linkFileList.appName = t('files_sharing', 'Shared by link')\n\t\tthis._linkFileList.$el.find('.emptyfilelist.emptycontent').html('<div class=\"icon-public\"></div>'\n\t\t\t+ '<h2>' + t('files_sharing', 'No shared links') + '</h2>'\n\t\t\t+ '<p>' + t('files_sharing', 'Files and folders you share by link will show up here') + '</p>')\n\t\treturn this._linkFileList\n\t},\n\n\tinitSharingDeleted($el) {\n\t\tif (this._deletedFileList) {\n\t\t\treturn this._deletedFileList\n\t\t}\n\t\tthis._deletedFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.deleted',\n\t\t\t\tdefaultFileActionsDisabled: true,\n\t\t\t\tshowDeleted: true,\n\t\t\t\tsharedWithUser: true,\n\t\t\t\tfileActions: this._restoreShareAction(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._deletedFileList)\n\t\tthis._deletedFileList.appName = t('files_sharing', 'Deleted shares')\n\t\tthis._deletedFileList.$el.find('.emptyfilelist.emptycontent').html('<div class=\"icon-share\"></div>'\n\t\t\t+ '<h2>' + t('files_sharing', 'No deleted shares') + '</h2>'\n\t\t\t+ '<p>' + t('files_sharing', 'Shares you deleted will show up here') + '</p>')\n\t\treturn this._deletedFileList\n\t},\n\n\tinitSharingPening($el) {\n\t\tif (this._pendingFileList) {\n\t\t\treturn this._pendingFileList\n\t\t}\n\t\tthis._pendingFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.pending',\n\t\t\t\tshowPending: true,\n\t\t\t\tdetailsViewEnabled: false,\n\t\t\t\tdefaultFileActionsDisabled: true,\n\t\t\t\tsharedWithUser: true,\n\t\t\t\tfileActions: this._acceptShareAction(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._pendingFileList)\n\t\tthis._pendingFileList.appName = t('files_sharing', 'Pending shares')\n\t\tthis._pendingFileList.$el.find('.emptyfilelist.emptycontent').html('<div class=\"icon-share\"></div>'\n\t\t\t+ '<h2>' + t('files_sharing', 'No pending shares') + '</h2>'\n\t\t\t+ '<p>' + t('files_sharing', 'Shares you have received but not confirmed will show up here') + '</p>')\n\t\treturn this._pendingFileList\n\t},\n\n\tinitShareingOverview($el) {\n\t\tif (this._overviewFileList) {\n\t\t\treturn this._overviewFileList\n\t\t}\n\t\tthis._overviewFileList = new OCA.Sharing.FileList(\n\t\t\t$el,\n\t\t\t{\n\t\t\t\tid: 'shares.overview',\n\t\t\t\tfileActions: this._createFileActions(),\n\t\t\t\tconfig: OCA.Files.App.getFilesConfig(),\n\t\t\t\tisOverview: true,\n\t\t\t\t// The file list is created when a \"show\" event is handled, so\n\t\t\t\t// it should be marked as \"shown\" like it would have been done\n\t\t\t\t// if handling the event with the file list already created.\n\t\t\t\tshown: true,\n\t\t\t}\n\t\t)\n\n\t\tthis._extendFileList(this._overviewFileList)\n\t\tthis._overviewFileList.appName = t('files_sharing', 'Shares')\n\t\tthis._overviewFileList.$el.find('.emptyfilelist.emptycontent').html('<div class=\"icon-share\"></div>'\n\t\t\t+ '<h2>' + t('files_sharing', 'No shares') + '</h2>'\n\t\t\t+ '<p>' + t('files_sharing', 'Shares will show up here') + '</p>')\n\t\treturn this._overviewFileList\n\t},\n\n\tremoveSharingIn() {\n\t\tif (this._inFileList) {\n\t\t\tthis._inFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingOut() {\n\t\tif (this._outFileList) {\n\t\t\tthis._outFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingLinks() {\n\t\tif (this._linkFileList) {\n\t\t\tthis._linkFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingDeleted() {\n\t\tif (this._deletedFileList) {\n\t\t\tthis._deletedFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingPending() {\n\t\tif (this._pendingFileList) {\n\t\t\tthis._pendingFileList.$fileList.empty()\n\t\t}\n\t},\n\n\tremoveSharingOverview() {\n\t\tif (this._overviewFileList) {\n\t\t\tthis._overviewFileList.$fileList.empty()\n\t\t}\n\t},\n\n\t/**\n\t * Destroy the app\n\t */\n\tdestroy() {\n\t\tOCA.Files.fileActions.off('setDefault.app-sharing', this._onActionsUpdated)\n\t\tOCA.Files.fileActions.off('registerAction.app-sharing', this._onActionsUpdated)\n\t\tthis.removeSharingIn()\n\t\tthis.removeSharingOut()\n\t\tthis.removeSharingLinks()\n\t\tthis._inFileList = null\n\t\tthis._outFileList = null\n\t\tthis._linkFileList = null\n\t\tthis._overviewFileList = null\n\t\tdelete this._globalActionsInitialized\n\t},\n\n\t_createFileActions() {\n\t\t// inherit file actions from the files app\n\t\tconst fileActions = new OCA.Files.FileActions()\n\t\t// note: not merging the legacy actions because legacy apps are not\n\t\t// compatible with the sharing overview and need to be adapted first\n\t\tfileActions.registerDefaultActions()\n\t\tfileActions.merge(OCA.Files.fileActions)\n\n\t\tif (!this._globalActionsInitialized) {\n\t\t\t// in case actions are registered later\n\t\t\tthis._onActionsUpdated = _.bind(this._onActionsUpdated, this)\n\t\t\tOCA.Files.fileActions.on('setDefault.app-sharing', this._onActionsUpdated)\n\t\t\tOCA.Files.fileActions.on('registerAction.app-sharing', this._onActionsUpdated)\n\t\t\tthis._globalActionsInitialized = true\n\t\t}\n\n\t\t// when the user clicks on a folder, redirect to the corresponding\n\t\t// folder in the files app instead of opening it directly\n\t\tfileActions.register('dir', 'Open', OC.PERMISSION_READ, '', function(filename, context) {\n\t\t\tOCA.Files.App.setActiveView('files', { silent: true })\n\t\t\tOCA.Files.App.fileList.changeDirectory(OC.joinPaths(context.$file.attr('data-path'), filename), true, true)\n\t\t})\n\t\tfileActions.setDefault('dir', 'Open')\n\t\treturn fileActions\n\t},\n\n\t_restoreShareAction() {\n\t\tconst fileActions = new OCA.Files.FileActions()\n\t\tfileActions.registerAction({\n\t\t\tname: 'Restore',\n\t\t\tdisplayName: t('files_sharing', 'Restore'),\n\t\t\taltText: t('files_sharing', 'Restore share'),\n\t\t\tmime: 'all',\n\t\t\tpermissions: OC.PERMISSION_ALL,\n\t\t\ticonClass: 'icon-history',\n\t\t\ttype: OCA.Files.FileActions.TYPE_INLINE,\n\t\t\tactionHandler(fileName, context) {\n\t\t\t\tconst shareId = context.$file.data('shareId')\n\t\t\t\t$.post(OC.linkToOCS('apps/files_sharing/api/v1/deletedshares', 2) + shareId)\n\t\t\t\t\t.success(function(result) {\n\t\t\t\t\t\tcontext.fileList.remove(context.fileInfoModel.attributes.name)\n\t\t\t\t\t}).fail(function() {\n\t\t\t\t\t\tOC.Notification.showTemporary(t('files_sharing', 'Something happened. Unable to restore the share.'))\n\t\t\t\t\t})\n\t\t\t},\n\t\t})\n\t\treturn fileActions\n\t},\n\n\t_acceptShareAction() {\n\t\tconst fileActions = new OCA.Files.FileActions()\n\t\tfileActions.registerAction({\n\t\t\tname: 'Accept share',\n\t\t\tdisplayName: t('files_sharing', 'Accept share'),\n\t\t\tmime: 'all',\n\t\t\tpermissions: OC.PERMISSION_ALL,\n\t\t\ticonClass: 'icon-checkmark',\n\t\t\ttype: OCA.Files.FileActions.TYPE_INLINE,\n\t\t\tactionHandler(fileName, context) {\n\t\t\t\tconst shareId = context.$file.data('shareId')\n\t\t\t\tlet shareBase = 'shares/pending'\n\t\t\t\tif (context.$file.attr('data-remote-id')) {\n\t\t\t\t\tshareBase = 'remote_shares/pending'\n\t\t\t\t}\n\t\t\t\t$.post(OC.linkToOCS('apps/files_sharing/api/v1/' + shareBase, 2) + shareId)\n\t\t\t\t\t.success(function(result) {\n\t\t\t\t\t\tcontext.fileList.remove(context.fileInfoModel.attributes.name)\n\t\t\t\t\t}).fail(function() {\n\t\t\t\t\t\tOC.Notification.showTemporary(t('files_sharing', 'Something happened. Unable to accept the share.'))\n\t\t\t\t\t})\n\t\t\t},\n\t\t})\n\t\tfileActions.registerAction({\n\t\t\tname: 'Reject share',\n\t\t\tdisplayName: t('files_sharing', 'Reject share'),\n\t\t\tmime: 'all',\n\t\t\tpermissions: OC.PERMISSION_ALL,\n\t\t\ticonClass: 'icon-close',\n\t\t\ttype: OCA.Files.FileActions.TYPE_INLINE,\n\t\t\tshouldRender(context) {\n\t\t\t\t// disable rejecting group shares from the pending list because they anyway\n\t\t\t\t// land back into that same list\n\t\t\t\tif (context.$file.attr('data-remote-id') && parseInt(context.$file.attr('data-share-type'), 10) === OC.Share.SHARE_TYPE_REMOTE_GROUP) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t\treturn true\n\t\t\t},\n\t\t\tactionHandler(fileName, context) {\n\t\t\t\tconst shareId = context.$file.data('shareId')\n\t\t\t\tlet shareBase = 'shares'\n\t\t\t\tif (context.$file.attr('data-remote-id')) {\n\t\t\t\t\tshareBase = 'remote_shares'\n\t\t\t\t}\n\n\t\t\t\t$.ajax({\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1/' + shareBase, 2) + shareId,\n\t\t\t\t\ttype: 'DELETE',\n\t\t\t\t}).success(function(result) {\n\t\t\t\t\tcontext.fileList.remove(context.fileInfoModel.attributes.name)\n\t\t\t\t}).fail(function() {\n\t\t\t\t\tOC.Notification.showTemporary(t('files_sharing', 'Something happened. Unable to reject the share.'))\n\t\t\t\t})\n\t\t\t},\n\t\t})\n\t\treturn fileActions\n\t},\n\n\t_onActionsUpdated(ev) {\n\t\t_.each([this._inFileList, this._outFileList, this._linkFileList], function(list) {\n\t\t\tif (!list) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif (ev.action) {\n\t\t\t\tlist.fileActions.registerAction(ev.action)\n\t\t\t} else if (ev.defaultAction) {\n\t\t\t\tlist.fileActions.setDefault(\n\t\t\t\t\tev.defaultAction.mime,\n\t\t\t\t\tev.defaultAction.name\n\t\t\t\t)\n\t\t\t}\n\t\t})\n\t},\n\n\t_extendFileList(fileList) {\n\t\t// remove size column from summary\n\t\tfileList.fileSummary.$el.find('.filesize').remove()\n\t},\n}\n\nwindow.addEventListener('DOMContentLoaded', function() {\n\t$('#app-content-sharingin').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingIn($(e.target))\n\t})\n\t$('#app-content-sharingin').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingIn()\n\t})\n\t$('#app-content-sharingout').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingOut($(e.target))\n\t})\n\t$('#app-content-sharingout').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingOut()\n\t})\n\t$('#app-content-sharinglinks').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingLinks($(e.target))\n\t})\n\t$('#app-content-sharinglinks').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingLinks()\n\t})\n\t$('#app-content-deletedshares').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingDeleted($(e.target))\n\t})\n\t$('#app-content-deletedshares').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingDeleted()\n\t})\n\t$('#app-content-pendingshares').on('show', function(e) {\n\t\tOCA.Sharing.App.initSharingPening($(e.target))\n\t})\n\t$('#app-content-pendingshares').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingPending()\n\t})\n\t$('#app-content-shareoverview').on('show', function(e) {\n\t\tOCA.Sharing.App.initShareingOverview($(e.target))\n\t})\n\t$('#app-content-shareoverview').on('hide', function() {\n\t\tOCA.Sharing.App.removeSharingOverview()\n\t})\n})\n","/* eslint-disable */\n/*\n * Copyright (c) 2014 Vincent Petry <pvince81@owncloud.com>\n *\n * This file is licensed under the Affero General Public License version 3\n * or later.\n *\n * See the COPYING-README file.\n *\n */\n(function() {\n\n\t/**\n\t * @class OCA.Sharing.FileList\n\t * @augments OCA.Files.FileList\n\t *\n\t * @classdesc Sharing file list.\n\t * Contains both \"shared with others\" and \"shared with you\" modes.\n\t *\n\t * @param $el container element with existing markup for the .files-controls\n\t * and a table\n\t * @param [options] map of options, see other parameters\n\t * @param {boolean} [options.sharedWithUser] true to return files shared with\n\t * the current user, false to return files that the user shared with others.\n\t * Defaults to false.\n\t * @param {boolean} [options.linksOnly] true to return only link shares\n\t */\n\tvar FileList = function($el, options) {\n\t\tthis.initialize($el, options)\n\t}\n\tFileList.prototype = _.extend({}, OCA.Files.FileList.prototype,\n\t\t/** @lends OCA.Sharing.FileList.prototype */ {\n\t\t\tappName: 'Shares',\n\n\t\t\t/**\n\t\t * Whether the list shows the files shared with the user (true) or\n\t\t * the files that the user shared with others (false).\n\t\t */\n\t\t\t_sharedWithUser: false,\n\t\t\t_linksOnly: false,\n\t\t\t_showDeleted: false,\n\t\t\t_showPending: false,\n\t\t\t_clientSideSort: true,\n\t\t\t_allowSelection: false,\n\t\t\t_isOverview: false,\n\n\t\t\t/**\n\t\t * @private\n\t\t */\n\t\t\tinitialize: function($el, options) {\n\t\t\t\tOCA.Files.FileList.prototype.initialize.apply(this, arguments)\n\t\t\t\tif (this.initialized) {\n\t\t\t\t\treturn\n\t\t\t\t}\n\n\t\t\t\t// TODO: consolidate both options\n\t\t\t\tif (options && options.sharedWithUser) {\n\t\t\t\t\tthis._sharedWithUser = true\n\t\t\t\t}\n\t\t\t\tif (options && options.linksOnly) {\n\t\t\t\t\tthis._linksOnly = true\n\t\t\t\t}\n\t\t\t\tif (options && options.showDeleted) {\n\t\t\t\t\tthis._showDeleted = true\n\t\t\t\t}\n\t\t\t\tif (options && options.showPending) {\n\t\t\t\t\tthis._showPending = true\n\t\t\t\t}\n\t\t\t\tif (options && options.isOverview) {\n\t\t\t\t\tthis._isOverview = true\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t_renderRow: function() {\n\t\t\t// HACK: needed to call the overridden _renderRow\n\t\t\t// this is because at the time this class is created\n\t\t\t// the overriding hasn't been done yet...\n\t\t\t\treturn OCA.Files.FileList.prototype._renderRow.apply(this, arguments)\n\t\t\t},\n\n\t\t\t_createRow: function(fileData) {\n\t\t\t// TODO: hook earlier and render the whole row here\n\t\t\t\tvar $tr = OCA.Files.FileList.prototype._createRow.apply(this, arguments)\n\t\t\t\t$tr.find('.filesize').remove()\n\t\t\t\t$tr.find('td.date').before($tr.children('td:first'))\n\t\t\t\t$tr.find('td.filename input:checkbox').remove()\n\t\t\t\t$tr.attr('data-share-id', _.pluck(fileData.shares, 'id').join(','))\n\t\t\t\tif (this._sharedWithUser) {\n\t\t\t\t\t$tr.attr('data-share-owner', fileData.shareOwner)\n\t\t\t\t\t$tr.attr('data-mounttype', 'shared-root')\n\t\t\t\t\tvar permission = parseInt($tr.attr('data-permissions')) | OC.PERMISSION_DELETE\n\t\t\t\t\t$tr.attr('data-permissions', permission)\n\t\t\t\t}\n\t\t\t\tif (this._showDeleted || this._showPending) {\n\t\t\t\t\tvar permission = fileData.permissions\n\t\t\t\t\t$tr.attr('data-share-permissions', permission)\n\t\t\t\t}\n\n\t\t\t\tif (fileData.remoteId) {\n\t\t\t\t\t$tr.attr('data-remote-id', fileData.remoteId)\n\t\t\t\t}\n\n\t\t\t\tif (fileData.shareType) {\n\t\t\t\t\t$tr.attr('data-share-type', fileData.shareType)\n\t\t\t\t}\n\n\t\t\t\t// add row with expiration date for link only shares - influenced by _createRow of filelist\n\t\t\t\tif (this._linksOnly) {\n\t\t\t\t\tvar expirationTimestamp = 0\n\t\t\t\t\tif (fileData.shares && fileData.shares[0].expiration !== null) {\n\t\t\t\t\t\texpirationTimestamp = moment(fileData.shares[0].expiration).valueOf()\n\t\t\t\t\t}\n\t\t\t\t\t$tr.attr('data-expiration', expirationTimestamp)\n\n\t\t\t\t\t// date column (1000 milliseconds to seconds, 60 seconds, 60 minutes, 24 hours)\n\t\t\t\t\t// difference in days multiplied by 5 - brightest shade for expiry dates in more than 32 days (160/5)\n\t\t\t\t\tvar modifiedColor = Math.round((expirationTimestamp - (new Date()).getTime()) / 1000 / 60 / 60 / 24 * 5)\n\t\t\t\t\t// ensure that the brightest color is still readable\n\t\t\t\t\tif (modifiedColor >= 160) {\n\t\t\t\t\t\tmodifiedColor = 160\n\t\t\t\t\t}\n\n\t\t\t\t\tvar formatted\n\t\t\t\t\tvar text\n\t\t\t\t\tif (expirationTimestamp > 0) {\n\t\t\t\t\t\tformatted = OC.Util.formatDate(expirationTimestamp)\n\t\t\t\t\t\ttext = OC.Util.relativeModifiedDate(expirationTimestamp)\n\t\t\t\t\t} else {\n\t\t\t\t\t\tformatted = t('files_sharing', 'No expiration date set')\n\t\t\t\t\t\ttext = ''\n\t\t\t\t\t\tmodifiedColor = 160\n\t\t\t\t\t}\n\t\t\t\t\ttd = $('<td></td>').attr({ 'class': 'date' })\n\t\t\t\t\ttd.append($('<span></span>').attr({\n\t\t\t\t\t\t'class': 'modified',\n\t\t\t\t\t\t'title': formatted,\n\t\t\t\t\t\t'style': 'color:rgb(' + modifiedColor + ',' + modifiedColor + ',' + modifiedColor + ')'\n\t\t\t\t\t}).text(text)\n\t\t\t\t\t\t.tooltip({ placement: 'top' })\n\t\t\t\t\t)\n\n\t\t\t\t\t$tr.append(td)\n\t\t\t\t}\n\t\t\t\treturn $tr\n\t\t\t},\n\n\t\t\t/**\n\t\t * Set whether the list should contain outgoing shares\n\t\t * or incoming shares.\n\t\t *\n\t\t * @param state true for incoming shares, false otherwise\n\t\t */\n\t\t\tsetSharedWithUser: function(state) {\n\t\t\t\tthis._sharedWithUser = !!state\n\t\t\t},\n\n\t\t\tupdateEmptyContent: function() {\n\t\t\t\tvar dir = this.getCurrentDirectory()\n\t\t\t\tif (dir === '/') {\n\t\t\t\t// root has special permissions\n\t\t\t\t\tthis.$el.find('.emptyfilelist.emptycontent').toggleClass('hidden', !this.isEmpty)\n\t\t\t\t\tthis.$el.find('.files-filestable thead th').toggleClass('hidden', this.isEmpty)\n\n\t\t\t\t\t// hide expiration date header for non link only shares\n\t\t\t\t\tif (!this._linksOnly) {\n\t\t\t\t\t\tthis.$el.find('th.column-expiration').addClass('hidden')\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tOCA.Files.FileList.prototype.updateEmptyContent.apply(this, arguments)\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tgetDirectoryPermissions: function() {\n\t\t\t\treturn OC.PERMISSION_READ | OC.PERMISSION_DELETE\n\t\t\t},\n\n\t\t\tupdateStorageStatistics: function() {\n\t\t\t// no op because it doesn't have\n\t\t\t// storage info like free space / used space\n\t\t\t},\n\n\t\t\treload: function() {\n\t\t\t\tthis.showMask()\n\t\t\t\tif (this._reloadCall) {\n\t\t\t\t\tthis._reloadCall.abort()\n\t\t\t\t}\n\n\t\t\t\t// there is only root\n\t\t\t\tthis._setCurrentDir('/', false)\n\n\t\t\t\tvar promises = []\n\n\t\t\t\tvar deletedShares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1', 2) + 'deletedshares',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json',\n\t\t\t\t\t\tinclude_tags: true\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar pendingShares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1/shares', 2) + 'pending',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json'\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar pendingRemoteShares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1/remote_shares', 2) + 'pending',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json'\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar shares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1') + 'shares',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json',\n\t\t\t\t\t\tshared_with_me: this._sharedWithUser !== false,\n\t\t\t\t\t\tinclude_tags: true\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar remoteShares = {\n\t\t\t\t\turl: OC.linkToOCS('apps/files_sharing/api/v1') + 'remote_shares',\n\t\t\t\t\t/* jshint camelcase: false */\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tformat: 'json',\n\t\t\t\t\t\tinclude_tags: true\n\t\t\t\t\t},\n\t\t\t\t\ttype: 'GET',\n\t\t\t\t\tbeforeSend: function(xhr) {\n\t\t\t\t\t\txhr.setRequestHeader('OCS-APIREQUEST', 'true')\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Add the proper ajax requests to the list and run them\n\t\t\t\t// and make sure we have 2 promises\n\t\t\t\tif (this._showDeleted) {\n\t\t\t\t\tpromises.push($.ajax(deletedShares))\n\t\t\t\t} else if (this._showPending) {\n\t\t\t\t\tpromises.push($.ajax(pendingShares))\n\t\t\t\t\tpromises.push($.ajax(pendingRemoteShares))\n\t\t\t\t} else {\n\t\t\t\t\tpromises.push($.ajax(shares))\n\n\t\t\t\t\tif (this._sharedWithUser !== false || this._isOverview) {\n\t\t\t\t\t\tpromises.push($.ajax(remoteShares))\n\t\t\t\t\t}\n\t\t\t\t\tif (this._isOverview) {\n\t\t\t\t\t\tshares.data.shared_with_me = !shares.data.shared_with_me\n\t\t\t\t\t\tpromises.push($.ajax(shares))\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._reloadCall = $.when.apply($, promises)\n\t\t\t\tvar callBack = this.reloadCallback.bind(this)\n\t\t\t\treturn this._reloadCall.then(callBack, callBack)\n\t\t\t},\n\n\t\t\treloadCallback: function(shares, remoteShares, additionalShares) {\n\t\t\t\tdelete this._reloadCall\n\t\t\t\tthis.hideMask()\n\n\t\t\t\tthis.$el.find('#headerSharedWith').text(\n\t\t\t\t\tt('files_sharing', this._sharedWithUser ? 'Shared by' : 'Shared with')\n\t\t\t\t)\n\n\t\t\t\tvar files = []\n\n\t\t\t\t// make sure to use the same format\n\t\t\t\tif (shares[0] && shares[0].ocs) {\n\t\t\t\t\tshares = shares[0]\n\t\t\t\t}\n\t\t\t\tif (remoteShares && remoteShares[0] && remoteShares[0].ocs) {\n\t\t\t\t\tremoteShares = remoteShares[0]\n\t\t\t\t}\n\t\t\t\tif (additionalShares && additionalShares[0] && additionalShares[0].ocs) {\n\t\t\t\t\tadditionalShares = additionalShares[0]\n\t\t\t\t}\n\n\t\t\t\tif (shares.ocs && shares.ocs.data) {\n\t\t\t\t\tfiles = files.concat(this._makeFilesFromShares(shares.ocs.data, this._sharedWithUser))\n\t\t\t\t}\n\n\t\t\t\tif (remoteShares && remoteShares.ocs && remoteShares.ocs.data) {\n\t\t\t\t\tfiles = files.concat(this._makeFilesFromRemoteShares(remoteShares.ocs.data))\n\t\t\t\t}\n\n\t\t\t\tif (additionalShares && additionalShares.ocs && additionalShares.ocs.data) {\n\t\t\t\t\tif (this._showPending) {\n\t\t\t\t\t\t// in this case the second callback is about pending remote shares\n\t\t\t\t\t\tfiles = files.concat(this._makeFilesFromRemoteShares(additionalShares.ocs.data))\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfiles = files.concat(this._makeFilesFromShares(additionalShares.ocs.data, !this._sharedWithUser))\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.setFiles(files)\n\t\t\t\treturn true\n\t\t\t},\n\n\t\t\t_makeFilesFromRemoteShares: function(data) {\n\t\t\t\tvar files = data\n\n\t\t\t\tfiles = _.chain(files)\n\t\t\t\t// convert share data to file data\n\t\t\t\t\t.map(function(share) {\n\t\t\t\t\t\tvar file = {\n\t\t\t\t\t\t\tshareOwner: share.owner + '@' + share.remote.replace(/.*?:\\/\\//g, ''),\n\t\t\t\t\t\t\tname: OC.basename(share.mountpoint),\n\t\t\t\t\t\t\tmtime: share.mtime * 1000,\n\t\t\t\t\t\t\tmimetype: share.mimetype,\n\t\t\t\t\t\t\ttype: share.type,\n\t\t\t\t\t\t\t// remote share types are different and need to be mapped\n\t\t\t\t\t\t\tshareType: (parseInt(share.share_type, 10) === 1) ? OC.Share.SHARE_TYPE_REMOTE_GROUP : OC.Share.SHARE_TYPE_REMOTE,\n\t\t\t\t\t\t\tid: share.file_id,\n\t\t\t\t\t\t\tpath: OC.dirname(share.mountpoint),\n\t\t\t\t\t\t\tpermissions: share.permissions,\n\t\t\t\t\t\t\ttags: share.tags || []\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (share.remote_id) {\n\t\t\t\t\t\t\t// remote share\n\t\t\t\t\t\t\tif (share.accepted !== '1') {\n\t\t\t\t\t\t\t\tfile.name = OC.basename(share.name)\n\t\t\t\t\t\t\t\tfile.path = '/'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfile.remoteId = share.remote_id\n\t\t\t\t\t\t\tfile.shareOwnerId = share.owner\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!file.mimetype) {\n\t\t\t\t\t\t\t// pending shares usually have no type, so default to showing a directory icon\n\t\t\t\t\t\t\tfile.mimetype = 'dir-shared'\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfile.shares = [{\n\t\t\t\t\t\t\tid: share.id,\n\t\t\t\t\t\t\ttype: OC.Share.SHARE_TYPE_REMOTE\n\t\t\t\t\t\t}]\n\t\t\t\t\t\treturn file\n\t\t\t\t\t})\n\t\t\t\t\t.value()\n\t\t\t\treturn files\n\t\t\t},\n\n\t\t\t/**\n\t\t * Converts the OCS API share response data to a file info\n\t\t * list\n\t\t * @param {Array} data OCS API share array\n\t\t * @param {boolean} sharedWithUser\n\t\t * @returns {Array.<OCA.Sharing.SharedFileInfo>} array of shared file info\n\t\t */\n\t\t\t_makeFilesFromShares: function(data, sharedWithUser) {\n\t\t\t/* jshint camelcase: false */\n\t\t\t\tvar files = data\n\n\t\t\t\tif (this._linksOnly) {\n\t\t\t\t\tfiles = _.filter(data, function(share) {\n\t\t\t\t\t\treturn share.share_type === OC.Share.SHARE_TYPE_LINK\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\t// OCS API uses non-camelcased names\n\t\t\t\tfiles = _.chain(files)\n\t\t\t\t// convert share data to file data\n\t\t\t\t\t.map(function(share) {\n\t\t\t\t\t// TODO: use OC.Files.FileInfo\n\t\t\t\t\t\tvar file = {\n\t\t\t\t\t\t\tid: share.file_source,\n\t\t\t\t\t\t\ticon: OC.MimeType.getIconUrl(share.mimetype),\n\t\t\t\t\t\t\tmimetype: share.mimetype,\n\t\t\t\t\t\t\thasPreview: share.has_preview,\n\t\t\t\t\t\t\ttags: share.tags || []\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (share.item_type === 'folder') {\n\t\t\t\t\t\t\tfile.type = 'dir'\n\t\t\t\t\t\t\tfile.mimetype = 'httpd/unix-directory'\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfile.type = 'file'\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfile.share = {\n\t\t\t\t\t\t\tid: share.id,\n\t\t\t\t\t\t\ttype: share.share_type,\n\t\t\t\t\t\t\ttarget: share.share_with,\n\t\t\t\t\t\t\tstime: share.stime * 1000,\n\t\t\t\t\t\t\texpiration: share.expiration\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (sharedWithUser) {\n\t\t\t\t\t\t\tfile.shareOwner = share.displayname_owner\n\t\t\t\t\t\t\tfile.shareOwnerId = share.uid_owner\n\t\t\t\t\t\t\tfile.name = OC.basename(share.file_target)\n\t\t\t\t\t\t\tfile.path = OC.dirname(share.file_target)\n\t\t\t\t\t\t\tfile.permissions = share.permissions\n\t\t\t\t\t\t\tif (file.path) {\n\t\t\t\t\t\t\t\tfile.extraData = share.file_target\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tif (share.share_type !== OC.Share.SHARE_TYPE_LINK) {\n\t\t\t\t\t\t\t\tfile.share.targetDisplayName = share.share_with_displayname\n\t\t\t\t\t\t\t\tfile.share.targetShareWithId = share.share_with\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfile.name = OC.basename(share.path)\n\t\t\t\t\t\t\tfile.path = OC.dirname(share.path)\n\t\t\t\t\t\t\tfile.permissions = OC.PERMISSION_ALL\n\t\t\t\t\t\t\tif (file.path) {\n\t\t\t\t\t\t\t\tfile.extraData = share.path\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn file\n\t\t\t\t\t})\n\t\t\t\t// Group all files and have a \"shares\" array with\n\t\t\t\t// the share info for each file.\n\t\t\t\t//\n\t\t\t\t// This uses a hash memo to cumulate share information\n\t\t\t\t// inside the same file object (by file id).\n\t\t\t\t\t.reduce(function(memo, file) {\n\t\t\t\t\t\tvar data = memo[file.id]\n\t\t\t\t\t\tvar recipient = file.share.targetDisplayName\n\t\t\t\t\t\tvar recipientId = file.share.targetShareWithId\n\t\t\t\t\t\tif (!data) {\n\t\t\t\t\t\t\tdata = memo[file.id] = file\n\t\t\t\t\t\t\tdata.shares = [file.share]\n\t\t\t\t\t\t\t// using a hash to make them unique,\n\t\t\t\t\t\t\t// this is only a list to be displayed\n\t\t\t\t\t\t\tdata.recipients = {}\n\t\t\t\t\t\t\tdata.recipientData = {}\n\t\t\t\t\t\t\t// share types\n\t\t\t\t\t\t\tdata.shareTypes = {}\n\t\t\t\t\t\t\t// counter is cheaper than calling _.keys().length\n\t\t\t\t\t\t\tdata.recipientsCount = 0\n\t\t\t\t\t\t\tdata.mtime = file.share.stime\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t// always take the most recent stime\n\t\t\t\t\t\t\tif (file.share.stime > data.mtime) {\n\t\t\t\t\t\t\t\tdata.mtime = file.share.stime\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdata.shares.push(file.share)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (recipient) {\n\t\t\t\t\t\t// limit counterparts for output\n\t\t\t\t\t\t\tif (data.recipientsCount < 4) {\n\t\t\t\t\t\t\t// only store the first ones, they will be the only ones\n\t\t\t\t\t\t\t// displayed\n\t\t\t\t\t\t\t\tdata.recipients[recipient] = true\n\t\t\t\t\t\t\t\tdata.recipientData[data.recipientsCount] = {\n\t\t\t\t\t\t\t\t\t'shareWith': recipientId,\n\t\t\t\t\t\t\t\t\t'shareWithDisplayName': recipient\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdata.recipientsCount++\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata.shareTypes[file.share.type] = true\n\n\t\t\t\t\t\tdelete file.share\n\t\t\t\t\t\treturn memo\n\t\t\t\t\t}, {})\n\t\t\t\t// Retrieve only the values of the returned hash\n\t\t\t\t\t.values()\n\t\t\t\t// Clean up\n\t\t\t\t\t.each(function(data) {\n\t\t\t\t\t// convert the recipients map to a flat\n\t\t\t\t\t// array of sorted names\n\t\t\t\t\t\tdata.mountType = 'shared'\n\t\t\t\t\t\tdelete data.recipientsCount\n\t\t\t\t\t\tif (sharedWithUser) {\n\t\t\t\t\t\t// only for outgoing shares\n\t\t\t\t\t\t\tdelete data.shareTypes\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdata.shareTypes = _.keys(data.shareTypes)\n\t\t\t\t\t\t}\n\t\t\t\t\t})\n\t\t\t\t// Finish the chain by getting the result\n\t\t\t\t\t.value()\n\n\t\t\t\t// Sort by expected sort comparator\n\t\t\t\treturn files.sort(this._sortComparator)\n\t\t\t}\n\t\t})\n\n\t/**\n\t * Share info attributes.\n\t *\n\t * @typedef {Object} OCA.Sharing.ShareInfo\n\t *\n\t * @property {number} id share ID\n\t * @property {number} type share type\n\t * @property {String} target share target, either user name or group name\n\t * @property {number} stime share timestamp in milliseconds\n\t * @property {String} [targetDisplayName] display name of the recipient\n\t * (only when shared with others)\n\t * @property {String} [targetShareWithId] id of the recipient\n\t *\n\t */\n\n\t/**\n\t * Recipient attributes\n\t *\n\t * @typedef {Object} OCA.Sharing.RecipientInfo\n\t * @property {String} shareWith the id of the recipient\n\t * @property {String} shareWithDisplayName the display name of the recipient\n\t */\n\n\t/**\n\t * Shared file info attributes.\n\t *\n\t * @typedef {OCA.Files.FileInfo} OCA.Sharing.SharedFileInfo\n\t *\n\t * @property {Array.<OCA.Sharing.ShareInfo>} shares array of shares for\n\t * this file\n\t * @property {number} mtime most recent share time (if multiple shares)\n\t * @property {String} shareOwner name of the share owner\n\t * @property {Array.<String>} recipients name of the first 4 recipients\n\t * (this is mostly for display purposes)\n\t * @property {Object.<OCA.Sharing.RecipientInfo>} recipientData (as object for easier\n\t * passing to HTML data attributes with jQuery)\n\t */\n\n\tOCA.Sharing.FileList = FileList\n})()\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }"],"names":["OCA","Sharing","App","_inFileList","_outFileList","_overviewFileList","_pendingFileList","initSharingIn","$el","this","FileList","id","sharedWithUser","fileActions","_createFileActions","config","Files","getFilesConfig","shown","_extendFileList","appName","t","find","html","initSharingOut","initSharingLinks","_linkFileList","linksOnly","initSharingDeleted","_deletedFileList","defaultFileActionsDisabled","showDeleted","_restoreShareAction","initSharingPening","showPending","detailsViewEnabled","_acceptShareAction","initShareingOverview","isOverview","removeSharingIn","$fileList","empty","removeSharingOut","removeSharingLinks","removeSharingDeleted","removeSharingPending","removeSharingOverview","destroy","off","_onActionsUpdated","_globalActionsInitialized","FileActions","registerDefaultActions","merge","_","bind","on","register","OC","PERMISSION_READ","filename","context","setActiveView","silent","fileList","changeDirectory","joinPaths","$file","attr","setDefault","registerAction","name","displayName","altText","mime","permissions","PERMISSION_ALL","iconClass","type","TYPE_INLINE","actionHandler","fileName","shareId","data","$","post","linkToOCS","success","result","remove","fileInfoModel","attributes","fail","Notification","showTemporary","shareBase","shouldRender","parseInt","Share","SHARE_TYPE_REMOTE_GROUP","ajax","url","ev","each","list","action","defaultAction","fileSummary","window","addEventListener","e","target","options","initialize","prototype","extend","_sharedWithUser","_linksOnly","_showDeleted","_showPending","_clientSideSort","_allowSelection","_isOverview","apply","arguments","initialized","_renderRow","_createRow","fileData","$tr","before","children","pluck","shares","join","shareOwner","permission","PERMISSION_DELETE","remoteId","shareType","expirationTimestamp","expiration","moment","valueOf","formatted","text","modifiedColor","Math","round","Date","getTime","Util","formatDate","relativeModifiedDate","td","append","tooltip","placement","setSharedWithUser","state","updateEmptyContent","dir","getCurrentDirectory","toggleClass","isEmpty","addClass","getDirectoryPermissions","updateStorageStatistics","reload","showMask","_reloadCall","abort","_setCurrentDir","promises","deletedShares","format","include_tags","beforeSend","xhr","setRequestHeader","pendingShares","pendingRemoteShares","shared_with_me","remoteShares","push","when","callBack","reloadCallback","then","additionalShares","hideMask","files","ocs","concat","_makeFilesFromShares","_makeFilesFromRemoteShares","setFiles","chain","map","share","file","owner","remote","replace","basename","mountpoint","mtime","mimetype","share_type","SHARE_TYPE_REMOTE","file_id","path","dirname","tags","remote_id","accepted","shareOwnerId","value","filter","SHARE_TYPE_LINK","file_source","icon","MimeType","getIconUrl","hasPreview","has_preview","item_type","share_with","stime","displayname_owner","uid_owner","file_target","extraData","targetDisplayName","share_with_displayname","targetShareWithId","reduce","memo","recipient","recipientId","recipients","recipientData","shareTypes","recipientsCount","values","mountType","keys","sort","_sortComparator","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","hasOwnProperty","call"],"sourceRoot":""} \ No newline at end of file
diff --git a/lib/base.php b/lib/base.php
index 055cc6786f0..0ae7aefbcc3 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -745,7 +745,6 @@ class OC {
}
self::registerCleanupHooks($systemConfig);
- self::registerFilesystemHooks();
self::registerShareHooks($systemConfig);
self::registerEncryptionWrapperAndHooks();
self::registerAccountHooks();
@@ -803,7 +802,7 @@ class OC {
if (!$isScssRequest) {
http_response_code(400);
- \OC::$server->getLogger()->warning(
+ \OC::$server->getLogger()->info(
'Trusted domain error. "{remoteAddress}" tried to access using "{host}" as host.',
[
'app' => 'core',
@@ -918,15 +917,6 @@ class OC {
}
/**
- * register hooks for the filesystem
- */
- public static function registerFilesystemHooks() {
- // Check for blacklisted files
- OC_Hook::connect('OC_Filesystem', 'write', Filesystem::class, 'isBlacklisted');
- OC_Hook::connect('OC_Filesystem', 'rename', Filesystem::class, 'isBlacklisted');
- }
-
- /**
* register hooks for sharing
*/
public static function registerShareHooks(\OC\SystemConfig $systemConfig) {
diff --git a/lib/l10n/fi.js b/lib/l10n/fi.js
index 24dec0603e9..59e0f701015 100644
--- a/lib/l10n/fi.js
+++ b/lib/l10n/fi.js
@@ -81,6 +81,7 @@ OC.L10N.register(
"Appearance and accessibility" : "Ulkoasu ja saavutettavuus",
"Apps" : "Sovellukset",
"Personal settings" : "Henkilökohtaiset asetukset",
+ "Administration settings" : "Ylläpitäjän asetukset",
"Settings" : "Asetukset",
"Log out" : "Kirjaudu ulos",
"Users" : "Käyttäjät",
diff --git a/lib/l10n/fi.json b/lib/l10n/fi.json
index b5394a1faa2..22e286684c5 100644
--- a/lib/l10n/fi.json
+++ b/lib/l10n/fi.json
@@ -79,6 +79,7 @@
"Appearance and accessibility" : "Ulkoasu ja saavutettavuus",
"Apps" : "Sovellukset",
"Personal settings" : "Henkilökohtaiset asetukset",
+ "Administration settings" : "Ylläpitäjän asetukset",
"Settings" : "Asetukset",
"Log out" : "Kirjaudu ulos",
"Users" : "Käyttäjät",
diff --git a/lib/l10n/zh_TW.js b/lib/l10n/zh_TW.js
index 57595b46556..d37d3ad1166 100644
--- a/lib/l10n/zh_TW.js
+++ b/lib/l10n/zh_TW.js
@@ -114,6 +114,10 @@ OC.L10N.register(
"Role" : "角色",
"Unknown user" : "未知的使用者",
"Additional settings" : "其他設定",
+ "Enter the database username and name for %s" : "輸入 %s 的資料庫名稱及使用者名稱",
+ "Enter the database username for %s" : "輸入 %s 的資料庫使用者暱稱",
+ "Enter the database name for %s" : "輸入 %s 的資料庫名稱",
+ "You cannot use dots in the database name %s" : "資料庫名稱 %s 不能包含小數點",
"MySQL username and/or password not valid" : "MySQL 使用者名稱或密碼不正確",
"You need to enter details of an existing account." : "您必須輸入現有帳號的資訊",
"Oracle connection could not be established" : "無法建立 Oracle 資料庫連線",
diff --git a/lib/l10n/zh_TW.json b/lib/l10n/zh_TW.json
index 20a8f86161b..9d2f50f9fa8 100644
--- a/lib/l10n/zh_TW.json
+++ b/lib/l10n/zh_TW.json
@@ -112,6 +112,10 @@
"Role" : "角色",
"Unknown user" : "未知的使用者",
"Additional settings" : "其他設定",
+ "Enter the database username and name for %s" : "輸入 %s 的資料庫名稱及使用者名稱",
+ "Enter the database username for %s" : "輸入 %s 的資料庫使用者暱稱",
+ "Enter the database name for %s" : "輸入 %s 的資料庫名稱",
+ "You cannot use dots in the database name %s" : "資料庫名稱 %s 不能包含小數點",
"MySQL username and/or password not valid" : "MySQL 使用者名稱或密碼不正確",
"You need to enter details of an existing account." : "您必須輸入現有帳號的資訊",
"Oracle connection could not be established" : "無法建立 Oracle 資料庫連線",
diff --git a/lib/private/Collaboration/Collaborators/MailPlugin.php b/lib/private/Collaboration/Collaborators/MailPlugin.php
index 8c2efce6f0d..d34d9fb0087 100644
--- a/lib/private/Collaboration/Collaborators/MailPlugin.php
+++ b/lib/private/Collaboration/Collaborators/MailPlugin.php
@@ -165,8 +165,8 @@ class MailPlugin implements ISearchPlugin {
if (!$this->isCurrentUser($cloud) && !$searchResult->hasResult($userType, $cloud->getUser())) {
$singleResult = [[
'label' => $displayName,
- 'uuid' => $contact['UID'],
- 'name' => $contact['FN'],
+ 'uuid' => $contact['UID'] ?? $emailAddress,
+ 'name' => $contact['FN'] ?? $displayName,
'value' => [
'shareType' => IShare::TYPE_USER,
'shareWith' => $cloud->getUser(),
@@ -205,8 +205,8 @@ class MailPlugin implements ISearchPlugin {
if ($addToWide && !$this->isCurrentUser($cloud) && !$searchResult->hasResult($userType, $cloud->getUser())) {
$userResults['wide'][] = [
'label' => $displayName,
- 'uuid' => $contact['UID'],
- 'name' => $contact['FN'],
+ 'uuid' => $contact['UID'] ?? $emailAddress,
+ 'name' => $contact['FN'] ?? $displayName,
'value' => [
'shareType' => IShare::TYPE_USER,
'shareWith' => $cloud->getUser(),
@@ -226,8 +226,8 @@ class MailPlugin implements ISearchPlugin {
}
$result['exact'][] = [
'label' => $displayName,
- 'uuid' => $contact['UID'],
- 'name' => $contact['FN'],
+ 'uuid' => $contact['UID'] ?? $emailAddress,
+ 'name' => $contact['FN'] ?? $displayName,
'type' => $emailAddressType ?? '',
'value' => [
'shareType' => IShare::TYPE_EMAIL,
@@ -237,8 +237,8 @@ class MailPlugin implements ISearchPlugin {
} else {
$result['wide'][] = [
'label' => $displayName,
- 'uuid' => $contact['UID'],
- 'name' => $contact['FN'],
+ 'uuid' => $contact['UID'] ?? $emailAddress,
+ 'name' => $contact['FN'] ?? $displayName,
'type' => $emailAddressType ?? '',
'value' => [
'shareType' => IShare::TYPE_EMAIL,
diff --git a/lib/private/ContactsManager.php b/lib/private/ContactsManager.php
index 68783e3f79b..9853701a2eb 100644
--- a/lib/private/ContactsManager.php
+++ b/lib/private/ContactsManager.php
@@ -148,24 +148,6 @@ class ContactsManager implements IManager {
}
/**
- * Return a list of the user's addressbooks display names
- * ! The addressBook displayName are not unique, please use getUserAddressBooks
- *
- * @return IAddressBook[]
- * @since 6.0.0
- * @deprecated 16.0.0 - Use `$this->getUserAddressBooks()` instead
- */
- public function getAddressBooks() {
- $this->loadAddressBooks();
- $result = [];
- foreach ($this->addressBooks as $addressBook) {
- $result[$addressBook->getKey()] = $addressBook->getDisplayName();
- }
-
- return $result;
- }
-
- /**
* Return a list of the user's addressbooks
*
* @return IAddressBook[]
diff --git a/lib/private/DB/ConnectionFactory.php b/lib/private/DB/ConnectionFactory.php
index 95f3185bcdb..1b0ac436364 100644
--- a/lib/private/DB/ConnectionFactory.php
+++ b/lib/private/DB/ConnectionFactory.php
@@ -233,6 +233,10 @@ class ConnectionFactory {
];
}
+ if ($this->config->getValue('dbpersistent', false)) {
+ $connectionParams['persistent'] = true;
+ }
+
return $connectionParams;
}
diff --git a/lib/private/Files/Cache/Propagator.php b/lib/private/Files/Cache/Propagator.php
index 2909e998bf9..4bf88a60843 100644
--- a/lib/private/Files/Cache/Propagator.php
+++ b/lib/private/Files/Cache/Propagator.php
@@ -24,16 +24,19 @@
namespace OC\Files\Cache;
+use Doctrine\DBAL\Exception\RetryableException;
use OC\Files\Storage\Wrapper\Encryption;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\Files\Cache\IPropagator;
use OCP\Files\Storage\IReliableEtagStorage;
use OCP\IDBConnection;
+use Psr\Log\LoggerInterface;
/**
* Propagate etags and mtimes within the storage
*/
class Propagator implements IPropagator {
+ public const MAX_RETRIES = 3;
private $inBatch = false;
private $batch = [];
@@ -100,35 +103,44 @@ class Propagator implements IPropagator {
$builder->set('etag', $builder->createNamedParameter($etag, IQueryBuilder::PARAM_STR));
}
- $builder->execute();
-
if ($sizeDifference !== 0) {
- // we need to do size separably so we can ignore entries with uncalculated size
- $builder = $this->connection->getQueryBuilder();
- $builder->update('filecache')
- ->set('size', $builder->func()->greatest(
- $builder->func()->add('size', $builder->createNamedParameter($sizeDifference)),
- $builder->createNamedParameter(-1, IQueryBuilder::PARAM_INT)
- ))
- ->where($builder->expr()->eq('storage', $builder->createNamedParameter($storageId, IQueryBuilder::PARAM_INT)))
- ->andWhere($builder->expr()->in('path_hash', $hashParams))
- ->andWhere($builder->expr()->gt('size', $builder->expr()->literal(-1, IQueryBuilder::PARAM_INT)));
+ $hasCalculatedSize = $builder->expr()->gt('size', $builder->expr()->literal(-1, IQUeryBuilder::PARAM_INT));
+ $sizeColumn = $builder->getColumnName('size');
+ $newSize = $builder->func()->greatest(
+ $builder->func()->add('size', $builder->createNamedParameter($sizeDifference)),
+ $builder->createNamedParameter(-1, IQueryBuilder::PARAM_INT)
+ );
+
+ // Only update if row had a previously calculated size
+ $builder->set('size', $builder->createFunction("CASE WHEN $hasCalculatedSize THEN $newSize ELSE $sizeColumn END"));
if ($this->storage->instanceOfStorage(Encryption::class)) {
// in case of encryption being enabled after some files are already uploaded, some entries will have an unencrypted_size of 0 and a non-zero size
- $eq = $builder->expr()->eq('unencrypted_size', $builder->expr()->literal(0, IQueryBuilder::PARAM_INT));
+ $hasUnencryptedSize = $builder->expr()->neq('unencrypted_size', $builder->expr()->literal(0, IQueryBuilder::PARAM_INT));
$sizeColumn = $builder->getColumnName('size');
$unencryptedSizeColumn = $builder->getColumnName('unencrypted_size');
- $builder->set('unencrypted_size', $builder->func()->greatest(
+ $newUnencryptedSize = $builder->func()->greatest(
$builder->func()->add(
- $builder->createFunction("CASE WHEN $eq THEN $unencryptedSizeColumn ELSE $sizeColumn END"),
+ $builder->createFunction("CASE WHEN $hasUnencryptedSize THEN $unencryptedSizeColumn ELSE $sizeColumn END"),
$builder->createNamedParameter($sizeDifference)
),
$builder->createNamedParameter(-1, IQueryBuilder::PARAM_INT)
- ));
+ );
+
+ // Only update if row had a previously calculated size
+ $builder->set('unencrypted_size', $builder->createFunction("CASE WHEN $hasCalculatedSize THEN $newUnencryptedSize ELSE $unencryptedSizeColumn END"));
}
+ }
- $builder->execute();
+ for ($i = 0; $i < self::MAX_RETRIES; $i++) {
+ try {
+ $builder->executeStatement();
+ break;
+ } catch (RetryableException $e) {
+ /** @var LoggerInterface $loggerInterface */
+ $loggerInterface = \OCP\Server::get(LoggerInterface::class);
+ $loggerInterface->warning('Retrying propagation query after retryable exception.', [ 'exception' => $e ]);
+ }
}
}
diff --git a/lib/private/Files/Filesystem.php b/lib/private/Files/Filesystem.php
index 9542666b03c..b9b9534b15f 100644
--- a/lib/private/Files/Filesystem.php
+++ b/lib/private/Files/Filesystem.php
@@ -489,25 +489,6 @@ class Filesystem {
}
/**
- * checks if a file is blacklisted for storage in the filesystem
- * Listens to write and rename hooks
- *
- * @param array $data from hook
- */
- public static function isBlacklisted($data) {
- if (isset($data['path'])) {
- $path = $data['path'];
- } elseif (isset($data['newpath'])) {
- $path = $data['newpath'];
- }
- if (isset($path)) {
- if (self::isFileBlacklisted($path)) {
- $data['run'] = false;
- }
- }
- }
-
- /**
* @param string $filename
* @return bool
*/
diff --git a/lib/private/Files/Storage/Local.php b/lib/private/Files/Storage/Local.php
index 2a7e30cada6..62a04292e23 100644
--- a/lib/private/Files/Storage/Local.php
+++ b/lib/private/Files/Storage/Local.php
@@ -166,6 +166,9 @@ class Local extends \OC\Files\Storage\Common {
public function stat($path) {
$fullPath = $this->getSourcePath($path);
clearstatcache(true, $fullPath);
+ if (!file_exists($fullPath)) {
+ return false;
+ }
$statResult = @stat($fullPath);
if (PHP_INT_SIZE === 4 && $statResult && !$this->is_dir($path)) {
$filesize = $this->filesize($path);
@@ -388,11 +391,15 @@ class Local extends \OC\Files\Storage\Common {
}
public function fopen($path, $mode) {
+ $sourcePath = $this->getSourcePath($path);
+ if (!file_exists($sourcePath) && $mode === 'r') {
+ return false;
+ }
$oldMask = umask($this->defUMask);
if (($mode === 'w' || $mode === 'w+') && $this->unlinkOnTruncate) {
$this->unlink($path);
}
- $result = fopen($this->getSourcePath($path), $mode);
+ $result = @fopen($sourcePath, $mode);
umask($oldMask);
return $result;
}
diff --git a/lib/private/Files/View.php b/lib/private/Files/View.php
index 294912e698b..986aecf556f 100644
--- a/lib/private/Files/View.php
+++ b/lib/private/Files/View.php
@@ -1003,7 +1003,17 @@ class View {
$this->logger->info('Trying to open a file with a mode other than "r" or "w" can cause severe performance issues with some backends', ['app' => 'core']);
}
- return $this->basicOperation('fopen', $path, $hooks, $mode);
+ $handle = $this->basicOperation('fopen', $path, $hooks, $mode);
+ if (!is_resource($handle) && $mode === 'r') {
+ // trying to read a file that isn't on disk, check if the cache is out of sync and rescan if needed
+ $mount = $this->getMount($path);
+ $internalPath = $mount->getInternalPath($this->getAbsolutePath($path));
+ $storage = $mount->getStorage();
+ if ($storage->getCache()->inCache($internalPath) && !$storage->file_exists($path)) {
+ $this->writeUpdate($storage, $internalPath);
+ }
+ }
+ return $handle;
}
/**
diff --git a/lib/public/Calendar/ICalendar.php b/lib/public/Calendar/ICalendar.php
index 0d08e2ba268..f1f2d5eb6f1 100644
--- a/lib/public/Calendar/ICalendar.php
+++ b/lib/public/Calendar/ICalendar.php
@@ -37,7 +37,7 @@ interface ICalendar {
* @return string defining the technical unique key
* @since 13.0.0
*/
- public function getKey();
+ public function getKey(): string;
/**
* @since 24.0.0
@@ -49,30 +49,30 @@ interface ICalendar {
* @return null|string
* @since 13.0.0
*/
- public function getDisplayName();
+ public function getDisplayName(): ?string;
/**
* Calendar color
* @return null|string
* @since 13.0.0
*/
- public function getDisplayColor();
+ public function getDisplayColor(): ?string;
/**
* @param string $pattern which should match within the $searchProperties
* @param array $searchProperties defines the properties within the query pattern should match
* @param array $options - optional parameters:
* ['timerange' => ['start' => new DateTime(...), 'end' => new DateTime(...)]]
- * @param integer|null $limit - limit number of search results
- * @param integer|null $offset - offset for paging of search results
+ * @param int|null $limit - limit number of search results
+ * @param int|null $offset - offset for paging of search results
* @return array an array of events/journals/todos which are arrays of key-value-pairs
* @since 13.0.0
*/
- public function search($pattern, array $searchProperties = [], array $options = [], $limit = null, $offset = null);
+ public function search(string $pattern, array $searchProperties = [], array $options = [], ?int $limit = null, ?int $offset = null): array;
/**
- * @return integer build up using \OCP\Constants
+ * @return int build up using \OCP\Constants
* @since 13.0.0
*/
- public function getPermissions();
+ public function getPermissions(): int;
}
diff --git a/lib/public/Collaboration/Reference/IReference.php b/lib/public/Collaboration/Reference/IReference.php
index 0155ae86dd8..31608b52cc5 100644
--- a/lib/public/Collaboration/Reference/IReference.php
+++ b/lib/public/Collaboration/Reference/IReference.php
@@ -98,7 +98,7 @@ interface IReference extends JsonSerializable {
/**
* @since 25.0.0
*/
- public function getUrl(): ?string;
+ public function getUrl(): string;
/**
* Set the reference specific rich object representation
diff --git a/lib/public/Collaboration/Reference/Reference.php b/lib/public/Collaboration/Reference/Reference.php
index 07da3399a1e..6b92a0fae52 100644
--- a/lib/public/Collaboration/Reference/Reference.php
+++ b/lib/public/Collaboration/Reference/Reference.php
@@ -149,8 +149,8 @@ class Reference implements IReference {
* @inheritdoc
* @since 25.0.0
*/
- public function getUrl(): ?string {
- return $this->url;
+ public function getUrl(): string {
+ return $this->url ?? $this->reference;
}
/**
diff --git a/lib/public/Contacts/IManager.php b/lib/public/Contacts/IManager.php
index 65be12c4c39..ce50f8d5b32 100644
--- a/lib/public/Contacts/IManager.php
+++ b/lib/public/Contacts/IManager.php
@@ -160,15 +160,6 @@ interface IManager {
public function register(\Closure $callable);
/**
- * Return a list of the user's addressbooks display names
- *
- * @return array
- * @since 6.0.0
- * @deprecated 16.0.0 - Use `$this->getUserAddressBooks()` instead
- */
- public function getAddressBooks();
-
- /**
* Return a list of the user's addressbooks
*
* @return \OCP\IAddressBook[]
diff --git a/lib/public/Util.php b/lib/public/Util.php
index 6cd3eaa7f85..1289f8ccff4 100644
--- a/lib/public/Util.php
+++ b/lib/public/Util.php
@@ -56,27 +56,6 @@ use bantu\IniGetWrapper\IniGetWrapper;
* @since 4.0.0
*/
class Util {
- /**
- * @deprecated 14.0.0 use \OCP\ILogger::DEBUG
- */
- public const DEBUG = 0;
- /**
- * @deprecated 14.0.0 use \OCP\ILogger::INFO
- */
- public const INFO = 1;
- /**
- * @deprecated 14.0.0 use \OCP\ILogger::WARN
- */
- public const WARN = 2;
- /**
- * @deprecated 14.0.0 use \OCP\ILogger::ERROR
- */
- public const ERROR = 3;
- /**
- * @deprecated 14.0.0 use \OCP\ILogger::FATAL
- */
- public const FATAL = 4;
-
/** @var \OCP\Share\IManager */
private static $shareManager;
diff --git a/ocs/v1.php b/ocs/v1.php
index 9f6a05ac42f..3fba48b13c8 100644
--- a/ocs/v1.php
+++ b/ocs/v1.php
@@ -35,6 +35,7 @@ if (\OCP\Util::needUpgrade()
// since the behavior of apps or remotes are unpredictable during
// an upgrade, return a 503 directly
http_response_code(503);
+ header('X-Nextcloud-Maintenance-Mode: 1');
$response = new \OC\OCS\Result(null, 503, 'Service unavailable');
OC_API::respond($response, OC_API::requestedFormat());
exit;
diff --git a/tests/lib/ContactsManagerTest.php b/tests/lib/ContactsManagerTest.php
index 70e8dd74a1e..c02a95a4162 100644
--- a/tests/lib/ContactsManagerTest.php
+++ b/tests/lib/ContactsManagerTest.php
@@ -232,9 +232,9 @@ class ContactsManagerTest extends \Test\TestCase {
// register the address book
$this->cm->registerAddressBook($addressbook);
- $all_books = $this->cm->getAddressBooks();
+ $all_books = $this->cm->getUserAddressBooks();
$this->assertEquals(1, count($all_books));
- $this->assertEquals('A very simple Addressbook', $all_books['SIMPLE_ADDRESS_BOOK']);
+ $this->assertEquals($addressbook, $all_books['SIMPLE_ADDRESS_BOOK']);
}
}
diff --git a/tests/lib/Files/ViewTest.php b/tests/lib/Files/ViewTest.php
index 86101d79a1e..2189e7c09f4 100644
--- a/tests/lib/Files/ViewTest.php
+++ b/tests/lib/Files/ViewTest.php
@@ -2709,4 +2709,23 @@ class ViewTest extends \Test\TestCase {
$this->assertEquals(25, $info->getUploadTime());
$this->assertEquals(0, $info->getCreationTime());
}
+
+ public function testFopenGone() {
+ $storage = new Temporary([]);
+ $scanner = $storage->getScanner();
+ $storage->file_put_contents('foo.txt', 'bar');
+ $scanner->scan('');
+ $cache = $storage->getCache();
+
+ Filesystem::mount($storage, [], '/test/');
+ $view = new View('/test');
+
+ $storage->unlink('foo.txt');
+
+ $this->assertTrue($cache->inCache('foo.txt'));
+
+ $this->assertFalse($view->fopen('foo.txt', 'r'));
+
+ $this->assertFalse($cache->inCache('foo.txt'));
+ }
}