mirror of
https://github.com/nextcloud/server.git
synced 2026-06-11 01:30:50 -04:00
Fixed webroot detection
Signed-off-by: John Molakvoæ (skjnldsv) <skjnldsv@protonmail.com>
This commit is contained in:
parent
1aa7fd8917
commit
fc0e62185c
2 changed files with 61 additions and 4 deletions
|
|
@ -18,6 +18,7 @@ $color-border: lighten($color-main-background, 7%);
|
|||
$color-border-dark: lighten($color-main-background, 14%);
|
||||
|
||||
#app-navigation > ul > li > a:first-child img,
|
||||
#app-navigation > ul > li > ul > li > a:first-child img {
|
||||
#app-navigation > ul > li > ul > li > a:first-child img,
|
||||
#expanddiv a img {
|
||||
filter: invert(100%);
|
||||
}
|
||||
|
|
@ -111,8 +111,9 @@ class AccessibilityController extends Controller {
|
|||
public function getCss(): DataDisplayResponse {
|
||||
$css = '';
|
||||
$imports = '';
|
||||
$userValues = $this->getUserValues();
|
||||
|
||||
foreach ($this->getUserValues() as $key => $scssFile) {
|
||||
foreach ($userValues as $key => $scssFile) {
|
||||
if ($scssFile !== false) {
|
||||
$imports .= '@import "' . $scssFile . '";';
|
||||
}
|
||||
|
|
@ -144,6 +145,16 @@ class AccessibilityController extends Controller {
|
|||
// We don't want to override vars with url since path is different
|
||||
$css = $this->filterOutRule('/--[a-z-:]+url\([^;]+\)/mi', $css);
|
||||
|
||||
// Calculate exact absolute path to file
|
||||
$path = $this->urlGenerator->linkToRoute($this->appName . '.accessibility.getCss', ['md5' => md5(implode('-', $userValues))]);
|
||||
$path = explode('/', $this->serverRoot . $path);
|
||||
array_pop($path);
|
||||
$path = implode('/', $path);
|
||||
$webDir = $this->getWebDir($path, $this->appName, $this->serverRoot, \OC::$WEBROOT);
|
||||
|
||||
// Rebase all urls
|
||||
$css = $this->rebaseUrls($css, $webDir);
|
||||
|
||||
$response = new DataDisplayResponse($css, Http::STATUS_OK, ['Content-Type' => 'text/css']);
|
||||
|
||||
// Set cache control
|
||||
|
|
@ -158,15 +169,60 @@ class AccessibilityController extends Controller {
|
|||
return $response;
|
||||
}
|
||||
|
||||
private function getUserValues() {
|
||||
/**
|
||||
* Return an array with the user theme & font settings
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function getUserValues(): array{
|
||||
$userTheme = $this->config->getUserValue($this->userSession->getUser()->getUID(), $this->appName, 'theme', false);
|
||||
$userFont = $this->config->getUserValue($this->userSession->getUser()->getUID(), $this->appName, 'font', false);
|
||||
|
||||
return [$userTheme, $userFont];
|
||||
}
|
||||
|
||||
private function filterOutRule(string $rule, string $css) {
|
||||
/**
|
||||
* Remove all matches from the $rule regex
|
||||
*
|
||||
* @param string $rule regex to match
|
||||
* @param string $css string to parse
|
||||
* @return string
|
||||
*/
|
||||
private function filterOutRule(string $rule, string $css): string {
|
||||
return preg_replace($rule, '', $css);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the correct uri prefix to make uri valid again
|
||||
*
|
||||
* @param string $css
|
||||
* @param string $webDir
|
||||
* @return string
|
||||
*/
|
||||
private function rebaseUrls(string $css, string $webDir): string {
|
||||
$re = '/url\([\'"]([^\/][\.\w?=\/-]*)[\'"]\)/x';
|
||||
$subst = 'url(\'' . $webDir . '/$1\')';
|
||||
|
||||
return preg_replace($re, $subst, $css);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get WebDir root
|
||||
* @param string $path the css file path
|
||||
* @param string $appName the app name
|
||||
* @param string $serverRoot the server root path
|
||||
* @param string $webRoot the nextcloud installation root path
|
||||
* @return string the webDir
|
||||
*/
|
||||
private function getWebDir(string $path, string $appName, string $serverRoot, string $webRoot): string {
|
||||
// Detect if path is within server root AND if path is within an app path
|
||||
if ( strpos($path, $serverRoot) === false && $appWebPath = \OC_App::getAppWebPath($appName)) {
|
||||
// Get the file path within the app directory
|
||||
$appDirectoryPath = explode($appName, $path)[1];
|
||||
// Remove the webroot
|
||||
return str_replace($webRoot, '', $appWebPath.$appDirectoryPath);
|
||||
}
|
||||
return $webRoot.substr($path, strlen($serverRoot));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue