const DETECT_UNSPECIFIC = [self::DETECT_MANUAL, self::DETECT_HEADER, self::DETECT_BODY, self::DETECT_HOST_META, self::DETECT_CONTACTS, self::DETECT_AP_ACTOR];
// Implementation specific endpoints
+ // @todo Possibly add Lemmy detection via the endpoint /api/v3/site
const DETECT_FRIENDIKA = 10;
const DETECT_FRIENDICA = 11;
const DETECT_STATUSNET = 12;
return;
}
- Worker::add(PRIORITY_LOW, 'UpdateGServer', $url, $only_nodeinfo);
+ Worker::add(Worker::PRIORITY_LOW, 'UpdateGServer', $url, $only_nodeinfo);
}
/**
*/
public static function getID(string $url, bool $no_check = false): ?int
{
+ $url = self::cleanURL($url);
+
if (empty($url)) {
return null;
}
- $url = self::cleanURL($url);
-
$gserver = DBA::selectFirst('gserver', ['id'], ['nurl' => Strings::normaliseLink($url)]);
if (DBA::isResult($gserver)) {
Logger::debug('Got ID for URL', ['id' => $gserver['id'], 'url' => $url, 'callstack' => System::callstack(20)]);
Logger::info('Set failed status for existing server', ['url' => $url]);
return;
}
- DBA::insert('gserver', ['url' => $url, 'nurl' => Strings::normaliseLink($url),
+ self::insert(['url' => $url, 'nurl' => Strings::normaliseLink($url),
'network' => Protocol::PHANTOM, 'created' => DateTimeFormat::utcNow(),
'failed' => true, 'last_failure' => DateTimeFormat::utcNow()]);
Logger::info('Set failed status for new server', ['url' => $url]);
$url = str_replace('/index.php', '', $url);
$urlparts = parse_url($url);
+ if (empty($urlparts)) {
+ return '';
+ }
+
unset($urlparts['user']);
unset($urlparts['pass']);
unset($urlparts['query']);
$gserver = DBA::selectFirst('gserver', ['network'], ['nurl' => Strings::normaliseLink($url)]);
if (!DBA::isResult($gserver)) {
$serverdata['created'] = DateTimeFormat::utcNow();
- $ret = DBA::insert('gserver', $serverdata);
+ $ret = self::insert($serverdata);
$id = DBA::lastInsertId();
} else {
$ret = self::update($serverdata, ['nurl' => $serverdata['nurl']]);
if (!empty($data['url'])) {
$serverdata['platform'] = strtolower($data['platform']);
- $serverdata['version'] = $data['version'];
+ $serverdata['version'] = $data['version'] ?? 'N/A';
}
if (!empty($data['plugins'])) {
private static function validHostMeta(string $url): bool
{
$xrd_timeout = DI::config()->get('system', 'xrd_timeout');
- $curlResult = DI::httpClient()->get($url . '/.well-known/host-meta', HttpClientAccept::XRD_XML, [HttpClientOptions::TIMEOUT => $xrd_timeout]);
+ $curlResult = DI::httpClient()->get($url . Probe::HOST_META, HttpClientAccept::XRD_XML, [HttpClientOptions::TIMEOUT => $xrd_timeout]);
if (!$curlResult->isSuccess()) {
return false;
}
- $xrd = XML::parseString($curlResult->getBody());
+ $xrd = XML::parseString($curlResult->getBody(), true);
if (!is_object($xrd)) {
return false;
}
while ($gserver = DBA::fetch($gservers)) {
Logger::info('Update peer list', ['server' => $gserver['url'], 'id' => $gserver['id']]);
- Worker::add(PRIORITY_LOW, 'UpdateServerPeers', $gserver['url']);
+ Worker::add(Worker::PRIORITY_LOW, 'UpdateServerPeers', $gserver['url']);
Logger::info('Update directory', ['server' => $gserver['url'], 'id' => $gserver['id']]);
- Worker::add(PRIORITY_LOW, 'UpdateServerDirectory', $gserver);
+ Worker::add(Worker::PRIORITY_LOW, 'UpdateServerDirectory', $gserver);
$fields = ['last_poco_query' => DateTimeFormat::utcNow()];
self::update($fields, ['nurl' => $gserver['nurl']]);
if ($curlResult->isSuccess()) {
$servers = json_decode($curlResult->getBody(), true);
- foreach ($servers['instances'] as $server) {
- $url = (is_null($server['https_score']) ? 'http' : 'https') . '://' . $server['name'];
- self::add($url);
+ if (!empty($servers['instances'])) {
+ foreach ($servers['instances'] as $server) {
+ $url = (is_null($server['https_score']) ? 'http' : 'https') . '://' . $server['name'];
+ self::add($url);
+ }
}
}
}
}
/**
+ * Update rows in the gserver table.
* Enforces gserver table field maximum sizes to avoid "Data too long" database errors
*
* @param array $fields
return DBA::update('gserver', $fields, $condition);
}
+
+ /**
+ * Insert a row into the gserver table.
+ * Enforces gserver table field maximum sizes to avoid "Data too long" database errors
+ *
+ * @param array $fields
+ * @param int $duplicate_mode What to do on a duplicated entry
+ *
+ * @return bool
+ *
+ * @throws Exception
+ */
+ public static function insert(array $fields, int $duplicate_mode = Database::INSERT_DEFAULT): bool
+ {
+ $fields = DI::dbaDefinition()->truncateFieldsForTable('gserver', $fields);
+
+ return DBA::insert('gserver', $fields, $duplicate_mode);
+ }
}