-rw-r--r-- | include/Makefile.am | 4 | ||||
-rw-r--r-- | include/opkele/oauth.h | 22 | ||||
-rw-r--r-- | include/opkele/oauth/consumer.h | 135 | ||||
-rw-r--r-- | include/opkele/types.h | 18 |
4 files changed, 178 insertions, 1 deletions
diff --git a/include/Makefile.am b/include/Makefile.am index f842bb9..2ae510d 100644 --- a/include/Makefile.am +++ b/include/Makefile.am @@ -20,11 +20,13 @@ nobase_include_HEADERS = \ opkele/iterator.h \ opkele/basic_op.h opkele/verify_op.h \ opkele/util.h \ + opkele/oauth.h opkele/oauth/consumer.h \ + opkele/curl.h \ ${NODIST_HEADERS_} noinst_HEADERS = \ opkele/data.h \ - opkele/curl.h opkele/expat.h opkele/tidy.h \ + opkele/expat.h opkele/tidy.h \ opkele/util-internal.h \ opkele/debug.h \ opkele/discovery.h diff --git a/include/opkele/oauth.h b/include/opkele/oauth.h new file mode 100644 index 0000000..14d0586 --- a/dev/null +++ b/include/opkele/oauth.h @@ -0,0 +1,22 @@ +#ifndef __OPKELE_OAUTH_H +#define __OPKELE_OAUTH_H + +#include <string> + +namespace opkele { + namespace oauth { + using std::string; + + struct token_t { + string key; + string secret; + + token_t() { } + token_t(const string& k,const string& s) + : key(k), secret(s) { } + }; + + } +} + +#endif /* __OPKELE_OAUTH_H */ diff --git a/include/opkele/oauth/consumer.h b/include/opkele/oauth/consumer.h new file mode 100644 index 0000000..eb4f753 --- a/dev/null +++ b/include/opkele/oauth/consumer.h @@ -0,0 +1,135 @@ +#ifndef __OPKELE_OAUTH_CONSUMER_H +#define __OPKELE_OAUTH_CONSUMER_H + +#include <string> +#include <opkele/types.h> +#include <opkele/oauth.h> +#include <opkele/curl.h> + +namespace opkele { + namespace oauth { + using std::string; + + enum oauth_method_t { + oauth_auth_header, oauth_post_body, oauth_url_query, + oauth_method_default = oauth_auth_header + }; + + struct service_endpoint_t { + string url; + string signature_method; + oauth_method_t oauth_method; + + service_endpoint_t() : oauth_method(oauth_method_default) { } + service_endpoint_t(const string& u,const string& sm,oauth_method_t om=oauth_method_default) + : url(u), signature_method(sm), oauth_method(om) { } + }; + + class basic_provider_endpoints { + public: + + virtual ~basic_provider_endpoints() { } + + virtual const service_endpoint_t& get_request_token_endpoint() const = 0; + virtual const service_endpoint_t& get_authorize_user_endpoint() const = 0; + virtual const service_endpoint_t& get_access_token_endpoint() const = 0; + + virtual service_endpoint_t& get_url_endpoint(service_endpoint_t& sep, + const string& url) const = 0; + }; + + struct http_request_t { + string authorize_header; + string method; + string url; + string body; + + util::curl_slist_t _curl_headers_list; + + http_request_t(const string& m,const string& u) + : method(m), url(u) { } + + void setup_curl(CURL *curl); + }; + + class basic_consumer { + public: + token_t consumer_token; + + basic_consumer(const token_t& ct) + : consumer_token(ct) { } + virtual ~basic_consumer() { } + + virtual const basic_provider_endpoints& get_endpoints() const = 0; + virtual const string allocate_nonce(time_t ts) = 0; + + token_t get_request_token(); + const string get_authorize_url(const token_t& rt,const string& callback=""); + token_t get_access_token(const token_t& rt); + + http_request_t& prepare_request( + http_request_t& req, + const basic_fields& qf,const basic_fields& pf, + oauth_method_t om,const string& sm, + const token_t *t=0,const string& realm=""); + http_request_t& prepare_request( + http_request_t& req, + const basic_fields& qf,const basic_fields& pf, + const service_endpoint_t& sep, + const token_t *t=0,const string& realm=""); + http_request_t& prepare_request( + http_request_t& req, + const basic_fields& qf,const basic_fields& pf, + const token_t *t=0,const string& realm=""); + + const string signature( + const string& method, + const string& url, + const basic_fields& fields, + const token_t* rt=0); + + token_t acquire_token( + const service_endpoint_t& sep, + const token_t* rt=0); + }; + + class simple_provider_endpoints : public basic_provider_endpoints { + public: + service_endpoint_t sep_request_token; + service_endpoint_t sep_authorize_user; + service_endpoint_t sep_access_token; + service_endpoint_t sep_generic; + + simple_provider_endpoints( + const string& rt,const string& au,const string& at, + const string& sm, + oauth_method_t ams=oauth_post_body, + oauth_method_t amr=oauth_auth_header ) + : sep_request_token(rt,sm,ams), + sep_authorize_user(au,sm,oauth_url_query), + sep_access_token(at,sm,ams), + sep_generic("",sm,amr) { } + + const service_endpoint_t& get_request_token_endpoint() const; + const service_endpoint_t& get_authorize_user_endpoint() const; + const service_endpoint_t& get_access_token_endpoint() const; + service_endpoint_t& get_url_endpoint(service_endpoint_t& sep, + const string& url) const; + }; + + class simple_consumer : public basic_consumer { + public: + simple_provider_endpoints peps; + + simple_consumer(const simple_provider_endpoints& eps, + const token_t& ct) + : basic_consumer(ct), peps(eps) { } + + const basic_provider_endpoints& get_endpoints() const; + const string allocate_nonce(time_t ts); + }; + + } +} + +#endif /* __OPKELE_OAUTH_CONSUMER_H */ diff --git a/include/opkele/types.h b/include/opkele/types.h index f63bf5d..4471e6a 100644 --- a/include/opkele/types.h +++ b/include/opkele/types.h @@ -143,6 +143,24 @@ namespace opkele { virtual void set_field(const string& n,const string& v); virtual void reset_field(const string& n); + void from_query(const string& qs); + }; + + class fields_t : public basic_fields, public map<string,string> { + public: + fields_t() { } + fields_t(const basic_fields& x) + : basic_fields(x) { } + + 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; + + 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 { |