X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=actions%2Ffoaf.php;h=2d5b78d123066a58d75f7ffdb5ec21e05015ccf9;hb=b4e649fe906a793cd5e62d6390065ea5d41c40db;hp=30e98960c170209b2b50cb32f860d41d50e2907a;hpb=b264c03d32d04d7a33d28a5830848660f4484943;p=quix0rs-gnu-social.git diff --git a/actions/foaf.php b/actions/foaf.php index 30e98960c1..2d5b78d123 100644 --- a/actions/foaf.php +++ b/actions/foaf.php @@ -25,36 +25,58 @@ define('BOTH', 0); class FoafAction extends Action { - - function is_readonly() + function isReadOnly($args) { return true; } - function handle($args) + function prepare($args) { - parent::handle($args); + parent::prepare($args); + + $nickname_arg = $this->arg('nickname'); + + if (empty($nickname_arg)) { + $this->clientError(_('No such user.'), 404); + return false; + } - $nickname = $this->trimmed('nickname'); + $this->nickname = common_canonical_nickname($nickname_arg); - $user = User::staticGet('nickname', $nickname); + // Permanent redirect on non-canonical nickname - if (!$user) { - common_user_error(_('No such user.'), 404); - return; + if ($nickname_arg != $this->nickname) { + common_redirect(common_local_url('foaf', + array('nickname' => $this->nickname)), + 301); + return false; } - $profile = $user->getProfile(); + $this->user = User::staticGet('nickname', $this->nickname); - if (!$profile) { - common_server_error(_('User has no profile.'), 500); - return; + if (!$this->user) { + $this->clientError(_('No such user.'), 404); + return false; } + $this->profile = $this->user->getProfile(); + + if (!$this->profile) { + $this->serverError(_('User has no profile.'), 500); + return false; + } + + return true; + } + + function handle($args) + { + parent::handle($args); + header('Content-Type: application/rdf+xml'); - common_start_xml(); - common_element_start('rdf:RDF', array('xmlns:rdf' => + $this->startXML(); + $this->elementStart('rdf:RDF', array('xmlns:rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'xmlns:rdfs' => 'http://www.w3.org/2000/01/rdf-schema#', @@ -62,79 +84,89 @@ class FoafAction extends Action 'http://www.w3.org/2003/01/geo/wgs84_pos#', 'xmlns' => 'http://xmlns.com/foaf/0.1/')); - # This is the document about the user + // This is the document about the user - $this->show_ppd('', $user->uri); + $this->showPpd('', $this->user->uri); - # XXX: might not be a person - common_element_start('Person', array('rdf:about' => - $user->uri)); - common_element('mbox_sha1sum', null, sha1('mailto:' . $user->email)); - if ($profile->fullname) { - common_element('name', null, $profile->fullname); + // XXX: might not be a person + $this->elementStart('Person', array('rdf:about' => + $this->user->uri)); + $this->element('mbox_sha1sum', null, sha1('mailto:' . $this->user->email)); + if ($this->profile->fullname) { + $this->element('name', null, $this->profile->fullname); } - if ($profile->homepage) { - common_element('homepage', array('rdf:resource' => $profile->homepage)); + if ($this->profile->homepage) { + $this->element('homepage', array('rdf:resource' => $this->profile->homepage)); } - if ($profile->bio) { - common_element('rdfs:comment', null, $profile->bio); + if ($this->profile->bio) { + $this->element('rdfs:comment', null, $this->profile->bio); } - # XXX: more structured location data - if ($profile->location) { - common_element_start('based_near'); - common_element_start('geo:SpatialThing'); - common_element('name', null, $profile->location); - common_element_end('geo:SpatialThing'); - common_element_end('based_near'); + // XXX: more structured location data + if ($this->profile->location) { + $this->elementStart('based_near'); + $this->elementStart('geo:SpatialThing'); + $this->element('name', null, $this->profile->location); + $this->elementEnd('geo:SpatialThing'); + $this->elementEnd('based_near'); } - $this->show_microblogging_account($profile, common_root_url()); + $this->showMicrobloggingAccount($this->profile, common_root_url()); - $avatar = $profile->getOriginalAvatar(); + $avatar = $this->profile->getOriginalAvatar(); if ($avatar) { - common_element_start('img'); - common_element_start('Image', array('rdf:about' => $avatar->url)); + $this->elementStart('img'); + $this->elementStart('Image', array('rdf:about' => $avatar->url)); foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) { - $scaled = $profile->getAvatar($size); - if (!$scaled->original) { # sometimes the original has one of our scaled sizes - common_element_start('thumbnail'); - common_element('Image', array('rdf:about' => $scaled->url)); - common_element_end('thumbnail'); + $scaled = $this->profile->getAvatar($size); + if (!$scaled->original) { // sometimes the original has one of our scaled sizes + $this->elementStart('thumbnail'); + $this->element('Image', array('rdf:about' => $scaled->url)); + $this->elementEnd('thumbnail'); } } - common_element_end('Image'); - common_element_end('img'); + $this->elementEnd('Image'); + $this->elementEnd('img'); } - # Get people user is subscribed to + // Get people user is subscribed to $person = array(); $sub = new Subscription(); - $sub->subscriber = $profile->id; + $sub->subscriber = $this->profile->id; $sub->whereAdd('subscriber != subscribed'); - + if ($sub->find()) { while ($sub->fetch()) { - if ($sub->token) { + if (!empty($sub->token)) { $other = Remote_profile::staticGet('id', $sub->subscribed); } else { $other = User::staticGet('id', $sub->subscribed); } - if (!$other) { + if (empty($other)) { common_debug('Got a bad subscription: '.print_r($sub,true)); continue; } - common_element('knows', array('rdf:resource' => $other->uri)); - $person[$other->uri] = array(LISTENEE, $other); + $this->element('knows', array('rdf:resource' => $other->uri)); + $person[$other->uri] = array(LISTENEE, + $other->id, + $other->nickname, + (empty($sub->token)) ? 'User' : 'Remote_profile'); + $other->free(); + $other = null; + unset($other); } } - # Get people who subscribe to user + $sub->free(); + $sub = null; + unset($sub); + + // Get people who subscribe to user $sub = new Subscription(); - $sub->subscribed = $profile->id; + $sub->subscribed = $this->profile->id; $sub->whereAdd('subscriber != subscribed'); if ($sub->find()) { @@ -151,57 +183,72 @@ class FoafAction extends Action if (array_key_exists($other->uri, $person)) { $person[$other->uri][0] = BOTH; } else { - $person[$other->uri] = array(LISTENER, $other); + $person[$other->uri] = array(LISTENER, + $other->id, + $other->nickname, + (empty($sub->token)) ? 'User' : 'Remote_profile'); } + $other->free(); + $other = null; + unset($other); } } - common_element_end('Person'); + $sub->free(); + $sub = null; + unset($sub); + + $this->elementEnd('Person'); foreach ($person as $uri => $p) { $foaf_url = null; - if ($p[1] instanceof User) { - $foaf_url = common_local_url('foaf', array('nickname' => $p[1]->nickname)); + list($type, $id, $nickname, $cls) = $p; + if ($cls == 'User') { + $foaf_url = common_local_url('foaf', array('nickname' => $nickname)); } - $profile = Profile::staticGet($p[1]->id); - common_element_start('Person', array('rdf:about' => $uri)); - if ($p[0] == LISTENER || $p[0] == BOTH) { - common_element('knows', array('rdf:resource' => $user->uri)); + $profile = Profile::staticGet($id); + $this->elementStart('Person', array('rdf:about' => $uri)); + if ($type == LISTENER || $type == BOTH) { + $this->element('knows', array('rdf:resource' => $this->user->uri)); } - $this->show_microblogging_account($profile, ($p[1] instanceof User) ? - common_root_url() : null); + $this->showMicrobloggingAccount($profile, ($cls == 'User') ? + common_root_url() : null); if ($foaf_url) { - common_element('rdfs:seeAlso', array('rdf:resource' => $foaf_url)); + $this->element('rdfs:seeAlso', array('rdf:resource' => $foaf_url)); } - common_element_end('Person'); + $this->elementEnd('Person'); if ($foaf_url) { - $this->show_ppd($foaf_url, $uri); + $this->showPpd($foaf_url, $uri); } + $profile->free(); + $profile = null; + unset($profile); } - common_element_end('rdf:RDF'); + $this->elementEnd('rdf:RDF'); + $this->endXML(); } - function show_ppd($foaf_url, $person_uri) + function showPpd($foaf_url, $person_uri) { - common_element_start('PersonalProfileDocument', array('rdf:about' => $foaf_url)); - common_element('maker', array('rdf:resource' => $person_uri)); - common_element('primaryTopic', array('rdf:resource' => $person_uri)); - common_element_end('PersonalProfileDocument'); + $this->elementStart('PersonalProfileDocument', array('rdf:about' => $foaf_url)); + $this->element('maker', array('rdf:resource' => $person_uri)); + $this->element('primaryTopic', array('rdf:resource' => $person_uri)); + $this->elementEnd('PersonalProfileDocument'); } - function show_microblogging_account($profile, $service=null) + function showMicrobloggingAccount($profile, $service=null) { - # Their account - common_element_start('holdsAccount'); - common_element_start('OnlineAccount'); + // Their account + $this->elementStart('holdsAccount'); + $this->elementStart('OnlineAccount'); if ($service) { - common_element('accountServiceHomepage', array('rdf:resource' => + $this->element('accountServiceHomepage', array('rdf:resource' => $service)); } - common_element('accountName', null, $profile->nickname); - common_element('homepage', array('rdf:resource' => $profile->profileurl)); - common_element_end('OnlineAccount'); - common_element_end('holdsAccount'); + $this->element('accountName', null, $profile->nickname); + $this->element('homepage', array('rdf:resource' => $profile->profileurl)); + $this->elementEnd('OnlineAccount'); + $this->elementEnd('holdsAccount'); } }