mirror of
https://github.com/coollabsio/coolify.git
synced 2026-10-28 17:44:36 +08:00
Store server IPs in one form (no brackets, short lower-case IPv6) and write each address in the form its context needs: - URLs and host:port (Sentinel, database URLs, SFTP backup download, DNS servers, SMTP, webhook base URLs, links, health checks) get brackets through formatHostForUrl(). - Traefik Host() rules use the address without brackets, so IPv6 domains no longer return 404; saved labels are fixed at deploy. Caddy keeps the brackets. - SSH keeps the plain address. - Hetzner gives an IPv6 /64 network; IPv6-only servers now get the server address (prefix::1) instead of the unusable prefix::64. - sslip labels, registry image names with an IPv6 host, the API domain list, allowlist matching and duplicate checks handle IPv6. A migration normalizes stored IPv6 server addresses, repairs Hetzner servers saved as ::64 that are not reachable, and adds brackets to saved Sentinel URLs.
47 lines
1.3 KiB
PHP
47 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace App\Rules;
|
|
|
|
use Closure;
|
|
use Illuminate\Contracts\Validation\ValidationRule;
|
|
|
|
class ValidServerIp implements ValidationRule
|
|
{
|
|
/**
|
|
* Accepts a valid IPv4 address, IPv6 address (optionally in brackets), or RFC 1123 hostname.
|
|
*/
|
|
public function validate(string $attribute, mixed $value, Closure $fail): void
|
|
{
|
|
if (empty($value)) {
|
|
return;
|
|
}
|
|
|
|
$trimmed = trim($value);
|
|
|
|
if (filter_var($trimmed, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
|
|
return;
|
|
}
|
|
|
|
if (filter_var($trimmed, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
|
|
return;
|
|
}
|
|
|
|
// A bracketed IPv6 address ([2a01:4f8::1]); it is stored without brackets.
|
|
if (str_starts_with($trimmed, '[') && str_ends_with($trimmed, ']')
|
|
&& filter_var(substr($trimmed, 1, -1), FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
|
|
return;
|
|
}
|
|
|
|
// Delegate hostname validation to ValidHostname
|
|
$hostnameRule = new ValidHostname;
|
|
$failed = false;
|
|
$hostnameRule->validate($attribute, $trimmed, function () use (&$failed) {
|
|
$failed = true;
|
|
});
|
|
|
|
if ($failed) {
|
|
$fail('The :attribute must be a valid IPv4 address, IPv6 address, or hostname.');
|
|
}
|
|
}
|
|
}
|