summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--configure.ac5
-rw-r--r--include/opkele/tidy.h7
-rw-r--r--lib/discovery.cc3
3 files changed, 12 insertions, 3 deletions
diff --git a/configure.ac b/configure.ac
index 0aa1272..a66e53d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -56,202 +56,203 @@ case "$tr1_mem" in
;;
*)
AC_MSG_ERROR([no shared_ptr<> implementation found])
;;
esac
AC_SUBST([OPKELE_TR1_MEM_NS])
AC_SUBST([OPKELE_TR1_MEM_HEADER])
AC_MSG_CHECKING([for deprecated attribute support])
AC_COMPILE_IFELSE([
int __attribute__((deprecated)) deprecated_function();
],[
AC_MSG_RESULT([yes])
AC_DEFINE([OPKELE_DEPRECATE],[__attribute__((deprecated))],[deprecated function attribute])
],[
AC_MSG_RESULT([no])
AC_DEFINE([OPKELE_DEPRECATE],,[deprecated function attribute])
]
)
AC_LANG_PUSH([C++])
AC_MSG_CHECKING([for abi::__cxa_demangle])
AC_COMPILE_IFELSE([
#include <typeinfo>
using namespace std;
#include <cxxabi.h>
int main(int c,char **v) {
int dstat;
char *demangled = abi::__cxa_demangle(typeid(dstat).name(),0,0,&dstat);
return 0;
}
],[
AC_MSG_RESULT([yes])
AC_DEFINE([HAVE_DEMANGLE],,[defined if abi::__cxa_demangle is available])
],[
AC_MSG_RESULT([no])
]
)
AC_LANG_POP([C++])
PKG_CHECK_MODULES([OPENSSL],[openssl],,[
AC_MSG_ERROR([no openssl library found. get one from http://www.openssl.org/])
])
WANT_KONFORKA="yes"
AC_ARG_ENABLE([konforka],
AC_HELP_STRING([--disable-konforka],[do not use konforka library (default: use if found)]),
[
test "${enableval}" = "no" && WANT_KONFORKA="no"
]
)
if test "${WANT_KONFORKA}" = "yes" ; then
PKG_CHECK_MODULES([KONFORKA],[konforka],[
AC_SUBST([KONFORKA_CFLAGS])
AC_SUBST([KONFORKA_LIBS])
AC_DEFINE([HAVE_KONFORKA],,[defined in presence of konforka library])
AC_DEFINE([OPKELE_HAVE_KONFORKA],,[defined in presence of konforka library])
AC_SUBST([KONFORKA_KONFORKA],[konforka])
],[true])
fi
WANT_DOXYGEN="yes"
AC_ARG_ENABLE([doxygen],
AC_HELP_STRING([--disable-doxygen],[do not generate documentation]),
[
test "${enableval}" = "no" && WANT_DOXYGEN="no"
]
)
if test "${WANT_DOXYGEN}" = "yes" ; then
AC_WITH_DOXYGEN
AC_WITH_DOT
else
AM_CONDITIONAL([HAVE_DOXYGEN],[false])
AM_CONDITIONAL([HAVE_DOT],[false])
fi
LIBCURL_CHECK_CONFIG(,,,[
AC_MSG_ERROR([no required libcurl library. get one from http://curl.haxx.se/])
])
AC_CHECK_HEADER([expat.h],[
AC_CHECK_LIB([expat],[XML_ParserCreate],[
EXPAT_LIBS=-lexpat
EXPAT_CFLAGS=
AC_SUBST([EXPAT_LIBS])
AC_SUBST([EXPAT_CFLAGS])
],[
AC_MSG_ERROR([no required expat library. get one from http://expat.sourceforge.net/])
])
],[
AC_MSG_ERROR([no required expat library. get one from http://expat.sourceforge.net/])
])
-AC_CHECK_HEADER([tidy.h],[
+AC_CHECK_HEADERS([tidy.h tidy/tidy.h],[
AC_CHECK_LIB([tidy],[tidyParseBuffer],[
TIDY_LIBS=-ltidy
TIDY_CFLAGS=
AC_SUBST([TIDY_LIBS])
AC_SUBST([TIDY_CFLAGS])
],[
AC_MSG_ERROR([no required htmltidy library found. get one from http://tidy.sourceforge.net/])
])
],[
- AC_MSG_ERROR([no required htmltidy library found. get one from http://tidy.sourceforge.net/])
+ test "$ac_header" = "tidy/tidy.h" \
+ && AC_MSG_ERROR([no required htmltidy library found. get one from http://tidy.sourceforge.net/])
])
if test -n "$PCRE_LIBS" -a -n "$PCRE_CFLAGS" ; then
AC_SUBST([PCRE_CFLAGS])
AC_SUBST([PCRE_LIBS])
:
else
PKG_CHECK_MODULES([PCRE],[libpcre],,[
AC_MSG_ERROR([no libpcre found, go get it at http://www.pcre.org/])
])
fi
PKG_CHECK_MODULES([SQLITE3],[sqlite3],[have_sqlite3=true],[have_sqlite3=false])
AM_CONDITIONAL([HAVE_SQLITE3],[$have_sqlite3])
PKG_CHECK_MODULES([KINGATE],[kingate-plaincgi],[have_kingate=true],[have_kingate=false])
AM_CONDITIONAL([HAVE_KINGATE],[$have_kingate])
PKG_CHECK_MODULES([UUID],[uuid],[have_uuid=true],[have_uuid=false])
AM_CONDITIONAL([HAVE_UUID],[$have_uuid])
if $have_uuid ; then
AC_DEFINE([HAVE_LIBUUID],,[defined in presence of libuuid])
AC_SUBST([UUID_UUID],[uuid])
fi
curl_ssl_verify_host="true"
AC_ARG_ENABLE([ssl-verify-host],
AC_HELP_STRING([--disable-ssl-verify-host],[disable cURL cert/host relationships verification]),
[ test "${enableval}" = "no" && curl_ssl_verify_host="false" ]
)
${curl_ssl_verify_host} || AC_DEFINE([DISABLE_CURL_SSL_VERIFYHOST],,[defined if cURL is not to verify cert/host])
curl_ssl_verify_peer="true"
AC_ARG_ENABLE([ssl-verify-peer],
AC_HELP_STRING([--disable-ssl-verify-peer],[disable cURL cert validity verification]),
[ test "${enableval}" = "no" && curl_ssl_verify_peer="false" ]
)
${curl_ssl_verify_peer} || AC_DEFINE([DISABLE_CURL_SSL_VERIFYPEER],,[defined if cURL is not to verify cert validity])
postels_law=true
AC_ARG_ENABLE([postels-law],
AC_HELP_STRING([--disable-postels-law],[Be strict, do not adhere to Postel's Law ("be conservative in what you do, be liberal in what you accept from others", RFC 793)]),
[ test "${enableval}" = "no" && postels_law=false ]
)
$postels_law && AC_DEFINE([POSTELS_LAW],,[defined if we want to adhere to Postel's Law])
AC_DEFINE_UNQUOTED([OPKELE_SRC_DIR],["$PWD"],[source directory])
nitpick=false
AC_ARG_ENABLE([nitpicking],
AC_HELP_STRING([--enable-nitpicking],[make compiler somewhat overly fastidious about the code it deals with]),
[ test "$enableval" = "no" || nitpick=true ]
)
if $nitpick ; then
CPP_NITPICK="-pedantic -Wall -Wextra -Wundef -Wshadow \
-Wunsafe-loop-optimizations -Wconversion -Wmissing-format-attribute \
-Wredundant-decls -ansi"
# -Wlogical-op -Wmissing-noreturn
C_NITPICK="$CPP_NITPICK"
CXX_NITPICK="$C_NITPICK"
CPPFLAGS="$CPPFLAGS $CPP_NITPICK"
CFLAGS="$CFLAGS $C_NITPICK"
CXXFLAGS="$CXXFLAGS $CXX_NITPICK"
fi
ndebug=true
AC_ARG_ENABLE([debug],
AC_HELP_STRING([--enable-debug],[enable debugging code]),
[ test "$enableval" = "no" || ndebug=false ]
)
if $ndebug ; then
CPPFLAGS_DEBUG="-DNDEBUG"
else
CPPFLAGS_DEBUG=""
fi
AC_SUBST([CPPFLAGS_DEBUG])
xri_proxy_url="https://xri.net/"
AC_MSG_CHECKING([for XRI resolver proxy])
AC_ARG_ENABLE([xri-proxy],
AC_HELP_STRING([--with-xri-proxy=url],[set xri proxy for use when resolving xri identities, default is https://xri.net/]),
[ xri_proxy_url="$withval" ]
)
AC_MSG_RESULT([$xri_proxy_url])
AC_DEFINE_UNQUOTED([XRI_PROXY_URL],["$xri_proxy_url"],[XRI proxy resolver URL])
AC_CONFIG_FILES([
Makefile
libopkele.pc
Doxyfile
include/Makefile
include/opkele/tr1-mem.h
lib/Makefile
test/Makefile
])
AC_OUTPUT
diff --git a/include/opkele/tidy.h b/include/opkele/tidy.h
index 888e7d4..059656d 100644
--- a/include/opkele/tidy.h
+++ b/include/opkele/tidy.h
@@ -1,73 +1,80 @@
#ifndef __OPKELE_TIDY_H
#define __OPKELE_TIDY_H
#include <cassert>
+#ifdef HAVE_TIDY_H
#include <tidy.h>
#include <buffio.h>
+#elif HAVE_TIDY_TIDY_H
+# include <tidy/tidy.h>
+# include <tidy/buffio.h>
+#else
+# error "Don't know where to look for htmltidy headers"
+#endif
namespace opkele {
namespace util {
class tidy_buf_t {
public:
TidyBuffer _x;
tidy_buf_t() { tidyBufInit(&_x); }
virtual ~tidy_buf_t() throw() {
tidyBufFree(&_x); }
inline operator const TidyBuffer&(void) const { return _x; }
inline operator TidyBuffer&(void) { return _x; }
inline operator const char*(void) const { return (const char*)_x.bp; }
inline operator char*(void) { return (char*)_x.bp; }
inline const char *c_str() const {
return (const char*)_x.bp; }
inline size_t size() const {
return _x.size; }
};
class tidy_doc_t {
public:
TidyDoc _x;
tidy_doc_t() : _x(0) { }
tidy_doc_t(TidyDoc x) : _x(x) { }
virtual ~tidy_doc_t() throw() {
if(_x) tidyRelease(_x); }
tidy_doc_t& operator=(TidyDoc x) {
if(_x) tidyRelease(_x);
_x = x;
return *this;
}
operator const TidyDoc(void) const { return _x; }
operator TidyDoc(void) { return _x; }
inline bool opt_set(TidyOptionId o,bool v) {
assert(_x);
return tidyOptSetBool(_x,o,v?yes:no); }
inline bool opt_set(TidyOptionId o,int v) {
assert(_x);
return tidyOptSetInt(_x,o,v); }
inline int parse_string(const string& s) {
assert(_x);
return tidyParseString(_x,s.c_str()); }
inline int clean_and_repair() {
assert(_x);
return tidyCleanAndRepair(_x); }
inline int save_buffer(TidyBuffer& ob) {
assert(_x);
return tidySaveBuffer(_x,&ob); }
static inline TidyDoc create() {
return tidyCreate(); }
};
}
}
#endif /* __OPKELE_TIDY_H */
diff --git a/lib/discovery.cc b/lib/discovery.cc
index 3b90977..d1989ec 100644
--- a/lib/discovery.cc
+++ b/lib/discovery.cc
@@ -1,109 +1,110 @@
#include <list>
#include <opkele/curl.h>
#include <opkele/expat.h>
#include <opkele/uris.h>
#include <opkele/discovery.h>
#include <opkele/exception.h>
#include <opkele/util.h>
-#include <opkele/tidy.h>
#include <opkele/data.h>
#include <opkele/debug.h>
#include "config.h"
+#include <opkele/tidy.h>
+
#define XRDS_HEADER "X-XRDS-Location"
#define CT_HEADER "Content-Type"
namespace opkele {
using std::list;
using xrd::XRD_t;
using xrd::service_t;
/* TODO: the whole discovery thing needs cleanup and optimization due to
* many changes of concept. */
static const size_t max_html = 16384;
static const struct service_type_t {
const char *uri;
const char *forceid;
} op_service_types[] = {
{ STURI_OPENID20_OP, IDURI_SELECT20 },
{ STURI_OPENID20, 0 },
{ STURI_OPENID11, 0 },
{ STURI_OPENID10, 0 }
};
enum {
st_index_1 = 2, st_index_2 = 1
};
static inline bool is_qelement(const XML_Char *n,const char *qen) {
return !strcasecmp(n,qen);
}
static inline bool is_element(const XML_Char *n,const char *en) {
if(!strcasecmp(n,en)) return true;
int nl = strlen(n), enl = strlen(en);
if( (nl>=(enl+1)) && n[nl-enl-1]=='\t'
&& !strcasecmp(&n[nl-enl],en) )
return true;
return false;
}
static long element_priority(const XML_Char **a) {
for(;*a;++a)
if(!strcasecmp(*(a++),"priority")) {
long rv;
return (sscanf(*a,"%ld",&rv)==1)?rv:-1;
}
return -1;
}
/* TODO: ideally all attributes should be
* retrieved in one run */
static const char *element_attr(const XML_Char **a, const char *at) {
for(;*a;++a)
if(!strcasecmp(*(a++),at)) {
return *a;
}
return 0;
}
class idigger_t : public util::curl_t, public util::expat_t {
public:
string xri_proxy;
enum {
xmode_html = 1, xmode_xrd = 2, xmode_cid = 4,
xmode_noredirs = 8
};
int xmode;
string xrds_location;
string http_content_type;
service_t html_openid1;
service_t html_openid2;
string cdata_buf;
long status_code;
string status_string;
typedef list<string> pt_stack_t;
pt_stack_t pt_stack;
int skipping;
bool parser_choked;
string save_html;
XRD_t *xrd;
service_t *xrd_service;
string* cdata;
idigger_t()
: util::curl_t(easy_init()),
util::expat_t(0),
xri_proxy(XRI_PROXY_URL) {
CURLcode r;
(r=misc_sets())
|| (r=set_write())
|| (r=set_header())
;
if(r)
throw exception_curl(OPKELE_CP_ "failed to set curly options",r);