/** * Starts the discovery process * * This method actually finds out which discovery method (XRI, Yadis of HTML) * should be used and delegates the actual discovery to the corresponding * _discovery* method * * @param string &$id OpenID identity URL * @param string &$server OpenID server URL * @param float &$version OpenID protocol version * @return bool */ protected function _discovery(&$id, &$server, &$version) { $realId = $id; if ($this->_storage->getDiscoveryInfo($id, $realId, $server, $version, $expire)) { $id = $realId; return true; } $xriChars = array('=', '@', '+', '$', '!', '('); if (in_array(substr($id, 0, 1), $xriChars)) { //It is an XRI $xrds = $this->_httpRequest("https://xri.net/" . $id, "GET", array('query' => '', '_xrd_r' => 'application/xrds+xml'), $status); if ($status != 200 || !is_string($response)) { return false; } $return = $this->_discoveryXrds($xrds, $realId, $server, $version); $version = 2.0; } elseif (!($return = $this->_discoveryYadis($id, $realId, $server, $version))) { //If Yadis discovery fails, then HTML discovery should be tried $return = $this->_discoveryHtml($id, $server, $version); } if ($return) { $expire = time() + 60 * 60; $this->_storage->addDiscoveryInfo($id, $realId, $server, $version, $expire); $id = $realId; return true; } else { return false; } }
/** * Performs discovery of identity and finds OpenID URL, OpenID server URL * and OpenID protocol version. Returns true on succees and false on * failure. * * @param string &$id OpenID identity URL * @param string &$server OpenID server URL * @param float &$version OpenID protocol version * @return bool * @todo OpenID 2.0 (7.3) XRI and Yadis discovery */ protected function _discovery(&$id, &$server, &$version) { $realId = $id; if ($this->_storage->getDiscoveryInfo($id, $realId, $server, $version, $expire)) { $id = $realId; return true; } $response = $this->_httpRequest($id, 'GET', array(), $status); if ($status != 200 || !is_string($response)) { return false; } /* OpenID 2.0 (7.3) XRI and Yadis discovery */ if (preg_match('/<meta[^>]*http-equiv=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?X-XRDS-Location[ \\t]*[^"\']*\\1[^>]*content=(["\'])([^"\']+)\\2[^>]*\\/?>/i', $response, $r)) { $XRDS = $r[3]; $version = 2.0; $response = $this->_httpRequest($XRDS); if (preg_match('/<URI>([^\\t]*)<\\/URI>/i', $response, $x)) { $server = $x[1]; // $realId $realId = 'http://specs.openid.net/auth/2.0/identifier_select'; } else { $this->_setError("Unable to get URI for XRDS discovery"); } } else { if (preg_match('/<link[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid2.provider[ \\t]*[^"\']*\\1[^>]*href=(["\'])([^"\']+)\\2[^>]*\\/?>/i', $response, $r)) { $version = 2.0; $server = $r[3]; } elseif (preg_match('/<link[^>]*href=(["\'])([^"\']+)\\1[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid2.provider[ \\t]*[^"\']*\\3[^>]*\\/?>/i', $response, $r)) { $version = 2.0; $server = $r[2]; } elseif (preg_match('/<link[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid.server[ \\t]*[^"\']*\\1[^>]*href=(["\'])([^"\']+)\\2[^>]*\\/?>/i', $response, $r)) { $version = 1.1; $server = $r[3]; } elseif (preg_match('/<link[^>]*href=(["\'])([^"\']+)\\1[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid.server[ \\t]*[^"\']*\\3[^>]*\\/?>/i', $response, $r)) { $version = 1.1; $server = $r[2]; } else { return false; } } if ($version >= 2.0) { if (preg_match('/<link[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid2.local_id[ \\t]*[^"\']*\\1[^>]*href=(["\'])([^"\']+)\\2[^>]*\\/?>/i', $response, $r)) { $realId = $r[3]; } elseif (preg_match('/<link[^>]*href=(["\'])([^"\']+)\\1[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid2.local_id[ \\t]*[^"\']*\\3[^>]*\\/?>/i', $response, $r)) { $realId = $r[2]; } } else { if (preg_match('/<link[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid.delegate[ \\t]*[^"\']*\\1[^>]*href=(["\'])([^"\']+)\\2[^>]*\\/?>/i', $response, $r)) { $realId = $r[3]; } elseif (preg_match('/<link[^>]*href=(["\'])([^"\']+)\\1[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid.delegate[ \\t]*[^"\']*\\3[^>]*\\/?>/i', $response, $r)) { $realId = $r[2]; } } $expire = time() + 60 * 60; $this->_storage->addDiscoveryInfo($id, $realId, $server, $version, $expire); $id = $realId; return true; }
/** * Performs discovery of identity and finds OpenID URL, OpenID server URL * and OpenID protocol version. Returns true on succees and false on * failure. * * @param string &$id OpenID identity URL * @param string &$server OpenID server URL * @param float &$version OpenID protocol version * @return bool * @todo OpenID 2.0 (7.3) XRI and Yadis discovery */ protected function _discovery(&$id, &$server, &$version) { $realId = $id; if ($this->_storage->getDiscoveryInfo($id, $realId, $server, $version, $expire)) { $id = $realId; return true; } /* TODO: OpenID 2.0 (7.3) XRI and Yadis discovery */ /* HTML-based discovery */ $response = $this->_httpRequest($id, 'GET', array(), $status); if ($status != 200 || !is_string($response)) { return false; } if (preg_match('/<link[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid2.provider[ \\t]*[^"\']*\\1[^>]*href=(["\'])([^"\']+)\\2[^>]*\\/?>/i', $response, $r)) { $version = 2.0; $server = $r[3]; } else { if (preg_match('/<link[^>]*href=(["\'])([^"\']+)\\1[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid2.provider[ \\t]*[^"\']*\\3[^>]*\\/?>/i', $response, $r)) { $version = 2.0; $server = $r[2]; } else { if (preg_match('/<link[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid.server[ \\t]*[^"\']*\\1[^>]*href=(["\'])([^"\']+)\\2[^>]*\\/?>/i', $response, $r)) { $version = 1.1; $server = $r[3]; } else { if (preg_match('/<link[^>]*href=(["\'])([^"\']+)\\1[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid.server[ \\t]*[^"\']*\\3[^>]*\\/?>/i', $response, $r)) { $version = 1.1; $server = $r[2]; } else { return false; } } } } if ($version >= 2.0) { if (preg_match('/<link[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid2.local_id[ \\t]*[^"\']*\\1[^>]*href=(["\'])([^"\']+)\\2[^>]*\\/?>/i', $response, $r)) { $realId = $r[3]; } else { if (preg_match('/<link[^>]*href=(["\'])([^"\']+)\\1[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid2.local_id[ \\t]*[^"\']*\\3[^>]*\\/?>/i', $response, $r)) { $realId = $r[2]; } } } else { if (preg_match('/<link[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid.delegate[ \\t]*[^"\']*\\1[^>]*href=(["\'])([^"\']+)\\2[^>]*\\/?>/i', $response, $r)) { $realId = $r[3]; } else { if (preg_match('/<link[^>]*href=(["\'])([^"\']+)\\1[^>]*rel=(["\'])[ \\t]*(?:[^ \\t"\']+[ \\t]+)*?openid.delegate[ \\t]*[^"\']*\\3[^>]*\\/?>/i', $response, $r)) { $realId = $r[2]; } } } $expire = time() + 60 * 60; $this->_storage->addDiscoveryInfo($id, $realId, $server, $version, $expire); $id = $realId; return true; }
/** * Performs discovery of identity and finds OpenID URL, OpenID server URL * and OpenID protocol version. Returns true on succees and false on * failure. * * @param string &$id OpenID identity URL * @param string &$server OpenID server URL * @param float &$version OpenID protocol version * @return bool * @todo OpenID 2.0 (7.3) XRI and Yadis discovery */ protected function _discovery(&$id, &$server, &$version) { $realId = $id; if ($this->_storage->getDiscoveryInfo($id, $realId, $server, $version, $expire)) { $id = $realId; return true; } /* TODO: OpenID 2.0 (7.3) XRI and Yadis discovery */ /* HTML-based discovery */ $response = $this->_httpRequest($id); if (!is_string($response)) { return false; } if (preg_match('/<link[^>]*rel="openid2.provider"[^>]*href="([^"]+)"[^>]*\\/?>/i', $response, $r) || preg_match('/<link[^>]*href="([^"]+)"[^>]*rel="openid2.provider"[^>]*\\/?>/i', $response, $r)) { $version = 2.0; } else { if (!preg_match('/<link[^>]*rel="openid.server"[^>]*href="([^"]+)"[^>]*\\/?>/i', $response, $r) && !preg_match('/<link[^>]*href="([^"]+)"[^>]*rel="openid.server"[^>]*\\/?>/i', $response, $r)) { return false; } $version = 1.1; } $server = $r[1]; if ($version >= 2.0) { if (preg_match('/<link[^>]*rel="openid2.local_id"[^>]*href="([^"]+)"[^>]*\\/?>/i', $response, $r) || preg_match('/<link[^>]*href="([^"]+)"[^>]*rel="openid2.local_id"[^>]*\\/?>/i', $response, $r)) { $realId = $r[1]; } } else { if (preg_match('/<link[^>]*rel="openid.delegate"[^>]*href="([^"]+)"[^>]*\\/?>/i', $response, $r) || preg_match('/<link[^>]*href="([^"]+)"[^>]*rel="openid.delegate"[^>]*\\/?>/i', $response, $r)) { $realId = $r[1]; } } $expire = time() + 60 * 60; $this->_storage->addDiscoveryInfo($id, $realId, $server, $version, $expire); $id = $realId; return true; }