#include "auth.h" #include using namespace NTvmAuth; namespace NMonitoring { namespace { template > class TTvmManager final: public ITvmManager { public: TTvmManager(NTvmApi::TClientSettings settings, TVector clients, TLoggerPtr logger) : AllowedClients_{clients.begin(), clients.end()} , Tvm_(new TTvmClient{std::move(settings), std::move(logger)}) { } TTvmManager(NTvmTool::TClientSettings settings, TVector clients, TLoggerPtr logger) : AllowedClients_{clients.begin(), clients.end()} , Tvm_(new TTvmClient{std::move(settings), std::move(logger)}) { } TTvmManager(TTvmClientPtr tvm, TVector clients) : AllowedClients_{clients.begin(), clients.end()} , Tvm_(std::move(tvm)) { } bool IsAllowedClient(TTvmId clientId) override { return AllowedClients_.contains(clientId); } TCheckedServiceTicket CheckServiceTicket(TStringBuf ticket) override { return Tvm_->CheckServiceTicket(ticket); } private: THashSet AllowedClients_; TTvmClientPtr Tvm_; }; class TTvmAuthProvider final: public IAuthProvider { public: TTvmAuthProvider(THolder manager) : TvmManager_{std::move(manager)} { } TAuthResult Check(const IHttpRequest& req) override { auto ticketHeader = req.GetHeaders().FindHeader("X-Ya-Service-Ticket"); if (!ticketHeader) { return TAuthResult::NoCredentials(); } const auto ticket = TvmManager_->CheckServiceTicket(ticketHeader->Value()); if (!ticket) { return TAuthResult::Denied(); } return TvmManager_->IsAllowedClient(ticket.GetSrc()) ? TAuthResult::Ok() : TAuthResult::Denied(); } private: THolder TvmManager_; }; } // namespace THolder CreateDefaultTvmManager(NTvmApi::TClientSettings settings, TVector allowedClients, TLoggerPtr logger) { return MakeHolder>(std::move(settings), std::move(allowedClients), std::move(logger)); } THolder CreateDefaultTvmManager(NTvmTool::TClientSettings settings, TVector allowedClients, TLoggerPtr logger) { return MakeHolder>(std::move(settings), std::move(allowedClients), std::move(logger)); } THolder CreateDefaultTvmManager(TAtomicSharedPtr client, TVector allowedClients) { return MakeHolder>>(std::move(client), std::move(allowedClients)); } THolder CreateDefaultTvmManager(std::shared_ptr client, TVector allowedClients) { return MakeHolder>>(std::move(client), std::move(allowedClients)); } THolder CreateTvmAuth(THolder manager) { return MakeHolder(std::move(manager)); } } // namespace NMonitoring