Changed decode function signature

This commit is contained in:
Arun M 2017-12-05 16:02:54 +05:30
parent 09bc72c9f7
commit a4a4bd5dff
6 changed files with 124 additions and 14 deletions

View file

@ -27,6 +27,11 @@ using void_t = typename make_void<T...>::type;
*/ */
struct empty_type {}; struct empty_type {};
/**
* A type list.
*/
template <typename... T> struct list{};
/** /**
*/ */
@ -118,6 +123,43 @@ struct is_parameter_concept<T,
/** /**
*/ */
/*
template <typename T, typename=void>
struct is_sequence_concept: std::false_type
{
};
template <typename T>
struct is_sequence_concept<>: std::true_type
{
};
*/
/**
* Find if a type is present in the typelist.
* Eg: has_type<int, list<int, char, float>>{} == true
* has_type<long, list<int, char, float>>{} == false
*/
template <typename F, typename T> struct has_type;
template <typename F>
struct has_type<F, list<>>: std::false_type
{
};
template <typename F, typename... T>
struct has_type<F, list<F, T...>>: std::true_type
{
};
template <typename F, typename H, typename... T>
struct has_type<F, list<H,T...>>: has_type<F, list<T...>>
{
};
/**
* A pack of bools for the bool trick.
*/
template <bool... V> template <bool... V>
struct bool_pack {}; struct bool_pack {};

View file

@ -351,26 +351,69 @@ jwt_object::three_parts(const string_view enc_str)
//==================================================================== //====================================================================
jwt_object jwt_decode(const string_view encoded_str, const string_view key, bool validate) namespace { // Anonymous namespace
template <typename DecodeParams, typename... Rest>
void set_decode_params(DecodeParams& dparams, params::detail::leeway_param l, Rest&&... args)
{ {
//TODO: implement error_code dparams.leeway = l.get();
jwt_object jobj; set_decode_params(dparams, std::forward<Rest>(args)...);
return;
}
auto parts = jwt_object::three_parts(encoded_str); template <typename DecodeParams, typename... Rest>
void set_decode_params(DecodeParams& dparams, params::detail::verify_param v, Rest&&... args)
{
dparams.verify = v.get();
set_decode_params(dparams, std::forward<Rest>(args)...);
return;
}
template <typename DecodeParams>
void set_decode_params(DecodeParams& dparams)
{
return;
}
} // END anonymous namespace
template <typename SequenceT, typename... Args>
jwt_object decode(const string_view enc_str,
const string_view key,
const params::detail::algorithms_param<SequenceT>& algos,
Args&&... args)
{
if (algos.get().size() == 0) {
throw DecodeError("Algorithms list cannot be empty");
}
struct decode_params
{
/// Verify parameter. Defaulted to true.
bool verify = true;
/// Leeway parameter. Defaulted to zero seconds.
uint32_t leeway = 0;
};
decode_params dparams{};
set_decode_params(dparams, std::forward<Args>(args)...);
jwt_object obj;
auto parts = jwt_object::three_parts(enc_str);
//throws decode error //throws decode error
jobj.header(jwt_header{parts[0]}); obj.header(jwt_header{parts[0]});
//throws decode error //throws decode error
jobj.payload(jwt_payload{parts[1]}); obj.payload(jwt_payload{parts[1]});
jwt_signature jsign{key}; jwt_signature jsign{key};
//length of the encoded header and payload only. // Length of the encoded header and payload only.
//Addition of '1' to account for the '.' character. // Addition of '1' to account for the '.' character.
auto l = parts[0].length() + 1 + parts[1].length(); auto l = parts[0].length() + 1 + parts[1].length();
auto res = jsign.verify(jobj.header(), encoded_str.substr(0, l), parts[2]); auto res = jsign.verify(obj.header(), enc_str.substr(0, l), parts[2]);
return jobj; return obj;
} }
} // END namespace jwt } // END namespace jwt

View file

@ -629,8 +629,11 @@ jwt_object jwt_decode(const string_view encoded_str, const string_view key, bool
/** /**
*/ */
template <typename... Args> template <typename SequenceT, typename... Args>
jwt_object decode(const string_view enc_str, const string_view key, Args&&... args); jwt_object decode(const string_view enc_str,
const string_view key,
const params::detail::algorithms_param<SequenceT>& algos,
Args&&... args);
} // END namespace jwt } // END namespace jwt

View file

@ -2,6 +2,7 @@
#define CPP_JWT_PARAMETERS_HPP #define CPP_JWT_PARAMETERS_HPP
#include <map> #include <map>
#include <vector>
#include <utility> #include <utility>
#include <unordered_map> #include <unordered_map>
@ -146,6 +147,7 @@ struct leeway_param
// Useful typedef // Useful typedef
using param_init_list_t = std::initializer_list<std::pair<jwt::string_view, jwt::string_view>>; using param_init_list_t = std::initializer_list<std::pair<jwt::string_view, jwt::string_view>>;
using param_seq_list_t = std::initializer_list<jwt::string_view>;
/** /**
@ -238,6 +240,26 @@ leeway(uint32_t l)
return { l }; return { l };
} }
/**
*/
detail::algorithms_param<std::vector<std::string>>
algorithms(const param_seq_list_t& seq)
{
std::vector<std::string> vec;
vec.reserve(seq.size());
for (const auto& e: seq) { vec.emplace_back(e.data(), e.length()); }
return { std::move(vec) };
}
template <typename SequenceConcept>
detail::algorithms_param<SequenceConcept>
algorithms(SequenceConcept&& sc)
{
return { std::forward<SequenceConcept>(sc) };
}
} // END namespace params } // END namespace params
} // END namespace jwt } // END namespace jwt

Binary file not shown.

View file

@ -44,7 +44,7 @@ void basic_jwt_object_test()
obj3.secret("secret"); obj3.secret("secret");
obj3.header().algo("hs256"); obj3.header().algo("hs256");
auto dec_obj = jwt::jwt_decode(obj3.signature(), "secret"); auto dec_obj = jwt::decode(obj3.signature(), "secret", algorithms({"hs256"}));
} }
void jwt_object_pem_test() void jwt_object_pem_test()