summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--include/opkele/discovery.h3
-rw-r--r--include/opkele/prequeue_rp.h8
-rw-r--r--include/opkele/types.h3
-rw-r--r--lib/prequeue_rp.cc9
4 files changed, 19 insertions, 4 deletions
diff --git a/include/opkele/discovery.h b/include/opkele/discovery.h
index 4471597..f2721a6 100644
--- a/include/opkele/discovery.h
+++ b/include/opkele/discovery.h
@@ -56,60 +56,59 @@ namespace opkele {
56 uris.clear(); local_ids.clear(); 56 uris.clear(); local_ids.clear();
57 provider_id.clear(); 57 provider_id.clear();
58 } 58 }
59 }; 59 };
60 typedef priority_map<service_t> services_t; 60 typedef priority_map<service_t> services_t;
61 61
62 class XRD_t { 62 class XRD_t {
63 public: 63 public:
64 time_t expires; 64 time_t expires;
65 65
66 canonical_ids_t canonical_ids; 66 canonical_ids_t canonical_ids;
67 local_ids_t local_ids; 67 local_ids_t local_ids;
68 services_t services; 68 services_t services;
69 string provider_id; 69 string provider_id;
70 70
71 void clear() { 71 void clear() {
72 expires = 0; 72 expires = 0;
73 canonical_ids.clear(); local_ids.clear(); 73 canonical_ids.clear(); local_ids.clear();
74 services.clear(); 74 services.clear();
75 provider_id.clear(); 75 provider_id.clear();
76 } 76 }
77 bool empty() const { 77 bool empty() const {
78 return 78 return
79 canonical_ids.empty() 79 canonical_ids.empty()
80 && local_ids.empty() 80 && local_ids.empty()
81 && services.empty(); 81 && services.empty();
82 } 82 }
83 83
84 }; 84 };
85 85
86 } 86 }
87 87
88 typedef util::output_iterator_proxy<openid_endpoint_t> 88 typedef openid_endpoint_output_iterator endpoint_discovery_iterator;
89 endpoint_discovery_iterator;
90 89
91 string idiscover( 90 string idiscover(
92 endpoint_discovery_iterator oi, 91 endpoint_discovery_iterator oi,
93 const string& identity); 92 const string& identity);
94 void yadiscover( 93 void yadiscover(
95 endpoint_discovery_iterator oi, 94 endpoint_discovery_iterator oi,
96 const string& yurl, 95 const string& yurl,
97 const char **types, bool redirs=false); 96 const char **types, bool redirs=false);
98 97
99 struct idiscovery_t { 98 struct idiscovery_t {
100 bool xri_identity; 99 bool xri_identity;
101 string normalized_id; 100 string normalized_id;
102 string canonicalized_id; 101 string canonicalized_id;
103 xrd::XRD_t xrd; 102 xrd::XRD_t xrd;
104 103
105 idiscovery_t() { } 104 idiscovery_t() { }
106 105
107 void clear() { 106 void clear() {
108 normalized_id.clear(); canonicalized_id.clear(); 107 normalized_id.clear(); canonicalized_id.clear();
109 xrd.clear(); 108 xrd.clear();
110 } 109 }
111 110
112 }; 111 };
113} 112}
114 113
115#endif /* __OPKELE_DISCOVERY_H */ 114#endif /* __OPKELE_DISCOVERY_H */
diff --git a/include/opkele/prequeue_rp.h b/include/opkele/prequeue_rp.h
index 68fe03d..6f1fda9 100644
--- a/include/opkele/prequeue_rp.h
+++ b/include/opkele/prequeue_rp.h
@@ -52,37 +52,45 @@ namespace opkele {
52 * doesn't have to care. 52 * doesn't have to care.
53 * @param nid normalized id 53 * @param nid normalized id
54 * @see get_normalzied_id() 54 * @see get_normalzied_id()
55 */ 55 */
56 virtual void set_normalized_id(const string& nid); 56 virtual void set_normalized_id(const string& nid);
57 /** 57 /**
58 * Return the normalized id previously set by set_normalized_id(). 58 * Return the normalized id previously set by set_normalized_id().
59 * Provided for the sake of completeness because default 59 * Provided for the sake of completeness because default
60 * implementation doesn't use it. 60 * implementation doesn't use it.
61 * @return the normalized identity 61 * @return the normalized identity
62 */ 62 */
63 virtual const string get_normalized_id() const; 63 virtual const string get_normalized_id() const;
64 /** 64 /**
65 * @} 65 * @}
66 */ 66 */
67 67
68 /** 68 /**
69 * @name Actions 69 * @name Actions
70 * @{ 70 * @{
71 */ 71 */
72 /** 72 /**
73 * In addition to base class implementation it does endpoints 73 * In addition to base class implementation it does endpoints
74 * discovery and queueing 74 * discovery and queueing
75 * @param usi User-suppled identifier 75 * @param usi User-suppled identifier
76 */ 76 */
77 void initiate(const string& usi); 77 void initiate(const string& usi);
78 /** 78 /**
79 * @} 79 * @}
80 */ 80 */
81 81
82 void verify_OP(const string& OP, 82 void verify_OP(const string& OP,
83 const string& claimed_id,const string& identity) const; 83 const string& claimed_id,const string& identity) const;
84
85 /**
86 * Perform full discovery on identity
87 * @param it iterator used for feeding discovered endpoints back to caller
88 * @param id user supplied identity
89 * @returns normalized identity (canonical identifier can be found in endpoints)
90 */
91 virtual const string discover(openid_endpoint_output_iterator it,const string& id) const;
84 }; 92 };
85 93
86} 94}
87 95
88#endif /* __OPKELE_RP_H */ 96#endif /* __OPKELE_RP_H */
diff --git a/include/opkele/types.h b/include/opkele/types.h
index 1f48362..1fab869 100644
--- a/include/opkele/types.h
+++ b/include/opkele/types.h
@@ -196,35 +196,38 @@ namespace opkele {
196 */ 196 */
197 const string& get_param(const string& n) const { 197 const string& get_param(const string& n) const {
198 return get_field(n); } 198 return get_field(n); }
199 199
200 /** 200 /**
201 * parse the OpenID key/value data. 201 * parse the OpenID key/value data.
202 * @param kv the OpenID key/value data 202 * @param kv the OpenID key/value data
203 */ 203 */
204 void parse_keyvalues(const string& kv) { 204 void parse_keyvalues(const string& kv) {
205 from_keyvalues(kv); } 205 from_keyvalues(kv); }
206 206
207 string append_query(const string& url,const char *prefix="openid.") const; 207 string append_query(const string& url,const char *prefix="openid.") const;
208 208
209 }; 209 };
210 210
211 struct openid_endpoint_t { 211 struct openid_endpoint_t {
212 string uri; 212 string uri;
213 string claimed_id; 213 string claimed_id;
214 string local_id; 214 string local_id;
215 215
216 openid_endpoint_t() { } 216 openid_endpoint_t() { }
217 openid_endpoint_t(const string& u,const string& cid,const string& lid) 217 openid_endpoint_t(const string& u,const string& cid,const string& lid)
218 : uri(u), claimed_id(cid), local_id(lid) { } 218 : uri(u), claimed_id(cid), local_id(lid) { }
219 219
220 bool operator==(const openid_endpoint_t& x) const { 220 bool operator==(const openid_endpoint_t& x) const {
221 return uri==x.uri && local_id==x.local_id; } 221 return uri==x.uri && local_id==x.local_id; }
222 bool operator<(const openid_endpoint_t& x) const { 222 bool operator<(const openid_endpoint_t& x) const {
223 int c; 223 int c;
224 return (c=strcmp(uri.c_str(),x.uri.c_str())) 224 return (c=strcmp(uri.c_str(),x.uri.c_str()))
225 ? (c<0) : (strcmp(local_id.c_str(),x.local_id.c_str())<0); } 225 ? (c<0) : (strcmp(local_id.c_str(),x.local_id.c_str())<0); }
226 }; 226 };
227 227
228 typedef util::output_iterator_proxy<openid_endpoint_t>
229 openid_endpoint_output_iterator;
230
228} 231}
229 232
230#endif /* __OPKELE_TYPES_H */ 233#endif /* __OPKELE_TYPES_H */
diff --git a/lib/prequeue_rp.cc b/lib/prequeue_rp.cc
index 3aa960f..ed1ddfe 100644
--- a/lib/prequeue_rp.cc
+++ b/lib/prequeue_rp.cc
@@ -15,67 +15,72 @@ namespace opkele {
15 class __OP_verifier_good_input : public exception { 15 class __OP_verifier_good_input : public exception {
16 public: 16 public:
17 __OP_verifier_good_input(OPKELE_E_PARS) 17 __OP_verifier_good_input(OPKELE_E_PARS)
18 : exception(OPKELE_E_CONS) { } 18 : exception(OPKELE_E_CONS) { }
19 }; 19 };
20 20
21 class OP_verifier : public iterator<output_iterator_tag,openid_endpoint_t,void> { 21 class OP_verifier : public iterator<output_iterator_tag,openid_endpoint_t,void> {
22 public: 22 public:
23 const string& OP; 23 const string& OP;
24 const string& id; 24 const string& id;
25 25
26 OP_verifier(const string& o,const string& i) 26 OP_verifier(const string& o,const string& i)
27 : OP(o), id(i) { } 27 : OP(o), id(i) { }
28 28
29 OP_verifier& operator*() { return *this; } 29 OP_verifier& operator*() { return *this; }
30 OP_verifier& operator=(const openid_endpoint_t& oep) { 30 OP_verifier& operator=(const openid_endpoint_t& oep) {
31 if(oep.uri==OP) { 31 if(oep.uri==OP) {
32 if(oep.claimed_id==IDURI_SELECT20 32 if(oep.claimed_id==IDURI_SELECT20
33 || oep.local_id==IDURI_SELECT20 ) 33 || oep.local_id==IDURI_SELECT20 )
34 throw bad_input(OPKELE_CP_ "claimed_id is an OP-Id"); 34 throw bad_input(OPKELE_CP_ "claimed_id is an OP-Id");
35 if(oep.local_id==id) 35 if(oep.local_id==id)
36 throw __OP_verifier_good_input(OPKELE_CP_ "Found corresponding endpoint"); 36 throw __OP_verifier_good_input(OPKELE_CP_ "Found corresponding endpoint");
37 } 37 }
38 return *this; 38 return *this;
39 } 39 }
40 40
41 OP_verifier& operator++() { return *this; } 41 OP_verifier& operator++() { return *this; }
42 OP_verifier& operator++(int) { return *this; } 42 OP_verifier& operator++(int) { return *this; }
43 }; 43 };
44 44
45 void prequeue_RP::verify_OP(const string& OP,const string& claimed_id,const string& identity) const { 45 void prequeue_RP::verify_OP(const string& OP,const string& claimed_id,const string& identity) const {
46 try { 46 try {
47 idiscover(OP_verifier(OP,identity),claimed_id); 47 discover(OP_verifier(OP,identity),claimed_id);
48 throw id_res_unauthorized(OPKELE_CP_ 48 throw id_res_unauthorized(OPKELE_CP_
49 "OP is not authorized to make an assertion regarding the identity"); 49 "OP is not authorized to make an assertion regarding the identity");
50 }catch(__OP_verifier_good_input& ovgi) { 50 }catch(__OP_verifier_good_input& ovgi) {
51 } 51 }
52 } 52 }
53 53
54 class endpoint_queuer : public iterator<output_iterator_tag,openid_endpoint_t,void> { 54 class endpoint_queuer : public iterator<output_iterator_tag,openid_endpoint_t,void> {
55 public: 55 public:
56 prequeue_RP& rp; 56 prequeue_RP& rp;
57 57
58 endpoint_queuer(prequeue_RP& r) : rp(r) { } 58 endpoint_queuer(prequeue_RP& r) : rp(r) { }
59 59
60 endpoint_queuer& operator*() { return *this; } 60 endpoint_queuer& operator*() { return *this; }
61 endpoint_queuer& operator=(const openid_endpoint_t& oep) { 61 endpoint_queuer& operator=(const openid_endpoint_t& oep) {
62 rp.queue_endpoint(oep); return *this; } 62 rp.queue_endpoint(oep); return *this; }
63 63
64 endpoint_queuer& operator++() { return *this; } 64 endpoint_queuer& operator++() { return *this; }
65 endpoint_queuer& operator++(int) { return *this; } 65 endpoint_queuer& operator++(int) { return *this; }
66 }; 66 };
67 67
68 void prequeue_RP::initiate(const string& usi) { 68 void prequeue_RP::initiate(const string& usi) {
69 begin_queueing(); 69 begin_queueing();
70 set_normalized_id( idiscover(endpoint_queuer(*this),usi) ); 70 set_normalized_id( discover(endpoint_queuer(*this),usi) );
71 end_queueing(); 71 end_queueing();
72 } 72 }
73 73
74 void prequeue_RP::set_normalized_id(const string&) { 74 void prequeue_RP::set_normalized_id(const string&) {
75 } 75 }
76 76
77 const string prequeue_RP::get_normalized_id() const { 77 const string prequeue_RP::get_normalized_id() const {
78 throw not_implemented(OPKELE_CP_ "get_normalized_id() is not implemented"); 78 throw not_implemented(OPKELE_CP_ "get_normalized_id() is not implemented");
79 } 79 }
80 80
81 const string prequeue_RP::discover(openid_endpoint_output_iterator it,
82 const string& id) const {
83 return idiscover(it,id);
84 }
85
81} 86}