/* 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;
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);
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);
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);
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);
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);