Skip to content

Commit 0bf8efd

Browse files
Merge pull request #62241 from nextcloud/unified-sharing
Add Unified Sharing
2 parents 86b97d5 + 1700c71 commit 0bf8efd

149 files changed

Lines changed: 22161 additions & 34 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ node_modules/
4040
!/apps/provisioning_api
4141
!/apps/settings
4242
!/apps/sharebymail
43+
!/apps/sharing
4344
!/apps/systemtags
4445
!/apps/testing
4546
!/apps/updatenotification

.tx/config

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,12 @@ source_file = translationfiles/templates/sharebymail.pot
146146
source_lang = en
147147
type = PO
148148

149+
[o:nextcloud:p:nextcloud:r:sharing]
150+
file_filter = translationfiles/<lang>/sharing.po
151+
source_file = translationfiles/templates/sharing.pot
152+
source_lang = en
153+
type = PO
154+
149155
[o:nextcloud:p:nextcloud:r:systemtags]
150156
file_filter = translationfiles/<lang>/systemtags.po
151157
source_file = translationfiles/templates/systemtags.pot

REUSE.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ SPDX-FileCopyrightText = "2019 Fabian Wiktor <https://www.pexels.com/photo/green
406406
SPDX-License-Identifier = "CC0-1.0"
407407

408408
[[annotations]]
409-
path = ["openapi.json", ".envrc", "flake.nix", "flake.lock", "build/eslint-baseline.json", "build/eslint-baseline-legacy.json"]
409+
path = ["openapi.json", ".envrc", "flake.nix", "flake.lock", "build/eslint-baseline.json", "build/eslint-baseline-legacy.json", "apps/sharing/openapi.json"]
410410
precedence = "aggregate"
411411
SPDX-FileCopyrightText = "2025 Nextcloud GmbH and Nextcloud contributors"
412412
SPDX-License-Identifier = "AGPL-3.0-or-later"

apps/files/composer/composer/autoload_classmap.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,11 @@
9898
'OCA\\Files\\Service\\ViewConfig' => $baseDir . '/../lib/Service/ViewConfig.php',
9999
'OCA\\Files\\Settings\\AdminSettings' => $baseDir . '/../lib/Settings/AdminSettings.php',
100100
'OCA\\Files\\Settings\\PersonalSettings' => $baseDir . '/../lib/Settings/PersonalSettings.php',
101+
'OCA\\Files\\Sharing\\Permission\\NodeCreateSharePermissionType' => $baseDir . '/../lib/Sharing/Permission/NodeCreateSharePermissionType.php',
102+
'OCA\\Files\\Sharing\\Permission\\NodeDeleteSharePermissionType' => $baseDir . '/../lib/Sharing/Permission/NodeDeleteSharePermissionType.php',
103+
'OCA\\Files\\Sharing\\Permission\\NodeDownloadSharePermissionType' => $baseDir . '/../lib/Sharing/Permission/NodeDownloadSharePermissionType.php',
104+
'OCA\\Files\\Sharing\\Permission\\NodeReadSharePermissionType' => $baseDir . '/../lib/Sharing/Permission/NodeReadSharePermissionType.php',
105+
'OCA\\Files\\Sharing\\Permission\\NodeUpdateSharePermissionType' => $baseDir . '/../lib/Sharing/Permission/NodeUpdateSharePermissionType.php',
106+
'OCA\\Files\\Sharing\\Property\\NodeGridViewSharePropertyType' => $baseDir . '/../lib/Sharing/Property/NodeGridViewSharePropertyType.php',
107+
'OCA\\Files\\Sharing\\Source\\NodeShareSourceType' => $baseDir . '/../lib/Sharing/Source/NodeShareSourceType.php',
101108
);

apps/files/composer/composer/autoload_static.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,13 @@ class ComposerStaticInitFiles
113113
'OCA\\Files\\Service\\ViewConfig' => __DIR__ . '/..' . '/../lib/Service/ViewConfig.php',
114114
'OCA\\Files\\Settings\\AdminSettings' => __DIR__ . '/..' . '/../lib/Settings/AdminSettings.php',
115115
'OCA\\Files\\Settings\\PersonalSettings' => __DIR__ . '/..' . '/../lib/Settings/PersonalSettings.php',
116+
'OCA\\Files\\Sharing\\Permission\\NodeCreateSharePermissionType' => __DIR__ . '/..' . '/../lib/Sharing/Permission/NodeCreateSharePermissionType.php',
117+
'OCA\\Files\\Sharing\\Permission\\NodeDeleteSharePermissionType' => __DIR__ . '/..' . '/../lib/Sharing/Permission/NodeDeleteSharePermissionType.php',
118+
'OCA\\Files\\Sharing\\Permission\\NodeDownloadSharePermissionType' => __DIR__ . '/..' . '/../lib/Sharing/Permission/NodeDownloadSharePermissionType.php',
119+
'OCA\\Files\\Sharing\\Permission\\NodeReadSharePermissionType' => __DIR__ . '/..' . '/../lib/Sharing/Permission/NodeReadSharePermissionType.php',
120+
'OCA\\Files\\Sharing\\Permission\\NodeUpdateSharePermissionType' => __DIR__ . '/..' . '/../lib/Sharing/Permission/NodeUpdateSharePermissionType.php',
121+
'OCA\\Files\\Sharing\\Property\\NodeGridViewSharePropertyType' => __DIR__ . '/..' . '/../lib/Sharing/Property/NodeGridViewSharePropertyType.php',
122+
'OCA\\Files\\Sharing\\Source\\NodeShareSourceType' => __DIR__ . '/..' . '/../lib/Sharing/Source/NodeShareSourceType.php',
116123
);
117124

118125
public static function getInitializer(ClassLoader $loader)

apps/files/lib/AppInfo/Application.php

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@
99

1010
namespace OCA\Files\AppInfo;
1111

12+
use OC\Core\Sharing\Permission\EditSharePermissionPreset;
13+
use OC\Core\Sharing\Permission\ViewSharePermissionPreset;
14+
use OC\Core\Sharing\Property\ExpirationDateSharePropertyType;
15+
use OC\Core\Sharing\Property\LabelSharePropertyType;
16+
use OC\Core\Sharing\Property\NoteSharePropertyType;
17+
use OC\Core\Sharing\Property\PasswordSharePropertyType;
18+
use OC\Core\Sharing\Recipient\TokenShareRecipientType;
1219
use OCA\Files\AdvancedCapabilities;
1320
use OCA\Files\Capabilities;
1421
use OCA\Files\Collaboration\Resources\Listener;
@@ -28,6 +35,13 @@
2835
use OCA\Files\Listener\UserFirstTimeLoggedInListener;
2936
use OCA\Files\Notification\Notifier;
3037
use OCA\Files\Search\FilesSearchProvider;
38+
use OCA\Files\Sharing\Permission\NodeCreateSharePermissionType;
39+
use OCA\Files\Sharing\Permission\NodeDeleteSharePermissionType;
40+
use OCA\Files\Sharing\Permission\NodeDownloadSharePermissionType;
41+
use OCA\Files\Sharing\Permission\NodeReadSharePermissionType;
42+
use OCA\Files\Sharing\Permission\NodeUpdateSharePermissionType;
43+
use OCA\Files\Sharing\Property\NodeGridViewSharePropertyType;
44+
use OCA\Files\Sharing\Source\NodeShareSourceType;
3145
use OCP\AppFramework\App;
3246
use OCP\AppFramework\Bootstrap\IBootContext;
3347
use OCP\AppFramework\Bootstrap\IBootstrap;
@@ -42,9 +56,11 @@
4256
use OCP\Files\Events\NodeAddedToFavorite;
4357
use OCP\Files\Events\NodeRemovedFromFavorite;
4458
use OCP\Interaction\RestrictInteractionEvent;
59+
use OCP\Server;
4560
use OCP\Share\Events\ShareCreatedEvent;
4661
use OCP\Share\Events\ShareDeletedEvent;
4762
use OCP\Share\Events\ShareDeletedFromSelfEvent;
63+
use OCP\Sharing\ISharingRegistry;
4864
use OCP\User\Events\UserFirstTimeLoggedInEvent;
4965

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

89105
$context->registerEventListener(RestrictInteractionEvent::class, RestrictInteractionListener::class);
106+
107+
$registry = Server::get(ISharingRegistry::class);
108+
109+
$registry->registerSourceType(Server::get(NodeShareSourceType::class));
110+
$registry->markPropertyTypeCompatibleWithSourceType(ExpirationDateSharePropertyType::class, NodeShareSourceType::class);
111+
$registry->markPropertyTypeCompatibleWithSourceType(LabelSharePropertyType::class, NodeShareSourceType::class);
112+
$registry->markPropertyTypeCompatibleWithSourceType(NoteSharePropertyType::class, NodeShareSourceType::class);
113+
$registry->markPropertyTypeCompatibleWithSourceType(PasswordSharePropertyType::class, NodeShareSourceType::class);
114+
115+
$registry->registerPropertyType(new NodeGridViewSharePropertyType());
116+
$registry->markPropertyTypeCompatibleWithSourceType(NodeGridViewSharePropertyType::class, NodeShareSourceType::class);
117+
$registry->markPropertyTypeCompatibleWithRecipientType(NodeGridViewSharePropertyType::class, TokenShareRecipientType::class);
118+
119+
$registry->registerPermissionType(NodeShareSourceType::class, new NodeCreateSharePermissionType());
120+
$registry->markPermissionTypeCompatibleWithPermissionPreset(NodeCreateSharePermissionType::class, EditSharePermissionPreset::class);
121+
122+
$registry->registerPermissionType(NodeShareSourceType::class, new NodeReadSharePermissionType());
123+
$registry->markPermissionTypeCompatibleWithPermissionPreset(NodeReadSharePermissionType::class, ViewSharePermissionPreset::class);
124+
$registry->markPermissionTypeCompatibleWithPermissionPreset(NodeReadSharePermissionType::class, EditSharePermissionPreset::class);
125+
126+
$registry->registerPermissionType(NodeShareSourceType::class, new NodeUpdateSharePermissionType());
127+
$registry->markPermissionTypeCompatibleWithPermissionPreset(NodeUpdateSharePermissionType::class, EditSharePermissionPreset::class);
128+
129+
$registry->registerPermissionType(NodeShareSourceType::class, new NodeDeleteSharePermissionType());
130+
$registry->markPermissionTypeCompatibleWithPermissionPreset(NodeDeleteSharePermissionType::class, EditSharePermissionPreset::class);
131+
132+
$registry->registerPermissionType(NodeShareSourceType::class, new NodeDownloadSharePermissionType());
133+
$registry->markPermissionTypeCompatibleWithPermissionPreset(NodeDownloadSharePermissionType::class, ViewSharePermissionPreset::class);
134+
$registry->markPermissionTypeCompatibleWithPermissionPreset(NodeDownloadSharePermissionType::class, EditSharePermissionPreset::class);
90135
}
91136

92137
#[\Override]
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
/**
4+
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace OCA\Files\Sharing\Permission;
11+
12+
use OCA\Files\AppInfo\Application;
13+
use OCP\Constants;
14+
use OCP\IAppConfig;
15+
use OCP\L10N\IFactory;
16+
use OCP\Server;
17+
use OCP\Sharing\Permission\ISharePermissionType;
18+
19+
final class NodeCreateSharePermissionType implements ISharePermissionType {
20+
private ?IAppConfig $appConfig = null;
21+
22+
private function getAppConfig(): IAppConfig {
23+
return $this->appConfig ??= Server::get(IAppConfig::class);
24+
}
25+
26+
#[\Override]
27+
public function getDisplayName(IFactory $l10nFactory): string {
28+
return $l10nFactory->get(Application::APP_ID)->t('Create files');
29+
}
30+
31+
#[\Override]
32+
public function getHint(IFactory $l10nFactory): ?string {
33+
return null;
34+
}
35+
36+
#[\Override]
37+
public function getPriority(): int {
38+
return 60;
39+
}
40+
41+
#[\Override]
42+
public function isEnabledByDefault(): bool {
43+
return ($this->getAppConfig()->getValueInt(\OC\Core\AppInfo\Application::APP_ID, 'shareapi_default_permissions') & Constants::PERMISSION_CREATE) === Constants::PERMISSION_CREATE;
44+
}
45+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
/**
4+
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace OCA\Files\Sharing\Permission;
11+
12+
use OCA\Files\AppInfo\Application;
13+
use OCP\Constants;
14+
use OCP\IAppConfig;
15+
use OCP\L10N\IFactory;
16+
use OCP\Server;
17+
use OCP\Sharing\Permission\ISharePermissionType;
18+
19+
final class NodeDeleteSharePermissionType implements ISharePermissionType {
20+
private ?IAppConfig $appConfig = null;
21+
22+
private function getAppConfig(): IAppConfig {
23+
return $this->appConfig ??= Server::get(IAppConfig::class);
24+
}
25+
26+
#[\Override]
27+
public function getDisplayName(IFactory $l10nFactory): string {
28+
return $l10nFactory->get(Application::APP_ID)->t('Delete files');
29+
}
30+
31+
#[\Override]
32+
public function getHint(IFactory $l10nFactory): ?string {
33+
return null;
34+
}
35+
36+
#[\Override]
37+
public function getPriority(): int {
38+
return 50;
39+
}
40+
41+
#[\Override]
42+
public function isEnabledByDefault(): bool {
43+
return ($this->getAppConfig()->getValueInt(\OC\Core\AppInfo\Application::APP_ID, 'shareapi_default_permissions') & Constants::PERMISSION_DELETE) === Constants::PERMISSION_DELETE;
44+
}
45+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
/**
4+
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace OCA\Files\Sharing\Permission;
11+
12+
use OCA\Files\AppInfo\Application;
13+
use OCP\L10N\IFactory;
14+
use OCP\Server;
15+
use OCP\Share\IManager;
16+
use OCP\Sharing\Permission\ISharePermissionType;
17+
18+
final class NodeDownloadSharePermissionType implements ISharePermissionType {
19+
private ?IManager $legacyManager = null;
20+
21+
private function getLegacyManager(): IManager {
22+
return $this->legacyManager ??= Server::get(IManager::class);
23+
}
24+
25+
#[\Override]
26+
public function getDisplayName(IFactory $l10nFactory): string {
27+
return $l10nFactory->get(Application::APP_ID)->t('Download files');
28+
}
29+
30+
#[\Override]
31+
public function getHint(IFactory $l10nFactory): ?string {
32+
// If previews are still allowed, the download option is only hidden, because on a technical level it is still possible to download.
33+
if ($this->getLegacyManager()->allowViewWithoutDownload()) {
34+
return $l10nFactory->get(Application::APP_ID)->t('When disabled, the option to download will be hidden');
35+
}
36+
37+
return null;
38+
}
39+
40+
#[\Override]
41+
public function getPriority(): int {
42+
return 40;
43+
}
44+
45+
#[\Override]
46+
public function isEnabledByDefault(): bool {
47+
return false;
48+
}
49+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
/**
4+
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
5+
* SPDX-License-Identifier: AGPL-3.0-or-later
6+
*/
7+
8+
declare(strict_types=1);
9+
10+
namespace OCA\Files\Sharing\Permission;
11+
12+
use OCA\Files\AppInfo\Application;
13+
use OCP\L10N\IFactory;
14+
use OCP\Sharing\Permission\ISharePermissionType;
15+
16+
final class NodeReadSharePermissionType implements ISharePermissionType {
17+
#[\Override]
18+
public function getDisplayName(IFactory $l10nFactory): string {
19+
return $l10nFactory->get(Application::APP_ID)->t('View files');
20+
}
21+
22+
#[\Override]
23+
public function getHint(IFactory $l10nFactory): ?string {
24+
return null;
25+
}
26+
27+
#[\Override]
28+
public function getPriority(): int {
29+
return 80;
30+
}
31+
32+
#[\Override]
33+
public function isEnabledByDefault(): bool {
34+
return true;
35+
}
36+
}

0 commit comments

Comments
 (0)