%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Controller/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Controller/LanguageController.php |
<?php
/*
* @copyright 2024 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\Controller;
use DateTime;
use Exception;
use OC\App\AppManager;
use DateTimeInterface;
use OCA\Passwords\AppInfo\Application;
use OCA\Passwords\Services\LoggingService;
use OCP\App\AppPathNotFoundException;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http;
use OCP\AppFramework\Http\Attribute\NoAdminRequired;
use OCP\AppFramework\Http\Attribute\NoCSRFRequired;
use OCP\AppFramework\Http\JSONResponse;
use OCP\AppFramework\Http\NotFoundResponse;
use OCP\AppFramework\Http\Response;
use OCP\IRequest;
use OCP\L10N\IFactory;
/**
* Class LanguageController
*
* @package OCA\Passwords\Controller
*/
class LanguageController extends Controller {
/**
* @var AppManager
*/
protected AppManager $appManager;
/**
* @var LoggingService
*/
protected LoggingService $logger;
/**
* @var IFactory
*/
protected IFactory $l10nFactory;
/**
* LanguageController constructor.
*
* @param $appName
* @param IRequest $request
* @param IFactory $l10nFactory
* @param AppManager $appManager
* @param LoggingService $logger
*/
public function __construct($appName, IRequest $request, IFactory $l10nFactory, AppManager $appManager, LoggingService $logger) {
parent::__construct($appName, $request);
$this->l10nFactory = $l10nFactory;
$this->appManager = $appManager;
$this->logger = $logger;
}
/**
* @param string $section
* @param string $language
*
* @return Response
*/
#[NoCSRFRequired]
#[NoAdminRequired]
public function getFile(string $section, string $language): Response {
if(!in_array($section, ['apps', 'backups', 'settings', 'tutorial'])) {
return new NotFoundResponse();
}
if(preg_match('/^[a-z]{2}(_[A-Z]{2})?$/', $language) !== 1) {
return new NotFoundResponse();
}
try {
$json = $this->readLanguageFile($section, $language);
if($json !== null) {
return $this->createJsonResponse($json);
} else {
$fallbackLanguage = $this->l10nFactory->findLanguage(Application::APP_NAME);
if($language !== $fallbackLanguage) {
$json = $this->readLanguageFile($section, $fallbackLanguage);
if($json !== null) return $this->createJsonResponse($json);
}
}
} catch(Exception $e) {
$this->logger->logException($e);
}
return new NotFoundResponse();
}
/**
* @param string $section
* @param string $language
*
* @return object|null
* @throws AppPathNotFoundException
*/
protected function readLanguageFile(string $section, string $language): ?object {
$basePath = $this->appManager->getAppPath(Application::APP_NAME).DIRECTORY_SEPARATOR.'l10n';
$filePath = $basePath.DIRECTORY_SEPARATOR.
$section.DIRECTORY_SEPARATOR.
$language.'.json';
if(is_file($filePath) && str_starts_with($filePath, $basePath)) {
$data = file_get_contents($filePath);
$json = json_decode($data);
return is_object($json) ? $json:null;
}
return null;
}
/**
* @param object $json
* @param int $statusCode
*
* @return JSONResponse
* @throws Exception
*/
protected function createJsonResponse(object $json, int $statusCode = Http::STATUS_OK): JSONResponse {
$response = new JSONResponse(
$json,
$statusCode
);
$expires = new DateTime('@'.(time() + 2419200));
$response->addHeader('Cache-Control', 'public, immutable, max-age=2419200')
->addHeader('Expires', $expires->format(DateTimeInterface::RFC2822))
->addHeader('Pragma', 'cache');
return $response;
}
}