Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
Configuration.cpp
1/*
2 * Copyright(c) Sophist Solutions, Inc. 1990-2025. 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 }
56 sb << "}"sv;
57 return sb;
58}
59
61{
62 static const String kSUFFIX_ = "/.well-known/openid-configuration"sv;
63 URI configURI = ValueOfOrThrow (openid_configuration_uri, RuntimeErrorException{"no openid_configuration_uri"sv});
64 if (not configURI.GetAbsPath<optional<String>> ().value_or (String{}).EndsWith (kSUFFIX_)) {
65 configURI = configURI.Combine (URI{nullopt, nullopt, kSUFFIX_});
66 }
67 auto connection = IO::Network::Transfer::Connection::New ();
68 try {
69 IO::Network::Transfer::Response r = connection.GET (configURI);
70 // empirical - not sure where documented/defined
71 struct openid_configuration_ {
72 optional<URI> issuer;
73 optional<URI> authorization_endpoint;
74 optional<URI> device_authorization_endpoint;
75 optional<URI> token_endpoint;
76 optional<URI> userinfo_endpoint;
77 optional<URI> revocation_endpoint;
78 // ..more ignored for now
79 optional<URI> jwks_uri;
80 };
82 mapper.AddCommonType<URI> ();
83 mapper.AddCommonType<optional<URI>> ();
84 mapper.AddClass<openid_configuration_> ({
85 {"issuer", &openid_configuration_::issuer},
86 {"authorization_endpoint", &openid_configuration_::authorization_endpoint},
87 {"device_authorization_endpoint", &openid_configuration_::device_authorization_endpoint},
88 {"token_endpoint", &openid_configuration_::token_endpoint},
89 {"userinfo_endpoint", &openid_configuration_::userinfo_endpoint},
90 {"revocation_endpoint", &openid_configuration_::revocation_endpoint},
91 {"jwks_uri", &openid_configuration_::jwks_uri},
92 });
93 openid_configuration_ cfgRead = mapper.ToObject<openid_configuration_> (DataExchange::Variant::JSON::Reader{}.Read (r.GetData ()));
94 ProviderConfiguration result = *this;
95 if (cfgRead.authorization_endpoint) {
96 result.auth_uri = *cfgRead.authorization_endpoint;
97 }
98 if (cfgRead.token_endpoint) {
99 result.token_uri = *cfgRead.token_endpoint;
100 }
101 if (cfgRead.userinfo_endpoint) {
102 result.userinfo_endpoint = *cfgRead.userinfo_endpoint;
103 }
104 if (cfgRead.revocation_endpoint) {
105 result.revocation_endpoint = *cfgRead.revocation_endpoint;
106 }
107 if (cfgRead.jwks_uri) {
108 result.auth_provider_x509_cert_url = *cfgRead.jwks_uri;
109 }
110 return result;
111 }
112 catch (...) {
113 DbgTrace ("Fetcher::FetchAdditionsFromOpenIDConfigurationURI: exception={}"_f, current_exception ());
115 }
116}
117
118/*
119 ********************************************************************************
120 ************************ Auth::OAuth::ClientConfiguration **********************
121 ********************************************************************************
122 */
123String ClientConfiguration::ToString () const
124{
125 StringBuilder sb;
126 sb << "{"sv;
127 sb << "provider: " << fProvider;
128 sb << ", applicationID: " << fApplicationID;
129 sb << ", redirectURLs: " << fRedirectURLs;
130 sb << ", scopes: " << fScopes;
131 sb << ", clientSecret: " << fClientSecret;
132 sb << "}"sv;
133 return sb;
134}
135
136auto ClientConfiguration::operator<=> (const ClientConfiguration& rhs) const
137{
138#if qCompilerAndStdLib_tie_trick_spaceship_impl_Buggy
139 if (auto o = fProvider <=> rhs.fProvider; o != strong_ordering::equal) {
140 return o;
141 }
142 if (auto o = fApplicationID <=> rhs.fApplicationID; o != strong_ordering::equal) {
143 return o;
144 }
145 if (auto o = fRedirectURLs <=> rhs.fRedirectURLs; o != strong_ordering::equal) {
146 return o;
147 }
148 if (auto o = Common::StdCompat::compare_three_way{}(fClientSecret, rhs.fClientSecret); o != strong_ordering::equal) {
149 return o;
150 }
152#else
153 strong_ordering tmp = tie (fProvider, fApplicationID, fRedirectURLs, fClientSecret) <=>
154 std::tie (rhs.fProvider, rhs.fApplicationID, rhs.fRedirectURLs, rhs.fClientSecret);
155 if (tmp == strong_ordering::equal) {
157 }
158 return tmp;
159#endif
160}
#define DbgTrace
Definition Trace.h:309
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