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 NULL", freerdp_utils_aad_wellknwon_value_name(which));
57static BOOL sdl_webview_get_rdsaad_access_token(freerdp* instance,
const char* scope,
58 const char* req_cnf,
char** token)
60 WINPR_ASSERT(instance);
62 WINPR_ASSERT(req_cnf);
65 WINPR_UNUSED(instance);
67 auto context = instance->context;
68 WINPR_UNUSED(context);
70 auto settings = context->settings;
71 WINPR_ASSERT(settings);
73 std::shared_ptr<char> request(freerdp_client_get_aad_url((rdpClientContext*)instance->context,
74 FREERDP_CLIENT_AAD_AUTH_REQUEST,
77 const std::string title =
"FreeRDP WebView - AAD access token";
79 auto rc = webview_impl_run(title, request.get(), code);
80 if (!rc || code.empty())
83 std::shared_ptr<char> token_request(
84 freerdp_client_get_aad_url((rdpClientContext*)instance->context,
85 FREERDP_CLIENT_AAD_TOKEN_REQUEST, scope, code.c_str(), req_cnf),
87 return client_common_get_access_token(instance, token_request.get(), token);
90static BOOL sdl_webview_get_avd_access_token(freerdp* instance,
char** token)
93 WINPR_ASSERT(instance);
94 WINPR_ASSERT(instance->context);
96 std::shared_ptr<char> request(freerdp_client_get_aad_url((rdpClientContext*)instance->context,
97 FREERDP_CLIENT_AAD_AVD_AUTH_REQUEST),
100 const std::string title =
"FreeRDP WebView - AVD access token";
102 auto rc = webview_impl_run(title, request.get(), code);
103 if (!rc || code.empty())
106 std::shared_ptr<char> token_request(
107 freerdp_client_get_aad_url((rdpClientContext*)instance->context,
108 FREERDP_CLIENT_AAD_AVD_TOKEN_REQUEST, code.c_str()),
110 return client_common_get_access_token(instance, token_request.get(), token);
113BOOL sdl_webview_get_access_token(freerdp* instance, AccessTokenType tokenType,
char** token,
116 WINPR_ASSERT(instance);
120 case ACCESS_TOKEN_TYPE_AAD:
125 "ACCESS_TOKEN_TYPE_AAD expected 2 additional arguments, but got %" PRIuz
132 "ACCESS_TOKEN_TYPE_AAD expected 2 additional arguments, but got %" PRIuz
137 const char* scope = va_arg(ap,
const char*);
138 const char* req_cnf = va_arg(ap,
const char*);
139 const BOOL rc = sdl_webview_get_rdsaad_access_token(instance, scope, req_cnf, token);
143 case ACCESS_TOKEN_TYPE_AVD:
146 "ACCESS_TOKEN_TYPE_AVD expected 0 additional arguments, but got %" PRIuz
149 return sdl_webview_get_avd_access_token(instance, token);
151 WLog_ERR(TAG,
"Unexpected value for AccessTokenType [%" PRIuz
"], aborting", tokenType);
FREERDP_API const char * freerdp_settings_get_name_for_key(SSIZE_T key)
Returns the type name for a key.
FREERDP_API const char * freerdp_settings_get_string(const rdpSettings *settings, FreeRDP_Settings_Keys_String id)
Returns a immutable string settings value.