TR_COMM *comm=talloc_get_type_abort(obj, TR_COMM);
if (comm->id!=NULL)
tr_free_name(comm->id);
+ if (comm->owner_realm!=NULL)
+ tr_free_name(comm->owner_realm);
+ if (comm->owner_email!=NULL)
+ tr_free_name(comm->owner_email);
return 0;
}
comm->apcs=NULL;
comm->idp_realms=NULL;
comm->rp_realms=NULL;
+ comm->owner_realm=NULL;
+ comm->owner_contact=NULL;
talloc_set_destructor((void *)comm, tr_comm_destructor);
}
return comm;
talloc_free(comm);
}
+void tr_comm_set_id(TR_COMM *comm, TR_NAME *id)
+{
+ if (comm->id != NULL)
+ tr_free_name(comm->id);
+ comm->id=id;
+}
+
+TR_NAME *tr_comm_get_id(TR_COMM *comm)
+{
+ return comm->id;
+}
+
+TR_NAME *tr_comm_dup_id(TR_COMM *comm)
+{
+ return tr_dup_name(comm->id);
+}
+
+void tr_comm_set_type(TR_COMM *comm, TR_COMM_TYPE type)
+{
+ comm->type=type;
+}
+
+TR_COMM_TYPE tr_comm_get_type(TR_COMM *comm)
+{
+ return comm->type;
+}
+
+void tr_comm_set_owner_realm(TR_COMM *comm, TR_NAME *realm)
+{
+ if (comm->owner_realm!=NULL)
+ tr_free_name(comm->owner_realm);
+ comm->owner_realm=realm;
+}
+
+TR_NAME *tr_comm_get_owner_realm(TR_COMM *comm)
+{
+ return comm->owner_realm;
+}
+
+TR_NAME *tr_comm_dup_owner_realm(TR_COMM *comm)
+{
+ return tr_dup_name(tr->owner_realm);
+}
+
+void tr_comm_set_owner_contact(TR_COMM *comm, TR_NAME *contact)
+{
+ if (comm->owner_contact != NULL)
+ tr_free_name(comm->owner_contact);
+ comm->owner_contact=contact;
+}
+
+TR_NAME *tr_comm_get_owner_contact(TR_COMM *comm)
+{
+ return comm->owner_contact;
+}
+
+TR_NAME *tr_comm_dup_owner_contact(TR_COMM *comm)
+{
+ return tr_dup_name(tr->owner_contact);
+}
+
/* does not take responsibility for freeing IDP realm */
void tr_comm_add_idp_realm(TR_COMM *comm, TR_IDP_REALM *realm)
{
/* fill in the community with info */
comm->type=TR_COMM_APC; /* realms added this way are in APCs */
comm->expiration_interval=TR_DEFAULT_APC_EXPIRATION_INTERVAL;
- comm->id=tr_dup_name(apc->id);
+ tr_comm_set_id(comm, tr_dup_name(apc->id));
tr_comm_add_idp_realm(comm, realm);
tr_comm_add(new_comms, comm);
} else {
return rp;
}
-static TR_COMM *tr_cfg_parse_one_comm (TR_CFG *trc, json_t *jcomm, TR_CFG_RC *rc) {
+static TR_COMM *tr_cfg_parse_one_comm (TALLOC_CTX *mem_ctx, TR_CFG *trc, json_t *jcomm, TR_CFG_RC *rc)
+{
+ TALLOC_CTX *tmp_ctx=talloc_new(NULL);
TR_COMM *comm = NULL;
json_t *jid = NULL;
json_t *jtype = NULL;
tr_debug("tr_cfg_parse_one_comm: Bad parameters.");
if (rc)
*rc = TR_CFG_BAD_PARAMS;
- return NULL;
+ goto cleanup;
}
- if (NULL == (comm = talloc_zero(trc, TR_COMM))) {
+ comm=tr_comm_new(tmp_ctx);
+ if (comm==NULL) {
tr_crit("tr_cfg_parse_one_comm: Out of memory.");
*rc = TR_CFG_NOMEM;
- return NULL;
+ goto cleanup;
}
(!json_is_array(jrps))) {
tr_debug("tr_cfg_parse_one_comm: Error parsing Communities configuration.");
*rc = TR_CFG_NOPARSE;
- return NULL;
+ comm=NULL;
+ goto cleanup;
}
- if (NULL == (comm->id = tr_new_name((char *)json_string_value(jid)))) {
+ tr_comm_set_id(tr_new_name(json_string_value(jid)));
+ if (NULL == tr_comm_get_id(comm)) {
tr_debug("tr_cfg_parse_one_comm: No memory for community id.");
*rc = TR_CFG_NOMEM;
- return NULL;
+ comm=NULL;
+ goto cleanup;
}
if (0 == strcmp(json_string_value(jtype), "apc")) {
} else if (0 == strcmp(json_string_value(jtype), "coi")) {
comm->type = TR_COMM_COI;
if (NULL == (comm->apcs = tr_cfg_parse_apcs(trc, japcs, rc))) {
- tr_debug("tr_cfg_parse_one_comm: Can't parse APCs for COI %s.", comm->id->buf);
- tr_free_name(comm->id);
- return NULL;
+ tr_debug("tr_cfg_parse_one_comm: Can't parse APCs for COI %s.",
+ tr_comm_get_id(comm)->buf);
+ comm=NULL;
+ goto cleanup;
}
} else {
- tr_debug("tr_cfg_parse_one_comm: Invalid community type, comm = %s, type = %s", comm->id->buf, json_string_value(jtype));
- tr_free_name(comm->id);
+ tr_debug("tr_cfg_parse_one_comm: Invalid community type, comm = %s, type = %s",
+ tr_comm_get_id(comm)->buf, json_string_value(jtype));
*rc = TR_CFG_NOPARSE;
- return NULL;
+ comm=NULL;
+ goto cleanup;
}
comm->idp_realms = tr_cfg_parse_comm_idps(trc, jidps, rc);
if (TR_CFG_SUCCESS != *rc) {
- tr_debug("tr_cfg_parse_one_comm: Can't parse IDP realms for comm %s.", comm->id->buf);
- tr_free_name(comm->id);
- return NULL;
+ tr_debug("tr_cfg_parse_one_comm: Can't parse IDP realms for comm %s.",
+ tr_comm_get_id(comm)->buf);
+ comm=NULL;
+ goto cleanup;
}
comm->rp_realms = tr_cfg_parse_comm_rps(trc, jrps, rc);
if (TR_CFG_SUCCESS != *rc) {
- tr_debug("tr_cfg_parse_comm: Can't parse RP realms for comm %s .", comm->id->buf);
- tr_free_name(comm->id);
- return NULL;
+ tr_debug("tr_cfg_parse_comm: Can't parse RP realms for comm %s .",
+ tr_comm_get_id(comm)->buf);
+ comm=NULL;
+ goto cleanup;
}
if (TR_COMM_APC == comm->type) {
if (jexpire) {
if (!json_is_integer(jexpire)) {
fprintf(stderr, "tr_parse_comm: expirae_interval is not an integer\n");
- return NULL;
+ comm=NULL;
+ goto cleanup;
}
comm->expiration_interval = json_integer_value(jexpire);
if (comm->expiration_interval <= 10)
comm->expiration_interval = 129600;
}
}
-
+
+cleanup:
+ if (comm!=NULL)
+ talloc_steal(mem_ctx, comm);
+ talloc_free(tmp_ctx);
return comm;
}
}
for (i = 0; i < json_array_size(jcomms); i++) {
- if (NULL == (comm = tr_cfg_parse_one_comm(trc,
- json_array_get(jcomms, i),
- &rc))) {
+ if (NULL == (comm = tr_cfg_parse_one_comm(NULL, /* TODO: use a talloc context */
+ trc,
+ json_array_get(jcomms, i),
+ &rc))) {
return rc;
}
- tr_debug("tr_cfg_parse_comms: Community configured: %s.", comm->id->buf);
+ tr_debug("tr_cfg_parse_comms: Community configured: %s.",
+ tr_comm_get_id(comm)->buf);
comm->next = trc->comms;
trc->comms = comm;
}
TR_APC *apcs;
TR_IDP_REALM *idp_realms;
TR_RP_REALM *rp_realms;
+ TR_NAME *owner_realm; /* what realm owns this community? */
+ TR_NAME *owner_contact; /* contact email */
time_t expiration_interval; /*Minutes to key expiration; only valid for an APC*/
} TR_COMM;
TR_COMM *tr_comm_new(TALLOC_CTX *mem_ctx);
void tr_comm_free(TR_COMM *comm);
+void tr_comm_set_id(TR_COMM *comm, TR_NAME *id);
+TR_NAME *tr_comm_get_id(TR_COMM *comm);
+TR_NAME *tr_comm_dup_id(TR_COMM *comm);
+void tr_comm_set_type(TR_COMM *comm, TR_COMM_TYPE type);
+TR_COMM_TYPE tr_comm_get_type(TR_COMM *comm);
+void tr_comm_set_owner_realm(TR_COMM *comm, TR_NAME *realm);
+TR_NAME *tr_comm_get_owner_realm(TR_COMM *comm);
+TR_NAME *tr_comm_dup_owner_realm(TR_COMM *comm);
+void tr_comm_set_owner_contact(TR_COMM *comm, TR_NAME *contact);
+TR_NAME *tr_comm_get_owner_contact(TR_COMM *comm);
+TR_NAME *tr_comm_dup_owner_contact(TR_COMM *comm);
TR_COMM *tr_comm_add_func(TR_COMM *comms, TR_COMM *new); /* use the macro instead */
#define tr_comm_add(comms, new) ((comms)=tr_comm_add_func((comms), (new)))
void tr_comm_add_idp_realm(TR_COMM *comm, TR_IDP_REALM *realm);