OpenId.class.php

gehe zur Dokumentation dieser Datei
00001 <?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           // Schritt 1: Identity aus Yadis-Dokument laden.
00100           $this->getIdentityFromYadis();
00101           
00102           // Schritt 2: Fallback auf HTML-Dokument.
00103           if   ( empty($this->server) )
00104           {
00105                $this->getIdentityFromHtmlMetaData();
00106           }
00107           
00108           // Falls immer noch kein Servername gefunden wurde, dann Abbruch.
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; // Server nicht vertrauenswürdig.
00118           
00119           if   ( empty($this->identity) )
00120                // Falls die Identity bis hierher nicht deligiert wurde...
00121                // Lt. Spezifikation mit Prefix "http://".
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           // Profilangaben anfordern. E-Mail wird benötigt, Name und Sprache sind optional.
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(); // Browser umleiten.
00160           exit;                       // Ende.
00161      }
00162      
00163      
00164      
00170      function getIdentityFromYadis()
00171      {
00172           $http = new Http($this->user);
00173 //        $http->url['host'] = $this->user;
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 //        Html::debug(htmlentities($http->body));
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 //        $http = new Http();
00210 //        $http->url['host'] = $this->user;
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           // Die Meta-Tags mit regulärem Ausdruck auslesen.
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'; // Spezifikation verlangt POST.
00297           $checkRequest->requestParameter = $params;
00298           
00299           if   ( ! $checkRequest->request() )
00300           {
00301                // Der HTTP-Request ging in die Hose.
00302                $this->error = $checkRequest->error;
00303                return false;
00304           }
00305 
00306           // Analyse der HTTP-Antwort, Parsen des BODYs.
00307           // Die Anmeldung ist bestätigt, wenn im BODY die Zeile "is_valid:true" vorhanden ist.
00308           // Siehe Spezifikation Kapitel 4.4.2
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                // Zeile nicht gefunden.
00320                $this->error = 'Undefined Open-Id response: '.$response;
00321                return false;
00322           }
00323           elseif    ( $valid )
00324           {
00325                // Anmeldung wurde mit "is_valid:true" bestätigt.
00326                return true;
00327           }
00328           else
00329           {
00330                // Bestätigung wurde durch den OpenId-Provider abgelehnt.
00331                $this->error = 'Server refused login.';
00332                return false;
00333           }
00334      }
00335 }
00336 
00337 ?>

Erzeugt am Thu May 14 00:55:49 2009 für OpenRat von  doxygen 1.5.8