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 NULL", 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 NULL", freerdp_utils_aad_wellknwon_value_name(which));
52 return "";
53 }
54 return val;
55}
56
57static BOOL sdl_webview_get_rdsaad_access_token(freerdp* instance, const char* scope,
58 const char* req_cnf, char** token)
59{
60 WINPR_ASSERT(instance);
61 WINPR_ASSERT(scope);
62 WINPR_ASSERT(req_cnf);
63 WINPR_ASSERT(token);
64
65 WINPR_UNUSED(instance);
66
67 auto context = instance->context;
68 WINPR_UNUSED(context);
69
70 auto settings = context->settings;
71 WINPR_ASSERT(settings);
72
73 std::shared_ptr<char> request(freerdp_client_get_aad_url((rdpClientContext*)instance->context,
74 FREERDP_CLIENT_AAD_AUTH_REQUEST,
75 scope),
76 free);
77 const std::string title = "FreeRDP WebView - AAD access token";
78 std::string code;
79 auto rc = webview_impl_run(title, request.get(), code);
80 if (!rc || code.empty())
81 return FALSE;
82
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),
86 free);
87 return client_common_get_access_token(instance, token_request.get(), token);
88}
89
90static BOOL sdl_webview_get_avd_access_token(freerdp* instance, char** token)
91{
92 WINPR_ASSERT(token);
93 WINPR_ASSERT(instance);
94 WINPR_ASSERT(instance->context);
95
96 std::shared_ptr<char> request(freerdp_client_get_aad_url((rdpClientContext*)instance->context,
97 FREERDP_CLIENT_AAD_AVD_AUTH_REQUEST),
98 free);
99
100 const std::string title = "FreeRDP WebView - AVD access token";
101 std::string code;
102 auto rc = webview_impl_run(title, request.get(), code);
103 if (!rc || code.empty())
104 return FALSE;
105
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()),
109 free);
110 return client_common_get_access_token(instance, token_request.get(), token);
111}
112
113BOOL sdl_webview_get_access_token(freerdp* instance, AccessTokenType tokenType, char** token,
114 size_t count, ...)
115{
116 WINPR_ASSERT(instance);
117 WINPR_ASSERT(token);
118 switch (tokenType)
119 {
120 case ACCESS_TOKEN_TYPE_AAD:
121 {
122 if (count < 2)
123 {
124 WLog_ERR(TAG,
125 "ACCESS_TOKEN_TYPE_AAD expected 2 additional arguments, but got %" PRIuz
126 ", aborting",
127 count);
128 return FALSE;
129 }
130 else if (count > 2)
131 WLog_WARN(TAG,
132 "ACCESS_TOKEN_TYPE_AAD expected 2 additional arguments, but got %" PRIuz
133 ", ignoring",
134 count);
135 va_list ap = {};
136 va_start(ap, count);
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);
140 va_end(ap);
141 return rc;
142 }
143 case ACCESS_TOKEN_TYPE_AVD:
144 if (count != 0)
145 WLog_WARN(TAG,
146 "ACCESS_TOKEN_TYPE_AVD expected 0 additional arguments, but got %" PRIuz
147 ", ignoring",
148 count);
149 return sdl_webview_get_avd_access_token(instance, token);
150 default:
151 WLog_ERR(TAG, "Unexpected value for AccessTokenType [%" PRIuz "], aborting", tokenType);
152 return FALSE;
153 }
154}
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.