| /* |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you 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. |
| */ |
| |
| /** |
| * @file aws_auth_v4.h |
| * @brief AWS Auth v4 signing utility. |
| * @see aws_auth_v4.cc |
| */ |
| |
| #pragma once |
| |
| #include <algorithm> /* transform() */ |
| #include <cstddef> /* size_t */ |
| #include <string> /* std::string */ |
| #include <sstream> /* std::stringstream */ |
| #include <map> /* std::map */ |
| #include <set> /* std::set */ |
| |
| #include <ts/ts.h> |
| |
| typedef std::string String; |
| typedef std::set<std::string> StringSet; |
| typedef std::map<std::string, std::string> StringMap; |
| typedef std::multimap<std::string, std::string> HeaderMultiMap; |
| |
| class HeaderIterator; |
| |
| class TsInterface |
| { |
| public: |
| virtual ~TsInterface(){}; |
| virtual const char *getMethod(int *length) = 0; |
| virtual const char *getHost(int *length) = 0; |
| virtual const char *getPath(int *length) = 0; |
| virtual const char *getQuery(int *length) = 0; |
| virtual HeaderIterator headerBegin() = 0; |
| virtual HeaderIterator headerEnd() = 0; |
| }; |
| |
| #ifdef AWS_AUTH_V4_UNIT_TEST |
| #include "unit_tests/test_aws_auth_v4.h" |
| #else |
| #include "aws_auth_v4_wrap.h" |
| #endif |
| |
| /* S3 auth v4 utility API */ |
| |
| static const String X_AMZ_CONTENT_SHA256 = "x-amz-content-sha256"; |
| static const String X_AMX_DATE = "x-amz-date"; |
| static const String X_AMZ_SECURITY_TOKEN = "x-amz-security-token"; |
| static const String X_AMZ = "x-amz-"; |
| static const String CONTENT_TYPE = "content-type"; |
| static const String HOST = "host"; |
| |
| String trimWhiteSpaces(const String &s); |
| |
| template <typename ContainerType> |
| void |
| commaSeparateString(ContainerType &ss, const String &input, bool trim = true, bool lowerCase = true) |
| { |
| std::istringstream istr(input); |
| String token; |
| |
| while (std::getline(istr, token, ',')) { |
| token = trim ? trimWhiteSpaces(token) : token; |
| if (lowerCase) { |
| std::transform(token.begin(), token.end(), token.begin(), ::tolower); |
| } |
| ss.insert(ss.end(), token); |
| } |
| } |
| |
| class AwsAuthV4 |
| { |
| public: |
| AwsAuthV4(TsInterface &api, time_t *now, bool signPayload, const char *awsAccessKeyId, size_t awsAccessKeyIdLen, |
| const char *awsSecretAccessKey, size_t awsSecretAccessKeyLen, const char *awsService, size_t awsServiceLen, |
| const StringSet &includedHeaders, const StringSet &excludedHeaders, const StringMap ®ionMap); |
| const char *getDateTime(size_t *dateTimeLen); |
| String getPayloadHash(); |
| String getAuthorizationHeader(); |
| |
| private: |
| TsInterface &_api; |
| char _dateTime[sizeof "20170428T010203Z"]; |
| bool _signPayload = false; |
| const char *_awsAccessKeyId = nullptr; |
| size_t _awsAccessKeyIdLen = 0; |
| const char *_awsSecretAccessKey = nullptr; |
| size_t _awsSecretAccessKeyLen = 0; |
| const char *_awsService = nullptr; |
| size_t _awsServiceLen = 0; |
| |
| const StringSet &_includedHeaders; |
| const StringSet &_excludedHeaders; |
| const StringMap &_regionMap; |
| }; |