OpenId.class.php
gehe zur Dokumentation dieser Datei00001 <?php
00002
00003
00008 class OpenId
00009 {
00015 var $server;
00016
00017
00023 var $info;
00024
00030 var $identity;
00031
00037 var $error;
00038
00044 var $user;
00045
00046
00053 function OpenId( $user='' )
00054 {
00055 $this->user = $user;
00056 }
00057
00058
00064 function serverOk()
00065 {
00066 global $conf;
00067 $servers = $conf['security']['openid']['trusted_server'];
00068
00069 if ( empty($servers) )
00070 {
00071 return true;
00072 }
00073 else
00074 {
00075 $serverList = explode(',',$servers);
00076
00077 $http = new Http($this->server);
00078 if ( !in_array($http->url['host'],$serverList) )
00079 {
00080 $this->error = 'Server '.$this->server.' is not trusted';
00081 return false;
00082 }
00083 else
00084 return true;
00085 }
00086
00087 }
00088
00089
00090
00097 function login()
00098 {
00099
00100 $this->getIdentityFromYadis();
00101
00102
00103 if ( empty($this->server) )
00104 {
00105 $this->getIdentityFromHtmlMetaData();
00106 }
00107
00108
00109 if ( empty($this->server) )
00110 {
00111 if ( empty($this->error) )
00112 $this->error = 'Unable to locate OpenId-Server in URL';
00113 return false;
00114 }
00115
00116 if ( !$this->serverOk() )
00117 return false;
00118
00119 if ( empty($this->identity) )
00120
00121
00122 $this->identity = 'http://'.$this->user;
00123
00124 return true;
00125 }
00126
00127
00128
00132 function redirect()
00133 {
00134 global $conf;
00135
00136 $openid_handle = md5(microtime().session_id());
00137 Session::set('openid_user' ,$this->user );
00138 Session::set('openid_server' ,$this->server );
00139 Session::set('openid_identity',$this->identity );
00140 Session::set('openid_handle' ,$openid_handle );
00141
00142 $redirHttp = new Http($this->server);
00143 $redirHttp->requestParameter['openid.mode' ] = 'checkid_setup';
00144 $redirHttp->requestParameter['openid.identity' ] = $this->identity;
00145
00146
00147 $redirHttp->requestParameter['openid.sreg.required'] = 'email';
00148 $redirHttp->requestParameter['openid.sreg.optional'] = 'fullname,language';
00149
00150 $trustRoot = @$conf['security']['openid']['trust_root'];
00151 $server = Http::getServer();
00152 if ( empty($trustRoot) )
00153 $trustRoot = $server;
00154
00155 $redirHttp->requestParameter['openid.trust_root' ] = slashify($trustRoot);
00156 $redirHttp->requestParameter['openid.return_to' ] = slashify($server).'openid.'.PHP_EXT;
00157 $redirHttp->requestParameter['openid.assoc_handle' ] = $openid_handle;
00158
00159 $redirHttp->sendRedirect();
00160 exit;
00161 }
00162
00163
00164
00170 function getIdentityFromYadis()
00171 {
00172 $http = new Http($this->user);
00173
00174
00175 $http->header[] = 'Accept: application/xrds+xml';
00176 if ( ! $http->request() )
00177 {
00178 $this->error = 'Unable to get XML delegate information';
00179 return false;
00180 }
00181
00182
00183 $p = xml_parser_create();
00184 $ok = xml_parse_into_struct($p, $http->body, $vals, $index);
00185 xml_parser_free($p);
00186
00187 foreach( $vals as $tag )
00188 {
00189 if ( strtolower($tag['tag']) == 'uri' )
00190 {
00191 $this->server = $tag['value'];
00192 }
00193
00194 if ( strtolower($tag['tag']) == 'openid:delegate' )
00195 {
00196 $this->identity = $tag['value'];
00197 }
00198 }
00199 }
00200
00201
00202
00206 function getIdentityFromHtmlMetaData()
00207 {
00208 $http = new Http($this->user);
00209
00210
00211 $http->header[] = 'Accept: text/html';
00212
00213 if ( ! $http->request() )
00214 {
00215 $this->error = 'Unable to get HTML delegate information';
00216 return false;
00217 }
00218
00219 $seite = $http->body;
00220
00221
00222 $treffer = array();
00223 preg_match('/rel="openid.server"\s+href="(\S+)"/',$seite,$treffer);
00224 if ( count($treffer) >= 1 )
00225 $this->server = $treffer[1];
00226
00227 $treffer = array();
00228 preg_match('/rel="openid.delegate"\s+href="(\S+)"/',$seite,$treffer);
00229 if ( count($treffer) >= 1 )
00230 $this->identity = $treffer[1];
00231 }
00232
00233
00239 function getUserFromIdentiy()
00240 {
00241 $http = new Http($this->identity);
00242 return $http->url['host'];
00243 }
00244
00245
00257 function checkAuthentication()
00258 {
00259 global $REQ,
00260 $conf;
00261
00262 $this->user = Session::get('openid_user' );
00263 $this->server = Session::get('openid_server' );
00264 $this->identity = Session::get('openid_identity');
00265 $openid_handle = Session::get('openid_handle' );
00266
00267 if ( $REQ['openid_invalidate_handle'] != $openid_handle )
00268 {
00269 $this->error = 'Association-Handle mismatch.';
00270 return false;
00271 }
00272
00273 if ( $REQ['openid_identity'] != $this->identity )
00274 {
00275 $this->error ='Open-Id: Identity mismatch. Wrong identity:'.$REQ['openid_identity'];
00276 return false;
00277 }
00278
00279
00280 $params = array();
00281
00282 foreach( $REQ as $request_key=>$request_value )
00283 {
00284 if ( substr($request_key,0,12)=='openid_sreg_' )
00285 {
00286 $params['openid.sreg.'.substr($request_key,12) ] = $request_value;
00287 $this->info[ substr($request_key,12) ] = $request_value;
00288 }
00289 elseif ( substr($request_key,0,7)=='openid_' )
00290 $params['openid.'.substr($request_key,7) ] = $request_value;
00291 }
00292 $params['openid.mode'] = 'check_authentication';
00293
00294 $checkRequest = new Http($this->server);
00295
00296 $checkRequest->method = 'POST';
00297 $checkRequest->requestParameter = $params;
00298
00299 if ( ! $checkRequest->request() )
00300 {
00301
00302 $this->error = $checkRequest->error;
00303 return false;
00304 }
00305
00306
00307
00308
00309 $valid = null;
00310 foreach( explode("\n",$checkRequest->body) as $line )
00311 {
00312 $pair = explode(':',trim($line));
00313 if (count($pair)==2 && strtolower($pair[0])=='is_valid')
00314 $valid = (strtolower($pair[1])=='true');
00315 }
00316
00317 if ( is_null($valid) )
00318 {
00319
00320 $this->error = 'Undefined Open-Id response: '.$response;
00321 return false;
00322 }
00323 elseif ( $valid )
00324 {
00325
00326 return true;
00327 }
00328 else
00329 {
00330
00331 $this->error = 'Server refused login.';
00332 return false;
00333 }
00334 }
00335 }
00336
00337 ?>