Stroika Library 3.0d23
 
Loading...
Searching...
No Matches
Configuration.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2026. All rights reserved
3 */
4#include "Stroika/Frameworks/StroikaPreComp.h"
5
8#include "Stroika/Foundation/Containers/SortedSet.h"
9#include "Stroika/Foundation/DataExchange/ObjectVariantMapper.h"
11#include "Stroika/Foundation/IO/Network/Transfer/Connection.h"
14
15#include "Configuration.h"
16
17using namespace Stroika::Foundation;
21using namespace Stroika::Foundation::Execution;
22using namespace Stroika::Foundation::Memory;
24
25using namespace Stroika::Frameworks;
26using namespace Stroika::Frameworks::Auth::OAuth;
27
28/*
29 ********************************************************************************
30 ************************ Auth::OAuth::ProviderConfiguration ********************
31 ********************************************************************************
32 */
33String ProviderConfiguration::ToString () const
34{
36 sb << "{"sv;
37 sb << "name: " << name;
39 sb << ", openid_configuration_uri: " << *openid_configuration_uri;
40 }
41 if (auth_uri) {
42 sb << ", auth_uri: " << *auth_uri;
43 }
44 if (token_uri) {
45 sb << ", token_uri: " << *token_uri;
46 }
48 sb << ", userinfo_endpoint: " << *userinfo_endpoint;
49 }
51 sb << ", revocation_endpoint: " << *revocation_endpoint;
52 }
54 sb << ", auth_provider_x509_cert_url: " << *auth_provider_x509_cert_url;
55 }
57 sb << ", introspection_endpoint: " << *introspection_endpoint;
58 }
60 sb << ", tokeninfo_endpoint: " << *tokeninfo_endpoint;
61 }
62 sb << "}"sv;
63 return sb;
64}
65
67{
68 static const String kSUFFIX_ = "/.well-known/openid-configuration"sv;
69 URI configURI = ValueOfOrThrow (openid_configuration_uri, RuntimeErrorException{"no openid_configuration_uri"sv});
70 if (not configURI.GetAbsPath<optional<String>> ().value_or (String{}).EndsWith (kSUFFIX_)) {
71 configURI = configURI.Combine (URI{nullopt, nullopt, kSUFFIX_});
72 }
73 auto connection = IO::Network::Transfer::Connection::New ();
74 try {
75 IO::Network::Transfer::Response r = connection.GET (configURI);
76 // empirical - not sure where documented/defined
77 struct openid_configuration_ {
78 optional<URI> issuer;
79 optional<URI> authorization_endpoint;
80 optional<URI> device_authorization_endpoint;
81 optional<URI> token_endpoint;
82 optional<URI> userinfo_endpoint;
83 optional<URI> revocation_endpoint;
84 // ..more ignored for now
85 optional<URI> jwks_uri;
86 };
88 mapper.AddCommonType<URI> ();
89 mapper.AddCommonType<optional<URI>> ();
90 mapper.AddClass<openid_configuration_> ({
91 {"issuer", &openid_configuration_::issuer},
92 {"authorization_endpoint", &openid_configuration_::authorization_endpoint},
93 {"device_authorization_endpoint", &openid_configuration_::device_authorization_endpoint},
94 {"token_endpoint", &openid_configuration_::token_endpoint},
95 {"userinfo_endpoint", &openid_configuration_::userinfo_endpoint},
96 {"revocation_endpoint", &openid_configuration_::revocation_endpoint},
97 {"jwks_uri", &openid_configuration_::jwks_uri},
98 });
99 openid_configuration_ cfgRead = mapper.ToObject<openid_configuration_> (DataExchange::Variant::JSON::Reader{}.Read (r.GetData ()));
100 ProviderConfiguration result = *this;
101 if (cfgRead.authorization_endpoint) {
102 result.auth_uri = *cfgRead.authorization_endpoint;
103 }
104 if (cfgRead.token_endpoint) {
105 result.token_uri = *cfgRead.token_endpoint;
106 }
107 if (cfgRead.userinfo_endpoint) {
108 result.userinfo_endpoint = *cfgRead.userinfo_endpoint;
109 }
110 if (cfgRead.revocation_endpoint) {
111 result.revocation_endpoint = *cfgRead.revocation_endpoint;
112 }
113 if (cfgRead.jwks_uri) {
114 result.auth_provider_x509_cert_url = *cfgRead.jwks_uri;
115 }
116 return result;
117 }
118 catch (...) {
119 DbgTrace ("Fetcher::FetchAdditionsFromOpenIDConfigurationURI: exception={}"_f, current_exception ());
121 }
122}
123
124/*
125 ********************************************************************************
126 ************************ Auth::OAuth::ClientConfiguration **********************
127 ********************************************************************************
128 */
129String ClientConfiguration::ToString () const
130{
131 StringBuilder sb;
132 sb << "{"sv;
133 sb << "provider: " << fProvider;
134 sb << ", applicationID: " << fApplicationID;
135 sb << ", redirectURLs: " << fRedirectURLs;
136 sb << ", scopes: " << fScopes;
137 sb << ", clientSecret: " << fClientSecret;
138 sb << "}"sv;
139 return sb;
140}
141
142auto ClientConfiguration::operator<=> (const ClientConfiguration& rhs) const
143{
144#if qCompilerAndStdLib_tie_trick_spaceship_impl_Buggy
145 if (auto o = fProvider <=> rhs.fProvider; o != strong_ordering::equal) {
146 return o;
147 }
148 if (auto o = fApplicationID <=> rhs.fApplicationID; o != strong_ordering::equal) {
149 return o;
150 }
151 if (auto o = fRedirectURLs <=> rhs.fRedirectURLs; o != strong_ordering::equal) {
152 return o;
153 }
154 if (auto o = Common::StdCompat::compare_three_way{}(fClientSecret, rhs.fClientSecret); o != strong_ordering::equal) {
155 return o;
156 }
158#else
159 strong_ordering tmp = tie (fProvider, fApplicationID, fRedirectURLs, fClientSecret) <=>
160 std::tie (rhs.fProvider, rhs.fApplicationID, rhs.fRedirectURLs, rhs.fClientSecret);
161 if (tmp == strong_ordering::equal) {
163 }
164 return tmp;
165#endif
166}
#define DbgTrace
Definition Trace.h:317
Similar to String, but intended to more efficiently construct a String. Mutable type (String is large...
String is like std::u32string, except it is much easier to use, often much more space efficient,...
Definition String.h:201
ObjectVariantMapper can be used to map C++ types to and from variant-union types, which can be transp...
nonvirtual void AddClass(const Traversal::Iterable< StructFieldInfo > &fieldDescriptions, const ClassMapperOptions< CLASS > &mapperOptions={})
nonvirtual void AddCommonType(ARGS &&... args)
nonvirtual T ToObject(const VariantValue &v) const
nonvirtual URI Combine(const URI &overridingURI) const
Combine overridingURI possibly relative url with this base url, to produce a new URI.
Definition URI.cpp:316
nonvirtual RETURN_VALUE GetAbsPath() const
Return the GetPath () value, but assuring its an absolute path.
Track configuration data about stuff that differentiates different OAuth providers - what URLs to use...
nonvirtual ProviderConfiguration FetchAdditionsFromOpenIDConfigurationURI() const
optional< URI > tokeninfo_endpoint
logically similar to introspection_endpoint, but googles incompatible way
optional< URI > introspection_endpoint
RFC 7662 compatible API for finding info about a token - https://datatracker.ietf....