aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMaxence Lange <maxence@artificial-owl.com>2024-12-03 16:01:35 -0100
committerMaxence Lange <maxence@artificial-owl.com>2024-12-04 09:30:55 -0100
commit15b72281dfb1d301a3e3ba9229f69ead37e1ab53 (patch)
treee321a9ef3d5d34b8c33fd91d8b71b6dfdd74023d
parent4df315552391af1c89516fa2f2c1796666f086be (diff)
downloadnextcloud-server-15b72281dfb1d301a3e3ba9229f69ead37e1ab53.tar.gz
nextcloud-server-15b72281dfb1d301a3e3ba9229f69ead37e1ab53.zip
fix(signatory): details on interfaces
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
-rw-r--r--lib/private/Security/Signature/Model/IncomingSignedRequest.php15
-rw-r--r--lib/private/Security/Signature/Model/SignedRequest.php13
-rw-r--r--lib/unstable/Security/Signature/IIncomingSignedRequest.php17
-rw-r--r--lib/unstable/Security/Signature/IOutgoingSignedRequest.php7
-rw-r--r--lib/unstable/Security/Signature/ISignatoryManager.php3
-rw-r--r--lib/unstable/Security/Signature/ISignatureManager.php10
-rw-r--r--lib/unstable/Security/Signature/ISignedRequest.php34
7 files changed, 49 insertions, 50 deletions
diff --git a/lib/private/Security/Signature/Model/IncomingSignedRequest.php b/lib/private/Security/Signature/Model/IncomingSignedRequest.php
index d644aa8e1c1..0f7dc7cb771 100644
--- a/lib/private/Security/Signature/Model/IncomingSignedRequest.php
+++ b/lib/private/Security/Signature/Model/IncomingSignedRequest.php
@@ -9,6 +9,7 @@ declare(strict_types=1);
namespace OC\Security\Signature\Model;
use JsonSerializable;
+use NCU\Security\Signature\Enum\DigestAlgorithm;
use NCU\Security\Signature\Enum\SignatureAlgorithm;
use NCU\Security\Signature\Exceptions\IdentityNotFoundException;
use NCU\Security\Signature\Exceptions\IncomingRequestException;
@@ -22,6 +23,7 @@ use NCU\Security\Signature\ISignatureManager;
use NCU\Security\Signature\Model\Signatory;
use OC\Security\Signature\SignatureManager;
use OCP\IRequest;
+use ValueError;
/**
* @inheritDoc
@@ -107,6 +109,12 @@ class IncomingSignedRequest extends SignedRequest implements
}
// confirm digest value, based on body
+ [$algo, ] = explode('=', $digest);
+ try {
+ $this->setDigestAlgorithm(DigestAlgorithm::from($algo));
+ } catch (ValueError) {
+ throw new IncomingRequestException('unknown digest algorithm');
+ }
if ($digest !== $this->getDigest()) {
throw new IncomingRequestException('invalid value for digest in header');
}
@@ -188,15 +196,14 @@ class IncomingSignedRequest extends SignedRequest implements
}
/**
- * @inheritDoc
+ * set the hostname at the source of the request,
+ * based on the keyId defined in the signature header.
*
* @param string $origin
- * @return IIncomingSignedRequest
* @since 31.0.0
*/
- public function setOrigin(string $origin): IIncomingSignedRequest {
+ private function setOrigin(string $origin): void {
$this->origin = $origin;
- return $this;
}
/**
diff --git a/lib/private/Security/Signature/Model/SignedRequest.php b/lib/private/Security/Signature/Model/SignedRequest.php
index 214e43e8cb3..f30935e83b1 100644
--- a/lib/private/Security/Signature/Model/SignedRequest.php
+++ b/lib/private/Security/Signature/Model/SignedRequest.php
@@ -44,14 +44,15 @@ class SignedRequest implements ISignedRequest, JsonSerializable {
}
/**
- * @inheritDoc
+ * set algorithm used to generate digest
*
* @param DigestAlgorithm $algorithm
*
* @return self
* @since 31.0.0
*/
- public function setDigestAlgorithm(DigestAlgorithm $algorithm): self {
+ protected function setDigestAlgorithm(DigestAlgorithm $algorithm): self {
+ $this->digestAlgorithm = $algorithm;
return $this;
}
@@ -119,14 +120,14 @@ class SignedRequest implements ISignedRequest, JsonSerializable {
}
/**
- * @inheritDoc
+ * store data used to generate signature
*
* @param array $data
*
* @return self
* @since 31.0.0
*/
- public function setSignatureData(array $data): self {
+ protected function setSignatureData(array $data): self {
$this->signatureData = $data;
return $this;
}
@@ -142,14 +143,14 @@ class SignedRequest implements ISignedRequest, JsonSerializable {
}
/**
- * @inheritDoc
+ * set the signed version of the signature
*
* @param string $signature
*
* @return self
* @since 31.0.0
*/
- public function setSignature(string $signature): self {
+ protected function setSignature(string $signature): self {
$this->signature = $signature;
return $this;
}
diff --git a/lib/unstable/Security/Signature/IIncomingSignedRequest.php b/lib/unstable/Security/Signature/IIncomingSignedRequest.php
index 11a2cdde868..5c06c41c394 100644
--- a/lib/unstable/Security/Signature/IIncomingSignedRequest.php
+++ b/lib/unstable/Security/Signature/IIncomingSignedRequest.php
@@ -17,6 +17,13 @@ use OCP\IRequest;
* model wrapping an actual incoming request, adding details about the signature and the
* authenticity of the origin of the request.
*
+ * This interface must not be implemented in your application but
+ * instead obtained from {@see ISignatureManager::getIncomingSignedRequest}.
+ *
+ * ```php
+ * $signedRequest = $this->signatureManager->getIncomingSignedRequest($mySignatoryManager);
+ * ```
+ *
* @see ISignatureManager for details on signature
* @experimental 31.0.0
*/
@@ -30,16 +37,6 @@ interface IIncomingSignedRequest extends ISignedRequest {
public function getRequest(): IRequest;
/**
- * set the hostname at the source of the request,
- * based on the keyId defined in the signature header.
- *
- * @param string $origin
- * @return IIncomingSignedRequest
- * @experimental 31.0.0
- */
- public function setOrigin(string $origin): IIncomingSignedRequest;
-
- /**
* get the hostname at the source of the base request.
* based on the keyId defined in the signature header.
*
diff --git a/lib/unstable/Security/Signature/IOutgoingSignedRequest.php b/lib/unstable/Security/Signature/IOutgoingSignedRequest.php
index 3901c9e555c..e9af12ea4b4 100644
--- a/lib/unstable/Security/Signature/IOutgoingSignedRequest.php
+++ b/lib/unstable/Security/Signature/IOutgoingSignedRequest.php
@@ -15,6 +15,13 @@ use NCU\Security\Signature\Exceptions\SignatoryNotFoundException;
/**
* extends ISignedRequest to add info requested at the generation of the signature
*
+ * This interface must not be implemented in your application but
+ * instead obtained from {@see ISignatureManager::getIncomingSignedRequest}.
+ *
+ * ```php
+ * $signedRequest = $this->signatureManager->getIncomingSignedRequest($mySignatoryManager);
+ * ```
+ *
* @see ISignatureManager for details on signature
* @experimental 31.0.0
*/
diff --git a/lib/unstable/Security/Signature/ISignatoryManager.php b/lib/unstable/Security/Signature/ISignatoryManager.php
index e265b52f755..c16dace1bde 100644
--- a/lib/unstable/Security/Signature/ISignatoryManager.php
+++ b/lib/unstable/Security/Signature/ISignatoryManager.php
@@ -15,6 +15,9 @@ use NCU\Security\Signature\Model\Signatory;
* - signing outgoing request
* - confirm the authenticity of incoming signed request.
*
+ * This interface must be implemented to generate a `SignatoryManager` to
+ * be used with {@see ISignatureManager}
+ *
* @experimental 31.0.0
*/
interface ISignatoryManager {
diff --git a/lib/unstable/Security/Signature/ISignatureManager.php b/lib/unstable/Security/Signature/ISignatureManager.php
index b7a738d95ad..655454f67e7 100644
--- a/lib/unstable/Security/Signature/ISignatureManager.php
+++ b/lib/unstable/Security/Signature/ISignatureManager.php
@@ -41,6 +41,16 @@ use NCU\Security\Signature\Model\Signatory;
* listed in 'headers' and their value. Some elements (content-length date digest host) are mandatory
* to ensure authenticity override protection.
*
+ * This interface can be used to inject {@see SignatureManager} in your code:
+ *
+ * ```php
+ * public function __construct(
+ * private ISignatureManager $signatureManager,
+ * ) {}
+ * ```
+ *
+ * instead obtained from {@see ISignatureManager::getIncomingSignedRequest}.
+ *
* @experimental 31.0.0
*/
interface ISignatureManager {
diff --git a/lib/unstable/Security/Signature/ISignedRequest.php b/lib/unstable/Security/Signature/ISignedRequest.php
index e3c77c9767a..6bf5e7e7dbc 100644
--- a/lib/unstable/Security/Signature/ISignedRequest.php
+++ b/lib/unstable/Security/Signature/ISignedRequest.php
@@ -19,6 +19,10 @@ use NCU\Security\Signature\Model\Signatory;
* - to confirm authenticity of a signed incoming request
* - to sign an outgoing request
*
+ * This interface must not be implemented in your application:
+ * @see IIncomingSignedRequest
+ * @see IOutgoingSignedRequest
+ *
* @experimental 31.0.0
*/
interface ISignedRequest {
@@ -31,16 +35,6 @@ interface ISignedRequest {
public function getBody(): string;
/**
- * set algorithm used to generate digest
- *
- * @param DigestAlgorithm $algorithm
- *
- * @return self
- * @experimental 31.0.0
- */
- public function setDigestAlgorithm(DigestAlgorithm $algorithm): self;
-
- /**
* get algorithm used to generate digest
*
* @return DigestAlgorithm
@@ -84,16 +78,6 @@ interface ISignedRequest {
public function getSigningElement(string $key): string;
/**
- * store data used to generate signature
- *
- * @param array $data
- *
- * @return self
- * @experimental 31.0.0
- */
- public function setSignatureData(array $data): self;
-
- /**
* returns data used to generate signature
*
* @return array
@@ -102,16 +86,6 @@ interface ISignedRequest {
public function getSignatureData(): array;
/**
- * set the signed version of the signature
- *
- * @param string $signature
- *
- * @return self
- * @experimental 31.0.0
- */
- public function setSignature(string $signature): self;
-
- /**
* get the signed version of the signature
*
* @return string