From b607c4da9e693aeac1854ad6fee62b1db031faee Mon Sep 17 00:00:00 2001 From: Christos Stratopoulos Date: Thu, 31 Oct 2019 14:44:19 -0400 Subject: [PATCH 01/21] Make C++ string_view detection work with MSVC The existing method to check for support of C++17 `string_view` does not work on MSVC, see [here](https://docs.microsoft.com/en-us/cpp/build/reference/zc-cplusplus?view=vs-2019) Instead we replace with the [feature test macro](https://en.cppreference.com/w/User:D41D8CD98F/feature_testing_macros) for `string_view`, which is `__cpp_lib_string_view`. This should work on all platforms and is arguably more precise. --- include/jwt/string_view.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/jwt/string_view.hpp b/include/jwt/string_view.hpp index 65e0c37..bc5054b 100644 --- a/include/jwt/string_view.hpp +++ b/include/jwt/string_view.hpp @@ -23,7 +23,7 @@ SOFTWARE. #ifndef JWT_STRING_VIEW_HPP #define JWT_STRING_VIEW_HPP -#if __cplusplus >= 201703L +#if defined(__cpp_lib_string_view) #include @@ -31,7 +31,7 @@ namespace jwt { using string_view = std::string_view; } -#else // __cplusplus >= 201703L +#else // defined(__cpp_lib_string_view) #include #include @@ -375,6 +375,6 @@ using string_view = basic_string_view; #include "jwt/impl/string_view.ipp" -#endif // __cplusplus >= 201703L +#endif // defined(__cpp_lib_string_view) #endif From 8841837fe43a2caecee39f11f4c4639a7ee81d18 Mon Sep 17 00:00:00 2001 From: Lander Noterman Date: Mon, 9 Dec 2019 09:23:37 +0100 Subject: [PATCH 02/21] fix clang-cl build on windows --- include/jwt/config.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/jwt/config.hpp b/include/jwt/config.hpp index 6370510..5d94a0c 100644 --- a/include/jwt/config.hpp +++ b/include/jwt/config.hpp @@ -29,7 +29,7 @@ // To hack around Visual Studio error: // error C3431: 'algorithm': a scoped enumeration cannot be redeclared as an unscoped enumeration -#ifdef _MSC_VER +#if defined(_MSC_VER) && !defined(__clang__) #define SCOPED_ENUM enum class #else #define SCOPED_ENUM enum From 9624da5e59141a6ae80f362568097fab7e71dfd2 Mon Sep 17 00:00:00 2001 From: Andrew Wiik Date: Thu, 16 Jan 2020 00:42:50 -0500 Subject: [PATCH 03/21] Fix parsing of alg claim to be RFC compliant The alg claim should always be treated as a case-sensitive value according to the RFC spec which you can find here: https://tools.ietf.org/html/rfc7515#section-4.1.1. The same RFC spec also says it must be present, if it is empty it is not present so it should not be converted to the "none" algo as the "none" algo is an algorithm and not the absence of one. Finally the "none" algorithm as a string should be "none" not "NONE" according to the IANA register for JWS Signature and Encryption Algorithms which can be found here: https://www.iana.org/assignments/jose/jose.xhtml#web-signature-encryption-algorithms --- include/jwt/algorithm.hpp | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/include/jwt/algorithm.hpp b/include/jwt/algorithm.hpp index eba497b..220ec3a 100644 --- a/include/jwt/algorithm.hpp +++ b/include/jwt/algorithm.hpp @@ -57,7 +57,7 @@ using sign_result_t = std::pair; /// The result type of verification function using verify_result_t = std::pair; /// The function pointer type for the signing function -using sign_func_t = sign_result_t (*) (const jwt::string_view key, +using sign_func_t = sign_result_t (*) (const jwt::string_view key, const jwt::string_view data); /// The function pointer type for the verifying function using verify_func_t = verify_result_t (*) (const jwt::string_view key, @@ -235,7 +235,7 @@ inline jwt::string_view alg_to_str(SCOPED_ENUM algorithm alg) noexcept case algorithm::ES384: return "ES384"; case algorithm::ES512: return "ES512"; case algorithm::TERM: return "TERM"; - case algorithm::NONE: return "NONE"; + case algorithm::NONE: return "none"; case algorithm::UNKN: return "UNKN"; default: assert (0 && "Unknown Algorithm"); }; @@ -249,18 +249,18 @@ inline jwt::string_view alg_to_str(SCOPED_ENUM algorithm alg) noexcept */ inline SCOPED_ENUM algorithm str_to_alg(const jwt::string_view alg) noexcept { - if (!alg.length()) return algorithm::NONE; + if (!alg.length()) return algorithm::UNKN; if (!strcasecmp(alg.data(), "none")) return algorithm::NONE; - if (!strcasecmp(alg.data(), "hs256")) return algorithm::HS256; - if (!strcasecmp(alg.data(), "hs384")) return algorithm::HS384; - if (!strcasecmp(alg.data(), "hs512")) return algorithm::HS512; - if (!strcasecmp(alg.data(), "rs256")) return algorithm::RS256; - if (!strcasecmp(alg.data(), "rs384")) return algorithm::RS384; - if (!strcasecmp(alg.data(), "rs512")) return algorithm::RS512; - if (!strcasecmp(alg.data(), "es256")) return algorithm::ES256; - if (!strcasecmp(alg.data(), "es384")) return algorithm::ES384; - if (!strcasecmp(alg.data(), "es512")) return algorithm::ES512; + if (!strcasecmp(alg.data(), "HS256")) return algorithm::HS256; + if (!strcasecmp(alg.data(), "HS384")) return algorithm::HS384; + if (!strcasecmp(alg.data(), "HS512")) return algorithm::HS512; + if (!strcasecmp(alg.data(), "RS256")) return algorithm::RS256; + if (!strcasecmp(alg.data(), "RS384")) return algorithm::RS384; + if (!strcasecmp(alg.data(), "RS512")) return algorithm::RS512; + if (!strcasecmp(alg.data(), "ES256")) return algorithm::ES256; + if (!strcasecmp(alg.data(), "ES384")) return algorithm::ES384; + if (!strcasecmp(alg.data(), "ES512")) return algorithm::ES512; return algorithm::UNKN; @@ -385,14 +385,14 @@ struct HMACSign * Returns: * verify_result_t * verify_result_t::first set to true if verification succeeds. - * false otherwise. + * false otherwise. * verify_result_t::second set to relevant error if verification fails. * * Exceptions: * Any allocation failure will result in jwt::MemoryAllocationException * being thrown. */ - static verify_result_t + static verify_result_t verify(const jwt::string_view key, const jwt::string_view head, const jwt::string_view sign); }; @@ -405,10 +405,10 @@ struct HMACSign * PEM based algorithms. * * The signing and verification APIs are - * basically no-op except that they would + * basically no-op except that they would * set the relevant error code. * - * NOTE: error_code would be set in the case + * NOTE: error_code would be set in the case * of usage of NONE algorithm. * Users of this API are expected to check for * the case explicitly. @@ -534,7 +534,7 @@ private: /** */ static int ECDSA_SIG_set0(ECDSA_SIG* sig, BIGNUM* r, BIGNUM* s) - { + { if (r == nullptr || s == nullptr) return 0; BN_clear_free(sig->r); From 92cac1ecbde5199c9edb86c80641a52edcd9dc87 Mon Sep 17 00:00:00 2001 From: Andrew Wiik Date: Thu, 16 Jan 2020 00:56:41 -0500 Subject: [PATCH 04/21] Updated tests and README for RFC Fixes --- README.md | 40 ++++++++-------- examples/simple_ex2.cc | 2 +- examples/simple_ex3_rsa.cc | 4 +- include/jwt/test/test_jwt_decode.cc | 2 +- include/jwt/test/test_jwt_object.cc | 16 +++---- tests/test_jwt_decode.cc | 32 ++++++------- tests/test_jwt_decode_verifiy.cc | 48 +++++++++---------- .../test_jwt_decode_verifiy_with_exception.cc | 48 +++++++++---------- tests/test_jwt_encode.cc | 24 +++++----- tests/test_jwt_es.cc | 12 ++--- tests/test_jwt_object.cc | 4 +- tests/test_jwt_rsa.cc | 14 +++--- 12 files changed, 123 insertions(+), 123 deletions(-) diff --git a/README.md b/README.md index 7292e85..682789d 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ This assertion can be used in some kind of bearer authentication mechanism that Few good resources on this material which I found useful are: Anatomy of JWT - Learn JWT + Learn JWT RFC 7519 @@ -78,7 +78,7 @@ Few good resources on this material which I found useful are: std::cout << enc_str << std::endl; //Decode - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), secret(key)); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), secret(key)); std::cout << dec_obj.header() << std::endl; std::cout << dec_obj.payload() << std::endl; @@ -96,7 +96,7 @@ Few good resources on this material which I found useful are: Almost the same API, except for some ugliness here and there. But close enough! Lets take another example in which we will see to add payload claim having type other than string. - The payload function used in the above example to create jwt_object object can only take strings. For anything else, it will throw a compilation error. + The payload function used in the above example to create jwt_object object can only take strings. For anything else, it will throw a compilation error. For adding claims having values other than string, jwt_object class provides add_claim API. We will also see few other APIs in the next example. Make sure to read the comments :). @@ -109,7 +109,7 @@ Few good resources on this material which I found useful are: int main() { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"user", "admin"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"user", "admin"}})}; //Use add_claim API to add claim values which are // _not_ strings. @@ -313,17 +313,17 @@ All the parameters are basically a function which returns an instance of a type - Takes in any type which satifies the SequenceConcept (see idetail::meta::is_sequence_concept) ```cpp - jwt::decode(algorithms({"none", "hs256", "rs256"}), ...); - + jwt::decode(algorithms({"none", "HS256", "RS256"}), ...); + OR - std::vector algs{"none", "hs256", "rs256"}; + std::vector algs{"none", "HS256", "RS256"}; jwt::decode(algorithms(algs), ...); ``` - secret - Optional parameter. To be supplied only when the algorithm used is not "NONE". Else would throw/set KeyNotPresentError / KeyNotPresent exception/error. + Optional parameter. To be supplied only when the algorithm used is not "none". Else would throw/set KeyNotPresentError / KeyNotPresent exception/error. - leeway @@ -365,7 +365,7 @@ All the parameters are basically a function which returns an instance of a type - validate_jti - Optional parameter. + Optional parameter. Takes a boolean value. Validates the JTI claim. Only checks for the presence of the claim. If not throws or sets InvalidJTIError or InvalidJTI. @@ -394,7 +394,7 @@ For the registered claim types the library assumes specific data types for the c ## Advanced Examples -We will see few complete examples which makes use of error code checks and exception handling. +We will see few complete examples which makes use of error code checks and exception handling. The examples are taken from the "tests" section. Users are requested to checkout the tests to find out more ways to use this library. Expiration verification example (uses error_code): @@ -406,7 +406,7 @@ Expiration verification example (uses error_code): int main() { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret")}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret")}; obj.add_claim("iss", "arun.muralidharan") .add_claim("exp", std::chrono::system_clock::now() - std::chrono::seconds{1}) ; @@ -415,7 +415,7 @@ int main() { auto enc_str = obj.signature(ec); assert (!ec); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret("secret"), verify(true)); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret("secret"), verify(true)); assert (ec); assert (ec.value() == static_cast(jwt::VerificationErrc::TokenExpired)); @@ -432,7 +432,7 @@ Expiration verification example (uses exception): int main() { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret")}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret")}; obj.add_claim("iss", "arun.muralidharan") .add_claim("exp", std::chrono::system_clock::now() - std::chrono::seconds{1}) @@ -441,7 +441,7 @@ int main() { auto enc_str = obj.signature(); try { - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), secret("secret"), verify(true)); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), secret("secret"), verify(true)); } catch (const jwt::TokenExpiredError& e) { //Handle Token expired exception here //... @@ -450,7 +450,7 @@ int main() { //... } catch (const jwt::DecodeError& e) { //Handle all kinds of other decode errors - //... + //... } catch (const jwt::VerificationError& e) { // Handle the base verification error. //NOTE: There are other derived types of verification errors @@ -472,13 +472,13 @@ Invalid issuer test(uses error_code): int main() { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}})}; std::error_code ec; auto enc_str = obj.signature(ec); assert (!ec); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret("secret"), issuer("arun.muralidharan")); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret("secret"), issuer("arun.muralidharan")); assert (ec); assert (ec.value() == static_cast(jwt::VerificationErrc::InvalidIssuer)); @@ -566,7 +566,7 @@ The error codes are divided into different categories: TypeConversionError, }; ``` - + Exceptions: There are exception types created for almost all the error codes above. @@ -588,7 +588,7 @@ There are exception types created for almost all the error codes above. - KeyNotPresentError - Thrown if key/secret is not passed in with the decode API if the algorithm used is something other than "NONE". + Thrown if key/secret is not passed in with the decode API if the algorithm used is something other than "none". - VerificationError @@ -644,7 +644,7 @@ int main() { auto dec_obj = jwt::decode(enc_str, algorithms({"none"}), ec, verify(false)); - // Should not be a hard error in general + // Should not be a hard error in general assert (ec.value() == static_cast(jwt::AlgorithmErrc::NoneAlgorithmUsed)); } ``` diff --git a/examples/simple_ex2.cc b/examples/simple_ex2.cc index 3804904..a223f9d 100644 --- a/examples/simple_ex2.cc +++ b/examples/simple_ex2.cc @@ -6,7 +6,7 @@ int main() { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"user", "admin"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"user", "admin"}})}; //Use add_claim API to add claim values which are // _not_ strings. diff --git a/examples/simple_ex3_rsa.cc b/examples/simple_ex3_rsa.cc index a9bf043..2934a92 100644 --- a/examples/simple_ex3_rsa.cc +++ b/examples/simple_ex3_rsa.cc @@ -44,7 +44,7 @@ int main() { auto priv_key = read_from_file(priv_key_path); - jwt::jwt_object obj{algorithm("rs256"), secret(priv_key), payload({{"user", "admin"}})}; + jwt::jwt_object obj{algorithm("RS256"), secret(priv_key), payload({{"user", "admin"}})}; //Use add_claim API to add claim values which are // _not_ strings. @@ -76,7 +76,7 @@ int main() { return 1; } - auto dec_obj = jwt::decode(sign, algorithms({"rs256"}), verify(false), secret(pub_key)); + auto dec_obj = jwt::decode(sign, algorithms({"RS256"}), verify(false), secret(pub_key)); return 0; } diff --git a/include/jwt/test/test_jwt_decode.cc b/include/jwt/test/test_jwt_decode.cc index b2b6ed0..3585131 100644 --- a/include/jwt/test/test_jwt_decode.cc +++ b/include/jwt/test/test_jwt_decode.cc @@ -21,7 +21,7 @@ void basic_decode_test() using namespace jwt::params; std::cout << "DECODE: \n"; - jwt::decode(res, algorithms({"none", "hs256"}), ec, verify(false), secret("secret")); + jwt::decode(res, algorithms({"none", "HS256"}), ec, verify(false), secret("secret")); } int main() { diff --git a/include/jwt/test/test_jwt_object.cc b/include/jwt/test/test_jwt_object.cc index ecab0c8..a0e6cee 100644 --- a/include/jwt/test/test_jwt_object.cc +++ b/include/jwt/test/test_jwt_object.cc @@ -11,7 +11,7 @@ void basic_jwt_object_test() using namespace jwt::params; jwt::jwt_object obj(payload({ {"a", "b"}, - {"c", "d"} + {"c", "d"} })); //check with std::map @@ -20,7 +20,7 @@ void basic_jwt_object_test() m["c"] = "d"; jwt::jwt_object obj1{payload(m)}; - + auto obj2 = std::move(obj1); std::cout << obj2.payload() << std::endl; @@ -43,23 +43,23 @@ void basic_jwt_object_test() std::cout << obj3.payload() << std::endl; obj3.secret("secret"); - obj3.header().algo("hs256"); + obj3.header().algo("HS256"); - auto dec_obj = jwt::decode(obj3.signature(), algorithms({"hs256"}), secret("secret")); + auto dec_obj = jwt::decode(obj3.signature(), algorithms({"HS256"}), secret("secret")); } void jwt_object_pem_test() { using namespace jwt::params; - std::string pub_key = + std::string pub_key = R"(-----BEGIN PUBLIC KEY----- MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEomxC9ycc8AkXSwWQpu1kN5Fmgy/sD/KJ qN3tlSZmUEZ3w3c6KYJfK97PMOSZQaUdeydBoq/IOglQQOj8zLqubq5IpaaUiDQ5 0eJg79PvXuLiVUH98cBL/o8sDVB/sGzz -----END PUBLIC KEY-----)"; - std::string priv_key = + std::string priv_key = R"(-----BEGIN EC PRIVATE KEY----- MIGkAgEBBDBeLCgapjZmvTatMHaYX3A02+0Ys3Tr8kda+E9DFnmCSiCOEig519fT 13edeU8YdDugBwYFK4EEACKhZANiAASibEL3JxzwCRdLBZCm7WQ3kWaDL+wP8omo @@ -79,10 +79,10 @@ MIGkAgEBBDBeLCgapjZmvTatMHaYX3A02+0Ys3Tr8kda+E9DFnmCSiCOEig519fT ; std::cout << "pem sign " << obj.signature() << std::endl; - std::cout << "Get claim value for exp: " << + std::cout << "Get claim value for exp: " << obj.payload().get_claim_value("exp") << std::endl; - auto dec_obj = jwt::decode(obj.signature(), algorithms({"es256"}), secret(pub_key)); + auto dec_obj = jwt::decode(obj.signature(), algorithms({"ES256"}), secret(pub_key)); std::cout << dec_obj.payload() << std::endl; } diff --git a/tests/test_jwt_decode.cc b/tests/test_jwt_decode.cc index a63410c..78fe718 100644 --- a/tests/test_jwt_decode.cc +++ b/tests/test_jwt_decode.cc @@ -5,11 +5,11 @@ TEST (DecodeTest, InvalidFinalDotForNoneAlg) { using namespace jwt::params; - const char* inv_enc_str = + const char* inv_enc_str = "eyJhbGciOiJOT05FIiwidHlwIjoiSldUIn0.eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjoxNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ"; std::error_code ec; - auto obj = jwt::decode(inv_enc_str, algorithms({"none", "hs256"}), ec); + auto obj = jwt::decode(inv_enc_str, algorithms({"none", "HS256"}), ec); ASSERT_TRUE (ec); EXPECT_EQ (ec.value(), static_cast(jwt::DecodeErrc::SignatureFormatError)); @@ -18,7 +18,7 @@ TEST (DecodeTest, InvalidFinalDotForNoneAlg) TEST (DecodeTest, DecodeNoneAlgSign) { using namespace jwt::params; - const char* enc_str = + const char* enc_str = "eyJhbGciOiJOT05FIiwidHlwIjoiSldUIn0.eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjo0NTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ."; std::error_code ec; @@ -45,7 +45,7 @@ TEST (DecodeTest, DecodeWrongAlgo) "eyJhbGciOiJOT05FIiwidHlwIjoiSldUIn0.eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjoxNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ."; std::error_code ec; - auto obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret(""), verify(true)); + auto obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret(""), verify(true)); EXPECT_TRUE (ec); EXPECT_EQ (ec.value(), static_cast(jwt::VerificationErrc::InvalidAlgorithm)); } @@ -58,7 +58,7 @@ TEST (DecodeTest, DecodeInvalidHeader) "ehbGciOiJOT05FIiwidHlwIjoiSldUIn0.eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjoxNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ."; std::error_code ec; - auto obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret(""), verify(true)); + auto obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret(""), verify(true)); ASSERT_TRUE (ec); EXPECT_EQ (ec.value(), static_cast(jwt::DecodeErrc::JsonParseError)); @@ -72,7 +72,7 @@ TEST (DecodeTest, DecodeEmptyHeader) ".eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjoxNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ."; std::error_code ec; - auto obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret(""), verify(true)); + auto obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret(""), verify(true)); ASSERT_TRUE (ec); EXPECT_EQ (ec.value(), static_cast(jwt::DecodeErrc::JsonParseError)); @@ -82,7 +82,7 @@ TEST (DecodeTest, DecodeInvalidPayload) { using namespace jwt::params; - const char* enc_str = + const char* enc_str = "eyJhbGciOiJOT05FIiwidHlwIjoiSldUIn0.eyfhuWcikiJyaWZ0LmlvIiwiZXhwIsexNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ."; std::error_code ec; @@ -95,14 +95,14 @@ TEST (DecodeTest, DecodeInvalidPayload) TEST (DecodeTest, DecodeHS256) { using namespace jwt::params; - + const char* enc_str = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9." "eyJpYXQiOjE1MTM4NjIzNzEsImlkIjoiYS1iLWMtZC1lLWYtMS0yLTMiLCJpc3MiOiJhcnVuLm11cmFsaWRoYXJhbiIsInN1YiI6ImFkbWluIn0." "jk7bRQKTLvs1RcuvMc2B_rt6WBYPoVPirYi_QRBPiuk"; std::error_code ec; - auto obj = jwt::decode(enc_str, algorithms({"none", "hs256"}), ec, verify(false), secret("secret")); + auto obj = jwt::decode(enc_str, algorithms({"none", "HS256"}), ec, verify(false), secret("secret")); ASSERT_FALSE (ec); EXPECT_TRUE (obj.has_claim("iss")); @@ -119,13 +119,13 @@ TEST (DecodeTest, SecretKeyNotPassed) { using namespace jwt::params; - const char* enc_str = + const char* enc_str = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9." "eyJpYXQiOjE1MTM4NjIzNzEsImlkIjoiYS1iLWMtZC1lLWYtMS0yLTMiLCJpc3MiOiJhcnVuLm11cmFsaWRoYXJhbiIsInN1YiI6ImFkbWluIn0." "jk7bRQKTLvs1RcuvMc2B_rt6WBYPoVPirYi_QRBPiuk"; std::error_code ec; - auto obj = jwt::decode(enc_str, algorithms({"none", "hs256"}), ec, verify(true)); + auto obj = jwt::decode(enc_str, algorithms({"none", "HS256"}), ec, verify(true)); ASSERT_TRUE (ec); EXPECT_EQ (ec.value(), static_cast(jwt::DecodeErrc::KeyNotPresent)); @@ -143,7 +143,7 @@ TEST (DecodeTest, DecodeHS384) const jwt::string_view key = "0123456789abcdefghijklmnopqrstuvwxyz"; std::error_code ec; - auto obj = jwt::decode(enc_str, algorithms({"none", "hs384"}), ec, verify(false), secret(key)); + auto obj = jwt::decode(enc_str, algorithms({"none", "HS384"}), ec, verify(false), secret(key)); ASSERT_FALSE (ec); EXPECT_TRUE (obj.has_claim("sub")); @@ -154,7 +154,7 @@ TEST (DecodeTest, DecodeHS512) { using namespace jwt::params; - const char* enc_str = + const char* enc_str = "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9." "eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjoxNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ." "vQ-1JSFN1kPjUI3URP6AFK5z8V7xLhyhw-76QWhQg9Xcy-IgrJ-bCTYLBjgaprrcEWwpSnBQnP3QnIxYK0HEaQ"; @@ -162,7 +162,7 @@ TEST (DecodeTest, DecodeHS512) const jwt::string_view key = "00112233445566778899"; std::error_code ec; - auto obj = jwt::decode(enc_str, algorithms({"none", "hs384", "hs512"}), ec, verify(false), secret(key)); + auto obj = jwt::decode(enc_str, algorithms({"none", "HS384", "HS512"}), ec, verify(false), secret(key)); ASSERT_FALSE (ec); @@ -174,13 +174,13 @@ TEST (DecodeTest, TypHeaderMiss) { using namespace jwt::params; - const char* enc_str = + const char* enc_str = "eyJhbGciOiJIUzI1NiJ9." "eyJleHAiOjE1MzM0NjE1NTMsImlhdCI6MTUxMzg2MjM3MSwiaWQiOiJhLWItYy1kLWUtZi0xLTItMyIsImlzcyI6ImFydW4ubXVyYWxpZGhhcmFuIiwic3ViIjoiYWRtaW4ifQ." "pMWBLSWl1p4V958lfe_6ZhvgFMOQv9Eq5mlndVKFKkA"; std::error_code ec; - auto obj = jwt::decode(enc_str, algorithms({"none", "hs256"}), ec, verify(false)); + auto obj = jwt::decode(enc_str, algorithms({"none", "HS256"}), ec, verify(false)); std::cout << "Decode header: " << obj.header() << std::endl; EXPECT_FALSE (ec); diff --git a/tests/test_jwt_decode_verifiy.cc b/tests/test_jwt_decode_verifiy.cc index 9f32c1b..ddb39a5 100644 --- a/tests/test_jwt_decode_verifiy.cc +++ b/tests/test_jwt_decode_verifiy.cc @@ -9,7 +9,7 @@ TEST (DecodeVerify, BeforeExpiryTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret")}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret")}; obj.add_claim("iss", "arun.muralidharan") .add_claim("exp", std::chrono::system_clock::now() + std::chrono::seconds{10}) ; @@ -19,7 +19,7 @@ TEST (DecodeVerify, BeforeExpiryTest) ASSERT_FALSE (ec); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret("secret"), verify(true)); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret("secret"), verify(true)); ASSERT_FALSE (ec); } @@ -27,7 +27,7 @@ TEST (DecodeVerify, AfterExpiryTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret")}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret")}; obj.add_claim("iss", "arun.muralidharan") .add_claim("exp", std::chrono::system_clock::now() - std::chrono::seconds{1}) ; @@ -36,7 +36,7 @@ TEST (DecodeVerify, AfterExpiryTest) auto enc_str = obj.signature(ec); ASSERT_FALSE (ec); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret("secret"), verify(true)); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret("secret"), verify(true)); ASSERT_TRUE (ec); EXPECT_EQ (ec.value(), static_cast(jwt::VerificationErrc::TokenExpired)); } @@ -45,7 +45,7 @@ TEST (DecodeVerify, AfterExpiryWithLeeway) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret")}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret")}; obj.add_claim("iss", "arun.muralidharan") .add_claim("exp", std::chrono::system_clock::now() - std::chrono::seconds{1}) ; @@ -54,7 +54,7 @@ TEST (DecodeVerify, AfterExpiryWithLeeway) auto enc_str = obj.signature(ec); ASSERT_FALSE (ec); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret("secret"), verify(true), leeway(2)); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret("secret"), verify(true), leeway(2)); ASSERT_FALSE (ec); } @@ -62,7 +62,7 @@ TEST (DecodeVerify, ValidIssuerTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret")}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret")}; obj.add_claim("iss", "arun.muralidharan") .add_claim("sub", "test") ; @@ -71,7 +71,7 @@ TEST (DecodeVerify, ValidIssuerTest) auto enc_str = obj.signature(ec); ASSERT_FALSE (ec); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret("secret"), issuer("arun.muralidharan")); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret("secret"), issuer("arun.muralidharan")); ASSERT_FALSE (ec); } @@ -79,12 +79,12 @@ TEST (DecodeVerify, InvalidIssuerTest_1) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}})}; std::error_code ec; auto enc_str = obj.signature(ec); ASSERT_FALSE (ec); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret("secret"), issuer("arun.muralidharan")); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret("secret"), issuer("arun.muralidharan")); ASSERT_TRUE (ec); EXPECT_EQ (ec.value(), static_cast(jwt::VerificationErrc::InvalidIssuer)); @@ -94,14 +94,14 @@ TEST (DecodeVerify, InvalidIssuerTest_2) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}})}; obj.add_claim("iss", "arun.muralidharan"); std::error_code ec; auto enc_str = obj.signature(ec); ASSERT_FALSE (ec); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret("secret"), issuer("arun.murali")); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret("secret"), issuer("arun.murali")); ASSERT_TRUE (ec); EXPECT_EQ (ec.value(), static_cast(jwt::VerificationErrc::InvalidIssuer)); } @@ -110,14 +110,14 @@ TEST (DecodeVerify, NotImmatureSignatureTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}})}; obj.add_claim(jwt::registered_claims::not_before, std::chrono::system_clock::now() - std::chrono::seconds{10}); std::error_code ec; auto enc_str = obj.signature(ec); ASSERT_FALSE (ec); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret("secret")); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret("secret")); ASSERT_FALSE (ec); } @@ -125,14 +125,14 @@ TEST (DecodeVerify, ImmatureSignatureTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}})}; obj.add_claim(jwt::registered_claims::not_before, std::chrono::system_clock::now() + std::chrono::seconds{10}); std::error_code ec; auto enc_str = obj.signature(ec); ASSERT_FALSE (ec); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret("secret")); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret("secret")); ASSERT_TRUE (ec); EXPECT_EQ (ec.value(), static_cast(jwt::VerificationErrc::ImmatureSignature)); } @@ -141,14 +141,14 @@ TEST (DecodeVerify, ImmatureSignatureTestWithLeeway) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}})}; obj.add_claim(jwt::registered_claims::not_before, std::chrono::system_clock::now() + std::chrono::seconds{10}); std::error_code ec; auto enc_str = obj.signature(ec); ASSERT_FALSE (ec); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret("secret"), leeway(10)); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret("secret"), leeway(10)); ASSERT_FALSE (ec); } @@ -156,13 +156,13 @@ TEST (DecodeVerify, InvalidAudienceTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}, {"aud", "www"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}, {"aud", "www"}})}; std::error_code ec; auto enc_str = obj.signature(ec); ASSERT_FALSE (ec); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret("secret"), aud("ww")); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret("secret"), aud("ww")); ASSERT_TRUE (ec); EXPECT_EQ (ec.value(), static_cast(jwt::VerificationErrc::InvalidAudience)); } @@ -171,13 +171,13 @@ TEST (DecodeVerify, InvalidIATTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}, {"aud", "www"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}, {"aud", "www"}})}; obj.add_claim("iat", "what?"); auto enc_str = obj.signature(); std::error_code ec; - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), ec, secret("secret"), validate_iat(true)); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), ec, secret("secret"), validate_iat(true)); EXPECT_EQ (ec.value(), static_cast(jwt::VerificationErrc::TypeConversionError)); } @@ -186,11 +186,11 @@ TEST (DecodeVerify, InvalidSignatureTest) using namespace jwt::params; std::error_code ec; - auto dec_obj = jwt::decode("", algorithms({"hs256"}), ec, secret("secret"), validate_iat(true)); + auto dec_obj = jwt::decode("", algorithms({"HS256"}), ec, secret("secret"), validate_iat(true)); EXPECT_EQ (ec.value(), static_cast(jwt::DecodeErrc::SignatureFormatError)); ec.clear(); - dec_obj = jwt::decode("abcdsdfhbsdhjfbsdj.", algorithms({"hs256"}), ec, secret("secret"), validate_iat(true)); + dec_obj = jwt::decode("abcdsdfhbsdhjfbsdj.", algorithms({"HS256"}), ec, secret("secret"), validate_iat(true)); EXPECT_EQ (ec.value(), static_cast(jwt::DecodeErrc::SignatureFormatError)); } diff --git a/tests/test_jwt_decode_verifiy_with_exception.cc b/tests/test_jwt_decode_verifiy_with_exception.cc index 5c52a76..939e265 100644 --- a/tests/test_jwt_decode_verifiy_with_exception.cc +++ b/tests/test_jwt_decode_verifiy_with_exception.cc @@ -9,28 +9,28 @@ TEST (DecodeVerifyExp, BeforeExpiryTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret")}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret")}; obj.add_claim("iss", "arun.muralidharan") .add_claim("exp", std::chrono::system_clock::now() + std::chrono::seconds{10}) ; auto enc_str = obj.signature(); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), secret("secret"), verify(true)); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), secret("secret"), verify(true)); } TEST (DecodeVerifyExp, AfterExpiryTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret")}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret")}; obj.add_claim("iss", "arun.muralidharan") .add_claim("exp", std::chrono::system_clock::now() - std::chrono::seconds{1}) ; auto enc_str = obj.signature(); - EXPECT_THROW (jwt::decode(enc_str, algorithms({"hs256"}), secret("secret"), verify(true)), + EXPECT_THROW (jwt::decode(enc_str, algorithms({"HS256"}), secret("secret"), verify(true)), jwt::TokenExpiredError); } @@ -39,13 +39,13 @@ TEST (DecodeVerifyExp, AfterExpiryWithLeeway) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret")}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret")}; obj.add_claim("iss", "arun.muralidharan") .add_claim("exp", std::chrono::system_clock::now() - std::chrono::seconds{1}) ; auto enc_str = obj.signature(); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), secret("secret"), verify(true), leeway(2)); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), secret("secret"), verify(true), leeway(2)); (void)dec_obj; } @@ -53,14 +53,14 @@ TEST (DecodeVerifyExp, ValidIssuerTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret")}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret")}; obj.add_claim("iss", "arun.muralidharan") .add_claim("sub", "test") ; auto enc_str = obj.signature(); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), secret("secret"), issuer("arun.muralidharan")); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), secret("secret"), issuer("arun.muralidharan")); (void)dec_obj; } @@ -68,10 +68,10 @@ TEST (DecodeVerifyExp, InvalidIssuerTest_1) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}})}; auto enc_str = obj.signature(); - EXPECT_THROW (jwt::decode(enc_str, algorithms({"hs256"}), secret("secret"), issuer("arun.muralidharan")), + EXPECT_THROW (jwt::decode(enc_str, algorithms({"HS256"}), secret("secret"), issuer("arun.muralidharan")), jwt::InvalidIssuerError); } @@ -80,12 +80,12 @@ TEST (DecodeVerifyExp, InvalidIssuerTest_2) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}})}; obj.add_claim("iss", "arun.muralidharan"); auto enc_str = obj.signature(); - EXPECT_THROW (jwt::decode(enc_str, algorithms({"hs256"}), secret("secret"), issuer("arun.murali")), + EXPECT_THROW (jwt::decode(enc_str, algorithms({"HS256"}), secret("secret"), issuer("arun.murali")), jwt::InvalidIssuerError); } @@ -93,12 +93,12 @@ TEST (DecodeVerifyExp, NotImmatureSignatureTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}})}; obj.add_claim(jwt::registered_claims::not_before, std::chrono::system_clock::now() - std::chrono::seconds{10}); auto enc_str = obj.signature(); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), secret("secret")); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), secret("secret")); (void)dec_obj; } @@ -106,12 +106,12 @@ TEST (DecodeVerifyExp, ImmatureSignatureTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}})}; obj.add_claim(jwt::registered_claims::not_before, std::chrono::system_clock::now() + std::chrono::seconds{10}); auto enc_str = obj.signature(); - EXPECT_THROW (jwt::decode(enc_str, algorithms({"hs256"}), secret("secret")), + EXPECT_THROW (jwt::decode(enc_str, algorithms({"HS256"}), secret("secret")), jwt::ImmatureSignatureError); } @@ -119,12 +119,12 @@ TEST (DecodeVerifyExp, ImmatureSignatureTestWithLeeway) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}})}; obj.add_claim(jwt::registered_claims::not_before, std::chrono::system_clock::now() + std::chrono::seconds{10}); auto enc_str = obj.signature(); - auto dec_obj = jwt::decode(enc_str, algorithms({"hs256"}), secret("secret"), leeway(10)); + auto dec_obj = jwt::decode(enc_str, algorithms({"HS256"}), secret("secret"), leeway(10)); (void)dec_obj; } @@ -132,11 +132,11 @@ TEST (DecodeVerifyExp, InvalidAudienceTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}, {"aud", "www"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}, {"aud", "www"}})}; auto enc_str = obj.signature(); - EXPECT_THROW (jwt::decode(enc_str, algorithms({"hs256"}), secret("secret"), aud("ww")), + EXPECT_THROW (jwt::decode(enc_str, algorithms({"HS256"}), secret("secret"), aud("ww")), jwt::InvalidAudienceError); } @@ -147,7 +147,7 @@ TEST (DecodeVerifyExp, InvalidSignatureTest) const char* inv_enc_str = "eyJhbGciOiJOT05FIiwidHlwIjoiSldUIn0.eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjoxNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ"; - EXPECT_THROW (jwt::decode(inv_enc_str, algorithms({"none", "hs256"})), + EXPECT_THROW (jwt::decode(inv_enc_str, algorithms({"none", "HS256"})), jwt::SignatureFormatError); } @@ -160,7 +160,7 @@ TEST (DecodeVerifyExp, KeyNotPresentTest) "eyJpYXQiOjE1MTM4NjIzNzEsImlkIjoiYS1iLWMtZC1lLWYtMS0yLTMiLCJpc3MiOiJhcnVuLm11cmFsaWRoYXJhbiIsInN1YiI6ImFkbWluIn0." "jk7bRQKTLvs1RcuvMc2B_rt6WBYPoVPirYi_QRBPiuk"; - EXPECT_THROW (jwt::decode(enc_str, algorithms({"none", "hs256"}), verify(true)), + EXPECT_THROW (jwt::decode(enc_str, algorithms({"none", "HS256"}), verify(true)), jwt::KeyNotPresentError); } @@ -168,11 +168,11 @@ TEST (DecodeVerifyExp, InvalidSubjectTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret"), payload({{"sub", "test"}, {"aud", "www"}})}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret"), payload({{"sub", "test"}, {"aud", "www"}})}; auto enc_str = obj.signature(); - EXPECT_THROW (jwt::decode(enc_str, algorithms({"hs256"}), secret("secret"), sub("TEST")), + EXPECT_THROW (jwt::decode(enc_str, algorithms({"HS256"}), secret("secret"), sub("TEST")), jwt::InvalidSubjectError); } diff --git a/tests/test_jwt_encode.cc b/tests/test_jwt_encode.cc index f3c2976..1f4396f 100644 --- a/tests/test_jwt_encode.cc +++ b/tests/test_jwt_encode.cc @@ -8,7 +8,7 @@ TEST (EncodeTest, TestRemoveClaim) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret")}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret")}; obj.add_claim("iss", "arun.muralidharan") .add_claim("sub", "admin") @@ -29,7 +29,7 @@ TEST (EncodeTest, TestRemoveTypHeader) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret")}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret")}; obj.add_claim("iss", "arun.muralidharan") .add_claim("sub", "admin") @@ -49,12 +49,12 @@ TEST (EncodeTest, StrEncodeHS256_1) { using namespace jwt::params; - const char* expected_sign = + const char* expected_sign = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9." "eyJpYXQiOjE1MTM4NjIzNzEsImlkIjoiYS1iLWMtZC1lLWYtMS0yLTMiLCJpc3MiOiJhcnVuLm11cmFsaWRoYXJhbiIsInN1YiI6ImFkbWluIn0." "jk7bRQKTLvs1RcuvMc2B_rt6WBYPoVPirYi_QRBPiuk"; - jwt::jwt_object obj{algorithm("hs256"), secret("secret")}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret")}; obj.add_claim("iss", "arun.muralidharan") .add_claim("sub", "admin") @@ -102,7 +102,7 @@ TEST (EncodeTest, StrEncodeNONE) { using namespace jwt::params; - const char* expected_sign = + const char* expected_sign = "eyJhbGciOiJOT05FIiwidHlwIjoiSldUIn0.eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjoxNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ."; jwt::jwt_object obj{algorithm("none")}; @@ -124,7 +124,7 @@ TEST (EncodeTest, StrEncodeHS256WithKey) { using namespace jwt::params; - const char* expected_sign = + const char* expected_sign = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9." "eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjoxNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ." "W6t7mUX6ZJwOVTsVhHSKyBSwi0wnibobdsk456wSmJg"; @@ -149,7 +149,7 @@ TEST (EncodeTest, StrEncodeHS384WithKey) using namespace jwt::params; - const char* expected_sign = + const char* expected_sign = "eyJhbGciOiJIUzM4NCIsInR5cCI6IkpXVCJ9." "eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjoxNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ." "cGN4FZCe9Y2c1dA-jP71IXGnYbJRc4OaUTa5m7N7ybF5h6wBwxWQ-pdcxYchjDBL"; @@ -173,7 +173,7 @@ TEST (EncodeTest, StrEncodeHS512WithKey) { using namespace jwt::params; - const char* expected_sign = + const char* expected_sign = "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9." "eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjoxNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ." "vQ-1JSFN1kPjUI3URP6AFK5z8V7xLhyhw-76QWhQg9Xcy-IgrJ-bCTYLBjgaprrcEWwpSnBQnP3QnIxYK0HEaQ"; @@ -199,7 +199,7 @@ TEST (EncodeTest, StrEncodeChangeAlg) { using namespace jwt::params; - const char* expected_none_sign = + const char* expected_none_sign = "eyJhbGciOiJOT05FIiwidHlwIjoiSldUIn0.eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjoxNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ."; jwt::string_view key = "00112233445566778899"; @@ -242,7 +242,7 @@ TEST (EncodeTest, StrEncodeNoneAlgWithKey) const jwt::string_view secret1 = "abcdefghijklmnopqrstuvwxyz"; const jwt::string_view secret2 = "0123456789qwertybabe"; - jwt::jwt_object obj{algorithm("NONE"), + jwt::jwt_object obj{algorithm("none"), payload({{"iss", "arn-ml"}}), secret(secret1)}; @@ -261,7 +261,7 @@ TEST (EncodeTest, OverwriteClaimsTest) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("NONE"), + jwt::jwt_object obj{algorithm("none"), payload({ {"iss", "arn-ml"}, {"x-pld1", "data1"}, @@ -312,7 +312,7 @@ TEST (EncodeTest, HeaderParamTest) std::cout << dec_obj.header() << std::endl; } -int main(int argc, char **argv) +int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); diff --git a/tests/test_jwt_es.cc b/tests/test_jwt_es.cc index 085cfd1..04ad254 100644 --- a/tests/test_jwt_es.cc +++ b/tests/test_jwt_es.cc @@ -53,7 +53,7 @@ TEST (ESAlgo, ES256EncodingDecodingTest) key = read_from_file(EC384_PUB_KEY); ASSERT_TRUE (key.length()); - auto dec_obj = jwt::decode(enc_str, algorithms({"es256"}), ec, verify(false), secret(key)); + auto dec_obj = jwt::decode(enc_str, algorithms({"ES256"}), ec, verify(false), secret(key)); EXPECT_FALSE (ec); EXPECT_EQ (dec_obj.header().algo(), jwt::algorithm::ES256); @@ -83,7 +83,7 @@ TEST (ESAlgo, ES384EncodingDecodingTest) key = read_from_file(EC384_PUB_KEY); ASSERT_TRUE (key.length()); - auto dec_obj = jwt::decode(enc_str, algorithms({"es384"}), verify(false), secret(key)); + auto dec_obj = jwt::decode(enc_str, algorithms({"ES384"}), verify(false), secret(key)); EXPECT_EQ (dec_obj.header().algo(), jwt::algorithm::ES384); } @@ -107,7 +107,7 @@ TEST (ESAlgo, ES512EncodingDecodingTest) key = read_from_file(EC384_PUB_KEY); ASSERT_TRUE (key.length()); - auto dec_obj = jwt::decode(enc_str, algorithms({"es512"}), verify(false), secret(key)); + auto dec_obj = jwt::decode(enc_str, algorithms({"ES512"}), verify(false), secret(key)); EXPECT_EQ (dec_obj.header().algo(), jwt::algorithm::ES512); } @@ -131,7 +131,7 @@ TEST (ESAlgo, ES384EncodingDecodingValidTest) key = read_from_file(EC384_PUB_KEY); ASSERT_TRUE (key.length()); - auto dec_obj = jwt::decode(enc_str, algorithms({"es384"}), verify(true), secret(key)); + auto dec_obj = jwt::decode(enc_str, algorithms({"ES384"}), verify(true), secret(key)); EXPECT_EQ (dec_obj.header().algo(), jwt::algorithm::ES384); EXPECT_TRUE (dec_obj.has_claim("exp")); @@ -139,11 +139,11 @@ TEST (ESAlgo, ES384EncodingDecodingValidTest) std::map keystore{{"arun.muralidharan", key}}; - auto l = [&keystore](const jwt::jwt_payload& payload){ + auto l = [&keystore](const jwt::jwt_payload& payload){ auto iss = payload.get_claim_value("iss"); return keystore[iss]; }; - auto dec_obj2 = jwt::decode(enc_str, algorithms({"es384"}), verify(true), secret(l)); + auto dec_obj2 = jwt::decode(enc_str, algorithms({"ES384"}), verify(true), secret(l)); EXPECT_EQ (dec_obj2.header().algo(), jwt::algorithm::ES384); } diff --git a/tests/test_jwt_object.cc b/tests/test_jwt_object.cc index 5b19955..ead0c4b 100644 --- a/tests/test_jwt_object.cc +++ b/tests/test_jwt_object.cc @@ -17,7 +17,7 @@ TEST (ObjectTest, MoveConstructor) { using namespace jwt::params; - jwt::jwt_object obj{algorithm("hs256"), secret("secret")}; + jwt::jwt_object obj{algorithm("HS256"), secret("secret")}; obj.add_claim("iss", "arun.muralidharan"); @@ -28,7 +28,7 @@ TEST (ObjectTest, MoveConstructor) EXPECT_TRUE(wrapper.object.payload().has_claim_with_value("iss", "arun.muralidharan")); } -int main(int argc, char **argv) +int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); diff --git a/tests/test_jwt_rsa.cc b/tests/test_jwt_rsa.cc index aca52f9..2486c7d 100644 --- a/tests/test_jwt_rsa.cc +++ b/tests/test_jwt_rsa.cc @@ -40,7 +40,7 @@ TEST (RSAAlgo, RSA256EncodingDecodingTest) { using namespace jwt::params; - const char* expected_sign = + const char* expected_sign = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJhbGwiLCJleHAiOjE1MTM4NjIzNzEsImlzcyI6ImFydW4ubXVyYWxpZGhhcmFuIn0.jr-Nrny0yGFuIUH8zHLuxpGH5aClwQVin2As2ISsgclu-9IDi1cVCtloIUNRb_ock6X7X41FtGMA_lt_T9wGyLmMzNf4Vu7OPBGfzjEdCHKD8OgcvI0Z4qw7_TFuXEuNSnbwkYFZ9S2g8uPzO0raVk4aIuczo58btwEDrsoE7TNBMTHjfL92zZ90YcFqW5WZKn9Y_dF1rb5UXARF6YSzzVjaNC86FWUl86wwo9cir0nxVPD4zKol_x2xyiP6n4n-sUX0_dM_-KMSfDqdr34quq3ZxcP5vjT-8FWb4t_IWHBmLrNsjS1so9a_5u7vcSBX1llX9Vgztv0zB7B8rEkFTw"; std::string key = read_from_file(RSA256_PRIV_KEY); @@ -63,7 +63,7 @@ TEST (RSAAlgo, RSA256EncodingDecodingTest) key = read_from_file(RSA256_PUB_KEY); ASSERT_TRUE (key.length()); - auto dec_obj = jwt::decode(enc_str, algorithms({"rs256"}), ec, verify(false), secret(key)); + auto dec_obj = jwt::decode(enc_str, algorithms({"RS256"}), ec, verify(false), secret(key)); EXPECT_FALSE (ec); } @@ -74,7 +74,7 @@ TEST (RSAAlgo, RSA384EncodingDecodingTest) std::string key = read_from_file(RSA384_PRIV_KEY); ASSERT_TRUE (key.length()); - const char* expected_str = + const char* expected_str = "eyJhbGciOiJSUzM4NCIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJhbGwiLCJleHAiOjE1MTM4NjIzNzIsImlzcyI6ImFydW4ubXVyYWxpZGhhcmFuIn0.iXQyGTmHAjdfXXgcMZn31xqv05h8Qoa3GGlSF5-42kPkd6iLPWzxky15FFW8qkvO-DiXDpOM4BoDANYCKNTSOToyuhCZ6dn_WH8RQzU6KOqRccYe2Fgvo7XnrgE_iHIMYPejc2kAUh1xLpE31WCU2P1afo2KN_-DV7kCmDJY6qpFtCctbbPNOhv6XbYpQlTblZeYDh1HVO--KWuhYl17kgjj3W-3fEoQjgaiprZ_JsTxRTN05aGT_AY15-FW0jPgPPBw5FnIX6P-j18F3BrG-lji7BuNrvyCUT3ZX35yBkBv9Ri5B3SLALy2bD0qGGE_G9_Orfm9yU9oQySLMO1qLiMbKLakLB5kMSy049C2Pdx9Nz47hqQWOHOWNRGwwTkKAwjeu1dTjv14QOmLcefM6GoXoCMZaFcmEqr63CgyLrnlsVS6vLkazyWcKD6eg51vPa8Rnn1V5u1EgNNnT6nU6iZ9_POJcf9_s-7HNpAXtlckia-OIrdLG-5cm93h1rAfVois43m0EwNtTr_DZ2JDtM9BifaS5MsktztUjrh1hjF5vDLBQc8vAYX0YbWOx_0NTn0aRYzOZ9kIhFxkaY320h8AS_7iFa5sA-ygeJdR-EvdlUZcoRzPzQFkrtatK-UE_VlSisUCsqoxHefx799aNjqz4FDLcyQRekdmVMb8Ew8"; jwt::jwt_object obj{algorithm("RS384"), secret(key)}; @@ -91,7 +91,7 @@ TEST (RSAAlgo, RSA384EncodingDecodingTest) key = read_from_file(RSA384_PUB_KEY); ASSERT_TRUE (key.length()); - auto dec_obj = jwt::decode(enc_str, algorithms({"none", "hs384", "rs384"}), verify(false), secret(key)); + auto dec_obj = jwt::decode(enc_str, algorithms({"none", "HS384", "RS384"}), verify(false), secret(key)); EXPECT_EQ (dec_obj.header().algo(), jwt::algorithm::RS384); } @@ -99,7 +99,7 @@ TEST (RSAAlgo, RSA512EncodingDecodingTest) { using namespace jwt::params; - const char* expected_str = + const char* expected_str = "eyJhbGciOiJSUzUxMiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJhbGwiLCJleHAiOjE1MTM4NjIzNzIsImlzcyI6ImFydW4ubXVyYWxpZGhhcmFuIn0.ZNkLnf565-NFfxkbosJra1CJEgCLFf0jmgb7Q8eZrzxIrE4C4dOjpGD13f0jm2FqidUxAvFVrHI2ahhZi4Bu65qQtV4mVVftiD0qTaYzh26ql0MFqTKYEeKtU0kFXAzH7f9689z7mQ2n8aw7H8WHrfe17ub19Xyj-MirCECcWjcuGWBhsdz0y-dKy_GJYnpf8mHvmQAjkH5ynUV5NXHIBDO6eKssxX36Ow9_KYZ1HrCCUT_B-TQfNrnHAJgCydO-cX9iaAxV5aKvOdMGopHz14fX4oI9qH4aBzcroRbs77UsJZ-CMoRnUoXQP7DPORvEEUOQepANu9gqmymfJin8oEDotlj7eoJkFD3j64dkMT2bnRe8k2akPgUiDTeIrvNBuOIMDJtekoVpTo0fytveeDVPpDli9uX6DkJW1GGFLSRR-J-I8WbKRMKadmKOpDn3LF71hOo2mcXAsSwleFi9xB39bLBKJcqL_DtBoZBt0QSqMs6nRVj1U-3vYtuaa_eM3TfxhWWPZULaGVaVfpefRGdqtjrU0z5oO_vjviYujXK5_vM8zTroLVEaOyJYCeh2h_5N5LaOlf8BDu2PF3epNuCmM7G2PWEH7aPn5o-vvKTg_SM32jJXbXp2gkplEdQIWFh3jtjcRe9wNa9aPJE3I1hn1ZbqiAGUzBLWYUYpvstWXGbmxOoh6FkNJERb2hOIZgGLMvwWZXUU3GICcI5DMFOdDsuANpLg5FygsQ68JpuqKrUxu1Yh55--GHuDI7tqdHsPhPUzTmZrSvRog0w07dUAZCIBsGsSLX3wViobWbpVuY4pB7KXGIfdXgLfLgcERe_CxtnoPGF36zsqBflSXcqXwJ4qRK6BpTvKyUXf6pWEWOnuKomk8aENbT6nTr7naRJb5L3J4zhE-5O_Yetw9aCTzy9vN8a22n0JHXeroAwTpLR_wsQwDPwN-K99JVUKwR-FvOkJhE7_wwbUXmjiacKjXrwQ0OWnhXigQRLfdHG2OyH6_It5dpBmBOyWx2X-tfQ6Wz-_2bKCALl487Amq56hhNJhbQuJFIR59RylVAWKmfeeno2qcTZgrI_mO3PJCCUxBn5hK81HJuOtZ4YmeDHPvLW8Tiv5KqfRMWJKhyFthB74FvUINiEn0jvbuLR3YuyTgpf22lohT4-mHq5FrEd3plGvj0fVI_zeGhAFBhQYMW-MAJo7oylTOMtSZ1JHHuvBPR6FvMTgaPTAum6Dsl-I4_O_OKgtgovefBgwh4TOm_vsJmjVYFRr0Eo3OqsfNw3OwSKnuv5I76thh6DN879UZiyJG_7lcz_L6d0g4fGCvdM45zgQp3U3l8fJN1MRYCx5mxJAYeVlnCpmqueuww"; std::string key = read_from_file(RSA512_PRIV_KEY); @@ -118,7 +118,7 @@ TEST (RSAAlgo, RSA512EncodingDecodingTest) key = read_from_file(RSA512_PUB_KEY); ASSERT_TRUE (key.length()); - auto dec_obj = jwt::decode(enc_str, algorithms({"none", "hs384", "rs512"}), verify(false), secret(key)); + auto dec_obj = jwt::decode(enc_str, algorithms({"none", "HS384", "RS512"}), verify(false), secret(key)); EXPECT_EQ (dec_obj.header().algo(), jwt::algorithm::RS512); } @@ -139,7 +139,7 @@ TEST (RSAAlgo, NoSpecificAlgo) key = read_from_file(RSA512_PUB_KEY); ASSERT_TRUE (key.length()); - EXPECT_THROW (jwt::decode(enc_str, algorithms({"none", "hs384", "rs384"}), verify(true), secret(key)), + EXPECT_THROW (jwt::decode(enc_str, algorithms({"none", "HS384", "RS384"}), verify(true), secret(key)), jwt::InvalidAlgorithmError); } From de69fd2133400635cdc84231d065e806d18829be Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 09:21:52 +0100 Subject: [PATCH 05/21] build: improve cmake scripts --- .gitignore | 1 + CMakeLists.txt | 81 ++++++++++++++++++++++++++++++++--------- examples/CMakeLists.txt | 30 +++++++++------ tests/CMakeLists.txt | 16 ++++---- 4 files changed, 90 insertions(+), 38 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f3d6549 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/build/ \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 07810da..9f1a58a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,26 +1,73 @@ -# CMakeLists files in this project can -# refer to the root source directory of the project as ${HELLO_SOURCE_DIR} and -# to the root binary directory of the project as ${HELLO_BINARY_DIR}. +cmake_minimum_required(VERSION 3.5.0) +project(cpp-jwt) -cmake_minimum_required (VERSION 2.8.11) -project (cpp-jwt) +option(CPP_JWT_BUILD_EXAMPLES "build examples" ON) +option(CPP_JWT_BUILD_TESTS "build examples" ON) -#SET (CMAKE_CXX_COMPILER /usr/local/bin/g++) -SET( CMAKE_CXX_FLAGS "-std=c++14 -Wall -Wextra" ) +# only set compiler flags if we are the main project, otherwise let the main +# project decide on the flags +if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Wextra") +else() -include_directories (include) +endif() find_package(OpenSSL REQUIRED) -include_directories(${OPENSSL_INCLUDE_DIR}) -find_package(GTest REQUIRED) -include_directories(${GTEST_INCLUDE_DIRS}) +# ############################################################################## +# LIBRARY +# ############################################################################## -enable_testing() +add_library(${PROJECT_NAME} INTERFACE) +target_include_directories( + ${PROJECT_NAME} + INTERFACE $ + $) +target_link_libraries(${PROJECT_NAME} INTERFACE OpenSSL::SSL) +target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_14) -# Recurse into the "Hello" and "Demo" subdirectories. This does not actually -# cause another cmake executable to run. The same process will walk through -# the project's entire directory structure. -add_subdirectory (tests) +# ############################################################################## +# TESTS +# ############################################################################## -add_subdirectory (examples) +if(CPP_JWT_BUILD_TESTS) + find_package(GTest REQUIRED) + include_directories(${GTEST_INCLUDE_DIRS}) + enable_testing() + # Recurse into the "Hello" and "Demo" subdirectories. This does not actually + # cause another cmake executable to run. The same process will walk through + # the project's entire directory structure. + add_subdirectory(tests) +endif() + +# ############################################################################## +# EXAMPLES +# ############################################################################## + +if(CPP_JWT_BUILD_EXAMPLES) + add_subdirectory(examples) +endif() + +# ############################################################################## +# INSTALL +# ############################################################################## + +include(GNUInstallDirs) +install( + TARGETS ${PROJECT_NAME} + EXPORT ${PROJECT_NAME}_Targets + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) + +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/jwt/detail + DESTINATION include/jwt) +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/jwt/impl + DESTINATION include/jwt) +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/jwt/json + DESTINATION include/jwt) +install( + DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/jwt/ + DESTINATION include/jwt + FILES_MATCHING + PATTERN "*.hpp") diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 9180a01..a1e4094 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,18 +1,24 @@ - -include_directories(${OPENSSL_INCLUDE_DIR}) - -SET(CERT_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/rsa_256") -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCERT_ROOT_DIR=\"\\\"${CERT_ROOT_DIR}\\\"\"") +set(CERT_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/rsa_256") +set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -DCERT_ROOT_DIR=\"\\\"${CERT_ROOT_DIR}\\\"\"") add_executable(simple_ex1 simple_ex1.cc) -target_link_libraries(simple_ex1 ${OPENSSL_LIBRARIES} ${GTEST_LIBRARIES}) -add_test(NAME simple_ex1 COMMAND ./simple_ex1 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +target_link_libraries(simple_ex1 OpenSSL::SSL ${PROJECT_NAME}) +add_test( + NAME simple_ex1 + COMMAND ./simple_ex1 + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(simple_ex2 simple_ex2.cc) -target_link_libraries(simple_ex2 ${OPENSSL_LIBRARIES} ${GTEST_LIBRARIES}) -add_test(NAME simple_ex2 COMMAND ./simple_ex2 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +target_link_libraries(simple_ex2 OpenSSL::SSL ${PROJECT_NAME}) +add_test( + NAME simple_ex2 + COMMAND ./simple_ex2 + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(simple_ex3_rsa simple_ex3_rsa.cc) -target_link_libraries(simple_ex3_rsa ${OPENSSL_LIBRARIES} ${GTEST_LIBRARIES}) -add_test(NAME simple_ex3_rsa COMMAND ./simple_ex3_rsa WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - +target_link_libraries(simple_ex3_rsa OpenSSL::SSL ${PROJECT_NAME}) +add_test( + NAME simple_ex3_rsa + COMMAND ./simple_ex3_rsa + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 1ee5201..48cf4b8 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,33 +1,31 @@ -include_directories(${OPENSSL_INCLUDE_DIR}) - SET(CERT_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/certs") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCERT_ROOT_DIR=\"\\\"${CERT_ROOT_DIR}\\\"\"") add_executable(test_jwt_object test_jwt_object.cc) -target_link_libraries(test_jwt_object ${OPENSSL_LIBRARIES} ${GTEST_LIBRARIES}) +target_link_libraries(test_jwt_object OpenSSL::SSL GTest::GTest GTest::Main ${PROJECT_NAME}) add_test(NAME test_jwt_object COMMAND ./test_jwt_object WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_jwt_encode test_jwt_encode.cc) -target_link_libraries(test_jwt_encode ${OPENSSL_LIBRARIES} ${GTEST_LIBRARIES}) +target_link_libraries(test_jwt_encode OpenSSL::SSL GTest::GTest GTest::Main ${PROJECT_NAME}) add_test(NAME test_jwt_encode COMMAND ./test_jwt_encode WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_jwt_decode test_jwt_decode.cc) -target_link_libraries(test_jwt_decode ${OPENSSL_LIBRARIES} ${GTEST_LIBRARIES}) +target_link_libraries(test_jwt_decode OpenSSL::SSL GTest::GTest GTest::Main ${PROJECT_NAME}) add_test(NAME test_jwt_decode COMMAND ./test_jwt_decode WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_jwt_decode_verifiy test_jwt_decode_verifiy.cc) -target_link_libraries(test_jwt_decode_verifiy ${OPENSSL_LIBRARIES} ${GTEST_LIBRARIES}) +target_link_libraries(test_jwt_decode_verifiy OpenSSL::SSL GTest::GTest GTest::Main ${PROJECT_NAME}) add_test(NAME test_jwt_decode_verifiy COMMAND ./test_jwt_decode_verifiy WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_jwt_decode_verifiy_with_exception test_jwt_decode_verifiy_with_exception.cc) -target_link_libraries(test_jwt_decode_verifiy_with_exception ${OPENSSL_LIBRARIES} ${GTEST_LIBRARIES}) +target_link_libraries(test_jwt_decode_verifiy_with_exception OpenSSL::SSL GTest::GTest GTest::Main ${PROJECT_NAME}) add_test(NAME test_jwt_decode_verifiy_with_exception COMMAND ./test_jwt_decode_verifiy_with_exception WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_jwt_rsa test_jwt_rsa.cc) -target_link_libraries(test_jwt_rsa ${OPENSSL_LIBRARIES} ${GTEST_LIBRARIES} ) +target_link_libraries(test_jwt_rsa OpenSSL::SSL GTest::GTest GTest::Main ${PROJECT_NAME}) add_test(NAME test_jwt_rsa COMMAND ./test_jwt_rsa WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_jwt_es test_jwt_es.cc) -target_link_libraries(test_jwt_es ${OPENSSL_LIBRARIES} ${GTEST_LIBRARIES}) +target_link_libraries(test_jwt_es OpenSSL::SSL GTest::GTest GTest::Main ${PROJECT_NAME}) add_test(NAME test_jwt_es COMMAND ./test_jwt_es WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) From 564e9f8d23f5bd9b422ca141a5edaab75574e293 Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 10:29:57 +0100 Subject: [PATCH 06/21] build: add support for conan and make vendored json optional --- CMakeLists.txt | 14 +++++++++++++- README.md | 23 +++++++++++++++++++---- conanfile.txt | 10 ++++++++++ include/jwt/json/test_json.cc | 5 ++++- include/jwt/jwt.hpp | 5 ++++- 5 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 conanfile.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 9f1a58a..bffe31d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,11 @@ cmake_minimum_required(VERSION 3.5.0) project(cpp-jwt) option(CPP_JWT_BUILD_EXAMPLES "build examples" ON) -option(CPP_JWT_BUILD_TESTS "build examples" ON) +option(CPP_JWT_BUILD_TESTS "build tests" ON) +option(CPP_JWT_USE_VENDORED_NLOHMANN_JSON "use vendored json header" ON) + +list(APPEND CMAKE_MODULE_PATH ${CMAKE_BINARY_DIR}) +list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_BINARY_DIR}) # only set compiler flags if we are the main project, otherwise let the main # project decide on the flags @@ -14,6 +18,10 @@ endif() find_package(OpenSSL REQUIRED) +if(NOT CPP_JWT_USE_VENDORED_NLOHMANN_JSON) + find_package(nlohmann_json REQUIRED) +endif() + # ############################################################################## # LIBRARY # ############################################################################## @@ -24,6 +32,10 @@ target_include_directories( INTERFACE $ $) target_link_libraries(${PROJECT_NAME} INTERFACE OpenSSL::SSL) +if(NOT CPP_JWT_USE_VENDORED_NLOHMANN_JSON) + target_link_libraries(${PROJECT_NAME} INTERFACE nlohmann_json::nlohmann_json) + add_definitions(-DCPP_JWT_USE_VENDORED_NLOHMANN_JSON) +endif() target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_14) # ############################################################################## diff --git a/README.md b/README.md index 682789d..1cdff6e 100644 --- a/README.md +++ b/README.md @@ -209,12 +209,27 @@ Tested with clang-5.0 and g++-6.4. With issue#12, VS2017 is also supported. ## Installation -Use the C++ package manager..... just kidding :) -This is a header only library, so you can just add it to your include path and start using it. The only somewhat tricky part is to link it with openssl library. Check out the cmake file for building it properly. -For example one can run cmake like: +### using conan + +```shell +mkdir build +cd build +conan install .. --build missing +cmake .. +cmake --build . -j ``` -cmake -DOPENSSL_ROOT_DIR=/usr/local/Cellar/openssl/1.0.2j -DGTEST_ROOT=$HOME/googletest + +### using debian + +```shell +sudo apt install nlohmann-json3-dev +sudo apt install libgtest-dev +sudo apt install libssl-dev +mkdir build +cd build +cmake .. +cmake --build . -j ``` ## Parameters diff --git a/conanfile.txt b/conanfile.txt new file mode 100644 index 0000000..b7af822 --- /dev/null +++ b/conanfile.txt @@ -0,0 +1,10 @@ +[requires] +gtest/1.10.0 +nlohmann_json/3.7.0 +openssl/1.1.1d + +[generators] +cmake_find_package +cmake_paths + +[options] diff --git a/include/jwt/json/test_json.cc b/include/jwt/json/test_json.cc index 869d24f..d1ea502 100644 --- a/include/jwt/json/test_json.cc +++ b/include/jwt/json/test_json.cc @@ -1,7 +1,10 @@ #include #include +#if defined( CPP_JWT_USE_VENDORED_NLOHMANN_JSON) #include "./json.hpp" - +#else +#include "nlohmann/json.hpp" +#endif using json = nlohmann::json; void basic_json_test() diff --git a/include/jwt/jwt.hpp b/include/jwt/jwt.hpp index 3c90549..3d00162 100644 --- a/include/jwt/jwt.hpp +++ b/include/jwt/jwt.hpp @@ -38,8 +38,11 @@ SOFTWARE. #include "jwt/string_view.hpp" #include "jwt/parameters.hpp" #include "jwt/exceptions.hpp" +#if defined(CPP_JWT_USE_VENDORED_NLOHMANN_JSON) #include "jwt/json/json.hpp" - +#else +#include "nlohmann/json.hpp" +#endif // For convenience using json_t = nlohmann::json; using system_time_t = std::chrono::time_point; From bc98be0883ac4c7da276a28334360c35dd80f570 Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 11:21:17 +0100 Subject: [PATCH 07/21] test: add github pipelines --- .github/workflows/main.yml | 46 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 .github/workflows/main.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..3da0aa2 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,46 @@ +name: CMake + +on: [push] + +env: + # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.) + BUILD_TYPE: RelWithDebInfo + +jobs: + build: + + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [windows-latest, ubuntu-latest, macOS-latest] + + steps: + - uses: actions/checkout@v1 + + - name: Create Build Environment + # Some projects don't allow in-source building, so create a separate build directory + # We'll use this as our working directory for all subsequent commands + run: cmake -E make_directory ${{runner.workspace}}/build + + - name: Configure CMake + # Use a bash shell so we can use the same syntax for environment variable + # access regardless of the host operating system + shell: bash + working-directory: ${{runner.workspace}}/build + # Note the current convention is to use the -S and -B options here to specify source + # and build directories, but this is only available with CMake 3.13 and higher. + # The CMake binaries on the Github Actions machines are (as of this writing) 3.12 + run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE + + - name: Build + working-directory: ${{runner.workspace}}/build + shell: bash + # Execute the build. You can specify a specific target with "--target " + run: cmake --build . --config $BUILD_TYPE + + - name: Test + working-directory: ${{runner.workspace}}/build + shell: bash + # Execute tests defined by the CMake configuration. + # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail + run: make tests && ./tests \ No newline at end of file From 3b4ccc006d3c288e6d3ae2afc53e1d83bedc10b2 Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 12:36:47 +0100 Subject: [PATCH 08/21] install conan before pipeline --- .github/workflows/main.yml | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3da0aa2..58ce079 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,30 +17,27 @@ jobs: steps: - uses: actions/checkout@v1 + - name: install install + run: pip install conan + - name: Create Build Environment - # Some projects don't allow in-source building, so create a separate build directory - # We'll use this as our working directory for all subsequent commands run: cmake -E make_directory ${{runner.workspace}}/build + - name: Install conan dependencies + working-directory: ${{runner.workspace}}/build + run: conan install .. --build missing + - name: Configure CMake - # Use a bash shell so we can use the same syntax for environment variable - # access regardless of the host operating system shell: bash working-directory: ${{runner.workspace}}/build - # Note the current convention is to use the -S and -B options here to specify source - # and build directories, but this is only available with CMake 3.13 and higher. - # The CMake binaries on the Github Actions machines are (as of this writing) 3.12 run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE - name: Build working-directory: ${{runner.workspace}}/build shell: bash - # Execute the build. You can specify a specific target with "--target " run: cmake --build . --config $BUILD_TYPE - name: Test working-directory: ${{runner.workspace}}/build shell: bash - # Execute tests defined by the CMake configuration. - # See https://cmake.org/cmake/help/latest/manual/ctest.1.html for more detail - run: make tests && ./tests \ No newline at end of file + run: make tests && ./tests From 6cc879005592d8dc79698dcd0a16af2d27dcae13 Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 12:40:05 +0100 Subject: [PATCH 09/21] ci: use pip3 for python --- .github/workflows/main.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 58ce079..153b6db 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -17,8 +17,8 @@ jobs: steps: - uses: actions/checkout@v1 - - name: install install - run: pip install conan + - name: install conan + run: pip3 install conan - name: Create Build Environment run: cmake -E make_directory ${{runner.workspace}}/build From a4dc07112c46fa33a2b49ca47dd71643034ffb79 Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 12:49:36 +0100 Subject: [PATCH 10/21] ci: install setup tools --- .github/workflows/main.yml | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 153b6db..c1dbc47 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,13 +12,32 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [windows-latest, ubuntu-latest, macOS-latest] + os: [windows-latest, ubuntu-latest] steps: - uses: actions/checkout@v1 - - name: install conan - run: pip3 install conan + - uses: actions/setup-python@v1 + with: + python-version: '3.x' + + - name: Install tools (Linux) + if: startsWith(runner.os, 'Linux') + run: | + sudo apt-get install python3-setuptools python3-wheel python3-pip + shell: bash + + - name: Install conan (Linux) + if: startsWith(runner.os, 'Linux') + run: | + sudo pip3 install conan --upgrade + shell: bash + + - name: Install conan (Windows) + if: startsWith(runner.os, 'Windows') + run: | + pip3 install conan --upgrade + shell: bash - name: Create Build Environment run: cmake -E make_directory ${{runner.workspace}}/build From 7df9127c00d568a59fb66af3435c329a622b3bea Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 12:55:12 +0100 Subject: [PATCH 11/21] chore: initialize conan profile --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c1dbc47..44f2c3b 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -44,7 +44,7 @@ jobs: - name: Install conan dependencies working-directory: ${{runner.workspace}}/build - run: conan install .. --build missing + run: conan profile new default --detect && conan install .. --build missing - name: Configure CMake shell: bash From 92818726b5d15db2dd9bcaad48a468cc157f46c4 Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 13:04:36 +0100 Subject: [PATCH 12/21] chore: use env variable for git workspace --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 44f2c3b..d6ade01 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -44,7 +44,7 @@ jobs: - name: Install conan dependencies working-directory: ${{runner.workspace}}/build - run: conan profile new default --detect && conan install .. --build missing + run: conan profile new default --detect && conan install $GITHUB_WORKSPACE --build missing - name: Configure CMake shell: bash From d4b5525eb9d10305e39bf90731a7e6bc5f203616 Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 13:16:44 +0100 Subject: [PATCH 13/21] chore: use old lib variables for cmake --- CMakeLists.txt | 7 +++-- examples/CMakeLists.txt | 6 ++-- tests/CMakeLists.txt | 69 ++++++++++++++++++++++++++++++----------- 3 files changed, 58 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bffe31d..c3f2db6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,7 @@ endif() find_package(OpenSSL REQUIRED) if(NOT CPP_JWT_USE_VENDORED_NLOHMANN_JSON) - find_package(nlohmann_json REQUIRED) + find_package(nlohmann_json REQUIRED) endif() # ############################################################################## @@ -30,8 +30,9 @@ add_library(${PROJECT_NAME} INTERFACE) target_include_directories( ${PROJECT_NAME} INTERFACE $ - $) -target_link_libraries(${PROJECT_NAME} INTERFACE OpenSSL::SSL) + $ + ${OpenSSL_INCLUDE_DIR}) +target_link_libraries(${PROJECT_NAME} INTERFACE ${OpenSSL_LIBRARIES}) if(NOT CPP_JWT_USE_VENDORED_NLOHMANN_JSON) target_link_libraries(${PROJECT_NAME} INTERFACE nlohmann_json::nlohmann_json) add_definitions(-DCPP_JWT_USE_VENDORED_NLOHMANN_JSON) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index a1e4094..12245d9 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -3,21 +3,21 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCERT_ROOT_DIR=\"\\\"${CERT_ROOT_DIR}\\\"\"") add_executable(simple_ex1 simple_ex1.cc) -target_link_libraries(simple_ex1 OpenSSL::SSL ${PROJECT_NAME}) +target_link_libraries(simple_ex1 ${PROJECT_NAME}) add_test( NAME simple_ex1 COMMAND ./simple_ex1 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(simple_ex2 simple_ex2.cc) -target_link_libraries(simple_ex2 OpenSSL::SSL ${PROJECT_NAME}) +target_link_libraries(simple_ex2 ${PROJECT_NAME}) add_test( NAME simple_ex2 COMMAND ./simple_ex2 WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(simple_ex3_rsa simple_ex3_rsa.cc) -target_link_libraries(simple_ex3_rsa OpenSSL::SSL ${PROJECT_NAME}) +target_link_libraries(simple_ex3_rsa ${PROJECT_NAME}) add_test( NAME simple_ex3_rsa COMMAND ./simple_ex3_rsa diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index 48cf4b8..e423283 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -1,31 +1,64 @@ - -SET(CERT_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/certs") -SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCERT_ROOT_DIR=\"\\\"${CERT_ROOT_DIR}\\\"\"") +set(CERT_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}/certs") +set(CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -DCERT_ROOT_DIR=\"\\\"${CERT_ROOT_DIR}\\\"\"") add_executable(test_jwt_object test_jwt_object.cc) -target_link_libraries(test_jwt_object OpenSSL::SSL GTest::GTest GTest::Main ${PROJECT_NAME}) -add_test(NAME test_jwt_object COMMAND ./test_jwt_object WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +target_link_libraries(test_jwt_object ${GTest_LIBRARIES} ${PROJECT_NAME}) +target_include_directories(test_jwt_object PRIVATE ${GTEST_INCLUDE_DIRS}) +add_test( + NAME test_jwt_object + COMMAND ./test_jwt_object + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_jwt_encode test_jwt_encode.cc) -target_link_libraries(test_jwt_encode OpenSSL::SSL GTest::GTest GTest::Main ${PROJECT_NAME}) -add_test(NAME test_jwt_encode COMMAND ./test_jwt_encode WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +target_link_libraries(test_jwt_encode ${GTest_LIBRARIES} ${PROJECT_NAME}) +target_include_directories(test_jwt_encode PRIVATE ${GTEST_INCLUDE_DIRS}) +add_test( + NAME test_jwt_encode + COMMAND ./test_jwt_encode + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_jwt_decode test_jwt_decode.cc) -target_link_libraries(test_jwt_decode OpenSSL::SSL GTest::GTest GTest::Main ${PROJECT_NAME}) -add_test(NAME test_jwt_decode COMMAND ./test_jwt_decode WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +target_link_libraries(test_jwt_decode ${GTest_LIBRARIES} ${PROJECT_NAME}) +target_include_directories(test_jwt_decode PRIVATE ${GTEST_INCLUDE_DIRS}) +add_test( + NAME test_jwt_decode + COMMAND ./test_jwt_decode + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_jwt_decode_verifiy test_jwt_decode_verifiy.cc) -target_link_libraries(test_jwt_decode_verifiy OpenSSL::SSL GTest::GTest GTest::Main ${PROJECT_NAME}) -add_test(NAME test_jwt_decode_verifiy COMMAND ./test_jwt_decode_verifiy WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +target_link_libraries(test_jwt_decode_verifiy ${GTest_LIBRARIES} + ${PROJECT_NAME}) +target_include_directories(test_jwt_decode_verifiy + PRIVATE ${GTEST_INCLUDE_DIRS}) +add_test( + NAME test_jwt_decode_verifiy + COMMAND ./test_jwt_decode_verifiy + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -add_executable(test_jwt_decode_verifiy_with_exception test_jwt_decode_verifiy_with_exception.cc) -target_link_libraries(test_jwt_decode_verifiy_with_exception OpenSSL::SSL GTest::GTest GTest::Main ${PROJECT_NAME}) -add_test(NAME test_jwt_decode_verifiy_with_exception COMMAND ./test_jwt_decode_verifiy_with_exception WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +add_executable(test_jwt_decode_verifiy_with_exception + test_jwt_decode_verifiy_with_exception.cc) +target_link_libraries(test_jwt_decode_verifiy_with_exception ${GTest_LIBRARIES} + ${PROJECT_NAME}) +target_include_directories(test_jwt_decode_verifiy_with_exception + PRIVATE ${GTEST_INCLUDE_DIRS}) +add_test( + NAME test_jwt_decode_verifiy_with_exception + COMMAND ./test_jwt_decode_verifiy_with_exception + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_jwt_rsa test_jwt_rsa.cc) -target_link_libraries(test_jwt_rsa OpenSSL::SSL GTest::GTest GTest::Main ${PROJECT_NAME}) -add_test(NAME test_jwt_rsa COMMAND ./test_jwt_rsa WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +target_link_libraries(test_jwt_rsa ${GTest_LIBRARIES} ${PROJECT_NAME}) +target_include_directories(test_jwt_rsa PRIVATE ${GTEST_INCLUDE_DIRS}) +add_test( + NAME test_jwt_rsa + COMMAND ./test_jwt_rsa + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) add_executable(test_jwt_es test_jwt_es.cc) -target_link_libraries(test_jwt_es OpenSSL::SSL GTest::GTest GTest::Main ${PROJECT_NAME}) -add_test(NAME test_jwt_es COMMAND ./test_jwt_es WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) +target_link_libraries(test_jwt_es ${GTest_LIBRARIES} ${PROJECT_NAME}) +target_include_directories(test_jwt_es PRIVATE ${GTEST_INCLUDE_DIRS}) +add_test( + NAME test_jwt_es + COMMAND ./test_jwt_es + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) From 72c26dda67004b2f96ac4e41d4ad05cced6c041f Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 13:18:06 +0100 Subject: [PATCH 14/21] ci: fix windows build --- .github/workflows/main.yml | 77 ++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d6ade01..d8a4f73 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -8,55 +8,58 @@ env: jobs: build: - runs-on: ${{ matrix.os }} strategy: matrix: os: [windows-latest, ubuntu-latest] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v1 - - uses: actions/setup-python@v1 - with: - python-version: '3.x' + - uses: actions/setup-python@v1 + with: + python-version: "3.x" - - name: Install tools (Linux) - if: startsWith(runner.os, 'Linux') - run: | - sudo apt-get install python3-setuptools python3-wheel python3-pip - shell: bash + - name: Install tools (Linux) + if: startsWith(runner.os, 'Linux') + run: | + sudo apt-get install python3-setuptools python3-wheel python3-pip + shell: bash - - name: Install conan (Linux) - if: startsWith(runner.os, 'Linux') - run: | - sudo pip3 install conan --upgrade - shell: bash + - name: Install conan (Linux) + if: startsWith(runner.os, 'Linux') + run: | + sudo pip3 install conan --upgrade + shell: bash - - name: Install conan (Windows) - if: startsWith(runner.os, 'Windows') - run: | - pip3 install conan --upgrade - shell: bash + - name: Install conan (Windows) + if: startsWith(runner.os, 'Windows') + run: | + pip3 install conan --upgrade + shell: bash - - name: Create Build Environment - run: cmake -E make_directory ${{runner.workspace}}/build + - name: Create Build Environment + run: cmake -E make_directory ${{runner.workspace}}/build - - name: Install conan dependencies - working-directory: ${{runner.workspace}}/build - run: conan profile new default --detect && conan install $GITHUB_WORKSPACE --build missing + - name: Install conan profile + working-directory: ${{runner.workspace}}/build + run: conan profile new default --detect - - name: Configure CMake - shell: bash - working-directory: ${{runner.workspace}}/build - run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE + - name: Install conan dependencies + working-directory: ${{runner.workspace}}/build + run: conan install $GITHUB_WORKSPACE --build missing - - name: Build - working-directory: ${{runner.workspace}}/build - shell: bash - run: cmake --build . --config $BUILD_TYPE + - name: Configure CMake + shell: bash + working-directory: ${{runner.workspace}}/build + run: cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=$BUILD_TYPE - - name: Test - working-directory: ${{runner.workspace}}/build - shell: bash - run: make tests && ./tests + - name: Build + working-directory: ${{runner.workspace}}/build + shell: bash + run: cmake --build . --config $BUILD_TYPE + + - name: Test + working-directory: ${{runner.workspace}}/build + shell: bash + run: make tests && ./tests From f43b6e93fafc5342224eadd14a6c0fc449a304d6 Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 13:26:13 +0100 Subject: [PATCH 15/21] chore: use both options for gtest include dir variable --- .github/workflows/main.yml | 1 + tests/CMakeLists.txt | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d8a4f73..30fbc69 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -48,6 +48,7 @@ jobs: - name: Install conan dependencies working-directory: ${{runner.workspace}}/build run: conan install $GITHUB_WORKSPACE --build missing + shell: bash - name: Configure CMake shell: bash diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index e423283..763dcb3 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -4,7 +4,8 @@ set(CMAKE_CXX_FLAGS add_executable(test_jwt_object test_jwt_object.cc) target_link_libraries(test_jwt_object ${GTest_LIBRARIES} ${PROJECT_NAME}) -target_include_directories(test_jwt_object PRIVATE ${GTEST_INCLUDE_DIRS}) +target_include_directories(test_jwt_object PRIVATE ${GTEST_INCLUDE_DIRS} + ${GTest_INCLUDE_DIRS}) add_test( NAME test_jwt_object COMMAND ./test_jwt_object @@ -12,7 +13,8 @@ add_test( add_executable(test_jwt_encode test_jwt_encode.cc) target_link_libraries(test_jwt_encode ${GTest_LIBRARIES} ${PROJECT_NAME}) -target_include_directories(test_jwt_encode PRIVATE ${GTEST_INCLUDE_DIRS}) +target_include_directories(test_jwt_encode PRIVATE ${GTEST_INCLUDE_DIRS} + ${GTest_INCLUDE_DIRS}) add_test( NAME test_jwt_encode COMMAND ./test_jwt_encode @@ -20,7 +22,8 @@ add_test( add_executable(test_jwt_decode test_jwt_decode.cc) target_link_libraries(test_jwt_decode ${GTest_LIBRARIES} ${PROJECT_NAME}) -target_include_directories(test_jwt_decode PRIVATE ${GTEST_INCLUDE_DIRS}) +target_include_directories(test_jwt_decode PRIVATE ${GTEST_INCLUDE_DIRS} + ${GTest_INCLUDE_DIRS}) add_test( NAME test_jwt_decode COMMAND ./test_jwt_decode @@ -30,7 +33,7 @@ add_executable(test_jwt_decode_verifiy test_jwt_decode_verifiy.cc) target_link_libraries(test_jwt_decode_verifiy ${GTest_LIBRARIES} ${PROJECT_NAME}) target_include_directories(test_jwt_decode_verifiy - PRIVATE ${GTEST_INCLUDE_DIRS}) + PRIVATE ${GTEST_INCLUDE_DIRS} ${GTest_INCLUDE_DIRS}) add_test( NAME test_jwt_decode_verifiy COMMAND ./test_jwt_decode_verifiy @@ -41,7 +44,7 @@ add_executable(test_jwt_decode_verifiy_with_exception target_link_libraries(test_jwt_decode_verifiy_with_exception ${GTest_LIBRARIES} ${PROJECT_NAME}) target_include_directories(test_jwt_decode_verifiy_with_exception - PRIVATE ${GTEST_INCLUDE_DIRS}) + PRIVATE ${GTEST_INCLUDE_DIRS} ${GTest_INCLUDE_DIRS}) add_test( NAME test_jwt_decode_verifiy_with_exception COMMAND ./test_jwt_decode_verifiy_with_exception @@ -49,7 +52,8 @@ add_test( add_executable(test_jwt_rsa test_jwt_rsa.cc) target_link_libraries(test_jwt_rsa ${GTest_LIBRARIES} ${PROJECT_NAME}) -target_include_directories(test_jwt_rsa PRIVATE ${GTEST_INCLUDE_DIRS}) +target_include_directories(test_jwt_rsa PRIVATE ${GTEST_INCLUDE_DIRS} + ${GTest_INCLUDE_DIRS}) add_test( NAME test_jwt_rsa COMMAND ./test_jwt_rsa @@ -57,7 +61,8 @@ add_test( add_executable(test_jwt_es test_jwt_es.cc) target_link_libraries(test_jwt_es ${GTest_LIBRARIES} ${PROJECT_NAME}) -target_include_directories(test_jwt_es PRIVATE ${GTEST_INCLUDE_DIRS}) +target_include_directories(test_jwt_es PRIVATE ${GTEST_INCLUDE_DIRS} + ${GTest_INCLUDE_DIRS}) add_test( NAME test_jwt_es COMMAND ./test_jwt_es From 9920f88379aae6de279d5558b34164cffada9096 Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 13:33:43 +0100 Subject: [PATCH 16/21] chore: define vendor macro if needed --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index c3f2db6..569cbc7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,6 +35,7 @@ target_include_directories( target_link_libraries(${PROJECT_NAME} INTERFACE ${OpenSSL_LIBRARIES}) if(NOT CPP_JWT_USE_VENDORED_NLOHMANN_JSON) target_link_libraries(${PROJECT_NAME} INTERFACE nlohmann_json::nlohmann_json) +else() add_definitions(-DCPP_JWT_USE_VENDORED_NLOHMANN_JSON) endif() target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_14) From ac31850cdcb04a6ab399b8c9c0c3f7e963fb6972 Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 13:38:11 +0100 Subject: [PATCH 17/21] chore: use cpp 11 by default --- .github/workflows/main.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 30fbc69..bac67c0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -45,6 +45,12 @@ jobs: working-directory: ${{runner.workspace}}/build run: conan profile new default --detect + - name: Use cpp 11 (Linux) + if: startsWith(runner.os, 'Linux') + run: | + conan profile update settings.compiler.libcxx=libstdc++11 default + shell: bash + - name: Install conan dependencies working-directory: ${{runner.workspace}}/build run: conan install $GITHUB_WORKSPACE --build missing From f7ffc00a29e5fd61cfa963fbe4370a45e1de28b0 Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 14:58:03 +0100 Subject: [PATCH 18/21] chore: use w4 for msvc --- CMakeLists.txt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 569cbc7..0200bd6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,8 +11,16 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_BINARY_DIR}) # only set compiler flags if we are the main project, otherwise let the main # project decide on the flags if(CMAKE_SOURCE_DIR STREQUAL CMAKE_CURRENT_SOURCE_DIR) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Wextra") -else() + set(CMAKE_CXX_STANDARD 14) + set(CMAKE_CXX_STANDARD_REQUIRED ON) + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" + MATCHES "Clang") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra") + endif() + + if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") + endif() endif() From 4dd70e5935961de86a84d7992a08923ea0efbce3 Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 15:07:29 +0100 Subject: [PATCH 19/21] test: add ctest --- .github/workflows/main.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index bac67c0..87ea7b0 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -69,4 +69,4 @@ jobs: - name: Test working-directory: ${{runner.workspace}}/build shell: bash - run: make tests && ./tests + run: ctest --verbose From 67f3dad16aebc78c2d5882be182114934416916d Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Mon, 24 Feb 2020 19:54:37 +0100 Subject: [PATCH 20/21] fix: compilation with visual studio 14 --- include/jwt/base64.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/jwt/base64.hpp b/include/jwt/base64.hpp index 248b10c..7df6245 100644 --- a/include/jwt/base64.hpp +++ b/include/jwt/base64.hpp @@ -92,7 +92,7 @@ inline std::string base64_encode(const char* in, size_t len) const auto encoded_siz = encoding_size(len); result.resize(encoded_siz); - constexpr static const EMap emap{}; + constexpr static const EMap emap; int i = 0; int j = 0; From 79d2c49b329a393b38bc9d7075b5981b7e476664 Mon Sep 17 00:00:00 2001 From: Carlos Gomes Martinho Date: Wed, 18 Mar 2020 19:48:52 +0100 Subject: [PATCH 21/21] build: add add_library alias to cmake this makes it possible to do: ```cmake find_package(cpp-jwt REQUIRED) add_executable(main main.cpp) target_link_libraries(main cpp-jwt::cpp-jwt) ``` --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0200bd6..9122f1c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,6 +47,7 @@ else() add_definitions(-DCPP_JWT_USE_VENDORED_NLOHMANN_JSON) endif() target_compile_features(${PROJECT_NAME} INTERFACE cxx_std_14) +add_library(${PROJECT_NAME}::${PROJECT_NAME} ALIAS ${PROJECT_NAME}) # ############################################################################## # TESTS