Sourcemeta Core 0.0.0
Loading...
Searching...
No Matches
oauth_metadata_provider.h
1#ifndef SOURCEMETA_CORE_OAUTH_METADATA_PROVIDER_H_
2#define SOURCEMETA_CORE_OAUTH_METADATA_PROVIDER_H_
3
4#ifndef SOURCEMETA_CORE_OAUTH_EXPORT
5#include <sourcemeta/core/oauth_export.h>
6#endif
7
8#include <sourcemeta/core/oauth_metadata.h>
9
10#include <chrono> // std::chrono::seconds, std::chrono::system_clock
11#include <functional> // std::function
12#include <memory> // std::shared_ptr
13#include <mutex> // std::mutex
14#include <optional> // std::optional
15#include <string> // std::string
16#include <string_view> // std::string_view
17
18namespace sourcemeta::core {
19
20#if defined(_MSC_VER)
21#pragma warning(disable : 4251)
22#endif
23
53class SOURCEMETA_CORE_OAUTH_EXPORT OAuthMetadataProvider {
54public:
59 struct FetchResult {
61 std::string body;
63 std::optional<std::chrono::seconds> max_age;
64 };
65
75 using Fetcher =
76 std::function<std::optional<FetchResult>(std::string_view url)>;
77
81 using Clock = std::function<std::chrono::system_clock::time_point()>;
82
86 struct Options {
88 std::chrono::seconds fallback_ttl{std::chrono::hours{1}};
90 std::chrono::seconds minimum_ttl{std::chrono::minutes{5}};
92 std::chrono::seconds maximum_ttl{std::chrono::hours{24}};
93 };
94
97 OAuthMetadataProvider(std::string issuer, const OAuthWellKnownKind kind,
98 Fetcher fetcher);
100 OAuthMetadataProvider(std::string issuer, const OAuthWellKnownKind kind,
101 Fetcher fetcher, Options options);
103 OAuthMetadataProvider(std::string issuer, const OAuthWellKnownKind kind,
104 Fetcher fetcher, Options options, Clock clock);
105
109 auto operator=(const OAuthMetadataProvider &)
110 -> OAuthMetadataProvider & = delete;
112 auto operator=(OAuthMetadataProvider &&) -> OAuthMetadataProvider & = delete;
113
119 [[nodiscard]] auto metadata() -> std::shared_ptr<const OAuthServerMetadata>;
120
124 [[nodiscard]] auto refresh() -> std::shared_ptr<const OAuthServerMetadata>;
125
126private:
127 auto install_locked(const OAuthWellKnownKind kind,
128 const std::chrono::system_clock::time_point now) -> bool;
129 auto fetch_and_install_locked(const std::chrono::system_clock::time_point now)
130 -> bool;
131
132 const std::string issuer_;
133 const OAuthWellKnownKind kind_;
134 const Fetcher fetcher_;
135 const Options options_;
136 const Clock clock_;
137 std::mutex mutex_;
138 std::shared_ptr<const OAuthServerMetadata> metadata_;
139 std::chrono::system_clock::time_point next_refresh_{};
140};
141
167class SOURCEMETA_CORE_OAUTH_EXPORT OAuthResourceMetadataProvider {
168public:
172
176
180
184
187 OAuthResourceMetadataProvider(std::string resource, Fetcher fetcher);
189 OAuthResourceMetadataProvider(std::string resource, Fetcher fetcher,
190 Options options);
192 OAuthResourceMetadataProvider(std::string resource, Fetcher fetcher,
193 Options options, Clock clock);
194
198 auto operator=(const OAuthResourceMetadataProvider &)
199 -> OAuthResourceMetadataProvider & = delete;
201 auto operator=(OAuthResourceMetadataProvider &&)
202 -> OAuthResourceMetadataProvider & = delete;
203
209 [[nodiscard]] auto metadata() -> std::shared_ptr<const OAuthResourceMetadata>;
210
214 [[nodiscard]] auto refresh() -> std::shared_ptr<const OAuthResourceMetadata>;
215
216private:
217 auto fetch_and_install_locked(const std::chrono::system_clock::time_point now)
218 -> bool;
219
220 const std::string resource_;
221 const Fetcher fetcher_;
222 const Options options_;
223 const Clock clock_;
224 std::mutex mutex_;
225 std::shared_ptr<const OAuthResourceMetadata> metadata_;
226 std::chrono::system_clock::time_point next_refresh_{};
227};
228
229#if defined(_MSC_VER)
230#pragma warning(default : 4251)
231#endif
232
233} // namespace sourcemeta::core
234
235#endif
OAuthMetadataProvider::FetchResult FetchResult
Definition oauth_metadata_provider.h:171
auto metadata() -> std::shared_ptr< const OAuthResourceMetadata >
std::function< std::chrono::system_clock::time_point()> Clock
Definition oauth_metadata_provider.h:81
OAuthMetadataProvider::Clock Clock
Definition oauth_metadata_provider.h:179
OAuthMetadataProvider(std::string issuer, const OAuthWellKnownKind kind, Fetcher fetcher, Options options, Clock clock)
Construct a provider overriding the policy and the clock.
OAuthMetadataProvider::Fetcher Fetcher
Definition oauth_metadata_provider.h:175
OAuthMetadataProvider(std::string issuer, const OAuthWellKnownKind kind, Fetcher fetcher)
OAuthResourceMetadataProvider(std::string resource, Fetcher fetcher)
OAuthResourceMetadataProvider(std::string resource, Fetcher fetcher, Options options)
Construct a provider overriding the caching policy.
auto refresh() -> std::shared_ptr< const OAuthServerMetadata >
OAuthResourceMetadataProvider(const OAuthResourceMetadataProvider &)=delete
OAuthMetadataProvider(std::string issuer, const OAuthWellKnownKind kind, Fetcher fetcher, Options options)
Construct a provider overriding the caching policy.
std::function< std::optional< FetchResult >(std::string_view url)> Fetcher
Definition oauth_metadata_provider.h:75
OAuthMetadataProvider::Options Options
Definition oauth_metadata_provider.h:183
OAuthResourceMetadataProvider(std::string resource, Fetcher fetcher, Options options, Clock clock)
Construct a provider overriding the policy and the clock.
auto metadata() -> std::shared_ptr< const OAuthServerMetadata >
OAuthMetadataProvider(const OAuthMetadataProvider &)=delete
auto refresh() -> std::shared_ptr< const OAuthResourceMetadata >
OAuthWellKnownKind
Definition oauth_metadata.h:21
Definition oauth_metadata_provider.h:59
std::string body
The raw metadata bytes.
Definition oauth_metadata_provider.h:61
std::optional< std::chrono::seconds > max_age
The advertised freshness lifetime, absent when none was given.
Definition oauth_metadata_provider.h:63
Definition oauth_metadata_provider.h:86
std::chrono::seconds minimum_ttl
The shortest lifetime honored, clamping smaller advertised values up.
Definition oauth_metadata_provider.h:90
std::chrono::seconds fallback_ttl
The lifetime to assume when the transport advertises none.
Definition oauth_metadata_provider.h:88
std::chrono::seconds maximum_ttl
The longest lifetime honored, clamping larger advertised values down.
Definition oauth_metadata_provider.h:92