From 4c3b959bf64620f6c3c0b5f6152d8dace0f23abb Mon Sep 17 00:00:00 2001 From: abraunegg Date: Tue, 12 Mar 2019 11:50:21 +1100 Subject: [PATCH] Resolve unhandled application crash when invalid auth response is used (Issue #399) (#410) * Add a http 400 response error handler * If the response uri generates a 400 error, the JSON response will not contain the access_token. Request to re-authenticate --- src/onedrive.d | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/onedrive.d b/src/onedrive.d index 0dcc4650..847be0ec 100644 --- a/src/onedrive.d +++ b/src/onedrive.d @@ -384,13 +384,19 @@ final class OneDriveApi private void acquireToken(const(char)[] postData) { JSONValue response = post(tokenUrl, postData); - accessToken = "bearer " ~ response["access_token"].str(); - refreshToken = response["refresh_token"].str(); - accessTokenExpiration = Clock.currTime() + dur!"seconds"(response["expires_in"].integer()); - if (!.dryRun) { - std.file.write(cfg.refreshTokenFilePath, refreshToken); + if ("access_token" in response){ + accessToken = "bearer " ~ response["access_token"].str(); + refreshToken = response["refresh_token"].str(); + accessTokenExpiration = Clock.currTime() + dur!"seconds"(response["expires_in"].integer()); + if (!.dryRun) { + std.file.write(cfg.refreshTokenFilePath, refreshToken); + } + if (printAccessToken) writeln("New access token: ", accessToken); + } else { + log.error("\nInvalid authentication response from OneDrive. Please check the response uri\n"); + // re-authorize + authorize(); } - if (printAccessToken) writeln("New access token: ", accessToken); } private void checkAccessTokenExpired() @@ -720,6 +726,12 @@ final class OneDriveApi { switch(http.statusLine.code) { + // 400 - Bad Request + case 400: + // Bad Request .. how should we act? + log.vlog("OneDrive returned a 'HTTP 400 - Bad Request' - gracefully handling error"); + break; + // 412 - Precondition Failed case 412: log.vlog("OneDrive returned a 'HTTP 412 - Precondition Failed' - gracefully handling error");