%PDF- %PDF-
| Direktori : /www/varak.net/nextcloud.varak.net/lib/private/Security/CSP/ |
| Current File : //www/varak.net/nextcloud.varak.net/lib/private/Security/CSP/ContentSecurityPolicyNonceManager.php |
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OC\Security\CSP;
use OC\AppFramework\Http\Request;
use OC\Security\CSRF\CsrfTokenManager;
use OCP\IRequest;
/**
* @package OC\Security\CSP
*/
class ContentSecurityPolicyNonceManager {
private string $nonce = '';
public function __construct(
private CsrfTokenManager $csrfTokenManager,
private IRequest $request,
) {
}
/**
* Returns the current CSP nonce
*/
public function getNonce(): string {
if ($this->nonce === '') {
if (empty($this->request->server['CSP_NONCE'])) {
// Get the token from the CSRF token, we only use the "shared secret" part
// as the first part does not add any security / entropy to the token
// so it can be ignored to keep the nonce short while keeping the same randomness
$csrfSecret = explode(':', ($this->csrfTokenManager->getToken()->getEncryptedValue()));
$this->nonce = end($csrfSecret);
} else {
$this->nonce = $this->request->server['CSP_NONCE'];
}
}
return $this->nonce;
}
/**
* Check if the browser supports CSP v3
*/
public function browserSupportsCspV3(): bool {
$browserBlocklist = [
Request::USER_AGENT_IE,
];
if ($this->request->isUserAgent($browserBlocklist)) {
return false;
}
return true;
}
}