2 * Copyright (c) 2012, JANET(UK)
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of JANET(UK) nor the names of its contributors
17 * may be used to endorse or promote products derived from this software
18 * without specific prior written permission.
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24 * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
25 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
26 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
29 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
31 * OF THE POSSIBILITY OF SUCH DAMAGE.
40 #include <trust_router/tr_dh.h>
41 #include <tid_internal.h>
43 static int tid_resp_destructor(void *obj)
45 TID_RESP *resp=talloc_get_type_abort(obj, TID_RESP);
46 if (resp->err_msg!=NULL)
47 tr_free_name(resp->err_msg);
48 if (resp->rp_realm!=NULL)
49 tr_free_name(resp->rp_realm);
50 if (resp->realm!=NULL)
51 tr_free_name(resp->realm);
53 tr_free_name(resp->comm);
54 if (resp->orig_coi!=NULL)
55 tr_free_name(resp->orig_coi);
56 if (resp->request_id!=NULL)
57 tr_free_name(resp->request_id);
61 TID_RESP *tid_resp_new(TALLOC_CTX *mem_ctx)
63 TID_RESP *resp=talloc(mem_ctx, TID_RESP);
65 resp->result=TID_ERROR;
73 resp->request_id=NULL;
74 resp->error_path=NULL;
75 talloc_set_destructor((void *)resp, tid_resp_destructor);
80 void tid_resp_free(TID_RESP *resp)
87 * Allocate a new copy of a TID_RESP
93 TID_RESP *tid_resp_dup(TALLOC_CTX *mem_ctx, TID_RESP *resp)
95 TID_RESP *newresp=NULL;
100 newresp=tid_resp_new(mem_ctx);
103 tid_resp_cpy(newresp, resp);
109 * Copy contents of one TID_RESP to an existing TID_RESP
113 * @return TID_SUCCESS on success, error code on error
115 TID_RC tid_resp_cpy(TID_RESP *dst, TID_RESP *src)
117 tid_resp_set_result(dst, tid_resp_get_result(src));
118 tid_resp_set_err_msg(dst,
119 tr_dup_name(tid_resp_get_err_msg(src)));
120 tid_resp_set_rp_realm(dst,
121 tr_dup_name(tid_resp_get_rp_realm(src)));
122 tid_resp_set_realm(dst,
123 tr_dup_name(tid_resp_get_realm(src)));
124 tid_resp_set_comm(dst,
125 tr_dup_name(tid_resp_get_comm(src)));
126 tid_resp_set_cons(dst, src->cons);
127 tid_resp_set_orig_coi(dst,
128 tr_dup_name(tid_resp_get_orig_coi(src)));
129 dst->servers = tid_srvr_blk_dup(dst, src->servers);
130 tid_resp_set_error_path(dst, src->error_path);
135 TR_EXPORT int tid_resp_get_result(TID_RESP *resp)
137 return(resp->result);
140 void tid_resp_set_result(TID_RESP *resp, int result)
142 resp->result = result;
145 TR_EXPORT TR_NAME *tid_resp_get_err_msg(TID_RESP *resp)
147 return(resp->err_msg);
150 void tid_resp_set_err_msg(TID_RESP *resp, TR_NAME *err_msg)
152 if (resp->err_msg!=NULL)
153 tr_free_name(resp->err_msg);
155 resp->err_msg = err_msg;
158 TR_EXPORT TR_NAME *tid_resp_get_rp_realm(TID_RESP *resp)
160 return(resp->rp_realm);
163 void tid_resp_set_rp_realm(TID_RESP *resp, TR_NAME *rp_realm)
165 resp->rp_realm = rp_realm;
168 TR_EXPORT TR_NAME *tid_resp_get_realm(TID_RESP *resp)
173 void tid_resp_set_realm(TID_RESP *resp, TR_NAME *realm)
178 TR_EXPORT TR_NAME *tid_resp_get_comm(TID_RESP *resp)
183 void tid_resp_set_comm(TID_RESP *resp, TR_NAME *comm)
188 TR_EXPORT TR_NAME *tid_resp_get_orig_coi(TID_RESP *resp)
190 return(resp->orig_coi);
193 void tid_resp_set_orig_coi(TID_RESP *resp, TR_NAME *orig_coi)
195 resp->orig_coi = orig_coi;
198 TR_EXPORT TR_NAME *tid_resp_get_request_id(TID_RESP *resp)
200 return(resp->request_id);
203 void tid_resp_set_request_id(TID_RESP *resp, TR_NAME *request_id)
205 resp->request_id = request_id;
208 TR_EXPORT TID_SRVR_BLK *tid_resp_get_server(TID_RESP *resp,
211 TID_SRVR_BLK *this=NULL;
214 for (this=resp->servers; index>0; index--, this=this->next) {}
219 size_t tid_resp_get_num_servers(const TID_RESP *resp)
222 TID_SRVR_BLK *this=NULL;
225 for (count=0, this=resp->servers; this!=NULL; count++, this=this->next) {}
229 static int tid_srvr_blk_destructor(void *obj)
231 TID_SRVR_BLK *srvr=talloc_get_type_abort(obj, TID_SRVR_BLK);
233 if (srvr->key_name!=NULL)
234 tr_free_name(srvr->key_name);
235 if (srvr->aaa_server_dh!=NULL)
236 tr_destroy_dh_params(srvr->aaa_server_dh);
237 if (srvr->path!=NULL)
238 json_decref((json_t *)(srvr->path));
242 TR_EXPORT TID_SRVR_BLK *tid_srvr_blk_new(TALLOC_CTX *mem_ctx)
244 TID_SRVR_BLK *srvr=talloc(mem_ctx, TID_SRVR_BLK);
248 srvr->aaa_server_addr=NULL;
250 srvr->aaa_server_dh=NULL;
251 srvr->key_expiration=(GTimeVal){0};
253 talloc_set_destructor((void *)srvr, tid_srvr_blk_destructor);
258 TR_EXPORT void tid_srvr_blk_free(TID_SRVR_BLK *srvr)
263 TR_EXPORT TID_SRVR_BLK *tid_srvr_blk_dup(TALLOC_CTX *mem_ctx, TID_SRVR_BLK *srvr)
265 TID_SRVR_BLK *new=NULL;
270 new=tid_srvr_blk_new(mem_ctx);
272 if (srvr->aaa_server_addr!=NULL)
273 new->aaa_server_addr=talloc_strdup(new, srvr->aaa_server_addr);
274 new->key_name=tr_dup_name(srvr->key_name);
275 new->aaa_server_dh=tr_dh_dup(srvr->aaa_server_dh);
276 new->key_expiration=srvr->key_expiration;
278 tid_srvr_blk_set_path(new, srvr->path);
280 tid_srvr_blk_add(new->next, tid_srvr_blk_dup(mem_ctx, srvr->next));
286 TR_EXPORT TID_SRVR_BLK *tid_srvr_blk_add_func(TID_SRVR_BLK *head, TID_SRVR_BLK *new)
288 TID_SRVR_BLK *this=head;
293 while (this->next!=NULL)
298 talloc_steal(head, this);
304 TR_EXPORT void tid_srvr_blk_set_path(TID_SRVR_BLK *block, TID_PATH *path)
306 if (block->path!=NULL)
307 json_decref((json_t *)(block->path));
309 if (block->path!=NULL)
310 json_incref((json_t *)(block->path));
313 TR_EXPORT const TID_PATH *tid_srvr_get_path( const TID_SRVR_BLK *block)
320 TR_EXPORT int tid_srvr_get_key_expiration(const TID_SRVR_BLK *block, struct timeval *tv_out)
322 if ((block==NULL) || (tv_out==NULL))
323 return -1; /* error */
325 tv_out->tv_sec=block->key_expiration.tv_sec;
326 tv_out->tv_usec=block->key_expiration.tv_usec;
331 TR_EXPORT void tid_resp_set_cons(TID_RESP *resp, TR_CONSTRAINT_SET *cons)
333 json_t *jc=(json_t *)cons;
335 if (resp->cons!=NULL)
336 json_decref((json_t *) (resp->cons));
338 resp->cons=(TR_CONSTRAINT_SET *)jc;
343 TR_EXPORT void tid_resp_set_error_path(TID_RESP *resp, json_t *ep)
345 if (resp->error_path!=NULL)
346 json_decref(resp->error_path);
348 if (resp->error_path!=NULL)
349 json_incref(resp->error_path);
352 TR_EXPORT const TID_PATH *tid_resp_get_error_path(const TID_RESP *resp)
356 return (const TID_PATH *)(resp->error_path);
359 TR_EXPORT const TID_PATH *tid_resp_get_a_path(const TID_RESP *const_resp)
362 TID_SRVR_BLK *server;
363 TID_RESP *resp = (TID_RESP *) const_resp;
367 if (resp->error_path)
368 return (const TID_PATH *)(resp->error_path);
369 tid_resp_servers_foreach( resp, server, index) {