#!/usr/bin/env php . /** * @package GNUsocial * @copyright 2010 StatusNet, Inc. * @license https://www.gnu.org/licenses/agpl.html GNU AGPL v3 or later */ define('INSTALLDIR', dirname(__DIR__, 3)); define('PUBLICDIR', INSTALLDIR . DIRECTORY_SEPARATOR . 'public'); $helptext = <<uri($args[0])) { print "$helptext"; exit(1); } $uri = $args[0]; $oprofile = Ostatus_profile::getKV('uri', $uri); if (!$oprofile) { print "No OStatus remote profile known for URI $uri\n"; exit(1); } print "Old profile state for $oprofile->uri\n"; showProfile($oprofile); print "\n"; print "Re-running feed discovery for profile URL $oprofile->uri\n"; $feedurl = null; $salmonuri = null; // @fixme will bork where the URI isn't the profile URL for now $discover = new FeedDiscovery(); try { $feedurl = $discover->discoverFromURL($oprofile->uri); $salmonuri = $discover->getAtomLink(Salmon::REL_SALMON) ?: $discover->getAtomLink(Salmon::NS_REPLIES); // NS_REPLIES is deprecated if (empty($salmonuri)) { throw new FeedSubNoSalmonException('No salmon upstream URI was found'); } } catch (FeedSubException $e) { $acct = $oprofile->localProfile()->getAcctUri(); print "Could not discover feeds HTML response, trying reconstructed acct URI: {$acct}\n"; $disco = new Discovery(); $xrd = $disco->lookup($acct); $hints = DiscoveryHints::fromXRD($xrd); if (array_key_exists('feedurl', $hints)) { // Prefer $hints['feedurl'] to current $feedurl value $feedurl = $hints['feedurl']; } elseif (empty($feedurl)) { // if (empty($feedurl) && !array_key_exists('feedurl', $hints)) throw new FeedSubNoFeedException($acct); } $salmonuri = array_key_exists('salmon', $hints) ? $hints['salmon'] : $salmonuri; // get the hub data too and put it in the FeedDiscovery object $discover->discoverFromFeedUrl($feedurl); } $huburi = $discover->getHubLink(); print " Feed URL: $feedurl\n"; print " Hub URL: $huburi\n"; print " Salmon URL: $salmonuri\n"; if ($feedurl != $oprofile->feeduri || $salmonuri != $oprofile->salmonuri) { print "\n"; print "Updating...\n"; // @fixme update keys :P //$orig = clone($oprofile); //$oprofile->feeduri = $feedurl; //$oprofile->salmonuri = $salmonuri; //$ok = $oprofile->update($orig); $ok = $oprofile->query( <<_quote($feedurl)}, salmonuri = {$oprofile->_quote($salmonuri)}, modified = CURRENT_TIMESTAMP WHERE uri = {$oprofile->_quote($uri)} END ); if (!$ok) { print "Failed to update profile record...\n"; exit(1); } $oprofile->decache(); } else { print "\n"; print "Ok, ostatus_profile record unchanged.\n\n"; } $sub = FeedSub::ensureFeed($feedurl); if ($huburi != $sub->huburi) { print "\n"; print "Updating hub record for feed; was $sub->huburi\n"; $orig = clone($sub); $sub->huburi = $huburi; $ok = $sub->update($orig); if (!$ok) { print "Failed to update sub record...\n"; exit(1); } } else { print "\n"; print "Feed record ok, not changing.\n\n"; } echo "\n"; echo "Pinging hub {$sub->huburi} with new subscription for {$sub->uri}\n"; try { $sub->subscribe(); echo "ok\n"; } catch (Exception $e) { echo 'Could not confirm. '.get_class($e).': '.$e->getMessage()."\n"; } $o2 = Ostatus_profile::getKV('uri', $uri); print "\n"; print "New profile state:\n"; showProfile($o2); print "\n"; print "New feed state:\n"; $sub2 = FeedSub::ensureFeed($feedurl); showSub($sub2); function showProfile($oprofile) { print " Feed URL: $oprofile->feeduri\n"; print " Salmon URL: $oprofile->salmonuri\n"; print " Avatar URL: $oprofile->avatar\n"; print " Profile ID: $oprofile->profile_id\n"; print " Group ID: $oprofile->group_id\n"; print " Record created: $oprofile->created\n"; print " Record modified: $oprofile->modified\n"; } function showSub($sub) { print " Subscription state: $sub->sub_state\n"; print " Signature secret: $sub->secret\n"; print " Sub start date: $sub->sub_start\n"; print " Record created: $sub->created\n"; print " Record modified: $sub->modified\n"; }