Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ node_modules/
!/apps/provisioning_api
!/apps/settings
!/apps/sharebymail
!/apps/sharing
!/apps/systemtags
!/apps/testing
!/apps/updatenotification
Expand Down
2 changes: 1 addition & 1 deletion REUSE.toml
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ SPDX-FileCopyrightText = "2019 Fabian Wiktor <https://www.pexels.com/photo/green
SPDX-License-Identifier = "CC0-1.0"

[[annotations]]
path = ["openapi.json", ".envrc", "flake.nix", "flake.lock", "build/eslint-baseline.json", "build/eslint-baseline-legacy.json"]
path = ["openapi.json", ".envrc", "flake.nix", "flake.lock", "build/eslint-baseline.json", "build/eslint-baseline-legacy.json", "apps/sharing/openapi.json"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2025 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"
7 changes: 7 additions & 0 deletions apps/files/composer/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -98,4 +98,11 @@
'OCA\\Files\\Service\\ViewConfig' => $baseDir . '/../lib/Service/ViewConfig.php',
'OCA\\Files\\Settings\\AdminSettings' => $baseDir . '/../lib/Settings/AdminSettings.php',
'OCA\\Files\\Settings\\PersonalSettings' => $baseDir . '/../lib/Settings/PersonalSettings.php',
'OCA\\Files\\Sharing\\Permission\\NodeCreateSharePermissionType' => $baseDir . '/../lib/Sharing/Permission/NodeCreateSharePermissionType.php',
'OCA\\Files\\Sharing\\Permission\\NodeDeleteSharePermissionType' => $baseDir . '/../lib/Sharing/Permission/NodeDeleteSharePermissionType.php',
'OCA\\Files\\Sharing\\Permission\\NodeDownloadSharePermissionType' => $baseDir . '/../lib/Sharing/Permission/NodeDownloadSharePermissionType.php',
'OCA\\Files\\Sharing\\Permission\\NodeReadSharePermissionType' => $baseDir . '/../lib/Sharing/Permission/NodeReadSharePermissionType.php',
'OCA\\Files\\Sharing\\Permission\\NodeUpdateSharePermissionType' => $baseDir . '/../lib/Sharing/Permission/NodeUpdateSharePermissionType.php',
'OCA\\Files\\Sharing\\Property\\NodeGridViewSharePropertyType' => $baseDir . '/../lib/Sharing/Property/NodeGridViewSharePropertyType.php',
'OCA\\Files\\Sharing\\Source\\NodeShareSourceType' => $baseDir . '/../lib/Sharing/Source/NodeShareSourceType.php',
);
7 changes: 7 additions & 0 deletions apps/files/composer/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,13 @@ class ComposerStaticInitFiles
'OCA\\Files\\Service\\ViewConfig' => __DIR__ . '/..' . '/../lib/Service/ViewConfig.php',
'OCA\\Files\\Settings\\AdminSettings' => __DIR__ . '/..' . '/../lib/Settings/AdminSettings.php',
'OCA\\Files\\Settings\\PersonalSettings' => __DIR__ . '/..' . '/../lib/Settings/PersonalSettings.php',
'OCA\\Files\\Sharing\\Permission\\NodeCreateSharePermissionType' => __DIR__ . '/..' . '/../lib/Sharing/Permission/NodeCreateSharePermissionType.php',
'OCA\\Files\\Sharing\\Permission\\NodeDeleteSharePermissionType' => __DIR__ . '/..' . '/../lib/Sharing/Permission/NodeDeleteSharePermissionType.php',
'OCA\\Files\\Sharing\\Permission\\NodeDownloadSharePermissionType' => __DIR__ . '/..' . '/../lib/Sharing/Permission/NodeDownloadSharePermissionType.php',
'OCA\\Files\\Sharing\\Permission\\NodeReadSharePermissionType' => __DIR__ . '/..' . '/../lib/Sharing/Permission/NodeReadSharePermissionType.php',
'OCA\\Files\\Sharing\\Permission\\NodeUpdateSharePermissionType' => __DIR__ . '/..' . '/../lib/Sharing/Permission/NodeUpdateSharePermissionType.php',
'OCA\\Files\\Sharing\\Property\\NodeGridViewSharePropertyType' => __DIR__ . '/..' . '/../lib/Sharing/Property/NodeGridViewSharePropertyType.php',
'OCA\\Files\\Sharing\\Source\\NodeShareSourceType' => __DIR__ . '/..' . '/../lib/Sharing/Source/NodeShareSourceType.php',
);

public static function getInitializer(ClassLoader $loader)
Expand Down
45 changes: 45 additions & 0 deletions apps/files/lib/AppInfo/Application.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,13 @@

namespace OCA\Files\AppInfo;

use OC\Core\Sharing\Permission\EditSharePermissionPreset;
use OC\Core\Sharing\Permission\ViewSharePermissionPreset;
use OC\Core\Sharing\Property\ExpirationDateSharePropertyType;
use OC\Core\Sharing\Property\LabelSharePropertyType;
use OC\Core\Sharing\Property\NoteSharePropertyType;
use OC\Core\Sharing\Property\PasswordSharePropertyType;
use OC\Core\Sharing\Recipient\TokenShareRecipientType;
use OCA\Files\AdvancedCapabilities;
use OCA\Files\Capabilities;
use OCA\Files\Collaboration\Resources\Listener;
Expand All @@ -28,6 +35,13 @@
use OCA\Files\Listener\UserFirstTimeLoggedInListener;
use OCA\Files\Notification\Notifier;
use OCA\Files\Search\FilesSearchProvider;
use OCA\Files\Sharing\Permission\NodeCreateSharePermissionType;
use OCA\Files\Sharing\Permission\NodeDeleteSharePermissionType;
use OCA\Files\Sharing\Permission\NodeDownloadSharePermissionType;
use OCA\Files\Sharing\Permission\NodeReadSharePermissionType;
use OCA\Files\Sharing\Permission\NodeUpdateSharePermissionType;
use OCA\Files\Sharing\Property\NodeGridViewSharePropertyType;
use OCA\Files\Sharing\Source\NodeShareSourceType;
use OCP\AppFramework\App;
use OCP\AppFramework\Bootstrap\IBootContext;
use OCP\AppFramework\Bootstrap\IBootstrap;
Expand All @@ -42,9 +56,11 @@
use OCP\Files\Events\NodeAddedToFavorite;
use OCP\Files\Events\NodeRemovedFromFavorite;
use OCP\Interaction\RestrictInteractionEvent;
use OCP\Server;
use OCP\Share\Events\ShareCreatedEvent;
use OCP\Share\Events\ShareDeletedEvent;
use OCP\Share\Events\ShareDeletedFromSelfEvent;
use OCP\Sharing\ISharingRegistry;
use OCP\User\Events\UserFirstTimeLoggedInEvent;

class Application extends App implements IBootstrap {
Expand Down Expand Up @@ -87,6 +103,35 @@ public function register(IRegistrationContext $context): void {
$context->registerConfigLexicon(ConfigLexicon::class);

$context->registerEventListener(RestrictInteractionEvent::class, RestrictInteractionListener::class);

$registry = Server::get(ISharingRegistry::class);

$registry->registerSourceType(Server::get(NodeShareSourceType::class));
Comment on lines +107 to +109

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks weird to me that register is pulling instances from Server::get.
It’s usually registering classnames in the context that later gets vivified if needed.
Or you can use injectFn in boot and you get proper DI.

(I do not have context for this, feel free to ignore if not relevant)

$registry->markPropertyTypeCompatibleWithSourceType(ExpirationDateSharePropertyType::class, NodeShareSourceType::class);
$registry->markPropertyTypeCompatibleWithSourceType(LabelSharePropertyType::class, NodeShareSourceType::class);
$registry->markPropertyTypeCompatibleWithSourceType(NoteSharePropertyType::class, NodeShareSourceType::class);
$registry->markPropertyTypeCompatibleWithSourceType(PasswordSharePropertyType::class, NodeShareSourceType::class);

$registry->registerPropertyType(new NodeGridViewSharePropertyType());
$registry->markPropertyTypeCompatibleWithSourceType(NodeGridViewSharePropertyType::class, NodeShareSourceType::class);
$registry->markPropertyTypeCompatibleWithRecipientType(NodeGridViewSharePropertyType::class, TokenShareRecipientType::class);

$registry->registerPermissionType(NodeShareSourceType::class, new NodeCreateSharePermissionType());
$registry->markPermissionTypeCompatibleWithPermissionPreset(NodeCreateSharePermissionType::class, EditSharePermissionPreset::class);

$registry->registerPermissionType(NodeShareSourceType::class, new NodeReadSharePermissionType());
$registry->markPermissionTypeCompatibleWithPermissionPreset(NodeReadSharePermissionType::class, ViewSharePermissionPreset::class);
$registry->markPermissionTypeCompatibleWithPermissionPreset(NodeReadSharePermissionType::class, EditSharePermissionPreset::class);

$registry->registerPermissionType(NodeShareSourceType::class, new NodeUpdateSharePermissionType());
$registry->markPermissionTypeCompatibleWithPermissionPreset(NodeUpdateSharePermissionType::class, EditSharePermissionPreset::class);

$registry->registerPermissionType(NodeShareSourceType::class, new NodeDeleteSharePermissionType());
$registry->markPermissionTypeCompatibleWithPermissionPreset(NodeDeleteSharePermissionType::class, EditSharePermissionPreset::class);

$registry->registerPermissionType(NodeShareSourceType::class, new NodeDownloadSharePermissionType());
$registry->markPermissionTypeCompatibleWithPermissionPreset(NodeDownloadSharePermissionType::class, ViewSharePermissionPreset::class);
$registry->markPermissionTypeCompatibleWithPermissionPreset(NodeDownloadSharePermissionType::class, EditSharePermissionPreset::class);
}

#[\Override]
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

/**
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

declare(strict_types=1);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

declare should be before licenses to match other files style.


namespace OCA\Files\Sharing\Permission;

use OCA\Files\AppInfo\Application;
use OCP\Constants;
use OCP\IAppConfig;
use OCP\L10N\IFactory;
use OCP\Server;
use OCP\Sharing\Permission\ISharePermissionType;

final class NodeCreateSharePermissionType implements ISharePermissionType {
private ?IAppConfig $appConfig = null;

private function getAppConfig(): IAppConfig {
return $this->appConfig ??= Server::get(IAppConfig::class);
}

#[\Override]
public function getDisplayName(IFactory $l10nFactory): string {
return $l10nFactory->get(Application::APP_ID)->t('Create files');
}

#[\Override]
public function getHint(IFactory $l10nFactory): ?string {
return null;
}

#[\Override]
public function getPriority(): int {
return 60;
}

#[\Override]
public function isEnabledByDefault(): bool {
return ($this->getAppConfig()->getValueInt(\OC\Core\AppInfo\Application::APP_ID, 'shareapi_default_permissions') & Constants::PERMISSION_CREATE) === Constants::PERMISSION_CREATE;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

/**
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

declare(strict_types=1);

namespace OCA\Files\Sharing\Permission;

use OCA\Files\AppInfo\Application;
use OCP\Constants;
use OCP\IAppConfig;
use OCP\L10N\IFactory;
use OCP\Server;
use OCP\Sharing\Permission\ISharePermissionType;

final class NodeDeleteSharePermissionType implements ISharePermissionType {
private ?IAppConfig $appConfig = null;

private function getAppConfig(): IAppConfig {
return $this->appConfig ??= Server::get(IAppConfig::class);
}
Comment on lines +20 to +24

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How come this is needed and proper DI cannot be used?
(Precisely because these classes get built in register and not boot?)


#[\Override]
public function getDisplayName(IFactory $l10nFactory): string {
return $l10nFactory->get(Application::APP_ID)->t('Delete files');
}

#[\Override]
public function getHint(IFactory $l10nFactory): ?string {
return null;
}

#[\Override]
public function getPriority(): int {
return 50;
}

#[\Override]
public function isEnabledByDefault(): bool {
return ($this->getAppConfig()->getValueInt(\OC\Core\AppInfo\Application::APP_ID, 'shareapi_default_permissions') & Constants::PERMISSION_DELETE) === Constants::PERMISSION_DELETE;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
<?php

/**
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

declare(strict_types=1);

namespace OCA\Files\Sharing\Permission;

use OCA\Files\AppInfo\Application;
use OCP\L10N\IFactory;
use OCP\Server;
use OCP\Share\IManager;
use OCP\Sharing\Permission\ISharePermissionType;

final class NodeDownloadSharePermissionType implements ISharePermissionType {
private ?IManager $legacyManager = null;

private function getLegacyManager(): IManager {
return $this->legacyManager ??= Server::get(IManager::class);
}

#[\Override]
public function getDisplayName(IFactory $l10nFactory): string {
return $l10nFactory->get(Application::APP_ID)->t('Download files');
}

#[\Override]
public function getHint(IFactory $l10nFactory): ?string {
// If previews are still allowed, the download option is only hidden, because on a technical level it is still possible to download.
if ($this->getLegacyManager()->allowViewWithoutDownload()) {
return $l10nFactory->get(Application::APP_ID)->t('When disabled, the option to download will be hidden');
}

return null;
}

#[\Override]
public function getPriority(): int {
return 40;
}

#[\Override]
public function isEnabledByDefault(): bool {
return false;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

/**
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

declare(strict_types=1);

namespace OCA\Files\Sharing\Permission;

use OCA\Files\AppInfo\Application;
use OCP\L10N\IFactory;
use OCP\Sharing\Permission\ISharePermissionType;

final class NodeReadSharePermissionType implements ISharePermissionType {
#[\Override]
public function getDisplayName(IFactory $l10nFactory): string {
return $l10nFactory->get(Application::APP_ID)->t('View files');
}

#[\Override]
public function getHint(IFactory $l10nFactory): ?string {
return null;
}

#[\Override]
public function getPriority(): int {
return 80;
}

#[\Override]
public function isEnabledByDefault(): bool {
return true;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

/**
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

declare(strict_types=1);

namespace OCA\Files\Sharing\Permission;

use OCA\Files\AppInfo\Application;
use OCP\Constants;
use OCP\IAppConfig;
use OCP\L10N\IFactory;
use OCP\Server;
use OCP\Sharing\Permission\ISharePermissionType;

final class NodeUpdateSharePermissionType implements ISharePermissionType {
private ?IAppConfig $appConfig = null;

private function getAppConfig(): IAppConfig {
return $this->appConfig ??= Server::get(IAppConfig::class);
}

#[\Override]
public function getDisplayName(IFactory $l10nFactory): string {
return $l10nFactory->get(Application::APP_ID)->t('Edit files');
}

#[\Override]
public function getHint(IFactory $l10nFactory): ?string {
return null;
}

#[\Override]
public function getPriority(): int {
return 70;
}

#[\Override]
public function isEnabledByDefault(): bool {
return ($this->getAppConfig()->getValueInt(\OC\Core\AppInfo\Application::APP_ID, 'shareapi_default_permissions') & Constants::PERMISSION_UPDATE) === Constants::PERMISSION_UPDATE;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

/**
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

declare(strict_types=1);

namespace OCA\Files\Sharing\Property;

use OCA\Files\AppInfo\Application;
use OCP\L10N\IFactory;
use OCP\Sharing\Property\ABooleanSharePropertyType;

final class NodeGridViewSharePropertyType extends ABooleanSharePropertyType {
#[\Override]
public function getDisplayName(IFactory $l10nFactory): string {
return $l10nFactory->get(Application::APP_ID)->t('Show files in grid view');
}

#[\Override]
public function getHint(IFactory $l10nFactory): ?string {
return null;
}

#[\Override]
public function getPriority(): int {
return 30;
}

#[\Override]
public function isAdvanced(): bool {
return true;
}

#[\Override]
public function isRequired(): bool {
return false;
}

#[\Override]
public function getDefaultValue(): string {
return 'false';
}
}
Loading
Loading