2 * Copyright (c) 2012, 2015, 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.
45 typedef struct tr_comm_table TR_COMM_TABLE;
47 typedef enum tr_comm_type {
53 typedef struct tr_comm {
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? */
64 /* community membership - link realms to their communities */
65 typedef struct tr_comm_memb {
66 struct tr_comm_memb *next;
67 struct tr_comm_memb *origin_next; /* for multiple copies from different origins */
68 TR_IDP_REALM *idp; /* only set one of idp and rp, other null */
69 TR_RP_REALM *rp; /* only set one of idp and rp, other null */
72 json_t *provenance; /* array of names of systems traversed */
73 unsigned int interval;
74 struct timespec *expiry;
77 /* table of communities/memberships */
78 struct tr_comm_table {
79 TR_COMM *comms; /* all communities */
80 TR_COMM_MEMB *memberships; /* head of the linked list of membership records */
83 typedef enum tr_realm_role {
89 typedef struct tr_realm {
95 /* nb, not all iterator routines use all members */
96 typedef struct tr_comm_iter {
98 TR_COMM_MEMB *cur_memb;
99 TR_NAME *match; /* realm or comm to match */
100 TR_REALM *realm; /* handle so caller does not have to manage memory, private */
104 TR_COMM_TABLE *tr_comm_table_new(TALLOC_CTX *mem_ctx);
105 void tr_comm_table_free(TR_COMM_TABLE *ctab);
107 TR_COMM_TABLE *tr_comm_table_new(TALLOC_CTX *mem_ctx);
108 void tr_comm_table_free(TR_COMM_TABLE *ctab);
109 void tr_comm_table_add_comm(TR_COMM_TABLE *ctab, TR_COMM *new);
110 void tr_comm_table_remove_comm(TR_COMM_TABLE *ctab, TR_COMM *comm);
111 void tr_comm_table_add_memb(TR_COMM_TABLE *ctab, TR_COMM_MEMB *new);
112 void tr_comm_table_remove_memb(TR_COMM_TABLE *ctab, TR_COMM_MEMB *memb);
113 TR_COMM_MEMB *tr_comm_table_find_memb_origin(TR_COMM_TABLE *ctab, TR_NAME *realm, TR_NAME *comm, TR_NAME *origin);
114 TR_COMM_MEMB *tr_comm_table_find_memb(TR_COMM_TABLE *ctab, TR_NAME *realm, TR_NAME *comm);
115 TR_COMM_MEMB *tr_comm_table_find_rp_memb_origin(TR_COMM_TABLE *ctab, TR_NAME *rp_realm, TR_NAME *comm, TR_NAME *origin);
116 TR_COMM_MEMB *tr_comm_table_find_rp_memb(TR_COMM_TABLE *ctab, TR_NAME *rp_realm, TR_NAME *comm);
117 TR_COMM_MEMB *tr_comm_table_find_idp_memb_origin(TR_COMM_TABLE *ctab, TR_NAME *idp_realm, TR_NAME *comm, TR_NAME *origin);
118 TR_COMM_MEMB *tr_comm_table_find_idp_memb(TR_COMM_TABLE *ctab, TR_NAME *idp_realm, TR_NAME *comm);
119 TR_COMM *tr_comm_table_find_comm(TR_COMM_TABLE *ctab, TR_NAME *comm_id);
120 size_t tr_comm_table_size(TR_COMM_TABLE *ctab);
122 TR_COMM_MEMB *tr_comm_memb_new(TALLOC_CTX *mem_ctx);
123 void tr_comm_memb_free(TR_COMM_MEMB *memb);
124 TR_REALM_ROLE tr_comm_memb_get_role(TR_COMM_MEMB *memb);
125 void tr_comm_memb_set_rp_realm(TR_COMM_MEMB *memb, TR_RP_REALM *realm);
126 TR_RP_REALM *tr_comm_memb_get_rp_realm(TR_COMM_MEMB *memb);
127 void tr_comm_memb_set_idp_realm(TR_COMM_MEMB *memb, TR_IDP_REALM *realm);
128 TR_IDP_REALM *tr_comm_memb_get_idp_realm(TR_COMM_MEMB *memb);
129 void tr_comm_memb_set_comm(TR_COMM_MEMB *memb, TR_COMM *comm);
130 TR_COMM *tr_comm_memb_get_comm(TR_COMM_MEMB *memb);
131 TR_NAME *tr_comm_memb_get_origin(TR_COMM_MEMB *memb);
132 TR_NAME *tr_comm_memb_dup_origin(TR_COMM_MEMB *memb);
133 json_t *tr_comm_memb_get_provenance(TR_COMM_MEMB *memb);
134 void tr_comm_memb_set_provenance(TR_COMM_MEMB *memb, json_t *prov);
135 void tr_comm_memb_add_to_provenance(TR_COMM_MEMB *memb, TR_NAME *hop);
136 size_t tr_comm_memb_provenance_len(TR_COMM_MEMB *memb);
137 void tr_comm_memb_set_interval(TR_COMM_MEMB *memb, unsigned int interval);
138 unsigned int tr_comm_memb_get_interval(TR_COMM_MEMB *memb);
139 void tr_comm_memb_set_expiry(TR_COMM_MEMB *memb, struct timespec *time);
140 struct timespec *tr_comm_memb_get_expiry(TR_COMM_MEMB *memb);
141 int tr_comm_memb_is_expired(TR_COMM_MEMB *memb, struct timespec *curtime);
143 TR_COMM *tr_comm_new(TALLOC_CTX *mem_ctx);
144 void tr_comm_free(TR_COMM *comm);
145 void tr_comm_set_id(TR_COMM *comm, TR_NAME *id);
146 TR_APC *tr_comm_get_apcs(TR_COMM *comm);
147 TR_NAME *tr_comm_get_id(TR_COMM *comm);
148 TR_NAME *tr_comm_dup_id(TR_COMM *comm);
149 void tr_comm_set_type(TR_COMM *comm, TR_COMM_TYPE type);
150 TR_COMM_TYPE tr_comm_get_type(TR_COMM *comm);
151 void tr_comm_set_owner_realm(TR_COMM *comm, TR_NAME *realm);
152 TR_NAME *tr_comm_get_owner_realm(TR_COMM *comm);
153 TR_NAME *tr_comm_dup_owner_realm(TR_COMM *comm);
154 void tr_comm_set_owner_contact(TR_COMM *comm, TR_NAME *contact);
155 TR_NAME *tr_comm_get_owner_contact(TR_COMM *comm);
156 TR_NAME *tr_comm_dup_owner_contact(TR_COMM *comm);
157 void tr_comm_add_idp_realm(TR_COMM_TABLE *ctab, TR_COMM *comm, TR_IDP_REALM *realm, json_t *provenance, struct timespec *expiry);
158 void tr_comm_add_rp_realm(TR_COMM_TABLE *ctab, TR_COMM *comm, TR_RP_REALM *realm, json_t *provenance, struct timespec *expiry);
159 TR_RP_REALM *tr_comm_find_rp(TR_COMM_TABLE *ctab, TR_COMM *comm, TR_NAME *rp_realm);
160 TR_IDP_REALM *tr_comm_find_idp(TR_COMM_TABLE *ctab, TR_COMM *comm, TR_NAME *idp_realm);
161 const char *tr_comm_type_to_str(TR_COMM_TYPE type);
162 TR_COMM_TYPE tr_comm_type_from_str(const char *s);
163 void tr_comm_incref(TR_COMM *comm);
164 void tr_comm_decref(TR_COMM *comm);
165 unsigned int tr_comm_get_refcount(TR_COMM *comm);
167 /* for iterating over communities within a realm or realms within a community */
168 TR_COMM_ITER *tr_comm_iter_new(TALLOC_CTX *mem_ctx);
169 void tr_comm_iter_free(TR_COMM_ITER *iter);
171 /* iterate over all communities in a table */
172 TR_COMM *tr_comm_table_iter_first(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab);
173 TR_COMM *tr_comm_table_iter_next(TR_COMM_ITER *);
175 /* these iterate over communities for a realm */
176 TR_COMM *tr_comm_iter_first(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *realm);
177 TR_COMM *tr_comm_iter_next(TR_COMM_ITER *iter);
178 TR_COMM *tr_comm_iter_first_rp(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *realm);
179 TR_COMM *tr_comm_iter_next_rp(TR_COMM_ITER *iter);
180 TR_COMM *tr_comm_iter_first_idp(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *realm);
181 TR_COMM *tr_comm_iter_next_idp(TR_COMM_ITER *iter);
183 /* iterate over realms for a community */
184 TR_REALM *tr_realm_iter_first(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *comm);
185 TR_REALM *tr_realm_iter_next(TR_COMM_ITER *iter);
186 TR_RP_REALM *tr_rp_realm_iter_first(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *comm);
187 TR_RP_REALM *tr_rp_realm_iter_next(TR_COMM_ITER *iter);
188 TR_IDP_REALM *tr_idp_realm_iter_first(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *comm);
189 TR_IDP_REALM *tr_idp_realm_iter_next(TR_COMM_ITER *iter);
191 /* iterate over members with different origins */
192 TR_COMM_MEMB *tr_comm_memb_iter_first(TR_COMM_ITER *iter, TR_COMM_MEMB *memb);
193 TR_COMM_MEMB *tr_comm_memb_iter_next(TR_COMM_ITER *iter);
195 /* general realm stuff, should probably move */
196 TR_NAME *tr_realm_get_id(TR_REALM *realm);
197 TR_NAME *tr_realm_dup_id(TR_REALM *realm);
199 const char *tr_realm_role_to_str(TR_REALM_ROLE role);
200 TR_REALM_ROLE tr_realm_role_from_str(const char *s);