From 752e484cd2fc239bc582a88fe7d62a225880ee3b Mon Sep 17 00:00:00 2001 From: Michael Krelin Date: Sun, 06 Apr 2008 09:31:10 +0000 Subject: Merge commit '1e3ed01c149aaeed5a64aacff218a5486128fc92' into devel/openid20 --- 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 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 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 assoc_t; - class basic_openid_message { + class basic_fields { public: - typedef list 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 #include #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 +#include +#include + +namespace opkele { + using std::unary_function; + + struct __om_copier : public unary_function { + 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 { + 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 { - 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 { public: @@ -65,58 +41,6 @@ namespace opkele { return i->substr(3); } - struct __om_query_builder : public unary_function { - 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@ -- cgit v0.9.0.2