. * */ namespace Friendica\Core; use Friendica\App; use Friendica\Database; use Friendica\Util\Strings; use Friendica\Worker\Delivery; class Relocate { /** * @var App\BaseURL */ private $baseUrl; /** * @var Database\Database */ private $database; /** * @var Config\Capability\IManageConfigValues */ private $config; public function __construct(App\BaseURL $baseUrl, Database\Database $database, Config\Capability\IManageConfigValues $config) { $this->baseUrl = $baseUrl; $this->database = $database; $this->config = $config; } /** * Performs relocation * * @param string $new_url The new node URL, including the scheme * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ public function run(string $new_url) { $new_url = rtrim($new_url, '/'); $parsed = @parse_url($new_url); if (!is_array($parsed) || empty($parsed['host']) || empty($parsed['scheme'])) { throw new \InvalidArgumentException('Can not parse base URL. Must have at least ://'); } /* steps: * replace all "baseurl" to "new_url" in config, profile, term, items and contacts * send relocate for every local user * */ $old_url = $this->baseUrl->get(true); // Generate host names for relocation the addresses in the format user@address.tld $new_host = str_replace('http://', '@', Strings::normaliseLink($new_url)); $old_host = str_replace('http://', '@', Strings::normaliseLink($old_url)); // update tables // update profile links in the format "http://server.tld" $this->database->replaceInTableFields('profile', ['photo', 'thumb'], $old_url, $new_url); $this->database->replaceInTableFields('contact', ['photo', 'thumb', 'micro', 'url', 'nurl', 'alias', 'request', 'notify', 'poll', 'confirm', 'poco', 'avatar'], $old_url, $new_url); $this->database->replaceInTableFields('post-content', ['body'], $old_url, $new_url); // update profile addresses in the format "user@server.tld" $this->database->replaceInTableFields('contact', ['addr'], $old_host, $new_host); // update config $this->config->set('system', 'url', $new_url); $this->baseUrl->saveByURL($new_url); // send relocate $users = $this->database->selectToArray('user', ['uid'], ['account_removed' => false, 'account_expired' => false]); foreach ($users as $user) { Worker::add(PRIORITY_HIGH, 'Notifier', Delivery::RELOCATION, $user['uid']); } } }