aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/tvmauth/client/misc/tool/roles_fetcher.cpp
blob: 05b0856edcfc45aad4dd8178cdca13d133759ef3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "roles_fetcher.h"

#include <library/cpp/tvmauth/client/misc/roles/parser.h>

#include <library/cpp/http/misc/httpcodes.h>
#include <library/cpp/string_utils/quote/quote.h>

#include <util/string/builder.h>
#include <util/string/join.h>

namespace NTvmAuth::NTvmTool {
    TRolesFetcher::TRolesFetcher(const TRolesFetcherSettings& settings, TLoggerPtr logger)
        : Settings_(settings)
        , Logger_(std::move(logger))
    {
    }

    bool TRolesFetcher::IsTimeToUpdate(TDuration sinceUpdate) const {
        return Settings_.UpdatePeriod < sinceUpdate;
    }

    bool TRolesFetcher::ShouldWarn(TDuration sinceUpdate) const {
        return Settings_.WarnPeriod < sinceUpdate;
    }

    bool TRolesFetcher::AreRolesOk() const {
        return bool(GetCurrentRoles());
    }

    NUtils::TFetchResult TRolesFetcher::FetchActualRoles(const TKeepAliveHttpClient::THeaders& authHeader,
                                                         TKeepAliveHttpClient& client) const {
        const TRequest req = CreateRequest(authHeader);

        TStringStream out;
        THttpHeaders outHeaders;

        TKeepAliveHttpClient::THttpCode code = client.DoGet(
            req.Url,
            &out,
            req.Headers,
            &outHeaders);

        return {code, std::move(outHeaders), "/v2/roles", out.Str(), {}};
    }

    void TRolesFetcher::Update(NUtils::TFetchResult&& fetchResult) {
        if (fetchResult.Code == HTTP_NOT_MODIFIED) {
            Y_ENSURE(CurrentRoles_.Get(),
                     "tvmtool did not return any roles because current roles are actual,"
                     " but there are no roles in memory - this should never happen");
            return;
        }

        Y_ENSURE(fetchResult.Code == HTTP_OK,
                 "Unexpected code from tvmtool: " << fetchResult.Code << ". " << fetchResult.Response);

        CurrentRoles_.Set(NRoles::TParser::Parse(std::make_shared<TString>(std::move(fetchResult.Response))));

        Logger_->Debug(
            TStringBuilder() << "Succeed to update roles with revision "
                             << CurrentRoles_.Get()->GetMeta().Revision);
    }

    NTvmAuth::NRoles::TRolesPtr TRolesFetcher::GetCurrentRoles() const {
        return CurrentRoles_.Get();
    }

    TRolesFetcher::TRequest TRolesFetcher::CreateRequest(const TKeepAliveHttpClient::THeaders& authHeader) const {
        TRequest request{
            .Url = "/v2/roles?self=" + CGIEscapeRet(Settings_.SelfAlias),
            .Headers = authHeader,
        };

        NRoles::TRolesPtr roles = CurrentRoles_.Get();
        if (roles) {
            request.Headers.emplace(IfNoneMatch_, Join("", "\"", roles->GetMeta().Revision, "\""));
        }

        return request;
    }
}