Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(FolderManager): Use placeholder value for default quota instead of the current value on creation #3325

Merged
merged 3 commits into from
Oct 8, 2024
Merged
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
37 changes: 26 additions & 11 deletions lib/Folder/FolderManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
use OCP\DB\Exception;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\FileInfo;
use OCP\Files\IMimeTypeLoader;
use OCP\Files\IRootFolder;
use OCP\IConfig;
Expand All @@ -32,6 +33,8 @@
use Psr\Log\LoggerInterface;

class FolderManager {
public const SPACE_DEFAULT = -4;

public function __construct(
private IDBConnection $connection,
private IGroupManager $groupManager,
Expand Down Expand Up @@ -63,7 +66,7 @@ public function getAllFolders(): array {
'id' => $id,
'mount_point' => $row['mount_point'],
'groups' => $applicableMap[$id] ?? [],
'quota' => (int)$row['quota'],
'quota' => $this->getRealQuota((int)$row['quota']),
'size' => 0,
'acl' => (bool)$row['acl']
];
Expand Down Expand Up @@ -119,7 +122,7 @@ public function getAllFoldersWithSize(int $rootStorageId): array {
'id' => $id,
'mount_point' => $row['mount_point'],
'groups' => $applicableMap[$id] ?? [],
'quota' => (int)$row['quota'],
'quota' => $this->getRealQuota((int)$row['quota']),
'size' => $row['size'] ? (int)$row['size'] : 0,
'acl' => (bool)$row['acl'],
'manage' => $this->getManageAcl($mappings)
Expand Down Expand Up @@ -162,7 +165,7 @@ public function getAllFoldersForUserWithSize(int $rootStorageId, IUser $user): a
'id' => $id,
'mount_point' => $row['mount_point'],
'groups' => $applicableMap[$id] ?? [],
'quota' => (int)$row['quota'],
'quota' => $this->getRealQuota((int)$row['quota']),
'size' => $row['size'] ? (int)$row['size'] : 0,
'acl' => (bool)$row['acl'],
'manage' => $this->getManageAcl($mappings)
Expand Down Expand Up @@ -246,7 +249,7 @@ private function getManageAcl(array $mappings): array {
* @return ?array{id: mixed, mount_point: mixed, groups: array<string, array{displayName: string, type: string, permissions: integer}>, quota: int, size: int, acl: bool}
* @throws Exception
*/
public function getFolder(int $id, int $rootStorageId): ?array {
public function getFolder(int $id, int $rootStorageId = 0): ?array {
$applicableMap = $this->getAllApplicable();

$query = $this->connection->getQueryBuilder();
Expand All @@ -269,7 +272,7 @@ public function getFolder(int $id, int $rootStorageId): ?array {
'id' => $id,
'mount_point' => (string)$row['mount_point'],
'groups' => $applicableMap[$id] ?? [],
'quota' => (int)$row['quota'],
'quota' => $this->getRealQuota((int)$row['quota']),
'size' => $row['size'] ?: 0,
'acl' => (bool)$row['acl'],
'manage' => $this->getManageAcl($folderMappings)
Expand Down Expand Up @@ -490,7 +493,7 @@ public function getFoldersForGroup(string $groupId, int $rootStorageId = 0): arr
'folder_id' => (int)$folder['folder_id'],
'mount_point' => (string)$folder['mount_point'],
'permissions' => (int)$folder['group_permissions'],
'quota' => (int)$folder['quota'],
'quota' => $this->getRealQuota((int)$folder['quota']),
'acl' => (bool)$folder['acl'],
'rootCacheEntry' => (isset($folder['fileid'])) ? Cache::cacheEntryFromData($folder, $this->mimeTypeLoader) : null
], $result));
Expand Down Expand Up @@ -545,7 +548,7 @@ public function getFoldersForGroups(array $groupIds, int $rootStorageId = 0): ar
'folder_id' => (int)$folder['folder_id'],
'mount_point' => (string)$folder['mount_point'],
'permissions' => (int)$folder['group_permissions'],
'quota' => (int)$folder['quota'],
'quota' => $this->getRealQuota((int)$folder['quota']),
'acl' => (bool)$folder['acl'],
'rootCacheEntry' => (isset($folder['fileid'])) ? Cache::cacheEntryFromData($folder, $this->mimeTypeLoader) : null
], $result);
Expand Down Expand Up @@ -605,7 +608,7 @@ public function getFoldersFromCircleMemberships(IUser $user, int $rootStorageId
'folder_id' => (int)$folder['folder_id'],
'mount_point' => (string)$folder['mount_point'],
'permissions' => (int)$folder['group_permissions'],
'quota' => (int)$folder['quota'],
'quota' => $this->getRealQuota((int)$folder['quota']),
'acl' => (bool)$folder['acl'],
'rootCacheEntry' => (isset($folder['fileid'])) ? Cache::cacheEntryFromData($folder, $this->mimeTypeLoader) : null
], $query->executeQuery()->fetchAll());
Expand All @@ -616,14 +619,12 @@ public function getFoldersFromCircleMemberships(IUser $user, int $rootStorageId
* @throws Exception
*/
public function createFolder(string $mountPoint): int {
$defaultQuota = $this->config->getSystemValueInt('groupfolders.quota.default', -3);

$query = $this->connection->getQueryBuilder();

$query->insert('group_folders')
->values([
'mount_point' => $query->createNamedParameter($mountPoint),
'quota' => $defaultQuota,
'quota' => self::SPACE_DEFAULT,
]);
$query->executeStatement();
$id = $query->getLastInsertId();
Expand Down Expand Up @@ -912,4 +913,18 @@ public function getCirclesManager(): ?CirclesManager {
return null;
}
}

private function getRealQuota(int $quota): int {
if ($quota === self::SPACE_DEFAULT) {
$defaultQuota = $this->config->getSystemValueInt('groupfolders.quota.default', FileInfo::SPACE_UNLIMITED);
// Prevent setting the default quota option to be the default quota value creating an unresolvable self reference
if ($defaultQuota <= 0 && $defaultQuota !== FileInfo::SPACE_UNLIMITED) {
throw new \Exception('Default Groupfolder quota value ' . $defaultQuota . ' is not allowed');
}

return $defaultQuota;
}

return $quota;
}
}
2 changes: 2 additions & 0 deletions src/settings/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@ import AsyncSelect from 'react-select/async'
import AdminGroupSelect from './AdminGroupSelect'
import SubAdminGroupSelect from './SubAdminGroupSelect'
import { loadState } from '@nextcloud/initial-state'
import { t } from '@nextcloud/l10n'

const bytesInOneGibibyte = Math.pow(1024, 3)
const defaultQuotaOptions = {
Default: -4,
'1 GB': bytesInOneGibibyte,
'5 GB': bytesInOneGibibyte * 5,
'10 GB': bytesInOneGibibyte * 10,
Expand Down
79 changes: 73 additions & 6 deletions tests/Folder/FolderManagerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
use OCA\GroupFolders\Folder\FolderManager;
use OCP\Constants;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\Files\FileInfo;
use OCP\Files\IMimeTypeLoader;
use OCP\IConfig;
use OCP\IDBConnection;
Expand Down Expand Up @@ -38,10 +39,6 @@ protected function setUp(): void {
$this->logger = $this->createMock(LoggerInterface::class);
$this->eventDispatcher = $this->createMock(IEventDispatcher::class);
$this->config = $this->createMock(IConfig::class);
$this->config->expects($this->any())
->method('getSystemValueInt')
->with('groupfolders.quota.default', -3)
->willReturn(-3);
$this->manager = new FolderManager(
Server::get(IDBConnection::class),
$this->groupManager,
Expand Down Expand Up @@ -72,7 +69,7 @@ private function assertHasFolders(array $folders): void {
}

if (!isset($folder['quota'])) {
$folder['quota'] = -3;
$folder['quota'] = FileInfo::SPACE_UNLIMITED;
}

if (!isset($folder['acl'])) {
Expand All @@ -88,6 +85,11 @@ private function assertHasFolders(array $folders): void {
}

public function testCreateFolder(): void {
$this->config->expects($this->any())
->method('getSystemValueInt')
->with('groupfolders.quota.default', FileInfo::SPACE_UNLIMITED)
->willReturn(FileInfo::SPACE_UNLIMITED);

$this->manager->createFolder('foo');

$this->assertHasFolders([
Expand All @@ -96,6 +98,11 @@ public function testCreateFolder(): void {
}

public function testSetMountpoint(): void {
$this->config->expects($this->any())
->method('getSystemValueInt')
->with('groupfolders.quota.default', FileInfo::SPACE_UNLIMITED)
->willReturn(FileInfo::SPACE_UNLIMITED);

$folderId1 = $this->manager->createFolder('foo');
$this->manager->createFolder('bar');

Expand All @@ -108,6 +115,11 @@ public function testSetMountpoint(): void {
}

public function testAddApplicable(): void {
$this->config->expects($this->any())
->method('getSystemValueInt')
->with('groupfolders.quota.default', FileInfo::SPACE_UNLIMITED)
->willReturn(FileInfo::SPACE_UNLIMITED);

$folderId1 = $this->manager->createFolder('foo');
$folderId2 = $this->manager->createFolder('bar');
$this->manager->addApplicableGroup($folderId1, 'g1');
Expand Down Expand Up @@ -153,6 +165,11 @@ public function testAddApplicable(): void {
}

public function testSetPermissions(): void {
$this->config->expects($this->any())
->method('getSystemValueInt')
->with('groupfolders.quota.default', FileInfo::SPACE_UNLIMITED)
->willReturn(FileInfo::SPACE_UNLIMITED);

$folderId1 = $this->manager->createFolder('foo');
$this->manager->addApplicableGroup($folderId1, 'g1');
$this->manager->addApplicableGroup($folderId1, 'g2');
Expand Down Expand Up @@ -181,6 +198,11 @@ public function testSetPermissions(): void {
}

public function testRemoveApplicable(): void {
$this->config->expects($this->any())
->method('getSystemValueInt')
->with('groupfolders.quota.default', FileInfo::SPACE_UNLIMITED)
->willReturn(FileInfo::SPACE_UNLIMITED);

$folderId1 = $this->manager->createFolder('foo');
$folderId2 = $this->manager->createFolder('bar');
$this->manager->addApplicableGroup($folderId1, 'g1');
Expand Down Expand Up @@ -224,6 +246,11 @@ public function testRemoveApplicable(): void {
}

public function testRemoveFolder(): void {
$this->config->expects($this->any())
->method('getSystemValueInt')
->with('groupfolders.quota.default', FileInfo::SPACE_UNLIMITED)
->willReturn(FileInfo::SPACE_UNLIMITED);

$folderId1 = $this->manager->createFolder('foo');
$this->manager->createFolder('bar');

Expand All @@ -235,6 +262,11 @@ public function testRemoveFolder(): void {
}

public function testRenameFolder(): void {
$this->config->expects($this->any())
->method('getSystemValueInt')
->with('groupfolders.quota.default', FileInfo::SPACE_UNLIMITED)
->willReturn(FileInfo::SPACE_UNLIMITED);

$folderId1 = $this->manager->createFolder('foo');
$this->manager->createFolder('other');

Expand All @@ -247,6 +279,11 @@ public function testRenameFolder(): void {
}

public function testSetACL(): void {
$this->config->expects($this->any())
->method('getSystemValueInt')
->with('groupfolders.quota.default', FileInfo::SPACE_UNLIMITED)
->willReturn(FileInfo::SPACE_UNLIMITED);

$folderId1 = $this->manager->createFolder('foo');
$this->manager->createFolder('other');

Expand All @@ -266,6 +303,11 @@ public function testSetACL(): void {
}

public function testGetFoldersForGroup(): void {
$this->config->expects($this->any())
->method('getSystemValueInt')
->with('groupfolders.quota.default', FileInfo::SPACE_UNLIMITED)
->willReturn(FileInfo::SPACE_UNLIMITED);

$folderId1 = $this->manager->createFolder('foo');
$this->manager->addApplicableGroup($folderId1, 'g1');
$this->manager->addApplicableGroup($folderId1, 'g2');
Expand All @@ -279,6 +321,11 @@ public function testGetFoldersForGroup(): void {
}

public function testGetFoldersForGroups(): void {
$this->config->expects($this->any())
->method('getSystemValueInt')
->with('groupfolders.quota.default', FileInfo::SPACE_UNLIMITED)
->willReturn(FileInfo::SPACE_UNLIMITED);

$folderId1 = $this->manager->createFolder('foo');
$this->manager->addApplicableGroup($folderId1, 'g1');
$this->manager->addApplicableGroup($folderId1, 'g2');
Expand Down Expand Up @@ -323,7 +370,7 @@ public function testGetFoldersForUserSimple(): void {
'folder_id' => 1,
'mount_point' => 'foo',
'permissions' => 31,
'quota' => -3
'quota' => FileInfo::SPACE_UNLIMITED,
];

$manager->expects($this->once())
Expand Down Expand Up @@ -399,4 +446,24 @@ public function testGetFolderPermissionsForUserMerge(): void {
$permissions = $manager->getFolderPermissionsForUser($this->getUser(['g1', 'g2', 'g3']), 2);
$this->assertEquals(0, $permissions);
}

public function testQuotaDefaultValue(): void {
$folderId1 = $this->manager->createFolder('foo');

$exponent = 3;
$this->config->expects($this->any())
->method('getSystemValueInt')
->with('groupfolders.quota.default', FileInfo::SPACE_UNLIMITED)
->willReturnCallback(function () use (&$exponent) {
return 1024 ** ($exponent++);
});

/** @var array $folder */
$folder = $this->manager->getFolder($folderId1);
$this->assertEquals(1024 ** 3, $folder['quota']);

/** @var array $folder */
$folder = $this->manager->getFolder($folderId1);
$this->assertEquals(1024 ** 4, $folder['quota']);
}
}
Loading