diff --git a/include/jwt/impl/jwt.ipp b/include/jwt/impl/jwt.ipp index c132b02..37d4218 100644 --- a/include/jwt/impl/jwt.ipp +++ b/include/jwt/impl/jwt.ipp @@ -306,7 +306,7 @@ void jwt_object::set_parameters( void jwt_object::set_parameters() { - //setinel call + //sentinel call return; } @@ -465,50 +465,46 @@ jwt_object::three_parts(const string_view enc_str) } -//==================================================================== - -namespace { // Anonymous namespace - template -void set_decode_params(DecodeParams& dparams, params::detail::leeway_param l, Rest&&... args) +void jwt_object::set_decode_params(DecodeParams& dparams, params::detail::leeway_param l, Rest&&... args) { dparams.leeway = l.get(); - set_decode_params(dparams, std::forward(args)...); + jwt_object::set_decode_params(dparams, std::forward(args)...); return; } template -void set_decode_params(DecodeParams& dparams, params::detail::verify_param v, Rest&&... args) +void jwt_object::set_decode_params(DecodeParams& dparams, params::detail::verify_param v, Rest&&... args) { dparams.verify = v.get(); - set_decode_params(dparams, std::forward(args)...); + jwt_object::set_decode_params(dparams, std::forward(args)...); return; } template -void set_decode_params(DecodeParams& dparams, params::detail::issuer_param i, Rest&&... args) +void jwt_object::set_decode_params(DecodeParams& dparams, params::detail::issuer_param i, Rest&&... args) { dparams.issuer = std::move(i).get(); dparams.has_issuer = true; - set_decode_params(dparams, std::forward(args)...); + jwt_object::set_decode_params(dparams, std::forward(args)...); return; } template -void set_decode_params(DecodeParams& dparams, params::detail::audience_param a, Rest&&... args) +void jwt_object::set_decode_params(DecodeParams& dparams, params::detail::audience_param a, Rest&&... args) { dparams.aud = std::move(a).get(); dparams.has_aud = true; - set_decode_params(dparams, std::forward(args)...); + jwt_object::set_decode_params(dparams, std::forward(args)...); } template -void set_decode_params(DecodeParams& dparams) +void jwt_object::set_decode_params(DecodeParams& dparams) { return; } -} // END anonymous namespace +//================================================================== template jwt_object decode(const string_view enc_str, @@ -542,7 +538,7 @@ jwt_object decode(const string_view enc_str, }; decode_params dparams{}; - set_decode_params(dparams, std::forward(args)...); + jwt_object::set_decode_params(dparams, std::forward(args)...); //Signature must have atleast 2 dots auto dot_cnt = std::count_if(std::begin(enc_str), std::end(enc_str), @@ -555,7 +551,13 @@ jwt_object decode(const string_view enc_str, auto parts = jwt_object::three_parts(enc_str); //throws decode error - obj.header(jwt_header{parts[0]}); + jwt_header hdr{}; + hdr.decode(parts[0], ec); + if (ec) { + return obj; + } + //obj.header(jwt_header{parts[0]}); + obj.header(std::move(hdr)); //If the algorithm is not NONE, it must not //have more than two dots ('.') and the split @@ -572,7 +574,12 @@ jwt_object decode(const string_view enc_str, } //throws decode error - obj.payload(jwt_payload{parts[1]}); + jwt_payload payload{}; + payload.decode(parts[1], ec); + if (ec) { + return obj; + } + obj.payload(std::move(payload)); if (dparams.verify) { ec = obj.verify(dparams, algos); @@ -700,8 +707,7 @@ void jwt_throw_exception(const std::error_code& ec) assert (0 && "Unknown error code or not to be treated as an error"); }; } - - assert (0 && "Unknown error code category"); + return; } } // END namespace jwt diff --git a/include/jwt/jwt.hpp b/include/jwt/jwt.hpp index 20e53df..8086c46 100644 --- a/include/jwt/jwt.hpp +++ b/include/jwt/jwt.hpp @@ -720,6 +720,23 @@ private: // private APIs */ void set_parameters(); +public: //TODO: Not good + /// Decode parameters + template + static void set_decode_params(DecodeParams& dparams, params::detail::leeway_param l, Rest&&... args); + + template + static void set_decode_params(DecodeParams& dparams, params::detail::verify_param v, Rest&&... args); + + template + static void set_decode_params(DecodeParams& dparams, params::detail::issuer_param i, Rest&&... args); + + template + static void set_decode_params(DecodeParams& dparams, params::detail::audience_param a, Rest&&... args); + + template + static void set_decode_params(DecodeParams& dparams); + private: // Data Members /// JWT header section diff --git a/tests/test_jwt_decode b/tests/test_jwt_decode index 07fe1bd..44f7fb2 100755 Binary files a/tests/test_jwt_decode and b/tests/test_jwt_decode differ diff --git a/tests/test_jwt_decode.cc b/tests/test_jwt_decode.cc index 95f0af1..4525d43 100644 --- a/tests/test_jwt_decode.cc +++ b/tests/test_jwt_decode.cc @@ -15,6 +15,55 @@ TEST (DecodeTest, InvalidFinalDotForNoneAlg) EXPECT_EQ (ec.value(), static_cast(jwt::DecodeErrc::SignatureFormatError)); } +TEST (DecodeTest, DecodeNoneAlgSign) +{ + using namespace jwt::params; + const char* enc_str = + "eyJhbGciOiJOT05FIiwidHlwIjoiSldUIn0.eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjoxNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ."; + + std::error_code ec; + auto obj = jwt::decode(enc_str, "", algorithms({"none"}), ec, verify(false)); + EXPECT_TRUE (ec); + EXPECT_EQ (ec.value(), static_cast(jwt::AlgorithmErrc::NoneAlgorithmUsed)); + + std::cout << obj.payload() << std::endl; + + EXPECT_FALSE (obj.has_claim("iss")); + EXPECT_FALSE (obj.has_claim("ISS")); + + EXPECT_TRUE (obj.has_claim("aud")); + EXPECT_TRUE (obj.has_claim("exp")); + + EXPECT_EQ (obj.payload().get_claim_value("exp"), 1513863371); +} + +TEST (DecodeTest, DecodeWrongAlgo) +{ + using namespace jwt::params; + + const char* enc_str = + "eyJhbGciOiJOT05FIiwidHlwIjoiSldUIn0.eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjoxNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ."; + + std::error_code ec; + auto obj = jwt::decode(enc_str, "", algorithms({"hs256"}), ec, verify(true)); + EXPECT_TRUE (ec); + EXPECT_EQ (ec.value(), static_cast(jwt::VerificationErrc::InvalidAlgorithm)); +} + +TEST (DecodeTest, DecodeInvalidHeader) +{ + using namespace jwt::params; + + const char* enc_str = + "ehbGciOiJOT05FIiwidHlwIjoiSldUIn0.eyJhdWQiOiJyaWZ0LmlvIiwiZXhwIjoxNTEzODYzMzcxLCJzdWIiOiJub3RoaW5nIG11Y2gifQ."; + + std::error_code ec; + auto obj = jwt::decode(enc_str, "", algorithms({"hs256"}), ec, verify(true)); + ASSERT_TRUE (ec); + EXPECT_EQ (ec.value(), static_cast(jwt::DecodeErrc::JsonParseError)); + +} + int main(int argc, char* argv[]) { ::testing::InitGoogleTest(&argc, argv); diff --git a/tests/test_jwt_encode b/tests/test_jwt_encode index 0b412ca..be7afd6 100755 Binary files a/tests/test_jwt_encode and b/tests/test_jwt_encode differ