summaryrefslogtreecommitdiffabout
authorMichael Krelin <hacker@klever.net>2008-04-06 09:31:10 (UTC)
committer Michael Krelin <hacker@klever.net>2008-04-06 09:31:10 (UTC)
commit752e484cd2fc239bc582a88fe7d62a225880ee3b (patch) (side-by-side diff)
treead53fd61add881c5262b9cbc66c5db41e179a993
parentc56867c814a70505e27501c8f02768a594d8e42d (diff)
parent1e3ed01c149aaeed5a64aacff218a5486128fc92 (diff)
downloadlibopkele-752e484cd2fc239bc582a88fe7d62a225880ee3b.zip
libopkele-752e484cd2fc239bc582a88fe7d62a225880ee3b.tar.gz
libopkele-752e484cd2fc239bc582a88fe7d62a225880ee3b.tar.bz2
Merge commit '1e3ed01c149aaeed5a64aacff218a5486128fc92' into devel/openid20
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--configure.ac4
-rw-r--r--include/opkele/curl.h20
-rw-r--r--include/opkele/types.h39
-rw-r--r--lib/Makefile.am2
-rw-r--r--lib/curl.cc20
-rw-r--r--lib/fields.cc86
-rw-r--r--lib/message.cc (renamed from lib/openid_message.cc)84
-rw-r--r--libopkele.pc.in2
8 files changed, 157 insertions, 100 deletions
diff --git a/configure.ac b/configure.ac
index a49177f..0aa1272 100644
--- a/configure.ac
+++ b/configure.ac
@@ -178,6 +178,10 @@ PKG_CHECK_MODULES([KINGATE],[kingate-plaincgi],[have_kingate=true],[have_kingate
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],
diff --git a/include/opkele/curl.h b/include/opkele/curl.h
index 5cf8e48..bcaf11d 100644
--- a/include/opkele/curl.h
+++ b/include/opkele/curl.h
@@ -12,6 +12,24 @@ namespace opkele {
namespace util {
+ class curl_slist_t {
+ public:
+ curl_slist *_s;
+
+ curl_slist_t() : _s(0) { }
+ curl_slist_t(curl_slist *s) : _s(s) { }
+ virtual ~curl_slist_t() throw();
+
+ curl_slist_t& operator=(curl_slist *s);
+
+ operator const curl_slist*(void) const { return _s; }
+ operator curl_slist*(void) { return _s; }
+
+ void append(const char *str);
+ void append(const string& str) {
+ append(str.c_str()); }
+ };
+
class curl_t {
public:
CURL *_c;
@@ -29,6 +47,8 @@ namespace opkele {
template<typename PT>
inline CURLcode easy_setopt(CURLoption o,PT p) { assert(_c); return curl_easy_setopt(_c,o,p); }
+ inline CURLcode easy_setopt(CURLoption o,const curl_slist_t& p) {
+ assert(_c); return curl_easy_setopt(_c,o,(const curl_slist*)p); }
CURLcode easy_perform() { assert(_c); return curl_easy_perform(_c); }
template<typename IT>
inline CURLcode easy_getinfo(CURLINFO i,IT p) { assert(_c); return curl_easy_getinfo(_c,i,p); }
diff --git a/include/opkele/types.h b/include/opkele/types.h
index ffb9afb..f63bf5d 100644
--- a/include/opkele/types.h
+++ b/include/opkele/types.h
@@ -118,36 +118,47 @@ namespace opkele {
*/
typedef tr1mem::shared_ptr<association_t> assoc_t;
- class basic_openid_message {
+ class basic_fields {
public:
- typedef list<string> fields_t;
typedef util::forward_iterator_proxy<
string,const string&,const string*
> fields_iterator;
- basic_openid_message() { }
- virtual ~basic_openid_message() { }
- basic_openid_message(const basic_openid_message& x);
- void copy_to(basic_openid_message& x) const;
- void append_to(basic_openid_message& x) const;
+ basic_fields() { }
+ virtual ~basic_fields() { }
+ basic_fields(const basic_fields& x);
+ void copy_to(basic_fields& x) const;
+ void append_to(basic_fields& x) const;
virtual bool has_field(const string& n) const = 0;
virtual const string& get_field(const string& n) const = 0;
- virtual bool has_ns(const string& uri) const;
- virtual string get_ns(const string& uri) const;
-
virtual fields_iterator fields_begin() const = 0;
virtual fields_iterator fields_end() const = 0;
- virtual string append_query(const string& url,const char *pfx="openid.") const;
- virtual string query_string(const char *pfx="openid.") const;
-
+ virtual string append_query(const string& url,const char *pfx=0) const;
+ virtual string query_string(const char *pfx=0) const;
virtual void reset_fields();
virtual void set_field(const string& n,const string& v);
virtual void reset_field(const string& n);
+ };
+
+ class basic_openid_message : public basic_fields {
+ public:
+
+ basic_openid_message() { }
+ basic_openid_message(const basic_openid_message& x);
+
+ virtual bool has_ns(const string& uri) const;
+ virtual string get_ns(const string& uri) const;
+
+ virtual string append_query(const string& url,const char *pfx="openid.") const {
+ return basic_fields::append_query(url,pfx); }
+ virtual string query_string(const char *pfx="openid.") const {
+ return basic_fields::query_string(pfx); }
+
virtual void from_keyvalues(const string& kv);
virtual void to_keyvalues(ostream& o) const;
@@ -164,8 +175,6 @@ namespace opkele {
openid_message_t(const basic_openid_message& x)
: basic_openid_message(x) { }
- void copy_to(basic_openid_message& x) const;
-
bool has_field(const string& n) const;
const string& get_field(const string& n) const;
virtual fields_iterator fields_begin() const;
diff --git a/lib/Makefile.am b/lib/Makefile.am
index e8bfbf5..20d15b8 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -28,7 +28,7 @@ libopkele_la_SOURCES = \
curl.cc expat.cc \
discovery.cc \
basic_rp.cc prequeue_rp.cc \
- openid_message.cc \
+ fields.cc message.cc \
basic_op.cc verify_op.cc
libopkele_la_LDFLAGS = \
-version-info 2:0:0
diff --git a/lib/curl.cc b/lib/curl.cc
index 6172828..734e2ca 100644
--- a/lib/curl.cc
+++ b/lib/curl.cc
@@ -1,3 +1,4 @@
+#include <opkele/exception.h>
#include <opkele/curl.h>
#include "config.h"
@@ -6,6 +7,25 @@ namespace opkele {
namespace util {
+ curl_slist_t::~curl_slist_t() throw() {
+ if(_s)
+ curl_slist_free_all(_s);
+ }
+
+ curl_slist_t& curl_slist_t::operator=(curl_slist *s) {
+ if(_s)
+ curl_slist_free_all(_s);
+ _s = s;
+ return *this;
+ }
+
+ void curl_slist_t::append(const char *str) {
+ curl_slist *s = curl_slist_append(_s,str);
+ if(!s)
+ throw opkele::exception(OPKELE_CP_ "failed to curl_slist_append()");
+ _s=s;
+ }
+
curl_t::~curl_t() throw() {
if(_c)
curl_easy_cleanup(_c);
diff --git a/lib/fields.cc b/lib/fields.cc
new file mode 100644
index 0000000..d494098
--- a/dev/null
+++ b/lib/fields.cc
@@ -0,0 +1,86 @@
+#include <opkele/types.h>
+#include <opkele/exception.h>
+#include <opkele/util.h>
+
+namespace opkele {
+ using std::unary_function;
+
+ struct __om_copier : public unary_function<const string&,void> {
+ public:
+ const basic_fields& from;
+ basic_fields& to;
+
+ __om_copier(basic_fields& t,const basic_fields& f)
+ : from(f), to(t) { }
+
+ result_type operator()(argument_type f) {
+ to.set_field(f,from.get_field(f)); }
+ };
+
+ basic_fields::basic_fields(const basic_fields& x) {
+ x.copy_to(*this);
+ }
+ void basic_fields::copy_to(basic_fields& x) const {
+ x.reset_fields();
+ for_each(fields_begin(),fields_end(),
+ __om_copier(x,*this) );
+ }
+ void basic_fields::append_to(basic_fields& x) const {
+ for_each(fields_begin(),fields_end(),
+ __om_copier(x,*this) );
+ }
+
+ struct __om_query_builder : public unary_function<const string&,void> {
+ public:
+ const basic_fields& om;
+ bool first;
+ string& rv;
+ const char *pfx;
+
+ __om_query_builder(const char *p,string& r,const basic_fields& m)
+ : om(m), first(true), rv(r), pfx(p) {
+ for_each(om.fields_begin(),om.fields_end(),*this);
+ }
+ __om_query_builder(const char *p,string& r,const basic_fields& m,const string& u)
+ : om(m), first(true), rv(r), pfx(p) {
+ rv = u;
+ if(rv.find('?')==string::npos)
+ rv += '?';
+ else
+ first = false;
+ for_each(om.fields_begin(),om.fields_end(),*this);
+ }
+
+ result_type operator()(argument_type f) {
+ if(first)
+ first = false;
+ else
+ rv += '&';
+ if(pfx) rv += pfx;
+ rv+= f;
+ rv += '=';
+ rv += util::url_encode(om.get_field(f));
+ }
+ };
+
+ string basic_fields::append_query(const string& url,const char *pfx) const {
+ string rv;
+ return __om_query_builder(pfx,rv,*this,url).rv;
+ }
+ string basic_fields::query_string(const char *pfx) const {
+ string rv;
+ return __om_query_builder(pfx,rv,*this).rv;
+ }
+
+ void basic_fields::reset_fields() {
+ throw not_implemented(OPKELE_CP_ "reset_fields() not implemented");
+ }
+ void basic_fields::set_field(const string&,const string&) {
+ throw not_implemented(OPKELE_CP_ "set_field() not implemented");
+ }
+ void basic_fields::reset_field(const string&) {
+ throw not_implemented(OPKELE_CP_ "reset_field() not implemented");
+ }
+
+
+}
diff --git a/lib/openid_message.cc b/lib/message.cc
index e244f43..b2324b7 100644
--- a/lib/openid_message.cc
+++ b/lib/message.cc
@@ -10,30 +10,6 @@ namespace opkele {
using std::input_iterator_tag;
using std::unary_function;
- struct __om_copier : public unary_function<const string&,void> {
- public:
- const basic_openid_message& from;
- basic_openid_message& to;
-
- __om_copier(basic_openid_message& t,const basic_openid_message& f)
- : from(f), to(t) { }
-
- result_type operator()(argument_type f) {
- to.set_field(f,from.get_field(f)); }
- };
-
- basic_openid_message::basic_openid_message(const basic_openid_message& x) {
- x.copy_to(*this);
- }
- void basic_openid_message::copy_to(basic_openid_message& x) const {
- x.reset_fields();
- for_each(fields_begin(),fields_end(),
- __om_copier(x,*this) );
- }
- void basic_openid_message::append_to(basic_openid_message& x) const {
- for_each(fields_begin(),fields_end(),
- __om_copier(x,*this) );
- }
struct __om_ns_finder : public unary_function<const string&,bool> {
public:
@@ -65,58 +41,6 @@ namespace opkele {
return i->substr(3);
}
- struct __om_query_builder : public unary_function<const string&,void> {
- public:
- const basic_openid_message& om;
- bool first;
- string& rv;
- const char *pfx;
-
- __om_query_builder(const char *p,string& r,const basic_openid_message& m)
- : om(m), first(true), rv(r), pfx(p) {
- for_each(om.fields_begin(),om.fields_end(),*this);
- }
- __om_query_builder(const char *p,string& r,const basic_openid_message& m,const string& u)
- : om(m), first(true), rv(r), pfx(p) {
- rv = u;
- if(rv.find('?')==string::npos)
- rv += '?';
- else
- first = false;
- for_each(om.fields_begin(),om.fields_end(),*this);
- }
-
- result_type operator()(argument_type f) {
- if(first)
- first = false;
- else
- rv += '&';
- if(pfx) rv += pfx;
- rv+= f;
- rv += '=';
- rv += util::url_encode(om.get_field(f));
- }
- };
-
- string basic_openid_message::append_query(const string& url,const char *pfx) const {
- string rv;
- return __om_query_builder(pfx,rv,*this,url).rv;
- }
- string basic_openid_message::query_string(const char *pfx) const {
- string rv;
- return __om_query_builder(pfx,rv,*this).rv;
- }
-
- void basic_openid_message::reset_fields() {
- throw not_implemented(OPKELE_CP_ "reset_fields() not implemented");
- }
- void basic_openid_message::set_field(const string&,const string&) {
- throw not_implemented(OPKELE_CP_ "set_field() not implemented");
- }
- void basic_openid_message::reset_field(const string&) {
- throw not_implemented(OPKELE_CP_ "reset_field() not implemented");
- }
-
void basic_openid_message::from_keyvalues(const string& kv) {
reset_fields();
string::size_type p = 0;
@@ -129,7 +53,7 @@ namespace opkele {
if(nl==string::npos)
throw bad_input(OPKELE_CP_ "malformed input");
if(nl>co)
- insert(value_type(kv.substr(p,co-p),kv.substr(co+1,nl-co-1)));
+ set_field(kv.substr(p,co-p),kv.substr(co+1,nl-co-1));
p = nl+1;
#else /* POSTELS_LAW */
string::size_type lb = kv.find_first_of("\r\n",co+1);
@@ -240,12 +164,6 @@ namespace opkele {
return rv;
}
- void openid_message_t::copy_to(basic_openid_message& x) const {
- x.reset_fields();
- for(const_iterator i=begin();i!=end();++i)
- x.set_field(i->first,i->second);
- }
-
bool openid_message_t::has_field(const string& n) const {
return find(n)!=end();
}
diff --git a/libopkele.pc.in b/libopkele.pc.in
index 011f2fe..2720a6a 100644
--- a/libopkele.pc.in
+++ b/libopkele.pc.in
@@ -6,6 +6,6 @@ includedir=@includedir@
Name: libopkele
Description: C++ implementation of OpenID protocol
Version: @VERSION@
-Requires: openssl libpcre @KONFORKA_KONFORKA@
+Requires: openssl libpcre @KONFORKA_KONFORKA@ @UUID_UUID@
Cflags: -I${includedir} @LIBCURL_CPPFLAGS@ @PCRE_CFLAGS@ @EXPAT_CFLAGS@ @TIDY_CFLAGS@
Libs: -L${libdir} -lopkele @LIBCURL@ @PCRE_LIBS@ @EXPAT_LIBS@ @TIDY_LIBS@