Files
CRM/app/Services/DavClient/Utils/Dav/ServiceUrlQuery.php
Kroonk a213a1dba0
Some checks failed
Build & Push Monica Image to Gitea Registry / build-and-push (push) Failing after 9s
refactor: replace custom CRM with Monica fork
2026-05-22 16:19:55 +02:00

82 lines
2.1 KiB
PHP

<?php
namespace App\Services\DavClient\Utils\Dav;
use GuzzleHttp\Psr7\Uri;
use Illuminate\Support\Collection;
use Http\Client\Exception\RequestException;
class ServiceUrlQuery
{
/**
* Get service url.
*
* @return string|null
*
* @see https://datatracker.ietf.org/doc/html/rfc6352#section-11
* @see https://datatracker.ietf.org/doc/html/rfc2782
*/
public function execute(string $name, bool $https, string $baseUri, DavClient $client): ?string
{
try {
$host = \Safe\parse_url($baseUri, PHP_URL_HOST);
} catch (\Safe\Exceptions\UrlException $e) {
return null;
}
$entries = $this->dns_get_record($name.'.'.$host, DNS_SRV);
if ($entries && $entries->count() > 0) {
$entries = collect($entries)
->groupBy('pri')
->sortKeys()
->first()
->sortByDesc('weight');
foreach ($entries as $entry) {
try {
return $this->getUri($entry, $https, $client);
} catch (RequestException $e) {
// no exception
}
}
}
return null;
}
/**
* Get uri from entry.
*
* @param array $entry
* @param bool $https
* @param DavClient $client
* @return string
*
* @throws \Http\Client\Exception\RequestException
*/
private function getUri(array $entry, bool $https, DavClient $client): string
{
$uri = (new Uri())
->withScheme($https ? 'https' : 'http')
->withPort($entry['port'])
->withHost($entry['target']);
// Test connection
$client->request('GET', $uri);
return (string) $uri;
}
private function dns_get_record(string $hostname, int $type = DNS_ANY, ?array &$authns = null, ?array &$addtl = null, bool $raw = false): ?Collection
{
error_clear_last();
$result = \dns_get_record($hostname, $type, $authns, $addtl, $raw);
if ($result === false) {
return null;
}
return collect($result);
}
}