Accept 'tag' and other non-http id URIs in Ostatus_profile::getActivityObjectProfileURI().

(If there's not a valid ID we fall back to the link, which we do still validate as http/s.)
This commit is contained in:
Brion Vibber 2010-03-21 15:46:28 -07:00
parent 5d3bce49b8
commit b228da628d
1 changed files with 25 additions and 11 deletions

View File

@ -1140,35 +1140,49 @@ class Ostatus_profile extends Memcached_DataObject
/** /**
* @param Activity $activity * @param Activity $activity
* @return mixed matching Ostatus_profile or false if none known * @return mixed matching Ostatus_profile or false if none known
* @throws ServerException if feed info invalid
*/ */
public static function getActorProfile($activity) public static function getActorProfile($activity)
{ {
return self::getActivityObjectProfile($activity->actor); return self::getActivityObjectProfile($activity->actor);
} }
/**
* @param ActivityObject $activity
* @return mixed matching Ostatus_profile or false if none known
* @throws ServerException if feed info invalid
*/
protected static function getActivityObjectProfile($object) protected static function getActivityObjectProfile($object)
{ {
$uri = self::getActivityObjectProfileURI($object); $uri = self::getActivityObjectProfileURI($object);
return Ostatus_profile::staticGet('uri', $uri); return Ostatus_profile::staticGet('uri', $uri);
} }
protected static function getActorProfileURI($activity)
{
return self::getActivityObjectProfileURI($activity->actor);
}
/** /**
* @param Activity $activity * Get the identifier URI for the remote entity described
* by this ActivityObject. This URI is *not* guaranteed to be
* a resolvable HTTP/HTTPS URL.
*
* @param ActivityObject $object
* @return string * @return string
* @throws ServerException * @throws ServerException if feed info invalid
*/ */
protected static function getActivityObjectProfileURI($object) protected static function getActivityObjectProfileURI($object)
{ {
$opts = array('allowed_schemes' => array('http', 'https')); if ($object->id) {
if ($object->id && Validate::uri($object->id, $opts)) { // Possibly an upstream bug; tag: URIs are rejected unless you
return $object->id; // explicitly ask for them. All other schemes are accepted for
// basic URI validation without asking.
if (Validate::uri($object->id) ||
Validate::uri($object->id, array('allowed_scheme' => array('tag')))) {
return $object->id;
}
} }
if ($object->link && Validate::uri($object->link, $opts)) {
// If the id is missing or invalid (we've seen feeds mistakenly listing
// things like local usernames in that field) then we'll use the profile
// page link, if valid.
if ($object->link && common_valid_http_url($object->link)) {
return $object->link; return $object->link;
} }
throw new ServerException("No author ID URI found"); throw new ServerException("No author ID URI found");