summaryrefslogtreecommitdiffabout
path: root/include/opkele/oauth/consumer.h
blob: 1e2784c99fb4e965e2f36b2b5b6745d17bde436f (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
#ifndef __OPKELE_OAUTH_CONSUMER_H
#define __OPKELE_OAUTH_CONSUMER_H

#include <string>
#include <opkele/types.h>
#include <opkele/oauth.h>

namespace opkele {
    namespace oauth {
	using std::string;

	enum oauth_method_t {
	    oauth_auth_header, oauth_post_body, oauth_url_query
	};

	struct service_endpoint_t {
	    string url;
	    string signature_method;
	    oauth_method_t oauth_method;

	    service_endpoint_t(const string& u,const string& sm,oauth_method_t om)
		: 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;

	    http_request_t(const string& m,const string& u)
		: method(m), url(u) { }
	};

	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);

		void 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="");
		void 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="");

		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 */