25#include <winpr/string.h>
26#include <freerdp/log.h>
27#include <freerdp/utils/aad.h>
29#include "sdl_webview.hpp"
30#include "webview_impl.hpp"
32#define TAG CLIENT_TAG("SDL.webview")
34static std::string from_settings(
const rdpSettings* settings, FreeRDP_Settings_Keys_String
id)
45static std::string from_aad_wellknown(rdpContext* context, AAD_WELLKNOWN_VALUES which)
47 auto val = freerdp_utils_aad_get_wellknown_string(context, which);
51 WLog_WARN(TAG,
"[wellknown] key %s is nullptr",
52 freerdp_utils_aad_wellknwon_value_name(which));
58static BOOL sdl_webview_get_rdsaad_access_token(freerdp* instance,
const char* scope,
59 const char* req_cnf,
char** token)
61 WINPR_ASSERT(instance);
63 WINPR_ASSERT(req_cnf);
66 WINPR_UNUSED(instance);
68 auto context = instance->context;
69 WINPR_UNUSED(context);
71 auto settings = context->settings;
72 WINPR_ASSERT(settings);
74 std::shared_ptr<char> request(freerdp_client_get_aad_url((rdpClientContext*)instance->context,
75 FREERDP_CLIENT_AAD_AUTH_REQUEST,
78 const std::string title =
"FreeRDP WebView - AAD access token";
80 auto rc = webview_impl_run(title, request.get(), code);
81 if (!rc || code.empty())
84 std::shared_ptr<char> token_request(
85 freerdp_client_get_aad_url((rdpClientContext*)instance->context,
86 FREERDP_CLIENT_AAD_TOKEN_REQUEST, scope, code.c_str(), req_cnf),
88 return client_common_get_access_token(instance, token_request.get(), token);
91static BOOL sdl_webview_get_avd_access_token(freerdp* instance,
char** token)
94 WINPR_ASSERT(instance);
95 WINPR_ASSERT(instance->context);
97 std::shared_ptr<char> request(freerdp_client_get_aad_url((rdpClientContext*)instance->context,
98 FREERDP_CLIENT_AAD_AVD_AUTH_REQUEST),
101 const std::string title =
"FreeRDP WebView - AVD access token";
103 auto rc = webview_impl_run(title, request.get(), code);
104 if (!rc || code.empty())
107 std::shared_ptr<char> token_request(
108 freerdp_client_get_aad_url((rdpClientContext*)instance->context,
109 FREERDP_CLIENT_AAD_AVD_TOKEN_REQUEST, code.c_str()),
111 return client_common_get_access_token(instance, token_request.get(), token);
114BOOL sdl_webview_get_access_token(freerdp* instance, AccessTokenType tokenType,
char** token,
117 WINPR_ASSERT(instance);
121 case ACCESS_TOKEN_TYPE_AAD:
126 "ACCESS_TOKEN_TYPE_AAD expected 2 additional arguments, but got %" PRIuz
133 "ACCESS_TOKEN_TYPE_AAD expected 2 additional arguments, but got %" PRIuz
138 const char* scope = va_arg(ap,
const char*);
139 const char* req_cnf = va_arg(ap,
const char*);
140 const BOOL rc = sdl_webview_get_rdsaad_access_token(instance, scope, req_cnf, token);
144 case ACCESS_TOKEN_TYPE_AVD:
147 "ACCESS_TOKEN_TYPE_AVD expected 0 additional arguments, but got %" PRIuz
150 return sdl_webview_get_avd_access_token(instance, token);
152 WLog_ERR(TAG,
"Unexpected value for AccessTokenType [%" PRIuz
"], aborting", tokenType);
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.
WINPR_ATTR_NODISCARD FREERDP_API const char * freerdp_settings_get_name_for_key(SSIZE_T key)
Returns the type name for a key.