migrate therinaldos.com data
Build & Deploy to DigitalOcean Space / build (push) Failing after 2m38s

This commit is contained in:
2024-05-05 15:50:45 -04:00
commit ef1ff240d4
23182 changed files with 3801898 additions and 0 deletions
+191
View File
@@ -0,0 +1,191 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Bart Visscher <bartv@thisnet.nl>
* @author Björn Schießle <bjoern@schiessle.org>
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Joas Schilling <coding@schilljs.com>
* @author Jörn Friedrich Dreyer <jfd@butonic.de>
* @author Julius Härtl <jus@bitgrid.net>
* @author Lukas Reschke <lukas@statuscode.ch>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Thomas Müller <thomas.mueller@tmit.eu>
*
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
namespace OC\Template;
use OCP\Defaults;
use Throwable;
class Base {
private $template; // The template
private $vars; // Vars
/** @var \OCP\IL10N */
private $l10n;
/** @var Defaults */
private $theme;
/**
* @param string $template
* @param string $requestToken
* @param \OCP\IL10N $l10n
* @param Defaults $theme
*/
public function __construct($template, $requestToken, $l10n, $theme) {
$this->vars = [];
$this->vars['requesttoken'] = $requestToken;
$this->l10n = $l10n;
$this->template = $template;
$this->theme = $theme;
}
/**
* @param string $serverRoot
* @param string|false $app_dir
* @param string $theme
* @param string $app
* @return string[]
*/
protected function getAppTemplateDirs($theme, $app, $serverRoot, $app_dir) {
// Check if the app is in the app folder or in the root
if ($app_dir !== false && file_exists($app_dir.'/templates/')) {
return [
$serverRoot.'/themes/'.$theme.'/apps/'.$app.'/templates/',
$app_dir.'/templates/',
];
}
return [
$serverRoot.'/themes/'.$theme.'/'.$app.'/templates/',
$serverRoot.'/'.$app.'/templates/',
];
}
/**
* @param string $serverRoot
* @param string $theme
* @return string[]
*/
protected function getCoreTemplateDirs($theme, $serverRoot) {
return [
$serverRoot.'/themes/'.$theme.'/core/templates/',
$serverRoot.'/core/templates/',
];
}
/**
* Assign variables
* @param string $key key
* @param float|array|bool|integer|string|Throwable $value value
* @return bool
*
* This function assigns a variable. It can be accessed via $_[$key] in
* the template.
*
* If the key existed before, it will be overwritten
*/
public function assign($key, $value) {
$this->vars[$key] = $value;
return true;
}
/**
* Appends a variable
* @param string $key key
* @param mixed $value value
*
* This function assigns a variable in an array context. If the key already
* exists, the value will be appended. It can be accessed via
* $_[$key][$position] in the template.
*/
public function append($key, $value) {
if (array_key_exists($key, $this->vars)) {
$this->vars[$key][] = $value;
} else {
$this->vars[$key] = [ $value ];
}
}
/**
* Prints the proceeded template
* @return bool
*
* This function proceeds the template and prints its output.
*/
public function printPage() {
$data = $this->fetchPage();
if ($data === false) {
return false;
} else {
print $data;
return true;
}
}
/**
* Process the template
*
* @param array|null $additionalParams
* @return string This function processes the template.
*
* This function processes the template.
*/
public function fetchPage($additionalParams = null) {
return $this->load($this->template, $additionalParams);
}
/**
* doing the actual work
*
* @param string $file
* @param array|null $additionalParams
* @return string content
*
* Includes the template file, fetches its output
*/
protected function load($file, $additionalParams = null) {
// Register the variables
$_ = $this->vars;
$l = $this->l10n;
$theme = $this->theme;
if (!is_null($additionalParams)) {
$_ = array_merge($additionalParams, $this->vars);
foreach ($_ as $var => $value) {
if (!isset(${$var})) {
${$var} = $value;
}
}
}
// Include
ob_start();
try {
include $file;
$data = ob_get_contents();
} catch (\Exception $e) {
@ob_end_clean();
throw $e;
}
@ob_end_clean();
// Return data
return $data;
}
}
@@ -0,0 +1,107 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Axel Helmert <axel.helmert@luka.de>
* @author Bart Visscher <bartv@thisnet.nl>
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Joas Schilling <coding@schilljs.com>
* @author John Molakvoæ <skjnldsv@protonmail.com>
* @author Kyle Fazzari <kyrofa@ubuntu.com>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Robin Appelman <robin@icewind.nl>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Thomas Müller <thomas.mueller@tmit.eu>
* @author tux-rampage <tux-rampage@users.noreply.github.com>
*
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
namespace OC\Template;
use Psr\Log\LoggerInterface;
class CSSResourceLocator extends ResourceLocator {
public function __construct(LoggerInterface $logger) {
parent::__construct($logger);
}
/**
* @param string $style
*/
public function doFind($style) {
$app = substr($style, 0, strpos($style, '/'));
if ($this->appendIfExist($this->serverroot, $style.'.css')
|| $this->appendIfExist($this->serverroot, 'core/'.$style.'.css')
) {
return;
}
$style = substr($style, strpos($style, '/') + 1);
$app_path = \OC_App::getAppPath($app);
$app_url = \OC_App::getAppWebPath($app);
if ($app_path === false && $app_url === false) {
$this->logger->error('Could not find resource {resource} to load', [
'resource' => $app . '/' . $style . '.css',
'app' => 'cssresourceloader',
]);
return;
}
// Account for the possibility of having symlinks in app path. Doing
// this here instead of above as an empty argument to realpath gets
// turned into cwd.
$app_path = realpath($app_path);
$this->append($app_path, $style.'.css', $app_url);
}
/**
* @param string $style
*/
public function doFindTheme($style) {
$theme_dir = 'themes/'.$this->theme.'/';
$this->appendIfExist($this->serverroot, $theme_dir.'apps/'.$style.'.css')
|| $this->appendIfExist($this->serverroot, $theme_dir.$style.'.css')
|| $this->appendIfExist($this->serverroot, $theme_dir.'core/'.$style.'.css');
}
public function append($root, $file, $webRoot = null, $throw = true, $scss = false) {
if (!$scss) {
parent::append($root, $file, $webRoot, $throw);
} else {
if (!$webRoot) {
$webRoot = $this->findWebRoot($root);
if ($webRoot === null) {
$webRoot = '';
$this->logger->error('ResourceLocator can not find a web root (root: {root}, file: {file}, webRoot: {webRoot}, throw: {throw})', [
'app' => 'lib',
'root' => $root,
'file' => $file,
'webRoot' => $webRoot,
'throw' => $throw ? 'true' : 'false'
]);
if ($throw && $root === '/') {
throw new ResourceNotFoundException($file, $webRoot);
}
}
}
$this->resources[] = [$webRoot ?: \OC::$WEBROOT, $webRoot, $file];
}
}
}
@@ -0,0 +1,258 @@
<?php
/**
* @copyright 2017, Roeland Jago Douma <roeland@famdouma.nl>
*
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Julius Härtl <jus@bitgrid.net>
* @author Lukas Reschke <lukas@statuscode.ch>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Roeland Jago Douma <roeland@famdouma.nl>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\Template;
use OC\SystemConfig;
use OCP\Files\IAppData;
use OCP\Files\NotFoundException;
use OCP\Files\NotPermittedException;
use OCP\Files\SimpleFS\ISimpleFolder;
use OCP\ICache;
use OCP\ICacheFactory;
use OCP\IURLGenerator;
use Psr\Log\LoggerInterface;
class JSCombiner {
/** @var IAppData */
protected $appData;
/** @var IURLGenerator */
protected $urlGenerator;
/** @var ICache */
protected $depsCache;
/** @var SystemConfig */
protected $config;
protected LoggerInterface $logger;
/** @var ICacheFactory */
private $cacheFactory;
public function __construct(IAppData $appData,
IURLGenerator $urlGenerator,
ICacheFactory $cacheFactory,
SystemConfig $config,
LoggerInterface $logger) {
$this->appData = $appData;
$this->urlGenerator = $urlGenerator;
$this->cacheFactory = $cacheFactory;
$this->depsCache = $this->cacheFactory->createDistributed('JS-' . md5($this->urlGenerator->getBaseUrl()));
$this->config = $config;
$this->logger = $logger;
}
/**
* @param string $root
* @param string $file
* @param string $app
* @return bool
*/
public function process($root, $file, $app) {
if ($this->config->getValue('debug') || !$this->config->getValue('installed')) {
return false;
}
$path = explode('/', $root . '/' . $file);
$fileName = array_pop($path);
$path = implode('/', $path);
try {
$folder = $this->appData->getFolder($app);
} catch (NotFoundException $e) {
// creating css appdata folder
$folder = $this->appData->newFolder($app);
}
if ($this->isCached($fileName, $folder)) {
return true;
}
return $this->cache($path, $fileName, $folder);
}
/**
* @param string $fileName
* @param ISimpleFolder $folder
* @return bool
*/
protected function isCached($fileName, ISimpleFolder $folder) {
$fileName = str_replace('.json', '.js', $fileName);
if (!$folder->fileExists($fileName)) {
return false;
}
$fileName = $fileName . '.deps';
try {
$deps = $this->depsCache->get($folder->getName() . '-' . $fileName);
$fromCache = true;
if ($deps === null || $deps === '') {
$fromCache = false;
$depFile = $folder->getFile($fileName);
$deps = $depFile->getContent();
}
// check again
if ($deps === null || $deps === '') {
$this->logger->info('JSCombiner: deps file empty: ' . $fileName);
return false;
}
$deps = json_decode($deps, true);
if ($deps === null) {
return false;
}
foreach ($deps as $file => $mtime) {
if (!file_exists($file) || filemtime($file) > $mtime) {
return false;
}
}
if ($fromCache === false) {
$this->depsCache->set($folder->getName() . '-' . $fileName, json_encode($deps));
}
return true;
} catch (NotFoundException $e) {
return false;
}
}
/**
* @param string $path
* @param string $fileName
* @param ISimpleFolder $folder
* @return bool
*/
protected function cache($path, $fileName, ISimpleFolder $folder) {
$deps = [];
$fullPath = $path . '/' . $fileName;
$data = json_decode(file_get_contents($fullPath));
$deps[$fullPath] = filemtime($fullPath);
$res = '';
foreach ($data as $file) {
$filePath = $path . '/' . $file;
if (is_file($filePath)) {
$res .= file_get_contents($filePath);
$res .= PHP_EOL . PHP_EOL;
$deps[$filePath] = filemtime($filePath);
}
}
$fileName = str_replace('.json', '.js', $fileName);
try {
$cachedfile = $folder->getFile($fileName);
} catch (NotFoundException $e) {
$cachedfile = $folder->newFile($fileName);
}
$depFileName = $fileName . '.deps';
try {
$depFile = $folder->getFile($depFileName);
} catch (NotFoundException $e) {
$depFile = $folder->newFile($depFileName);
}
try {
$gzipFile = $folder->getFile($fileName . '.gzip'); # Safari doesn't like .gz
} catch (NotFoundException $e) {
$gzipFile = $folder->newFile($fileName . '.gzip'); # Safari doesn't like .gz
}
try {
$cachedfile->putContent($res);
$deps = json_encode($deps);
$depFile->putContent($deps);
$this->depsCache->set($folder->getName() . '-' . $depFileName, $deps);
$gzipFile->putContent(gzencode($res, 9));
$this->logger->debug('JSCombiner: successfully cached: ' . $fileName);
return true;
} catch (NotPermittedException|NotFoundException $e) {
$this->logger->error('JSCombiner: unable to cache: ' . $fileName);
return false;
}
}
/**
* @param string $appName
* @param string $fileName
* @return string
*/
public function getCachedJS($appName, $fileName) {
$tmpfileLoc = explode('/', $fileName);
$fileName = array_pop($tmpfileLoc);
$fileName = str_replace('.json', '.js', $fileName);
return substr($this->urlGenerator->linkToRoute('core.Js.getJs', ['fileName' => $fileName, 'appName' => $appName]), strlen(\OC::$WEBROOT) + 1);
}
/**
* @param string $root
* @param string $file
* @return string[]
*/
public function getContent($root, $file) {
/** @var array $data */
$data = json_decode(file_get_contents($root . '/' . $file));
if (!is_array($data)) {
return [];
}
$path = explode('/', $file);
array_pop($path);
$path = implode('/', $path);
$result = [];
foreach ($data as $f) {
$result[] = $path . '/' . $f;
}
return $result;
}
/**
* Clear cache with combined javascript files
*
* @throws NotFoundException
*/
public function resetCache() {
$this->cacheFactory->createDistributed('JS-')->clear();
$appDirectory = $this->appData->getDirectoryListing();
foreach ($appDirectory as $folder) {
foreach ($folder->getDirectoryListing() as $file) {
$file->delete();
}
}
}
}
@@ -0,0 +1,314 @@
<?php
declare(strict_types=1);
/**
* @copyright Copyright (c) 2016, Roeland Jago Douma <roeland@famdouma.nl>
*
* @author Abijeet <abijeetpatro@gmail.com>
* @author Arthur Schiwon <blizzz@arthur-schiwon.de>
* @author Bjoern Schiessle <bjoern@schiessle.org>
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Joas Schilling <coding@schilljs.com>
* @author Julius Härtl <jus@bitgrid.net>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Robin Appelman <robin@icewind.nl>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Vincent Petry <vincent@nextcloud.com>
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
namespace OC\Template;
use bantu\IniGetWrapper\IniGetWrapper;
use OC\CapabilitiesManager;
use OC\Share\Share;
use OCP\App\AppPathNotFoundException;
use OCP\App\IAppManager;
use OCP\Constants;
use OCP\Defaults;
use OCP\Files\FileInfo;
use OCP\IConfig;
use OCP\IGroupManager;
use OCP\IInitialStateService;
use OCP\IL10N;
use OCP\ILogger;
use OCP\ISession;
use OCP\IURLGenerator;
use OCP\IUser;
use OCP\User\Backend\IPasswordConfirmationBackend;
use OCP\Util;
class JSConfigHelper {
protected IL10N $l;
protected Defaults $defaults;
protected IAppManager $appManager;
protected ISession $session;
protected ?IUser $currentUser;
protected IConfig $config;
protected IGroupManager $groupManager;
protected IniGetWrapper $iniWrapper;
protected IURLGenerator $urlGenerator;
protected CapabilitiesManager $capabilitiesManager;
protected IInitialStateService $initialStateService;
/** @var array user back-ends excluded from password verification */
private $excludedUserBackEnds = ['user_saml' => true, 'user_globalsiteselector' => true];
public function __construct(IL10N $l,
Defaults $defaults,
IAppManager $appManager,
ISession $session,
?IUser $currentUser,
IConfig $config,
IGroupManager $groupManager,
IniGetWrapper $iniWrapper,
IURLGenerator $urlGenerator,
CapabilitiesManager $capabilitiesManager,
IInitialStateService $initialStateService) {
$this->l = $l;
$this->defaults = $defaults;
$this->appManager = $appManager;
$this->session = $session;
$this->currentUser = $currentUser;
$this->config = $config;
$this->groupManager = $groupManager;
$this->iniWrapper = $iniWrapper;
$this->urlGenerator = $urlGenerator;
$this->capabilitiesManager = $capabilitiesManager;
$this->initialStateService = $initialStateService;
}
public function getConfig(): string {
$userBackendAllowsPasswordConfirmation = true;
if ($this->currentUser !== null) {
$uid = $this->currentUser->getUID();
$backend = $this->currentUser->getBackend();
if ($backend instanceof IPasswordConfirmationBackend) {
$userBackendAllowsPasswordConfirmation = $backend->canConfirmPassword($uid);
} elseif (isset($this->excludedUserBackEnds[$this->currentUser->getBackendClassName()])) {
$userBackendAllowsPasswordConfirmation = false;
}
} else {
$uid = null;
}
// Get the config
$apps_paths = [];
if ($this->currentUser === null) {
$apps = $this->appManager->getInstalledApps();
} else {
$apps = $this->appManager->getEnabledAppsForUser($this->currentUser);
}
foreach ($apps as $app) {
try {
$apps_paths[$app] = $this->appManager->getAppWebPath($app);
} catch (AppPathNotFoundException $e) {
$apps_paths[$app] = false;
}
}
$enableLinkPasswordByDefault = $this->config->getAppValue('core', 'shareapi_enable_link_password_by_default', 'no');
$enableLinkPasswordByDefault = $enableLinkPasswordByDefault === 'yes';
$defaultExpireDateEnabled = $this->config->getAppValue('core', 'shareapi_default_expire_date', 'no') === 'yes';
$defaultExpireDate = $enforceDefaultExpireDate = null;
if ($defaultExpireDateEnabled) {
$defaultExpireDate = (int)$this->config->getAppValue('core', 'shareapi_expire_after_n_days', '7');
$enforceDefaultExpireDate = $this->config->getAppValue('core', 'shareapi_enforce_expire_date', 'no') === 'yes';
}
$outgoingServer2serverShareEnabled = $this->config->getAppValue('files_sharing', 'outgoing_server2server_share_enabled', 'yes') === 'yes';
$defaultInternalExpireDateEnabled = $this->config->getAppValue('core', 'shareapi_default_internal_expire_date', 'no') === 'yes';
$defaultInternalExpireDate = $defaultInternalExpireDateEnforced = null;
if ($defaultInternalExpireDateEnabled) {
$defaultInternalExpireDate = (int)$this->config->getAppValue('core', 'shareapi_internal_expire_after_n_days', '7');
$defaultInternalExpireDateEnforced = $this->config->getAppValue('core', 'shareapi_enforce_internal_expire_date', 'no') === 'yes';
}
$defaultRemoteExpireDateEnabled = $this->config->getAppValue('core', 'shareapi_default_remote_expire_date', 'no') === 'yes';
$defaultRemoteExpireDate = $defaultRemoteExpireDateEnforced = null;
if ($defaultRemoteExpireDateEnabled) {
$defaultRemoteExpireDate = (int)$this->config->getAppValue('core', 'shareapi_remote_expire_after_n_days', '7');
$defaultRemoteExpireDateEnforced = $this->config->getAppValue('core', 'shareapi_enforce_remote_expire_date', 'no') === 'yes';
}
$countOfDataLocation = 0;
$dataLocation = str_replace(\OC::$SERVERROOT . '/', '', $this->config->getSystemValue('datadirectory', ''), $countOfDataLocation);
if ($countOfDataLocation !== 1 || $uid === null || !$this->groupManager->isAdmin($uid)) {
$dataLocation = false;
}
if ($this->currentUser instanceof IUser) {
$lastConfirmTimestamp = $this->session->get('last-password-confirm');
if (!is_int($lastConfirmTimestamp)) {
$lastConfirmTimestamp = 0;
}
} else {
$lastConfirmTimestamp = 0;
}
$capabilities = $this->capabilitiesManager->getCapabilities(false, true);
$config = [
'auto_logout' => $this->config->getSystemValue('auto_logout', false),
'blacklist_files_regex' => FileInfo::BLACKLIST_FILES_REGEX,
'loglevel' => $this->config->getSystemValue('loglevel_frontend',
$this->config->getSystemValue('loglevel', ILogger::WARN)
),
'lost_password_link' => $this->config->getSystemValue('lost_password_link', null),
'modRewriteWorking' => $this->config->getSystemValue('htaccess.IgnoreFrontController', false) === true || getenv('front_controller_active') === 'true',
'no_unsupported_browser_warning' => $this->config->getSystemValue('no_unsupported_browser_warning', false),
'session_keepalive' => $this->config->getSystemValue('session_keepalive', true),
'session_lifetime' => min($this->config->getSystemValue('session_lifetime', $this->iniWrapper->getNumeric('session.gc_maxlifetime')), $this->iniWrapper->getNumeric('session.gc_maxlifetime')),
'sharing.maxAutocompleteResults' => max(0, $this->config->getSystemValueInt('sharing.maxAutocompleteResults', Constants::SHARING_MAX_AUTOCOMPLETE_RESULTS_DEFAULT)),
'sharing.minSearchStringLength' => $this->config->getSystemValueInt('sharing.minSearchStringLength', 0),
'version' => implode('.', Util::getVersion()),
'versionstring' => \OC_Util::getVersionString(),
'enable_non-accessible_features' => $this->config->getSystemValueBool('enable_non-accessible_features', true),
];
$array = [
"_oc_debug" => $this->config->getSystemValue('debug', false) ? 'true' : 'false',
"_oc_isadmin" => $uid !== null && $this->groupManager->isAdmin($uid) ? 'true' : 'false',
"backendAllowsPasswordConfirmation" => $userBackendAllowsPasswordConfirmation ? 'true' : 'false',
"oc_dataURL" => is_string($dataLocation) ? "\"" . $dataLocation . "\"" : 'false',
"_oc_webroot" => "\"" . \OC::$WEBROOT . "\"",
"_oc_appswebroots" => str_replace('\\/', '/', json_encode($apps_paths)), // Ugly unescape slashes waiting for better solution
"datepickerFormatDate" => json_encode($this->l->l('jsdate', null)),
'nc_lastLogin' => $lastConfirmTimestamp,
'nc_pageLoad' => time(),
"dayNames" => json_encode([
$this->l->t('Sunday'),
$this->l->t('Monday'),
$this->l->t('Tuesday'),
$this->l->t('Wednesday'),
$this->l->t('Thursday'),
$this->l->t('Friday'),
$this->l->t('Saturday')
]),
"dayNamesShort" => json_encode([
$this->l->t('Sun.'),
$this->l->t('Mon.'),
$this->l->t('Tue.'),
$this->l->t('Wed.'),
$this->l->t('Thu.'),
$this->l->t('Fri.'),
$this->l->t('Sat.')
]),
"dayNamesMin" => json_encode([
$this->l->t('Su'),
$this->l->t('Mo'),
$this->l->t('Tu'),
$this->l->t('We'),
$this->l->t('Th'),
$this->l->t('Fr'),
$this->l->t('Sa')
]),
"monthNames" => json_encode([
$this->l->t('January'),
$this->l->t('February'),
$this->l->t('March'),
$this->l->t('April'),
$this->l->t('May'),
$this->l->t('June'),
$this->l->t('July'),
$this->l->t('August'),
$this->l->t('September'),
$this->l->t('October'),
$this->l->t('November'),
$this->l->t('December')
]),
"monthNamesShort" => json_encode([
$this->l->t('Jan.'),
$this->l->t('Feb.'),
$this->l->t('Mar.'),
$this->l->t('Apr.'),
$this->l->t('May.'),
$this->l->t('Jun.'),
$this->l->t('Jul.'),
$this->l->t('Aug.'),
$this->l->t('Sep.'),
$this->l->t('Oct.'),
$this->l->t('Nov.'),
$this->l->t('Dec.')
]),
"firstDay" => json_encode($this->l->l('firstday', null)),
"_oc_config" => json_encode($config),
"oc_appconfig" => json_encode([
'core' => [
'defaultExpireDateEnabled' => $defaultExpireDateEnabled,
'defaultExpireDate' => $defaultExpireDate,
'defaultExpireDateEnforced' => $enforceDefaultExpireDate,
'enforcePasswordForPublicLink' => Util::isPublicLinkPasswordRequired(),
'enableLinkPasswordByDefault' => $enableLinkPasswordByDefault,
'sharingDisabledForUser' => Util::isSharingDisabledForUser(),
'resharingAllowed' => Share::isResharingAllowed(),
'remoteShareAllowed' => $outgoingServer2serverShareEnabled,
'federatedCloudShareDoc' => $this->urlGenerator->linkToDocs('user-sharing-federated'),
'allowGroupSharing' => \OC::$server->getShareManager()->allowGroupSharing(),
'defaultInternalExpireDateEnabled' => $defaultInternalExpireDateEnabled,
'defaultInternalExpireDate' => $defaultInternalExpireDate,
'defaultInternalExpireDateEnforced' => $defaultInternalExpireDateEnforced,
'defaultRemoteExpireDateEnabled' => $defaultRemoteExpireDateEnabled,
'defaultRemoteExpireDate' => $defaultRemoteExpireDate,
'defaultRemoteExpireDateEnforced' => $defaultRemoteExpireDateEnforced,
]
]),
"_theme" => json_encode([
'entity' => $this->defaults->getEntity(),
'name' => $this->defaults->getName(),
'productName' => $this->defaults->getProductName(),
'title' => $this->defaults->getTitle(),
'baseUrl' => $this->defaults->getBaseUrl(),
'syncClientUrl' => $this->defaults->getSyncClientUrl(),
'docBaseUrl' => $this->defaults->getDocBaseUrl(),
'docPlaceholderUrl' => $this->defaults->buildDocLinkToKey('PLACEHOLDER'),
'slogan' => $this->defaults->getSlogan(),
'logoClaim' => '',
'folder' => \OC_Util::getTheme(),
]),
];
if ($this->currentUser !== null) {
$array['oc_userconfig'] = json_encode([
'avatar' => [
'version' => (int)$this->config->getUserValue($uid, 'avatar', 'version', 0),
'generated' => $this->config->getUserValue($uid, 'avatar', 'generated', 'true') === 'true',
]
]);
}
$this->initialStateService->provideInitialState('core', 'projects_enabled', $this->config->getSystemValueBool('projects.enabled', false));
$this->initialStateService->provideInitialState('core', 'config', $config);
$this->initialStateService->provideInitialState('core', 'capabilities', $capabilities);
// Allow hooks to modify the output values
\OC_Hook::emit('\OCP\Config', 'js', ['array' => &$array]);
$result = '';
// Echo it
foreach ($array as $setting => $value) {
$result .= 'var '. $setting . '='. $value . ';' . PHP_EOL;
}
return $result;
}
}
@@ -0,0 +1,171 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Bart Visscher <bartv@thisnet.nl>
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Joas Schilling <coding@schilljs.com>
* @author Kyle Fazzari <kyrofa@ubuntu.com>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Roeland Jago Douma <roeland@famdouma.nl>
* @author Thomas Müller <thomas.mueller@tmit.eu>
*
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
namespace OC\Template;
use OCP\App\AppPathNotFoundException;
use OCP\App\IAppManager;
use Psr\Log\LoggerInterface;
class JSResourceLocator extends ResourceLocator {
protected JSCombiner $jsCombiner;
protected IAppManager $appManager;
public function __construct(LoggerInterface $logger, JSCombiner $JSCombiner, IAppManager $appManager) {
parent::__construct($logger);
$this->jsCombiner = $JSCombiner;
$this->appManager = $appManager;
}
/**
* @param string $script
*/
public function doFind($script) {
$theme_dir = 'themes/'.$this->theme.'/';
// Extracting the appId and the script file name
$app = substr($script, 0, strpos($script, '/'));
$scriptName = basename($script);
if (str_contains($script, '/l10n/')) {
// For language files we try to load them all, so themes can overwrite
// single l10n strings without having to translate all of them.
$found = 0;
$found += $this->appendScriptIfExist($this->serverroot, 'core/'.$script);
$found += $this->appendScriptIfExist($this->serverroot, $theme_dir.'core/'.$script);
$found += $this->appendScriptIfExist($this->serverroot, $script);
$found += $this->appendScriptIfExist($this->serverroot, $theme_dir.$script);
foreach (\OC::$APPSROOTS as $appRoot) {
$dirName = basename($appRoot['path']);
$rootPath = dirname($appRoot['path']);
$found += $this->appendScriptIfExist($rootPath, $dirName.'/'.$script);
$found += $this->appendScriptIfExist($this->serverroot, $theme_dir.$dirName.'/'.$script);
}
if ($found) {
return;
}
} elseif ($this->appendScriptIfExist($this->serverroot, $theme_dir.'apps/'.$script)
|| $this->appendScriptIfExist($this->serverroot, $theme_dir.$script)
|| $this->appendScriptIfExist($this->serverroot, $script)
|| $this->appendScriptIfExist($this->serverroot, $theme_dir."dist/$app-$scriptName")
|| $this->appendScriptIfExist($this->serverroot, "dist/$app-$scriptName")
|| $this->appendScriptIfExist($this->serverroot, 'apps/'.$script)
|| $this->cacheAndAppendCombineJsonIfExist($this->serverroot, $script.'.json')
|| $this->appendScriptIfExist($this->serverroot, $theme_dir.'core/'.$script)
|| $this->appendScriptIfExist($this->serverroot, 'core/'.$script)
|| (strpos($scriptName, '/') === -1 && ($this->appendScriptIfExist($this->serverroot, $theme_dir."dist/core-$scriptName")
|| $this->appendScriptIfExist($this->serverroot, "dist/core-$scriptName")))
|| $this->cacheAndAppendCombineJsonIfExist($this->serverroot, 'core/'.$script.'.json')
) {
return;
}
$script = substr($script, strpos($script, '/') + 1);
$app_url = null;
try {
$app_url = $this->appManager->getAppWebPath($app);
} catch (AppPathNotFoundException) {
// pass
}
try {
$app_path = $this->appManager->getAppPath($app);
// Account for the possibility of having symlinks in app path. Only
// do this if $app_path is set, because an empty argument to realpath
// gets turned into cwd.
$app_path = realpath($app_path);
// check combined files
if (!str_starts_with($script, 'l10n/') && $this->cacheAndAppendCombineJsonIfExist($app_path, $script.'.json', $app)) {
return;
}
// fallback to plain file location
if ($this->appendScriptIfExist($app_path, $script, $app_url)) {
return;
}
} catch (AppPathNotFoundException) {
// pass (general error handling happens below)
}
// missing translations files will be ignored
if (str_starts_with($script, 'l10n/')) {
return;
}
$this->logger->error('Could not find resource {resource} to load', [
'resource' => $app . '/' . $script . '.js',
'app' => 'jsresourceloader',
]);
}
/**
* @param string $script
*/
public function doFindTheme($script) {
}
/**
* Try to find ES6 script file (`.mjs`) with fallback to plain javascript (`.js`)
* @see appendIfExist()
*/
protected function appendScriptIfExist(string $root, string $file, string $webRoot = null) {
if (!$this->appendIfExist($root, $file . '.mjs', $webRoot)) {
return $this->appendIfExist($root, $file . '.js', $webRoot);
}
return true;
}
protected function cacheAndAppendCombineJsonIfExist($root, $file, $app = 'core') {
if (is_file($root.'/'.$file)) {
if ($this->jsCombiner->process($root, $file, $app)) {
$this->append($this->serverroot, $this->jsCombiner->getCachedJS($app, $file), false, false);
} else {
// Add all the files from the json
$files = $this->jsCombiner->getContent($root, $file);
$app_url = null;
try {
$app_url = $this->appManager->getAppWebPath($app);
} catch (AppPathNotFoundException) {
// pass
}
foreach ($files as $jsFile) {
$this->append($root, $jsFile, $app_url);
}
}
return true;
}
return false;
}
}
@@ -0,0 +1,196 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Bart Visscher <bartv@thisnet.nl>
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Joas Schilling <coding@schilljs.com>
* @author John Molakvoæ <skjnldsv@protonmail.com>
* @author Jörn Friedrich Dreyer <jfd@butonic.de>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Robin Appelman <robin@icewind.nl>
* @author Robin McCorkell <robin@mccorkell.me.uk>
* @author tux-rampage <tux-rampage@users.noreply.github.com>
*
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
namespace OC\Template;
use Psr\Log\LoggerInterface;
abstract class ResourceLocator {
protected $theme;
protected $mapping;
protected $serverroot;
protected $webroot;
protected $resources = [];
protected LoggerInterface $logger;
public function __construct(LoggerInterface $logger) {
$this->logger = $logger;
$this->mapping = [
\OC::$SERVERROOT => \OC::$WEBROOT
];
$this->serverroot = \OC::$SERVERROOT;
$this->webroot = \OC::$WEBROOT;
$this->theme = \OC_Util::getTheme();
}
/**
* @param string $resource
*/
abstract public function doFind($resource);
/**
* @param string $resource
*/
abstract public function doFindTheme($resource);
/**
* Finds the resources and adds them to the list
*
* @param array $resources
*/
public function find($resources) {
foreach ($resources as $resource) {
try {
$this->doFind($resource);
} catch (ResourceNotFoundException $e) {
$resourceApp = substr($resource, 0, strpos($resource, '/'));
$this->logger->debug('Could not find resource file "' . $e->getResourcePath() . '"', ['app' => $resourceApp]);
}
}
if (!empty($this->theme)) {
foreach ($resources as $resource) {
try {
$this->doFindTheme($resource);
} catch (ResourceNotFoundException $e) {
$resourceApp = substr($resource, 0, strpos($resource, '/'));
$this->logger->debug('Could not find resource file in theme "' . $e->getResourcePath() . '"', ['app' => $resourceApp]);
}
}
}
}
/**
* append the $file resource if exist at $root
*
* @param string $root path to check
* @param string $file the filename
* @param string|null $webRoot base for path, default map $root to $webRoot
* @return bool True if the resource was found, false otherwise
*/
protected function appendIfExist($root, $file, $webRoot = null) {
if ($root !== false && is_file($root.'/'.$file)) {
$this->append($root, $file, $webRoot, false);
return true;
}
return false;
}
/**
* Attempt to find the webRoot
*
* traverse the potential web roots upwards in the path
*
* example:
* - root: /srv/www/apps/myapp
* - available mappings: ['/srv/www']
*
* First we check if a mapping for /srv/www/apps/myapp is available,
* then /srv/www/apps, /srv/www/apps, /srv/www, ... until we find a
* valid web root
*
* @param string $root
* @return string|null The web root or null on failure
*/
protected function findWebRoot($root) {
$webRoot = null;
$tmpRoot = $root;
while ($webRoot === null) {
if (isset($this->mapping[$tmpRoot])) {
$webRoot = $this->mapping[$tmpRoot];
break;
}
if ($tmpRoot === '/') {
break;
}
$tmpRoot = dirname($tmpRoot);
}
if ($webRoot === null) {
$realpath = realpath($root);
if ($realpath && ($realpath !== $root)) {
return $this->findWebRoot($realpath);
}
}
return $webRoot;
}
/**
* append the $file resource at $root
*
* @param string $root path to check
* @param string $file the filename
* @param string|null $webRoot base for path, default map $root to $webRoot
* @param bool $throw Throw an exception, when the route does not exist
* @throws ResourceNotFoundException Only thrown when $throw is true and the resource is missing
*/
protected function append($root, $file, $webRoot = null, $throw = true) {
if (!is_string($root)) {
if ($throw) {
throw new ResourceNotFoundException($file, $webRoot);
}
return;
}
if (!$webRoot) {
$webRoot = $this->findWebRoot($root);
if ($webRoot === null) {
$webRoot = '';
$this->logger->error('ResourceLocator can not find a web root (root: {root}, file: {file}, webRoot: {webRoot}, throw: {throw})', [
'app' => 'lib',
'root' => $root,
'file' => $file,
'webRoot' => $webRoot,
'throw' => $throw ? 'true' : 'false'
]);
}
}
$this->resources[] = [$root, $webRoot, $file];
if ($throw && !is_file($root . '/' . $file)) {
throw new ResourceNotFoundException($file, $webRoot);
}
}
/**
* Returns the list of all resources that should be loaded
* @return array
*/
public function getResources() {
return $this->resources;
}
}
@@ -0,0 +1,45 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Joas Schilling <coding@schilljs.com>
* @author Morris Jobke <hey@morrisjobke.de>
*
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
namespace OC\Template;
class ResourceNotFoundException extends \LogicException {
protected $resource;
protected $webPath;
/**
* @param string $resource
* @param string $webPath
*/
public function __construct($resource, $webPath) {
parent::__construct('Resource not found');
$this->resource = $resource;
$this->webPath = $webPath;
}
/**
* @return string
*/
public function getResourcePath() {
return $this->webPath . '/' . $this->resource;
}
}
@@ -0,0 +1,62 @@
<?php
/**
* @copyright Copyright (c) 2016, ownCloud, Inc.
*
* @author Bart Visscher <bartv@thisnet.nl>
* @author Christoph Wurst <christoph@winzerhof-wurst.at>
* @author Jörn Friedrich Dreyer <jfd@butonic.de>
* @author Morris Jobke <hey@morrisjobke.de>
* @author Thomas Müller <thomas.mueller@tmit.eu>
*
* @license AGPL-3.0
*
* This code is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License, version 3,
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License, version 3,
* along with this program. If not, see <http://www.gnu.org/licenses/>
*
*/
namespace OC\Template;
class TemplateFileLocator {
protected $dirs;
private $path;
/**
* @param string[] $dirs
*/
public function __construct($dirs) {
$this->dirs = $dirs;
}
/**
* @param string $template
* @return string
* @throws \Exception
*/
public function find($template) {
if ($template === '') {
throw new \InvalidArgumentException('Empty template name');
}
foreach ($this->dirs as $dir) {
$file = $dir.$template.'.php';
if (is_file($file)) {
$this->path = $dir;
return $file;
}
}
throw new \Exception('template file not found: template:'.$template);
}
public function getPath() {
return $this->path;
}
}