Skip to content

Commit

Permalink
Merge branch 'nextcloud:master' into fix_limit_1000
Browse files Browse the repository at this point in the history
  • Loading branch information
to-kn authored Dec 20, 2021
2 parents 4b9941c + 3e116c7 commit 6e3479e
Show file tree
Hide file tree
Showing 13 changed files with 1,053 additions and 1,787 deletions.
5 changes: 1 addition & 4 deletions .github/workflows/static-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,7 @@ jobs:
coverage: none

- name: Install dependencies
run: composer i

- name: Install dependencies
run: composer require --dev christophwurst/nextcloud:${{ matrix.ocp-version }}
run: composer install --dev

- name: Run coding standards check
run: composer run psalm
39 changes: 21 additions & 18 deletions composer.json
Original file line number Diff line number Diff line change
@@ -1,20 +1,23 @@
{
"require-dev": {
"phpunit/phpunit": "^9",
"psalm/phar": "^4.3",
"sabre/dav": "^4.1",
"sabre/xml": "^2.2",
"symfony/event-dispatcher": "^5.3.11",
"christophwurst/nextcloud": "dev-master"
},
"require": {
"php-parallel-lint/php-parallel-lint": "^1.2"
},
"scripts": {
"lint": "find . -name \\*.php -not -path './vendor/*' -print0 | xargs -0 -n1 php -l",
"cs:check": "php-cs-fixer fix --dry-run --diff",
"cs:fix": "php-cs-fixer fix",
"psalm": "psalm.phar",
"psalm:fix": "psalm.phar --alter --issues=InvalidReturnType,InvalidNullableReturnType,MismatchingDocblockParamType,MismatchingDocblockReturnType,MissingParamType,InvalidFalsableReturnType"
}
"require-dev": {
"phpunit/phpunit": "^9",
"psalm/phar": "^4.3",
"sabre/dav": "^4.1",
"sabre/xml": "^2.2",
"symfony/event-dispatcher": "^5.3.11",
"christophwurst/nextcloud": "dev-master@dev",
"vimeo/psalm": "^4.10"
},
"require": {
"php-parallel-lint/php-parallel-lint": "^1.2"
},
"scripts": {
"lint": "find . -name \\*.php -not -path './vendor/*' -print0 | xargs -0 -n1 php -l",
"cs:check": "php-cs-fixer fix --dry-run --diff",
"cs:fix": "php-cs-fixer fix",
"psalm": "psalm.phar --threads=1",
"psalm:update-baseline": "psalm.phar --threads=1 --update-baseline --set-baseline=tests/psalm-baseline.xml",
"psalm:clear": "psalm.phar --clear-cache && psalm --clear-global-cache",
"psalm:fix": "psalm.phar --alter --issues=InvalidReturnType,InvalidNullableReturnType,MissingParamType,InvalidFalsableReturnType"
}
}
218 changes: 105 additions & 113 deletions lib/Command/ACL.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
namespace OCA\GroupFolders\Command;

use OC\Core\Command\Base;
use OCA\GroupFolders\Command\FolderCommand;
use OCA\GroupFolders\ACL\ACLManagerFactory;
use OCA\GroupFolders\ACL\Rule;
use OCA\GroupFolders\ACL\RuleManager;
Expand All @@ -37,7 +38,7 @@
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

class ACL extends Base {
class ACL extends FolderCommand {
const PERMISSIONS_MAP = [
'read' => Constants::PERMISSION_READ,
'write' => Constants::PERMISSION_UPDATE,
Expand All @@ -46,10 +47,7 @@ class ACL extends Base {
'share' => Constants::PERMISSION_SHARE,
];

private $folderManager;
private $rootFolder;
private $ruleManager;
private $mountProvider;
private $aclManagerFactory;
private $userManager;

Expand All @@ -61,11 +59,8 @@ public function __construct(
ACLManagerFactory $aclManagerFactory,
IUserManager $userManager
) {
parent::__construct();
$this->folderManager = $folderManager;
$this->rootFolder = $rootFolder;
parent::__construct($folderManager, $rootFolder, $mountProvider);
$this->ruleManager = $ruleManager;
$this->mountProvider = $mountProvider;
$this->aclManagerFactory = $aclManagerFactory;
$this->userManager = $userManager;
}
Expand All @@ -88,117 +83,114 @@ protected function configure() {
}

protected function execute(InputInterface $input, OutputInterface $output) {
$folderId = $input->getArgument('folder_id');
$folder = $this->folderManager->getFolder($folderId, $this->rootFolder->getMountPoint()->getNumericStorageId());
if ($folder) {
if ($input->getOption('enable')) {
$this->folderManager->setFolderACL($folderId, true);
} elseif ($input->getOption('disable')) {
$this->folderManager->setFolderACL($folderId, false);
} elseif ($input->getOption('test')) {
if ($input->getOption('user') && ($input->getArgument('path'))) {
$mappingId = $input->getOption('user');
$user = $this->userManager->get($mappingId);
if (!$user) {
$output->writeln('<error>User not found: ' . $mappingId . '</error>');
return -1;
}
$jailPath = $this->mountProvider->getJailPath((int)$folder['id']);
$path = $input->getArgument('path');
$aclManager = $this->aclManagerFactory->getACLManager($user);
$permissions = $aclManager->getACLPermissionsForPath($jailPath . rtrim('/' . $path, '/'));
$permissionString = $this->formatRulePermissions(Constants::PERMISSION_ALL, $permissions);
$output->writeln($permissionString);
return;
} else {
$output->writeln('<error>--user and <path> options needs to be set for permissions testing</error>');
return -3;
}
} elseif (!$folder['acl']) {
$output->writeln('<error>Advanced permissions not enabled for folder: ' . $folderId . '</error>');
return -2;
} elseif (
!$input->getArgument('path') &&
!$input->getArgument('permissions') &&
!$input->getOption('user') &&
!$input->getOption('group')
) {
$this->printPermissions($input, $output, $folder);
} elseif ($input->getOption('manage-add') && ($input->getOption('user') || $input->getOption('group'))) {
$mappingType = $input->getOption('user') ? 'user' : 'group';
$mappingId = $input->getOption('user') ? $input->getOption('user') : $input->getOption('group');
$this->folderManager->setManageACL($folderId, $mappingType, $mappingId, true);
} elseif ($input->getOption('manage-remove') && ($input->getOption('user') || $input->getOption('group'))) {
$mappingType = $input->getOption('user') ? 'user' : 'group';
$mappingId = $input->getOption('user') ? $input->getOption('user') : $input->getOption('group');
$this->folderManager->setManageACL($folderId, $mappingType, $mappingId, false);
} elseif (!$input->getArgument('path')) {
$output->writeln('<error><path> argument has to be set when not using --enable or --disable</error>');
return -3;
} elseif (!$input->getArgument('permissions')) {
$output->writeln('<error><permissions> argument has to be set when not using --enable or --disable</error>');
return -3;
} elseif ($input->getOption('user') && $input->getOption('group')) {
$output->writeln('<error>--user and --group can not be used at the same time</error>');
return -3;
} elseif (!$input->getOption('user') && !$input->getOption('group')) {
$output->writeln('<error>either --user or --group has to be used when not using --enable or --disable</error>');
return -3;
} else {
$mappingType = $input->getOption('user') ? 'user' : 'group';
$mappingId = $input->getOption('user') ? $input->getOption('user') : $input->getOption('group');
$path = $input->getArgument('path');
$path = trim($path, '/');
$permissionStrings = $input->getArgument('permissions');

$mount = $this->mountProvider->getMount(
$folder['id'],
'/dummy/files/' . $folder['mount_point'],
$folder['permissions'],
$folder['quota'],
$folder['rootCacheEntry'],
null,
$folder['acl']
);
$id = $mount->getStorage()->getCache()->getId($path);
if ($id === -1) {
$output->writeln('<error>Path not found in folder: ' . $path . '</error>');
$folder = $this->getFolder($input, $output);
if ($folder === false) {
return -1;
}
if ($input->getOption('enable')) {
$this->folderManager->setFolderACL($folder['id'], true);
} elseif ($input->getOption('disable')) {
$this->folderManager->setFolderACL($folder['id'], false);
} elseif ($input->getOption('test')) {
if ($input->getOption('user') && ($input->getArgument('path'))) {
$mappingId = $input->getOption('user');
$user = $this->userManager->get($mappingId);
if (!$user) {
$output->writeln('<error>User not found: ' . $mappingId . '</error>');
return -1;
}
$jailPath = $this->mountProvider->getJailPath((int)$folder['id']);
$path = $input->getArgument('path');
$aclManager = $this->aclManagerFactory->getACLManager($user);
$permissions = $aclManager->getACLPermissionsForPath($jailPath . rtrim('/' . $path, '/'));
$permissionString = $this->formatRulePermissions(Constants::PERMISSION_ALL, $permissions);
$output->writeln($permissionString);
return 0;
} else {
$output->writeln('<error>--user and <path> options needs to be set for permissions testing</error>');
return -3;
}
} elseif (!$folder['acl']) {
$output->writeln('<error>Advanced permissions not enabled for folder: ' . $folder['id'] . '</error>');
return -2;
} elseif (
!$input->getArgument('path') &&
!$input->getArgument('permissions') &&
!$input->getOption('user') &&
!$input->getOption('group')
) {
$this->printPermissions($input, $output, $folder);
} elseif ($input->getOption('manage-add') && ($input->getOption('user') || $input->getOption('group'))) {
$mappingType = $input->getOption('user') ? 'user' : 'group';
$mappingId = $input->getOption('user') ? $input->getOption('user') : $input->getOption('group');
$this->folderManager->setManageACL($folder['id'], $mappingType, $mappingId, true);
} elseif ($input->getOption('manage-remove') && ($input->getOption('user') || $input->getOption('group'))) {
$mappingType = $input->getOption('user') ? 'user' : 'group';
$mappingId = $input->getOption('user') ? $input->getOption('user') : $input->getOption('group');
$this->folderManager->setManageACL($folder['id'], $mappingType, $mappingId, false);
} elseif (!$input->getArgument('path')) {
$output->writeln('<error><path> argument has to be set when not using --enable or --disable</error>');
return -3;
} elseif (!$input->getArgument('permissions')) {
$output->writeln('<error><permissions> argument has to be set when not using --enable or --disable</error>');
return -3;
} elseif ($input->getOption('user') && $input->getOption('group')) {
$output->writeln('<error>--user and --group can not be used at the same time</error>');
return -3;
} elseif (!$input->getOption('user') && !$input->getOption('group')) {
$output->writeln('<error>either --user or --group has to be used when not using --enable or --disable</error>');
return -3;
} else {
$mappingType = $input->getOption('user') ? 'user' : 'group';
$mappingId = $input->getOption('user') ? $input->getOption('user') : $input->getOption('group');
$path = $input->getArgument('path');
$path = trim($path, '/');
$permissionStrings = $input->getArgument('permissions');

if ($permissionStrings === ['clear']) {
$this->ruleManager->deleteRule(new Rule(
new UserMapping($mappingType, $mappingId),
$id,
0,
0
));
} else {
foreach ($permissionStrings as $permission) {
if ($permission[0] !== '+' && $permission[0] !== '-') {
$output->writeln('<error>incorrect format for permissions "' . $permission . '"</error>');
return -3;
}
$name = substr($permission, 1);
if (!isset(self::PERMISSIONS_MAP[$name])) {
$output->writeln('<error>incorrect format for permissions2 "' . $permission . '"</error>');
return -3;
}
}

[$mask, $permissions] = $this->parsePermissions($permissionStrings);
$mount = $this->mountProvider->getMount(
$folder['id'],
'/dummy/files/' . $folder['mount_point'],
$folder['permissions'],
$folder['quota'],
$folder['rootCacheEntry'],
null,
$folder['acl']
);
$id = $mount->getStorage()->getCache()->getId($path);
if ($id === -1) {
$output->writeln('<error>Path not found in folder: ' . $path . '</error>');
return -1;
}

$this->ruleManager->saveRule(new Rule(
new UserMapping($mappingType, $mappingId),
$id,
$mask,
$permissions
));
if ($permissionStrings === ['clear']) {
$this->ruleManager->deleteRule(new Rule(
new UserMapping($mappingType, $mappingId),
$id,
0,
0
));
return 0;
}
foreach ($permissionStrings as $permission) {
if ($permission[0] !== '+' && $permission[0] !== '-') {
$output->writeln('<error>incorrect format for permissions "' . $permission . '"</error>');
return -3;
}
$name = substr($permission, 1);
if (!isset(self::PERMISSIONS_MAP[$name])) {
$output->writeln('<error>incorrect format for permissions2 "' . $permission . '"</error>');
return -3;
}
}
} else {
$output->writeln('<error>Folder not found: ' . $folderId . '</error>');
return -1;

[$mask, $permissions] = $this->parsePermissions($permissionStrings);

$this->ruleManager->saveRule(new Rule(
new UserMapping($mappingType, $mappingId),
$id,
$mask,
$permissions
));
}
return 0;
}
Expand Down
5 changes: 2 additions & 3 deletions lib/Command/Create.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,12 @@
use Symfony\Component\Console\Output\OutputInterface;

class Create extends Base {
/** @var FolderManager $folderManager */
private $folderManager;
private $rootFolder;

public function __construct(FolderManager $folderManager, IRootFolder $rootFolder) {
public function __construct(FolderManager $folderManager) {
parent::__construct();
$this->folderManager = $folderManager;
$this->rootFolder = $rootFolder;
}

protected function configure() {
Expand Down
40 changes: 12 additions & 28 deletions lib/Command/Delete.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,27 +22,14 @@
namespace OCA\GroupFolders\Command;

use OC\Core\Command\Base;
use OCA\GroupFolders\Folder\FolderManager;
use OCA\GroupFolders\Mount\MountProvider;
use OCP\Files\IRootFolder;
use OCA\GroupFolders\Command\FolderCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Question\ConfirmationQuestion;

class Delete extends Base {
private $folderManager;
private $rootFolder;
private $mountProvider;

public function __construct(FolderManager $folderManager, IRootFolder $rootFolder, MountProvider $mountProvider) {
parent::__construct();
$this->folderManager = $folderManager;
$this->rootFolder = $rootFolder;
$this->mountProvider = $mountProvider;
}

class Delete extends FolderCommand {
protected function configure() {
$this
->setName('groupfolders:delete')
Expand All @@ -53,20 +40,17 @@ protected function configure() {
}

protected function execute(InputInterface $input, OutputInterface $output) {
$folderId = $input->getArgument('folder_id');
$folder = $this->folderManager->getFolder($folderId, $this->rootFolder->getMountPoint()->getNumericStorageId());
if ($folder) {
$helper = $this->getHelper('question');
$question = new ConfirmationQuestion('Are you sure you want to delete the group folder' . $folder['mount_point'] . ' and all files within, this cannot be undone (y/N).', false);
if ($input->getOption('force') || $helper->ask($input, $output, $question)) {
$folder = $this->mountProvider->getFolder($folderId);
$this->folderManager->removeFolder($folderId);
$folder->delete();
}
return 0;
} else {
$output->writeln('<error>Folder not found: ' . $folderId . '</error>');
$folder = $this->getFolder($input, $output);
if ($folder === false) {
return -1;
}
$helper = $this->getHelper('question');
$question = new ConfirmationQuestion('Are you sure you want to delete the group folder ' . $folder['mount_point'] . ' and all files within, this cannot be undone (y/N).', false);
if ($input->getOption('force') || $helper->ask($input, $output, $question)) {
$folderMount = $this->mountProvider->getFolder($folder['id']);
$this->folderManager->removeFolder($folder['id']);
$folderMount->delete();
}
return 0;
}
}
Loading

0 comments on commit 6e3479e

Please sign in to comment.