summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--yt/yt/client/signature/generator.cpp52
-rw-r--r--yt/yt/client/signature/generator.h14
-rw-r--r--yt/yt/client/signature/public.h4
-rw-r--r--yt/yt/client/signature/signature.cpp6
-rw-r--r--yt/yt/client/signature/signature.h11
-rw-r--r--yt/yt/client/signature/unittests/dummy_ut.cpp73
-rw-r--r--yt/yt/client/signature/unittests/signature_ut.cpp8
-rw-r--r--yt/yt/client/signature/unittests/ya.make1
-rw-r--r--yt/yt/client/signature/validator.cpp41
-rw-r--r--yt/yt/client/signature/validator.h12
10 files changed, 188 insertions, 34 deletions
diff --git a/yt/yt/client/signature/generator.cpp b/yt/yt/client/signature/generator.cpp
index 75b69621067..98e3fe0d7e6 100644
--- a/yt/yt/client/signature/generator.cpp
+++ b/yt/yt/client/signature/generator.cpp
@@ -2,20 +2,68 @@
#include "signature.h"
+#include <yt/yt/core/ytree/convert.h>
+
namespace NYT::NSignature {
+using namespace NYson;
+
////////////////////////////////////////////////////////////////////////////////
-NYson::TYsonString& ISignatureGenerator::GetHeader(const TSignaturePtr& signature)
+TSignaturePtr TSignatureGeneratorBase::Sign(TYsonString data)
+{
+ auto signature = New<TSignature>();
+ signature->Payload_ = std::move(data);
+ Sign(signature);
+ return signature;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TYsonString& TSignatureGeneratorBase::GetHeader(const TSignaturePtr& signature)
{
return signature->Header_;
}
-std::vector<std::byte>& ISignatureGenerator::GetSignature(const TSignaturePtr& signature)
+std::vector<std::byte>& TSignatureGeneratorBase::GetSignature(const TSignaturePtr& signature)
{
return signature->Signature_;
}
////////////////////////////////////////////////////////////////////////////////
+class TDummySignatureGenerator
+ : public TSignatureGeneratorBase
+{
+public:
+ void Sign(const TSignaturePtr& signature) override
+ {
+ GetHeader(signature) = NYson::TYsonString("DummySignature"_sb);
+ }
+};
+
+TSignatureGeneratorBasePtr CreateDummySignatureGenerator()
+{
+ return New<TDummySignatureGenerator>();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TAlwaysThrowingSignatureGenerator
+ : public TSignatureGeneratorBase
+{
+public:
+ void Sign(const TSignaturePtr& /*signature*/) override
+ {
+ THROW_ERROR_EXCEPTION("Signature generation is unsupported");
+ }
+};
+
+TSignatureGeneratorBasePtr CreateAlwaysThrowingSignatureGenerator()
+{
+ return New<TAlwaysThrowingSignatureGenerator>();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
} // namespace NYT::NSignature
diff --git a/yt/yt/client/signature/generator.h b/yt/yt/client/signature/generator.h
index 523f35d4c38..f93f41c0cba 100644
--- a/yt/yt/client/signature/generator.h
+++ b/yt/yt/client/signature/generator.h
@@ -8,7 +8,7 @@ namespace NYT::NSignature {
////////////////////////////////////////////////////////////////////////////////
-class ISignatureGenerator
+class TSignatureGeneratorBase
: public TRefCounted
{
public:
@@ -16,7 +16,9 @@ public:
//! based on its payload.
virtual void Sign(const TSignaturePtr& signature) = 0;
- virtual ~ISignatureGenerator() = default;
+ [[nodiscard]] TSignaturePtr Sign(NYson::TYsonString data);
+
+ virtual ~TSignatureGeneratorBase() = default;
protected:
NYson::TYsonString& GetHeader(const TSignaturePtr& signature);
@@ -24,7 +26,13 @@ protected:
std::vector<std::byte>& GetSignature(const TSignaturePtr& signature);
};
-DEFINE_REFCOUNTED_TYPE(ISignatureGenerator)
+DEFINE_REFCOUNTED_TYPE(TSignatureGeneratorBase)
+
+////////////////////////////////////////////////////////////////////////////////
+
+TSignatureGeneratorBasePtr CreateDummySignatureGenerator();
+
+TSignatureGeneratorBasePtr CreateAlwaysThrowingSignatureGenerator();
////////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/client/signature/public.h b/yt/yt/client/signature/public.h
index 845445d9e93..bf0a10cdbb4 100644
--- a/yt/yt/client/signature/public.h
+++ b/yt/yt/client/signature/public.h
@@ -10,8 +10,8 @@ DECLARE_REFCOUNTED_CLASS(TSignature)
///////////////////////////////////////////////////////////////////////////////
-DECLARE_REFCOUNTED_CLASS(ISignatureGenerator)
-DECLARE_REFCOUNTED_CLASS(ISignatureValidator)
+DECLARE_REFCOUNTED_CLASS(TSignatureGeneratorBase)
+DECLARE_REFCOUNTED_CLASS(TSignatureValidatorBase)
///////////////////////////////////////////////////////////////////////////////
diff --git a/yt/yt/client/signature/signature.cpp b/yt/yt/client/signature/signature.cpp
index 4c071c14073..0a71e0a02c6 100644
--- a/yt/yt/client/signature/signature.cpp
+++ b/yt/yt/client/signature/signature.cpp
@@ -14,12 +14,6 @@ using namespace NYTree;
////////////////////////////////////////////////////////////////////////////////
-TSignature::TSignature(NYson::TYsonString payload)
- : Payload_(std::move(payload))
-{ }
-
-////////////////////////////////////////////////////////////////////////////////
-
const TYsonString& TSignature::Payload() const
{
return Payload_;
diff --git a/yt/yt/client/signature/signature.h b/yt/yt/client/signature/signature.h
index 6cb739bd3c0..8f37c81261f 100644
--- a/yt/yt/client/signature/signature.h
+++ b/yt/yt/client/signature/signature.h
@@ -20,20 +20,15 @@ public:
//! Constructs an empty TSignature.
TSignature() = default;
- //! Creates a TSignature containing the given payload without an actual signature.
- explicit TSignature(NYson::TYsonString payload);
-
[[nodiscard]] const NYson::TYsonString& Payload() const;
private:
- // TODO(arkady-e1ppa): Whenever trivial generator/validators are added
- // remove initialization.
- NYson::TYsonString Header_ = NYson::TYsonString(TStringBuf(""));
+ NYson::TYsonString Header_;
NYson::TYsonString Payload_;
std::vector<std::byte> Signature_;
- friend class ISignatureGenerator;
- friend class ISignatureValidator;
+ friend class TSignatureGeneratorBase;
+ friend class TSignatureValidatorBase;
friend void Serialize(const TSignature& signature, NYson::IYsonConsumer* consumer);
friend void Deserialize(TSignature& signature, NYTree::INodePtr node);
diff --git a/yt/yt/client/signature/unittests/dummy_ut.cpp b/yt/yt/client/signature/unittests/dummy_ut.cpp
new file mode 100644
index 00000000000..1a5d483ad8e
--- /dev/null
+++ b/yt/yt/client/signature/unittests/dummy_ut.cpp
@@ -0,0 +1,73 @@
+#include <yt/yt/core/test_framework/framework.h>
+
+#include <yt/yt/client/signature/generator.h>
+#include <yt/yt/client/signature/validator.h>
+#include <yt/yt/client/signature/signature.h>
+
+#include <yt/yt/core/yson/string.h>
+
+#include <yt/yt/core/ytree/convert.h>
+
+namespace NYT::NSignature {
+namespace {
+
+////////////////////////////////////////////////////////////////////////////////
+
+using namespace NYson;
+using namespace NYTree;
+
+const auto YsonSignature = TYsonString(
+ R"({"header"="DummySignature";"payload"="payload";"signature"="";})"_sb);
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TDummySignatureGeneratorTest, Generate)
+{
+ auto generator = CreateDummySignatureGenerator();
+ auto signature = generator->Sign(TYsonString("payload"_sb));
+ EXPECT_EQ(ConvertToYsonString(signature, EYsonFormat::Text), YsonSignature);
+ generator->Sign(signature);
+ EXPECT_EQ(ConvertToYsonString(signature, EYsonFormat::Text), YsonSignature);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TDummySignatureValidatorTest, ValidateGood)
+{
+ auto signature = ConvertTo<TSignaturePtr>(YsonSignature);
+ auto validator = CreateDummySignatureValidator();
+ EXPECT_TRUE(validator->Validate(signature).Get().Value());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TDummySignatureValidatorTest, GenerateValidate)
+{
+ auto generator = CreateDummySignatureGenerator();
+ auto validator = CreateDummySignatureValidator();
+ auto signature = generator->Sign(TYsonString("payload"_sb));
+ EXPECT_TRUE(validator->Validate(signature).Get().Value());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TAlwaysThrowingSignatureGeneratorTest, Generate)
+{
+ auto generator = CreateAlwaysThrowingSignatureGenerator();
+ EXPECT_THROW_WITH_SUBSTRING(generator->Sign(New<TSignature>()), "unsupported");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+TEST(TAlwaysThrowingSignatureValidatorTest, Validate)
+{
+ auto validator = CreateAlwaysThrowingSignatureValidator();
+ EXPECT_THROW_WITH_SUBSTRING(
+ YT_UNUSED_FUTURE(validator->Validate(New<TSignature>())),
+ "unsupported");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+} // namespace
+} // namespace NYT::NSignature
diff --git a/yt/yt/client/signature/unittests/signature_ut.cpp b/yt/yt/client/signature/unittests/signature_ut.cpp
index 75ae1733fab..26397157469 100644
--- a/yt/yt/client/signature/unittests/signature_ut.cpp
+++ b/yt/yt/client/signature/unittests/signature_ut.cpp
@@ -16,14 +16,6 @@ using namespace NYTree;
////////////////////////////////////////////////////////////////////////////////
-TEST(TSignatureTest, PayloadConstruct)
-{
- TSignature signature(TYsonString("payload"_sb));
- EXPECT_EQ(signature.Payload().ToString(), "payload");
-}
-
-////////////////////////////////////////////////////////////////////////////////
-
TEST(TSignatureTest, DeserializeSerialize)
{
// SignatureSize bytes.
diff --git a/yt/yt/client/signature/unittests/ya.make b/yt/yt/client/signature/unittests/ya.make
index b7f6fd5fe56..ee92b119d94 100644
--- a/yt/yt/client/signature/unittests/ya.make
+++ b/yt/yt/client/signature/unittests/ya.make
@@ -3,6 +3,7 @@ GTEST(unittester-client-signature)
INCLUDE(${ARCADIA_ROOT}/yt/ya_cpp.make.inc)
SRCS(
+ dummy_ut.cpp
signature_ut.cpp
)
diff --git a/yt/yt/client/signature/validator.cpp b/yt/yt/client/signature/validator.cpp
index 710303bf851..ef57ba0d251 100644
--- a/yt/yt/client/signature/validator.cpp
+++ b/yt/yt/client/signature/validator.cpp
@@ -2,21 +2,58 @@
#include "signature.h"
+#include <yt/yt/core/actions/future.h>
+
namespace NYT::NSignature {
////////////////////////////////////////////////////////////////////////////////
-const NYson::TYsonString& ISignatureValidator::GetHeader(const TSignaturePtr& signature)
+const NYson::TYsonString& TSignatureValidatorBase::GetHeader(const TSignaturePtr& signature)
{
return signature->Header_;
}
-const std::vector<std::byte>& ISignatureValidator::GetSignature(const TSignaturePtr& signature)
+const std::vector<std::byte>& TSignatureValidatorBase::GetSignature(const TSignaturePtr& signature)
{
return signature->Signature_;
}
////////////////////////////////////////////////////////////////////////////////
+class TDummySignatureValidator
+ : public TSignatureValidatorBase
+{
+public:
+ TFuture<bool> Validate(const TSignaturePtr& signature) override
+ {
+ YT_VERIFY(GetHeader(signature).ToString() == "DummySignature");
+ return TrueFuture;
+ }
+};
+
+TSignatureValidatorBasePtr CreateDummySignatureValidator()
+{
+ return New<TDummySignatureValidator>();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+class TAlwaysThrowingSignatureValidator
+ : public TSignatureValidatorBase
+{
+public:
+ TFuture<bool> Validate(const TSignaturePtr& /*signature*/) override
+ {
+ THROW_ERROR_EXCEPTION("Signature validation is unsupported");
+ }
+};
+
+TSignatureValidatorBasePtr CreateAlwaysThrowingSignatureValidator()
+{
+ return New<TAlwaysThrowingSignatureValidator>();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
} // namespace NYT::NSignature
diff --git a/yt/yt/client/signature/validator.h b/yt/yt/client/signature/validator.h
index d3f3e76a695..bde89c44bbe 100644
--- a/yt/yt/client/signature/validator.h
+++ b/yt/yt/client/signature/validator.h
@@ -9,13 +9,13 @@ namespace NYT::NSignature {
////////////////////////////////////////////////////////////////////////////////
-class ISignatureValidator
+class TSignatureValidatorBase
: public TRefCounted
{
public:
virtual TFuture<bool> Validate(const TSignaturePtr& signature) = 0;
- virtual ~ISignatureValidator() = default;
+ virtual ~TSignatureValidatorBase() = default;
protected:
const NYson::TYsonString& GetHeader(const TSignaturePtr& signature);
@@ -23,7 +23,13 @@ protected:
const std::vector<std::byte>& GetSignature(const TSignaturePtr& signature);
};
-DEFINE_REFCOUNTED_TYPE(ISignatureValidator)
+DEFINE_REFCOUNTED_TYPE(TSignatureValidatorBase)
+
+////////////////////////////////////////////////////////////////////////////////
+
+TSignatureValidatorBasePtr CreateDummySignatureValidator();
+
+TSignatureValidatorBasePtr CreateAlwaysThrowingSignatureValidator();
////////////////////////////////////////////////////////////////////////////////