summaryrefslogtreecommitdiffstats
path: root/apps/files_sharing
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2017-04-07 17:14:05 -0500
committerGitHub <noreply@github.com>2017-04-07 17:14:05 -0500
commitca9d25169dcdd2923a356e2a797d8704506a3787 (patch)
tree5d94aed1a5f79a5b0abe33d8732fc60e0a4054b3 /apps/files_sharing
parent9adfa60eb38f6c39ae075e1fa68037375c8789de (diff)
parentbf30090be5e3d339c9188d81a900ed2fe4bd6318 (diff)
downloadnextcloud-server-ca9d25169dcdd2923a356e2a797d8704506a3787.tar.gz
nextcloud-server-ca9d25169dcdd2923a356e2a797d8704506a3787.zip
Merge pull request #4136 from nextcloud/expire-date-for-all-shares
Unified sharing options
Diffstat (limited to 'apps/files_sharing')
-rw-r--r--apps/files_sharing/appinfo/info.xml2
-rw-r--r--apps/files_sharing/appinfo/update.php5
-rw-r--r--apps/files_sharing/lib/Capabilities.php26
-rw-r--r--apps/files_sharing/lib/Controller/ShareAPIController.php43
-rw-r--r--apps/files_sharing/lib/Migration.php18
-rw-r--r--apps/files_sharing/tests/ApiTest.php30
-rw-r--r--apps/files_sharing/tests/CapabilitiesTest.php11
-rw-r--r--apps/files_sharing/tests/MigrationTest.php80
8 files changed, 156 insertions, 59 deletions
diff --git a/apps/files_sharing/appinfo/info.xml b/apps/files_sharing/appinfo/info.xml
index e2a08d951ac..29a137fed0b 100644
--- a/apps/files_sharing/appinfo/info.xml
+++ b/apps/files_sharing/appinfo/info.xml
@@ -10,7 +10,7 @@ Turning the feature off removes shared files and folders on the server for all s
<licence>AGPL</licence>
<author>Michael Gapczynski, Bjoern Schiessle</author>
<default_enable/>
- <version>1.2.0</version>
+ <version>1.4.0</version>
<types>
<filesystem/>
</types>
diff --git a/apps/files_sharing/appinfo/update.php b/apps/files_sharing/appinfo/update.php
index ed0d7732b37..917cb7b6639 100644
--- a/apps/files_sharing/appinfo/update.php
+++ b/apps/files_sharing/appinfo/update.php
@@ -34,3 +34,8 @@ if (version_compare($installedVersion, '0.9.1', '<')) {
if (version_compare($installedVersion, '1.1.1', '<')) {
$m = new Migration(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig());
}
+
+if (version_compare($installedVersion, '1.4.0', '<')) {
+ $m = new Migration(\OC::$server->getDatabaseConnection(), \OC::$server->getConfig());
+ $m->addPasswordColumn();
+}
diff --git a/apps/files_sharing/lib/Capabilities.php b/apps/files_sharing/lib/Capabilities.php
index bfbd15c1122..ed00cdc00a6 100644
--- a/apps/files_sharing/lib/Capabilities.php
+++ b/apps/files_sharing/lib/Capabilities.php
@@ -21,6 +21,7 @@
*/
namespace OCA\Files_Sharing;
+use OCP\App\IAppManager;
use OCP\Capabilities\ICapability;
use \OCP\IConfig;
@@ -34,8 +35,12 @@ class Capabilities implements ICapability {
/** @var IConfig */
private $config;
- public function __construct(IConfig $config) {
+ /** @var IAppManager */
+ private $appManager;
+
+ public function __construct(IConfig $config, IAppManager $appManager) {
$this->config = $config;
+ $this->appManager = $appManager;
}
/**
@@ -76,16 +81,33 @@ class Capabilities implements ICapability {
$res['resharing'] = $this->config->getAppValue('core', 'shareapi_allow_resharing', 'yes') === 'yes';
$res['user']['send_mail'] = false;
+ $res['user']['expire_date']['enabled'] = true;
+ // deprecated in favour of 'group', but we need to keep it for now
+ // in order to stay compatible with older clients
$res['group_sharing'] = $this->config->getAppValue('core', 'shareapi_allow_group_sharing', 'yes') === 'yes';
+
+ $res['group'] = [];
+ $res['group']['enabled'] = $this->config->getAppValue('core', 'shareapi_allow_group_sharing', 'yes') === 'yes';
+ $res['group']['expire_date']['enabled'] = true;
}
//Federated sharing
$res['federation'] = [
'outgoing' => $this->config->getAppValue('files_sharing', 'outgoing_server2server_share_enabled', 'yes') === 'yes',
- 'incoming' => $this->config->getAppValue('files_sharing', 'incoming_server2server_share_enabled', 'yes') === 'yes'
+ 'incoming' => $this->config->getAppValue('files_sharing', 'incoming_server2server_share_enabled', 'yes') === 'yes',
+ 'expire_date' => ['enabled' => true]
];
+ if ($this->appManager->isEnabledForUser('sharebymail')) {
+ $res['mailshare'] = [
+ 'enabled' => true,
+ 'upload_files_drop' => ['enabled' => true],
+ 'password' => ['enabled' => true],
+ 'expire_date' => ['enabled' => true]
+ ];
+ }
+
return [
'files_sharing' => $res,
];
diff --git a/apps/files_sharing/lib/Controller/ShareAPIController.php b/apps/files_sharing/lib/Controller/ShareAPIController.php
index 78eef6c26bb..bc525b6ef82 100644
--- a/apps/files_sharing/lib/Controller/ShareAPIController.php
+++ b/apps/files_sharing/lib/Controller/ShareAPIController.php
@@ -163,6 +163,11 @@ class ShareAPIController extends OCSController {
$result['file_parent'] = $node->getParent()->getId();
$result['file_target'] = $share->getTarget();
+ $expiration = $share->getExpirationDate();
+ if ($expiration !== null) {
+ $result['expiration'] = $expiration->format('Y-m-d 00:00:00');
+ }
+
if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
$sharedWith = $this->userManager->get($share->getSharedWith());
$result['share_with'] = $share->getSharedWith();
@@ -179,17 +184,13 @@ class ShareAPIController extends OCSController {
$result['token'] = $share->getToken();
$result['url'] = $this->urlGenerator->linkToRouteAbsolute('files_sharing.sharecontroller.showShare', ['token' => $share->getToken()]);
- $expiration = $share->getExpirationDate();
- if ($expiration !== null) {
- $result['expiration'] = $expiration->format('Y-m-d 00:00:00');
- }
-
} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_REMOTE) {
$result['share_with'] = $share->getSharedWith();
$result['share_with_displayname'] = $this->getDisplayNameFromAddressBook($share->getSharedWith(), 'CLOUD');
$result['token'] = $share->getToken();
} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_EMAIL) {
$result['share_with'] = $share->getSharedWith();
+ $result['password'] = $share->getPassword();
$result['share_with_displayname'] = $this->getDisplayNameFromAddressBook($share->getSharedWith(), 'EMAIL');
$result['token'] = $share->getToken();
} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_CIRCLE) {
@@ -668,13 +669,14 @@ class ShareAPIController extends OCSController {
throw new OCSNotFoundException($this->l->t('Wrong share ID, share doesn\'t exist'));
}
+ if ($permissions === null && $password === null && $publicUpload === null && $expireDate === null) {
+ throw new OCSBadRequestException($this->l->t('Wrong or no update parameter given'));
+ }
+
/*
* expirationdate, password and publicUpload only make sense for link shares
*/
if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
- if ($permissions === null && $password === null && $publicUpload === null && $expireDate === null) {
- throw new OCSBadRequestException($this->l->t('Wrong or no update parameter given'));
- }
$newPermissions = null;
if ($publicUpload === 'true') {
@@ -740,13 +742,30 @@ class ShareAPIController extends OCSController {
}
} else {
- // For other shares only permissions is valid.
- if ($permissions === null) {
- throw new OCSBadRequestException($this->l->t('Wrong or no update parameter given'));
- } else {
+ if ($permissions !== null) {
$permissions = (int)$permissions;
$share->setPermissions($permissions);
}
+
+ if ($share->getShareType() === \OCP\Share::SHARE_TYPE_EMAIL) {
+ if ($password === '') {
+ $share->setPassword(null);
+ } else if ($password !== null) {
+ $share->setPassword($password);
+ }
+ }
+
+ if ($expireDate === '') {
+ $share->setExpirationDate(null);
+ } else if ($expireDate !== null) {
+ try {
+ $expireDate = $this->parseDate($expireDate);
+ } catch (\Exception $e) {
+ throw new OCSBadRequestException($e->getMessage());
+ }
+ $share->setExpirationDate($expireDate);
+ }
+
}
if ($permissions !== null && $share->getShareOwner() !== $this->currentUser) {
diff --git a/apps/files_sharing/lib/Migration.php b/apps/files_sharing/lib/Migration.php
index 605a11fd22c..49e275cbe6e 100644
--- a/apps/files_sharing/lib/Migration.php
+++ b/apps/files_sharing/lib/Migration.php
@@ -123,6 +123,24 @@ class Migration {
$this->config->deleteAppValue('core', 'shareapi_allow_public_notification');
}
+ public function addPasswordColumn() {
+ $query = $this->connection->getQueryBuilder();
+ $query
+ ->update('share')
+ ->set('password', 'share_with')
+ ->where($query->expr()->eq('share_type', $query->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)))
+ ->andWhere($query->expr()->isNotNull('share_with'));
+ $query->execute();
+
+ $clearQuery = $this->connection->getQueryBuilder();
+ $clearQuery
+ ->update('share')->set('share_with', $clearQuery->createNamedParameter(null))
+ ->where($clearQuery->expr()->eq('share_type', $clearQuery->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)));
+
+ $clearQuery->execute();
+
+ }
+
/**
* find the owner of a re-shared file/folder
*
diff --git a/apps/files_sharing/tests/ApiTest.php b/apps/files_sharing/tests/ApiTest.php
index 540905a7dc9..046ede1f83e 100644
--- a/apps/files_sharing/tests/ApiTest.php
+++ b/apps/files_sharing/tests/ApiTest.php
@@ -938,36 +938,6 @@ class ApiTest extends TestCase {
/**
* @medium
- * @depends testCreateShareUserFile
- */
- public function testUpdateShareInvalidPermissions() {
- $node1 = $this->userFolder->get($this->filename);
- $share1 = $this->shareManager->newShare();
- $share1->setNode($node1)
- ->setSharedBy(self::TEST_FILES_SHARING_API_USER1)
- ->setSharedWith(self::TEST_FILES_SHARING_API_USER2)
- ->setShareType(\OCP\Share::SHARE_TYPE_USER)
- ->setPermissions(19);
- $share1 = $this->shareManager->createShare($share1);
-
- $ocs = $this->createOCS(self::TEST_FILES_SHARING_API_USER1);
- try {
- $ocs->updateShare($share1->getId());
- $this->fail();
- } catch (OCSBadRequestException $e) {
-
- }
- $ocs->cleanup();
-
- //Permissions should not have changed!
- $share1 = $this->shareManager->getShareById('ocinternal:' . $share1->getId());
- $this->assertEquals(19, $share1->getPermissions());
-
- $this->shareManager->deleteShare($share1);
- }
-
- /**
- * @medium
*/
function testUpdateShareUpload() {
$node1 = $this->userFolder->get($this->folder);
diff --git a/apps/files_sharing/tests/CapabilitiesTest.php b/apps/files_sharing/tests/CapabilitiesTest.php
index 3d59b1f6f34..79ac1854e40 100644
--- a/apps/files_sharing/tests/CapabilitiesTest.php
+++ b/apps/files_sharing/tests/CapabilitiesTest.php
@@ -25,6 +25,7 @@ namespace OCA\Files_Sharing\Tests;
use OCA\Files_Sharing\Capabilities;
use OCA\Files_Sharing\Tests\TestCase;
+use OCP\App\IAppManager;
/**
* Class CapabilitiesTest
@@ -46,7 +47,7 @@ class CapabilitiesTest extends \Test\TestCase {
}
/**
- * Create a mock config object and insert the values in $map tot the getAppValue
+ * Create a mock config object and insert the values in $map to the getAppValue
* function. Then obtain the capabilities and extract the first few
* levels in the array
*
@@ -54,9 +55,11 @@ class CapabilitiesTest extends \Test\TestCase {
* @return string[]
*/
private function getResults(array $map) {
- $stub = $this->getMockBuilder('\OCP\IConfig')->disableOriginalConstructor()->getMock();
- $stub->method('getAppValue')->will($this->returnValueMap($map));
- $cap = new Capabilities($stub);
+ $config = $this->getMockBuilder('\OCP\IConfig')->disableOriginalConstructor()->getMock();
+ $config->method('getAppValue')->will($this->returnValueMap($map));
+ $appManager = $this->getMockBuilder(IAppManager::class)->getMock();
+ $appManager->expects($this->any())->method('isEnabledForUser')->with('sharebymail')->willReturn(true);
+ $cap = new Capabilities($config, $appManager);
$result = $this->getFilesSharingPart($cap->getCapabilities());
return $result;
}
diff --git a/apps/files_sharing/tests/MigrationTest.php b/apps/files_sharing/tests/MigrationTest.php
index 572f64da743..708de1c0eca 100644
--- a/apps/files_sharing/tests/MigrationTest.php
+++ b/apps/files_sharing/tests/MigrationTest.php
@@ -28,6 +28,7 @@ namespace OCA\Files_Sharing\Tests;
use OCA\Files_Sharing\Migration;
+use OCP\Share;
/**
* Class MigrationTest
@@ -87,7 +88,7 @@ class MigrationTest extends TestCase {
)
);
// shared contact, shouldn't be modified
- $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_CONTACT)
+ $query->setParameter('share_type', Share::SHARE_TYPE_CONTACT)
->setParameter('share_with', 'user1')
->setParameter('uid_owner', 'owner1')
->setParameter('uid_initiator', '')
@@ -103,7 +104,7 @@ class MigrationTest extends TestCase {
$query->execute()
);
// shared calendar, shouldn't be modified
- $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_USER)
+ $query->setParameter('share_type', Share::SHARE_TYPE_USER)
->setParameter('share_with', 'user1')
->setParameter('uid_owner', 'owner1')
->setParameter('uid_initiator', '')
@@ -119,7 +120,7 @@ class MigrationTest extends TestCase {
$query->execute()
);
// single user share, shouldn't be modified
- $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_USER)
+ $query->setParameter('share_type', Share::SHARE_TYPE_USER)
->setParameter('share_with', 'user1')
->setParameter('uid_owner', 'owner1')
->setParameter('uid_initiator', '')
@@ -135,7 +136,7 @@ class MigrationTest extends TestCase {
$query->execute()
);
// single group share, shouldn't be modified
- $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_GROUP)
+ $query->setParameter('share_type', Share::SHARE_TYPE_GROUP)
->setParameter('share_with', 'group1')
->setParameter('uid_owner', 'owner1')
->setParameter('uid_initiator', '')
@@ -168,7 +169,7 @@ class MigrationTest extends TestCase {
$query->execute()
);
// first user share, shouldn't be modified
- $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_USER)
+ $query->setParameter('share_type', Share::SHARE_TYPE_USER)
->setParameter('share_with', 'user1')
->setParameter('uid_owner', 'owner2')
->setParameter('uid_initiator', '')
@@ -185,7 +186,7 @@ class MigrationTest extends TestCase {
);
$parent = $query->getLastInsertId();
// first re-share, should be attached to the first user share after migration
- $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_USER)
+ $query->setParameter('share_type', Share::SHARE_TYPE_USER)
->setParameter('share_with', 'user2')
->setParameter('uid_owner', 'user1')
->setParameter('uid_initiator', '')
@@ -202,7 +203,7 @@ class MigrationTest extends TestCase {
);
$parent = $query->getLastInsertId();
// second re-share, should be attached to the first user share after migration
- $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_USER)
+ $query->setParameter('share_type', Share::SHARE_TYPE_USER)
->setParameter('share_with', 'user3')
->setParameter('uid_owner', 'user2')
->setParameter('uid_initiator', '')
@@ -219,7 +220,7 @@ class MigrationTest extends TestCase {
);
$parent = $query->getLastInsertId();
// third re-share, should be attached to the first user share after migration
- $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_REMOTE)
+ $query->setParameter('share_type', Share::SHARE_TYPE_REMOTE)
->setParameter('share_with', 'user@server.com')
->setParameter('uid_owner', 'user3')
->setParameter('uid_initiator', '')
@@ -236,7 +237,7 @@ class MigrationTest extends TestCase {
);
// Link reshare should keep its parent
- $query->setParameter('share_type', \OCP\Share::SHARE_TYPE_LINK)
+ $query->setParameter('share_type', Share::SHARE_TYPE_LINK)
->setParameter('share_with', null)
->setParameter('uid_owner', 'user3')
->setParameter('uid_initiator', '')
@@ -317,7 +318,7 @@ class MigrationTest extends TestCase {
'stime' => $query->createParameter('stime'),
]
)
- ->setParameter('share_type', \OCP\Share::SHARE_TYPE_USER)
+ ->setParameter('share_type', Share::SHARE_TYPE_USER)
->setParameter('share_with', 'user'.($i+1))
->setParameter('uid_owner', 'user'.($i))
->setParameter('uid_initiator', null)
@@ -377,4 +378,63 @@ class MigrationTest extends TestCase {
$this->config->getAppValue('core', 'shareapi_setting1', null)
);
}
+
+ public function testAddPasswordColumn() {
+
+ $shareTypes = [Share::SHARE_TYPE_USER, Share::SHARE_TYPE_GROUP, Share::SHARE_TYPE_REMOTE, Share::SHARE_TYPE_EMAIL, Share::SHARE_TYPE_LINK];
+
+ foreach ($shareTypes as $shareType) {
+
+ for ($i = 0; $i < 5; $i++) {
+ $query = $this->connection->getQueryBuilder();
+ $query->insert($this->table)
+ ->values(
+ [
+ 'share_type' => $query->createParameter('share_type'),
+ 'share_with' => $query->createParameter('share_with'),
+ 'uid_owner' => $query->createParameter('uid_owner'),
+ 'uid_initiator' => $query->createParameter('uid_initiator'),
+ 'parent' => $query->createParameter('parent'),
+ 'item_type' => $query->createParameter('item_type'),
+ 'item_source' => $query->createParameter('item_source'),
+ 'item_target' => $query->createParameter('item_target'),
+ 'file_source' => $query->createParameter('file_source'),
+ 'file_target' => $query->createParameter('file_target'),
+ 'permissions' => $query->createParameter('permissions'),
+ 'stime' => $query->createParameter('stime'),
+ ]
+ )
+ ->setParameter('share_type', $shareType)
+ ->setParameter('share_with', 'shareWith')
+ ->setParameter('uid_owner', 'user' . ($i))
+ ->setParameter('uid_initiator', null)
+ ->setParameter('parent', 0)
+ ->setParameter('item_type', 'file')
+ ->setParameter('item_source', '2')
+ ->setParameter('item_target', '/2')
+ ->setParameter('file_source', 2)
+ ->setParameter('file_target', '/foobar')
+ ->setParameter('permissions', 31)
+ ->setParameter('stime', time());
+
+ $this->assertSame(1, $query->execute());
+ }
+ }
+
+ $this->migration->addPasswordColumn();
+
+ $query = $this->connection->getQueryBuilder();
+ $query->select('*')->from('share');
+ $allShares = $query->execute()->fetchAll();
+
+ foreach ($allShares as $share) {
+ if ((int)$share['share_type'] === Share::SHARE_TYPE_LINK) {
+ $this->assertNull( $share['share_with']);
+ $this->assertSame('shareWith', $share['password']);
+ } else {
+ $this->assertSame('shareWith', $share['share_with']);
+ $this->assertNull($share['password']);
+ }
+ }
+ }
}