summaryrefslogtreecommitdiffabout
Unidiff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--lib/consumer.cc8
1 files changed, 4 insertions, 4 deletions
diff --git a/lib/consumer.cc b/lib/consumer.cc
index 299b3bc..ff5da91 100644
--- a/lib/consumer.cc
+++ b/lib/consumer.cc
@@ -242,100 +242,100 @@ namespace opkele {
242 throw exception_curl(OPKELE_CP_ "failed to curl_easy_init()"); 242 throw exception_curl(OPKELE_CP_ "failed to curl_easy_init()");
243 string response; 243 string response;
244 CURLcode r; 244 CURLcode r;
245 (r=curl_misc_sets(curl)) 245 (r=curl_misc_sets(curl))
246 || (r=curl_easy_setopt(curl,CURLOPT_URL,server.c_str())) 246 || (r=curl_easy_setopt(curl,CURLOPT_URL,server.c_str()))
247 || (r=curl_easy_setopt(curl,CURLOPT_POST,1)) 247 || (r=curl_easy_setopt(curl,CURLOPT_POST,1))
248 || (r=curl_easy_setopt(curl,CURLOPT_POSTFIELDS,request.data())) 248 || (r=curl_easy_setopt(curl,CURLOPT_POSTFIELDS,request.data()))
249 || (r=curl_easy_setopt(curl,CURLOPT_POSTFIELDSIZE,request.length())) 249 || (r=curl_easy_setopt(curl,CURLOPT_POSTFIELDSIZE,request.length()))
250 || (r=curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,_curl_tostring)) 250 || (r=curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,_curl_tostring))
251 || (r=curl_easy_setopt(curl,CURLOPT_WRITEDATA,&response)) 251 || (r=curl_easy_setopt(curl,CURLOPT_WRITEDATA,&response))
252 ; 252 ;
253 if(r) 253 if(r)
254 throw exception_curl(OPKELE_CP_ "failed to curl_easy_setopt()",r); 254 throw exception_curl(OPKELE_CP_ "failed to curl_easy_setopt()",r);
255 if(r=curl_easy_perform(curl)) 255 if(r=curl_easy_perform(curl))
256 throw exception_curl(OPKELE_CP_ "failed to curl_easy_perform()",r); 256 throw exception_curl(OPKELE_CP_ "failed to curl_easy_perform()",r);
257 params_t pp; pp.parse_keyvalues(response); 257 params_t pp; pp.parse_keyvalues(response);
258 if(pp.has_param("invalidate_handle")) 258 if(pp.has_param("invalidate_handle"))
259 invalidate_assoc(server,pp.get_param("invalidate_handle")); 259 invalidate_assoc(server,pp.get_param("invalidate_handle"));
260 if(pp.has_param("is_valid")) { 260 if(pp.has_param("is_valid")) {
261 if(pp.get_param("is_valid")=="true") 261 if(pp.get_param("is_valid")=="true")
262 return; 262 return;
263 }else if(pp.has_param("lifetime")) { 263 }else if(pp.has_param("lifetime")) {
264 if(util::string_to_long(pp.get_param("lifetime"))) 264 if(util::string_to_long(pp.get_param("lifetime")))
265 return; 265 return;
266 } 266 }
267 throw failed_check_authentication(OPKELE_CP_ "failed to verify response"); 267 throw failed_check_authentication(OPKELE_CP_ "failed to verify response");
268 } 268 }
269 269
270 void consumer_t::retrieve_links(const string& url,string& server,string& delegate) { 270 void consumer_t::retrieve_links(const string& url,string& server,string& delegate) {
271#if defined(USE_LIBPCRECPP) || defined(USE_PCREPP) 271#if defined(USE_LIBPCRECPP) || defined(USE_PCREPP)
272 server.erase(); 272 server.erase();
273 delegate.erase(); 273 delegate.erase();
274 curl_t curl = curl_easy_init(); 274 curl_t curl = curl_easy_init();
275 if(!curl) 275 if(!curl)
276 throw exception_curl(OPKELE_CP_ "failed to curl_easy_init()"); 276 throw exception_curl(OPKELE_CP_ "failed to curl_easy_init()");
277 string html; 277 string html;
278 CURLcode r; 278 CURLcode r;
279 (r=curl_misc_sets(curl)) 279 (r=curl_misc_sets(curl))
280 || (r=curl_easy_setopt(curl,CURLOPT_URL,url.c_str())) 280 || (r=curl_easy_setopt(curl,CURLOPT_URL,url.c_str()))
281 || (r=curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,_curl_tostring)) 281 || (r=curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,_curl_tostring))
282 || (r=curl_easy_setopt(curl,CURLOPT_WRITEDATA,&html)) 282 || (r=curl_easy_setopt(curl,CURLOPT_WRITEDATA,&html))
283 ; 283 ;
284 if(r) 284 if(r)
285 throw exception_curl(OPKELE_CP_ "failed to curl_easy_setopt()",r); 285 throw exception_curl(OPKELE_CP_ "failed to curl_easy_setopt()",r);
286 r = curl_easy_perform(curl); 286 r = curl_easy_perform(curl);
287 if(r && r!=CURLE_WRITE_ERROR) 287 if(r && r!=CURLE_WRITE_ERROR)
288 throw exception_curl(OPKELE_CP_ "failed to curl_easy_perform()",r); 288 throw exception_curl(OPKELE_CP_ "failed to curl_easy_perform()",r);
289 // strip out everything past body 289 // strip out everything past body
290 static const char *re_hdre = "<head[^>]*>", 290 static const char *re_hdre = "<\\s*head[^>]*>",
291 *re_lre = "<link\\b([^>]+)>", 291 *re_lre = "<\\s*link\\b([^>]+)>",
292 *re_rre = "\\brel=['\"]([^'\"]+)['\"]", 292 *re_rre = "\\brel\\s*=\\s*['\"]\\s*([^'\"\\s]+)\\s*['\"]",
293 *re_hre = "\\bhref=['\"]([^'\"]+)['\"]"; 293 *re_hre = "\\bhref\\s*=\\s*['\"]\\s*([^'\"\\s]+)\\s*['\"]";
294#if defined(USE_LIBPCRECPP) 294#if defined(USE_LIBPCRECPP)
295 static pcrecpp::RE_Options ro(PCRE_CASELESS|PCRE_DOTALL); 295 static pcrecpp::RE_Options ro(PCRE_CASELESS|PCRE_DOTALL);
296 static pcrecpp::RE 296 static pcrecpp::RE
297 bre("<body\\b.*",ro), hdre(re_hdre,ro), 297 bre("<body\\b.*",ro), hdre(re_hdre,ro),
298 lre(re_lre,ro), rre(re_rre), hre(re_hre,ro); 298 lre(re_lre,ro), rre(re_rre), hre(re_hre,ro);
299 bre.Replace("",&html); 299 bre.Replace("",&html);
300 pcrecpp::StringPiece hpiece(html); 300 pcrecpp::StringPiece hpiece(html);
301 if(!hdre.FindAndConsume(&hpiece)) 301 if(!hdre.FindAndConsume(&hpiece))
302 throw bad_input(OPKELE_CP_ "failed to find head"); 302 throw bad_input(OPKELE_CP_ "failed to find head");
303 string attrs; 303 string attrs;
304 while(lre.FindAndConsume(&hpiece,&attrs)) { 304 while(lre.FindAndConsume(&hpiece,&attrs)) {
305 pcrecpp::StringPiece rel, href; 305 pcrecpp::StringPiece rel, href;
306 if(!(rre.PartialMatch(attrs,&rel) && hre.PartialMatch(attrs,&href))) 306 if(!(rre.PartialMatch(attrs,&rel) && hre.PartialMatch(attrs,&href)))
307 continue; 307 continue;
308 if(rel=="openid.server") { 308 if(rel=="openid.server") {
309 href.CopyToString(&server); 309 href.CopyToString(&server);
310 if(!delegate.empty()) 310 if(!delegate.empty())
311 break; 311 break;
312 }else if(rel=="openid.delegate") { 312 }else if(rel=="openid.delegate") {
313 href.CopyToString(&delegate); 313 href.CopyToString(&delegate);
314 if(!server.empty()) 314 if(!server.empty())
315 break; 315 break;
316 } 316 }
317 } 317 }
318#elif defined(USE_PCREPP) 318#elif defined(USE_PCREPP)
319 pcrepp::Pcre bre("<body\\b",PCRE_CASELESS); 319 pcrepp::Pcre bre("<body\\b",PCRE_CASELESS);
320 if(bre.search(html)) 320 if(bre.search(html))
321 html.erase(bre.get_match_start()); 321 html.erase(bre.get_match_start());
322 pcrepp::Pcre hdre(re_hdre,PCRE_CASELESS); 322 pcrepp::Pcre hdre(re_hdre,PCRE_CASELESS);
323 if(!hdre.search(html)) 323 if(!hdre.search(html))
324 throw bad_input(OPKELE_CP_ "failed to find head"); 324 throw bad_input(OPKELE_CP_ "failed to find head");
325 html.erase(0,hdre.get_match_end()+1); 325 html.erase(0,hdre.get_match_end()+1);
326 pcrepp::Pcre lre(re_lre,PCRE_CASELESS), rre(re_rre,PCRE_CASELESS), hre(re_hre,PCRE_CASELESS); 326 pcrepp::Pcre lre(re_lre,PCRE_CASELESS), rre(re_rre,PCRE_CASELESS), hre(re_hre,PCRE_CASELESS);
327 while(lre.search(html)) { 327 while(lre.search(html)) {
328 string attrs = lre[0]; 328 string attrs = lre[0];
329 html.erase(0,lre.get_match_end()+1); 329 html.erase(0,lre.get_match_end()+1);
330 if(!(rre.search(attrs)&&hre.search(attrs))) 330 if(!(rre.search(attrs)&&hre.search(attrs)))
331 continue; 331 continue;
332 if(rre[0]=="openid.server") { 332 if(rre[0]=="openid.server") {
333 server = hre[0]; 333 server = hre[0];
334 if(!delegate.empty()) 334 if(!delegate.empty())
335 break; 335 break;
336 }else if(rre[0]=="openid.delegate") { 336 }else if(rre[0]=="openid.delegate") {
337 delegate = hre[0]; 337 delegate = hre[0];
338 if(!server.empty()) 338 if(!server.empty())
339 break; 339 break;
340 } 340 }
341 } 341 }