Remove stray semicolon.
[trust_router.git] / include / tr_comm.h
1 /*
2  * Copyright (c) 2012, 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 #ifndef TR_COMM_H
36 #define TR_COMM_H
37
38 #include <talloc.h>
39 #include <time.h>
40
41 #include <tr_idp.h>
42 #include <tr_rp.h>
43 #include <tr_apc.h>
44
45 typedef struct tr_comm_table TR_COMM_TABLE;
46
47 typedef enum tr_comm_type {
48   TR_COMM_UNKNOWN,
49   TR_COMM_APC,
50   TR_COMM_COI
51 } TR_COMM_TYPE;
52
53 typedef struct tr_comm {
54   struct tr_comm *next;
55   TR_NAME *id;
56   TR_COMM_TYPE type;
57   TR_APC *apcs;
58   TR_NAME *owner_realm; /* what realm owns this community? */
59   TR_NAME *owner_contact; /* contact email */
60   time_t expiration_interval; /*Minutes to key expiration; only valid for an APC*/
61   unsigned int refcount; /* how many TR_COMM_MEMBs refer to this community? */
62 } TR_COMM;
63
64 /* community membership - link realms to their communities */
65 typedef struct tr_comm_memb {
66   struct tr_comm_memb *next;
67   TR_IDP_REALM *idp; /* only set one of idp and rp, other null */
68   TR_RP_REALM *rp; /* only set one of idp and rp, other null */
69   TR_COMM *comm;
70   TR_NAME *origin;
71   json_t *provenance; /* array of names of systems traversed */
72   struct timespec *expiry;
73 } TR_COMM_MEMB;
74
75 /* table of communities/memberships */
76 struct tr_comm_table {
77   TR_COMM *comms; /* all communities */
78   TR_COMM_MEMB *memberships; /* head of the linked list of membership records */
79 }; 
80
81 typedef struct tr_comm_iter {
82   TR_COMM_MEMB *cur_memb;
83   TR_NAME *match; /* realm or comm to match */
84 } TR_COMM_ITER;
85
86 typedef enum tr_realm_role {
87   TR_ROLE_UNKNOWN=0,
88   TR_ROLE_IDP,
89   TR_ROLE_RP
90 } TR_REALM_ROLE;
91
92
93
94 TR_COMM_TABLE *tr_comm_table_new(TALLOC_CTX *mem_ctx);
95 void tr_comm_table_free(TR_COMM_TABLE *ctab);
96
97 TR_COMM_TABLE *tr_comm_table_new(TALLOC_CTX *mem_ctx);
98 void tr_comm_table_free(TR_COMM_TABLE *ctab);
99 void tr_comm_table_add_comm(TR_COMM_TABLE *ctab, TR_COMM *new);
100 void tr_comm_table_remove_comm(TR_COMM_TABLE *ctab, TR_COMM *comm);
101 void tr_comm_table_add_memb(TR_COMM_TABLE *ctab, TR_COMM_MEMB *new);
102 void tr_comm_table_remove_memb(TR_COMM_TABLE *ctab, TR_COMM_MEMB *memb);
103 TR_COMM_MEMB *tr_comm_table_find_memb(TR_COMM_TABLE *ctab, TR_NAME *realm, TR_NAME *comm, TR_NAME *origin);
104 TR_COMM_MEMB *tr_comm_table_find_rp_memb(TR_COMM_TABLE *ctab, TR_NAME *rp_realm, TR_NAME *comm, TR_NAME *origin); /* TODO ?? */
105 TR_COMM_MEMB *tr_comm_table_find_idp_memb(TR_COMM_TABLE *ctab, TR_NAME *idp_realm, TR_NAME *comm, TR_NAME *origin); /* TODO ?? */
106 TR_COMM *tr_comm_table_find_comm(TR_COMM_TABLE *ctab, TR_NAME *comm_id);
107 size_t tr_comm_table_size(TR_COMM_TABLE *ctab);
108
109 TR_COMM_MEMB *tr_comm_memb_new(TALLOC_CTX *mem_ctx);
110 void tr_comm_memb_free(TR_COMM_MEMB *memb);
111 void tr_comm_memb_set_rp_realm(TR_COMM_MEMB *memb, TR_RP_REALM *realm);
112 TR_RP_REALM *tr_comm_memb_get_rp_realm(TR_COMM_MEMB *memb);
113 void tr_comm_memb_set_idp_realm(TR_COMM_MEMB *memb, TR_IDP_REALM *realm);
114 TR_IDP_REALM *tr_comm_memb_get_idp_realm(TR_COMM_MEMB *memb);
115 void tr_comm_memb_set_comm(TR_COMM_MEMB *memb, TR_COMM *comm);
116 TR_COMM *tr_comm_memb_get_comm(TR_COMM_MEMB *memb);
117 TR_NAME *tr_comm_memb_get_origin(TR_COMM_MEMB *memb);
118 TR_NAME *tr_comm_memb_dup_origin(TR_COMM_MEMB *memb);
119 void tr_comm_memb_set_provenance(TR_COMM_MEMB *memb, json_t *prov);
120 void tr_comm_memb_add_to_provenance(TR_COMM_MEMB *memb, TR_NAME *hop);
121 size_t tr_comm_memb_provenance_len(TR_COMM_MEMB *memb);
122 void tr_comm_memb_set_expiry(TR_COMM_MEMB *memb, struct timespec *time);
123 struct timespec *tr_comm_memb_get_expiry(TR_COMM_MEMB *memb);
124 int tr_comm_memb_is_expired(TR_COMM_MEMB *memb, struct timespec *curtime);
125
126 TR_COMM *tr_comm_new(TALLOC_CTX *mem_ctx);
127 void tr_comm_free(TR_COMM *comm);
128 void tr_comm_set_id(TR_COMM *comm, TR_NAME *id);
129 TR_APC *tr_comm_get_apcs(TR_COMM *comm);
130 TR_NAME *tr_comm_get_id(TR_COMM *comm);
131 TR_NAME *tr_comm_dup_id(TR_COMM *comm);
132 void tr_comm_set_type(TR_COMM *comm, TR_COMM_TYPE type);
133 TR_COMM_TYPE tr_comm_get_type(TR_COMM *comm);
134 void tr_comm_set_owner_realm(TR_COMM *comm, TR_NAME *realm);
135 TR_NAME *tr_comm_get_owner_realm(TR_COMM *comm);
136 TR_NAME *tr_comm_dup_owner_realm(TR_COMM *comm);
137 void tr_comm_set_owner_contact(TR_COMM *comm, TR_NAME *contact);
138 TR_NAME *tr_comm_get_owner_contact(TR_COMM *comm);
139 TR_NAME *tr_comm_dup_owner_contact(TR_COMM *comm);
140 void tr_comm_add_idp_realm(TR_COMM_TABLE *ctab, TR_COMM *comm, TR_IDP_REALM *realm, json_t *provenance, struct timespec *expiry);
141 void tr_comm_add_rp_realm(TR_COMM_TABLE *ctab, TR_COMM *comm, TR_RP_REALM *realm, json_t *provenance, struct timespec *expiry);
142 TR_RP_REALM *tr_comm_find_rp(TR_COMM_TABLE *ctab, TR_COMM *comm, TR_NAME *rp_realm);
143 TR_IDP_REALM *tr_comm_find_idp(TR_COMM_TABLE *ctab, TR_COMM *comm, TR_NAME *idp_realm);
144 const char *tr_comm_type_to_str(TR_COMM_TYPE type);
145 TR_COMM_TYPE tr_comm_type_from_str(const char *s);
146 void tr_comm_incref(TR_COMM *comm);
147 void tr_comm_decref(TR_COMM *comm);
148 unsigned int tr_comm_get_refcount(TR_COMM *comm);
149
150 /* for iterating over communities within a realm or realms within a community */
151 TR_COMM_ITER *tr_comm_iter_new(TALLOC_CTX *mem_ctx);
152 void tr_comm_iter_free(TR_COMM_ITER *iter);
153
154 /* these iterate over communities for a realm */
155 TR_COMM *tr_comm_iter_first(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *realm);
156 TR_COMM *tr_comm_iter_next(TR_COMM_ITER *iter);
157 TR_COMM *tr_comm_iter_first_rp(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *realm);
158 TR_COMM *tr_comm_iter_next_rp(TR_COMM_ITER *iter);
159 TR_COMM *tr_comm_iter_first_idp(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *realm);
160 TR_COMM *tr_comm_iter_next_idp(TR_COMM_ITER *iter);
161
162 /* iterate over realms for a community */
163 TR_RP_REALM *tr_rp_realm_iter_first(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *comm);
164 TR_RP_REALM *tr_rp_realm_iter_next(TR_COMM_ITER *iter);
165 TR_IDP_REALM *tr_idp_realm_iter_first(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *comm);
166 TR_IDP_REALM *tr_idp_realm_iter_next(TR_COMM_ITER *iter);
167
168 const char *tr_realm_role_to_str(TR_REALM_ROLE role);
169 TR_REALM_ROLE tr_realm_role_from_str(const char *s);
170
171 #endif