@@ -255,6 +255,68 @@ int scitoken_deserialize_v2(const char *value, SciToken token, char const* const
255255 return 0 ;
256256}
257257
258+ int scitoken_deserialize_start (const char *value, SciToken *token, char const * const * allowed_issuers, SciTokenStatus *status_out, char **err_msg) {
259+ if (value == nullptr ) {
260+ if (err_msg) {*err_msg = strdup (" Token may not be NULL" );}
261+ return -1 ;
262+ }
263+ if (token == nullptr ) {
264+ if (err_msg) {*err_msg = strdup (" Output token not provided" );}
265+ return -1 ;
266+ }
267+
268+ scitokens::SciTokenKey key;
269+ scitokens::SciToken *real_token = new scitokens::SciToken (key);
270+
271+
272+ std::vector<std::string> allowed_issuers_vec;
273+ if (allowed_issuers != nullptr ) {
274+ for (int idx=0 ; allowed_issuers[idx]; idx++) {
275+ allowed_issuers_vec.push_back (allowed_issuers[idx]);
276+ }
277+ }
278+
279+ std::unique_ptr<scitokens::SciTokenAsyncStatus> status;
280+ try {
281+ status = real_token->deserialize_start (value, allowed_issuers_vec);
282+ } catch (std::exception &exc) {
283+ if (err_msg) {
284+ *err_msg = strdup (exc.what ());
285+ }
286+ delete real_token;
287+ return -1 ;
288+ }
289+ *token = real_token;
290+ *status_out = status.release ();
291+ return 0 ;
292+ }
293+
294+ int scitoken_deserialize_continue (SciToken token, SciTokenStatus *status, char **err_msg) {
295+ if (token == nullptr ) {
296+ if (err_msg) {*err_msg = strdup (" Output token not provided" );}
297+ return -1 ;
298+ }
299+ scitokens::SciToken *real_token = reinterpret_cast <scitokens::SciToken*>(token);
300+ std::unique_ptr<scitokens::SciTokenAsyncStatus> real_status (reinterpret_cast <scitokens::SciTokenAsyncStatus*>(*status));
301+
302+ try {
303+ real_status = real_token->deserialize_continue (std::move (real_status));
304+ } catch (std::exception &exc) {
305+ *status = nullptr ;
306+ if (err_msg) {
307+ *err_msg = strdup (exc.what ());
308+ }
309+ return -1 ;
310+ }
311+
312+ if (real_status->m_status ->m_done ) {
313+ *status = nullptr ;
314+ } else {
315+ *status = real_status.release ();
316+ }
317+ return 0 ;
318+ }
319+
258320int scitoken_store_public_ec_key (const char *issuer, const char *keyid, const char *key, char **err_msg)
259321{
260322 bool success;
@@ -458,7 +520,7 @@ int enforcer_generate_acls_start(const Enforcer enf, const SciToken scitoken,
458520 auto real_scitoken = reinterpret_cast <scitokens::SciToken*>(scitoken);
459521
460522 scitokens::Enforcer::AclsList acls_list;
461- std::unique_ptr<scitokens::Validator:: AsyncStatus> status;
523+ std::unique_ptr<scitokens::AsyncStatus> status;
462524 try {
463525 status = real_enf->generate_acls_start (*real_scitoken, acls_list);
464526 } catch (std::exception &exc) {
@@ -491,8 +553,8 @@ int enforcer_generate_acls_continue(const Enforcer enf, SciTokenStatus *status,
491553 }
492554
493555 scitokens::Enforcer::AclsList acls_list;
494- std::unique_ptr<scitokens::Validator:: AsyncStatus> status_internal (
495- reinterpret_cast <scitokens::Validator:: AsyncStatus*>(*status));
556+ std::unique_ptr<scitokens::AsyncStatus> status_internal (
557+ reinterpret_cast <scitokens::AsyncStatus*>(*status));
496558 try {
497559 status_internal = real_enf->generate_acls_continue (std::move (status_internal), acls_list);
498560 } catch (std::exception &exc) {
@@ -539,8 +601,8 @@ int enforcer_test(const Enforcer enf, const SciToken scitoken, const Acl *acl, c
539601
540602
541603void scitoken_status_free (SciTokenStatus status) {
542- std::unique_ptr<scitokens::Validator:: AsyncStatus> status_real (
543- reinterpret_cast <scitokens::Validator:: AsyncStatus*>(status));
604+ std::unique_ptr<scitokens::AsyncStatus> status_real (
605+ reinterpret_cast <scitokens::AsyncStatus*>(status));
544606}
545607
546608
@@ -555,7 +617,7 @@ int scitoken_status_get_timeout_val(const SciTokenStatus *status, time_t expiry_
555617 return -1 ;
556618 }
557619
558- auto real_status = reinterpret_cast <const scitokens::Validator:: AsyncStatus*>(status);
620+ auto real_status = reinterpret_cast <const scitokens::AsyncStatus*>(status);
559621 struct timeval timeout_internal = real_status->get_timeout_val (expiry_time);
560622 timeout->tv_sec = timeout_internal.tv_sec ;
561623 timeout->tv_usec = timeout_internal.tv_usec ;
@@ -575,7 +637,7 @@ int scitoken_status_get_read_fd_set(SciTokenStatus *status, fd_set **read_fd_set
575637 return -1 ;
576638 }
577639
578- auto real_status = reinterpret_cast <scitokens::Validator:: AsyncStatus*>(status);
640+ auto real_status = reinterpret_cast <scitokens::AsyncStatus*>(status);
579641 *read_fd_set = real_status->get_read_fd_set ();
580642 return 0 ;
581643}
@@ -592,7 +654,7 @@ int scitoken_status_get_write_fd_set(SciTokenStatus *status, fd_set **write_fd_s
592654 return -1 ;
593655 }
594656
595- auto real_status = reinterpret_cast <scitokens::Validator:: AsyncStatus*>(status);
657+ auto real_status = reinterpret_cast <scitokens::AsyncStatus*>(status);
596658 *write_fd_set = real_status->get_write_fd_set ();
597659 return 0 ;
598660}
@@ -609,7 +671,7 @@ int scitoken_status_get_exc_fd_set(SciTokenStatus *status, fd_set **exc_fd_set,
609671 return -1 ;
610672 }
611673
612- auto real_status = reinterpret_cast <scitokens::Validator:: AsyncStatus*>(status);
674+ auto real_status = reinterpret_cast <scitokens::AsyncStatus*>(status);
613675 *exc_fd_set = real_status->get_exc_fd_set ();
614676 return 0 ;
615677}
@@ -626,7 +688,7 @@ int scitoken_status_get_max_fd(const SciTokenStatus *status, int *max_fd, char *
626688 return -1 ;
627689 }
628690
629- auto real_status = reinterpret_cast <const scitokens::Validator:: AsyncStatus*>(status);
691+ auto real_status = reinterpret_cast <const scitokens::AsyncStatus*>(status);
630692 *max_fd = real_status->get_max_fd ();
631693 return 0 ;
632694}
0 commit comments