fix(scrapers): bad credentials detection and error message cleanup (#367)

## Problem

Wrong credentials produced garbled error messages (`"login failed: Login
failed: bad_credentials"`) and stale credentials remained cached after
failure, causing silent re-use on the next invocation.

## Solution

Standardize all scrapers to emit `"bad_credentials"` as a plain error
code, mapped to a human-readable string via `LOGIN_ERRORS` in
`constants.lua`. Fix `credentials.lua` to clear cached credentials on
failure in both the fresh-prompt and re-prompt paths. For AtCoder and
Codeforces, replace `wait_for_url` with `wait_for_function` to detect
the login error element immediately rather than sitting the full 10s
navigation timeout. Add "Remember me" checkbox on Codeforces login.
This commit is contained in:
Barrett Ruth 2026-03-07 17:58:25 -05:00 committed by GitHub
parent 573b335646
commit 771dbc7753
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 67 additions and 40 deletions

View file

@ -439,7 +439,7 @@ class USACOScraper(BaseScraper):
except Exception as e:
return self._submit_error(f"Login failed: {e}")
if not ok:
return self._submit_error("Login failed (bad credentials?)")
return self._submit_error("bad_credentials")
await _save_usaco_cookies(client)
else:
print(json.dumps({"status": "logging_in"}), flush=True)
@ -448,7 +448,7 @@ class USACOScraper(BaseScraper):
except Exception as e:
return self._submit_error(f"Login failed: {e}")
if not ok:
return self._submit_error("Login failed (bad credentials?)")
return self._submit_error("bad_credentials")
await _save_usaco_cookies(client)
result = await self._do_submit(client, problem_id, language_id, source)
@ -463,7 +463,7 @@ class USACOScraper(BaseScraper):
except Exception as e:
return self._submit_error(f"Login failed: {e}")
if not ok:
return self._submit_error("Login failed (bad credentials?)")
return self._submit_error("bad_credentials")
await _save_usaco_cookies(client)
return await self._do_submit(client, problem_id, language_id, source)
@ -543,7 +543,7 @@ class USACOScraper(BaseScraper):
return self._login_error(f"Login request failed: {e}")
if not ok:
return self._login_error("Login failed (bad credentials?)")
return self._login_error("bad_credentials")
await _save_usaco_cookies(client)
return LoginResult(