summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
Diffstat (limited to 'apps')
-rw-r--r--apps/files/lib/helper.php2
-rw-r--r--apps/files/tests/ajax_rename.php6
-rw-r--r--apps/files/tests/controller/apicontrollertest.php6
-rw-r--r--apps/files_sharing/appinfo/info.xml2
-rw-r--r--apps/files_sharing/appinfo/install.php1
-rw-r--r--apps/files_sharing/appinfo/update.php1
-rw-r--r--apps/files_sharing/lib/expiresharesjob.php76
-rw-r--r--apps/files_sharing/tests/expiresharesjobtest.php204
-rw-r--r--apps/provisioning_api/appinfo/routes.php2
-rw-r--r--apps/provisioning_api/lib/users.php27
-rw-r--r--apps/provisioning_api/tests/userstest.php78
11 files changed, 387 insertions, 18 deletions
diff --git a/apps/files/lib/helper.php b/apps/files/lib/helper.php
index 6bfdc0a095c..fb14cea731f 100644
--- a/apps/files/lib/helper.php
+++ b/apps/files/lib/helper.php
@@ -137,10 +137,8 @@ class Helper {
$entry['id'] = $i['fileid'];
$entry['parentId'] = $i['parent'];
- $entry['date'] = \OCP\Util::formatDate($i['mtime']);
$entry['mtime'] = $i['mtime'] * 1000;
// only pick out the needed attributes
- $entry['icon'] = \OCA\Files\Helper::determineIcon($i);
if (\OC::$server->getPreviewManager()->isAvailable($i)) {
$entry['isPreviewAvailable'] = true;
}
diff --git a/apps/files/tests/ajax_rename.php b/apps/files/tests/ajax_rename.php
index 45d49c9549d..00a62fa002d 100644
--- a/apps/files/tests/ajax_rename.php
+++ b/apps/files/tests/ajax_rename.php
@@ -117,9 +117,6 @@ class Test_OC_Files_App_Rename extends \Test\TestCase {
$this->assertEquals('abcdef', $result['data']['etag']);
$this->assertFalse(isset($result['data']['tags']));
$this->assertEquals('/', $result['data']['path']);
- $icon = \OC_Helper::mimetypeIcon('dir-external');
- $icon = substr($icon, 0, -3) . 'svg';
- $this->assertEquals($icon, $result['data']['icon']);
}
/**
@@ -182,9 +179,6 @@ class Test_OC_Files_App_Rename extends \Test\TestCase {
$this->assertEquals('abcdef', $result['data']['etag']);
$this->assertEquals(array('tag1', 'tag2'), $result['data']['tags']);
$this->assertEquals('/', $result['data']['path']);
- $icon = \OC_Helper::mimetypeIcon('text');
- $icon = substr($icon, 0, -3) . 'svg';
- $this->assertEquals($icon, $result['data']['icon']);
\OC::$server->registerService('TagManager', function ($c) use ($oldTagManager) {
return $oldTagManager;
diff --git a/apps/files/tests/controller/apicontrollertest.php b/apps/files/tests/controller/apicontrollertest.php
index 35d00af75ba..7f34c0a5642 100644
--- a/apps/files/tests/controller/apicontrollertest.php
+++ b/apps/files/tests/controller/apicontrollertest.php
@@ -110,9 +110,7 @@ class ApiControllerTest extends TestCase {
[
'id' => null,
'parentId' => null,
- 'date' => \OCP\Util::formatDate(55),
'mtime' => 55000,
- 'icon' => \OCA\Files\Helper::determineIcon($fileInfo),
'name' => 'root.txt',
'permissions' => null,
'mimetype' => 'application/pdf',
@@ -175,9 +173,7 @@ class ApiControllerTest extends TestCase {
[
'id' => null,
'parentId' => null,
- 'date' => \OCP\Util::formatDate(55),
'mtime' => 55000,
- 'icon' => \OCA\Files\Helper::determineIcon($fileInfo1),
'name' => 'root.txt',
'permissions' => null,
'mimetype' => 'application/pdf',
@@ -194,9 +190,7 @@ class ApiControllerTest extends TestCase {
[
'id' => null,
'parentId' => null,
- 'date' => \OCP\Util::formatDate(999),
'mtime' => 999000,
- 'icon' => \OCA\Files\Helper::determineIcon($fileInfo2),
'name' => 'root.txt',
'permissions' => null,
'mimetype' => 'application/binary',
diff --git a/apps/files_sharing/appinfo/info.xml b/apps/files_sharing/appinfo/info.xml
index 80925dd3d6b..72e56456961 100644
--- a/apps/files_sharing/appinfo/info.xml
+++ b/apps/files_sharing/appinfo/info.xml
@@ -11,7 +11,7 @@ Turning the feature off removes shared files and folders on the server for all s
<author>Michael Gapczynski, Bjoern Schiessle</author>
<shipped>true</shipped>
<default_enable/>
- <version>0.8.0</version>
+ <version>0.8.1</version>
<types>
<filesystem/>
</types>
diff --git a/apps/files_sharing/appinfo/install.php b/apps/files_sharing/appinfo/install.php
index f076a17e444..607e990346a 100644
--- a/apps/files_sharing/appinfo/install.php
+++ b/apps/files_sharing/appinfo/install.php
@@ -20,3 +20,4 @@
*/
\OC::$server->getJobList()->add('OCA\Files_sharing\Lib\DeleteOrphanedSharesJob');
+\OC::$server->getJobList()->add('OCA\Files_sharing\ExpireSharesJob');
diff --git a/apps/files_sharing/appinfo/update.php b/apps/files_sharing/appinfo/update.php
index 0eb3224c1ca..03fb78a05af 100644
--- a/apps/files_sharing/appinfo/update.php
+++ b/apps/files_sharing/appinfo/update.php
@@ -30,3 +30,4 @@ if (version_compare($installedVersion, '0.6.0', '<')) {
}
\OC::$server->getJobList()->add('OCA\Files_sharing\Lib\DeleteOrphanedSharesJob');
+\OC::$server->getJobList()->add('OCA\Files_sharing\ExpireSharesJob');
diff --git a/apps/files_sharing/lib/expiresharesjob.php b/apps/files_sharing/lib/expiresharesjob.php
new file mode 100644
index 00000000000..bcd3fbe4605
--- /dev/null
+++ b/apps/files_sharing/lib/expiresharesjob.php
@@ -0,0 +1,76 @@
+<?php
+/**
+ * @author Roeland Jago Douma <rullzer@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_Sharing;
+
+use OC\BackgroundJob\TimedJob;
+
+/**
+ * Delete all shares that are expired
+ */
+class ExpireSharesJob extends TimedJob {
+
+ /**
+ * sets the correct interval for this timed job
+ */
+ public function __construct() {
+ // Run once a day
+ $this->setInterval(24 * 60 * 60);
+ }
+
+ /**
+ * Makes the background job do its work
+ *
+ * @param array $argument unused argument
+ */
+ public function run($argument) {
+ $connection = \OC::$server->getDatabaseConnection();
+ $logger = \OC::$server->getLogger();
+
+ //Current time
+ $now = new \DateTime();
+ $now = $now->format('Y-m-d H:i:s');
+
+ /*
+ * Expire file link shares only (for now)
+ */
+ $qb = $connection->getQueryBuilder();
+ $qb->select('id', 'file_source', 'uid_owner', 'item_type')
+ ->from('share')
+ ->where(
+ $qb->expr()->andX(
+ $qb->expr()->eq('share_type', $qb->expr()->literal(\OCP\Share::SHARE_TYPE_LINK)),
+ $qb->expr()->lte('expiration', $qb->expr()->literal($now)),
+ $qb->expr()->orX(
+ $qb->expr()->eq('item_type', $qb->expr()->literal('file')),
+ $qb->expr()->eq('item_type', $qb->expr()->literal('folder'))
+ )
+ )
+ );
+
+ $shares = $qb->execute();
+ while($share = $shares->fetch()) {
+ \OCP\Share::unshare($share['item_type'], $share['file_source'], \OCP\Share::SHARE_TYPE_LINK, null, $share['uid_owner']);
+ }
+ $shares->closeCursor();
+ }
+
+}
diff --git a/apps/files_sharing/tests/expiresharesjobtest.php b/apps/files_sharing/tests/expiresharesjobtest.php
new file mode 100644
index 00000000000..90da4011d8b
--- /dev/null
+++ b/apps/files_sharing/tests/expiresharesjobtest.php
@@ -0,0 +1,204 @@
+<?php
+/**
+ * @author Vincent Petry <pvince81@owncloud.com>
+ *
+ * @copyright Copyright (c) 2015, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program. If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+namespace OCA\Files_Sharing\Tests;
+
+use OCA\Files_Sharing\ExpireSharesJob;
+
+class ExpireSharesJobTest extends \Test\TestCase {
+
+ /**
+ * @var ExpireSharesJob
+ */
+ private $job;
+
+ /**
+ * @var \OCP\IDBConnection
+ */
+ private $connection;
+
+ /**
+ * @var string
+ */
+ private $user1;
+
+ /**
+ * @var string
+ */
+ private $user2;
+
+ protected function setup() {
+ parent::setUp();
+
+ $this->connection = \OC::$server->getDatabaseConnection();
+ // clear occasional leftover shares from other tests
+ $this->connection->executeUpdate('DELETE FROM `*PREFIX*share`');
+
+ $this->user1 = $this->getUniqueID('user1_');
+ $this->user2 = $this->getUniqueID('user2_');
+
+ $userManager = \OC::$server->getUserManager();
+ $userManager->createUser($this->user1, 'pass');
+ $userManager->createUser($this->user2, 'pass');
+
+ \OC::registerShareHooks();
+
+ $this->job = new ExpireSharesJob();
+ }
+
+ protected function tearDown() {
+ $this->connection->executeUpdate('DELETE FROM `*PREFIX*share`');
+
+ $userManager = \OC::$server->getUserManager();
+ $user1 = $userManager->get($this->user1);
+ if($user1) {
+ $user1->delete();
+ }
+ $user2 = $userManager->get($this->user2);
+ if($user2) {
+ $user2->delete();
+ }
+
+ $this->logout();
+
+ parent::tearDown();
+ }
+
+ private function getShares() {
+ $shares = [];
+ $qb = $this->connection->getQueryBuilder();
+
+ $result = $qb->select('*')
+ ->from('share')
+ ->execute();
+
+ while ($row = $result->fetch()) {
+ $shares[] = $row;
+ }
+ $result->closeCursor();
+ return $shares;
+ }
+
+ public function dataExpireLinkShare() {
+ return [
+ [false, '', false, false],
+ [false, '', true, false],
+ [true, 'P1D', false, true],
+ [true, 'P1D', true, false],
+ [true, 'P1W', false, true],
+ [true, 'P1W', true, false],
+ [true, 'P1M', false, true],
+ [true, 'P1M', true, false],
+ [true, 'P1Y', false, true],
+ [true, 'P1Y', true, false],
+ ];
+ }
+
+ /**
+ * @dataProvider dataExpireLinkShare
+ *
+ * @param bool addExpiration Should we add an expire date
+ * @param string $interval The dateInterval
+ * @param bool $addInterval If true add to the current time if false subtract
+ * @param bool $shouldExpire Should this share be expired
+ */
+ public function testExpireLinkShare($addExpiration, $interval, $addInterval, $shouldExpire) {
+ $this->loginAsUser($this->user1);
+
+ $view = new \OC\Files\View('/' . $this->user1 . '/');
+ $view->mkdir('files/test');
+
+ $fileInfo = $view->getFileInfo('files/test');
+
+ $this->assertNotNull(
+ \OCP\Share::shareItem('folder', $fileInfo->getId(), \OCP\Share::SHARE_TYPE_LINK, null, \OCP\Constants::PERMISSION_READ),
+ 'Failed asserting that user 1 successfully shared "test" by link.'
+ );
+
+ $shares = $this->getShares();
+ $this->assertCount(1, $shares);
+ reset($shares);
+ $share = current($shares);
+
+ if ($addExpiration) {
+ $expire = new \DateTime();
+ $expire->setTime(0, 0, 0);
+ if ($addInterval) {
+ $expire->add(new \DateInterval($interval));
+ } else {
+ $expire->sub(new \DateInterval($interval));
+ }
+ $expire = $expire->format('Y-m-d 00:00:00');
+
+ // Set expiration date to yesterday
+ $qb = $this->connection->getQueryBuilder();
+ $qb->update('share')
+ ->set('expiration', $qb->createParameter('expiration'))
+ ->where($qb->expr()->eq('id', $qb->createParameter('id')))
+ ->setParameter('id', $share['id'])
+ ->setParameter('expiration', $expire)
+ ->execute();
+
+ $shares = $this->getShares();
+ $this->assertCount(1, $shares);
+ }
+
+ $this->logout();
+
+ $this->job->run([]);
+
+ $shares = $this->getShares();
+
+ if ($shouldExpire) {
+ $this->assertCount(0, $shares);
+ } else {
+ $this->assertCount(1, $shares);
+ }
+ }
+
+ public function testDoNotExpireOtherShares() {
+ $this->loginAsUser($this->user1);
+
+ $view = new \OC\Files\View('/' . $this->user1 . '/');
+ $view->mkdir('files/test');
+
+ $fileInfo = $view->getFileInfo('files/test');
+
+ $this->assertNotNull(
+ \OCP\Share::shareItem('folder', $fileInfo->getId(), \OCP\Share::SHARE_TYPE_USER, $this->user2, \OCP\Constants::PERMISSION_READ),
+ 'Failed asserting that user 1 successfully shared "test" by link with user2.'
+ );
+
+ $shares = $this->getShares();
+ $this->assertCount(1, $shares);
+ reset($shares);
+ $share = current($shares);
+
+ $this->logout();
+
+ $this->job->run([]);
+
+ $shares = $this->getShares();
+ $this->assertCount(1, $shares);
+ }
+
+}
+
diff --git a/apps/provisioning_api/appinfo/routes.php b/apps/provisioning_api/appinfo/routes.php
index 5c53684fd77..17cfea26572 100644
--- a/apps/provisioning_api/appinfo/routes.php
+++ b/apps/provisioning_api/appinfo/routes.php
@@ -33,7 +33,7 @@ $users = new \OCA\Provisioning_API\Users(
\OC::$server->getGroupManager(),
\OC::$server->getUserSession()
);
-API::register('get', '/cloud/users', [$users, 'getUsers'], 'provisioning_api', API::ADMIN_AUTH);
+API::register('get', '/cloud/users', [$users, 'getUsers'], 'provisioning_api', API::SUBADMIN_AUTH);
API::register('post', '/cloud/users', [$users, 'addUser'], 'provisioning_api', API::ADMIN_AUTH);
API::register('get', '/cloud/users/{userid}', [$users, 'getUser'], 'provisioning_api', API::USER_AUTH);
API::register('put', '/cloud/users/{userid}', [$users, 'editUser'], 'provisioning_api', API::USER_AUTH);
diff --git a/apps/provisioning_api/lib/users.php b/apps/provisioning_api/lib/users.php
index fc5e79d4b2b..0b529bcea2c 100644
--- a/apps/provisioning_api/lib/users.php
+++ b/apps/provisioning_api/lib/users.php
@@ -29,6 +29,7 @@ namespace OCA\Provisioning_API;
use \OC_OCS_Result;
use \OC_SubAdmin;
use \OC_Helper;
+use \OC_Group;
use OCP\Files\NotFoundException;
class Users {
@@ -71,7 +72,31 @@ class Users {
$limit = !empty($_GET['limit']) ? $_GET['limit'] : null;
$offset = !empty($_GET['offset']) ? $_GET['offset'] : null;
- $users = $this->userManager->search($search, $limit, $offset);
+ // Check if user is logged in
+ $user = $this->userSession->getUser();
+ if ($user === null) {
+ return new OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED);
+ }
+
+ // Admin? Or SubAdmin?
+ if($this->groupManager->isAdmin($user->getUID())){
+ $users = $this->userManager->search($search, $limit, $offset);
+ } else if (\OC_SubAdmin::isSubAdmin($user->getUID())) {
+ $subAdminOfGroups = \OC_SubAdmin::getSubAdminsGroups($user->getUID());
+
+ if($offset === null) {
+ $offset = 0;
+ }
+
+ $users = [];
+ foreach ($subAdminOfGroups as $group) {
+ $users = array_merge($users, $this->groupManager->displayNamesInGroup($group, $search));
+ }
+
+ $users = array_slice($users, $offset, $limit);
+ } else {
+ return new OC_OCS_Result(null, \OCP\API::RESPOND_UNAUTHORISED);
+ }
$users = array_keys($users);
return new OC_OCS_Result([
diff --git a/apps/provisioning_api/tests/userstest.php b/apps/provisioning_api/tests/userstest.php
index 350586f8335..3869af87e5a 100644
--- a/apps/provisioning_api/tests/userstest.php
+++ b/apps/provisioning_api/tests/userstest.php
@@ -63,10 +63,16 @@ class UsersTest extends TestCase {
$this->groupManager,
$this->userSession
);
+
+ $this->userSession->setUser(null);
}
// Test getting the list of users
- public function testGetUsers() {
+ public function testGetUsersAsAdmin() {
+ $user = $this->generateUsers();
+ $this->groupManager->get('admin')->addUser($user);
+ $this->userSession->setUser($user);
+
$result = $this->api->getUsers();
$this->assertInstanceOf('OC_OCS_Result', $result);
$this->assertTrue($result->succeeded());
@@ -103,6 +109,70 @@ class UsersTest extends TestCase {
$this->assertEquals(array_keys($this->userManager->search('', 1, 1)), $data['users']);
}
+ public function testGetUsersAsSubAdmin() {
+ $user = $this->generateUsers(10);
+ $this->userSession->setUser($user[0]);
+ $group = $this->groupManager->createGroup($this->getUniqueID());
+ \OC_SubAdmin::createSubAdmin($user[0]->getUID(), $group->getGID());
+
+ //Empty list
+ $result = $this->api->getUsers([]);
+ $this->assertInstanceOf('OC_OCS_Result', $result);
+ $this->assertTrue($result->succeeded());
+ $this->assertEquals(['users' => []], $result->getData());
+
+ //Some users in group
+ $group->addUser($user[1]);
+ $group->addUser($user[2]);
+ $group->addUser($user[3]);
+ $group->addUser($user[4]);
+
+ $result = $this->api->getUsers([]);
+ $this->assertInstanceOf('OC_OCS_Result', $result);
+ $this->assertTrue($result->succeeded());
+ $this->assertArrayHasKey('users', $result->getData());
+
+ $this->assertContains($user[1]->getUID(), $result->getData()['users']);
+ $this->assertContains($user[2]->getUID(), $result->getData()['users']);
+ $this->assertContains($user[3]->getUID(), $result->getData()['users']);
+ $this->assertContains($user[4]->getUID(), $result->getData()['users']);
+
+ $uids = [
+ $user[1]->getUID(),
+ $user[2]->getUID(),
+ $user[3]->getUID(),
+ $user[4]->getUID()
+ ];
+ sort($uids);
+
+ $_GET['limit'] = 2;
+ $_GET['offset'] = 1;
+ $result = $this->api->getUsers([]);
+
+ $this->assertInstanceOf('OC_OCS_Result', $result);
+ $this->assertTrue($result->succeeded());
+ $this->assertEquals(['users' => array_slice($uids, 1, 2)], $result->getData());
+ }
+
+ public function testGetUsersNoUser() {
+ $result = $this->api->getUsers([]);
+
+ $this->assertInstanceOf('OC_OCS_Result', $result);
+ $this->assertFalse($result->succeeded());
+ $this->assertEquals(\OCP\API::RESPOND_UNAUTHORISED, $result->getStatusCode());
+ }
+
+ public function testGetUsersAsUser() {
+ $user = $this->generateUsers();
+ $this->userSession->setUser($user);
+
+ $result = $this->api->getUsers();
+ $this->assertInstanceOf('OC_OCS_Result', $result);
+ $this->assertFalse($result->succeeded());
+ $this->assertEquals(\OCP\API::RESPOND_UNAUTHORISED, $result->getStatusCode());
+
+ }
+
public function testAddUser() {
$this->resetParams();
$_POST['userid'] = $this->getUniqueID();
@@ -794,6 +864,9 @@ class UsersTest extends TestCase {
}
public function testAddToGroupNoGroupId() {
+ $user = $this->generateUsers();
+ $this->userSession->setUser($user);
+
$_POST['groupid'] = '';
$result = $this->api->addToGroup([
'userid' => $this->getUniqueID(),
@@ -935,6 +1008,9 @@ class UsersTest extends TestCase {
}
public function testRemoveFromGroupNoGroupId() {
+ $user = $this->generateUsers();
+ $this->userSession->setUser($user);
+
$result = $this->api->removeFromGroup([
'_delete' => [
'groupid' => ''