X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Faccountmover.php;h=83314b49978d53ace8a732179db05a33b5f4242f;hb=dd93420b08910a8bf9967dad7906351695d1ac55;hp=ba9da0f6fd27106ebb14a444c7690cdf18895cfe;hpb=905aded81a8a001fefc211981c435c5c21bb3a99;p=quix0rs-gnu-social.git diff --git a/lib/accountmover.php b/lib/accountmover.php index ba9da0f6fd..83314b4997 100644 --- a/lib/accountmover.php +++ b/lib/accountmover.php @@ -4,7 +4,7 @@ * Copyright (C) 2010, StatusNet, Inc. * * A class for moving an account to a new server - * + * * PHP version 5 * * This program is free software: you can redistribute it and/or modify @@ -44,30 +44,54 @@ if (!defined('STATUSNET')) { * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @link http://status.net/ */ - -class AccountMover +class AccountMover extends QueueHandler { - private $_user = null; - private $_profile = null; - private $_remote = null; - private $_sink = null; - - function __construct($user, $remote, $password) + function transport() + { + return 'acctmove'; + } + + function handle($object) { - $this->_user = $user; - $this->_profile = $user->getProfile(); + list($user, $remote, $password) = $object; + + $remote = Discovery::normalize($remote); $oprofile = Ostatus_profile::ensureProfileURI($remote); if (empty($oprofile)) { - throw new Exception("Can't locate account {$remote}"); + // TRANS: Exception thrown when an account could not be located when it should be moved. + // TRANS: %s is the remote site. + throw new Exception(sprintf(_("Cannot locate account %s."),$remote)); } - $this->_remote = $oprofile->localProfile(); - list($svcDocUrl, $username) = self::getServiceDocument($remote); - $this->_sink = new ActivitySink($svcDocUrl, $username, $password); + $sink = new ActivitySink($svcDocUrl, $username, $password); + + $this->log(LOG_INFO, + "Moving user {$user->nickname} ". + "to {$remote}."); + + $stream = new UserActivityStream($user); + + // Reverse activities to run in correct chron order + + $acts = array_reverse($stream->activities); + + $this->log(LOG_INFO, + "Got ".count($acts)." activities ". + "for {$user->nickname}."); + + $qm = QueueManager::get(); + + foreach ($acts as $act) { + $qm->enqueue(array($act, $sink, $user->getUri(), $remote), 'actmove'); + } + + $this->log(LOG_INFO, + "Finished moving user {$user->nickname} ". + "to {$remote}."); } static function getServiceDocument($remote) @@ -77,95 +101,44 @@ class AccountMover $xrd = $discovery->lookup($remote); if (empty($xrd)) { - throw new Exception("Can't find XRD for $remote"); - } + // TRANS: Exception thrown when a service document could not be located account move. + // TRANS: %s is the remote site. + throw new Exception(sprintf(_("Cannot find XRD for %s."),$remote)); + } $svcDocUrl = null; $username = null; - foreach ($xrd->links as $link) { - if ($link['rel'] == 'http://apinamespace.org/atom' && - $link['type'] == 'application/atomsvc+xml') { - $svcDocUrl = $link['href']; - if (!empty($link['property'])) { - foreach ($link['property'] as $property) { - if ($property['type'] == 'http://apinamespace.org/atom/username') { - $username = $property['value']; - break; - } - } - } + $link = $xrd->links->get('http://apinamespace.org/atom', 'application/atomsvc+xml'); + if (!is_null($link)) { + $svcDocUrl = $link->href; + if (isset($link['http://apinamespace.org/atom/username'])) { + $username = $link['http://apinamespace.org/atom/username']; break; } } if (empty($svcDocUrl)) { - throw new Exception("No AtomPub API service for $remote."); + // TRANS: Exception thrown when an account could not be located when it should be moved. + // TRANS: %s is the remote site. + throw new Exception(sprintf(_("No AtomPub API service for %s."),$remote)); } return array($svcDocUrl, $username); } - function move() + /** + * Log some data + * + * Add a header for our class so we know who did it. + * + * @param int $level Log level, like LOG_ERR or LOG_INFO + * @param string $message Message to log + * + * @return void + */ + protected function log($level, $message) { - $stream = new UserActivityStream($this->_user); - - $acts = array_reverse($stream->activities); - - // Reverse activities to run in correct chron order - - foreach ($acts as $act) { - $this->_moveActivity($act); - } - } - - private function _moveActivity($act) - { - switch ($act->verb) { - case ActivityVerb::FAVORITE: - // push it, then delete local - $this->_sink->postActivity($act); - $notice = Notice::staticGet('uri', $act->objects[0]->id); - if (!empty($notice)) { - $fave = Fave::pkeyGet(array('user_id' => $this->_user->id, - 'notice_id' => $notice->id)); - $fave->delete(); - } - break; - case ActivityVerb::POST: - // XXX: send a reshare, not a post - common_log(LOG_INFO, "Pushing notice {$act->objects[0]->id} to {$this->_remote->getURI()}"); - $this->_sink->postActivity($act); - $notice = Notice::staticGet('uri', $act->objects[0]->id); - if (!empty($notice)) { - $notice->delete(); - } - break; - case ActivityVerb::JOIN: - $this->_sink->postActivity($act); - $group = User_group::staticGet('uri', $act->objects[0]->id); - if (!empty($group)) { - Group_member::leave($group->id, $this->_user->id); - } - break; - case ActivityVerb::FOLLOW: - if ($act->actor->id == $this->_user->uri) { - $this->_sink->postActivity($act); - $other = Profile::fromURI($act->objects[0]->id); - if (!empty($other)) { - Subscription::cancel($this->_profile, $other); - } - } else { - $otherUser = User::staticGet('uri', $act->actor->id); - if (!empty($otherUser)) { - $otherProfile = $otherUser->getProfile(); - Subscription::start($otherProfile, $this->_remote); - Subscription::cancel($otherProfile, $this->_user->getProfile()); - } else { - // It's a remote subscription. Do something here! - } - } - break; - } + common_log($level, "AccountMover: " . $message); } }