-rw-r--r-- | lib/basic_rp.cc | 3 | ||||
-rw-r--r-- | lib/discovery.cc | 31 | ||||
-rw-r--r-- | lib/expat.cc | 9 |
3 files changed, 38 insertions, 5 deletions
diff --git a/lib/basic_rp.cc b/lib/basic_rp.cc index 3cad71c..9c7113b 100644 --- a/lib/basic_rp.cc +++ b/lib/basic_rp.cc @@ -218,7 +218,8 @@ namespace opkele { void basic_RP::id_res(const basic_openid_message& om,extension_t *ext) { reset_vars(); bool o2 = om.has_field("ns") - && om.get_field("ns")==OIURI_OPENID20; + && om.get_field("ns")==OIURI_OPENID20 + && om.has_field("op_endpoint") && !om.get_field("op_endpoint").empty(); if( (!o2) && om.has_field("user_setup_url")) throw id_res_setup(OPKELE_CP_ "assertion failed, setup url provided", om.get_field("user_setup_url")); diff --git a/lib/discovery.cc b/lib/discovery.cc index bd1f917..b4ed3b6 100644 --- a/lib/discovery.cc +++ b/lib/discovery.cc @@ -283,6 +283,7 @@ namespace opkele { (*(expat_t*)this) = parser_create_ns(); set_user_data(); set_element_handler(); set_character_data_handler(); + set_unknown_encoding_handler(); if(xmode&xmode_html) { html_openid1.clear(); html_openid2.clear(); @@ -453,25 +454,40 @@ namespace opkele { --skipping; return; } if(is_qelement(n,NSURI_XRD "\tType")) { - assert(xrd); assert(xrd_service); assert(cdata==&cdata_buf); + if(xrd && xrd_service) { + assert(cdata==&cdata_buf); xrd_service->types.insert(cdata_buf); + } }else if(is_qelement(n,NSURI_XRD "\tService")) { - assert(xrd); assert(xrd_service); + if(!(xrd && xrd_service)) { + skipping = -1; + }else{ assert(!pt_stack.empty()); assert(pt_stack.back()==(NSURI_XRD "\tService")); pt_stack.pop_back(); xrd_service = 0; + } }else if(is_qelement(n,NSURI_XRD "\tStatus")) { - assert(xrd); + if(!xrd) { + skipping=-1; + }else{ if(is_qelement(pt_stack.back().c_str(),n)) { assert(cdata==&status_string); pt_stack.pop_back(); if(status_code!=100) skipping = -1; } + } }else if(is_qelement(n,NSURI_XRD "\tExpires")) { - assert(xrd); + if(!xrd) { + skipping=-1; + }else{ xrd->expires = util::w3c_to_time(cdata_buf); + } + }else if(is_qelement(n,NSURI_XRD "\tXRD")) { + assert(!pt_stack.empty()); + assert(pt_stack.back()==(NSURI_XRD "\tXRD")); + pt_stack.pop_back(); }else if((xmode&xmode_html) && is_element(n,"head")) { skipping = -1; } @@ -569,6 +585,13 @@ namespace opkele { } } + int unknown_encoding(const XML_Char* /* n */,XML_Encoding *i) { + for(unsigned int ii=0;ii < sizeof(i->map)/sizeof(i->map[0]);++ii) + i->map[ii] = ii; + i->convert = 0; i->release = 0; + return XML_STATUS_OK; + } + }; string idiscover(endpoint_discovery_iterator oi,const string& identity) { diff --git a/lib/expat.cc b/lib/expat.cc index c4dab7e..fb58a9a 100644 --- a/lib/expat.cc +++ b/lib/expat.cc @@ -92,6 +92,15 @@ namespace opkele { XML_SetNamespaceDeclHandler(_x,_start_namespace_decl,_end_namespace_decl); } + static int _unknown_encoding(void *ehd,const XML_Char *n,XML_Encoding *i) { + return ((expat_t*)ehd)->unknown_encoding(n,i); + } + + void expat_t::set_unknown_encoding_handler() { + assert(_x); + XML_SetUnknownEncodingHandler(_x,_unknown_encoding,this); + } + } } |