%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Helper/Http/ |
| Current File : /www/varak.net/nextcloud.varak.net/apps_old/apps/passwords/lib/Helper/Http/SetupReportHelper.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\Helper\Http;
use OCP\IConfig;
use OCP\IRequest;
/**
* Class SetupReportHelper
*
* @package OCA\Passwords\Helper\Http
*/
class SetupReportHelper {
/**
* @var IConfig
*/
protected IConfig $config;
/**
* @var IRequest
*/
protected IRequest $request;
/**
* @var bool|null
*/
protected ?bool $proxy = null;
/**
* @var string|null
*/
protected ?string $remoteAddress = null;
/**
* SetupReportHelper constructor.
*
* @param IRequest $request
* @param IConfig $config
*/
public function __construct(IRequest $request, IConfig $config) {
$this->request = $request;
$this->config = $config;
}
/**
* @return array[]
*/
public function getHttpsSetupReport(): array {
return [
$this->getHttpsStatus(),
$this->getProxyStatus(),
$this->getProxySettingsStatus(),
$this->getPhpStatus(),
];
}
/**
* @return array
*/
protected function getHttpsStatus(): array {
return [
'label' => 'HTTPS detection',
'items' => [
[
'label' => 'Nextcloud reported protocol',
'expected' => 'https',
'actual' => $this->request->getServerProtocol()
],
[
'label' => 'Client reported protocol',
'expected' => 'https',
'actual' => $this->request->getParam('https', 'true') === 'true' ? 'https':'http'
]
]
];
}
/**
* @return array
*/
protected function getProxyStatus(): array {
$isProxy = $this->isProxy();
return [
'label' => 'Proxy detection',
'items' => [
[
'label' => 'Proxy detected',
'expected' => $isProxy ? '':'Yes if Proxy',
'actual' => $isProxy ? 'yes':'no',
],
[
'label' => 'Detected remote address',
'expected' => $this->request->getRemoteAddress(),
'actual' => $this->getRemoteAddress()
],
[
'label' => 'Detected proxy address',
'expected' => $isProxy ? 'The proxy ip':'',
'actual' => $isProxy ? $_SERVER['REMOTE_ADDR']:''
]
]
];
}
/**
* @return array
*/
protected function getProxySettingsStatus(): array {
$isProxy = $this->isProxy();
$remoteAddress = $this->getRemoteAddress();
$overwritecondaddr = 'not set';
$trustedProxies = '[]';
if($isProxy) {
if($remoteAddress !== $_SERVER['REMOTE_ADDR']) {
$overwritecondaddr = '^'.str_replace('.', '\.', $_SERVER['REMOTE_ADDR']).'$';
$trustedProxies = "[\"{$_SERVER['REMOTE_ADDR']}\"]";
} else {
$overwritecondaddr = 'Regex matching proxy address, e.g. ^'.str_replace('.', '\.', $_SERVER['REMOTE_ADDR']).'$';
$trustedProxies = "Array including proxy address, e.g. [\"{$_SERVER['REMOTE_ADDR']}\"]";
}
}
return [
'label' => 'Nextcloud Proxy Settings',
'items' => [
[
'label' => 'overwriteprotocol',
'expected' => $isProxy ? 'https':'not set',
'actual' => $this->config->getSystemValue('overwriteprotocol', 'not set'),
],
[
'label' => 'overwritecondaddr',
'expected' => $overwritecondaddr,
'actual' => $this->config->getSystemValue('overwritecondaddr', 'not set'),
],
[
'label' => 'trusted_proxies',
'expected' => $trustedProxies,
'actual' => json_encode($this->config->getSystemValue('trusted_proxies', [])),
]
]
];
}
/**
* @return array
*/
protected function getPhpStatus(): array {
$forwardedProto = 'not set';
$forwardedFor = 'not set';
$remoteAddr = 'yours';
if($this->isProxy()) {
$forwardedProto = 'https';
$forwardedFor = $this->getRemoteAddress();
$remoteAddr = 'proxy ip, matching overwritecondaddr';
}
$items = [
[
'label' => '$_SERVER[\'HTTPS\']',
'expected' => 'on',
'actual' => isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS']:'not set',
],
[
'label' => '$_SERVER[\'REQUEST_SCHEME\']',
'expected' => 'https',
'actual' => isset($_SERVER['REQUEST_SCHEME']) ? $_SERVER['REQUEST_SCHEME']:'not set'
],
[
'label' => '$_SERVER[\'REMOTE_ADDR\']',
'expected' => $remoteAddr,
'actual' => isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR']:'not set'
],
[
'label' => '$_SERVER[\'HTTP_X_FORWARDED_PROTO\']',
'expected' => $forwardedProto,
'actual' => isset($_SERVER['HTTP_X_FORWARDED_PROTO']) ? $_SERVER['HTTP_X_FORWARDED_PROTO']:'not set'
]
];
$headers = $this->config->getSystemValue('forwarded_for_headers', ['HTTP_X_FORWARDED_FOR']);
foreach($headers as $header) {
$items[]
= [
'label' => "\$_SERVER['{$header}']",
'expected' => $forwardedFor,
'actual' => isset($_SERVER[ $header ]) ? $_SERVER[ $header ]:'not set'
];
}
return [
'label' => 'PHP Variables',
'items' => $items
];
}
/**
* @return bool
*/
protected function isProxy(): bool {
if($this->proxy !== null) return $this->proxy;
$headers = $this->config->getSystemValue('forwarded_for_headers', ['HTTP_X_FORWARDED_FOR']);
$this->proxy = isset($_SERVER['HTTP_X_FORWARDED_FOR']) || isset($_SERVER['HTTP_X_FORWARDED_PROTO']) || isset($_SERVER['HTTP_X_FORWARDED_PORT']);
foreach($headers as $header) {
if(isset($_SERVER[ $header ])) {
$this->proxy = true;
}
}
return $this->proxy;
}
/**
* @return string
*/
protected function getRemoteAddress(): string {
if($this->remoteAddress !== null) return $this->remoteAddress;
$this->remoteAddress = $_SERVER['REMOTE_ADDR'];
$headers = $this->config->getSystemValue('forwarded_for_headers', ['HTTP_X_FORWARDED_FOR']);
foreach($headers as $header) {
if(isset($_SERVER[ $header ])) {
$this->remoteAddress = $_SERVER[ $header ];
}
}
return $this->remoteAddress;
}
}