+ return TR_CFG_SUCCESS;
+}
+
+static TR_CFG_RC tr_cfg_parse_internal (TR_INSTANCE *tr, json_t *jcfg) {
+ json_t *jint = NULL;
+ json_t *jmtd = NULL;
+
+ if ((!tr) || (!tr->new_cfg) || (!jcfg))
+ return TR_CFG_BAD_PARAMS;
+
+ if (NULL == (tr->new_cfg->internal = malloc(sizeof(TR_CFG_INTERNAL))))
+ return TR_CFG_NOMEM;
+
+ memset(tr->new_cfg->internal, 0, sizeof(TR_CFG_INTERNAL));
+
+ if ((NULL != (jint = json_object_get(jcfg, "tr_internal"))) &&
+ (NULL != (jmtd = json_object_get(jint, "max_tree_depth")))) {
+ if (json_is_number(jmtd)) {
+ tr->new_cfg->internal->max_tree_depth = json_integer_value(jmtd);
+ } else {
+ fprintf(stderr,"tr_cfg_parse_internal: Parsing error, max_tree_depth is not a number.\n");
+ return TR_CFG_NOPARSE;
+ }
+ } else {
+ /* If not configured, use the default */
+ tr->new_cfg->internal->max_tree_depth = TR_DEFAULT_MAX_TREE_DEPTH;
+ }
+ fprintf(stderr, "tr_cfg_parse_internal: Internal config parsed.\n");
+ return TR_CFG_SUCCESS;
+}
+
+static TR_CFG_RC tr_cfg_parse_rp_clients (TR_INSTANCE *tr, json_t *jcfg) {
+ // json_t *jrpr = NULL;
+
+ return TR_CFG_SUCCESS;
+}
+
+static TR_AAA_SERVER *tr_cfg_parse_one_aaa_server (TR_INSTANCE *tr, json_t *jaddr, TR_CFG_RC *rc) {
+ TR_AAA_SERVER *aaa = NULL;
+
+ if ((!tr) || (!tr->new_cfg) || (!jaddr) || (!json_is_string(jaddr))) {
+ fprintf(stderr, "tr_cfg_parse_one_aaa_server: Bad parameters.\n");
+ *rc = TR_CFG_BAD_PARAMS;
+ return NULL;
+ }
+
+ if (NULL == (aaa = malloc(sizeof(TR_AAA_SERVER)))) {
+ fprintf(stderr, "tr_config_parse_one_aaa_server: Out of memory.\n");
+ *rc = TR_CFG_NOMEM;
+ return NULL;
+ }
+
+ memset(aaa, 0, sizeof(TR_AAA_SERVER));
+
+ /* TBD -- Handle IPv6 addresses */
+ inet_aton(json_string_value(jaddr), &(aaa->aaa_server_addr));
+
+ return aaa;
+}
+
+
+static TR_AAA_SERVER *tr_cfg_parse_aaa_servers (TR_INSTANCE *tr, json_t *jaaas, TR_CFG_RC *rc)
+{
+ TR_AAA_SERVER *aaa = NULL;
+ TR_AAA_SERVER *temp_aaa = NULL;
+ int i = 0;
+
+ for (i = 0; i < json_array_size(jaaas); i++) {
+ if (NULL == (temp_aaa = tr_cfg_parse_one_aaa_server(tr, json_array_get(jaaas, i), rc))) {
+ return NULL;
+ }
+ /* TBD -- IPv6 addresses */
+ // fprintf(stderr, "tr_cfg_parse_aaa_servers: Configuring AAA Server: ip_addr = %s.\n", inet_ntoa(temp_aaa->aaa_server_addr));
+ temp_aaa->next = aaa;
+ aaa = temp_aaa;
+ }
+ return aaa;
+}
+
+static TR_APC *tr_cfg_parse_apcs (TR_INSTANCE *tr, json_t *apcs, TR_CFG_RC *rc)
+{
+ TR_APC *apc;
+
+ return (apc = malloc(sizeof(TR_APC)));
+}
+
+static TR_IDP_REALM *tr_cfg_parse_one_idp_realm (TR_INSTANCE *tr, json_t *jidp, TR_CFG_RC *rc) {
+ TR_IDP_REALM *idp = NULL;
+ json_t *jrid = NULL;
+ json_t *jscfg = NULL;
+ json_t *jsrvrs = NULL;
+ json_t *japcs = NULL;
+
+ if ((!tr) || (!tr->new_cfg) || (!jidp)) {
+ fprintf(stderr, "tr_cfg_parse_one_idp_realm: Bad parameters.\n");
+ *rc = TR_CFG_BAD_PARAMS;
+ return NULL;
+ }
+
+ if (NULL == (idp = malloc(sizeof(TR_IDP_REALM)))) {
+ fprintf(stderr, "tr_config_parse_one_idp_realm: Our of memory.\n");
+ *rc = TR_CFG_NOMEM;
+ return NULL;
+ }
+
+ memset(idp, 0, sizeof(TR_IDP_REALM));
+
+ if ((NULL == (jrid = json_object_get(jidp, "realm_id"))) ||
+ (!json_is_string(jrid)) ||
+ (NULL == (jscfg = json_object_get(jidp, "shared_config"))) ||
+ (!json_is_string(jscfg)) ||
+ (NULL == (jsrvrs = json_object_get(jidp, "aaa_servers"))) ||
+ (!json_is_array(jsrvrs)) ||
+ (NULL == (japcs = json_object_get(jidp, "apcs"))) ||
+ (!json_is_array(japcs))) {
+ fprintf(stderr, "tr_cfg_parse_one_realm: Error parsing IDP realm configuration.\n");
+ free(idp);
+ *rc = TR_CFG_NOPARSE;
+ return NULL;
+ }
+
+ if (0 == strcmp(json_string_value(jscfg), "no")) {
+ idp->shared_config = 0;
+ } else {
+ idp->shared_config = 1;
+ }
+
+ if (NULL == (idp->realm_id = tr_new_name((char *)json_string_value(jrid)))) {
+ free(idp);
+ fprintf(stderr, "tr_cfg_parse_one_idp_realm: No memory for realm id.\n");
+ *rc = TR_CFG_NOMEM;
+ return NULL;
+ }
+
+ if (NULL == (idp->aaa_servers = tr_cfg_parse_aaa_servers(tr, jsrvrs, rc))) {
+ fprintf(stderr, "tr_cfg_parse_one_idp_realm: Can't parse AAA servers for realm %s.\n", idp->realm_id->buf);
+ tr_free_name(idp->realm_id);
+ free(idp);
+ return NULL;
+ }
+ if (NULL == (idp->apcs = tr_cfg_parse_apcs(tr, japcs, rc))) {
+ fprintf(stderr, "tr_cfg_parse_one_idp_realm: Can't parse APCs for realm %s .\n", idp->realm_id->buf);
+ tr_free_name(idp->realm_id);
+ /* TBD -- free aaa_servers */;
+ free(idp);
+ return NULL;
+ }
+
+return idp;
+}
+
+static TR_CFG_RC tr_cfg_parse_idp_realms (TR_INSTANCE *tr, json_t *jcfg)
+{
+ json_t *jidps = NULL;
+ TR_CFG_RC rc = TR_CFG_SUCCESS;
+ TR_IDP_REALM *idp = NULL;
+ int i = 0;
+
+ if ((!tr) || (!tr->new_cfg) || (!jcfg))
+ return TR_CFG_BAD_PARAMS;
+
+ if ((NULL == (jidps = json_object_get(jcfg, "idp_realms"))) ||
+ (!json_is_array(jidps))) {
+ return TR_CFG_NOPARSE;
+ }
+
+ for (i = 0; i < json_array_size(jidps); i++) {
+ if (NULL == (idp = tr_cfg_parse_one_idp_realm(tr, json_array_get(jidps, i), &rc))) {
+ return rc;
+ }
+ fprintf(stderr, "tr_cfg_parse_idp_realms: IDP realm configured: realm_id = %s.\n", idp->realm_id->buf);
+ idp->next = tr->new_cfg->idp_realms;
+ tr->new_cfg->idp_realms = idp;
+ }