-rw-r--r-- | include/opkele/types.h | 42 | ||||
-rw-r--r-- | lib/Makefile.am | 2 | ||||
-rw-r--r-- | lib/message.cc (renamed from lib/openid_message.cc) | 94 |
3 files changed, 73 insertions, 65 deletions
diff --git a/include/opkele/types.h b/include/opkele/types.h index ffb9afb..64f165c 100644 --- a/include/opkele/types.h +++ b/include/opkele/types.h @@ -115,42 +115,58 @@ namespace opkele { /** * the shared_ptr<> for association_t object type */ typedef tr1mem::shared_ptr<association_t> assoc_t; - class basic_openid_message { + class basic_message { 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_message() { } + virtual ~basic_message() { } + basic_message(const basic_message& x); + void copy_to(basic_message& x) const; + void append_to(basic_message& 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_message { + public: + typedef list<string> fields_t; + typedef util::forward_iterator_proxy< + string,const string&,const string* + > fields_iterator; + + 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_message::append_query(url,pfx); } + virtual string query_string(const char *pfx="openid.") const { + return basic_message::query_string(pfx); } + virtual void from_keyvalues(const string& kv); virtual void to_keyvalues(ostream& o) const; virtual void to_htmlhiddens(ostream& o,const char* pfx=0) const; void add_to_signed(const string& fields); @@ -161,14 +177,12 @@ namespace opkele { class openid_message_t : public basic_openid_message, public map<string,string> { public: openid_message_t() { } 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; virtual fields_iterator fields_end() const; void reset_fields(); diff --git a/lib/Makefile.am b/lib/Makefile.am index e8bfbf5..9b25b42 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -25,10 +25,10 @@ libopkele_la_SOURCES = \ extension.cc \ sreg.cc \ extension_chain.cc \ curl.cc expat.cc \ discovery.cc \ basic_rp.cc prequeue_rp.cc \ - openid_message.cc \ + message.cc \ basic_op.cc verify_op.cc libopkele_la_LDFLAGS = \ -version-info 2:0:0 diff --git a/lib/openid_message.cc b/lib/message.cc index e244f43..78f20f4 100644 --- a/lib/openid_message.cc +++ b/lib/message.cc @@ -9,77 +9,47 @@ 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; + const basic_message& from; + basic_message& to; - __om_copier(basic_openid_message& t,const basic_openid_message& f) + __om_copier(basic_message& t,const basic_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) { + basic_message::basic_message(const basic_message& x) { x.copy_to(*this); } - void basic_openid_message::copy_to(basic_openid_message& x) const { + void basic_message::copy_to(basic_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 { + void basic_message::append_to(basic_message& x) const { for_each(fields_begin(),fields_end(), __om_copier(x,*this) ); } - struct __om_ns_finder : public unary_function<const string&,bool> { - public: - const basic_openid_message& om; - const string& uri; - - __om_ns_finder(const basic_openid_message& m, - const string& u) : om(m), uri(u) { } - - result_type operator()(argument_type f) { - return - (!strncmp(f.c_str(),"ns.",sizeof("ns.")-1)) - && om.get_field(f)==uri ; - } - }; - - bool basic_openid_message::has_ns(const string& uri) const { - fields_iterator ei = fields_end(); - fields_iterator i = find_if(fields_begin(),fields_end(), - __om_ns_finder(*this,uri)); - return !(i==ei); - } - string basic_openid_message::get_ns(const string& uri) const { - fields_iterator ei = fields_end(); - fields_iterator i = find_if(fields_begin(),fields_end(), - __om_ns_finder(*this,uri)); - if(i==ei) - throw failed_lookup(OPKELE_CP_ string("failed to find namespace ")+uri); - return i->substr(3); - } - struct __om_query_builder : public unary_function<const string&,void> { public: - const basic_openid_message& om; + const basic_message& om; bool first; string& rv; const char *pfx; - __om_query_builder(const char *p,string& r,const basic_openid_message& m) + __om_query_builder(const char *p,string& r,const basic_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_query_builder(const char *p,string& r,const basic_message& m,const string& u) : om(m), first(true), rv(r), pfx(p) { rv = u; if(rv.find('?')==string::npos) rv += '?'; else first = false; @@ -95,31 +65,61 @@ namespace opkele { 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 basic_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 basic_message::query_string(const char *pfx) const { string rv; return __om_query_builder(pfx,rv,*this).rv; } - void basic_openid_message::reset_fields() { + void basic_message::reset_fields() { throw not_implemented(OPKELE_CP_ "reset_fields() not implemented"); } - void basic_openid_message::set_field(const string&,const string&) { + void basic_message::set_field(const string&,const string&) { throw not_implemented(OPKELE_CP_ "set_field() not implemented"); } - void basic_openid_message::reset_field(const string&) { + void basic_message::reset_field(const string&) { throw not_implemented(OPKELE_CP_ "reset_field() not implemented"); } + struct __om_ns_finder : public unary_function<const string&,bool> { + public: + const basic_openid_message& om; + const string& uri; + + __om_ns_finder(const basic_openid_message& m, + const string& u) : om(m), uri(u) { } + + result_type operator()(argument_type f) { + return + (!strncmp(f.c_str(),"ns.",sizeof("ns.")-1)) + && om.get_field(f)==uri ; + } + }; + + bool basic_openid_message::has_ns(const string& uri) const { + fields_iterator ei = fields_end(); + fields_iterator i = find_if(fields_begin(),fields_end(), + __om_ns_finder(*this,uri)); + return !(i==ei); + } + string basic_openid_message::get_ns(const string& uri) const { + fields_iterator ei = fields_end(); + fields_iterator i = find_if(fields_begin(),fields_end(), + __om_ns_finder(*this,uri)); + if(i==ei) + throw failed_lookup(OPKELE_CP_ string("failed to find namespace ")+uri); + return i->substr(3); + } + void basic_openid_message::from_keyvalues(const string& kv) { reset_fields(); string::size_type p = 0; while(true) { string::size_type co = kv.find(':',p); if(co==string::npos) @@ -237,18 +237,12 @@ namespace opkele { throw exception(OPKELE_CP_ "Failed to allocate namespace"); } set_field("ns."+rv,uri); 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(); } const string& openid_message_t::get_field(const string& n) const { const_iterator i=find(n); if(i==end()) |