Real syslog support for trust router
[trust_router.git] / tid / tid_req.c
1 /*
2  * Copyright (c) 2012, 2014-2015, JANET(UK)
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  *
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.
15  *
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.
19  *
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.
32  *
33  */
34
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <assert.h>
38 #include <talloc.h>
39
40 #include <tid_internal.h>
41 #include <tr_debug.h>
42
43 #include <jansson.h>
44
45 static int destroy_tid_req(TID_REQ *req)
46 {
47   OM_uint32 minor;
48   if (req->json_references)
49     json_decref(req->json_references);
50   if (req->gssctx)
51     gss_delete_sec_context( &minor, &req->gssctx, NULL);
52   return 0;
53 }
54
55 TID_REQ *tid_req_new()
56 {
57   TID_REQ *req = talloc_zero(NULL, TID_REQ);
58   if(!req)
59     return NULL;
60   talloc_set_destructor(req, destroy_tid_req);
61   req->json_references = json_array();
62   assert(req->json_references);
63   req->conn = -1;
64   return req;
65 }
66
67 TID_REQ *tid_req_get_next_req(TID_REQ *req)
68 {
69   return(req->next_req);
70 }
71
72 void tid_req_set_next_req(TID_REQ *req, TID_REQ *next_req)
73 {
74   req->next_req = next_req;
75 }
76
77 int tid_req_get_resp_sent(TID_REQ *req)
78 {
79   return(req->resp_sent);
80 }
81
82 void tid_req_set_resp_sent(TID_REQ *req, int resp_sent)
83 {
84   req->resp_sent = resp_sent;
85 }
86
87 int tid_req_get_conn(TID_REQ *req)
88 {
89   return(req->conn);
90 }
91
92 void tid_req_set_conn(TID_REQ *req, int conn)
93 {
94   req->conn = conn;
95 }
96
97 gss_ctx_id_t tid_req_get_gssctx(TID_REQ *req)
98 {
99   return(req->gssctx);
100 }
101
102 void tid_req_set_gssctx(TID_REQ *req, gss_ctx_id_t gssctx)
103 {
104   req->gssctx = gssctx;
105 }
106
107 int tid_req_get_resp_rcvd(TID_REQ *req)
108 {
109   return(req->resp_rcvd);
110 }
111
112 void tid_req_set_resp_rcvd(TID_REQ *req, int resp_rcvd)
113 {
114   req->resp_rcvd = resp_rcvd;
115 }
116
117 TR_NAME *tid_req_get_rp_realm(TID_REQ *req)
118 {
119   return(req->rp_realm);
120 }
121
122 void tid_req_set_rp_realm(TID_REQ *req, TR_NAME *rp_realm)
123 {
124   req->rp_realm = rp_realm;
125 }
126
127 TR_NAME *tid_req_get_realm(TID_REQ *req)
128 {
129   return(req->realm);
130 }
131
132 void tid_req_set_realm(TID_REQ *req, TR_NAME *realm)
133 {
134   req->realm = realm;
135 }
136
137 TR_NAME *tid_req_get_comm(TID_REQ *req)
138 {
139   return(req->comm);
140 }
141
142 void tid_req_set_comm(TID_REQ *req, TR_NAME *comm)
143 {
144   req->comm = comm;
145 }
146
147 TR_NAME *tid_req_get_orig_coi(TID_REQ *req)
148 {
149   return(req->orig_coi);
150 }
151
152 void tid_req_set_rp_orig_coi(TID_REQ *req, TR_NAME *orig_coi)
153 {
154   req->orig_coi = orig_coi;
155 }
156
157 TIDC_RESP_FUNC *tid_req_get_resp_func(TID_REQ *req)
158 {
159   return(req->resp_func);
160 }
161
162 void tid_req_set_resp_func(TID_REQ *req, TIDC_RESP_FUNC *resp_func)
163 {
164   req->resp_func = resp_func;
165 }
166
167 void *tid_req_get_cookie(TID_REQ *req)
168 {
169   return(req->cookie);
170 }
171
172 void tid_req_set_cookie(TID_REQ *req, void *cookie)
173 {
174   req->cookie = cookie;
175 }
176
177 TID_REQ *tid_dup_req (TID_REQ *orig_req) 
178 {
179   TID_REQ *new_req = NULL;
180
181   if (NULL == (new_req = malloc(sizeof(TID_REQ)))) {
182     tr_crit("tid_dup_req: Can't allocated duplicate request.");
183     return NULL;
184   }
185
186   /* Memcpy for flat fields, not valid until names are duped. */
187   memcpy(new_req, orig_req, sizeof(TID_REQ));
188   json_incref(new_req->json_references);
189   
190   if ((NULL == (new_req->rp_realm = tr_dup_name(orig_req->rp_realm))) ||
191       (NULL == (new_req->realm = tr_dup_name(orig_req->realm))) ||
192       (NULL == (new_req->comm = tr_dup_name(orig_req->comm)))) {
193         tr_crit("tid_dup_req: Can't duplicate request (names).");
194   }
195
196   if (orig_req->orig_coi) {
197     if (NULL == (new_req->orig_coi = tr_dup_name(orig_req->orig_coi))) {
198       tr_crit("tid_dup_req: Can't duplicate request (orig_coi).");
199     }
200   }
201   
202   return new_req;
203 }
204
205
206 void tid_req_cleanup_json( TID_REQ *req, json_t *ref)
207 {
208   (void) json_array_append_new(req->json_references, ref);
209 }
210
211 void tid_req_free(TID_REQ *req)
212 {
213   talloc_free(req);
214 }
215
216 int tid_req_add_path(TID_REQ *req,
217                      const char *this_system, unsigned port)
218 {
219   char *path_element = talloc_asprintf(req, "%s:%u",
220                                        this_system, port);
221   if (!req->path) {
222     req->path = json_array();
223     if (!req->path)
224       return -1;
225     tid_req_cleanup_json(req, req->path);
226   }
227   return json_array_append( req->path, json_string(path_element));
228 }
229
230
231
232 void tid_srvr_get_address(const TID_SRVR_BLK *blk,
233                           const struct sockaddr **out_addr,
234                           size_t *out_len)
235 {
236   struct sockaddr_in *sa = NULL;
237     assert(blk);
238     sa = talloc_zero(blk, struct sockaddr_in);
239     sa->sin_family = AF_INET;
240     sa->sin_addr = blk->aaa_server_addr;
241     sa->sin_port = htons(2083);
242     *out_addr = (struct sockaddr *) sa;
243     *out_len = sizeof( struct sockaddr_in);
244 }
245
246 DH *tid_srvr_get_dh( TID_SRVR_BLK *blk)
247 {
248   assert(blk);
249   return blk->aaa_server_dh;
250 }
251
252 const TR_NAME *tid_srvr_get_key_name(
253                                     const TID_SRVR_BLK *blk)
254 {
255   assert(blk);
256   return blk->key_name;
257 }