diff --git a/.github/workflows/npm-audit-fix.yml b/.github/workflows/npm-audit-fix.yml index 4f51e2b21..0fa447f3f 100644 --- a/.github/workflows/npm-audit-fix.yml +++ b/.github/workflows/npm-audit-fix.yml @@ -18,7 +18,7 @@ jobs: strategy: fail-fast: false matrix: - branches: ['main', 'master', 'stable28', 'stable27', 'stable26'] + branches: ['main', 'master', 'stable29', 'stable28', 'stable27'] name: npm-audit-fix-${{ matrix.branches }} diff --git a/.github/workflows/update-nextcloud-ocp.yml b/.github/workflows/update-nextcloud-ocp.yml index 2d65b4407..7ba334c7e 100644 --- a/.github/workflows/update-nextcloud-ocp.yml +++ b/.github/workflows/update-nextcloud-ocp.yml @@ -17,7 +17,7 @@ jobs: strategy: fail-fast: false matrix: - branches: ['main', 'master', 'stable28', 'stable27', 'stable26'] + branches: ['main', 'master', 'stable29', 'stable28', 'stable27'] name: update-nextcloud-ocp-${{ matrix.branches }} diff --git a/appinfo/info.xml b/appinfo/info.xml index bd21de7ee..f4ee8dbb5 100644 --- a/appinfo/info.xml +++ b/appinfo/info.xml @@ -10,7 +10,7 @@ Folders can be configured from *Group folders* in the admin settings. After a folder is created, the admin can give access to the folder to one or more groups, control their write/sharing permissions and assign a quota for the folder. Note: Encrypting the contents of group folders is currently not supported.]]> - 17.0.0-beta.1 + 18.0.0-beta.1 agpl Robin Appelman GroupFolders @@ -30,7 +30,7 @@ Note: Encrypting the contents of group folders is currently not supported.]]>https://raw.githubusercontent.com/nextcloud/groupfolders/master/screenshots/permissions.png - + diff --git a/composer.lock b/composer.lock index 0289b6fec..53b1ed983 100644 --- a/composer.lock +++ b/composer.lock @@ -245,12 +245,12 @@ "source": { "type": "git", "url": "https://github.com/nextcloud-deps/ocp.git", - "reference": "14e4b4c5bb3f9189b78c9d29bfc6a049046c2d71" + "reference": "e84a723ae9c0d590e3a4deaba9d4fba54bd66184" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/14e4b4c5bb3f9189b78c9d29bfc6a049046c2d71", - "reference": "14e4b4c5bb3f9189b78c9d29bfc6a049046c2d71", + "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/e84a723ae9c0d590e3a4deaba9d4fba54bd66184", + "reference": "e84a723ae9c0d590e3a4deaba9d4fba54bd66184", "shasum": "" }, "require": { @@ -282,7 +282,7 @@ "issues": "https://github.com/nextcloud-deps/ocp/issues", "source": "https://github.com/nextcloud-deps/ocp/tree/master" }, - "time": "2024-04-24T00:33:09+00:00" + "time": "2024-05-01T00:36:22+00:00" }, { "name": "nikic/php-parser", diff --git a/package-lock.json b/package-lock.json index 054cfb022..c52adff4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -66,7 +66,8 @@ "engines": { "node": "^20.0.0", "npm": "^9.0.0" - } + }, + "version": "18.0.0-beta.1" }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", @@ -22730,5 +22731,6 @@ "url": "https://github.com/sponsors/wooorm" } } - } + }, + "version": "18.0.0-beta.1" } diff --git a/package.json b/package.json index 1e9f318c2..a00928669 100644 --- a/package.json +++ b/package.json @@ -75,5 +75,6 @@ "vue-template-compiler": "^2.7.14", "webdav": "^5.5.0", "whatwg-fetch": "^3.6.20" - } + }, + "version": "18.0.0-beta.1" } diff --git a/tests/stub.phpstub b/tests/stub.phpstub index 8a306892f..4228f6bee 100644 --- a/tests/stub.phpstub +++ b/tests/stub.phpstub @@ -916,14 +916,13 @@ namespace OC\Files\Mount { } namespace OC\Files\Storage { - use OCP\Files\Cache\ICache; - use OCP\Files\Cache\ICacheEntry; - use OCP\Files\Search\ISearchQuery; - use OC\Files\Storage\Storage; - use OCP\Files\Storage\IStorage; - use OCP\Files\Cache\IScanner; - - interface Storage extends \OCP\Files\Storage { + /** + * Provide a common interface to all different storage options + * + * All paths passed to the storage are relative to the storage and should NOT have a leading slash. + */ + interface Storage extends \OCP\Files\Storage + { /** * get a cache instance for the storage * @@ -932,7 +931,6 @@ namespace OC\Files\Storage { * @return \OC\Files\Cache\Cache */ public function getCache($path = '', $storage = null); - /** * get a scanner instance for the storage * @@ -941,8 +939,6 @@ namespace OC\Files\Storage { * @return \OC\Files\Cache\Scanner */ public function getScanner($path = '', $storage = null); - - /** * get the user id of the owner of a file or folder * @@ -950,7 +946,6 @@ namespace OC\Files\Storage { * @return string */ public function getOwner($path); - /** * get a watcher instance for the cache * @@ -959,7 +954,6 @@ namespace OC\Files\Storage { * @return \OC\Files\Cache\Watcher */ public function getWatcher($path = '', $storage = null); - /** * get a propagator instance for the cache * @@ -967,7 +961,6 @@ namespace OC\Files\Storage { * @return \OC\Files\Cache\Propagator */ public function getPropagator($storage = null); - /** * get a updater instance for the cache * @@ -975,42 +968,36 @@ namespace OC\Files\Storage { * @return \OC\Files\Cache\Updater */ public function getUpdater($storage = null); - /** * @return \OC\Files\Cache\Storage */ public function getStorageCache(); - /** * @param string $path * @return array|null */ public function getMetaData($path); - /** * @param string $path The path of the file to acquire the lock for * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE * @param \OCP\Lock\ILockingProvider $provider * @throws \OCP\Lock\LockedException */ - public function acquireLock($path, $type, ILockingProvider $provider); - + public function acquireLock($path, $type, \OCP\Lock\ILockingProvider $provider); /** * @param string $path The path of the file to release the lock for * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE * @param \OCP\Lock\ILockingProvider $provider * @throws \OCP\Lock\LockedException */ - public function releaseLock($path, $type, ILockingProvider $provider); - + public function releaseLock($path, $type, \OCP\Lock\ILockingProvider $provider); /** * @param string $path The path of the file to change the lock for * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE * @param \OCP\Lock\ILockingProvider $provider * @throws \OCP\Lock\LockedException */ - public function changeLock($path, $type, ILockingProvider $provider); - + public function changeLock($path, $type, \OCP\Lock\ILockingProvider $provider); /** * Get the contents of a directory with metadata * @@ -1027,18 +1014,12 @@ namespace OC\Files\Storage { * - storage_mtime * - permissions */ - public function getDirectoryContent($directory): \Traversable; + public function getDirectoryContent($directory) : \Traversable; } } namespace OC\Files\Storage\Wrapper{ - - use OCP\Files\Cache\ICache; - use OCP\Files\Cache\ICacheEntry; - use OCP\Files\Search\ISearchQuery; - use OC\Files\Storage\Storage; use OCP\Files\Storage\IStorage; - use OCP\Files\Cache\IScanner; class Wrapper implements \OC\Files\Storage\Storage, \OCP\Files\Storage\ILockingStorage, \OCP\Files\Storage\IWriteStreamStorage { @@ -1539,120 +1520,720 @@ namespace OC\Files\Storage\Wrapper{ public function needsPartFile() { } - public function writeStream(string $path, $stream, int $size = null) : int + public function writeStream(string $path, $stream, ?int $size = null) : int { } public function getDirectoryContent($directory) : \Traversable { } + public function isWrapperOf(\OCP\Files\Storage\IStorage $storage) + { + } + public function setOwner(?string $user) : void + { + } } - - - - class Jail extends Wrapper { - public function getUnjailedPath(string $path): string {} - public function getUnjailedStorage(): IStorage {} - } - - class Quota extends Wrapper { - public function getQuota() {} - } - - class PermissionsMask extends Wrapper { - public function getQuota() {} - } -} - -namespace OC\Files\ObjectStore { - use OC\Files\Storage\Wrapper\Wrapper; - class ObjectStoreStorage extends Wrapper {} -} - -namespace OCA\Circles { - use OCA\Circles\Model\Circle; - use OCA\Circles\Model\FederatedUser; - use OCA\Circles\Model\Probes\CircleProbe; - use OCA\Circles\Model\Probes\DataProbe; - use OCP\DB\QueryBuilder\ICompositeExpression; - use OCP\DB\QueryBuilder\IQueryBuilder; - - interface IFederatedUser { - - } - - class CirclesManager { - public function startSession(?FederatedUser $federatedUser = null): void {} - public function probeCircles(?CircleProbe $circleProbe = null, ?DataProbe $dataProbe = null): array {} - public function getQueryHelper(): CirclesQueryHelper {} - public function getLocalFederatedUser(string $userId): FederatedUser {} - public function startSuperSession(): void {} - public function stopSession(): void {} - public function getCircle(string $singleId, ?CircleProbe $probe = null): Circle {} - } - - class CirclesQueryHelper{ - public function addCircleDetails(string $alias, string $field): void {} - public function getQueryBuilder(): IQueryBuilder {} - public function extractCircle(array $data): Circle {} - public function limitToInheritedMembers(string $alias, string $field, IFederatedUser $federatedUser, bool $fullDetails = false): ICompositeExpression {} - } -} - -namespace OCA\Circles\Exceptions { - class CircleNotFoundException extends \Exception { - } -} - -namespace OCA\Circles\Model { - use OCA\Circles\IFederatedUser; - - class FederatedUser implements IFederatedUser { - } - class CircleProbe { - } - class DataProbe { - } - class Circle { - public function getDisplayName(): string {} - public function getSingleId(): string {} - } -} - -namespace OCA\Circles\Model\Probes { - class CircleProbe { - public function includeSystemCircles(bool $include = true): self {} - public function includeSingleCircles(bool $include = true): self {} - } -} - -namespace OCA\Circles\Events { - use OCA\Circles\Model\Circle; - - class CircleDestroyedEvent extends \OCP\EventDispatcher\Event { - public function getCircle(): Circle {} - } -} - - -namespace OCA\DAV\Connector\Sabre\Exception { - class Forbidden extends \Sabre\DAV\Exception\Forbidden { - public const NS_OWNCLOUD = 'http://owncloud.org/ns'; - + /** + * Jail to a subdirectory of the wrapped storage + * + * This restricts access to a subfolder of the wrapped storage with the subfolder becoming the root folder new storage + */ + class Jail extends \OC\Files\Storage\Wrapper\Wrapper + { /** - * @param string $message - * @param bool $retry - * @param \Exception $previous + * @var string */ - public function __construct($message, $retry = false, \Exception $previous = null) {} - + protected $rootPath; /** - * This method allows the exception to include additional information - * into the WebDAV error response + * @param array $arguments ['storage' => $storage, 'root' => $root] * - * @param \Sabre\DAV\Server $server - * @param \DOMElement $errorNode - * @return void + * $storage: The storage that will be wrapper + * $root: The folder in the wrapped storage that will become the root folder of the wrapped storage */ - public function serialize(\Sabre\DAV\Server $server, \DOMElement $errorNode) {} - } -} \ No newline at end of file + public function __construct($arguments) + { + } + public function getUnjailedPath($path) + { + } + /** + * This is separate from Wrapper::getWrapperStorage so we can get the jailed storage consistently even if the jail is inside another wrapper + */ + public function getUnjailedStorage() + { + } + public function getJailedPath($path) + { + } + public function getId() + { + } + /** + * see https://www.php.net/manual/en/function.mkdir.php + * + * @param string $path + * @return bool + */ + public function mkdir($path) + { + } + /** + * see https://www.php.net/manual/en/function.rmdir.php + * + * @param string $path + * @return bool + */ + public function rmdir($path) + { + } + /** + * see https://www.php.net/manual/en/function.opendir.php + * + * @param string $path + * @return resource|false + */ + public function opendir($path) + { + } + /** + * see https://www.php.net/manual/en/function.is_dir.php + * + * @param string $path + * @return bool + */ + public function is_dir($path) + { + } + /** + * see https://www.php.net/manual/en/function.is_file.php + * + * @param string $path + * @return bool + */ + public function is_file($path) + { + } + /** + * see https://www.php.net/manual/en/function.stat.php + * only the following keys are required in the result: size and mtime + * + * @param string $path + * @return array|bool + */ + public function stat($path) + { + } + /** + * see https://www.php.net/manual/en/function.filetype.php + * + * @param string $path + * @return bool + */ + public function filetype($path) + { + } + /** + * see https://www.php.net/manual/en/function.filesize.php + * The result for filesize when called on a folder is required to be 0 + */ + public function filesize($path) : false|int|float + { + } + /** + * check if a file can be created in $path + * + * @param string $path + * @return bool + */ + public function isCreatable($path) + { + } + /** + * check if a file can be read + * + * @param string $path + * @return bool + */ + public function isReadable($path) + { + } + /** + * check if a file can be written to + * + * @param string $path + * @return bool + */ + public function isUpdatable($path) + { + } + /** + * check if a file can be deleted + * + * @param string $path + * @return bool + */ + public function isDeletable($path) + { + } + /** + * check if a file can be shared + * + * @param string $path + * @return bool + */ + public function isSharable($path) + { + } + /** + * get the full permissions of a path. + * Should return a combination of the PERMISSION_ constants defined in lib/public/constants.php + * + * @param string $path + * @return int + */ + public function getPermissions($path) + { + } + /** + * see https://www.php.net/manual/en/function.file_exists.php + * + * @param string $path + * @return bool + */ + public function file_exists($path) + { + } + /** + * see https://www.php.net/manual/en/function.filemtime.php + * + * @param string $path + * @return int|bool + */ + public function filemtime($path) + { + } + /** + * see https://www.php.net/manual/en/function.file_get_contents.php + * + * @param string $path + * @return string|false + */ + public function file_get_contents($path) + { + } + /** + * see https://www.php.net/manual/en/function.file_put_contents.php + * + * @param string $path + * @param mixed $data + * @return int|float|false + */ + public function file_put_contents($path, $data) + { + } + /** + * see https://www.php.net/manual/en/function.unlink.php + * + * @param string $path + * @return bool + */ + public function unlink($path) + { + } + /** + * see https://www.php.net/manual/en/function.rename.php + * + * @param string $source + * @param string $target + * @return bool + */ + public function rename($source, $target) + { + } + /** + * see https://www.php.net/manual/en/function.copy.php + * + * @param string $source + * @param string $target + * @return bool + */ + public function copy($source, $target) + { + } + /** + * see https://www.php.net/manual/en/function.fopen.php + * + * @param string $path + * @param string $mode + * @return resource|bool + */ + public function fopen($path, $mode) + { + } + /** + * get the mimetype for a file or folder + * The mimetype for a folder is required to be "httpd/unix-directory" + * + * @param string $path + * @return string|bool + */ + public function getMimeType($path) + { + } + /** + * see https://www.php.net/manual/en/function.hash.php + * + * @param string $type + * @param string $path + * @param bool $raw + * @return string|bool + */ + public function hash($type, $path, $raw = false) + { + } + /** + * see https://www.php.net/manual/en/function.free_space.php + * + * @param string $path + * @return int|float|bool + */ + public function free_space($path) + { + } + /** + * search for occurrences of $query in file names + * + * @param string $query + * @return array|bool + */ + public function search($query) + { + } + /** + * see https://www.php.net/manual/en/function.touch.php + * If the backend does not support the operation, false should be returned + * + * @param string $path + * @param int $mtime + * @return bool + */ + public function touch($path, $mtime = null) + { + } + /** + * get the path to a local version of the file. + * The local version of the file can be temporary and doesn't have to be persistent across requests + * + * @param string $path + * @return string|false + */ + public function getLocalFile($path) + { + } + /** + * check if a file or folder has been updated since $time + * + * @param string $path + * @param int $time + * @return bool + * + * hasUpdated for folders should return at least true if a file inside the folder is add, removed or renamed. + * returning true for other changes in the folder is optional + */ + public function hasUpdated($path, $time) + { + } + /** + * get a cache instance for the storage + * + * @param string $path + * @param \OC\Files\Storage\Storage|null (optional) the storage to pass to the cache + * @return \OC\Files\Cache\Cache + */ + public function getCache($path = '', $storage = null) + { + } + /** + * get the user id of the owner of a file or folder + * + * @param string $path + * @return string + */ + public function getOwner($path) + { + } + /** + * get a watcher instance for the cache + * + * @param string $path + * @param \OC\Files\Storage\Storage (optional) the storage to pass to the watcher + * @return \OC\Files\Cache\Watcher + */ + public function getWatcher($path = '', $storage = null) + { + } + /** + * get the ETag for a file or folder + * + * @param string $path + * @return string|false + */ + public function getETag($path) + { + } + public function getMetaData($path) + { + } + /** + * @param string $path + * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE + * @param \OCP\Lock\ILockingProvider $provider + * @throws \OCP\Lock\LockedException + */ + public function acquireLock($path, $type, \OCP\Lock\ILockingProvider $provider) + { + } + /** + * @param string $path + * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE + * @param \OCP\Lock\ILockingProvider $provider + */ + public function releaseLock($path, $type, \OCP\Lock\ILockingProvider $provider) + { + } + /** + * @param string $path + * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE + * @param \OCP\Lock\ILockingProvider $provider + */ + public function changeLock($path, $type, \OCP\Lock\ILockingProvider $provider) + { + } + /** + * Resolve the path for the source of the share + * + * @param string $path + * @return array + */ + public function resolvePath($path) + { + } + /** + * @param IStorage $sourceStorage + * @param string $sourceInternalPath + * @param string $targetInternalPath + * @return bool + */ + public function copyFromStorage(\OCP\Files\Storage\IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) + { + } + /** + * @param IStorage $sourceStorage + * @param string $sourceInternalPath + * @param string $targetInternalPath + * @return bool + */ + public function moveFromStorage(\OCP\Files\Storage\IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) + { + } + public function getPropagator($storage = null) + { + } + public function writeStream(string $path, $stream, ?int $size = null) : int + { + } + public function getDirectoryContent($directory) : \Traversable + { + } + } + class Quota extends \OC\Files\Storage\Wrapper\Wrapper + { + /** @var callable|null */ + protected $quotaCallback; + /** @var int|float|null int on 64bits, float on 32bits for bigint */ + protected int|float|null $quota; + protected string $sizeRoot; + private \OC\SystemConfig $config; + private bool $quotaIncludeExternalStorage; + /** + * @param array $parameters + */ + public function __construct($parameters) + { + } + /** + * @return int|float quota value + */ + public function getQuota() : int|float + { + } + private function hasQuota() : bool + { + } + /** + * @param string $path + * @param IStorage $storage + * @return int|float + */ + protected function getSize($path, $storage = null) + { + } + /** + * Get free space as limited by the quota + * + * @param string $path + * @return int|float|bool + */ + public function free_space($path) + { + } + /** + * see https://www.php.net/manual/en/function.file_put_contents.php + * + * @param string $path + * @param mixed $data + * @return int|float|false + */ + public function file_put_contents($path, $data) + { + } + /** + * see https://www.php.net/manual/en/function.copy.php + * + * @param string $source + * @param string $target + * @return bool + */ + public function copy($source, $target) + { + } + /** + * see https://www.php.net/manual/en/function.fopen.php + * + * @param string $path + * @param string $mode + * @return resource|bool + */ + public function fopen($path, $mode) + { + } + /** + * Checks whether the given path is a part file + * + * @param string $path Path that may identify a .part file + * @return bool + * @note this is needed for reusing keys + */ + private function isPartFile($path) + { + } + /** + * Only apply quota for files, not metadata, trash or others + */ + private function shouldApplyQuota(string $path) : bool + { + } + /** + * @param IStorage $sourceStorage + * @param string $sourceInternalPath + * @param string $targetInternalPath + * @return bool + */ + public function copyFromStorage(\OCP\Files\Storage\IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) + { + } + /** + * @param IStorage $sourceStorage + * @param string $sourceInternalPath + * @param string $targetInternalPath + * @return bool + */ + public function moveFromStorage(\OCP\Files\Storage\IStorage $sourceStorage, $sourceInternalPath, $targetInternalPath) + { + } + public function mkdir($path) + { + } + public function touch($path, $mtime = null) + { + } + } + /** + * Mask the permissions of a storage + * + * This can be used to restrict update, create, delete and/or share permissions of a storage + * + * Note that the read permissions can't be masked + */ + class PermissionsMask extends \OC\Files\Storage\Wrapper\Wrapper + { + /** + * @var int the permissions bits we want to keep + */ + private $mask; + /** + * @param array $arguments ['storage' => $storage, 'mask' => $mask] + * + * $storage: The storage the permissions mask should be applied on + * $mask: The permission bits that should be kept, a combination of the \OCP\Constant::PERMISSION_ constants + */ + public function __construct($arguments) + { + } + private function checkMask($permissions) + { + } + public function isUpdatable($path) + { + } + public function isCreatable($path) + { + } + public function isDeletable($path) + { + } + public function isSharable($path) + { + } + public function getPermissions($path) + { + } + public function rename($source, $target) + { + } + public function copy($source, $target) + { + } + public function touch($path, $mtime = null) + { + } + public function mkdir($path) + { + } + public function rmdir($path) + { + } + public function unlink($path) + { + } + public function file_put_contents($path, $data) + { + } + public function fopen($path, $mode) + { + } + /** + * get a cache instance for the storage + * + * @param string $path + * @param \OC\Files\Storage\Storage (optional) the storage to pass to the cache + * @return \OC\Files\Cache\Cache + */ + public function getCache($path = '', $storage = null) + { + } + public function getMetaData($path) + { + } + public function getScanner($path = '', $storage = null) + { + } + public function getDirectoryContent($directory) : \Traversable + { + } + } +} + +namespace OC\Files\ObjectStore { + use OC\Files\Storage\Wrapper\Wrapper; + class ObjectStoreStorage extends Wrapper {} +} + +namespace OCA\Circles { + use OCA\Circles\Model\Circle; + use OCA\Circles\Model\FederatedUser; + use OCA\Circles\Model\Probes\CircleProbe; + use OCA\Circles\Model\Probes\DataProbe; + use OCP\DB\QueryBuilder\ICompositeExpression; + use OCP\DB\QueryBuilder\IQueryBuilder; + + interface IFederatedUser { + + } + + class CirclesManager { + public function startSession(?FederatedUser $federatedUser = null): void {} + public function probeCircles(?CircleProbe $circleProbe = null, ?DataProbe $dataProbe = null): array {} + public function getQueryHelper(): CirclesQueryHelper {} + public function getLocalFederatedUser(string $userId): FederatedUser {} + public function startSuperSession(): void {} + public function stopSession(): void {} + public function getCircle(string $singleId, ?CircleProbe $probe = null): Circle {} + } + + class CirclesQueryHelper{ + public function addCircleDetails(string $alias, string $field): void {} + public function getQueryBuilder(): IQueryBuilder {} + public function extractCircle(array $data): Circle {} + public function limitToInheritedMembers(string $alias, string $field, IFederatedUser $federatedUser, bool $fullDetails = false): ICompositeExpression {} + } +} + +namespace OCA\Circles\Exceptions { + class CircleNotFoundException extends \Exception { + } +} + +namespace OCA\Circles\Model { + use OCA\Circles\IFederatedUser; + + class FederatedUser implements IFederatedUser { + } + class CircleProbe { + } + class DataProbe { + } + class Circle { + public function getDisplayName(): string {} + public function getSingleId(): string {} + } +} + +namespace OCA\Circles\Model\Probes { + class CircleProbe { + public function includeSystemCircles(bool $include = true): self {} + public function includeSingleCircles(bool $include = true): self {} + } +} + +namespace OCA\Circles\Events { + use OCA\Circles\Model\Circle; + + class CircleDestroyedEvent extends \OCP\EventDispatcher\Event { + public function getCircle(): Circle {} + } +} + + +namespace OCA\DAV\Connector\Sabre\Exception { + class Forbidden extends \Sabre\DAV\Exception\Forbidden { + public const NS_OWNCLOUD = 'http://owncloud.org/ns'; + + /** + * @param string $message + * @param bool $retry + * @param \Exception $previous + */ + public function __construct($message, $retry = false, \Exception $previous = null) {} + + /** + * This method allows the exception to include additional information + * into the WebDAV error response + * + * @param \Sabre\DAV\Server $server + * @param \DOMElement $errorNode + * @return void + */ + public function serialize(\Sabre\DAV\Server $server, \DOMElement $errorNode) {} + } +}