mirror of
https://github.com/nextcloud/server.git
synced 2026-02-27 18:37:17 +01:00
fix(files_sharing): adjust IAttributes API and files_versions
Signed-off-by: skjnldsv <skjnldsv@protonmail.com>
This commit is contained in:
@@ -128,7 +128,7 @@
|
||||
for (const i in this.attributes.shareAttributes) {
|
||||
const attr = this.attributes.shareAttributes[i]
|
||||
if (attr.scope === 'permissions' && attr.key === 'download') {
|
||||
return attr.enabled
|
||||
return attr.value === true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ const isDownloadable = function(node: Node) {
|
||||
if (node.attributes['mount-type'] === 'shared') {
|
||||
const shareAttributes = JSON.parse(node.attributes['share-attributes'] ?? 'null')
|
||||
const downloadAttribute = shareAttributes?.find?.((attribute: { scope: string; key: string }) => attribute.scope === 'permissions' && attribute.key === 'download')
|
||||
if (downloadAttribute !== undefined && downloadAttribute.enabled === false) {
|
||||
if (downloadAttribute !== undefined && downloadAttribute.value === false) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,7 +24,7 @@ export const getQueue = () => {
|
||||
}
|
||||
|
||||
type ShareAttribute = {
|
||||
enabled: boolean
|
||||
value: any
|
||||
key: string
|
||||
scope: string
|
||||
}
|
||||
@@ -48,7 +48,7 @@ export const canMove = (nodes: Node[]) => {
|
||||
export const canDownload = (nodes: Node[]) => {
|
||||
return nodes.every(node => {
|
||||
const shareAttributes = JSON.parse(node.attributes?.['share-attributes'] ?? '[]') as Array<ShareAttribute>
|
||||
return !shareAttributes.some(attribute => attribute.scope === 'permissions' && attribute.enabled === false && attribute.key === 'download')
|
||||
return !shareAttributes.some(attribute => attribute.scope === 'permissions' && attribute.value === false && attribute.key === 'download')
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
@@ -396,14 +396,14 @@ export default defineComponent({
|
||||
return { ...this.$route, query: { dir } }
|
||||
},
|
||||
|
||||
shareAttributes(): number[] | undefined {
|
||||
shareTypesAttributes(): number[] | undefined {
|
||||
if (!this.currentFolder?.attributes?.['share-types']) {
|
||||
return undefined
|
||||
}
|
||||
return Object.values(this.currentFolder?.attributes?.['share-types'] || {}).flat() as number[]
|
||||
},
|
||||
shareButtonLabel() {
|
||||
if (!this.shareAttributes) {
|
||||
if (!this.shareTypesAttributes) {
|
||||
return t('files', 'Share')
|
||||
}
|
||||
|
||||
@@ -413,12 +413,12 @@ export default defineComponent({
|
||||
return t('files', 'Shared')
|
||||
},
|
||||
shareButtonType(): Type | null {
|
||||
if (!this.shareAttributes) {
|
||||
if (!this.shareTypesAttributes) {
|
||||
return null
|
||||
}
|
||||
|
||||
// If all types are links, show the link icon
|
||||
if (this.shareAttributes.some(type => type === Type.SHARE_TYPE_LINK)) {
|
||||
if (this.shareTypesAttributes.some(type => type === Type.SHARE_TYPE_LINK)) {
|
||||
return Type.SHARE_TYPE_LINK
|
||||
}
|
||||
|
||||
|
||||
@@ -1055,7 +1055,7 @@ class ShareAPIController extends OCSController {
|
||||
}
|
||||
|
||||
if (!($node->getPermissions() & Constants::PERMISSION_SHARE)) {
|
||||
throw new SharingRightsException('no sharing rights on this item');
|
||||
throw new SharingRightsException($this->l->t('no sharing rights on this item'));
|
||||
}
|
||||
|
||||
// The current top parent we have access to
|
||||
@@ -1171,7 +1171,7 @@ class ShareAPIController extends OCSController {
|
||||
}
|
||||
|
||||
if (!$this->canEditShare($share)) {
|
||||
throw new OCSForbiddenException('You are not allowed to edit incoming shares');
|
||||
throw new OCSForbiddenException($this->l->t('You are not allowed to edit incoming shares'));
|
||||
}
|
||||
|
||||
if (
|
||||
@@ -1218,7 +1218,7 @@ class ShareAPIController extends OCSController {
|
||||
*/
|
||||
|
||||
if ($share->getSharedBy() !== $this->currentUser) {
|
||||
throw new OCSForbiddenException('You are not allowed to edit link shares that you don\'t own');
|
||||
throw new OCSForbiddenException($this->l->t('You are not allowed to edit link shares that you don\'t own'));
|
||||
}
|
||||
|
||||
// Update hide download state
|
||||
@@ -1640,7 +1640,7 @@ class ShareAPIController extends OCSController {
|
||||
// Make sure it expires at midnight in owner timezone
|
||||
$date->setTime(0, 0, 0);
|
||||
} catch (\Exception $e) {
|
||||
throw new \Exception('Invalid date. Format must be YYYY-MM-DD');
|
||||
throw new \Exception($this->l->t('Invalid date. Format must be YYYY-MM-DD'));
|
||||
}
|
||||
|
||||
return $date;
|
||||
@@ -1845,7 +1845,7 @@ class ShareAPIController extends OCSController {
|
||||
*/
|
||||
private function confirmSharingRights(Node $node): void {
|
||||
if (!$this->hasResharingRights($this->currentUser, $node)) {
|
||||
throw new SharingRightsException('no sharing rights on this item');
|
||||
throw new SharingRightsException($this->l->t('No sharing rights on this item'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2008,13 +2008,6 @@ class ShareAPIController extends OCSController {
|
||||
$formattedShareAttributes = \json_decode($attributesString, true);
|
||||
if (is_array($formattedShareAttributes)) {
|
||||
foreach ($formattedShareAttributes as $formattedAttr) {
|
||||
// Legacy handling of the 'enabled' attribute
|
||||
if (array_key_exists('enabled', $formattedAttr)) {
|
||||
$formattedAttr['value'] = is_string($formattedAttr['enabled'])
|
||||
? (bool) \json_decode($formattedAttr['enabled'])
|
||||
: $formattedAttr['enabled'];
|
||||
}
|
||||
|
||||
$newShareAttributes->setAttribute(
|
||||
$formattedAttr['scope'],
|
||||
$formattedAttr['key'],
|
||||
@@ -2022,7 +2015,7 @@ class ShareAPIController extends OCSController {
|
||||
);
|
||||
}
|
||||
} else {
|
||||
throw new OCSBadRequestException('Invalid share attributes provided: \"' . $attributesString . '\"');
|
||||
throw new OCSBadRequestException($this->l->t('Invalid share attributes provided: "%s"', [$attributesString]));
|
||||
}
|
||||
}
|
||||
$share->setAttributes($newShareAttributes);
|
||||
@@ -2044,10 +2037,10 @@ class ShareAPIController extends OCSController {
|
||||
if ($storage instanceof Wrapper) {
|
||||
$storage = $storage->getInstanceOfStorage(SharedStorage::class);
|
||||
if ($storage === null) {
|
||||
throw new \RuntimeException('Should not happen, instanceOfStorage but getInstanceOfStorage return null');
|
||||
throw new \RuntimeException($this->l->t('Should not happen, instanceOfStorage but getInstanceOfStorage return null'));
|
||||
}
|
||||
} else {
|
||||
throw new \RuntimeException('Should not happen, instanceOfStorage but not a wrapper');
|
||||
throw new \RuntimeException($this->l->t('Should not happen, instanceOfStorage but not a wrapper'));
|
||||
}
|
||||
/** @var \OCA\Files_Sharing\SharedStorage $storage */
|
||||
$inheritedAttributes = $storage->getShare()->getAttributes();
|
||||
@@ -2085,7 +2078,7 @@ class ShareAPIController extends OCSController {
|
||||
}
|
||||
|
||||
if (!$this->canEditShare($share)) {
|
||||
throw new OCSForbiddenException('You are not allowed to send mail notifications');
|
||||
throw new OCSForbiddenException($this->l->t('You are not allowed to send mail notifications'));
|
||||
}
|
||||
|
||||
// For mail and link shares, the user must be
|
||||
@@ -2093,7 +2086,7 @@ class ShareAPIController extends OCSController {
|
||||
if ($share->getShareType() === IShare::TYPE_EMAIL
|
||||
|| $share->getShareType() === IShare::TYPE_LINK) {
|
||||
if ($share->getSharedBy() !== $this->currentUser) {
|
||||
throw new OCSForbiddenException('You are not allowed to send mail notifications');
|
||||
throw new OCSForbiddenException($this->l->t('You are not allowed to send mail notifications'));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -960,7 +960,7 @@ class ApiTest extends TestCase {
|
||||
$ocs = $this->createOCS(self::TEST_FILES_SHARING_API_USER1);
|
||||
$ocs->updateShare(
|
||||
$share1->getId(), 1, null, null, null, null, null, null, null,
|
||||
'[{"scope": "app1", "key": "attr1", "enabled": true}]'
|
||||
'[{"scope": "app1", "key": "attr1", "value": true}]'
|
||||
);
|
||||
$ocs->cleanup();
|
||||
|
||||
|
||||
@@ -259,7 +259,7 @@ export default defineComponent({
|
||||
const downloadAttribute = this.fileInfo.shareAttributes
|
||||
.find((attribute) => attribute.scope === 'permissions' && attribute.key === 'download') || {}
|
||||
// If the download attribute is set to false, the file is not downloadable
|
||||
if (downloadAttribute?.enabled === false) {
|
||||
if (downloadAttribute?.value === false) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
@@ -286,7 +286,7 @@ trait Sharing {
|
||||
}
|
||||
|
||||
if ($viewOnly === true) {
|
||||
$body['attributes'] = json_encode([['scope' => 'permissions', 'key' => 'download', 'enabled' => false]]);
|
||||
$body['attributes'] = json_encode([['scope' => 'permissions', 'key' => 'download', 'value' => false]]);
|
||||
}
|
||||
|
||||
$options['form_params'] = $body;
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
for (const i in this.shareAttributes) {
|
||||
const attr = this.shareAttributes[i]
|
||||
if (attr.scope === 'permissions' && attr.key === 'download') {
|
||||
return attr.enabled
|
||||
return attr.value === true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,8 @@ export function createShare(fileName: string, username: string, shareSettings: P
|
||||
export function updateShare(fileName: string, index: number, shareSettings: Partial<ShareSetting> = {}) {
|
||||
openSharingPanel(fileName)
|
||||
|
||||
cy.intercept({ times: 1, method: 'PUT', url: '**/apps/files_sharing/api/v1/shares/*' }).as('updateShare')
|
||||
|
||||
cy.get('#app-sidebar-vue').within(() => {
|
||||
cy.get('[data-cy-files-sharing-share-actions]').eq(index).click()
|
||||
cy.get('[data-cy-files-sharing-share-permissions-bundle="custom"]').click()
|
||||
@@ -82,6 +84,8 @@ export function updateShare(fileName: string, index: number, shareSettings: Part
|
||||
}
|
||||
|
||||
cy.get('[data-cy-files-sharing-share-editor-action="save"]').click({ scrollBehavior: 'nearest' })
|
||||
|
||||
cy.wait('@updateShare')
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
*/
|
||||
/* eslint-disable jsdoc/require-jsdoc */
|
||||
import type { User } from '@nextcloud/cypress'
|
||||
import path from 'path'
|
||||
import { createShare, type ShareSetting } from '../files_sharing/filesSharingUtils'
|
||||
|
||||
export const uploadThreeVersions = (user: User, fileName: string) => {
|
||||
|
||||
4
dist/files_versions-files_versions.js
vendored
4
dist/files_versions-files_versions.js
vendored
File diff suppressed because one or more lines are too long
2
dist/files_versions-files_versions.js.map
vendored
2
dist/files_versions-files_versions.js.map
vendored
File diff suppressed because one or more lines are too long
@@ -20,7 +20,7 @@ class ShareAttributes implements IAttributes {
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function setAttribute($scope, $key, $value) {
|
||||
public function setAttribute(string $scope, string $key, mixed $value): IAttributes {
|
||||
if (!\array_key_exists($scope, $this->attributes)) {
|
||||
$this->attributes[$scope] = [];
|
||||
}
|
||||
@@ -31,7 +31,7 @@ class ShareAttributes implements IAttributes {
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function getAttribute($scope, $key) {
|
||||
public function getAttribute(string $scope, string $key): mixed {
|
||||
if (\array_key_exists($scope, $this->attributes) &&
|
||||
\array_key_exists($key, $this->attributes[$scope])) {
|
||||
return $this->attributes[$scope][$key];
|
||||
@@ -42,14 +42,14 @@ class ShareAttributes implements IAttributes {
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
public function toArray() {
|
||||
public function toArray(): array {
|
||||
$result = [];
|
||||
foreach ($this->attributes as $scope => $keys) {
|
||||
foreach ($keys as $key => $value) {
|
||||
$result[] = [
|
||||
"scope" => $scope,
|
||||
"key" => $key,
|
||||
"value" => $value
|
||||
"value" => $value,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace OCP\Share;
|
||||
*/
|
||||
interface IAttributes {
|
||||
/**
|
||||
* Sets an attribute enabled/disabled. If the key did not exist before it will be created.
|
||||
* Sets an attribute. If the key did not exist before it will be created.
|
||||
*
|
||||
* @param string $scope scope
|
||||
* @param string $key key
|
||||
@@ -21,10 +21,10 @@ interface IAttributes {
|
||||
* @return IAttributes The modified object
|
||||
* @since 25.0.0
|
||||
*/
|
||||
public function setAttribute($scope, $key, $value);
|
||||
public function setAttribute(string $scope, string $key, mixed $value): IAttributes;
|
||||
|
||||
/**
|
||||
* Returns if attribute is enabled/disabled for given scope id and key.
|
||||
* Returns the attribute for given scope id and key.
|
||||
* If attribute does not exist, returns null
|
||||
*
|
||||
* @param string $scope scope
|
||||
@@ -32,7 +32,7 @@ interface IAttributes {
|
||||
* @return bool|string|array|null
|
||||
* @since 25.0.0
|
||||
*/
|
||||
public function getAttribute($scope, $key);
|
||||
public function getAttribute(string $scope, string $key): mixed;
|
||||
|
||||
/**
|
||||
* Formats the IAttributes object to array with the following format:
|
||||
@@ -40,13 +40,14 @@ interface IAttributes {
|
||||
* 0 => [
|
||||
* "scope" => <string>,
|
||||
* "key" => <string>,
|
||||
* "enabled" => <bool>
|
||||
* "value" => <bool|string|array|null>,
|
||||
* ],
|
||||
* ...
|
||||
* ]
|
||||
*
|
||||
* @return array formatted IAttributes
|
||||
* @since 25.0.0
|
||||
* @since 30.0.0, `enabled` was renamed to `value`
|
||||
*/
|
||||
public function toArray();
|
||||
public function toArray(): array;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user