Gather/send community updates. Refactoring. Builds, not tested.
[trust_router.git] / include / tr_comm.h
index a660435..fae2c82 100644 (file)
@@ -64,11 +64,13 @@ typedef struct tr_comm {
 /* community membership - link realms to their communities */
 typedef struct tr_comm_memb {
   struct tr_comm_memb *next;
+  struct tr_comm_memb *origin_next; /* for multiple copies from different origins */
   TR_IDP_REALM *idp; /* only set one of idp and rp, other null */
   TR_RP_REALM *rp; /* only set one of idp and rp, other null */
   TR_COMM *comm;
   TR_NAME *origin;
   json_t *provenance; /* array of names of systems traversed */
+  unsigned int interval;
   struct timespec *expiry;
 } TR_COMM_MEMB;
 
@@ -78,17 +80,25 @@ struct tr_comm_table {
   TR_COMM_MEMB *memberships; /* head of the linked list of membership records */
 }; 
 
-typedef struct tr_comm_iter {
-  TR_COMM_MEMB *cur_memb;
-  TR_NAME *match; /* realm or comm to match */
-} TR_COMM_ITER;
-
 typedef enum tr_realm_role {
   TR_ROLE_UNKNOWN=0,
   TR_ROLE_IDP,
   TR_ROLE_RP
 } TR_REALM_ROLE;
 
+typedef struct tr_realm {
+  TR_REALM_ROLE role;
+  TR_RP_REALM *rp;
+  TR_IDP_REALM *idp;
+} TR_REALM;
+
+/* nb, not all iterator routines use all members */
+typedef struct tr_comm_iter {
+  TR_COMM *cur_comm;
+  TR_COMM_MEMB *cur_memb;
+  TR_NAME *match; /* realm or comm to match */
+  TR_REALM *realm; /* handle so caller does not have to manage memory, private */
+} TR_COMM_ITER;
 
 
 TR_COMM_TABLE *tr_comm_table_new(TALLOC_CTX *mem_ctx);
@@ -100,14 +110,18 @@ void tr_comm_table_add_comm(TR_COMM_TABLE *ctab, TR_COMM *new);
 void tr_comm_table_remove_comm(TR_COMM_TABLE *ctab, TR_COMM *comm);
 void tr_comm_table_add_memb(TR_COMM_TABLE *ctab, TR_COMM_MEMB *new);
 void tr_comm_table_remove_memb(TR_COMM_TABLE *ctab, TR_COMM_MEMB *memb);
-TR_COMM_MEMB *tr_comm_table_find_memb(TR_COMM_TABLE *ctab, TR_NAME *realm, TR_NAME *comm, TR_NAME *origin);
-TR_COMM_MEMB *tr_comm_table_find_rp_memb(TR_COMM_TABLE *ctab, TR_NAME *rp_realm, TR_NAME *comm, TR_NAME *origin); /* TODO ?? */
-TR_COMM_MEMB *tr_comm_table_find_idp_memb(TR_COMM_TABLE *ctab, TR_NAME *idp_realm, TR_NAME *comm, TR_NAME *origin); /* TODO ?? */
+TR_COMM_MEMB *tr_comm_table_find_memb_origin(TR_COMM_TABLE *ctab, TR_NAME *realm, TR_NAME *comm, TR_NAME *origin);
+TR_COMM_MEMB *tr_comm_table_find_memb(TR_COMM_TABLE *ctab, TR_NAME *realm, TR_NAME *comm);
+TR_COMM_MEMB *tr_comm_table_find_rp_memb_origin(TR_COMM_TABLE *ctab, TR_NAME *rp_realm, TR_NAME *comm, TR_NAME *origin);
+TR_COMM_MEMB *tr_comm_table_find_rp_memb(TR_COMM_TABLE *ctab, TR_NAME *rp_realm, TR_NAME *comm);
+TR_COMM_MEMB *tr_comm_table_find_idp_memb_origin(TR_COMM_TABLE *ctab, TR_NAME *idp_realm, TR_NAME *comm, TR_NAME *origin);
+TR_COMM_MEMB *tr_comm_table_find_idp_memb(TR_COMM_TABLE *ctab, TR_NAME *idp_realm, TR_NAME *comm);
 TR_COMM *tr_comm_table_find_comm(TR_COMM_TABLE *ctab, TR_NAME *comm_id);
 size_t tr_comm_table_size(TR_COMM_TABLE *ctab);
 
 TR_COMM_MEMB *tr_comm_memb_new(TALLOC_CTX *mem_ctx);
 void tr_comm_memb_free(TR_COMM_MEMB *memb);
+TR_REALM_ROLE tr_comm_memb_get_role(TR_COMM_MEMB *memb);
 void tr_comm_memb_set_rp_realm(TR_COMM_MEMB *memb, TR_RP_REALM *realm);
 TR_RP_REALM *tr_comm_memb_get_rp_realm(TR_COMM_MEMB *memb);
 void tr_comm_memb_set_idp_realm(TR_COMM_MEMB *memb, TR_IDP_REALM *realm);
@@ -116,9 +130,12 @@ void tr_comm_memb_set_comm(TR_COMM_MEMB *memb, TR_COMM *comm);
 TR_COMM *tr_comm_memb_get_comm(TR_COMM_MEMB *memb);
 TR_NAME *tr_comm_memb_get_origin(TR_COMM_MEMB *memb);
 TR_NAME *tr_comm_memb_dup_origin(TR_COMM_MEMB *memb);
+json_t *tr_comm_memb_get_provenance(TR_COMM_MEMB *memb);
 void tr_comm_memb_set_provenance(TR_COMM_MEMB *memb, json_t *prov);
 void tr_comm_memb_add_to_provenance(TR_COMM_MEMB *memb, TR_NAME *hop);
 size_t tr_comm_memb_provenance_len(TR_COMM_MEMB *memb);
+void tr_comm_memb_set_interval(TR_COMM_MEMB *memb, unsigned int interval);
+unsigned int tr_comm_memb_get_interval(TR_COMM_MEMB *memb);
 void tr_comm_memb_set_expiry(TR_COMM_MEMB *memb, struct timespec *time);
 struct timespec *tr_comm_memb_get_expiry(TR_COMM_MEMB *memb);
 int tr_comm_memb_is_expired(TR_COMM_MEMB *memb, struct timespec *curtime);
@@ -151,6 +168,10 @@ unsigned int tr_comm_get_refcount(TR_COMM *comm);
 TR_COMM_ITER *tr_comm_iter_new(TALLOC_CTX *mem_ctx);
 void tr_comm_iter_free(TR_COMM_ITER *iter);
 
+/* iterate over all communities in a table */
+TR_COMM *tr_comm_table_iter_first(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab);
+TR_COMM *tr_comm_table_iter_next(TR_COMM_ITER *);
+
 /* these iterate over communities for a realm */
 TR_COMM *tr_comm_iter_first(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *realm);
 TR_COMM *tr_comm_iter_next(TR_COMM_ITER *iter);
@@ -160,11 +181,21 @@ TR_COMM *tr_comm_iter_first_idp(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME
 TR_COMM *tr_comm_iter_next_idp(TR_COMM_ITER *iter);
 
 /* iterate over realms for a community */
+TR_REALM *tr_realm_iter_first(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *comm);
+TR_REALM *tr_realm_iter_next(TR_COMM_ITER *iter);
 TR_RP_REALM *tr_rp_realm_iter_first(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *comm);
 TR_RP_REALM *tr_rp_realm_iter_next(TR_COMM_ITER *iter);
 TR_IDP_REALM *tr_idp_realm_iter_first(TR_COMM_ITER *iter, TR_COMM_TABLE *ctab, TR_NAME *comm);
 TR_IDP_REALM *tr_idp_realm_iter_next(TR_COMM_ITER *iter);
 
+/* iterate over members with different origins */
+TR_COMM_MEMB *tr_comm_memb_iter_first(TR_COMM_ITER *iter, TR_COMM_MEMB *memb);
+TR_COMM_MEMB *tr_comm_memb_iter_next(TR_COMM_ITER *iter);
+
+/* general realm stuff, should probably move */
+TR_NAME *tr_realm_get_id(TR_REALM *realm);
+TR_NAME *tr_realm_dup_id(TR_REALM *realm);
+
 const char *tr_realm_role_to_str(TR_REALM_ROLE role);
 TR_REALM_ROLE tr_realm_role_from_str(const char *s);