summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--configure.ac1
-rw-r--r--test/OP.cc6
2 files changed, 6 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac
index e636253..606e644 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,251 +1,252 @@
1AC_INIT([libopkele], [2.0.4], [libopkele-bugs@klever.net]) 1AC_INIT([libopkele], [2.0.4], [libopkele-bugs@klever.net])
2AC_CONFIG_SRCDIR([include/opkele/opkele-config.h]) 2AC_CONFIG_SRCDIR([include/opkele/opkele-config.h])
3AC_CONFIG_HEADERS([config.h include/opkele/acconfig.h]) 3AC_CONFIG_HEADERS([config.h include/opkele/acconfig.h])
4AC_CONFIG_MACRO_DIR([aclocal.d]) 4AC_CONFIG_MACRO_DIR([aclocal.d])
5AC_CONFIG_AUX_DIR([aux.d]) 5AC_CONFIG_AUX_DIR([aux.d])
6AM_INIT_AUTOMAKE([dist-bzip2]) 6AM_INIT_AUTOMAKE([dist-bzip2])
7 7
8AC_PROG_INSTALL 8AC_PROG_INSTALL
9AC_PROG_CXX 9AC_PROG_CXX
10AC_PROG_CC 10AC_PROG_CC
11AC_PROG_LIBTOOL 11AC_PROG_LIBTOOL
12PKG_PROG_PKG_CONFIG 12PKG_PROG_PKG_CONFIG
13 13
14AC_HEADER_STDC 14AC_HEADER_STDC
15AC_CHECK_FUNCS([timegm]) 15AC_CHECK_FUNCS([timegm])
16AC_CHECK_HEADERS([ext/algorithm.h])
16 17
17AC_PATH_PROG([XSLTPROC],[xsltproc],[true]) 18AC_PATH_PROG([XSLTPROC],[xsltproc],[true])
18 19
19AC_MSG_CHECKING([for source tree version]) 20AC_MSG_CHECKING([for source tree version])
20if headrev=$(cd $srcdir && git rev-parse --verify HEAD 2>/dev/null) ; then 21if headrev=$(cd $srcdir && git rev-parse --verify HEAD 2>/dev/null) ; then
21 PACKAGE_SRC_VERSION="$(cd $srcdir && git describe --tags $headrev)" 22 PACKAGE_SRC_VERSION="$(cd $srcdir && git describe --tags $headrev)"
22 test "$PACKAGE_SRC_VERSION" = "$PACKAGE_VERSION" \ 23 test "$PACKAGE_SRC_VERSION" = "$PACKAGE_VERSION" \
23 -o "${PACKAGE_SRC_VERSION#${PACKAGE_VERSION}-}" != "$PACKAGE_SRC_VERSION" || PACKAGE_SRC_VERSION="${PACKAGE_VERSION}:${PACKAGE_SRC_VERSION}" 24 -o "${PACKAGE_SRC_VERSION#${PACKAGE_VERSION}-}" != "$PACKAGE_SRC_VERSION" || PACKAGE_SRC_VERSION="${PACKAGE_VERSION}:${PACKAGE_SRC_VERSION}"
24 ( cd $srcdir && git diff-index $headrev | read dirt ) && PACKAGE_SRC_VERSION="${PACKAGE_SRC_VERSION}-dirty" 25 ( cd $srcdir && git diff-index $headrev | read dirt ) && PACKAGE_SRC_VERSION="${PACKAGE_SRC_VERSION}-dirty"
25else 26else
26 PACKAGE_SRC_VERSION="$PACKAGE_VERSION" 27 PACKAGE_SRC_VERSION="$PACKAGE_VERSION"
27fi 28fi
28AC_MSG_RESULT([$PACKAGE_SRC_VERSION]) 29AC_MSG_RESULT([$PACKAGE_SRC_VERSION])
29AC_SUBST([PACKAGE_SRC_VERSION]) 30AC_SUBST([PACKAGE_SRC_VERSION])
30AC_DEFINE_UNQUOTED([PACKAGE_SRC_VERSION],["$PACKAGE_SRC_VERSION"],[more or less precise source tree version]) 31AC_DEFINE_UNQUOTED([PACKAGE_SRC_VERSION],["$PACKAGE_SRC_VERSION"],[more or less precise source tree version])
31 32
32tr1_mem_std="false" 33tr1_mem_std="false"
33tr1_mem_boost="false" 34tr1_mem_boost="false"
34AC_CHECK_SHAREDPTR(std::tr1,tr1/memory,[ tr1_mem_std=true ]) 35AC_CHECK_SHAREDPTR(std::tr1,tr1/memory,[ tr1_mem_std=true ])
35AC_CHECK_SHAREDPTR(boost,boost/shared_ptr.hpp,[ tr1_mem_boost=true ]) 36AC_CHECK_SHAREDPTR(boost,boost/shared_ptr.hpp,[ tr1_mem_boost=true ])
36tr1_mem="" 37tr1_mem=""
37AC_ARG_WITH([tr1-memory], 38AC_ARG_WITH([tr1-memory],
38 AC_HELP_STRING([--with-tr1-memory=<boost|std>],[select tr1/memory (shared_ptr<>) implementation to use]), 39 AC_HELP_STRING([--with-tr1-memory=<boost|std>],[select tr1/memory (shared_ptr<>) implementation to use]),
39 [ tr1_mem="$withval" ] 40 [ tr1_mem="$withval" ]
40) 41)
41AC_MSG_CHECKING([for tr1/memory implementation to use]) 42AC_MSG_CHECKING([for tr1/memory implementation to use])
42test -z "$tr1_mem" && $tr1_mem_std && tr1_mem=std 43test -z "$tr1_mem" && $tr1_mem_std && tr1_mem=std
43test -z "$tr1_mem" && $tr1_mem_boost && tr1_mem=boost 44test -z "$tr1_mem" && $tr1_mem_boost && tr1_mem=boost
44if test -z "$tr1_mem" ; then 45if test -z "$tr1_mem" ; then
45 AC_MSG_RESULT([none found]) 46 AC_MSG_RESULT([none found])
46else 47else
47 AC_MSG_RESULT([$tr1_mem]) 48 AC_MSG_RESULT([$tr1_mem])
48fi 49fi
49case "$tr1_mem" in 50case "$tr1_mem" in
50 std) 51 std)
51 $tr1_mem_std || AC_MSG_ERROR([std implementation requested, but not found]) 52 $tr1_mem_std || AC_MSG_ERROR([std implementation requested, but not found])
52 OPKELE_TR1_MEM_NS=std::tr1 53 OPKELE_TR1_MEM_NS=std::tr1
53 OPKELE_TR1_MEM_HEADER=tr1/memory 54 OPKELE_TR1_MEM_HEADER=tr1/memory
54 ;; 55 ;;
55 boost) 56 boost)
56 $tr1_mem_boost || AC_MSG_ERROR([boost implementation requested, but not found]) 57 $tr1_mem_boost || AC_MSG_ERROR([boost implementation requested, but not found])
57 OPKELE_TR1_MEM_NS=boost 58 OPKELE_TR1_MEM_NS=boost
58 OPKELE_TR1_MEM_HEADER=boost/shared_ptr.hpp 59 OPKELE_TR1_MEM_HEADER=boost/shared_ptr.hpp
59 ;; 60 ;;
60 *) 61 *)
61 AC_MSG_ERROR([no shared_ptr<> implementation found]) 62 AC_MSG_ERROR([no shared_ptr<> implementation found])
62 ;; 63 ;;
63esac 64esac
64AC_SUBST([OPKELE_TR1_MEM_NS]) 65AC_SUBST([OPKELE_TR1_MEM_NS])
65AC_SUBST([OPKELE_TR1_MEM_HEADER]) 66AC_SUBST([OPKELE_TR1_MEM_HEADER])
66 67
67AC_MSG_CHECKING([for deprecated attribute support]) 68AC_MSG_CHECKING([for deprecated attribute support])
68AC_COMPILE_IFELSE([ 69AC_COMPILE_IFELSE([
69 int __attribute__((deprecated)) deprecated_function(); 70 int __attribute__((deprecated)) deprecated_function();
70 ],[ 71 ],[
71 AC_MSG_RESULT([yes]) 72 AC_MSG_RESULT([yes])
72 AC_DEFINE([OPKELE_DEPRECATE],[__attribute__((deprecated))],[deprecated function attribute]) 73 AC_DEFINE([OPKELE_DEPRECATE],[__attribute__((deprecated))],[deprecated function attribute])
73 ],[ 74 ],[
74 AC_MSG_RESULT([no]) 75 AC_MSG_RESULT([no])
75 AC_DEFINE([OPKELE_DEPRECATE],,[deprecated function attribute]) 76 AC_DEFINE([OPKELE_DEPRECATE],,[deprecated function attribute])
76 ] 77 ]
77) 78)
78 79
79AC_LANG_PUSH([C++]) 80AC_LANG_PUSH([C++])
80AC_MSG_CHECKING([for abi::__cxa_demangle]) 81AC_MSG_CHECKING([for abi::__cxa_demangle])
81AC_COMPILE_IFELSE([ 82AC_COMPILE_IFELSE([
82 #include <typeinfo> 83 #include <typeinfo>
83 using namespace std; 84 using namespace std;
84 #include <cxxabi.h> 85 #include <cxxabi.h>
85 int main(int c,char **v) { 86 int main(int c,char **v) {
86 int dstat; 87 int dstat;
87 char *demangled = abi::__cxa_demangle(typeid(dstat).name(),0,0,&dstat); 88 char *demangled = abi::__cxa_demangle(typeid(dstat).name(),0,0,&dstat);
88 return 0; 89 return 0;
89 } 90 }
90 ],[ 91 ],[
91 AC_MSG_RESULT([yes]) 92 AC_MSG_RESULT([yes])
92 AC_DEFINE([HAVE_DEMANGLE],,[defined if abi::__cxa_demangle is available]) 93 AC_DEFINE([HAVE_DEMANGLE],,[defined if abi::__cxa_demangle is available])
93 ],[ 94 ],[
94 AC_MSG_RESULT([no]) 95 AC_MSG_RESULT([no])
95 ] 96 ]
96) 97)
97AC_LANG_POP([C++]) 98AC_LANG_POP([C++])
98 99
99 100
100 101
101 102
102PKG_CHECK_MODULES([OPENSSL],[openssl],,[ 103PKG_CHECK_MODULES([OPENSSL],[openssl],,[
103 AC_MSG_ERROR([no openssl library found. get one from http://www.openssl.org/]) 104 AC_MSG_ERROR([no openssl library found. get one from http://www.openssl.org/])
104]) 105])
105 106
106WANT_KONFORKA="yes" 107WANT_KONFORKA="yes"
107AC_ARG_ENABLE([konforka], 108AC_ARG_ENABLE([konforka],
108 AC_HELP_STRING([--disable-konforka],[do not use konforka library (default: use if found)]), 109 AC_HELP_STRING([--disable-konforka],[do not use konforka library (default: use if found)]),
109 [ 110 [
110 test "${enableval}" = "no" && WANT_KONFORKA="no" 111 test "${enableval}" = "no" && WANT_KONFORKA="no"
111 ] 112 ]
112) 113)
113if test "${WANT_KONFORKA}" = "yes" ; then 114if test "${WANT_KONFORKA}" = "yes" ; then
114 PKG_CHECK_MODULES([KONFORKA],[konforka],[ 115 PKG_CHECK_MODULES([KONFORKA],[konforka],[
115 AC_SUBST([KONFORKA_CFLAGS]) 116 AC_SUBST([KONFORKA_CFLAGS])
116 AC_SUBST([KONFORKA_LIBS]) 117 AC_SUBST([KONFORKA_LIBS])
117 AC_DEFINE([HAVE_KONFORKA],,[defined in presence of konforka library]) 118 AC_DEFINE([HAVE_KONFORKA],,[defined in presence of konforka library])
118 AC_DEFINE([OPKELE_HAVE_KONFORKA],,[defined in presence of konforka library]) 119 AC_DEFINE([OPKELE_HAVE_KONFORKA],,[defined in presence of konforka library])
119 AC_SUBST([KONFORKA_KONFORKA],[konforka]) 120 AC_SUBST([KONFORKA_KONFORKA],[konforka])
120 ],[true]) 121 ],[true])
121fi 122fi
122 123
123WANT_DOXYGEN="yes" 124WANT_DOXYGEN="yes"
124AC_ARG_ENABLE([doxygen], 125AC_ARG_ENABLE([doxygen],
125 AC_HELP_STRING([--disable-doxygen],[do not generate documentation]), 126 AC_HELP_STRING([--disable-doxygen],[do not generate documentation]),
126 [ 127 [
127 test "${enableval}" = "no" && WANT_DOXYGEN="no" 128 test "${enableval}" = "no" && WANT_DOXYGEN="no"
128 ] 129 ]
129) 130)
130if test "${WANT_DOXYGEN}" = "yes" ; then 131if test "${WANT_DOXYGEN}" = "yes" ; then
131 AC_WITH_DOXYGEN 132 AC_WITH_DOXYGEN
132 AC_WITH_DOT 133 AC_WITH_DOT
133else 134else
134 AM_CONDITIONAL([HAVE_DOXYGEN],[false]) 135 AM_CONDITIONAL([HAVE_DOXYGEN],[false])
135 AM_CONDITIONAL([HAVE_DOT],[false]) 136 AM_CONDITIONAL([HAVE_DOT],[false])
136fi 137fi
137 138
138LIBCURL_CHECK_CONFIG(,,,[ 139LIBCURL_CHECK_CONFIG(,,,[
139 AC_MSG_ERROR([no required libcurl library. get one from http://curl.haxx.se/]) 140 AC_MSG_ERROR([no required libcurl library. get one from http://curl.haxx.se/])
140]) 141])
141 142
142AC_CHECK_HEADER([expat.h],[ 143AC_CHECK_HEADER([expat.h],[
143 AC_CHECK_LIB([expat],[XML_ParserCreate],[ 144 AC_CHECK_LIB([expat],[XML_ParserCreate],[
144 EXPAT_LIBS=-lexpat 145 EXPAT_LIBS=-lexpat
145 EXPAT_CFLAGS= 146 EXPAT_CFLAGS=
146 AC_SUBST([EXPAT_LIBS]) 147 AC_SUBST([EXPAT_LIBS])
147 AC_SUBST([EXPAT_CFLAGS]) 148 AC_SUBST([EXPAT_CFLAGS])
148 ],[ 149 ],[
149 AC_MSG_ERROR([no required expat library. get one from http://expat.sourceforge.net/]) 150 AC_MSG_ERROR([no required expat library. get one from http://expat.sourceforge.net/])
150 ]) 151 ])
151],[ 152],[
152 AC_MSG_ERROR([no required expat library. get one from http://expat.sourceforge.net/]) 153 AC_MSG_ERROR([no required expat library. get one from http://expat.sourceforge.net/])
153]) 154])
154 155
155AC_CHECK_HEADERS([tidy.h tidy/tidy.h],[ 156AC_CHECK_HEADERS([tidy.h tidy/tidy.h],[
156 test -z "$TIDY_LIBS" && AC_CHECK_LIB([tidy],[tidyParseBuffer],[ 157 test -z "$TIDY_LIBS" && AC_CHECK_LIB([tidy],[tidyParseBuffer],[
157 TIDY_LIBS=-ltidy 158 TIDY_LIBS=-ltidy
158 TIDY_CFLAGS= 159 TIDY_CFLAGS=
159 AC_SUBST([TIDY_LIBS]) 160 AC_SUBST([TIDY_LIBS])
160 AC_SUBST([TIDY_CFLAGS]) 161 AC_SUBST([TIDY_CFLAGS])
161 ],[ 162 ],[
162 AC_MSG_ERROR([no required htmltidy library found. get one from http://tidy.sourceforge.net/]) 163 AC_MSG_ERROR([no required htmltidy library found. get one from http://tidy.sourceforge.net/])
163 ]) 164 ])
164],[ 165],[
165 test -z "$TIDY_LIBS" -a "$ac_header" = "tidy/tidy.h" \ 166 test -z "$TIDY_LIBS" -a "$ac_header" = "tidy/tidy.h" \
166 && AC_MSG_ERROR([no required htmltidy library found. get one from http://tidy.sourceforge.net/]) 167 && AC_MSG_ERROR([no required htmltidy library found. get one from http://tidy.sourceforge.net/])
167]) 168])
168 169
169PKG_CHECK_MODULES([SQLITE3],[sqlite3],[have_sqlite3=true],[have_sqlite3=false]) 170PKG_CHECK_MODULES([SQLITE3],[sqlite3],[have_sqlite3=true],[have_sqlite3=false])
170AM_CONDITIONAL([HAVE_SQLITE3],[$have_sqlite3]) 171AM_CONDITIONAL([HAVE_SQLITE3],[$have_sqlite3])
171PKG_CHECK_MODULES([KINGATE],[kingate-plaincgi],[have_kingate=true],[have_kingate=false]) 172PKG_CHECK_MODULES([KINGATE],[kingate-plaincgi],[have_kingate=true],[have_kingate=false])
172AM_CONDITIONAL([HAVE_KINGATE],[$have_kingate]) 173AM_CONDITIONAL([HAVE_KINGATE],[$have_kingate])
173PKG_CHECK_MODULES([UUID],[uuid],[have_uuid=true],[have_uuid=false]) 174PKG_CHECK_MODULES([UUID],[uuid],[have_uuid=true],[have_uuid=false])
174AM_CONDITIONAL([HAVE_UUID],[$have_uuid]) 175AM_CONDITIONAL([HAVE_UUID],[$have_uuid])
175if $have_uuid ; then 176if $have_uuid ; then
176 AC_DEFINE([HAVE_LIBUUID],,[defined in presence of libuuid]) 177 AC_DEFINE([HAVE_LIBUUID],,[defined in presence of libuuid])
177 AC_SUBST([UUID_UUID],[uuid]) 178 AC_SUBST([UUID_UUID],[uuid])
178fi 179fi
179 180
180curl_ssl_verify_host="true" 181curl_ssl_verify_host="true"
181AC_ARG_ENABLE([ssl-verify-host], 182AC_ARG_ENABLE([ssl-verify-host],
182 AC_HELP_STRING([--disable-ssl-verify-host],[disable cURL cert/host relationships verification]), 183 AC_HELP_STRING([--disable-ssl-verify-host],[disable cURL cert/host relationships verification]),
183 [ test "${enableval}" = "no" && curl_ssl_verify_host="false" ] 184 [ test "${enableval}" = "no" && curl_ssl_verify_host="false" ]
184) 185)
185${curl_ssl_verify_host} || AC_DEFINE([DISABLE_CURL_SSL_VERIFYHOST],,[defined if cURL is not to verify cert/host]) 186${curl_ssl_verify_host} || AC_DEFINE([DISABLE_CURL_SSL_VERIFYHOST],,[defined if cURL is not to verify cert/host])
186 187
187curl_ssl_verify_peer="true" 188curl_ssl_verify_peer="true"
188AC_ARG_ENABLE([ssl-verify-peer], 189AC_ARG_ENABLE([ssl-verify-peer],
189 AC_HELP_STRING([--disable-ssl-verify-peer],[disable cURL cert validity verification]), 190 AC_HELP_STRING([--disable-ssl-verify-peer],[disable cURL cert validity verification]),
190 [ test "${enableval}" = "no" && curl_ssl_verify_peer="false" ] 191 [ test "${enableval}" = "no" && curl_ssl_verify_peer="false" ]
191) 192)
192${curl_ssl_verify_peer} || AC_DEFINE([DISABLE_CURL_SSL_VERIFYPEER],,[defined if cURL is not to verify cert validity]) 193${curl_ssl_verify_peer} || AC_DEFINE([DISABLE_CURL_SSL_VERIFYPEER],,[defined if cURL is not to verify cert validity])
193 194
194postels_law=true 195postels_law=true
195AC_ARG_ENABLE([postels-law], 196AC_ARG_ENABLE([postels-law],
196 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)]), 197 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)]),
197 [ test "${enableval}" = "no" && postels_law=false ] 198 [ test "${enableval}" = "no" && postels_law=false ]
198) 199)
199$postels_law && AC_DEFINE([POSTELS_LAW],,[defined if we want to adhere to Postel's Law]) 200$postels_law && AC_DEFINE([POSTELS_LAW],,[defined if we want to adhere to Postel's Law])
200 201
201AC_DEFINE_UNQUOTED([OPKELE_SRC_DIR],["$PWD"],[source directory]) 202AC_DEFINE_UNQUOTED([OPKELE_SRC_DIR],["$PWD"],[source directory])
202 203
203nitpick=false 204nitpick=false
204AC_ARG_ENABLE([nitpicking], 205AC_ARG_ENABLE([nitpicking],
205 AC_HELP_STRING([--enable-nitpicking],[make compiler somewhat overly fastidious about the code it deals with]), 206 AC_HELP_STRING([--enable-nitpicking],[make compiler somewhat overly fastidious about the code it deals with]),
206 [ test "$enableval" = "no" || nitpick=true ] 207 [ test "$enableval" = "no" || nitpick=true ]
207) 208)
208if $nitpick ; then 209if $nitpick ; then
209 CPP_NITPICK="-pedantic -Wall -Wextra -Wundef -Wshadow \ 210 CPP_NITPICK="-pedantic -Wall -Wextra -Wundef -Wshadow \
210 -Wunsafe-loop-optimizations -Wconversion -Wmissing-format-attribute \ 211 -Wunsafe-loop-optimizations -Wconversion -Wmissing-format-attribute \
211 -Wredundant-decls -ansi" 212 -Wredundant-decls -ansi"
212 # -Wlogical-op -Wmissing-noreturn 213 # -Wlogical-op -Wmissing-noreturn
213 C_NITPICK="$CPP_NITPICK" 214 C_NITPICK="$CPP_NITPICK"
214 CXX_NITPICK="$C_NITPICK" 215 CXX_NITPICK="$C_NITPICK"
215 216
216 CPPFLAGS="$CPPFLAGS $CPP_NITPICK" 217 CPPFLAGS="$CPPFLAGS $CPP_NITPICK"
217 CFLAGS="$CFLAGS $C_NITPICK" 218 CFLAGS="$CFLAGS $C_NITPICK"
218 CXXFLAGS="$CXXFLAGS $CXX_NITPICK" 219 CXXFLAGS="$CXXFLAGS $CXX_NITPICK"
219fi 220fi
220 221
221ndebug=true 222ndebug=true
222AC_ARG_ENABLE([debug], 223AC_ARG_ENABLE([debug],
223 AC_HELP_STRING([--enable-debug],[enable debugging code]), 224 AC_HELP_STRING([--enable-debug],[enable debugging code]),
224 [ test "$enableval" = "no" || ndebug=false ] 225 [ test "$enableval" = "no" || ndebug=false ]
225) 226)
226if $ndebug ; then 227if $ndebug ; then
227 CPPFLAGS_DEBUG="-DNDEBUG" 228 CPPFLAGS_DEBUG="-DNDEBUG"
228else 229else
229 CPPFLAGS_DEBUG="" 230 CPPFLAGS_DEBUG=""
230fi 231fi
231AC_SUBST([CPPFLAGS_DEBUG]) 232AC_SUBST([CPPFLAGS_DEBUG])
232 233
233xri_proxy_url="https://xri.net/" 234xri_proxy_url="https://xri.net/"
234AC_MSG_CHECKING([for XRI resolver proxy]) 235AC_MSG_CHECKING([for XRI resolver proxy])
235AC_ARG_ENABLE([xri-proxy], 236AC_ARG_ENABLE([xri-proxy],
236 AC_HELP_STRING([--with-xri-proxy=url],[set xri proxy for use when resolving xri identities, default is https://xri.net/]), 237 AC_HELP_STRING([--with-xri-proxy=url],[set xri proxy for use when resolving xri identities, default is https://xri.net/]),
237 [ xri_proxy_url="$withval" ] 238 [ xri_proxy_url="$withval" ]
238) 239)
239AC_MSG_RESULT([$xri_proxy_url]) 240AC_MSG_RESULT([$xri_proxy_url])
240AC_DEFINE_UNQUOTED([XRI_PROXY_URL],["$xri_proxy_url"],[XRI proxy resolver URL]) 241AC_DEFINE_UNQUOTED([XRI_PROXY_URL],["$xri_proxy_url"],[XRI proxy resolver URL])
241 242
242AC_CONFIG_FILES([ 243AC_CONFIG_FILES([
243 Makefile 244 Makefile
244 libopkele.pc 245 libopkele.pc
245 Doxyfile 246 Doxyfile
246 include/Makefile 247 include/Makefile
247 include/opkele/tr1-mem.h 248 include/opkele/tr1-mem.h
248 lib/Makefile 249 lib/Makefile
249 test/Makefile 250 test/Makefile
250]) 251])
251AC_OUTPUT 252AC_OUTPUT
diff --git a/test/OP.cc b/test/OP.cc
index 6012b2e..4e2a5ed 100644
--- a/test/OP.cc
+++ b/test/OP.cc
@@ -1,274 +1,278 @@
1#include <uuid/uuid.h> 1#include <uuid/uuid.h>
2#include <iostream> 2#include <iostream>
3#include <cassert> 3#include <cassert>
4#include <string> 4#include <string>
5#include <ext/algorithm>
6using namespace std; 5using namespace std;
7#include <kingate/exception.h> 6#include <kingate/exception.h>
8#include <kingate/plaincgi.h> 7#include <kingate/plaincgi.h>
9#include <kingate/cgi_gateway.h> 8#include <kingate/cgi_gateway.h>
10#include <opkele/exception.h> 9#include <opkele/exception.h>
11#include <opkele/util.h> 10#include <opkele/util.h>
12#include <opkele/uris.h> 11#include <opkele/uris.h>
13#include <opkele/extension.h> 12#include <opkele/extension.h>
14#include <opkele/association.h> 13#include <opkele/association.h>
15#include <opkele/debug.h> 14#include <opkele/debug.h>
16#include <opkele/verify_op.h> 15#include <opkele/verify_op.h>
17#include <opkele/sreg.h> 16#include <opkele/sreg.h>
18 17
18#include "config.h"
19#ifdef HAVE_EXT_ALGORITHM_H
20# include <ext/algorithm>
21#endif
22
19#include "sqlite.h" 23#include "sqlite.h"
20#include "kingate_openid_message.h" 24#include "kingate_openid_message.h"
21 25
22static const string get_self_url(const kingate::cgi_gateway& gw) { 26static const string get_self_url(const kingate::cgi_gateway& gw) {
23 bool s = gw.has_meta("SSL_PROTOCOL_VERSION"); 27 bool s = gw.has_meta("SSL_PROTOCOL_VERSION");
24 string rv = s?"https://":"http://"; 28 string rv = s?"https://":"http://";
25 rv += gw.http_request_header("Host"); 29 rv += gw.http_request_header("Host");
26 const string& port = gw.get_meta("SERVER_PORT"); 30 const string& port = gw.get_meta("SERVER_PORT");
27 if( port!=(s?"443":"80") ) { 31 if( port!=(s?"443":"80") ) {
28 rv += ':'; rv += port; 32 rv += ':'; rv += port;
29 } 33 }
30 rv += gw.get_meta("REQUEST_URI"); 34 rv += gw.get_meta("REQUEST_URI");
31 string::size_type q = rv.find('?'); 35 string::size_type q = rv.find('?');
32 if(q!=string::npos) 36 if(q!=string::npos)
33 rv.erase(q); 37 rv.erase(q);
34 return rv; 38 return rv;
35} 39}
36 40
37class opdb_t : public sqlite3_t { 41class opdb_t : public sqlite3_t {
38 public: 42 public:
39 opdb_t() 43 opdb_t()
40 : sqlite3_t("/tmp/OP.db") { 44 : sqlite3_t("/tmp/OP.db") {
41 assert(_D); 45 assert(_D);
42 char **resp; int nr,nc; char *errm; 46 char **resp; int nr,nc; char *errm;
43 if(sqlite3_get_table( 47 if(sqlite3_get_table(
44 _D, "SELECT a_op FROM assoc LIMIT 0", 48 _D, "SELECT a_op FROM assoc LIMIT 0",
45 &resp,&nr,&nc,&errm)!=SQLITE_OK) { 49 &resp,&nr,&nc,&errm)!=SQLITE_OK) {
46 extern const char *__OP_db_bootstrap; 50 extern const char *__OP_db_bootstrap;
47 DOUT_("Bootstrapping DB"); 51 DOUT_("Bootstrapping DB");
48 if(sqlite3_exec(_D,__OP_db_bootstrap,NULL,NULL,&errm)!=SQLITE_OK) 52 if(sqlite3_exec(_D,__OP_db_bootstrap,NULL,NULL,&errm)!=SQLITE_OK)
49 throw opkele::exception(OPKELE_CP_ string("Failed to boostrap SQLite database: ")+errm); 53 throw opkele::exception(OPKELE_CP_ string("Failed to boostrap SQLite database: ")+errm);
50 }else 54 }else
51 sqlite3_free_table(resp); 55 sqlite3_free_table(resp);
52 } 56 }
53}; 57};
54 58
55class example_op_t : public opkele::verify_OP { 59class example_op_t : public opkele::verify_OP {
56 public: 60 public:
57 kingate::cgi_gateway& gw; 61 kingate::cgi_gateway& gw;
58 opdb_t db; 62 opdb_t db;
59 kingate::cookie htc; 63 kingate::cookie htc;
60 64
61 65
62 example_op_t(kingate::cgi_gateway& g) 66 example_op_t(kingate::cgi_gateway& g)
63 : gw(g) { 67 : gw(g) {
64 try { 68 try {
65 htc = gw.cookies.get_cookie("htop_session"); 69 htc = gw.cookies.get_cookie("htop_session");
66 sqlite3_mem_t<char*> S = sqlite3_mprintf( 70 sqlite3_mem_t<char*> S = sqlite3_mprintf(
67 "SELECT 1 FROM ht_sessions WHERE hts_id=%Q", 71 "SELECT 1 FROM ht_sessions WHERE hts_id=%Q",
68 htc.get_value().c_str()); 72 htc.get_value().c_str());
69 sqlite3_table_t T; int nr,nc; 73 sqlite3_table_t T; int nr,nc;
70 db.get_table(S,T,&nr,&nc); 74 db.get_table(S,T,&nr,&nc);
71 if(nr<1) 75 if(nr<1)
72 throw kingate::exception_notfound(CODEPOINT,"forcing cookie generation"); 76 throw kingate::exception_notfound(CODEPOINT,"forcing cookie generation");
73 }catch(kingate::exception_notfound& kenf) { 77 }catch(kingate::exception_notfound& kenf) {
74 uuid_t uuid; uuid_generate(uuid); 78 uuid_t uuid; uuid_generate(uuid);
75 htc = kingate::cookie("htop_session",opkele::util::encode_base64(uuid,sizeof(uuid))); 79 htc = kingate::cookie("htop_session",opkele::util::encode_base64(uuid,sizeof(uuid)));
76 sqlite3_mem_t<char*> S = sqlite3_mprintf( 80 sqlite3_mem_t<char*> S = sqlite3_mprintf(
77 "INSERT INTO ht_sessions (hts_id) VALUES (%Q)", 81 "INSERT INTO ht_sessions (hts_id) VALUES (%Q)",
78 htc.get_value().c_str()); 82 htc.get_value().c_str());
79 db.exec(S); 83 db.exec(S);
80 } 84 }
81 } 85 }
82 86
83 void set_authorized(bool a) { 87 void set_authorized(bool a) {
84 sqlite3_mem_t<char*> 88 sqlite3_mem_t<char*>
85 S = sqlite3_mprintf( 89 S = sqlite3_mprintf(
86 "UPDATE ht_sessions" 90 "UPDATE ht_sessions"
87 " SET authorized=%d" 91 " SET authorized=%d"
88 " WHERE hts_id=%Q", 92 " WHERE hts_id=%Q",
89 (int)a,htc.get_value().c_str()); 93 (int)a,htc.get_value().c_str());
90 db.exec(S); 94 db.exec(S);
91 } 95 }
92 bool get_authorized() { 96 bool get_authorized() {
93 sqlite3_mem_t<char*> 97 sqlite3_mem_t<char*>
94 S = sqlite3_mprintf( 98 S = sqlite3_mprintf(
95 "SELECT authorized" 99 "SELECT authorized"
96 " FROM ht_sessions" 100 " FROM ht_sessions"
97 " WHERE hts_id=%Q", 101 " WHERE hts_id=%Q",
98 htc.get_value().c_str()); 102 htc.get_value().c_str());
99 sqlite3_table_t T; int nr,nc; 103 sqlite3_table_t T; int nr,nc;
100 db.get_table(S,T,&nr,&nc); 104 db.get_table(S,T,&nr,&nc);
101 assert(nr==1); assert(nc=1); 105 assert(nr==1); assert(nc=1);
102 return opkele::util::string_to_long(T.get(1,0,nc)); 106 return opkele::util::string_to_long(T.get(1,0,nc));
103 } 107 }
104 108
105 ostream& cookie_header(ostream& o) const { 109 ostream& cookie_header(ostream& o) const {
106 o << "Set-Cookie: " << htc.set_cookie_header() << "\n"; 110 o << "Set-Cookie: " << htc.set_cookie_header() << "\n";
107 return o; 111 return o;
108 } 112 }
109 113
110 opkele::assoc_t alloc_assoc(const string& type,size_t klength,bool sl) { 114 opkele::assoc_t alloc_assoc(const string& type,size_t klength,bool sl) {
111 uuid_t uuid; uuid_generate(uuid); 115 uuid_t uuid; uuid_generate(uuid);
112 string a_handle = opkele::util::encode_base64(uuid,sizeof(uuid)); 116 string a_handle = opkele::util::encode_base64(uuid,sizeof(uuid));
113 opkele::secret_t a_secret; 117 opkele::secret_t a_secret;
114 generate_n( 118 generate_n(
115 back_insert_iterator<opkele::secret_t>(a_secret),klength, 119 back_insert_iterator<opkele::secret_t>(a_secret),klength,
116 rand ); 120 rand );
117 string ssecret; a_secret.to_base64(ssecret); 121 string ssecret; a_secret.to_base64(ssecret);
118 time_t now = time(0); 122 time_t now = time(0);
119 int expires_in = sl?3600*2:3600*24*7*2; 123 int expires_in = sl?3600*2:3600*24*7*2;
120 sqlite3_mem_t<char*> 124 sqlite3_mem_t<char*>
121 S = sqlite3_mprintf( 125 S = sqlite3_mprintf(
122 "INSERT INTO assoc" 126 "INSERT INTO assoc"
123 " (a_handle,a_type,a_ctime,a_etime,a_secret,a_stateless)" 127 " (a_handle,a_type,a_ctime,a_etime,a_secret,a_stateless)"
124 " VALUES (" 128 " VALUES ("
125 " %Q,%Q,datetime('now')," 129 " %Q,%Q,datetime('now'),"
126 " datetime('now','+%d seconds')," 130 " datetime('now','+%d seconds'),"
127 " %Q,%d );", 131 " %Q,%d );",
128 a_handle.c_str(), type.c_str(), 132 a_handle.c_str(), type.c_str(),
129 expires_in, 133 expires_in,
130 ssecret.c_str(), sl ); 134 ssecret.c_str(), sl );
131 db.exec(S); 135 db.exec(S);
132 return opkele::assoc_t(new opkele::association( 136 return opkele::assoc_t(new opkele::association(
133 "", 137 "",
134 a_handle, type, a_secret, 138 a_handle, type, a_secret,
135 now+expires_in, sl )); 139 now+expires_in, sl ));
136 } 140 }
137 141
138 opkele::assoc_t retrieve_assoc(const string& h) { 142 opkele::assoc_t retrieve_assoc(const string& h) {
139 sqlite3_mem_t<char*> 143 sqlite3_mem_t<char*>
140 S = sqlite3_mprintf( 144 S = sqlite3_mprintf(
141 "SELECT" 145 "SELECT"
142 " a_handle,a_type,a_secret,a_stateless," 146 " a_handle,a_type,a_secret,a_stateless,"
143 " strftime('%%s',a_etime) AS a_etime," 147 " strftime('%%s',a_etime) AS a_etime,"
144 " a_itime" 148 " a_itime"
145 " FROM assoc" 149 " FROM assoc"
146 " WHERE a_handle=%Q AND a_itime IS NULL" 150 " WHERE a_handle=%Q AND a_itime IS NULL"
147 " AND datetime('now') < a_etime" 151 " AND datetime('now') < a_etime"
148 " LIMIT 1", 152 " LIMIT 1",
149 h.c_str() ); 153 h.c_str() );
150 sqlite3_table_t T; 154 sqlite3_table_t T;
151 int nr,nc; 155 int nr,nc;
152 db.get_table(S,T,&nr,&nc); 156 db.get_table(S,T,&nr,&nc);
153 if(nr<1) 157 if(nr<1)
154 throw opkele::failed_lookup(OPKELE_CP_ 158 throw opkele::failed_lookup(OPKELE_CP_
155 "couldn't retrieve valid unexpired assoc"); 159 "couldn't retrieve valid unexpired assoc");
156 assert(nr==1); assert(nc==6); 160 assert(nr==1); assert(nc==6);
157 opkele::secret_t secret; opkele::util::decode_base64(T.get(1,2,nc),secret); 161 opkele::secret_t secret; opkele::util::decode_base64(T.get(1,2,nc),secret);
158 return opkele::assoc_t(new opkele::association( 162 return opkele::assoc_t(new opkele::association(
159 "", h, T.get(1,1,nc), secret, 163 "", h, T.get(1,1,nc), secret,
160 strtol(T.get(1,4,nc),0,0), 164 strtol(T.get(1,4,nc),0,0),
161 strtol(T.get(1,3,nc),0,0) )); 165 strtol(T.get(1,3,nc),0,0) ));
162 } 166 }
163 167
164 string& alloc_nonce(string& nonce) { 168 string& alloc_nonce(string& nonce) {
165 uuid_t uuid; uuid_generate(uuid); 169 uuid_t uuid; uuid_generate(uuid);
166 nonce += opkele::util::encode_base64(uuid,sizeof(uuid)); 170 nonce += opkele::util::encode_base64(uuid,sizeof(uuid));
167 sqlite3_mem_t<char*> 171 sqlite3_mem_t<char*>
168 S = sqlite3_mprintf( 172 S = sqlite3_mprintf(
169 "INSERT INTO nonces" 173 "INSERT INTO nonces"
170 " (n_once) VALUES (%Q)", 174 " (n_once) VALUES (%Q)",
171 nonce.c_str() ); 175 nonce.c_str() );
172 db.exec(S); 176 db.exec(S);
173 return nonce; 177 return nonce;
174 } 178 }
175 bool check_nonce(const string& nonce) { 179 bool check_nonce(const string& nonce) {
176 sqlite3_mem_t<char*> 180 sqlite3_mem_t<char*>
177 S = sqlite3_mprintf( 181 S = sqlite3_mprintf(
178 "SELECT 1" 182 "SELECT 1"
179 " FROM nonces" 183 " FROM nonces"
180 " WHERE n_once=%Q AND n_itime IS NULL", 184 " WHERE n_once=%Q AND n_itime IS NULL",
181 nonce.c_str()); 185 nonce.c_str());
182 sqlite3_table_t T; 186 sqlite3_table_t T;
183 int nr,nc; 187 int nr,nc;
184 db.get_table(S,T,&nr,&nc); 188 db.get_table(S,T,&nr,&nc);
185 return nr>=1; 189 return nr>=1;
186 } 190 }
187 void invalidate_nonce(const string& nonce) { 191 void invalidate_nonce(const string& nonce) {
188 sqlite3_mem_t<char*> 192 sqlite3_mem_t<char*>
189 S = sqlite3_mprintf( 193 S = sqlite3_mprintf(
190 "UPDATE nonces" 194 "UPDATE nonces"
191 " SET n_itime=datetime('now')" 195 " SET n_itime=datetime('now')"
192 " WHERE n_once=%Q", 196 " WHERE n_once=%Q",
193 nonce.c_str()); 197 nonce.c_str());
194 db.exec(S); 198 db.exec(S);
195 } 199 }
196 200
197 const string get_op_endpoint() const { 201 const string get_op_endpoint() const {
198 return get_self_url(gw); 202 return get_self_url(gw);
199 } 203 }
200 204
201}; 205};
202 206
203int main(int,char **) { 207int main(int,char **) {
204 try { 208 try {
205 kingate::plaincgi_interface ci; 209 kingate::plaincgi_interface ci;
206 kingate::cgi_gateway gw(ci); 210 kingate::cgi_gateway gw(ci);
207 string op; 211 string op;
208 try { op = gw.get_param("op"); }catch(kingate::exception_notfound&) { } 212 try { op = gw.get_param("op"); }catch(kingate::exception_notfound&) { }
209 string message; 213 string message;
210 if(op=="set_password") { 214 if(op=="set_password") {
211 example_op_t OP(gw); 215 example_op_t OP(gw);
212 string password = gw.get_param("password"); 216 string password = gw.get_param("password");
213 sqlite3_mem_t<char*> 217 sqlite3_mem_t<char*>
214 Sget = sqlite3_mprintf("SELECT s_password FROM setup LIMIT 1"); 218 Sget = sqlite3_mprintf("SELECT s_password FROM setup LIMIT 1");
215 sqlite3_table_t T; int nr,nc; 219 sqlite3_table_t T; int nr,nc;
216 OP.db.get_table(Sget,T,&nr,&nc); 220 OP.db.get_table(Sget,T,&nr,&nc);
217 if(nr>=1) 221 if(nr>=1)
218 throw opkele::exception(OPKELE_CP_ "Password already set"); 222 throw opkele::exception(OPKELE_CP_ "Password already set");
219 sqlite3_mem_t<char*> 223 sqlite3_mem_t<char*>
220 Sset = sqlite3_mprintf( 224 Sset = sqlite3_mprintf(
221 "INSERT INTO setup (s_password) VALUES (%Q)", 225 "INSERT INTO setup (s_password) VALUES (%Q)",
222 password.c_str()); 226 password.c_str());
223 OP.db.exec(Sset); 227 OP.db.exec(Sset);
224 op.clear(); 228 op.clear();
225 message = "password set"; 229 message = "password set";
226 }else if(op=="login") { 230 }else if(op=="login") {
227 example_op_t OP(gw); 231 example_op_t OP(gw);
228 string password = gw.get_param("password"); 232 string password = gw.get_param("password");
229 sqlite3_mem_t<char*> 233 sqlite3_mem_t<char*>
230 Sget = sqlite3_mprintf("SELECT s_password FROM setup LIMIT 1"); 234 Sget = sqlite3_mprintf("SELECT s_password FROM setup LIMIT 1");
231 sqlite3_table_t T; int nr,nc; 235 sqlite3_table_t T; int nr,nc;
232 OP.db.get_table(Sget,T,&nr,&nc); 236 OP.db.get_table(Sget,T,&nr,&nc);
233 if(nr<1) 237 if(nr<1)
234 throw opkele::exception(OPKELE_CP_ "no password set"); 238 throw opkele::exception(OPKELE_CP_ "no password set");
235 if(password!=T.get(1,0,nc)) 239 if(password!=T.get(1,0,nc))
236 throw opkele::exception(OPKELE_CP_ "wrong password"); 240 throw opkele::exception(OPKELE_CP_ "wrong password");
237 OP.set_authorized(true); 241 OP.set_authorized(true);
238 op.clear(); 242 op.clear();
239 message = "logged in"; 243 message = "logged in";
240 OP.cookie_header(cout); 244 OP.cookie_header(cout);
241 }else if(op=="logout") { 245 }else if(op=="logout") {
242 example_op_t OP(gw); 246 example_op_t OP(gw);
243 OP.set_authorized(false); 247 OP.set_authorized(false);
244 op.clear(); 248 op.clear();
245 message = "logged out"; 249 message = "logged out";
246 } 250 }
247 string omode; 251 string omode;
248 try { omode = gw.get_param("openid.mode"); }catch(kingate::exception_notfound&) { } 252 try { omode = gw.get_param("openid.mode"); }catch(kingate::exception_notfound&) { }
249 if(op=="xrds") { 253 if(op=="xrds") {
250 cout << 254 cout <<
251 "Content-type: application/xrds+xml\n\n" 255 "Content-type: application/xrds+xml\n\n"
252 "<?xml version='1.0' encoding='utf-8'?>" 256 "<?xml version='1.0' encoding='utf-8'?>"
253 "<xrds:XRDS xmlns:xrds='xri://$xrds' xmlns='xri://$xrd*($v*2.0)'>" 257 "<xrds:XRDS xmlns:xrds='xri://$xrds' xmlns='xri://$xrd*($v*2.0)'>"
254 "<XRD>" 258 "<XRD>"
255 "<Service>" 259 "<Service>"
256 "<Type>" STURI_OPENID20 "</Type>" 260 "<Type>" STURI_OPENID20 "</Type>"
257 "<URI>" << get_self_url(gw) << "</URI>" 261 "<URI>" << get_self_url(gw) << "</URI>"
258 "</Service>"; 262 "</Service>";
259 if(gw.has_param("idsel")){ 263 if(gw.has_param("idsel")){
260 cout << 264 cout <<
261 "<Service>" 265 "<Service>"
262 "<Type>" STURI_OPENID20_OP "</Type>" 266 "<Type>" STURI_OPENID20_OP "</Type>"
263 "<URI>" << get_self_url(gw) << "</URI>"; 267 "<URI>" << get_self_url(gw) << "</URI>";
264 } 268 }
265 cout << 269 cout <<
266 "</XRD>" 270 "</XRD>"
267 "</xrds:XRDS>"; 271 "</xrds:XRDS>";
268 }else if(op=="id_res" || op=="cancel") { 272 }else if(op=="id_res" || op=="cancel") {
269 kingate_openid_message_t inm(gw); 273 kingate_openid_message_t inm(gw);
270 example_op_t OP(gw); 274 example_op_t OP(gw);
271 if(gw.get_param("hts_id")!=OP.htc.get_value()) 275 if(gw.get_param("hts_id")!=OP.htc.get_value())
272 throw opkele::exception(OPKELE_CP_ "toying around, huh?"); 276 throw opkele::exception(OPKELE_CP_ "toying around, huh?");
273 opkele::sreg_t sreg; 277 opkele::sreg_t sreg;
274 OP.checkid_(inm,sreg); 278 OP.checkid_(inm,sreg);