|
|
|
@@ -21,6 +21,7 @@ using namespace opkele; |
21 | #include <opkele/debug.h> |
21 | #include <opkele/debug.h> |
22 | |
22 | |
23 | #include "sqlite.h" |
23 | #include "sqlite.h" |
| |
24 | #include "kingate_openid_message.h" |
24 | |
25 | |
25 | #undef DUMB_RP |
26 | #undef DUMB_RP |
26 | |
27 | |
@@ -30,115 +31,6 @@ using namespace opkele; |
30 | # define DUMBTHROW (void)0 |
31 | # define DUMBTHROW (void)0 |
31 | #endif |
32 | #endif |
32 | |
33 | |
33 | template<typename IT> |
| |
34 | class join_iterator : public iterator< |
| |
35 | input_iterator_tag,typename IT::value_type, |
| |
36 | void,typename IT::pointer,typename IT::reference> { |
| |
37 | public: |
| |
38 | typedef pair<IT,IT> range_t; |
| |
39 | typedef list<range_t> ranges_t; |
| |
40 | ranges_t ranges; |
| |
41 | |
| |
42 | join_iterator() { } |
| |
43 | |
| |
44 | bool cleanup() { |
| |
45 | bool rv = false; |
| |
46 | while(!(ranges.empty() || ranges.front().first!=ranges.front().second)) { |
| |
47 | ranges.pop_front(); rv = true; |
| |
48 | } |
| |
49 | return rv; |
| |
50 | } |
| |
51 | |
| |
52 | join_iterator<IT>& add_range(const IT& b,const IT& e) { |
| |
53 | ranges.push_back(typename ranges_t::value_type(b,e)); |
| |
54 | cleanup(); |
| |
55 | return *this; |
| |
56 | } |
| |
57 | |
| |
58 | bool operator==(const join_iterator<IT>& x) const { |
| |
59 | return ranges==x.ranges; } |
| |
60 | bool operator!=(const join_iterator<IT>& x) const { |
| |
61 | return ranges!=x.ranges; } |
| |
62 | |
| |
63 | typename IT::reference operator*() const { |
| |
64 | assert(!ranges.empty()); |
| |
65 | assert(ranges.front().first!=ranges.front().second); |
| |
66 | return *ranges.front().first; } |
| |
67 | typename IT::pointer operator->() const { |
| |
68 | assert(!ranges.empty()); |
| |
69 | assert(ranges.front().first!=ranges.front().second); |
| |
70 | return ranges.front().first.operator->(); } |
| |
71 | |
| |
72 | join_iterator<IT>& operator++() { |
| |
73 | cleanup(); |
| |
74 | if(ranges.empty()) return *this; |
| |
75 | do { |
| |
76 | ++ranges.front().first; |
| |
77 | }while(cleanup() && !ranges.empty()); |
| |
78 | return *this; |
| |
79 | } |
| |
80 | join_iterator<IT> operator++(int) { |
| |
81 | join_iterator<IT> rv(*this); |
| |
82 | ++(*this); return rv; } |
| |
83 | }; |
| |
84 | |
| |
85 | template<typename IT> |
| |
86 | class cut_prefix_filterator : public opkele::util::basic_filterator<IT> { |
| |
87 | public: |
| |
88 | string pfx; |
| |
89 | mutable string tmp; |
| |
90 | |
| |
91 | cut_prefix_filterator() { } |
| |
92 | cut_prefix_filterator(const IT& bi,const IT&ei,const string& pfx) |
| |
93 | : opkele::util::basic_filterator<IT>(bi,ei), pfx(pfx) { |
| |
94 | this->prepare(); |
| |
95 | } |
| |
96 | |
| |
97 | bool is_interesting() const { |
| |
98 | return pfx.length()==0 || !strncmp(this->it->c_str(),pfx.c_str(),pfx.length()); |
| |
99 | } |
| |
100 | |
| |
101 | typename IT::reference operator*() const { |
| |
102 | assert(!this->empty); |
| |
103 | tmp = *this->it; tmp.erase(0,pfx.length()); |
| |
104 | return tmp; } |
| |
105 | typename IT::pointer operator->() const { |
| |
106 | assert(!this->empty); |
| |
107 | return &this->operator*(); } |
| |
108 | }; |
| |
109 | |
| |
110 | class kingate_openid_message_t : public opkele::basic_openid_message { |
| |
111 | typedef join_iterator<kingate::cgi_gateway::params_t::const_iterator> jitterator; |
| |
112 | typedef opkele::util::map_keys_iterator< |
| |
113 | jitterator, |
| |
114 | fields_iterator::value_type, |
| |
115 | fields_iterator::reference, |
| |
116 | fields_iterator::pointer> keys_iterator; |
| |
117 | typedef cut_prefix_filterator<keys_iterator> pfilterator; |
| |
118 | public: |
| |
119 | const kingate::cgi_gateway& gw; |
| |
120 | |
| |
121 | kingate_openid_message_t(const kingate::cgi_gateway& g) : gw(g) { } |
| |
122 | |
| |
123 | bool has_field(const string& n) const { |
| |
124 | return gw.has_param("openid."+n); } |
| |
125 | const string& get_field(const string& n) const { |
| |
126 | return gw.get_param("openid."+n); } |
| |
127 | |
| |
128 | fields_iterator fields_begin() const { |
| |
129 | return |
| |
130 | pfilterator( keys_iterator( |
| |
131 | jitterator() |
| |
132 | .add_range( gw.get.begin(), gw.get.end() ) |
| |
133 | .add_range( gw.post.begin(), gw.post.end() ), |
| |
134 | jitterator() |
| |
135 | ), keys_iterator(), "openid." ); |
| |
136 | } |
| |
137 | fields_iterator fields_end() const { |
| |
138 | return pfilterator(); |
| |
139 | } |
| |
140 | }; |
| |
141 | |
| |
142 | class rpdb_t : public sqlite3_t { |
34 | class rpdb_t : public sqlite3_t { |
143 | public: |
35 | public: |
144 | rpdb_t() |
36 | rpdb_t() |
|