%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps/circles/lib/Model/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps/circles/lib/Model/ShareWrapper.php |
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Circles\Model;
use DateTime;
use JsonSerializable;
use OC;
use OC\Files\Cache\Cache;
use OC\Share20\Share;
use OC\Share20\ShareAttributes;
use OCA\Circles\AppInfo\Application;
use OCA\Circles\ShareByCircleProvider;
use OCA\Circles\Tools\Db\IQueryRow;
use OCA\Circles\Tools\Exceptions\InvalidItemException;
use OCA\Circles\Tools\IDeserializable;
use OCA\Circles\Tools\Traits\TArrayTools;
use OCA\Circles\Tools\Traits\TDeserialize;
use OCP\Files\IRootFolder;
use OCP\IURLGenerator;
use OCP\IUserManager;
use OCP\L10N\IFactory;
use OCP\Share\Exceptions\IllegalIDChangeException;
use OCP\Share\IAttributes;
use OCP\Share\IShare;
/**
* Class ShareWrapper
*
* @package OCA\Circles\Model
*/
class ShareWrapper extends ManagedModel implements IDeserializable, IQueryRow, JsonSerializable {
use TArrayTools;
use TDeserialize;
private string $id = '';
private int $permissions = 0;
private string $itemType = '';
private int $itemSource = 0;
private string $itemTarget = '';
private int $fileSource = 0;
private string $fileTarget = '';
private string $token = '';
private int $status = 0;
private string $providerId = '';
private DateTime $shareTime;
private string $sharedWith = '';
private string $sharedBy = '';
private ?DateTime $expirationDate = null;
private string $shareOwner = '';
private int $shareType = 0;
private int $parent = 0;
private ?Circle $circle = null;
private int $childId = 0;
private string $childFileTarget = '';
private int $childPermissions = 0;
private ?FileCacheWrapper $fileCache = null;
private ?Member $initiator = null;
private ?Member $owner = null;
private ?ShareToken $shareToken = null;
private ?IAttributes $attributes = null;
private bool $hideDownload = false;
public function __construct() {
$this->shareTime = new DateTime();
}
public function setId(string $id): self {
$this->id = $id;
return $this;
}
public function getId(): string {
return $this->id;
}
public function setPermissions(int $permissions): self {
$this->permissions = $permissions;
return $this;
}
public function getPermissions(): int {
return $this->permissions;
}
public function setItemType(string $itemType): self {
$this->itemType = $itemType;
return $this;
}
public function getItemType(): string {
return $this->itemType;
}
public function setItemSource(int $itemSource): self {
$this->itemSource = $itemSource;
return $this;
}
public function getItemSource(): int {
return $this->itemSource;
}
public function setItemTarget(string $itemTarget): self {
$this->itemTarget = $itemTarget;
return $this;
}
public function getItemTarget(): string {
return $this->itemTarget;
}
public function setFileSource(int $fileSource): self {
$this->fileSource = $fileSource;
return $this;
}
public function getFileSource(): int {
return $this->fileSource;
}
public function setFileTarget(string $fileTarget): self {
$this->fileTarget = $fileTarget;
return $this;
}
public function getFileTarget(): string {
return $this->fileTarget;
}
public function setToken(string $token): self {
$this->token = $token;
return $this;
}
public function getToken(): string {
return $this->token;
}
public function setStatus(int $status): self {
$this->status = $status;
return $this;
}
public function getStatus(): int {
return $this->status;
}
public function setProviderId(string $providerId): self {
$this->providerId = $providerId;
return $this;
}
public function getProviderId(): string {
return $this->providerId;
}
public function setShareTime(DateTime $shareTime): self {
$this->shareTime = $shareTime;
return $this;
}
public function getShareTime(): DateTime {
return $this->shareTime;
}
public function setSharedWith(string $sharedWith): self {
$this->sharedWith = $sharedWith;
return $this;
}
public function getSharedWith(): string {
return $this->sharedWith;
}
public function setSharedBy(string $sharedBy): self {
$this->sharedBy = $sharedBy;
return $this;
}
public function getExpirationDate(): ?DateTime {
return $this->expirationDate;
}
public function setExpirationDate(?DateTime $date):self {
$this->expirationDate = $date;
return $this;
}
public function getSharedBy(): string {
return $this->sharedBy;
}
public function setShareOwner(string $shareOwner): self {
$this->shareOwner = $shareOwner;
return $this;
}
public function getShareOwner(): string {
return $this->shareOwner;
}
public function setShareType(int $shareType): self {
$this->shareType = $shareType;
return $this;
}
public function getShareType(): int {
return $this->shareType;
}
public function setParent(int $parent): self {
$this->parent = $parent;
return $this;
}
public function getParent(): int {
return $this->parent;
}
public function setCircle(Circle $circle): self {
$this->circle = $circle;
return $this;
}
public function getCircle(): Circle {
return $this->circle;
}
public function hasCircle(): bool {
return (!is_null($this->circle));
}
public function setChildId(int $childId): self {
$this->childId = $childId;
return $this;
}
public function getChildId(): int {
return $this->childId;
}
public function setChildFileTarget(string $childFileTarget): self {
$this->childFileTarget = $childFileTarget;
return $this;
}
public function getChildFileTarget(): string {
return $this->childFileTarget;
}
public function setChildPermissions(int $childPermissions): self {
$this->childPermissions = $childPermissions;
return $this;
}
public function getChildPermissions(): int {
return $this->childPermissions;
}
public function setFileCache(FileCacheWrapper $fileCache): self {
$this->fileCache = $fileCache;
return $this;
}
public function getFileCache(): FileCacheWrapper {
return $this->fileCache;
}
public function hasFileCache(): bool {
return (!is_null($this->fileCache));
}
public function setInitiator(Member $initiator): self {
$this->initiator = $initiator;
return $this;
}
public function getInitiator(): Member {
return $this->initiator;
}
public function hasInitiator(): bool {
return (!is_null($this->initiator));
}
public function setOwner(Member $owner): self {
$this->owner = $owner;
return $this;
}
public function getOwner(): Member {
return $this->owner;
}
public function hasOwner(): bool {
return (!is_null($this->owner));
}
public function setShareToken(ShareToken $shareToken): self {
$this->shareToken = $shareToken;
return $this;
}
public function getShareToken(): ShareToken {
return $this->shareToken;
}
public function hasShareToken(): bool {
return !is_null($this->shareToken);
}
public function getAttributes(): ?IAttributes {
return $this->attributes;
}
public function setAttributes(?IAttributes $attributes): self {
$this->attributes = $attributes;
return $this;
}
public function getHideDownload(): bool {
return $this->hideDownload;
}
public function setHideDownload(bool $hideDownload): self {
$this->hideDownload = $hideDownload;
return $this;
}
/**
* @throws IllegalIDChangeException
*/
public function getShare(
IRootFolder $rootFolder,
IUserManager $userManager,
IURLGenerator $urlGenerator,
bool $nullOnMissingFileCache = false
): ?IShare {
$share = new Share($rootFolder, $userManager);
$share->setId($this->getId());
$share->setPermissions($this->getPermissions());
$share->setNodeType($this->getItemType());
$share->setNodeId($this->getFileSource());
$share->setTarget($this->getFileTarget());
$share->setProviderId($this->getProviderId());
$share->setStatus($this->getStatus());
$share->setHideDownload($this->getHideDownload());
$share->setAttributes($this->getAttributes());
if ($this->hasShareToken()) {
$password = $this->getShareToken()->getPassword();
if ($password !== '') {
$share->setPassword($password);
}
}
$share->setShareTime($this->getShareTime())
->setSharedWith($this->getSharedWith())
->setSharedBy($this->getSharedBy())
->setShareOwner($this->getShareOwner())
->setShareType($this->getShareType());
if ($this->getChildId() > 0) {
$share->setTarget($this->getChildFileTarget());
if ($this->getChildPermissions() < $this->getPermissions()) {
$share->setPermissions($this->getChildPermissions());
}
}
$this->setShareDisplay($share, $urlGenerator);
if ($this->hasFileCache()) {
if (!$this->getFileCache()->isAccessible()) {
return null;
}
$share->setNodeCacheEntry(
Cache::cacheEntryFromData($this->getFileCache()->toCache(), OC::$server->getMimeTypeLoader())
);
} elseif ($nullOnMissingFileCache) {
return null;
}
return $share;
}
private function setShareDisplay(IShare $share, IURLGenerator $urlGenerator): void {
if (!$this->hasCircle()) {
return;
}
$circle = $this->getCircle();
if ($circle->isConfig(Circle::CFG_PERSONAL)
&& $this->hasInitiator()
&& $circle->getOwner()->getSingleId() !== $this->getInitiator()->getSingleId()) {
$share->setSharedWithDisplayName(' ');
return;
}
$display = $circle->getDisplayName();
if ($circle->getSource() === Member::TYPE_CIRCLE) {
$l10n = \OCP\Server::get(IFactory::class)->get('circles');
$display = $l10n->t('%s (Team owned by %s)', [$display, $circle->getOwner()->getDisplayName()]);
} else {
$display .= ' (' . Circle::$DEF_SOURCE[$circle->getSource()] . ')';
}
$share->setSharedWithDisplayName($display);
$icon = $urlGenerator->getAbsoluteURL(
$urlGenerator->imagePath(Application::APP_ID, 'circles.svg')
);
$share->setSharedWithAvatar($icon);
}
/**
* @param array $data
*
* @throws InvalidItemException
*/
public function import(array $data): IDeserializable {
if ($this->getInt('id', $data) === 0) {
throw new InvalidItemException();
}
$shareTime = new DateTime();
$shareTime->setTimestamp($this->getInt('shareTime', $data));
$this->setId($this->get('id', $data))
->setShareType($this->getInt('shareType', $data))
->setParent($data['parent'] ?? 0)
->setPermissions($this->getInt('permissions', $data))
->setHideDownload($this->getBool('hideDownload', $data))
->setItemType($this->get('itemType', $data))
->setItemSource($this->getInt('itemSource', $data))
->setItemTarget($this->get('itemTarget', $data))
->setFileSource($this->getInt('fileSource', $data))
->setFileTarget($this->get('fileTarget', $data))
->setSharedWith($this->get('sharedWith', $data))
->setSharedBy($this->get('sharedBy', $data))
->setShareOwner($this->get('shareOwner', $data))
->setToken($this->get('token', $data))
->setShareTime($shareTime);
$this->importAttributesFromDatabase($this->get('attributes', $data));
try {
$this->setExpirationDate(new DateTime($this->get('expiration', $data)));
} catch (\Exception $e) {
}
$this->setChildId($this->getInt('childId', $data))
->setChildFileTarget($this->get('childFileTarget', $data))
->setChildPermissions($this->getInt('childPermissions', $data))
->setProviderId(ShareByCircleProvider::IDENTIFIER)
->setStatus(Ishare::STATUS_ACCEPTED);
try {
$circle = new Circle();
$this->setCircle($circle->import($this->getArray('circle', $data)));
} catch (InvalidItemException $e) {
}
try {
$fileCache = new FileCacheWrapper();
$this->setFileCache($fileCache->import($this->getArray('fileCache', $data)));
} catch (InvalidItemException $e) {
}
try {
$owner = new Member();
$this->setOwner($owner->import($this->getArray('owner', $data)));
} catch (InvalidItemException $e) {
}
try {
$member = new Member();
$this->setInitiator($member->import($this->getArray('viewer', $data)));
} catch (InvalidItemException $e) {
}
try {
$shareToken = new ShareToken();
$this->setShareToken($shareToken->import($this->getArray('shareToken', $data)));
} catch (InvalidItemException $e) {
}
return $this;
}
public function importFromDatabase(array $data, string $prefix = ''): IQueryRow {
$shareTime = new DateTime();
$shareTime->setTimestamp($this->getInt($prefix . 'stime', $data));
$this->setId($this->get($prefix . 'id', $data))
->setShareType($this->getInt($prefix . 'share_type', $data))
->setPermissions($this->getInt($prefix . 'permissions', $data))
->setItemType($this->get($prefix . 'item_type', $data))
->setItemSource($this->getInt($prefix . 'item_source', $data))
->setItemTarget($this->get($prefix . 'item_target', $data))
->setFileSource($this->getInt($prefix . 'file_source', $data))
->setFileTarget($this->get($prefix . 'file_target', $data))
->setSharedWith($this->get($prefix . 'share_with', $data))
->setSharedBy($this->get($prefix . 'uid_initiator', $data))
->setShareOwner($this->get($prefix . 'uid_owner', $data))
->setToken($this->get($prefix . 'token', $data))
->setShareTime($shareTime);
$this->importAttributesFromDatabase($this->get('attributes', $data));
// if (($password = $this->get('personal_password', $data, '')) !== '') {
// $share->setPassword($this->get('personal_password', $data, ''));
// } else if (($password = $this->get('password', $data, '')) !== '') {
// $share->setPassword($this->get('password', $data, ''));
// }
$this->setChildId($this->getInt($prefix . 'child_id', $data))
->setChildFileTarget($this->get($prefix . 'child_file_target', $data))
->setChildPermissions($this->getInt($prefix . 'child_permissions', $data))
->setProviderId(ShareByCircleProvider::IDENTIFIER)
->setStatus(Ishare::STATUS_ACCEPTED);
$this->getManager()->manageImportFromDatabase($this, $data, $prefix);
return $this;
}
/**
* Load from database format (JSON string) to IAttributes
* based on \OC\Share20\DefaultShareProvider
*/
private function importAttributesFromDatabase(string $data): void {
if ($data === '') {
return;
}
$attributes = new ShareAttributes();
$compressedAttributes = json_decode($data, true);
if (!is_array($compressedAttributes)) {
return;
}
foreach ($compressedAttributes as $compressedAttribute) {
$attributes->setAttribute(...$compressedAttribute);
}
$this->setHideDownload(!($attributes->getAttribute('permissions', 'download') ?? true));
$this->setAttributes($attributes);
}
public function jsonSerialize(): array {
$arr = [
'id' => $this->getId(),
'shareType' => $this->getShareType(),
'providerId' => $this->getProviderId(),
'permissions' => $this->getPermissions(),
'attributes' => ($this->getAttributes() !== null) ? json_encode($this->getAttributes()->toArray()) : null,
'hideDownload' => $this->getHideDownload(),
'itemType' => $this->getItemType(),
'itemSource' => $this->getItemSource(),
'itemTarget' => $this->getItemTarget(),
'fileSource' => $this->getFileSource(),
'fileTarget' => $this->getFileTarget(),
'status' => $this->getStatus(),
'shareTime' => $this->getShareTime()->getTimestamp(),
'sharedWith' => $this->getSharedWith(),
'sharedBy' => $this->getSharedBy(),
'shareOwner' => $this->getShareOwner(),
'token' => $this->getToken(),
'childId' => $this->getChildId(),
'childFileTarget' => $this->getChildFileTarget(),
'childPermissions' => $this->getChildPermissions()
];
if ($this->hasOwner()) {
$arr['owner'] = $this->getOwner();
}
if ($this->hasCircle()) {
$arr['circle'] = $this->getCircle();
}
if ($this->hasInitiator()) {
$arr['viewer'] = $this->getInitiator();
}
if ($this->hasFileCache()) {
$arr['fileCache'] = $this->getFileCache();
}
if ($this->hasShareToken()) {
$arr['shareToken'] = $this->getShareToken();
}
return $arr;
}
}