summaryrefslogtreecommitdiffabout
path: root/include/opkele/oauth/consumer.h
blob: eb4f7535de5c201d91f060b81a2e3555325b08a7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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 */