173def main():
174 if len(sys.argv) != 2:
175 fail("usage: test_qt_aad_auth_helper.py <path-to-freerdp-qt-aad-helper>")
176 helper_path = sys.argv[1]
177 if not os.path.isfile(helper_path):
178 fail(f"helper binary not found: {helper_path}")
179
180 server = http.server.HTTPServer(("127.0.0.1", 0), RedirectHandler)
181 port = server.server_port
182 server_thread = threading.Thread(target=server.serve_forever, daemon=True)
183 server_thread.start()
184
185 env = dict(os.environ)
186 env["QT_QPA_PLATFORM"] = "offscreen"
187 env["QT_QUICK_BACKEND"] = "software"
188 env["QTWEBENGINE_CHROMIUM_FLAGS"] = "--disable-gpu --disable-software-rasterizer"
189
190 helper = HelperProcess(helper_path, env)
191 try:
192 try:
193 hello = helper.request(
194 "hello", {"protocol_version": 1, "client": "freerdp"}, timeout=HELLO_TIMEOUT
195 )
196 except TimeoutError:
197 skip("helper did not answer 'hello' - environment likely can't run Qt WebEngine")
198 if "error" in hello:
199 fail(f"hello returned an error: {hello['error']}")
200 print(f"hello ok: {hello['result']}")
201
202
203
204
205 nav = helper.request(
206 "navigate",
207 {
208 "title": "test",
209 "url": f"http://127.0.0.1:{port}/redirect",
210 "redirect_uri": "ms-appx-web://microsoft.aad.brokerplugin/test-client-id",
211 "timeout_ms": REQUEST_TIMEOUT * 1000,
212 },
213 )
214 if "error" in nav:
215 fail(f"navigate (broker redirect) failed: {nav['error']}")
216 got = nav["result"].get("redirect_url")
217 if got != BROKER_TARGET:
218 fail(f"navigate (broker redirect): expected {BROKER_TARGET!r}, got {got!r}")
219 print("broker redirect ok")
220
221
222 plain_url = f"http://127.0.0.1:{port}/"
223 nav2 = helper.request(
224 "navigate",
225 {
226 "title": "test",
227 "url": plain_url,
228 "redirect_uri": plain_url,
229 "timeout_ms": REQUEST_TIMEOUT * 1000,
230 },
231 )
232 if "error" in nav2:
233 fail(f"navigate (plain redirect_uri) failed: {nav2['error']}")
234 got2 = nav2["result"].get("redirect_url")
235 if got2 != plain_url:
236 fail(f"navigate (plain redirect_uri): expected {plain_url!r}, got {got2!r}")
237 print("plain redirect_uri ok")
238
239 shut = helper.request("shutdown")
240 if shut.get("result") is not None:
241 fail(f"shutdown expected a null result, got {shut}")
242 helper.notify("exit")
243
244 rc = helper.wait(timeout=10)
245 if rc != 0:
246 fail(f"helper exited with code {rc}, expected 0")
247 print("shutdown/exit ok")
248 finally:
249 server.shutdown()
250 if helper.proc.poll() is None:
251 helper.proc.kill()
252
253 print("PASS")
254
255