(request: Request, error: str = "", error_description: str = "")
| 310 | |
| 311 | @router.get("/v1/callback", tags="openui/oauth") |
| 312 | async def callback(request: Request, error: str = "", error_description: str = ""): |
| 313 | try: |
| 314 | # if we've been given an error |
| 315 | if error != "": |
| 316 | logger.error("Oauth Error (%s): %s", error, error_description) |
| 317 | message = "An error occurred when attempting to login with GitHub, please try again." |
| 318 | if error == "bad_verification_code": |
| 319 | message = "The code passed is incorrect or expired." |
| 320 | elif error == "unverified_user_email": |
| 321 | message = "You must verify your email address with GitHub to login." |
| 322 | elif error == "redirect_uri_mismatch": |
| 323 | message = "GitHub is not configured with the appropriate redirect url." |
| 324 | elif error == "incorrect_client_credentials": |
| 325 | message = "The application is not configured to login with GitHub, invalid client credentials" |
| 326 | elif error == "application_suspended": |
| 327 | message = "This application has been suspended by GitHub and can't accept new logins." |
| 328 | elif error == "access_denied": |
| 329 | message = "You've denied us access to verify your email with GitHub." |
| 330 | raise ValueError(message) |
| 331 | with github_sso: |
| 332 | id_token = await github_sso.verify_and_process(request) |
| 333 | # TODO: should probably key off email / update info |
| 334 | user = User.get_or_none(User.username == id_token.display_name) |
| 335 | if user is None: |
| 336 | user_id = uuid.uuid4() |
| 337 | user = User.create( |
| 338 | id=user_id.bytes, |
| 339 | username=id_token.display_name, |
| 340 | email=id_token.email, |
| 341 | created_at=datetime.now(), |
| 342 | ) |
| 343 | user.id = user_id |
| 344 | elif not user.email: |
| 345 | user.email = id_token.email |
| 346 | user.save() |
| 347 | request.session["session_id"] = session_store.generate_session_id() |
| 348 | request.session["user_id"] = str(user.id) |
| 349 | session_store.write( |
| 350 | request.session["session_id"], |
| 351 | str(user.id), |
| 352 | SessionData(username=user.username, token_count=0), |
| 353 | ) |
| 354 | return RedirectResponse(url="/ai/new") |
| 355 | except Exception as e: |
| 356 | response = RedirectResponse(url="/ai/new") |
| 357 | response.set_cookie("error", str(e)) |
| 358 | return response |
| 359 | |
| 360 | |
| 361 | @router.post( |
no test coverage detected