-rw-r--r-- | lib/Makefile.am | 2 | ||||
-rw-r--r-- | lib/message.cc (renamed from lib/openid_message.cc) | 94 |
2 files changed, 45 insertions, 51 deletions
diff --git a/lib/Makefile.am b/lib/Makefile.am index e8bfbf5..9b25b42 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -15,20 +15,20 @@ libopkele_la_LIBADD = \ ${KONFORKA_LIBS} ${TIDY_LIBS} libopkele_la_SOURCES = \ params.cc \ util.cc \ server.cc \ secret.cc \ data.cc \ consumer.cc \ exception.cc \ 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 @@ -1,135 +1,135 @@ #include <cassert> #include <opkele/types.h> #include <opkele/exception.h> #include <opkele/util.h> #include <opkele/debug.h> #include "config.h" 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; 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 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) break; #ifndef POSTELS_LAW string::size_type nl = kv.find('\n',co+1); 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))); p = nl+1; #else /* POSTELS_LAW */ string::size_type lb = kv.find_first_of("\r\n",co+1); @@ -227,38 +227,32 @@ namespace opkele { string basic_openid_message::allocate_ns(const string& uri,const char *pfx) { if(!has_field("ns")) return pfx; if(has_ns(uri)) throw bad_input(OPKELE_CP_ "OpenID message already contains namespace"); string rv = pfx; if(has_field("ns."+rv)) { string::reference c=rv[rv.length()]; for(c='a';c<='z' && has_field("ns."+rv);++c); if(c=='z') 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()) throw failed_lookup(OPKELE_CP_ n+": no such field"); return i->second; } openid_message_t::fields_iterator openid_message_t::fields_begin() const { return util::map_keys_iterator<const_iterator,string,const string&,const string*>(begin(),end()); } openid_message_t::fields_iterator openid_message_t::fields_end() const { return util::map_keys_iterator<const_iterator,string,const string&,const string*>(end(),end()); } |