dencode_url($url); $has_http = preg_match ('#^http\://#', $claimed) === 1; $claim_normalized = ($has_http? '':'http://') . $claimed; $has_slash = preg_match ('#^http\://[^/]*/.*$#', $claim_normalized) === 1; if( ! $has_slash ) { $claim_normalized.='/'; syslog(LOG_NOTICE, " - Added trailing slash /"); } return $claim_normalized; } function dencode_url($url) { $entities = array( '&' => '&', '"' => '"', '<' => '<', '>' => '>' ); $noentities = strtr( $url, $entities ); $encoded = ereg_replace('&#x([[:alnum:]]{2,4});', '%\1', $noentities); $decode = urldecode($encoded); return $decode; } function HTTP_OpenID_Client($self, $mode = '') { global $_GET, $_SERVER; $this->self=$self; syslog(LOG_NOTICE, "self = $this->self"); if($mode=='') { $this->mode = $_GET['openid_mode']; } else { $this->mode = $mode; } syslog(LOG_NOTICE, "mode = $this->mode"); $this->is_valid = false; switch ($this->mode) { case 'cancel': @session_destroy(); case 'id_res': // Pass 2 if( isset($_GET['openid_user_setup_url'])) { // Redirect To Authenticate At Server syslog(LOG_NOTICE, " Redirect to Authenticate on server"); HTTP::redirect($_GET['openid_user_setup_url']); } else { // "User Valid" Assertation syslog(LOG_NOTICE, "2: Valid assertation"); if(!$_SESSION['openid_server']) { echo "No OpenID server in session!"; syslog(LOG_NOTICE, " No OpenID server in session!"); return false; } $validate = new HTTP_Request(); $validate->setURL( $_SESSION['openid_server'] ); $validate->setMethod('POST'); $validate->addPostData('openid.mode', 'check_authentication'); $validate->addPostData('openid.identity', $_SESSION['openid_delegate']); $validate->addPostData('openid.assoc_handle', $_GET['openid_assoc_handle']); $validate->addPostData('openid.issued', $_GET['openid_issued']); $validate->addPostData('openid.valid_to', $_GET['openid_valid_to']); $validate->addPostData('openid.return_to', $_GET['openid_return_to']); $validate->addPostData('openid.signed', $_GET['openid_signed']); $validate->addPostData('openid.sig', $_GET['openid_sig']); $validate->addPostData('openid.invalidate_handle', ''); syslog(LOG_NOTICE, "sending POST sig validation request to [ " . $validate->_url->url . " ]"); $validate->sendRequest(); syslog(LOG_NOTICE, " POST sig validation HTTP code [ " .$validate->getResponseCode(). " ]"); $o=$this->explode_keyvalue($validate->getResponseBody()); syslog(LOG_NOTICE, " OpenID authentication " . ($o['is_valid']==='true'? 'Succeeded':'Failed') . " for " . $_SESSION['openid_delegate'] ); if($o['is_valid']==='true') $this->is_valid=true; return true; } return false; default: // Pass 1, no OpenID.Mode syslog(LOG_NOTICE, "__ BEGIN OPENID AUTHENTICATION __"); session_start(); // Normalize Identity Url $claimed = strtolower( $this->fixslashes( $_GET['openid_url'])); syslog(LOG_NOTICE, "original claim [ $claimed ]"); $claim_normalized = $this->normalize_url( $claimed ); syslog(LOG_NOTICE, "normalized claim [ $claim_normalized ]"); // Fetch Identity Page $identity_page = new HTTP_Client; $identity_page->setMaxRedirects(5); $identity_page->get( $claim_normalized ); if( isset($identity_page->_responses[0]['headers']['location'])) { $claim_normalized=$identity_page->_responses[0]['headers']['location']; syslog(LOG_NOTICE, " - redirected to $claim_normalized"); } $identity_page_response = $identity_page->currentResponse(); syslog(LOG_NOTICE, "identity page request returned code [ ".$identity_page_response['code']." ]"); $link_rel_tag = array(); $link_rel = array(); $link_rel['delegate'] = $claim_normalized; $identity_page_lines = explode("\n",$identity_page_response['body']); $a=0; foreach( $identity_page_lines as $c ) { if( preg_match('#< \s* body #ix',$c) ) break; if( preg_match('#]+)"\s* [/]?>#ix',$c,$link_rel_tag )) $link_rel['server'] =$link_rel_tag[1]; if( preg_match('#]+)"\s* [/]?>#ix', $c, $link_rel_tag)) $link_rel['delegate']=$link_rel_tag[1]; $a++; } syslog(LOG_NOTICE, "Actively parsed $a lines of html"); if( $link_rel['server'] == '' ) { header('HTTP/1.1 400 Bad Request'); $this->error = "Failed to find server url in <link rel=... tag"; syslog(LOG_NOTICE, "Failed to find server url in dencode_url($link_rel['server']); $link_rel['delegate'] =$this->dencode_url($link_rel['delegate']); syslog(LOG_NOTICE, "server url [ ${link_rel['server']} ]"); syslog(LOG_NOTICE, "delegation [ ${link_rel['delegate']} ]"); $_SESSION['openid_server'] =$link_rel['server']; $_SESSION['openid_delegate'] =$link_rel['delegate']; $_SESSION['claimed_url'] =$claim_normalized; /* $associate = new HTTP_Request($link_rel['server']); $associate->setMethod('POST'); $associate->addPostData('openid.mode', 'associate'); $associate->addPostData('openid.assoc_type', 'HMAC-SHA1'); $associate->addPostData('openid.session_type', ''); // ClearText $associate->addPostData('openid.dh_modulus', ''); // These only used for Diffie-Hellman $associate->addPostData('openid.dh_gen', ''); $assocaite->addPostData('openid.dh_customer_public', ''); $associate->sendRequest(); syslog(LOG_NOTICE, " -Associate POST HTTP code [ " .$validate->getResponseCode. ' ]'); $associate_ret=explode_keyvalue($validate->getResponseBody()); $_SESSION['openid_assoc_type'] = $associate_ret['assoc_type']; $_SESSION['openid_assoc_handle']= $associate_ref['assoc_handle']; */ $redir = new HTTP_Request(); $chunks = parse_url($link_rel['server']); $redir->setURL( $chunks['scheme'].'://'.$chunks['host'].$chunks['path'] ); $redir->addRawQueryString( $chunks['query'] ); $redir->addQueryString( 'openid.mode', 'checkid_setup' ); $redir->addQueryString( 'openid.identity', $link_rel['delegate'] ); $redir->addQueryString( 'openid.return_to', $this->self); $redir->addQueryString( 'openid.trust_root', 'http://verselogic.net/' ); $redir_url=''; foreach( $redir->_url->querystring as $key=>$value ) $redir_url.=($redir_url? '&':'') . $key.'='.$value; $redir_url = $redir->_url->url . '?' . $redir_url; syslog(LOG_NOTICE, "redirect UA to [ $redir_url ]"); HTTP::redirect($redir_url); } } } ?>