summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--.gitignore33
-rw-r--r--COPYING2
-rw-r--r--Makefile.am3
-rw-r--r--NEWS.xml6
-rwxr-xr-xautogen.sh2
-rw-r--r--autoregen.sh2
-rw-r--r--configure.ac4
-rw-r--r--include/opkele/expat.h3
-rw-r--r--lib/basic_rp.cc3
-rw-r--r--lib/discovery.cc53
-rw-r--r--lib/expat.cc9
-rw-r--r--test/RP.cc1
12 files changed, 82 insertions, 39 deletions
diff --git a/.gitignore b/.gitignore
index 87771db..16be7d8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,21 +1,16 @@
-configure
+/configure
Makefile.in
-Doxyfile
-config.log
-depcomp
-config.guess
-config.h
-config.sub
-ltmain.sh
-INSTALL
-NEWS
+/Doxyfile
+/config.log
+/config.h
+/INSTALL
+/NEWS
Makefile
-config.status
-stamp-h1
-config.h.in
-libtool
-autom4te.cache
-libopkele.pc
-missing
-aclocal.m4
-install-sh
+/config.status
+/stamp-h1
+/config.h.in
+/autom4te.cache
+/libopkele.pc
+/aclocal.m4
+/aclocal.d
+/aux.d
diff --git a/COPYING b/COPYING
index 46d3f30..b9cc74c 100644
--- a/COPYING
+++ b/COPYING
@@ -1,7 +1,7 @@
-Copyright (c) 2005-2008 Klever Group (http://www.klever.net/)
+Copyright (c) 2005-2009 Klever Group (http://www.klever.net/)
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
diff --git a/Makefile.am b/Makefile.am
index 3227bdb..7726dad 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,10 +1,11 @@
-
SUBDIRS=include lib test
EXTRA_DIST= NEWS NEWS.xml NEWS.xsl
+ACLOCAL_AMFLAGS=-I aclocal.d
+
pkgconfigdir=${libdir}/pkgconfig
pkgconfig_DATA=libopkele.pc
all-local: NEWS
if HAVE_DOXYGEN
clean-local:
diff --git a/NEWS.xml b/NEWS.xml
index 160b197..0206018 100644
--- a/NEWS.xml
+++ b/NEWS.xml
@@ -1,8 +1,14 @@
<?xml version="1.0" encoding="us-ascii"?>
<news>
+ <version version="2.0.2" date="April 11th, 2009">
+ <ni>Handling of unknown encodings during discovery</ni>
+ <ni>Discovery robustness improvements</ni>
+ <ni>Workaround for OPs (e.g. livejournal.com) breaking specs</ni>
+ <ni>Build fixes and improvements</ni>
+ </version>
<version version="2.0.1" date="November 22nd, 2008">
<ni>Compile-time fixes and improvements</ni>
<ni>Portability improvements for FreeBSD</ni>
<ni>Really suppress debugging message from htmltidy when --disable-debug is in
effect</ni>
<ni>minor bugfixes</ni>
diff --git a/autogen.sh b/autogen.sh
index bf32a35..578206d 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -1,11 +1,11 @@
#!/bin/sh
tool_libtoolize="$(type -P glibtoolize || type -P libtoolize)"
if test -z "$tool_libtoolize" ; then
echo "Failed to find libtoolize." ; exit 1;
fi
"$tool_libtoolize" -f \
-&& aclocal \
+&& aclocal -I aclocal.d \
&& autoheader \
&& automake -a \
&& autoconf \
&& ./configure "$@"
diff --git a/autoregen.sh b/autoregen.sh
new file mode 100644
index 0000000..ce75a08
--- a/dev/null
+++ b/autoregen.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+eval sh autogen.sh $(./config.status --version | grep '^ with options "'|sed -e 's/^[^"]\+"//' -e 's/"$//') "$@"
diff --git a/configure.ac b/configure.ac
index a7b56ff..2ded490 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,9 +1,11 @@
-AC_INIT([libopkele], [2.0.1], [libopkele-bugs@klever.net])
+AC_INIT([libopkele], [2.0.2], [libopkele-bugs@klever.net])
AC_CONFIG_SRCDIR([include/opkele/opkele-config.h])
AC_CONFIG_HEADERS([config.h include/opkele/acconfig.h])
+AC_CONFIG_MACRO_DIR([aclocal.d])
+AC_CONFIG_AUX_DIR([aux.d])
AM_INIT_AUTOMAKE([dist-bzip2])
AC_PROG_INSTALL
AC_PROG_CXX
AC_PROG_CC
AC_PROG_LIBTOOL
diff --git a/include/opkele/expat.h b/include/opkele/expat.h
index 3ab1630..21be003 100644
--- a/include/opkele/expat.h
+++ b/include/opkele/expat.h
@@ -23,12 +23,15 @@ namespace opkele {
inline bool parse(const char *s,int len,bool final=false) {
assert(_x);
return XML_Parse(_x,s,len,final);
}
+ virtual int unknown_encoding(const XML_Char * /* n */,XML_Encoding * /* i */) { return XML_STATUS_ERROR; }
+ void set_unknown_encoding_handler();
+
virtual void start_element(const XML_Char * /* n */,const XML_Char ** /* a */) { }
virtual void end_element(const XML_Char * /* n */) { }
void set_element_handler();
virtual void character_data(const XML_Char * /* s */,int /* l */) { }
void set_character_data_handler();
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
@@ -215,13 +215,14 @@ 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"));
string m = om.get_field("mode");
if(o2 && m=="setup_needed")
throw id_res_setup(OPKELE_CP_ "setup needed, no setup url provided");
diff --git a/lib/discovery.cc b/lib/discovery.cc
index bd1f917..b4ed3b6 100644
--- a/lib/discovery.cc
+++ b/lib/discovery.cc
@@ -280,12 +280,13 @@ namespace opkele {
}
void prepare_to_parse() {
(*(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();
parser_choked = false;
}
@@ -450,31 +451,46 @@ namespace opkele {
void end_element(const XML_Char *n) {
if(skipping<0) return;
if(skipping) {
--skipping; return;
}
if(is_qelement(n,NSURI_XRD "\tType")) {
- assert(xrd); assert(xrd_service); assert(cdata==&cdata_buf);
- xrd_service->types.insert(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);
- 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(is_qelement(pt_stack.back().c_str(),n)) {
- assert(cdata==&status_string);
+ if(!(xrd && xrd_service)) {
+ skipping = -1;
+ }else{
+ assert(!pt_stack.empty());
+ assert(pt_stack.back()==(NSURI_XRD "\tService"));
pt_stack.pop_back();
- if(status_code!=100)
- skipping = -1;
+ xrd_service = 0;
+ }
+ }else if(is_qelement(n,NSURI_XRD "\tStatus")) {
+ 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);
- xrd->expires = util::w3c_to_time(cdata_buf);
+ 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;
}
cdata = 0;
}
void character_data(const XML_Char *s,int l) {
@@ -566,12 +582,19 @@ 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) {
idigger_t idigger;
return idigger.discover(oi,identity);
}
diff --git a/lib/expat.cc b/lib/expat.cc
index c4dab7e..fb58a9a 100644
--- a/lib/expat.cc
+++ b/lib/expat.cc
@@ -89,9 +89,18 @@ namespace opkele {
void expat_t::set_namespace_decl_handler() {
assert(_x);
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);
+ }
+
}
}
diff --git a/test/RP.cc b/test/RP.cc
index 35ee71d..f015723 100644
--- a/test/RP.cc
+++ b/test/RP.cc
@@ -1,9 +1,10 @@
#include <uuid/uuid.h>
#include <iostream>
#include <cassert>
+#include <cstdlib>
#include <stdexcept>
#include <string>
#include <set>
#include <iterator>
using namespace std;
#include <kingate/exception.h>