@@ -104,6 +104,68 @@ int scitoken_get_claim_string(const SciToken token, const char *key, char **valu
104104}
105105
106106
107+ int scitoken_set_claim_string_list (const SciToken token, const char *key,
108+ const char **value, char **err_msg)
109+ {
110+ auto real_token = reinterpret_cast <scitokens::SciToken*>(token);
111+ if (real_token == nullptr ) {
112+ if (err_msg) *err_msg = strdup (" NULL scitoken passed to scitoken_get_claim_string_list" );
113+ return -1 ;
114+ }
115+ std::vector<std::string> claim_list;
116+ int idx = 0 ;
117+ while (value[idx++]) {}
118+ claim_list.reserve (idx);
119+
120+ idx = 0 ;
121+ while (value[idx++]) {
122+ claim_list.emplace_back (value[idx-1 ]);
123+ }
124+ real_token->set_claim_list (key, claim_list);
125+
126+ return 0 ;
127+ }
128+
129+
130+ int scitoken_get_claim_string_list (const SciToken token, const char *key, char ***value, char **err_msg) {
131+ auto real_token = reinterpret_cast <scitokens::SciToken*>(token);
132+ if (real_token == nullptr ) {
133+ if (err_msg) *err_msg = strdup (" NULL scitoken passed to scitoken_get_claim_string_list" );
134+ return -1 ;
135+ }
136+ std::vector<std::string> claim_list;
137+ try {
138+ claim_list = real_token->get_claim_list (key);
139+ } catch (std::exception &exc) {
140+ if (err_msg) {*err_msg = strdup (exc.what ());}
141+ return -1 ;
142+ }
143+ auto claim_list_c = static_cast <char **>(malloc (sizeof (char **) * (claim_list.size () + 1 )));
144+ claim_list_c[claim_list.size ()] = nullptr ;
145+ int idx = 0 ;
146+ for (const auto &entry : claim_list) {
147+ claim_list_c[idx] = strdup (entry.c_str ());
148+ if (!claim_list_c[idx]) {
149+ scitoken_free_string_list (claim_list_c);
150+ if (err_msg) {*err_msg = strdup (" Failed to create a copy of string entry in list" );}
151+ return -1 ;
152+ }
153+ idx++;
154+ }
155+ *value = claim_list_c;
156+ return 0 ;
157+ }
158+
159+
160+ void scitoken_free_string_list (char **value) {
161+ int idx = 0 ;
162+ do {
163+ free (value[idx++]);
164+ } while (value[idx]);
165+ free (value);
166+ }
167+
168+
107169int scitoken_get_expiration (const SciToken token, long long *expiry, char **err_msg) {
108170 scitokens::SciToken *real_token = reinterpret_cast <scitokens::SciToken*>(token);
109171 if (!real_token->has_claim (" exp" )) {
0 commit comments