diff options
| -rw-r--r-- | yt/yt/client/signature/generator.cpp | 52 | ||||
| -rw-r--r-- | yt/yt/client/signature/generator.h | 14 | ||||
| -rw-r--r-- | yt/yt/client/signature/public.h | 4 | ||||
| -rw-r--r-- | yt/yt/client/signature/signature.cpp | 6 | ||||
| -rw-r--r-- | yt/yt/client/signature/signature.h | 11 | ||||
| -rw-r--r-- | yt/yt/client/signature/unittests/dummy_ut.cpp | 73 | ||||
| -rw-r--r-- | yt/yt/client/signature/unittests/signature_ut.cpp | 8 | ||||
| -rw-r--r-- | yt/yt/client/signature/unittests/ya.make | 1 | ||||
| -rw-r--r-- | yt/yt/client/signature/validator.cpp | 41 | ||||
| -rw-r--r-- | yt/yt/client/signature/validator.h | 12 |
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(); //////////////////////////////////////////////////////////////////////////////// |
