From b40e85cae8990020d73f2500a0e94b59987efbeb Mon Sep 17 00:00:00 2001 From: fenn-cs Date: Wed, 18 Sep 2024 12:17:22 +0100 Subject: [PATCH] wip Signed-off-by: fenn-cs --- apps/dav/lib/Connector/Sabre/FilesPlugin.php | 6 ++++++ apps/files/src/components/VirtualList.vue | 2 ++ .../src/actions/sharingStatusAction.ts | 20 ++++++++++++++++++- .../src/services/SharingService.ts | 2 +- .../src/views/SharingDetailsTab.vue | 13 ++++++++++++ core/src/files/client.js | 14 ++++++++++++- lib/private/User/LazyUser.php | 14 +++++++++++++ lib/private/User/User.php | 5 +++++ lib/public/IUser.php | 8 ++++++++ 9 files changed, 81 insertions(+), 3 deletions(-) diff --git a/apps/dav/lib/Connector/Sabre/FilesPlugin.php b/apps/dav/lib/Connector/Sabre/FilesPlugin.php index 4fed12e6569df..b6ffde7fb8c68 100644 --- a/apps/dav/lib/Connector/Sabre/FilesPlugin.php +++ b/apps/dav/lib/Connector/Sabre/FilesPlugin.php @@ -81,6 +81,7 @@ class FilesPlugin extends ServerPlugin { public const MOUNT_TYPE_PROPERTYNAME = '{http://nextcloud.org/ns}mount-type'; public const MOUNT_ROOT_PROPERTYNAME = '{http://nextcloud.org/ns}is-mount-root'; public const IS_ENCRYPTED_PROPERTYNAME = '{http://nextcloud.org/ns}is-encrypted'; + public const IS_FEDERATED_PROPERTYNAME = '{http://nextcloud.org/ns}is-federated'; public const METADATA_ETAG_PROPERTYNAME = '{http://nextcloud.org/ns}metadata_etag'; public const UPLOAD_TIME_PROPERTYNAME = '{http://nextcloud.org/ns}upload_time'; public const CREATION_TIME_PROPERTYNAME = '{http://nextcloud.org/ns}creation_time'; @@ -149,6 +150,7 @@ public function initialize(Server $server) { $server->protectedProperties[] = self::HAS_PREVIEW_PROPERTYNAME; $server->protectedProperties[] = self::MOUNT_TYPE_PROPERTYNAME; $server->protectedProperties[] = self::IS_ENCRYPTED_PROPERTYNAME; + $server->protectedProperties[] = self::IS_FEDERATED_PROPERTYNAME; $server->protectedProperties[] = self::SHARE_NOTE; // normally these cannot be changed (RFC4918), but we want them modifiable through PROPPATCH @@ -413,6 +415,10 @@ public function handleGetProperties(PropFind $propFind, \Sabre\DAV\INode $node) $propFind->handle(self::DISPLAYNAME_PROPERTYNAME, function () use ($node) { return $node->getName(); }); + + $propFind->handle(self::IS_FEDERATED_PROPERTYNAME, function () use ($node) { + return $node->getOwner()->isFederated(); + }); } if ($node instanceof \OCA\DAV\Connector\Sabre\File) { diff --git a/apps/files/src/components/VirtualList.vue b/apps/files/src/components/VirtualList.vue index c0794ffc7a704..4c8fe42fa42be 100644 --- a/apps/files/src/components/VirtualList.vue +++ b/apps/files/src/components/VirtualList.vue @@ -168,10 +168,12 @@ export default Vue.extend({ } const items = this.dataSources.slice(this.startIndex, this.startIndex + this.shownItems) as Node[] + console.log("Items list", items) const oldItems = items.filter(item => Object.values(this.$_recycledPool).includes(item[this.dataKey])) const oldItemsKeys = oldItems.map(item => item[this.dataKey] as string) const unusedKeys = Object.keys(this.$_recycledPool).filter(key => !oldItemsKeys.includes(this.$_recycledPool[key])) + console.log("Unused keys", unusedKeys) return items.map(item => { const index = Object.values(this.$_recycledPool).indexOf(item[this.dataKey]) diff --git a/apps/files_sharing/src/actions/sharingStatusAction.ts b/apps/files_sharing/src/actions/sharingStatusAction.ts index e8d643595c9b2..ea9a6648a1299 100644 --- a/apps/files_sharing/src/actions/sharingStatusAction.ts +++ b/apps/files_sharing/src/actions/sharingStatusAction.ts @@ -34,6 +34,22 @@ import { generateAvatarSvg } from '../utils/AccountIcon.ts' import './sharingStatusAction.scss' +<<<<<<< Updated upstream +======= +const isDarkMode = window?.matchMedia?.('(prefers-color-scheme: dark)')?.matches === true + || document.querySelector('[data-themes*=dark]') !== null + +const generateAvatarSvg = (userId: string, isGuest = false) => { + console.debug("USER ID, is Guest", userId, isGuest) + const url = isDarkMode ? '/avatar/{userId}/32/dark' : '/avatar/{userId}/32' + const avatarUrl = generateUrl(isGuest ? url : url + '?guestFallback=true', { userId }) + return `` +} + +>>>>>>> Stashed changes const isExternal = (node: Node) => { return node.attributes.remote_id !== undefined } @@ -100,7 +116,9 @@ export const action = new FileAction({ const ownerId = node?.attributes?.['owner-id'] if (ownerId && (ownerId !== getCurrentUser()?.uid || isExternal(node))) { - return generateAvatarSvg(ownerId, isExternal(node)) + console.debug("IS EXTERNAL", isExternal(node)) + console.debug("EXTENAL NODE", node) + return generateAvatarSvg(ownerId, true) } return AccountPlusSvg diff --git a/apps/files_sharing/src/services/SharingService.ts b/apps/files_sharing/src/services/SharingService.ts index 11989bdb8a9ac..b5d61eb0e7980 100644 --- a/apps/files_sharing/src/services/SharingService.ts +++ b/apps/files_sharing/src/services/SharingService.ts @@ -85,7 +85,7 @@ const ocsEntryToNode = async function(ocsEntry: any): Promise (ocsEntry?.item_mtime || 0)) { + if (ocsEntry?.stime > (ocsEntry?.item_mtime || 0)) {ocsEntryToNode mtime = new Date((ocsEntry.stime) * 1000) } diff --git a/apps/files_sharing/src/views/SharingDetailsTab.vue b/apps/files_sharing/src/views/SharingDetailsTab.vue index e8b17c4f11007..6b1f2d9f97a7a 100644 --- a/apps/files_sharing/src/views/SharingDetailsTab.vue +++ b/apps/files_sharing/src/views/SharingDetailsTab.vue @@ -880,8 +880,21 @@ export default { } await this.getNode() + console.log("Newly fetched", this.node) emit('files:node:updated', this.node) +<<<<<<< Updated upstream +======= + if (this.$refs.externalLinkActions?.length > 0) { + await Promise.allSettled(this.$rethis.nodefs.externalLinkActions.map((action) => { + if (typeof action.$children.at(0)?.onSave !== 'function') { + return Promise.resolve() + } + return action.$children.at(0)?.onSave?.() + })) + } + +>>>>>>> Stashed changes this.$emit('close-sharing-details') }, /** diff --git a/core/src/files/client.js b/core/src/files/client.js index 9d32fefdfc4c6..cbcb26e43330a 100644 --- a/core/src/files/client.js +++ b/core/src/files/client.js @@ -103,6 +103,7 @@ import escapeHTML from 'escape-html' Client.PROPERTY_SIZE = '{' + Client.NS_OWNCLOUD + '}size' Client.PROPERTY_GETCONTENTLENGTH = '{' + Client.NS_DAV + '}getcontentlength' Client.PROPERTY_ISENCRYPTED = '{' + Client.NS_DAV + '}is-encrypted' + Client.PROPERTY_ISFEDERATED = '{' + Client.NS_DAV + '}is-federated' Client.PROPERTY_SHARE_PERMISSIONS = '{' + Client.NS_OCS + '}share-permissions' Client.PROPERTY_SHARE_ATTRIBUTES = '{' + Client.NS_NEXTCLOUD + '}share-attributes' Client.PROPERTY_QUOTA_AVAILABLE_BYTES = '{' + Client.NS_DAV + '}quota-available-bytes' @@ -157,6 +158,10 @@ import escapeHTML from 'escape-html' * Encryption state */ [Client.NS_NEXTCLOUD, 'is-encrypted'], + /** + * Federation state + */ + [Client.NS_NEXTCLOUD, 'is-federated'], /** * Share permissions */ @@ -303,7 +308,7 @@ import escapeHTML from 'escape-html' * * @returns {Array.} array of file info */ - _parseFileInfo: function(response) { + _parseFileInfo: function(response) {Encrypted let path = decodeURIComponent(response.href) if (path.substr(0, this._root.length) === this._root) { path = path.substr(this._root.length) @@ -355,6 +360,13 @@ import escapeHTML from 'escape-html' data.isEncrypted = false } + const isFederatedProp = props['{' + Client.NS_NEXTCLOUD + '}is-federated'] + if (!_.isUndefined(isFederatedProp)) { + data.isFederated = isFederatedProp === '1' + } else { + data.isFederated = false + } + const isFavouritedProp = props['{' + Client.NS_OWNCLOUD + '}favorite'] if (!_.isUndefined(isFavouritedProp)) { data.isFavourited = isFavouritedProp === '1' diff --git a/lib/private/User/LazyUser.php b/lib/private/User/LazyUser.php index 396d3c252f11d..357d5c405a7b3 100644 --- a/lib/private/User/LazyUser.php +++ b/lib/private/User/LazyUser.php @@ -51,6 +51,11 @@ private function getUser(): IUser { $this->user = $this->userManager->get($this->uid); } } + + if($this->user === null) { + throw new \Exception('User not found'); + } + /** @var IUser */ $user = $this->user; return $user; @@ -167,4 +172,13 @@ public function getManagerUids(): array { public function setManagerUids(array $uids): void { $this->getUser()->setManagerUids($uids); } + + public function isFederated(): bool { + try { + $this->getUser(); + return true; + } catch (\Exception $e) { + return false; + } + } } diff --git a/lib/private/User/User.php b/lib/private/User/User.php index 580c590e6eb54..6a647514e53d0 100644 --- a/lib/private/User/User.php +++ b/lib/private/User/User.php @@ -618,4 +618,9 @@ public function triggerChange($feature, $value = null, $oldValue = null) { $this->emitter->emit('\OC\User', 'changeUser', [$this, $feature, $value, $oldValue]); } } + + public function isFederated(): bool { + // Federated users only use LazyUser + return false; + } } diff --git a/lib/public/IUser.php b/lib/public/IUser.php index b326e6192c0c2..61ecb5d2f2107 100644 --- a/lib/public/IUser.php +++ b/lib/public/IUser.php @@ -287,4 +287,12 @@ public function getManagerUids(): array; * @since 27.0.0 */ public function setManagerUids(array $uids): void; + + /** + * Check if the user is federated (from another server) + * + * @return boll + * @since 28.0.11 + */ + public function isFederated(): bool; }