summaryrefslogtreecommitdiffabout
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--include/opkele/types.h42
-rw-r--r--lib/Makefile.am2
-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())