%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Services/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Services/FileCacheService.php |
<?php
/*
* @copyright 2022 Passwords App
*
* @author Marius David Wieschollek
* @license AGPL-3.0
*
* This file is part of the Passwords App
* created by Marius David Wieschollek.
*/
namespace OCA\Passwords\Services;
use Exception;
use OCP\Cache\CappedMemoryCache;
use OCP\Files\IAppData;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\Files\SimpleFS\ISimpleFile;
use OCP\Files\SimpleFS\ISimpleFolder;
use ReflectionClass;
use Throwable;
/**
* Class FileCacheService
*
* @package OCA\Passwords\Services
*/
class FileCacheService {
const DEFAULT_CACHE = 'default';
const AVATAR_CACHE = 'avatars';
const FAVICON_CACHE = 'favicon';
const PREVIEW_CACHE = 'preview';
const PASSWORDS_CACHE = 'passwords';
const CACHEDIR_TAG_FILE = 'CACHEDIR.TAG';
/**
* @var IAppData
*/
protected IAppData $appData;
/**
* @var LoggingService
*/
protected LoggingService $logger;
/**
* @var string
*/
protected string $defaultCache = self::DEFAULT_CACHE;
/**
* FileCacheService constructor.
*
* @param IAppData $appData
* @param LoggingService $logger
*/
public function __construct(IAppData $appData, LoggingService $logger) {
$this->appData = $appData;
$this->logger = $logger;
}
/**
* @param string|null $cache
*
* @return ISimpleFolder
* @throws NotPermittedException
* @throws Exception
*/
public function getCache(string $cache = null): ISimpleFolder {
$cache = $this->validateCacheName($cache);
try {
return $this->appData->getFolder($cache.'Cache');
} catch(NotFoundException $e) {
return $this->createCacheFolder($cache);
}
}
/**
* @param null $cache
*
* @return array
* @throws Exception
*/
public function getCacheInfo($cache = null): array {
$cache = $this->validateCacheName($cache);
$info = [
'name' => $cache,
'size' => 0,
'files' => 0
];
try {
$fileCache = $this->getCache($cache);
$cachedFiles = $fileCache->getDirectoryListing();
} catch(NotPermittedException $e) {
$this->logger->logException($e);
return $info;
}
foreach($cachedFiles as $file) {
$info['size'] += $file->getSize();
$info['files']++;
}
return $info;
}
/**
* @return array
*/
public function listCaches(): array {
return [
self::DEFAULT_CACHE,
self::AVATAR_CACHE,
self::FAVICON_CACHE,
self::PREVIEW_CACHE,
self::PASSWORDS_CACHE,
];
}
/**
* @param string $cache
*
* @return bool
*/
public function hasCache(string $cache): bool {
return in_array($cache, $this->listCaches());
}
/**
* @param string|null $cache
*
* @return string
* @throws Exception
*/
protected function validateCacheName(string $cache = null): string {
if($cache === null) return $this->defaultCache;
if(!$this->hasCache($cache)) throw new Exception('Unknown Cache '.$cache);
return $cache;
}
/**
* @param string|null $cache
*/
public function clearCache(string $cache = null): void {
try {
$this->getCache($cache)->delete();
$class = new ReflectionClass($this->appData);
$property = $class->getProperty('folders');
$property->setAccessible(true);
$property->setValue($this->appData, new CappedMemoryCache());
} catch(Throwable $e) {
$this->logger->logException($e);
}
}
/**
*
*/
public function clearAllCaches() {
$caches = $this->listCaches();
foreach($caches as $cache) {
$this->clearCache($cache);
}
}
/**
* @param string|null $cache
*
* @return bool
*/
public function isCacheEmpty(string $cache = null): bool {
try {
$files = $this->getCache($cache)->getDirectoryListing();
return count($files) === 0;
} catch(Throwable $e) {
$this->logger->logException($e);
}
return true;
}
/**
* @param string $file
* @param string|null $cache
*
* @return bool
*/
public function hasFile(string $file, string $cache = null): bool {
try {
return $this->getCache($cache)->fileExists($file);
} catch(Throwable $e) {
$this->logger->logException($e);
}
return false;
}
/**
* @param string $file
* @param string|null $cache
*
* @return ISimpleFile
*/
public function getFile(string $file, string $cache = null): ?ISimpleFile {
try {
$cache = $this->getCache($cache);
if($cache->fileExists($file)) return $cache->getFile($file);
} catch(Throwable $e) {
$this->logger->logException($e);
}
return null;
}
/**
* @param string $file
* @param string $content
* @param string|null $cache
*
* @return ISimpleFile|null
*/
public function putFile(string $file, string $content, string $cache = null): ?ISimpleFile {
try {
$cache = $this->getCache($cache);
if($cache->fileExists($file)) {
$fileModel = $cache->getFile($file);
} else {
$fileModel = $cache->newFile($file);
}
$fileModel->putContent($content);
return $fileModel;
} catch(Throwable $e) {
$this->logger->logException($e);
}
return null;
}
/**
* @param string $file
* @param string|null $cache
*/
public function removeFile(string $file, string $cache = null): void {
try {
$cache = $this->getCache($cache);
if($cache->fileExists($file)) {
$cache->getFile($file)->delete();
}
} catch(Throwable $e) {
$this->logger->logException($e);
}
}
/**
* @param string $cache
*
* @return FileCacheService
*/
public function getCacheService(string $cache = self::DEFAULT_CACHE): FileCacheService {
if(!$this->hasCache($cache)) $cache = self::DEFAULT_CACHE;
$service = clone $this;
$service->setDefaultCache($cache);
return $service;
}
/**
* @param string $defaultCache
*/
protected function setDefaultCache(string $defaultCache = self::DEFAULT_CACHE) {
$this->defaultCache = $defaultCache;
}
/**
* @param string $cache
*
* @return ISimpleFolder
* @throws NotPermittedException
*/
protected function createCacheFolder(string $cache): ISimpleFolder {
$folder = $this->appData->newFolder($cache.'Cache');
try {
if($folder->fileExists(self::CACHEDIR_TAG_FILE)) {
$fileModel = $folder->getFile(self::CACHEDIR_TAG_FILE);
} else {
$fileModel = $folder->newFile(self::CACHEDIR_TAG_FILE);
}
$fileModel->putContent("Signature: 8a477f597d28d172789f06886806bc55\n# This file is a cache directory tag created by Passwords for Nextcloud.");
} catch(Throwable $e) {
$this->logger->logException($e);
}
return $folder;
}
}