Move community/realm out of inforec and into update message.
authorJennifer Richards <jennifer@painless-security.com>
Tue, 27 Sep 2016 19:35:18 +0000 (15:35 -0400)
committerJennifer Richards <jennifer@painless-security.com>
Tue, 27 Sep 2016 19:35:18 +0000 (15:35 -0400)
common/tr_comm.c
common/tr_config.c
common/tr_msg.c
include/tr_comm.h
include/trp_internal.h
include/trust_router/trp.h
trp/trp_upd.c
trp/trps.c

index f71d130..b8b8730 100644 (file)
@@ -46,8 +46,8 @@ static int tr_comm_destructor(void *obj)
     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);
+  if (comm->owner_contact!=NULL)
+    tr_free_name(comm->owner_contact);
   return 0;
 }
 
@@ -114,7 +114,7 @@ TR_NAME *tr_comm_get_owner_realm(TR_COMM *comm)
 
 TR_NAME *tr_comm_dup_owner_realm(TR_COMM *comm)
 {
-  return tr_dup_name(tr->owner_realm);
+  return tr_dup_name(comm->owner_realm);
 }
 
 void tr_comm_set_owner_contact(TR_COMM *comm, TR_NAME *contact)
@@ -131,7 +131,7 @@ TR_NAME *tr_comm_get_owner_contact(TR_COMM *comm)
 
 TR_NAME *tr_comm_dup_owner_contact(TR_COMM *comm)
 {
-  return tr_dup_name(tr->owner_contact);
+  return tr_dup_name(comm->owner_contact);
 }
 
 /* does not take responsibility for freeing IDP realm */
@@ -235,3 +235,22 @@ TR_COMM *tr_comm_lookup(TR_COMM *comms, TR_NAME *comm_name)
   }
   return NULL;
 }
+
+const char *tr_comm_type_to_str(TR_COMM_TYPE type)
+{
+  const char *s=NULL;
+  switch(type) {
+  case TR_COMM_UNKNOWN:
+    s="unknown";
+    break;
+  case TR_COMM_APC:
+    s="APC";
+    break;
+  case TR_COMM_COI:
+    s="COI";
+    break;
+  default:
+    s="invalid";
+  }
+  return s;
+}
index f5eedd8..4307183 100644 (file)
@@ -1720,7 +1720,7 @@ static TR_COMM *tr_cfg_parse_one_comm (TALLOC_CTX *mem_ctx, TR_CFG *trc, json_t
     goto cleanup;
   }
 
-  tr_comm_set_id(tr_new_name(json_string_value(jid)));
+  tr_comm_set_id(comm, 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;
index 9591cd4..879ac55 100644 (file)
@@ -534,7 +534,7 @@ static TID_RESP *tr_msg_decode_tidresp(json_t *jresp)
 
 /* Information records for TRP update msg 
  * requires that jrec already be allocated */
-static TRP_RC tr_msg_encode_inforec_route(json_t *jrec, TRP_INFOREC *rec )
+static TRP_RC tr_msg_encode_inforec_route(json_t *jrec, TRP_INFOREC *rec)
 {
   json_t *jstr=NULL;
   json_t *jint=NULL;
@@ -543,29 +543,8 @@ static TRP_RC tr_msg_encode_inforec_route(json_t *jrec, TRP_INFOREC *rec )
   if (rec==NULL)
     return TRP_BADTYPE;
 
-  if ((trp_inforec_get_comm(rec)==NULL)
-     || (trp_inforec_get_realm(rec)==NULL)
-     || (trp_inforec_get_trust_router(rec)==NULL)) {
+  if (trp_inforec_get_trust_router(rec)==NULL)
     return TRP_ERROR;
-  }
-
-  s=tr_name_strdup(trp_inforec_get_comm(rec));
-  if (s==NULL)
-    return TRP_NOMEM;
-  jstr=json_string(s);
-  free(s);s=NULL;
-  if(jstr==NULL)
-    return TRP_ERROR;
-  json_object_set_new(jrec, "community", jstr);
-
-  s=tr_name_strdup(trp_inforec_get_realm(rec));
-  if (s==NULL)
-    return TRP_NOMEM;
-  jstr=json_string(s);
-  free(s);s=NULL;
-  if(jstr==NULL)
-    return TRP_ERROR;
-  json_object_set_new(jrec, "realm", jstr);
 
   s=tr_name_strdup(trp_inforec_get_trust_router(rec));
   if (s==NULL)
@@ -652,20 +631,6 @@ static TRP_INFOREC *tr_msg_decode_trp_inforec(TALLOC_CTX *mem_ctx, json_t *jreco
 
   tr_debug("tr_msg_decode_trp_inforec: '%s' record found.", trp_inforec_type_to_string(rec->type));
 
-  rc=tr_msg_get_json_string(jrecord, "community", &s, tmp_ctx);
-  if (rc != TRP_SUCCESS)
-    goto cleanup;
-  if (TRP_SUCCESS!=trp_inforec_set_comm(rec, tr_new_name(s)))
-    goto cleanup;
-  talloc_free(s); s=NULL;
-
-  rc=tr_msg_get_json_string(jrecord, "realm", &s, tmp_ctx);
-  if (rc != TRP_SUCCESS)
-    goto cleanup;
-  if (TRP_SUCCESS!=trp_inforec_set_realm(rec, tr_new_name(s)))
-    goto cleanup;
-  talloc_free(s); s=NULL;
-
   rc=tr_msg_get_json_string(jrecord, "trust_router", &s, tmp_ctx);
   if (rc != TRP_SUCCESS)
     goto cleanup;
@@ -701,7 +666,9 @@ static json_t *tr_msg_encode_trp_upd(TRP_UPD *update)
   json_t *jupdate=NULL;
   json_t *jrecords=NULL;
   json_t *jrec=NULL;
+  json_t *jstr=NULL;
   TRP_INFOREC *rec;
+  char *s=NULL;
 
   if (update==NULL)
     return NULL;
@@ -710,6 +677,32 @@ static json_t *tr_msg_encode_trp_upd(TRP_UPD *update)
   if (jupdate==NULL)
     return NULL;
 
+  s=tr_name_strdup(trp_upd_get_comm(update));
+  if (s==NULL) {
+    json_decref(jupdate);
+    return NULL;
+  }
+  jstr=json_string(s);
+  free(s);s=NULL;
+  if(jstr==NULL) {
+    json_decref(jupdate);
+    return NULL;
+  }
+  json_object_set_new(jupdate, "community", jstr);
+
+  s=tr_name_strdup(trp_upd_get_realm(update));
+  if (s==NULL) {
+    json_decref(jupdate);
+    return NULL;
+  }
+  jstr=json_string(s);
+  free(s);s=NULL;
+  if(jstr==NULL) {
+    json_decref(jupdate);
+    return NULL;
+  }
+  json_object_set_new(jrec, "realm", jstr);
+
   jrecords=json_array();
   if (jrecords==NULL) {
     json_decref(jupdate);
@@ -744,6 +737,8 @@ static TRP_UPD *tr_msg_decode_trp_upd(TALLOC_CTX *mem_ctx, json_t *jupdate)
   TRP_UPD *update=NULL;
   TRP_INFOREC *new_rec=NULL;
   TRP_INFOREC *list_tail=NULL;
+  char *s=NULL;
+  TR_NAME *name;
   TRP_RC rc=TRP_ERROR;
 
   update=trp_upd_new(tmp_ctx);
@@ -752,6 +747,24 @@ static TRP_UPD *tr_msg_decode_trp_upd(TALLOC_CTX *mem_ctx, json_t *jupdate)
     goto cleanup;
   }
 
+  rc=tr_msg_get_json_string(jupdate, "community", &s, tmp_ctx);
+  if (rc != TRP_SUCCESS)
+    goto cleanup;
+  name=tr_new_name(s);
+  if (name==NULL)
+    goto cleanup;
+  talloc_free(s); s=NULL;
+  trp_upd_set_comm(update, name);
+
+  rc=tr_msg_get_json_string(jupdate, "realm", &s, tmp_ctx);
+  if (rc != TRP_SUCCESS)
+    goto cleanup;
+  name=tr_new_name(s);
+  if (name==NULL)
+    goto cleanup;
+  talloc_free(s); s=NULL;
+  trp_upd_set_realm(update, name);
+
   jrecords=json_object_get(jupdate, "records");
   if ((jrecords==NULL) || (!json_is_array(jrecords))) {
     rc=TRP_NOPARSE;
index 8730292..85c7b03 100644 (file)
@@ -77,5 +77,6 @@ void tr_comm_add_rp_realm(TR_COMM *comm, TR_RP_REALM *realm);
 TR_COMM *tr_comm_lookup(TR_COMM *comms, TR_NAME *comm_name);
 TR_RP_REALM *tr_find_comm_rp (TR_COMM *comm, TR_NAME *rp_realm);
 TR_IDP_REALM *tr_find_comm_idp (TR_COMM *comm, TR_NAME *idp_realm);
+const char *tr_comm_type_to_str(TR_COMM_TYPE type);
 
 #endif
index 09decc1..c7e4b22 100644 (file)
 #include <tr_msg.h>
 #include <trp_ptable.h>
 #include <trp_rtable.h>
+#include <tr_apc.h>
+#include <tr_comm.h>
 #include <trust_router/trp.h>
 
 /* info records */
 /* TRP update record types */
 typedef struct trp_inforec_route {
-  TR_NAME *comm;
-  TR_NAME *realm;
   TR_NAME *trust_router;
   TR_NAME *next_hop;
   unsigned int next_hop_port;
@@ -57,20 +57,29 @@ typedef struct trp_inforec_route {
   unsigned int interval;
 } TRP_INFOREC_ROUTE;
 
-/* TODO: define struct trp_msg_info_community */
+typedef struct trp_inforec_comm {
+  TR_COMM_TYPE type;
+  int is_service_realm;
+  int is_idp_realm;
+  TR_APC *apcs;
+  TR_NAME *owner_realm;
+  TR_NAME *owner_contact;
+} TRP_INFOREC_COMM;
 
 typedef union trp_inforec_data {
   TRP_INFOREC_ROUTE *route;
-  /* TRP_INFOREC_COMM *comm; */
+  TRP_INFOREC_COMM *comm;
 } TRP_INFOREC_DATA;
 
 struct trp_inforec {
   TRP_INFOREC *next;
   TRP_INFOREC_TYPE type;
-  TRP_INFOREC_DATA data; /* contains pointer to one of the record types */
+  TRP_INFOREC_DATA *data; /* contains pointer to one of the record types */
 };
 
 struct trp_update {
+  TR_NAME *realm;
+  TR_NAME *comm;
   TRP_INFOREC *records;
   TR_NAME *peer; /* who did this update come from? */
 };
index e683649..f54c959 100644 (file)
@@ -79,6 +79,12 @@ void trp_upd_free(TRP_UPD *update);
 TR_EXPORT TRP_INFOREC *trp_upd_get_inforec(TRP_UPD *upd);
 void trp_upd_set_inforec(TRP_UPD *upd, TRP_INFOREC *rec);
 void trp_upd_add_inforec(TRP_UPD *upd, TRP_INFOREC *rec);
+TR_EXPORT TR_NAME *trp_upd_get_realm(TRP_UPD *upd);
+TR_NAME *trp_upd_dup_realm(TRP_UPD *upd);
+void trp_upd_set_realm(TRP_UPD *upd, TR_NAME *realm);
+TR_EXPORT TR_NAME *trp_upd_get_comm(TRP_UPD *upd);
+TR_NAME *trp_upd_dup_comm(TRP_UPD *upd);
+void trp_upd_set_comm(TRP_UPD *upd, TR_NAME *comm);
 TR_EXPORT TR_NAME *trp_upd_get_peer(TRP_UPD *upd);
 TR_NAME *trp_upd_dup_peer(TRP_UPD *upd);
 void trp_upd_set_peer(TRP_UPD *upd, TR_NAME *peer);
index 927c993..cbffd8c 100644 (file)
 
 
 /* static prototypes */
-static void *trp_inforec_route_new(TALLOC_CTX *mem_ctx);
-static void trp_inforec_route_print(TRP_INFOREC_DATA);
+static TRP_INFOREC_DATA *trp_inforec_route_new(TALLOC_CTX *mem_ctx);
+static void trp_inforec_route_print(TRP_INFOREC_DATA *);
+static TRP_INFOREC_DATA *trp_inforec_comm_new(TALLOC_CTX *mem_ctx);
+static void trp_inforec_comm_print(TRP_INFOREC_DATA *);
 
 
 struct trp_inforec_type_entry {
   const char *name;
   TRP_INFOREC_TYPE type;
-  void *(*allocate)(TALLOC_CTX *);
-  void (*print)(TRP_INFOREC_DATA);
+  TRP_INFOREC_DATA *(*allocate)(TALLOC_CTX *);
+  void (*print)(TRP_INFOREC_DATA *);
 };
 static struct trp_inforec_type_entry trp_inforec_type_table[] = {
   { "route", TRP_INFOREC_TYPE_ROUTE, trp_inforec_route_new, trp_inforec_route_print },
-  { "comm", TRP_INFOREC_TYPE_COMMUNITY, NULL, NULL },
+  { "comm", TRP_INFOREC_TYPE_COMMUNITY, trp_inforec_comm_new, trp_inforec_comm_print },
   { NULL, TRP_INFOREC_TYPE_UNKNOWN, NULL, NULL } /* must be the last entry */
 };
 
@@ -95,45 +97,73 @@ static int trp_inforec_route_destructor(void *object)
   TRP_INFOREC_ROUTE *body=talloc_get_type_abort(object, TRP_INFOREC_ROUTE);
   
   /* clean up TR_NAME data, which are not managed by talloc */
-  if (body->comm != NULL) {
-    tr_free_name(body->comm);
-    body->comm=NULL;
-    tr_debug("trp_inforec_route_destructor: freed community");
-  }
-  if (body->realm != NULL) {
-    tr_free_name(body->realm);
-    body->realm=NULL;
-    tr_debug("trp_inforec_route_destructor: freed realm");
-  }
-  if (body->trust_router != NULL) {
+  if (body->trust_router != NULL)
     tr_free_name(body->trust_router);
-    body->trust_router=NULL;
-    tr_debug("trp_inforec_route_destructor: freed trust_router");
-  }
-  if (body->next_hop != NULL) {
+  if (body->next_hop != NULL)
     tr_free_name(body->next_hop);
-    body->next_hop=NULL;
-    tr_debug("trp_inforec_route_destructor: freed next_hop");
-  }
-
   return 0;
 }
 
-static void *trp_inforec_route_new(TALLOC_CTX *mem_ctx)
+static TRP_INFOREC_DATA *trp_inforec_route_new(TALLOC_CTX *mem_ctx)
 {
-  TRP_INFOREC_ROUTE *new_rec=talloc(mem_ctx, TRP_INFOREC_ROUTE);
+  TRP_INFOREC_DATA *new_data=talloc(mem_ctx, TRP_INFOREC_DATA);
+  TRP_INFOREC_ROUTE *new_rec=NULL;
+
+  if (new_data==NULL)
+    return NULL;
 
-  if (new_rec != NULL) {
-    new_rec->comm=NULL;
-    new_rec->realm=NULL;
+  new_rec=talloc(new_data, TRP_INFOREC_ROUTE);
+  if (new_rec == NULL) {
+    talloc_free(new_data);
+    new_data=NULL;
+  } else {
     new_rec->trust_router=NULL;
     new_rec->next_hop=NULL;
     new_rec->next_hop_port=0;
     new_rec->metric=TRP_METRIC_INFINITY;
     new_rec->interval=0;
     talloc_set_destructor((void *)new_rec, trp_inforec_route_destructor);
+    new_data->route=new_rec;
   }
-  return new_rec;
+    
+  return new_data;
+}
+
+
+static int trp_inforec_comm_destructor(void *obj)
+{
+  TRP_INFOREC_COMM *rec=talloc_get_type_abort(obj, TRP_INFOREC_COMM);
+  if (rec->owner_realm!=NULL)
+    tr_free_name(rec->owner_realm);
+  if (rec->owner_contact!=NULL)
+    tr_free_name(rec->owner_contact);
+  return 0;
+}
+
+static TRP_INFOREC_DATA *trp_inforec_comm_new(TALLOC_CTX *mem_ctx)
+{
+  TRP_INFOREC_DATA *new_data=talloc(mem_ctx, TRP_INFOREC_DATA);
+  TRP_INFOREC_COMM *new_rec=NULL;
+
+  if (new_data==NULL)
+    return NULL;
+
+  new_rec=talloc(new_data, TRP_INFOREC_COMM);
+  if (new_rec==NULL) {
+    talloc_free(new_data);
+    new_data=NULL;
+  } else {
+    new_rec->type=TR_COMM_UNKNOWN;
+    new_rec->is_service_realm=0;
+    new_rec->is_idp_realm=0;
+    new_rec->apcs=NULL;
+    new_rec->owner_realm=NULL;
+    new_rec->owner_contact=NULL;
+    talloc_set_destructor((void *)new_rec, trp_inforec_comm_destructor);
+    new_data->comm=new_rec;
+  }
+
+  return new_data;
 }
 
 TRP_INFOREC *trp_inforec_get_next(TRP_INFOREC *rec)
@@ -171,78 +201,12 @@ void trp_inforec_set_type(TRP_INFOREC *rec, TRP_INFOREC_TYPE type)
     rec->type=type;
 }
 
-TR_NAME *trp_inforec_get_comm(TRP_INFOREC *rec)
-{
-  switch (rec->type) {
-  case TRP_INFOREC_TYPE_ROUTE:
-    if (rec->data.route!=NULL)
-      return rec->data.route->comm;
-    break;
-  default:
-    break;
-  }
-  return NULL;
-}
-
-TR_NAME *trp_inforec_dup_comm(TRP_INFOREC *rec)
-{
-  return tr_dup_name(trp_inforec_get_comm(rec));
-}
-
-TRP_RC trp_inforec_set_comm(TRP_INFOREC *rec, TR_NAME *comm)
-{
-  switch (rec->type) {
-  case TRP_INFOREC_TYPE_ROUTE:
-    if (rec->data.route!=NULL) {
-      rec->data.route->comm=comm;
-      return TRP_SUCCESS;
-    }
-    break;
-  default:
-    break;
-  }
-  return TRP_ERROR;
-}
-
-TR_NAME *trp_inforec_get_realm(TRP_INFOREC *rec)
-{
-  switch (rec->type) {
-  case TRP_INFOREC_TYPE_ROUTE:
-    if (rec->data.route!=NULL)
-      return rec->data.route->realm;
-    break;
-  default:
-    break;
-  }
-  return NULL;
-}
-
-TR_NAME *trp_inforec_dup_realm(TRP_INFOREC *rec)
-{
-  return tr_dup_name(trp_inforec_get_realm(rec));
-}
-
-TRP_RC trp_inforec_set_realm(TRP_INFOREC *rec, TR_NAME *realm)
-{
-  switch (rec->type) {
-  case TRP_INFOREC_TYPE_ROUTE:
-    if (rec->data.route!=NULL) {
-      rec->data.route->realm=realm;
-      return TRP_SUCCESS;
-    } 
-    break;
-  default:
-    break;
-  }
-  return TRP_ERROR;
-}
-
 TR_NAME *trp_inforec_get_trust_router(TRP_INFOREC *rec)
 {
   switch (rec->type) {
   case TRP_INFOREC_TYPE_ROUTE:
-    if (rec->data.route!=NULL)
-      return rec->data.route->trust_router;
+    if (rec->data->route!=NULL)
+      return rec->data->route->trust_router;
     break;
   default:
     break;
@@ -259,8 +223,8 @@ TRP_RC trp_inforec_set_trust_router(TRP_INFOREC *rec, TR_NAME *trust_router)
 {
   switch (rec->type) {
   case TRP_INFOREC_TYPE_ROUTE:
-    if (rec->data.route!=NULL) {
-      rec->data.route->trust_router=trust_router;
+    if (rec->data->route!=NULL) {
+      rec->data->route->trust_router=trust_router;
       return TRP_SUCCESS;
     }
     break;
@@ -275,8 +239,8 @@ TR_NAME *trp_inforec_get_next_hop(TRP_INFOREC *rec)
 {
   switch (rec->type) {
   case TRP_INFOREC_TYPE_ROUTE:
-    if (rec->data.route!=NULL)
-      return rec->data.route->next_hop;
+    if (rec->data->route!=NULL)
+      return rec->data->route->next_hop;
     break;
   default:
     break;
@@ -293,8 +257,8 @@ TRP_RC trp_inforec_set_next_hop(TRP_INFOREC *rec, TR_NAME *next_hop)
 {
   switch (rec->type) {
   case TRP_INFOREC_TYPE_ROUTE:
-    if (rec->data.route!=NULL) {
-      rec->data.route->next_hop=next_hop;
+    if (rec->data->route!=NULL) {
+      rec->data->route->next_hop=next_hop;
       return TRP_SUCCESS;
     }
     break;
@@ -308,8 +272,8 @@ unsigned int trp_inforec_get_metric(TRP_INFOREC *rec)
 {
   switch (rec->type) {
   case TRP_INFOREC_TYPE_ROUTE:
-    if (rec->data.route!=NULL)
-      return rec->data.route->metric;
+    if (rec->data->route!=NULL)
+      return rec->data->route->metric;
     break;
   default:
     break;
@@ -321,8 +285,8 @@ TRP_RC trp_inforec_set_metric(TRP_INFOREC *rec, unsigned int metric)
 {
   switch (rec->type) {
   case TRP_INFOREC_TYPE_ROUTE:
-    if (rec->data.route!=NULL) {
-      rec->data.route->metric=metric;
+    if (rec->data->route!=NULL) {
+      rec->data->route->metric=metric;
       return TRP_SUCCESS;
     }
     break;
@@ -336,8 +300,8 @@ unsigned int trp_inforec_get_interval(TRP_INFOREC *rec)
 {
   switch (rec->type) {
   case TRP_INFOREC_TYPE_ROUTE:
-    if (rec->data.route!=NULL)
-      return rec->data.route->interval;
+    if (rec->data->route!=NULL)
+      return rec->data->route->interval;
     break;
   default:
     break;
@@ -349,8 +313,8 @@ TRP_RC trp_inforec_set_interval(TRP_INFOREC *rec, unsigned int interval)
 {
   switch (rec->type) {
   case TRP_INFOREC_TYPE_ROUTE:
-    if (rec->data.route!=NULL) {
-      rec->data.route->interval=interval;
+    if (rec->data->route!=NULL) {
+      rec->data->route->interval=interval;
       return TRP_SUCCESS;
   default:
     break;
@@ -360,35 +324,31 @@ TRP_RC trp_inforec_set_interval(TRP_INFOREC *rec, unsigned int interval)
   return TRP_ERROR;
 }
 
-/* for internal use only; must set rec->type before calling this */
-static TRP_RC trp_inforec_set_data(TRP_INFOREC *rec, void *data)
+static void trp_inforec_set_data(TRP_INFOREC *rec, TRP_INFOREC_DATA *data)
 {
-  if (data==NULL)
-    return TRP_ERROR;
-
-  switch (rec->type) {
-  case TRP_INFOREC_TYPE_ROUTE:
-    rec->data.route=talloc_get_type(data, TRP_INFOREC_ROUTE);
-    break;
-  default:
-    return TRP_BADTYPE;
-  }
-  return TRP_SUCCESS;
+  if (rec->data!=NULL)
+    talloc_free(rec->data);
+  rec->data=data;
+  talloc_steal(rec, data); /* make sure it's in our context */
 }
 
 /* generic record type */
 TRP_INFOREC *trp_inforec_new(TALLOC_CTX *mem_ctx, TRP_INFOREC_TYPE type)
 {
   TRP_INFOREC *new_rec=talloc(mem_ctx, TRP_INFOREC);
+  TRP_INFOREC_DATA *data=NULL;
   struct trp_inforec_type_entry *dtype=get_trp_inforec_type_entry(type);
 
   if ((new_rec != NULL) && (dtype->type != TRP_INFOREC_TYPE_UNKNOWN)) {
     trp_inforec_set_type(new_rec, type);
     trp_inforec_set_next(new_rec, NULL);
     if (dtype->allocate!=NULL) {
-      if (TRP_SUCCESS!=trp_inforec_set_data(new_rec, dtype->allocate(new_rec))) {
+      data=dtype->allocate(new_rec);
+      if (data!=NULL)
+        trp_inforec_set_data(new_rec, data);
+      else {
         talloc_free(new_rec);
-        new_rec=NULL;
+        return NULL;
       }
     }
   }
@@ -451,6 +411,40 @@ void trp_upd_add_inforec(TRP_UPD *upd, TRP_INFOREC *rec)
   talloc_steal(upd, rec);
 }
 
+TR_NAME *trp_upd_get_realm(TRP_UPD *upd)
+{
+  return upd->realm;
+}
+
+TR_NAME *trp_upd_dup_realm(TRP_UPD *upd)
+{
+  return tr_dup_name(upd->realm);
+}
+
+void trp_upd_set_realm(TRP_UPD *upd, TR_NAME *realm)
+{
+  if (upd->realm!=NULL)
+    tr_free_name(upd->realm);
+  upd->realm=realm;
+}
+
+TR_NAME *trp_upd_get_comm(TRP_UPD *upd)
+{
+  return upd->comm;
+}
+
+TR_NAME *trp_upd_dup_comm(TRP_UPD *upd)
+{
+  return tr_dup_name(upd->comm);
+}
+
+void trp_upd_set_comm(TRP_UPD *upd, TR_NAME *comm)
+{
+  if (upd->comm!=NULL)
+    tr_free_name(upd->comm);
+  upd->comm=comm;
+}
+
 TR_NAME *trp_upd_get_peer(TRP_UPD *upd)
 {
   return upd->peer;
@@ -480,14 +474,24 @@ void trp_upd_set_next_hop(TRP_UPD *upd, const char *hostname, unsigned int port)
 }
 
 /* pretty print */
-static void trp_inforec_route_print(TRP_INFOREC_DATA data)
-{
-  if (data.route!=NULL) {
-    printf("     community=%.*s\n     realm=%.*s\n     trust_router=%.*s\n     metric=%d\n     interval=%d]\n",
-           data.route->comm->len, data.route->comm->buf,
-           data.route->realm->len, data.route->realm->buf,
-           data.route->trust_router->len, data.route->trust_router->buf,
-           data.route->metric, data.route->interval);
+static void trp_inforec_route_print(TRP_INFOREC_DATA *data)
+{
+  if (data->route!=NULL) {
+    printf("     trust_router=%.*s\n     metric=%d\n     interval=%d]\n",
+           data->route->trust_router->len, data->route->trust_router->buf,
+           data->route->metric, data->route->interval);
   }
 }
 
+static void trp_inforec_comm_print(TRP_INFOREC_DATA *data)
+{
+  if (data->comm!=NULL) {
+    printf("     type=%s\n     service=%s\n     IdP=%s\n     owner=%.*s\n     contact=%.*s]\n",
+           tr_comm_type_to_str(data->comm->type),
+           (data->comm->is_service_realm)?"yes":"no",
+           (data->comm->is_idp_realm)?"yes":"no",
+           data->comm->owner_realm->len, data->comm->owner_realm->buf,
+           data->comm->owner_contact->len, data->comm->owner_contact->buf);
+    /* TODO: print apcs */
+  }
+}
index 47479c7..54a43a7 100644 (file)
@@ -458,6 +458,7 @@ void trps_handle_connection(TRPS_INSTANCE *trps, TRP_CONNECTION *conn)
   tr_debug("trps_handle_connection: connection closed.");
 }
 
+/* TODO: check realm/comm, now part of the update instead of inforec */
 static TRP_RC trps_validate_update(TRPS_INSTANCE *trps, TRP_UPD *upd)
 {
   if (upd==NULL) {
@@ -465,6 +466,16 @@ static TRP_RC trps_validate_update(TRPS_INSTANCE *trps, TRP_UPD *upd)
     return TRP_BADARG;
   }
 
+  if (trp_upd_get_realm(upd)==NULL) {
+    tr_notice("trps_validate_update: received TRP update without realm.");
+    return TRP_ERROR;
+  }
+
+  if (trp_upd_get_comm(upd)==NULL) {
+    tr_notice("trps_validate_update: received TRP update without community.");
+    return TRP_ERROR;
+  }
+
   if (trp_upd_get_inforec(upd)==NULL) {
     tr_notice("trps_validate_update: received TRP update with no info records.");
     return TRP_ERROR;
@@ -474,6 +485,7 @@ static TRP_RC trps_validate_update(TRPS_INSTANCE *trps, TRP_UPD *upd)
     tr_notice("trps_validate_update: received TRP update without origin peer information.");
     return TRP_ERROR;
   }
+
   
   return TRP_SUCCESS;
 }
@@ -483,9 +495,7 @@ static TRP_RC trps_validate_inforec(TRPS_INSTANCE *trps, TRP_INFOREC *rec)
 {
   switch(trp_inforec_get_type(rec)) {
   case TRP_INFOREC_TYPE_ROUTE:
-    if ((trp_inforec_get_comm(rec)==NULL)
-       || (trp_inforec_get_realm(rec)==NULL)
-       || (trp_inforec_get_trust_router(rec)==NULL)
+    if ((trp_inforec_get_trust_router(rec)==NULL)
        || (trp_inforec_get_next_hop(rec)==NULL)) {
       tr_debug("trps_validate_inforec: missing record info.");
       return TRP_ERROR;
@@ -526,7 +536,7 @@ static unsigned int trps_advertised_metric(TRPS_INSTANCE *trps, TR_NAME *comm, T
   return trp_route_get_metric(entry) + trps_cost(trps, peer);
 }
 
-static int trps_check_feasibility(TRPS_INSTANCE *trps, TRP_INFOREC *rec)
+static int trps_check_feasibility(TRPS_INSTANCE *trps, TR_NAME *realm, TR_NAME *comm, TRP_INFOREC *rec)
 {
   unsigned int rec_metric=trp_inforec_get_metric(rec);
   unsigned int new_metric=0;
@@ -542,9 +552,7 @@ static int trps_check_feasibility(TRPS_INSTANCE *trps, TRP_INFOREC *rec)
     return 1;
 
   /* updates from our current next hop are always feasible*/
-  next_hop=trps_get_next_hop(trps,
-                             trp_inforec_get_comm(rec),
-                             trp_inforec_get_realm(rec));;
+  next_hop=trps_get_next_hop(trps, comm, realm);
   if ((next_hop!=NULL)
      && (0==tr_name_cmp(next_hop,trp_inforec_get_next_hop(rec)))) {
     return 1;
@@ -553,10 +561,7 @@ static int trps_check_feasibility(TRPS_INSTANCE *trps, TRP_INFOREC *rec)
 
   /* compare the existing metric we advertise to what we would advertise
    * if we accept this update */
-  current_metric=trps_advertised_metric(trps,
-                                        trp_inforec_get_comm(rec),
-                                        trp_inforec_get_realm(rec),
-                                        trp_inforec_get_next_hop(rec));
+  current_metric=trps_advertised_metric(trps, comm, realm, trp_inforec_get_next_hop(rec));
   new_metric=rec_metric + trps_cost(trps, trp_inforec_get_next_hop(rec));
   if (new_metric <= current_metric)
     return 1;
@@ -582,8 +587,8 @@ static TRP_RC trps_accept_update(TRPS_INSTANCE *trps, TRP_UPD *upd, TRP_INFOREC
   TRP_ROUTE *entry=NULL;
 
   entry=trp_rtable_get_entry(trps->rtable,
-                             trp_inforec_get_comm(rec),
-                             trp_inforec_get_realm(rec),
+                             trp_upd_get_comm(upd),
+                             trp_upd_get_realm(upd),
                              trp_inforec_get_next_hop(rec));
   if (entry==NULL) {
     entry=trp_route_new(NULL);
@@ -592,8 +597,8 @@ static TRP_RC trps_accept_update(TRPS_INSTANCE *trps, TRP_UPD *upd, TRP_INFOREC
       return TRP_NOMEM;
     }
 
-    trp_route_set_comm(entry, trp_inforec_dup_comm(rec));
-    trp_route_set_realm(entry, trp_inforec_dup_realm(rec));
+    trp_route_set_comm(entry, trp_upd_dup_comm(upd));
+    trp_route_set_realm(entry, trp_upd_dup_realm(upd));
     trp_route_set_peer(entry, trp_upd_dup_peer(upd));
     trp_route_set_trust_router(entry, trp_inforec_dup_trust_router(rec));
     trp_route_set_next_hop(entry, trp_inforec_dup_next_hop(rec));
@@ -657,13 +662,13 @@ static TRP_RC trps_handle_update(TRPS_INSTANCE *trps, TRP_UPD *upd)
 
   for (rec=trp_upd_get_inforec(upd); rec!=NULL; rec=trp_inforec_get_next(rec)) {
     /* determine feasibility */
-    feas=trps_check_feasibility(trps, rec);
+    feas=trps_check_feasibility(trps, trp_upd_get_realm(upd), trp_upd_get_comm(upd), rec);
     tr_debug("trps_handle_update: record feasibility=%d", feas);
 
     /* do we have an existing route? */
     route=trps_get_route(trps,
-                         trp_inforec_get_comm(rec),
-                         trp_inforec_get_realm(rec),
+                         trp_upd_get_comm(upd),
+                         trp_upd_get_realm(upd),
                          trp_upd_get_peer(upd));
     if (route!=NULL) {
       /* there was a route table entry already */
@@ -945,9 +950,7 @@ static TRP_INFOREC *trps_route_to_inforec(TALLOC_CTX *mem_ctx, TRPS_INSTANCE *tr
 
     /* Note that we leave the next hop empty since the recipient fills that in.
      * This is where we add the link cost (currently always 1) to the next peer. */
-    if ((trp_inforec_set_comm(rec, trp_route_dup_comm(route)) != TRP_SUCCESS)
-       ||(trp_inforec_set_realm(rec, trp_route_dup_realm(route)) != TRP_SUCCESS)
-       ||(trp_inforec_set_trust_router(rec, trp_route_dup_trust_router(route)) != TRP_SUCCESS)
+    if ((trp_inforec_set_trust_router(rec, trp_route_dup_trust_router(route)) != TRP_SUCCESS)
        ||(trp_inforec_set_metric(rec,
                                  trps_metric_add(trp_route_get_metric(route),
                                                  linkcost)) != TRP_SUCCESS)
@@ -1029,6 +1032,7 @@ static TRP_RC trps_update_one_peer(TRPS_INSTANCE *trps,
     tr_debug("trps_update_one_peer: sending %u update records.", (unsigned int)n_updates);
     upd=trp_upd_new(tmp_ctx);
 
+    /* TODO: set realm/comm in update; used to be in the inforec */
     for (ii=0; ii<n_updates; ii++) {
       rec=trps_route_to_inforec(tmp_ctx, trps, update_list[ii]);
       if (rec==NULL) {