diff -up ./modules/openid/openid.inc.orig ./modules/openid/openid.inc --- ./modules/openid/openid.inc.orig 2009-05-21 02:42:09.000000000 -0700 +++ ./modules/openid/openid.inc 2009-05-21 12:12:32.000000000 -0700 @@ -218,23 +218,43 @@ function _openid_nonce() { */ function _openid_link_href($rel, $html) { $rel = preg_quote($rel); - preg_match('||iUs', $html, $matches); - if (isset($matches[3])) { - preg_match('|href=["\']([^"]+)["\']|iU', $matches[3], $href); - return trim($href[1]); + + // find all link tags + preg_match_all('|]*)>|iUs', $html, $matcharray); + // loop over each and find the first one with the right "rel" + foreach ($matcharray[1] as $linkguts) { + // does this contain the right "rel" value? + preg_match('|rel\s*=\s*["\'](([^"\']*)' . $rel . '([^"\']*))["\']|iUs', $linkguts, $relmatches); + if ($relmatches[1]) { + // we have the correct "rel", now find the href value + preg_match('|href\s*=\s*["\']([^"\']*)["\']|iUs', $linkguts, $hrefmatches); + if ($hrefmatches[1]) { + return $hrefmatches[1]; + } + } } + return FALSE; } /** - * Pull the http-equiv attribute out of an html meta element + * Pull the content attribute out of the html meta element with the indicated http-equiv */ function _openid_meta_httpequiv($equiv, $html) { - preg_match('||iUs', $html, $matches); - if (isset($matches[1])) { - preg_match('|content=["\']([^"]+)["\']|iUs', $matches[1], $content); - if (isset($content[1])) { - return $content[1]; + $equiv = preg_quote($equiv); + + // find all meta tags + preg_match_all('|]*)>|iUs', $html, $matcharray); + // loop over each and find the first one with the right "http-equiv" + foreach ($matcharray[1] as $metaguts) { + // does this contain the right "http-equiv" value? + preg_match('|http-equiv\s*=\s*["\'](\s*' . $equiv . '\s*)["\']|iUs', $metaguts, $httpequivmatches); + if ($httpequivmatches[1]) { + // we have the correct "http-equiv", now find the content value + preg_match('|content\s*=\s*["\']([^"\']*)["\']|iUs', $metaguts, $contentmatches); + if ($contentmatches[1]) { + return $contentmatches[1]; + } } } return FALSE;