Errors and messages
Result
Section titled “Result”Every call returns or passes an eonauth::Result:
struct Result { Status status; // see below std::string message; // safe to show users long long retryAfterSeconds; // set with Status::RateLimited std::map<std::string, std::string> details; // e.g. "download_url" with UpdateRequired bool ok() const; explicit operator bool() const; // true when status == Status::Ok};eonauth::ToString(status) gives the code as text, such as "LICENSE_EXPIRED".
What to show the user
Section titled “What to show the user”if (!r) ShowStatus(eonauth::UserMessage(r), eonauth::UserHint(r));UserMessage(r)is the line to put on screen. For decisions the server made, it keeps the server’s wording, which the app owner can change under App settings → Client messages. Network, TLS and protocol failures become plain language instead ofTLS_PIN_MISMATCH.UserHint(r)is the next step, or empty: the download link forUpdateRequired, Turn on Set time automatically for a wrong clock, how long to wait afterRateLimited.
Network trouble or a real “no”?
Section titled “Network trouble or a real “no”?”if (eonauth::IsTransient(r.status)) { // NetworkError, RateLimited, ServerError: says nothing about the user. Try again later.} else if (eonauth::IsAccessDenied(r.status)) { // The server refused the user or session. Lock the app.}IsAccessDenied is true for UserBanned, UserPaused, Blacklisted, FreeModeDisabled,
UpdateRequired, LicenseInvalid, LicenseBanned, LicenseExpired, HwidMismatch,
SessionInvalid, SessionExpired and AppDisabled.
Every status
Section titled “Every status”Local and transport
Section titled “Local and transport”| Status | Meaning |
|---|---|
Ok |
Success |
NotInitialized |
Init hasn’t succeeded |
NotLoggedIn |
The call needs a signed-in session |
NetworkError |
DNS, connect or timeout, or server errors after retries. For register, key login and redeem it may mean “might have gone through” |
TlsPinMismatch |
The certificate chain didn’t match a pinned key: possibly intercepted |
ClockSkew |
The PC’s clock is too far off and couldn’t be corrected |
ProtocolError |
The server refused the envelope, or a response failed its signature or decryption. Also what a retired key set gets |
RateLimited |
Too many requests; see retryAfterSeconds |
ServerError |
The server failed |
From the server
Section titled “From the server”| Status | Meaning |
|---|---|
InvalidRequest |
Bad input (the SDK checks most of it before sending) |
InvalidCredentials |
Wrong username or password |
UsernameTaken |
Another account in the app has that name |
UsernameRequired |
First sign-in with this key: ask for a username and call again |
UsernameTooShort |
Shorter than the app’s minimum |
PasswordLeaked |
The password is in a public breach, and the app blocks those |
UserBanned |
The account is banned |
UserPaused |
The seller paused the subscription |
Blacklisted |
This PC or IP address is blacklisted |
FreeModeDisabled |
LoginFree, but the app doesn’t offer free access |
AccountRequired |
A free mode session tried an account feature |
UpdateRequired |
The app version is below the minimum; see details["download_url"] |
LicenseInvalid |
No such key |
LicenseInUse |
The key belongs to another account |
LicenseBanned |
The key was revoked |
LicenseExpired |
The key’s or account’s time ran out |
LicenseTypeNotAllowed |
For example a one-time key used to create an account or redeemed into one |
HwidMismatch |
The account is locked to another PC |
SessionInvalid |
The session is unknown or was ended |
SessionExpired |
The session timed out |
VariableNotFound |
Unknown variable ID, or locked to tiers the user doesn’t have |
FileNotFound |
Unknown file ID, or locked to tiers the user doesn’t have |
QuotaExceeded |
For example too many per-user variables |
AppDisabled |
The app is disabled or its account is suspended |
TurnstileFailed |
The app requires Turnstile and the token was missing or wrong |
The server-side codes are also listed, with HTTP statuses, in Error codes.