diff --git a/src/aws/flb_aws_util.c b/src/aws/flb_aws_util.c
index dead873e39b..c53a151f910 100644
--- a/src/aws/flb_aws_util.c
+++ b/src/aws/flb_aws_util.c
@@ -346,16 +346,16 @@ int flb_aws_is_auth_error(char *payload, size_t payload_size)
return FLB_FALSE;
}
- /* Fluent Bit calls the STS API which returns XML */
- if (strcasestr(payload, "InvalidClientTokenId") != NULL) {
- return FLB_TRUE;
- }
-
- if (strcasestr(payload, "AccessDenied") != NULL) {
- return FLB_TRUE;
- }
-
- if (strcasestr(payload, "Expired") != NULL) {
+ /* STS, S3, and other AWS APIs return XML error responses */
+ if (strcasestr(payload, "InvalidClientTokenId") != NULL ||
+ strcasestr(payload, "AccessDenied") != NULL ||
+ strcasestr(payload, "Expired") != NULL ||
+ strcasestr(payload, "InvalidAccessKeyId") != NULL ||
+ strcasestr(payload, "SignatureDoesNotMatch") != NULL ||
+ strcasestr(payload, "InvalidToken") != NULL ||
+ strcasestr(payload, "InvalidSecurity") != NULL ||
+ strcasestr(payload, "TokenRefreshRequired") != NULL ||
+ strcasestr(payload, "InvalidSignature") != NULL) {
return FLB_TRUE;
}
@@ -372,6 +372,9 @@ int flb_aws_is_auth_error(char *payload, size_t payload_size)
strcmp(error, "InvalidClientTokenId") == 0 ||
strcmp(error, "InvalidToken") == 0 ||
strcmp(error, "InvalidAccessKeyId") == 0 ||
+ strcmp(error, "InvalidSecurity") == 0 ||
+ strcmp(error, "TokenRefreshRequired") == 0 ||
+ strcmp(error, "InvalidSignature") == 0 ||
strcmp(error, "UnrecognizedClientException") == 0) {
flb_sds_destroy(error);
return FLB_TRUE;
diff --git a/tests/internal/aws_util.c b/tests/internal/aws_util.c
index b59264cd114..dae4f298401 100644
--- a/tests/internal/aws_util.c
+++ b/tests/internal/aws_util.c
@@ -144,6 +144,36 @@ static void test_flb_aws_error()
flb_sds_destroy(error_type);
}
+static void test_flb_aws_is_auth_error()
+{
+ char *payload;
+
+ initialization_crutch();
+
+ payload = "InvalidAccessKeyIdThe AWS Access Key Id you provided does not exist in our records."
+ "AKIATRANDOMKEY12345678"
+ "XZ4Y38XBV54B7GKT"
+ "PEH4YGxFyd7aiREqx47Xj1SEztmklUp/9rzwrLz4A1LIWp8jQRhybogym3KhlfpCC4JD4FaRYxU=";
+ TEST_CHECK(flb_aws_is_auth_error(payload, strlen(payload)) == FLB_TRUE);
+
+ payload = ""
+ "NoSuchKey"
+ "The resource you requested does not exist"
+ "/mybucket/myfoto.jpg"
+ "4442587FB7D0A2F9"
+ "";
+ TEST_CHECK(flb_aws_is_auth_error(payload, strlen(payload)) == FLB_FALSE);
+
+ payload = "{\"__type\":\"ExpiredToken\",\"message\":\"The security token included in the request is expired.\"}";
+ TEST_CHECK(flb_aws_is_auth_error(payload, strlen(payload)) == FLB_TRUE);
+
+ payload = "{\"__type\":\"ValidationError\",\"message\":\"Input validation failed.\"}";
+ TEST_CHECK(flb_aws_is_auth_error(payload, strlen(payload)) == FLB_FALSE);
+
+ payload = "";
+ TEST_CHECK(flb_aws_is_auth_error(payload, strlen(payload)) == FLB_FALSE);
+}
+
static void test_flb_aws_endpoint()
{
char *endpoint;
@@ -418,6 +448,7 @@ static void test_flb_get_s3_key_mixed_timestamp()
TEST_LIST = {
{ "parse_api_error" , test_flb_aws_error},
+ { "flb_aws_is_auth_error", test_flb_aws_is_auth_error},
{ "flb_aws_endpoint" , test_flb_aws_endpoint},
{"flb_get_s3_key_multi_tag_exists", test_flb_get_s3_key_multi_tag_exists},
{"flb_get_s3_key_full_tag", test_flb_get_s3_key_full_tag},