FreeRDP
Loading...
Searching...
No Matches
sdl_webview.cpp
1
20#include <string>
21#include <sstream>
22#include <cstdlib>
23#include <memory>
24
25#include <winpr/string.h>
26#include <freerdp/log.h>
27#include <freerdp/utils/aad.h>
28
29#include "sdl_webview.hpp"
30#include "webview_impl.hpp"
31
32#define TAG CLIENT_TAG("SDL.webview")
33
34static std::string from_settings(const rdpSettings* settings, FreeRDP_Settings_Keys_String id)
35{
36 auto val = freerdp_settings_get_string(settings, id);
37 if (!val)
38 {
39 WLog_WARN(TAG, "Settings key %s is nullptr", freerdp_settings_get_name_for_key(id));
40 return "";
41 }
42 return val;
43}
44
45static std::string from_aad_wellknown(rdpContext* context, AAD_WELLKNOWN_VALUES which)
46{
47 auto val = freerdp_utils_aad_get_wellknown_string(context, which);
48
49 if (!val)
50 {
51 WLog_WARN(TAG, "[wellknown] key %s is nullptr",
52 freerdp_utils_aad_wellknwon_value_name(which));
53 return "";
54 }
55 return val;
56}
57
58static BOOL sdl_webview_get_rdsaad_access_token(freerdp* instance, const char* scope,
59 const char* req_cnf, char** token)
60{
61 WINPR_ASSERT(instance);
62 WINPR_ASSERT(scope);
63 WINPR_ASSERT(req_cnf);
64 WINPR_ASSERT(token);
65
66 WINPR_UNUSED(instance);
67
68 auto context = instance->context;
69 WINPR_UNUSED(context);
70
71 auto settings = context->settings;
72 WINPR_ASSERT(settings);
73
74 std::shared_ptr<char> request(freerdp_client_get_aad_url((rdpClientContext*)instance->context,
75 FREERDP_CLIENT_AAD_AUTH_REQUEST,
76 scope),
77 free);
78 const std::string title = "FreeRDP WebView - AAD access token";
79 std::string code;
80 auto rc = webview_impl_run(title, request.get(), code);
81 if (!rc || code.empty())
82 return FALSE;
83
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),
87 free);
88 return client_common_get_access_token(instance, token_request.get(), token);
89}
90
91static BOOL sdl_webview_get_avd_access_token(freerdp* instance, char** token)
92{
93 WINPR_ASSERT(token);
94 WINPR_ASSERT(instance);
95 WINPR_ASSERT(instance->context);
96
97 std::shared_ptr<char> request(freerdp_client_get_aad_url((rdpClientContext*)instance->context,
98 FREERDP_CLIENT_AAD_AVD_AUTH_REQUEST),
99 free);
100
101 const std::string title = "FreeRDP WebView - AVD access token";
102 std::string code;
103 auto rc = webview_impl_run(title, request.get(), code);
104 if (!rc || code.empty())
105 return FALSE;
106
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()),
110 free);
111 return client_common_get_access_token(instance, token_request.get(), token);
112}
113
114BOOL sdl_webview_get_access_token(freerdp* instance, AccessTokenType tokenType, char** token,
115 size_t count, ...)
116{
117 WINPR_ASSERT(instance);
118 WINPR_ASSERT(token);
119 switch (tokenType)
120 {
121 case ACCESS_TOKEN_TYPE_AAD:
122 {
123 if (count < 2)
124 {
125 WLog_ERR(TAG,
126 "ACCESS_TOKEN_TYPE_AAD expected 2 additional arguments, but got %" PRIuz
127 ", aborting",
128 count);
129 return FALSE;
130 }
131 else if (count > 2)
132 WLog_WARN(TAG,
133 "ACCESS_TOKEN_TYPE_AAD expected 2 additional arguments, but got %" PRIuz
134 ", ignoring",
135 count);
136 va_list ap = {};
137 va_start(ap, count);
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);
141 va_end(ap);
142 return rc;
143 }
144 case ACCESS_TOKEN_TYPE_AVD:
145 if (count != 0)
146 WLog_WARN(TAG,
147 "ACCESS_TOKEN_TYPE_AVD expected 0 additional arguments, but got %" PRIuz
148 ", ignoring",
149 count);
150 return sdl_webview_get_avd_access_token(instance, token);
151 default:
152 WLog_ERR(TAG, "Unexpected value for AccessTokenType [%" PRIuz "], aborting", tokenType);
153 return FALSE;
154 }
155}
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.