Files
versity-versitygw/tests/test_rest_list_buckets.sh
T
dualfroz 8271bea5c1 fix: return full authorization header in unsupported authorization type error
the unsupported authorization type error only echoed the algorithm back in ArgumentValue, while s3 returns the whole Authorization header there. the parse error now carries the raw header and the s3 error mapping uses it, which also lets the bats test skipped for #1705 run again.

Fixes #2489
2026-10-07 19:37:46 +02:00

381 lines
12 KiB
Bash

#!/usr/bin/env bats
# Copyright 2024 Versity Software
# This file is licensed under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http:#www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
load ./bats-support/load
load ./bats-assert/load
source ./tests/commands/list_buckets.sh
source ./tests/drivers/create_bucket/create_bucket_rest.sh
source ./tests/drivers/list_buckets/list_buckets_rest.sh
source ./tests/drivers/user.sh
source ./tests/logger.sh
source ./tests/setup.sh
export RUN_USERS=true
# tags: openssl,malformed-message
@test "REST - empty message" {
test_file="test_file"
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/1249"
fi
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket_and_file_v2 "$bucket_name" "$test_file"
assert_success
echo -en "\r\n" > "$TEST_FILE_FOLDER/empty.txt"
run send_via_openssl_with_timeout "$TEST_FILE_FOLDER/empty.txt"
assert_success
}
# tags: malformed-message,openssl
@test "REST - deformed message" {
test_file="test_file"
echo -en "abcdefg\r\n\r\n" > "$TEST_FILE_FOLDER/deformed.txt"
run send_via_openssl_check_code_error_contains "$TEST_FILE_FOLDER/deformed.txt" 400 "BadRequest" "An error occurred when parsing the HTTP request."
assert_success
}
# tags: curl,ListBuckets,required-headers,Authorization,invalid-header
@test "REST - invalid authorization scheme" {
run list_buckets_check_authorization_scheme_error
assert_success
}
# tags: curl,ListBuckets,required-headers,Authorization,invalid-header
@test "REST - very invalid credential string" {
run send_rest_go_command_expect_error "400" "AuthorizationHeaderMalformed" "the Credential is mal-formed" "-incorrectCredential" "Credentials"
assert_success
}
# tags: curl,ListBuckets,required-headers,Authorization,invalid-header
@test "REST - nonexistent key ID" {
run send_rest_go_command_expect_error "403" "InvalidAccessKeyId" "does not exist" "-awsAccessKeyId" "dummy"
assert_success
}
# tags: curl,ListBuckets,required-headers,Authorization,x-amz-date,invalid-header
@test "REST - invalid year/month/day" {
run send_rest_go_command_expect_error "400" "AuthorizationHeaderMalformed" "incorrect date format" "-invalidYearMonthDay"
assert_success
}
# tags: curl,ListBuckets,required-headers,Authorization,x-amz-date,invalid-header
@test "REST - incorrect year/month/day" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/1514"
fi
run list_buckets_check_request_time_too_skewed_error
assert_success
}
# tags: curl,ListBuckets,required-headers,Authorization,invalid-header
@test "REST - invalid region" {
run send_rest_go_command_expect_error "400" "AuthorizationHeaderMalformed" "us-eest-1" "-awsRegion" "us-eest-1"
assert_success
}
# tags: curl,ListBuckets,required-headers,Authorization,invalid-header
@test "REST - invalid service name" {
run send_rest_go_command_expect_error "400" "AuthorizationHeaderMalformed" "incorrect service" "-serviceName" "s2"
assert_success
}
# tags: curl,ListBuckets,required-headers,Authorization,invalid-header
@test "REST - incorrect signature" {
run send_rest_go_command_expect_error "403" "SignatureDoesNotMatch" "does not match" "-incorrectSignature"
assert_success
}
# tags: openssl,ListBuckets,required-headers,host,invalid-header
@test "REST - missing host parameter" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/1530"
fi
run send_openssl_go_command "400" "-missingHostParam"
assert_success
}
# tags: curl,ListBuckets,minimal-request
@test "test_rest_list_buckets" {
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket "$bucket_name"
assert_success
run list_check_buckets_rest "$bucket_name"
assert_success
}
# tags: curl,ListBuckets,max-buckets,continuation-token
@test "REST - list buckets - continuation token isn't bucket name" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/1399"
fi
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
# shellcheck disable=SC2153
run get_bucket_name "$BUCKET_TWO_NAME"
assert_success
bucket_two_name="$output"
run setup_buckets_v2 "$bucket_name" "$bucket_two_name"
assert_success
run check_continuation_token
assert_success
}
# tags: curl,ListBuckets,max-buckets,continuation-token
@test "REST - list buckets - success (multiple pages)" {
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run get_bucket_name "$BUCKET_TWO_NAME"
assert_success
bucket_two_name="$output"
run setup_buckets_v2 "$bucket_name" "$bucket_two_name"
assert_success
run check_for_buckets_with_multiple_pages "$bucket_name" "$bucket_two_name"
assert_success
}
# tags: curl,ListBuckets,prefix
@test "REST - list buckets w/prefix" {
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run get_bucket_name "$BUCKET_TWO_NAME"
assert_success
bucket_two_name="$output"
run setup_buckets_v2 "$bucket_name" "$bucket_two_name"
assert_success
run list_check_buckets_rest "$bucket_name" "$bucket_two_name"
assert_success
run list_check_buckets_rest_with_prefix "$bucket_name"
assert_success
run list_check_buckets_rest_with_prefix "$bucket_two_name"
assert_success
}
# tags: curl,ListBuckets,minimal-request,user
@test "REST - ListBuckets - correct buckets show up" {
if [ "$SKIP_USERS_TESTS" == "true" ]; then
skip "skip versitygw-specific users tests"
fi
if [ "$DIRECT" == "true" ]; then
skip "https://github.com/versity/versitygw/issues/1704"
fi
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket_and_user "$bucket_name" "$USERNAME_ONE" "$PASSWORD_ONE" "user"
assert_success
username=${lines[${#lines[@]}-2]}
password=${lines[${#lines[@]}-1]}
run get_bucket_name "$BUCKET_TWO_NAME"
assert_success
bucket_two_name="$output"
run setup_bucket "$bucket_two_name"
assert_success
run change_bucket_owner "$AWS_ACCESS_KEY_ID" "$AWS_SECRET_ACCESS_KEY" "$bucket_two_name" "$username"
assert_success
log 5 "username: $username, password: $password"
run list_check_buckets_user "$username" "$password" "$bucket_two_name"
assert_success
}
# tags: curl,invalid-method
@test "REST - service route - invalid POST route" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/1810"
fi
run get_file_name
assert_success
file_name=$output
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket_and_add_file "$bucket_name" "$file_name"
assert_success
run send_rest_go_command_expect_error_with_specific_arg_names_values "405" "MethodNotAllowed" "is not allowed" 4 "Method" "POST" "ResourceType" "SERVICE" "-method" "POST"
assert_success
}
# tags: curl,invalid-method
@test "REST - service route - invalid method" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/1846"
fi
run send_rest_go_command_expect_error "400" "BadRequest" "An error occurred when parsing the HTTP request" "-method" "GETS"
assert_success
}
# tags: curl,ListBuckets,required-headers,x-amz-date
@test "REST - ListBuckets - error Content-Type is application/xml" {
run send_rest_go_command_check_header_key_and_value "403" "Content-Type" "application/xml" "-method" "GET" "-omitDate"
assert_success
}
# tags: curl,ListBuckets,bucket-region,invalid-query
@test "REST - ListBuckets - invalid bucket-region query" {
local invalid_region="abc"
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
local bucket_name="$output"
run setup_bucket "$bucket_name"
assert_success
run send_rest_go_command_expect_error_with_specific_arg_name_value "400" "InvalidArgument" "Argument value $invalid_region is not a valid AWS Region" \
"ArgumentName" "bucket-region" "-query" "bucket-region=$invalid_region"
assert_success
}
# tags: curl,ListBuckets,bucket-region
@test "REST - ListBuckets - incorrect bucket region" {
local test_region="us-east-1"
if [ "$AWS_REGION" == "us-east-1" ]; then
test_region="us-west-1"
fi
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket "$bucket_name"
assert_success
if [ "$DIRECT" == "true" ]; then
# the regional endpoint of that region lists only its own buckets
run list_buckets_bucket_not_in_list "$bucket_name" "$test_region" "-url" "https://s3.$test_region.amazonaws.com" "-awsRegion" "$test_region"
assert_success
return
fi
# the gateway is a single regional endpoint, so any other region is rejected
run send_rest_go_command_expect_error_with_specific_arg_name_value "400" "InvalidArgument" "Requests with bucket-region specified must be made to the corresponding regional endpoint" \
"ArgumentName" "bucket-region" "-query" "bucket-region=$test_region"
assert_success
}
# tags: curl,ListBuckets,bucket-region
@test "REST - ListBuckets - correct bucket region" {
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket "$bucket_name"
assert_success
run send_rest_go_command_callback "200" "check_bucket_and_region" "-query" "bucket-region=$AWS_REGION" "--" "$bucket_name" "$AWS_REGION"
assert_success
}
# tags: curl,ListBuckets,required-headers,x-amz-content-sha256
@test "REST - ListBuckets - missing sha256 hash" {
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket "$bucket_name"
assert_success
run send_rest_go_command_expect_error "400" "InvalidRequest" "Missing required header for this request: x-amz-content-sha256" "-omitSHA256Hash"
assert_success
}
# tags: curl,ListBuckets,required-headers,x-amz-content-sha256
@test "REST - ListBuckets - invalid hash type" {
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket "$bucket_name"
assert_success
run send_rest_go_command_expect_error "400" "InvalidArgument" "x-amz-content-sha256 must be" "-customSHA256Hash" "ABCDEFG"
assert_success
}
# tags: curl,ListBuckets,required-headers,x-amz-content-sha256
@test "REST - ListBuckets - non-matching hash type" {
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket "$bucket_name"
assert_success
run send_rest_go_command_expect_error "400" "InvalidRequest" "The value of x-amz-content-sha256 header is invalid" "-customSHA256Hash" "STREAMING-UNSIGNED-PAYLOAD-TRAILER"
assert_success
}
# tags: curl,ListBuckets,required-headers,x-amz-date
@test "REST - ListBuckets - omit date" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/1934"
fi
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket "$bucket_name"
assert_success
run send_rest_go_command_expect_error "403" "AccessDenied" "AWS authentication requires a valid Date or x-amz-date header" "-omitDate"
assert_success
}
# tags: curl,ListBuckets,required-headers,x-amz-date
@test "REST - ListBuckets - invalid date" {
if [ "$DIRECT" != "true" ]; then
skip "https://github.com/versity/versitygw/issues/1934"
fi
run get_bucket_name "$BUCKET_ONE_NAME"
assert_success
bucket_name="$output"
run setup_bucket "$bucket_name"
assert_success
run send_rest_go_command_expect_error "403" "AccessDenied" "AWS authentication requires a valid Date or x-amz-date header" "-customDate" "ABCDEFG"
assert_success
}