From 305018401c01c11ac0b08d136c3e06790473b3c6 Mon Sep 17 00:00:00 2001 From: Luke Howard Date: Wed, 30 Mar 2011 01:58:32 +1100 Subject: [PATCH] fix various bugs in DDF/JSON bridge --- mech_eap/util_attr.cpp | 7 ++++--- mech_eap/util_json.cpp | 33 +++++++++++++++++++-------------- mech_eap/util_json.h | 6 +++--- mech_eap/util_shib.cpp | 30 ++++++++++++++++++++---------- 4 files changed, 46 insertions(+), 30 deletions(-) diff --git a/mech_eap/util_attr.cpp b/mech_eap/util_attr.cpp index 4da585d..6771a76 100644 --- a/mech_eap/util_attr.cpp +++ b/mech_eap/util_attr.cpp @@ -636,7 +636,7 @@ gss_eap_attr_ctx::exportToBuffer(gss_buffer_t buffer) const JSONObject obj = jsonRepresentation(); #if 0 - obj.dump(stdout, JSON_INDENT(3)); + obj.dump(stdout); #endif s = obj.dump(JSON_COMPACT); @@ -679,8 +679,6 @@ gss_eap_attr_ctx::mapException(OM_uint32 *minor, std::exception &e) const OM_uint32 major; /* Errors we handle ourselves */ - major = GSS_S_FAILURE; - if (typeid(e) == typeid(std::bad_alloc)) { *minor = ENOMEM; goto cleanup; @@ -688,6 +686,9 @@ gss_eap_attr_ctx::mapException(OM_uint32 *minor, std::exception &e) const major = GSS_S_BAD_NAME; *minor = GSSEAP_BAD_ATTR_TOKEN; goto cleanup; + } else if (this == NULL) { + major = GSS_S_FAILURE; + goto cleanup; } /* Errors we delegate to providers */ diff --git a/mech_eap/util_json.cpp b/mech_eap/util_json.cpp index 76cf31c..64e6541 100644 --- a/mech_eap/util_json.cpp +++ b/mech_eap/util_json.cpp @@ -330,36 +330,41 @@ JSONObject::isnull(void) const return json_is_null(m_obj); } -JSONObject::JSONObject(DDF &ddf) +JSONObject +JSONObject::ddf(DDF &ddf) { if (ddf.isstruct()) { DDF elem = ddf.first(); - JSONObject jobj = JSONObject::array(); + JSONObject jobj = JSONObject::object(); while (!elem.isnull()) { - JSONObject jtmp(elem); - jobj.append(jtmp); + JSONObject jtmp = JSONObject::ddf(elem); + jobj.set(elem.name(), jtmp); elem = ddf.next(); } + + return jobj; } else if (ddf.islist()) { DDF elem = ddf.first(); - JSONObject jobj = JSONObject::object(); + JSONObject jobj = JSONObject::array(); while (!elem.isnull()) { - JSONObject jtmp(elem); - jobj.set(elem.name(), jtmp); + JSONObject jtmp = JSONObject::ddf(elem); + jobj.append(jtmp); elem = ddf.next(); } + + return jobj; } else if (ddf.isstring()) { - JSONObject(ddf.string()); + return JSONObject(ddf.string()); } else if (ddf.isint()) { - JSONObject((json_int_t)ddf.integer()); + return JSONObject((json_int_t)ddf.integer()); } else if (ddf.isfloat()) { - JSONObject(ddf.floating()); + return JSONObject(ddf.floating()); } else if (ddf.isempty() || ddf.ispointer()) { - JSONObject::object(); + return JSONObject::object(); } else if (ddf.isnull()) { - JSONObject::null(); + return JSONObject::null(); } std::string s("Unbridgeable DDF object"); @@ -378,7 +383,7 @@ JSONObject::ddf(void) const do { const char *key = iter.key(); DDF value = iter.value().ddf(); - ddf.add(value.name(key)); + ddf.addmember(key).swap(value); } while (iter.next()); break; } @@ -410,7 +415,7 @@ JSONObject::ddf(void) const break; } - return DDF(NULL); + return ddf; } JSONIterator::JSONIterator(const JSONObject &obj) diff --git a/mech_eap/util_json.h b/mech_eap/util_json.h index f987d34..322d03e 100644 --- a/mech_eap/util_json.h +++ b/mech_eap/util_json.h @@ -70,15 +70,15 @@ namespace gss_eap_util { static JSONObject object(void); static JSONObject array(void); static JSONObject null(void); + static JSONObject ddf(DDF &value); char *dump(size_t flags = 0) const; - void dump(FILE *fp, size_t flags = 0) const; + void dump(FILE *fp, size_t flags = JSON_INDENT(4)) const; json_type type(void) const { return json_typeof(m_obj); } size_t size(void) const; JSONObject(void); - JSONObject(DDF &value); JSONObject(const char *value); JSONObject(json_int_t value); JSONObject(double value); @@ -140,7 +140,7 @@ namespace gss_eap_util { } } - JSONObject(json_t *obj, bool retain); + JSONObject(json_t *obj, bool retain = true); json_t *m_obj; }; diff --git a/mech_eap/util_shib.cpp b/mech_eap/util_shib.cpp index 5ca01c5..7ddd843 100644 --- a/mech_eap/util_shib.cpp +++ b/mech_eap/util_shib.cpp @@ -407,16 +407,20 @@ gss_eap_shib_attr_provider::jsonRepresentation(void) const if (m_initialized == false) return obj; /* don't export incomplete context */ - JSONObject attrs = JSONObject::array(); + JSONObject jattrs = JSONObject::array(); for (vector::const_iterator a = m_attributes.begin(); a != m_attributes.end(); ++a) { - DDF attr = (*a)->marshall(); - JSONObject jobj(attr); - attrs.append(jobj); + try { + DDF attr = (*a)->marshall(); + JSONObject jattr = JSONObject::ddf(attr); + jattrs.append(jattr); + } catch (AttributeException &e) { + /* XXX FIXME ignore attribute exceptions? */ + } } - obj.set("attributes", attrs); + obj.set("attributes", jattrs); obj.set("authenticated", m_authenticated); @@ -433,13 +437,19 @@ gss_eap_shib_attr_provider::initWithJsonObject(const gss_eap_attr_ctx *ctx, assert(m_authenticated == false); assert(m_attributes.size() == 0); - JSONObject attrs = obj["attributes"]; - size_t nelems = attrs.size(); + JSONObject jattrs = obj["attributes"]; + size_t nelems = jattrs.size(); for (size_t i = 0; i < nelems; i++) { - DDF attr = attrs.get(i).ddf(); - Attribute *attribute = Attribute::unmarshall(attr); - m_attributes.push_back(attribute); + JSONObject jattr = jattrs.get(i); + + try { + DDF attr = jattr.ddf(); + Attribute *attribute = Attribute::unmarshall(attr); + m_attributes.push_back(attribute); + } catch (AttributeException &e) { + return false; + } } m_authenticated = obj["authenticated"].integer(); -- 2.1.4