174def main():
175 if len(sys.argv) != 2:
176 fail("usage: test_qt_aad_auth_helper.py <path-to-freerdp-qt-aad-helper>")
177 helper_path = sys.argv[1]
178 if not os.path.isfile(helper_path):
179 fail(f"helper binary not found: {helper_path}")
180
181 server = http.server.HTTPServer(("127.0.0.1", 0), RedirectHandler)
182 server.last_user_agent = None
183 port = server.server_port
184 server_thread = threading.Thread(target=server.serve_forever, daemon=True)
185 server_thread.start()
186
187 env = dict(os.environ)
188 env["QT_QPA_PLATFORM"] = "offscreen"
189 env["QT_QUICK_BACKEND"] = "software"
190 env["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu --disable-software-rasterizer"
191
192 helper = HelperProcess(helper_path, env)
193 try:
194 try:
195 hello = helper.request(
196 "hello", {"protocol_version": 1, "client": "freerdp"}, timeout=HELLO_TIMEOUT
197 )
198 except TimeoutError:
199 skip("helper did not answer 'hello' - environment likely can't run Qt WebEngine")
200 if "error" in hello:
201 fail(f"hello returned an error: {hello['error']}")
202 print(f"hello ok: {hello['result']}")
203
204
205
206
207 nav = helper.request(
208 "navigate",
209 {
210 "title": "test",
211 "url": f"http://127.0.0.1:{port}/redirect",
212 "redirect_uri": "ms-appx-web://microsoft.aad.brokerplugin/test-client-id",
213 "timeout_ms": REQUEST_TIMEOUT * 1000,
214 },
215 )
216 if "error" in nav:
217 fail(f"navigate (broker redirect) failed: {nav['error']}")
218 got = nav["result"].get("redirect_url")
219 if got != BROKER_TARGET:
220 fail(f"navigate (broker redirect): expected {BROKER_TARGET!r}, got {got!r}")
221 print("broker redirect ok")
222
223
224 plain_url = f"http://127.0.0.1:{port}/"
225 nav2 = helper.request(
226 "navigate",
227 {
228 "title": "test",
229 "url": plain_url,
230 "redirect_uri": plain_url,
231 "timeout_ms": REQUEST_TIMEOUT * 1000,
232 },
233 )
234 if "error" in nav2:
235 fail(f"navigate (plain redirect_uri) failed: {nav2['error']}")
236 got2 = nav2["result"].get("redirect_url")
237 if got2 != plain_url:
238 fail(f"navigate (plain redirect_uri): expected {plain_url!r}, got {got2!r}")
239 print("plain redirect_uri ok")
240
241
242
243 default_nav = helper.request(
244 "navigate",
245 {
246 "title": "test",
247 "url": f"http://127.0.0.1:{port}/redirect",
248 "redirect_uri": "ms-appx-web://microsoft.aad.brokerplugin/test-client-id",
249 "timeout_ms": REQUEST_TIMEOUT * 1000,
250 },
251 )
252 if "error" in default_nav:
253 fail(f"navigate (default UA) failed: {default_nav['error']}")
254 default_ua = server.last_user_agent
255 if not default_ua:
256 fail("server saw no User-Agent for the default case")
257 if "TestAgent/1.0" in default_ua:
258 fail(f"default UA unexpectedly equals the override: {default_ua!r}")
259 print(f"default UA ok: {default_ua}")
260
261
262 override_ua = "TestAgent/1.0"
263 ua_nav = helper.request(
264 "navigate",
265 {
266 "title": "test",
267 "url": f"http://127.0.0.1:{port}/redirect",
268 "redirect_uri": "ms-appx-web://microsoft.aad.brokerplugin/test-client-id",
269 "user_agent": override_ua,
270 "timeout_ms": REQUEST_TIMEOUT * 1000,
271 },
272 )
273 if "error" in ua_nav:
274 fail(f"navigate (override UA) failed: {ua_nav['error']}")
275 if server.last_user_agent != override_ua:
276 fail(f"expected UA {override_ua!r}, server saw {server.last_user_agent!r}")
277 print("override UA ok")
278
279
280
281 empty_nav = helper.request(
282 "navigate",
283 {
284 "title": "test",
285 "url": f"http://127.0.0.1:{port}/redirect",
286 "redirect_uri": "ms-appx-web://microsoft.aad.brokerplugin/test-client-id",
287 "user_agent": "",
288 "timeout_ms": REQUEST_TIMEOUT * 1000,
289 },
290 )
291 if "error" in empty_nav:
292 fail(f"navigate (empty UA) failed: {empty_nav['error']}")
293 if server.last_user_agent != default_ua:
294 fail(
295 f"expected native UA after empty override {default_ua!r}, "
296 f"saw {server.last_user_agent!r}"
297 )
298 print("empty UA restore ok")
299
300
301
302 reoverride_nav = helper.request(
303 "navigate",
304 {
305 "title": "test",
306 "url": f"http://127.0.0.1:{port}/redirect",
307 "redirect_uri": "ms-appx-web://microsoft.aad.brokerplugin/test-client-id",
308 "user_agent": override_ua,
309 "timeout_ms": REQUEST_TIMEOUT * 1000,
310 },
311 )
312 if "error" in reoverride_nav:
313 fail(f"navigate (re-override UA) failed: {reoverride_nav['error']}")
314 omitted_nav = helper.request(
315 "navigate",
316 {
317 "title": "test",
318 "url": f"http://127.0.0.1:{port}/redirect",
319 "redirect_uri": "ms-appx-web://microsoft.aad.brokerplugin/test-client-id",
320 "timeout_ms": REQUEST_TIMEOUT * 1000,
321 },
322 )
323 if "error" in omitted_nav:
324 fail(f"navigate (omitted UA) failed: {omitted_nav['error']}")
325 if server.last_user_agent != default_ua:
326 fail(f"expected native UA restored {default_ua!r}, server saw {server.last_user_agent!r}")
327 print("omitted UA restore ok")
328
329 shut = helper.request("shutdown")
330 if shut.get("result") is not None:
331 fail(f"shutdown expected a null result, got {shut}")
332 helper.notify("exit")
333
334 rc = helper.wait(timeout=10)
335 if rc != 0:
336 fail(f"helper exited with code {rc}, expected 0")
337 print("shutdown/exit ok")
338 finally:
339 server.shutdown()
340 if helper.proc.poll() is None:
341 helper.proc.kill()
342
343 print("PASS")
344
345