From 73c137aabaa53316ab2ccba04c934f18d9b36a75 Mon Sep 17 00:00:00 2001
From: Miraty Ce formulaire ne sera pas accepté car il faut se connecter avant.
- Ce formulaire permet d'utiliser une clé d'approbation pour valider son compte. Une clé d'approbation est distribuée par l'administrataire sur demande.
- Pas de compte ? En créer un Déjà un compte ? Se connecter
- Cette action supprimera toutes les données appartenant à ce compte, y compris :
-
- Vous pouvez ici changer l'identifiant permettant d'accéder à votre compte Niver.
-
- Ajouter sur un dossier de site un accès = linkToDocs('http', 'HTTP') ?> par = linkToDocs('dns', 'DNS') ?> et = linkToDocs('tls', 'TLS') ?> = linkToDocs('ca', 'authentifié par Let\'s Encrypt') ?>.
-
- La présence des enregistrements ci-après sera vérifiée lors du traitement de ce formulaire.
-
- Ajouter un accès en .onion sur un dossier
-
- Pour prouver que vous possédez bien ce domaine, il doit posséder un = linkToDocs('ns-record', 'enregistrement NS') ?> égal à
- La zone sera servie par ces serveurs de noms :
-
-
-
-
diff --git a/pages/auth/username.php b/pages/auth/username.php
deleted file mode 100644
index be7040c..0000000
--- a/pages/auth/username.php
+++ /dev/null
@@ -1,30 +0,0 @@
-prepare('UPDATE users SET username = :username WHERE id = :id')
- ->execute([':username' => $username, ':id' => $_SESSION['id']]);
-
- $_SESSION['display-username'] = htmlspecialchars($_POST['new-username']);
-
- output(200, 'Identifiant changé.');
-}
-
-?>
-
-' . CONF['ht']['ipv6_address'] . '
.');
-
- $remoteARecords = dns_get_record($_POST['domain'], DNS_A);
- if (is_array($remoteARecords) !== true)
- output(500, 'Erreur lors de la récupération de l\'enregistrement A.');
- if (equalArrays([CONF['ht']['ipv4_address']], array_column($remoteARecords, 'ip')) !== true)
- output(403, 'Ce domaine doit avoir pour unique enregistrement A ' . CONF['ht']['ipv4_address'] . '
.');
-
- $remoteTXTRecords = dns_get_record($_POST['domain'], DNS_TXT);
- if (is_array($remoteTXTRecords) !== true)
- output(500, 'Erreur lors de la récupération de l\'enregistrement TXT.');
- if (preg_match('/^' . preg_quote(SERVER_NAME, '/') . '_domain-verification=([0-9a-f]{8})-([0-9a-f]{32})$/Dm', implode(LF, array_column($remoteTXTRecords, 'txt')), $matches) !== 1)
- output(403, 'Aucun enregistrement TXT au format correct trouvé.');
-
- checkAuthToken($matches[1], $matches[2]);
-
- rateLimit();
-
- addSite($_SESSION['id'], $_POST['dir'], $_POST['domain'], 'dns', 'http');
-
- exec('2>&1 ' . CONF['ht']['sudo_path'] . ' ' . CONF['ht']['certbot_path'] . ' certonly' . (($_SESSION['type'] === 'approved') ? '' : ' --test-cert') . ' --key-type rsa --rsa-key-size 3072 --webroot --webroot-path /srv/niver/acme --domain ' . $_POST['domain'], $output, $returnCode);
- if ($returnCode !== 0)
- output(500, 'Certbot failed to get a Let\'s Encrypt certificate.', $output);
-
- $nginxConf = 'server {
- listen [' . CONF['ht']['ipv6_listen_address'] . ']:' . CONF['ht']['https_port'] . ' ssl http2;
- listen ' . CONF['ht']['ipv4_listen_address'] . ':' . CONF['ht']['https_port'] . ' ssl http2;
- server_name ' . $_POST['domain'] . ';
- root ' . CONF['ht']['ht_path'] . '/' . $_SESSION['id'] . '/' . $_POST['dir'] . ';
-
- ssl_certificate /etc/letsencrypt/live/' . $_POST['domain'] . '/fullchain.pem;
- ssl_certificate_key /etc/letsencrypt/live/' . $_POST['domain'] . '/privkey.pem;
-
- include inc/ht-tls.conf;
-}
-';
- if (file_put_contents(CONF['ht']['nginx_config_path'] . '/' . $_POST['domain'] . '.conf', $nginxConf) === false)
- output(500, 'Failed to write Nginx configuration.');
-
- // Reload Nginx
- exec(CONF['ht']['sudo_path'] . ' ' . CONF['ht']['nginx_reload_cmd'], result_code: $code);
- if ($code !== 0)
- output(500, 'Failed to reload Nginx.');
-
- output(200, 'Accès HTTP par domaine ajouté sur ce dossier !');
-}
-
-$dirsStatuses = dirsStatuses('onion', 'http');
-
-$proof = getAuthToken();
-
-?>
-
-
-
-
-
diff --git a/pages/ht/add-http-onion.php b/pages/ht/add-http-onion.php
deleted file mode 100644
index ee14dbe..0000000
--- a/pages/ht/add-http-onion.php
+++ /dev/null
@@ -1,70 +0,0 @@
-dir.');
-
- rateLimit();
-
- // Add Tor config
- $torConf = 'HiddenServiceDir ' . CONF['ht']['tor_keys_path'] . '/' . $_SESSION['id'] . '/' . $_POST['dir'] . '/
- HiddenServicePort 80 [::1]:' . CONF['ht']['internal_onion_http_port'] . '
- ';
- if (file_put_contents(CONF['ht']['tor_config_path'] . '/' . $_SESSION['id'] . '/' . $_POST['dir'], $torConf) === false)
- output(500, 'Failed to write new Tor configuration.');
-
- // Reload Tor
- exec(CONF['ht']['sudo_path'] . ' ' . CONF['ht']['tor_reload_cmd'], $output, $code);
- if ($code !== 0)
- output(500, 'Failed to reload Tor.');
-
- // Get the address generated by Tor
- exec(CONF['ht']['sudo_path'] . ' -u ' . CONF['ht']['tor_user'] . ' ' . CONF['ht']['cat_path'] . ' ' . CONF['ht']['tor_keys_path'] . '/' . $_SESSION['id'] . '/' . $_POST['dir'] . '/hostname', $output);
- $onion = $output[0];
- if (preg_match('/^[0-9a-z]{56}\.onion$/D', $onion) !== 1)
- output(500, 'No onion address found.');
-
- // Store it in the database
- addSite($_SESSION['id'], $_POST['dir'], $onion, 'onion', 'http');
-
- // Add Nginx config
- $nginxConf = 'server {
- listen [::1]:' . CONF['ht']['internal_onion_http_port'] . ';
- server_name ' . $onion . ';
- root ' . CONF['ht']['ht_path'] . '/' . $_SESSION['id'] . '/' . $_POST['dir'] . ';
-
- include inc/ht-onion.conf;
- }
- ';
- if (file_put_contents(CONF['ht']['nginx_config_path'] . '/' . $onion . '.conf', $nginxConf) === false)
- output(500, 'Failed to write Nginx configuration.');
-
- // Reload Nginx
- exec(CONF['ht']['sudo_path'] . ' ' . CONF['ht']['nginx_reload_cmd'], result_code: $code);
- if ($code !== 0)
- output(500, 'Failed to reload Nginx.');
-
- // Tell the user their site address
- output(200, 'L\'adresse de votre service Onion HTTP est : AAAA
= CONF['ht']['ipv6_address'] ?>
- A
= CONF['ht']['ipv4_address'] ?>
- TXT
= SERVER_NAME ?>_domain-verification== $proof ?>
- http://' . $onion . '/
');
-}
-
-$dirsStatuses = dirsStatuses('onion', 'http');
-
-?>
-
-
-
';
- }
-
- if ($_POST['print'] === 'ds') {
-
- $found = preg_match('/^' . preg_quote($_POST['zone'], '/') . '[\t ]+0[\t ]+CDS[\t ]+(?
-
-';
- foreach ($elements as $element)
- echo ' Domaine
- TTL
- Type
- Contenu
- ';
- echo ' ';
- }
- echo '' . htmlspecialchars($element) . '
-
-
- $_POST['domain']], 'zone') !== [])
- output(403, 'Cette zone existe déjà sur ce service.');
-
- exec(CONF['dns']['kdig_path'] . ' ' . ltrim(strstr($_POST['domain'], '.'), '.') . ' NS +short', $parentAuthoritatives);
- if ($parentAuthoritatives === [])
- output(403, 'Serveurs de noms de la zone parente introuvables');
- foreach ($parentAuthoritatives as $parentAuthoritative)
- checkAbsoluteDomainFormat($parentAuthoritative);
-
- exec(CONF['dns']['kdig_path'] . ' ' . $_POST['domain'] . ' NS @' . $parentAuthoritatives[0] . ' +noidn', $results);
- if (preg_match('/^' . preg_quote($_POST['domain'], '/') . '[\t ]+[0-9]{1,8}[\t ]+IN[\t ]+NS[\t ]+(?= $_POST['zone'] ?>
- = $matches['tag'] ?>
- = $matches['algo'] ?>
- = $matches['digest_type'] ?>
- = $matches['digest'] ?>
- = $proof ?>._domain-verification.= SERVER_NAME ?>.
lors du traitement de ce formulaire.
-
-
-' . $server . '
';
-?>
-
Domaine | -TTL | -Type | -Contenu | -' . htmlspecialchars($element) . ' | ' . LF;
- echo ' ' . LF;
- }
-
- echo '
---|
- Enregistrer un nouveau domaine sur son compte. Ce domaine doit être composé uniquement d'au moins 4 lettres latines non accentuées (a-z). -
- - diff --git a/pages/reg/transfer.php b/pages/reg/transfer.php deleted file mode 100644 index be29fcf..0000000 --- a/pages/reg/transfer.php +++ /dev/null @@ -1,44 +0,0 @@ - $_SESSION['id'], 'domain' => $domain], 'domain') !== []) - output(403, 'Le compte présent possède déjà ce domaine.'); - - exec(CONF['dns']['kdig_path'] . ' ' . $domain . ' NS @' . CONF['reg']['address'] . ' +noidn', $results); - if (preg_match('/^' . preg_quote($domain, '/') . '[\t ]+[0-9]{1,8}[\t ]+IN[\t ]+NS[\t ]+(?
- Pour prouver que vous êtes autorisé à recevoir le domaine par san possessaire actuele, ledit domaine doit posséder un = linkToDocs('ns-record', 'enregistrement NS') ?> égal à = $proof ?>._transfer-verification.= SERVER_NAME ?>.
lors du traitement de ce formulaire. Cet enregistrement sera automatiquement retiré une fois validé.
-
' . CONF['ht']['ipv6_address'] . '
.');
+
+$remoteARecords = dns_get_record($_POST['domain'], DNS_A);
+if (is_array($remoteARecords) !== true)
+ output(500, 'Erreur lors de la récupération de l\'enregistrement A.');
+if (equalArrays([CONF['ht']['ipv4_address']], array_column($remoteARecords, 'ip')) !== true)
+ output(403, 'Ce domaine doit avoir pour unique enregistrement A ' . CONF['ht']['ipv4_address'] . '
.');
+
+$remoteTXTRecords = dns_get_record($_POST['domain'], DNS_TXT);
+if (is_array($remoteTXTRecords) !== true)
+ output(500, 'Erreur lors de la récupération de l\'enregistrement TXT.');
+if (preg_match('/^' . preg_quote(SERVER_NAME, '/') . '_domain-verification=([0-9a-f]{8})-([0-9a-f]{32})$/Dm', implode(LF, array_column($remoteTXTRecords, 'txt')), $matches) !== 1)
+ output(403, 'Aucun enregistrement TXT au format correct trouvé.');
+
+checkAuthToken($matches[1], $matches[2]);
+
+rateLimit();
+
+addSite($_SESSION['id'], $_POST['dir'], $_POST['domain'], 'dns', 'http');
+
+exec('2>&1 ' . CONF['ht']['sudo_path'] . ' ' . CONF['ht']['certbot_path'] . ' certonly' . (($_SESSION['type'] === 'approved') ? '' : ' --test-cert') . ' --key-type rsa --rsa-key-size 3072 --webroot --webroot-path /srv/niver/acme --domain ' . $_POST['domain'], $output, $returnCode);
+if ($returnCode !== 0)
+ output(500, 'Certbot failed to get a Let\'s Encrypt certificate.', $output);
+
+$nginxConf = 'server {
+ listen [' . CONF['ht']['ipv6_listen_address'] . ']:' . CONF['ht']['https_port'] . ' ssl http2;
+ listen ' . CONF['ht']['ipv4_listen_address'] . ':' . CONF['ht']['https_port'] . ' ssl http2;
+ server_name ' . $_POST['domain'] . ';
+ root ' . CONF['ht']['ht_path'] . '/' . $_SESSION['id'] . '/' . $_POST['dir'] . ';
+
+ ssl_certificate /etc/letsencrypt/live/' . $_POST['domain'] . '/fullchain.pem;
+ ssl_certificate_key /etc/letsencrypt/live/' . $_POST['domain'] . '/privkey.pem;
+
+ include inc/ht-tls.conf;
+}
+';
+if (file_put_contents(CONF['ht']['nginx_config_path'] . '/' . $_POST['domain'] . '.conf', $nginxConf) === false)
+ output(500, 'Failed to write Nginx configuration.');
+
+// Reload Nginx
+exec(CONF['ht']['sudo_path'] . ' ' . CONF['ht']['nginx_reload_cmd'], result_code: $code);
+if ($code !== 0)
+ output(500, 'Failed to reload Nginx.');
+
+output(200, 'Accès HTTP par domaine ajouté sur ce dossier !');
diff --git a/pg-act/ht/add-http-onion.php b/pg-act/ht/add-http-onion.php
new file mode 100644
index 0000000..679458d
--- /dev/null
+++ b/pg-act/ht/add-http-onion.php
@@ -0,0 +1,47 @@
+dir.');
+
+rateLimit();
+
+// Add Tor config
+$torConf = 'HiddenServiceDir ' . CONF['ht']['tor_keys_path'] . '/' . $_SESSION['id'] . '/' . $_POST['dir'] . '/
+HiddenServicePort 80 [::1]:' . CONF['ht']['internal_onion_http_port'] . '
+';
+if (file_put_contents(CONF['ht']['tor_config_path'] . '/' . $_SESSION['id'] . '/' . $_POST['dir'], $torConf) === false)
+ output(500, 'Failed to write new Tor configuration.');
+
+// Reload Tor
+exec(CONF['ht']['sudo_path'] . ' ' . CONF['ht']['tor_reload_cmd'], $output, $code);
+if ($code !== 0)
+ output(500, 'Failed to reload Tor.');
+
+// Get the address generated by Tor
+exec(CONF['ht']['sudo_path'] . ' -u ' . CONF['ht']['tor_user'] . ' ' . CONF['ht']['cat_path'] . ' ' . CONF['ht']['tor_keys_path'] . '/' . $_SESSION['id'] . '/' . $_POST['dir'] . '/hostname', $output);
+$onion = $output[0];
+if (preg_match('/^[0-9a-z]{56}\.onion$/D', $onion) !== 1)
+ output(500, 'No onion address found.');
+
+// Store it in the database
+addSite($_SESSION['id'], $_POST['dir'], $onion, 'onion', 'http');
+
+// Add Nginx config
+$nginxConf = 'server {
+ listen [::1]:' . CONF['ht']['internal_onion_http_port'] . ';
+ server_name ' . $onion . ';
+ root ' . CONF['ht']['ht_path'] . '/' . $_SESSION['id'] . '/' . $_POST['dir'] . ';
+
+ include inc/ht-onion.conf;
+}
+';
+if (file_put_contents(CONF['ht']['nginx_config_path'] . '/' . $onion . '.conf', $nginxConf) === false)
+ output(500, 'Failed to write Nginx configuration.');
+
+// Reload Nginx
+exec(CONF['ht']['sudo_path'] . ' ' . CONF['ht']['nginx_reload_cmd'], result_code: $code);
+if ($code !== 0)
+ output(500, 'Failed to reload Nginx.');
+
+// Tell the user their site address
+output(200, 'L\'adresse de votre service Onion HTTP est : http://' . $onion . '/
');
diff --git a/pg-act/ht/del-http-dns.php b/pg-act/ht/del-http-dns.php
new file mode 100644
index 0000000..9664888
--- /dev/null
+++ b/pg-act/ht/del-http-dns.php
@@ -0,0 +1,8 @@
+dir.');
+
+htDeleteSite($_POST['dir'], domainType: 'dns', protocol: 'http');
+
+output(200, 'Accès retiré.');
diff --git a/pg-act/ht/del-http-onion.php b/pg-act/ht/del-http-onion.php
new file mode 100644
index 0000000..fe46a41
--- /dev/null
+++ b/pg-act/ht/del-http-onion.php
@@ -0,0 +1,8 @@
+dir.');
+
+htDeleteSite($_POST['dir'], domainType: 'onion', protocol: 'http');
+
+output(200, 'Accès retiré.');
diff --git a/pg-act/ns/caa.php b/pg-act/ns/caa.php
new file mode 100644
index 0000000..92308bc
--- /dev/null
+++ b/pg-act/ns/caa.php
@@ -0,0 +1,23 @@
+= 0 AND $_POST['flag'] <= 255))
+ output(403, 'Wrong value for flag
.');
+
+if (!(preg_match('/^[a-z]{1,127}$/D', $_POST['tag'])))
+ output(403, 'Wrong value for tag
.');
+
+if (!(preg_match('/^[a-z0-9.-]{1,255}$/D', $_POST['value'])))
+ output(403, 'Wrong value for value
.');
+
+knotcZoneExec($_POST['zone'], [
+ $values['domain'],
+ $values['ttl'],
+ 'CAA',
+ $_POST['flag'],
+ $_POST['tag'],
+ $_POST['value']
+]);
+
+output(200, 'Enregistrement ajouté/retiré.');
diff --git a/pg-act/ns/cname.php b/pg-act/ns/cname.php
new file mode 100644
index 0000000..b324839
--- /dev/null
+++ b/pg-act/ns/cname.php
@@ -0,0 +1,14 @@
+
+// Display zone
-
+$zone_content = file_get_contents(CONF['ns']['knot_zones_path'] . '/' . $_POST['zone'] . 'zone');
+if ($zone_content === false)
+ output(500, 'Unable to read zone file.');
-[A-Z]{1,16})[\t ]+.+$/D', $zone_line, $matches)) {
+ if (in_array($matches['type'], ALLOWED_TYPES, true) !== true)
continue;
- if (preg_match('/^(?:(?:[a-z0-9_-]{1,63}\.){1,127})?' . preg_quote($_POST['zone'], '/') . '[\t ]+[0-9]{1,8}[\t ]+(?Si le TTL est omis, il sera définit à secondes.
La précision de la classe (IN
) est facultative.
La zone n'est pas autorisée à dépasser = ZONE_MAX_CHARACTERS ?> caractères.
- -Les TTLs ne sont autorisés qu'entre et
secondes.
Les seuls types dont l'édition est autorisée sont :
- -' . $allowed_type . '
';
-
-?>
-lat-deg
.');
+if (!($_POST['lat-min'] >= 0 AND $_POST['lat-min'] <= 59))
+ output(403, 'Wrong value for lat-min
.');
+if (!($_POST['lat-sec'] >= 0 AND $_POST['lat-sec'] <= 59.999))
+ output(403, 'Wrong value for lat-sec
.');
+
+if ($_POST['lat-dir'] !== 'N' AND $_POST['lat-dir'] !== 'S')
+ output(403, 'Wrong value for lat-dir
.');
+
+if (!($_POST['lon-deg'] >= 0 AND $_POST['lon-deg'] <= 180))
+ output(403, 'Wrong value for lon-deg
.');
+if (!($_POST['lon-min'] >= 0 AND $_POST['lon-min'] <= 59))
+ output(403, 'Wrong value for lon-min
.');
+if (!($_POST['lon-sec'] >= 0 AND $_POST['lon-sec'] <= 59.999))
+ output(403, 'Wrong value for lon-sec
.');
+
+if ($_POST['lon-dir'] !== 'E' AND $_POST['lon-dir'] !== 'W')
+ output(403, 'Wrong value for lon-dir
.');
+
+if (!($_POST['alt'] >= -100000 AND $_POST['alt'] <= 42849672.95))
+ output(403, 'Wrong value for alt
.');
+
+if (!($_POST['size'] >= 0 AND $_POST['size'] <= 90000000))
+ output(403, 'Wrong value for size
.');
+
+if (!($_POST['hp'] >= 0 AND $_POST['hp'] <= 90000000))
+ output(403, 'Wrong value for hp
.');
+
+if (!($_POST['vp'] >= 0 AND $_POST['vp'] <= 90000000))
+ output(403, 'Wrong value for vp
.');
+
+knotcZoneExec($_POST['zone'], [
+ $values['domain'],
+ $values['ttl'],
+ 'LOC',
+ $_POST['lat-deg'],
+ $_POST['lat-min'],
+ $_POST['lat-sec'],
+ $_POST['lat-dir'],
+ $_POST['lon-deg'],
+ $_POST['lon-min'],
+ $_POST['lon-sec'],
+ $_POST['lon-dir'],
+ $_POST['alt'] . 'm',
+ $_POST['size'] . 'm',
+ $_POST['hp'] . 'm',
+ $_POST['vp'] . 'm',
+]);
+
+output(200, 'Enregistrement ajouté/retiré.');
diff --git a/pg-act/ns/mx.php b/pg-act/ns/mx.php
new file mode 100644
index 0000000..5e194e3
--- /dev/null
+++ b/pg-act/ns/mx.php
@@ -0,0 +1,18 @@
+= 0 AND $_POST['priority'] <= 255))
+ output(403, 'Wrong value for priority
.');
+
+$_POST['host'] = formatAbsoluteDomain($_POST['host']);
+
+knotcZoneExec($_POST['zone'], [
+ $values['domain'],
+ $values['ttl'],
+ 'MX',
+ $_POST['priority'],
+ $_POST['host']
+]);
+
+output(200, 'Enregistrement ajouté/retiré.');
diff --git a/pg-act/ns/ns.php b/pg-act/ns/ns.php
new file mode 100644
index 0000000..dc1c78b
--- /dev/null
+++ b/pg-act/ns/ns.php
@@ -0,0 +1,14 @@
+[0-9]{1,5})[\t ]+(?print
method.');
+
diff --git a/pg-act/ns/srv.php b/pg-act/ns/srv.php
new file mode 100644
index 0000000..33382ea
--- /dev/null
+++ b/pg-act/ns/srv.php
@@ -0,0 +1,26 @@
+= 0 AND $_POST['priority'] <= 65535))
+ output(403, 'Wrong value for priority
.');
+
+if (!($_POST['weight'] >= 0 AND $_POST['weight'] <= 65535))
+ output(403, 'Wrong value for weight
.');
+
+if (!($_POST['port'] >= 0 AND $_POST['port'] <= 65535))
+ output(403, 'Wrong value for port
.');
+
+$_POST['target'] = formatAbsoluteDomain($_POST['target']);
+
+knotcZoneExec($_POST['zone'], [
+ $values['domain'],
+ $values['ttl'],
+ 'SRV',
+ $_POST['priority'],
+ $_POST['weight'],
+ $_POST['port'],
+ $_POST['target']
+]);
+
+output(200, 'Enregistrement ajouté/retiré.');
diff --git a/pg-act/ns/sshfp.php b/pg-act/ns/sshfp.php
new file mode 100644
index 0000000..cab87f1
--- /dev/null
+++ b/pg-act/ns/sshfp.php
@@ -0,0 +1,23 @@
+algo.');
+
+if (!($_POST['type'] === '2'))
+ output(403, 'Wrong value for type
.');
+
+if (!(preg_match('/^[a-z0-9]{64}$/D', $_POST['fp'])))
+ output(403, 'Wrong value for fp
.');
+
+knotcZoneExec($_POST['zone'], [
+ $values['domain'],
+ $values['ttl'],
+ 'SSHFP',
+ $_POST['algo'],
+ $_POST['type'],
+ $_POST['fp']
+]);
+
+output(200, 'Enregistrement ajouté/retiré.');
diff --git a/pg-act/ns/tlsa.php b/pg-act/ns/tlsa.php
new file mode 100644
index 0000000..3db5e06
--- /dev/null
+++ b/pg-act/ns/tlsa.php
@@ -0,0 +1,27 @@
+= 0 AND $_POST['use'] <= 3))
+ output(403, 'Wrong value for use
.');
+
+if (!($_POST['selector'] === '0' OR $_POST['selector'] === '1'))
+ output(403, 'Wrong value for selector
.');
+
+if (!($_POST['type'] >= 0 AND $_POST['type'] <= 2))
+ output(403, 'Wrong value for type
.');
+
+if (!(preg_match('/^[a-zA-Z0-9.-]{1,1024}$/D', $_POST['content'])))
+ output(403, 'Wrong value for content
.');
+
+knotcZoneExec($_POST['zone'], [
+ $values['domain'],
+ $values['ttl'],
+ 'TLSA',
+ $_POST['use'],
+ $_POST['selector'],
+ $_POST['type'],
+ $_POST['content']
+]);
+
+output(200, 'Enregistrement ajouté/retiré.');
diff --git a/pg-act/ns/txt.php b/pg-act/ns/txt.php
new file mode 100644
index 0000000..c35ea8a
--- /dev/null
+++ b/pg-act/ns/txt.php
@@ -0,0 +1,15 @@
+txt.');
+
+knotcZoneExec($_POST['zone'], [
+ $values['domain'],
+ $values['ttl'],
+ 'TXT',
+ '"' . $_POST['txt'] . '"'
+]);
+
+output(200, 'Enregistrement ajouté/retiré.');
diff --git a/pg-act/ns/zone-add.php b/pg-act/ns/zone-add.php
new file mode 100644
index 0000000..377d9ce
--- /dev/null
+++ b/pg-act/ns/zone-add.php
@@ -0,0 +1,52 @@
+ $_POST['domain']], 'zone') !== [])
+ output(403, 'Cette zone existe déjà sur ce service.');
+
+exec(CONF['dns']['kdig_path'] . ' ' . ltrim(strstr($_POST['domain'], '.'), '.') . ' NS +short', $parentAuthoritatives);
+if ($parentAuthoritatives === [])
+ output(403, 'Serveurs de noms de la zone parente introuvables');
+foreach ($parentAuthoritatives as $parentAuthoritative)
+ checkAbsoluteDomainFormat($parentAuthoritative);
+
+exec(CONF['dns']['kdig_path'] . ' ' . $_POST['domain'] . ' NS @' . $parentAuthoritatives[0] . ' +noidn', $results);
+if (preg_match('/^' . preg_quote($_POST['domain'], '/') . '[\t ]+[0-9]{1,8}[\t ]+IN[\t ]+NS[\t ]+(?keytag
.');
+
+if ($_POST['dt'] !== '2' AND $_POST['dt'] !== '4')
+ output(403, 'Wrong value for dt
.');
+
+regCheckDomainPossession($_POST['zone']);
+
+knotcZoneExec(CONF['reg']['registry'], [
+ $_POST['zone'],
+ CONF['reg']['ttl'],
+ 'DS',
+ $_POST['keytag'],
+ $_POST['algo'],
+ $_POST['dt'],
+ $_POST['key']
+]);
+
+output(200, 'Enregistrement ajouté/retiré.');
diff --git a/pg-act/reg/glue.php b/pg-act/reg/glue.php
new file mode 100644
index 0000000..90bf8e9
--- /dev/null
+++ b/pg-act/reg/glue.php
@@ -0,0 +1,16 @@
+ $domain], 'domain') !== [])
+ output(403, 'Ce domaine n\'est pas disponible à l\'enregistrement. Il est déjà enregistré.');
+
+if (in_array($_POST['subdomain'], explode(LF, file_get_contents(CONF['common']['root_path'] . '/pg-act/reg/reserved.txt'))))
+ output(403, 'Ce domaine n\'est pas disponible à l\'enregistrement. Il est réservé.');
+
+rateLimit();
+
+insert('registry', [
+ 'domain' => $domain,
+ 'username' => $_SESSION['id'],
+ 'last_renewal' => date('Y-m-d H:i:s'),
+]);
+
+output(200, 'Domaine ajouté au registre.');
diff --git a/pages/reg/reserved.txt b/pg-act/reg/reserved.txt
similarity index 100%
rename from pages/reg/reserved.txt
rename to pg-act/reg/reserved.txt
diff --git a/pg-act/reg/transfer.php b/pg-act/reg/transfer.php
new file mode 100644
index 0000000..6fca77f
--- /dev/null
+++ b/pg-act/reg/transfer.php
@@ -0,0 +1,26 @@
+ $_SESSION['id'], 'domain' => $domain], 'domain') !== [])
+ output(403, 'Le compte présent possède déjà ce domaine.');
+
+exec(CONF['dns']['kdig_path'] . ' ' . $domain . ' NS @' . CONF['reg']['address'] . ' +noidn', $results);
+if (preg_match('/^' . preg_quote($domain, '/') . '[\t ]+[0-9]{1,8}[\t ]+IN[\t ]+NS[\t ]+(?Pas de compte ? En créer un
+ + diff --git a/pg-view/auth/logout.php b/pg-view/auth/logout.php new file mode 100644 index 0000000..bf11e4b --- /dev/null +++ b/pg-view/auth/logout.php @@ -0,0 +1,3 @@ + -Vous pouvez ici changer la clé de passe permettant d'accéder à votre compte Niver.
diff --git a/pg-view/auth/register.php b/pg-view/auth/register.php new file mode 100644 index 0000000..99e8882 --- /dev/null +++ b/pg-view/auth/register.php @@ -0,0 +1,17 @@ +Déjà un compte ? Se connecter
+ + diff --git a/pg-view/auth/unregister.php b/pg-view/auth/unregister.php new file mode 100644 index 0000000..3bfe7be --- /dev/null +++ b/pg-view/auth/unregister.php @@ -0,0 +1,17 @@ ++ Cette action supprimera toutes les données appartenant à ce compte, y compris : +
+ ++ Vous pouvez ici changer l'identifiant permettant d'accéder à votre compte Niver. +
+ + diff --git a/pg-view/ht/add-http-dns.php b/pg-view/ht/add-http-dns.php new file mode 100644 index 0000000..43c3fcb --- /dev/null +++ b/pg-view/ht/add-http-dns.php @@ -0,0 +1,45 @@ + + ++ Ajouter sur un dossier de site un accès = linkToDocs('http', 'HTTP') ?> par = linkToDocs('dns', 'DNS') ?> et = linkToDocs('tls', 'TLS') ?> = linkToDocs('ca', 'authentifié par Let\'s Encrypt') ?>. +
+ ++ La présence des enregistrements ci-après sera vérifiée lors du traitement de ce formulaire. +
+ +AAAA
= CONF['ht']['ipv6_address'] ?>
+ A
= CONF['ht']['ipv4_address'] ?>
+ TXT
= SERVER_NAME ?>_domain-verification== $proof ?>
+ + Ajouter un accès en .onion sur un dossier +
+ + diff --git a/pages/ht/del-http-dns.php b/pg-view/ht/del-http-dns.php similarity index 62% rename from pages/ht/del-http-dns.php rename to pg-view/ht/del-http-dns.php index 0daa33d..ea45e49 100644 --- a/pages/ht/del-http-dns.php +++ b/pg-view/ht/del-http-dns.php @@ -1,15 +1,6 @@ dir.'); - - htDeleteSite($_POST['dir'], domainType: 'dns', protocol: 'http'); - - output(200, 'Accès retiré.'); -} - -$dirsStatuses = dirsStatuses('onion', 'http'); +$dirsStatuses = dirsStatuses('dns', 'http'); ?> diff --git a/pages/ht/del-http-onion.php b/pg-view/ht/del-http-onion.php similarity index 67% rename from pages/ht/del-http-onion.php rename to pg-view/ht/del-http-onion.php index 3f1b9a6..031bfd3 100644 --- a/pages/ht/del-http-onion.php +++ b/pg-view/ht/del-http-onion.php @@ -1,14 +1,5 @@ dir.'); - - htDeleteSite($_POST['dir'], domainType: 'onion', protocol: 'http'); - - output(200, 'Accès retiré.'); -} - $dirsStatuses = dirsStatuses('onion', 'http'); ?> diff --git a/pages/ht/index.php b/pg-view/ht/index.php similarity index 100% rename from pages/ht/index.php rename to pg-view/ht/index.php diff --git a/pages/index.php b/pg-view/index.php similarity index 100% rename from pages/index.php rename to pg-view/index.php diff --git a/pages/ns/caa.php b/pg-view/ns/caa.php similarity index 52% rename from pages/ns/caa.php rename to pg-view/ns/caa.php index b78fa8b..ba1be35 100644 --- a/pages/ns/caa.php +++ b/pg-view/ns/caa.php @@ -1,31 +1,3 @@ -= 0 AND $_POST['flag'] <= 255)) - output(403, 'Wrong value forflag
.');
-
- if (!(preg_match('/^[a-z]{1,127}$/D', $_POST['tag'])))
- output(403, 'Wrong value for tag
.');
-
- if (!(preg_match('/^[a-z0-9.-]{1,255}$/D', $_POST['value'])))
- output(403, 'Wrong value for value
.');
-
- knotcZoneExec($_POST['zone'], array(
- $values['domain'],
- $values['ttl'],
- 'CAA',
- $_POST['flag'],
- $_POST['tag'],
- $_POST['value']
- ));
-
- output(200, 'Enregistrement ajouté/retiré.');
-}
-
-?>
-
= linkToDocs('record-caa', 'Documentation du type d\'enregistrement CAA') ?>
diff --git a/pages/ns/cname.php b/pg-view/ns/cname.php similarity index 53% rename from pages/ns/cname.php rename to pg-view/ns/cname.php index 8a7963b..38b9708 100644 --- a/pages/ns/cname.php +++ b/pg-view/ns/cname.php @@ -1,22 +1,3 @@ - -= linkToDocs('record-cname', 'Documentation du type d\'enregistrement CNAME') ?>
diff --git a/pages/ns/dname.php b/pg-view/ns/dname.php similarity index 54% rename from pages/ns/dname.php rename to pg-view/ns/dname.php index 680224e..e12a075 100644 --- a/pages/ns/dname.php +++ b/pg-view/ns/dname.php @@ -1,22 +1,3 @@ - -= linkToDocs('record-dname', 'Documentation du type d\'enregistrement DNAME') ?>
diff --git a/pg-view/ns/edit.php b/pg-view/ns/edit.php new file mode 100644 index 0000000..44d72a4 --- /dev/null +++ b/pg-view/ns/edit.php @@ -0,0 +1,58 @@ + + + + + + + +Si le TTL est omis, il sera définit à secondes.
La précision de la classe (IN
) est facultative.
La zone n'est pas autorisée à dépasser = ZONE_MAX_CHARACTERS ?> caractères.
+ +Les TTLs ne sont autorisés qu'entre et
secondes.
Les seuls types dont l'édition est autorisée sont :
+ +' . $allowed_type . '
';
+
+?>
+= linkToDocs('record-ip', 'Documentation des types d\'enregistrements A et AAAA') ?>
diff --git a/pages/ns/loc.php b/pg-view/ns/loc.php similarity index 51% rename from pages/ns/loc.php rename to pg-view/ns/loc.php index d5913d2..bb22951 100644 --- a/pages/ns/loc.php +++ b/pg-view/ns/loc.php @@ -1,78 +1,3 @@ -= 0 AND $_POST['lat-deg'] <= 90)) - output(403, 'Wrong value forlat-deg
.');
- if (!($_POST['lat-min'] >= 0 AND $_POST['lat-min'] <= 59))
- output(403, 'Wrong value for lat-min
.');
- if (!($_POST['lat-sec'] >= 0 AND $_POST['lat-sec'] <= 59.999))
- output(403, 'Wrong value for lat-sec
.');
-
- if ($_POST['lat-dir'] !== 'N' AND $_POST['lat-dir'] !== 'S')
- output(403, 'Wrong value for lat-dir
.');
-
- if (!($_POST['lon-deg'] >= 0 AND $_POST['lon-deg'] <= 180))
- output(403, 'Wrong value for lon-deg
.');
- if (!($_POST['lon-min'] >= 0 AND $_POST['lon-min'] <= 59))
- output(403, 'Wrong value for lon-min
.');
- if (!($_POST['lon-sec'] >= 0 AND $_POST['lon-sec'] <= 59.999))
- output(403, 'Wrong value for lon-sec
.');
-
- if ($_POST['lon-dir'] !== 'E' AND $_POST['lon-dir'] !== 'W')
- output(403, 'Wrong value for lon-dir
.');
-
- if (!($_POST['alt'] >= -100000 AND $_POST['alt'] <= 42849672.95))
- output(403, 'Wrong value for alt
.');
-
- if (!($_POST['size'] >= 0 AND $_POST['size'] <= 90000000))
- output(403, 'Wrong value for size
.');
-
- if (!($_POST['hp'] >= 0 AND $_POST['hp'] <= 90000000))
- output(403, 'Wrong value for hp
.');
-
- if (!($_POST['vp'] >= 0 AND $_POST['vp'] <= 90000000))
- output(403, 'Wrong value for vp
.');
-
- knotcZoneExec($_POST['zone'], array(
- $values['domain'],
- $values['ttl'],
- 'LOC',
- $_POST['lat-deg'],
- $_POST['lat-min'],
- $_POST['lat-sec'],
- $_POST['lat-dir'],
- $_POST['lon-deg'],
- $_POST['lon-min'],
- $_POST['lon-sec'],
- $_POST['lon-dir'],
- $_POST['alt'] . 'm',
- $_POST['size'] . 'm',
- $_POST['hp'] . 'm',
- $_POST['vp'] . 'm',
- ));
-
- output(200, 'Enregistrement ajouté/retiré.');
-}
-
-?>
-
= linkToDocs('record-loc', 'Documentation du type d\'enregistrement LOC') ?>
diff --git a/pages/ns/mx.php b/pg-view/ns/mx.php similarity index 52% rename from pages/ns/mx.php rename to pg-view/ns/mx.php index 139fbba..66c0d2b 100644 --- a/pages/ns/mx.php +++ b/pg-view/ns/mx.php @@ -1,26 +1,3 @@ -= 0 AND $_POST['priority'] <= 255)) - output(403, 'Wrong value forpriority
.');
-
- $_POST['host'] = formatAbsoluteDomain($_POST['host']);
-
- knotcZoneExec($_POST['zone'], array(
- $values['domain'],
- $values['ttl'],
- 'MX',
- $_POST['priority'],
- $_POST['host']
- ));
-
- output(200, 'Enregistrement ajouté/retiré.');
-}
-
-?>
-
= linkToDocs('record-mx', 'Documentation du type d\'enregistrement MX') ?>
diff --git a/pages/ns/ns.php b/pg-view/ns/ns.php similarity index 53% rename from pages/ns/ns.php rename to pg-view/ns/ns.php index c8ffe3f..26ab0aa 100644 --- a/pages/ns/ns.php +++ b/pg-view/ns/ns.php @@ -1,22 +1,3 @@ - -= linkToDocs('record-ns', 'Documentation du type d\'enregistrement NS') ?>
diff --git a/pg-view/ns/print.php b/pg-view/ns/print.php new file mode 100644 index 0000000..05b8857 --- /dev/null +++ b/pg-view/ns/print.php @@ -0,0 +1,77 @@ + + + +' . htmlspecialchars($data['zone-raw']) . ''; + +if (isset($data['zone-table'])) { ?> + +Domaine | +TTL | +Type | +Contenu | +' . htmlspecialchars($element) . ' | ' . LF;
+ echo ' ' . LF;
+ }
+}
+?>
+
---|
= $_POST['zone'] ?>
+ = $data['zone-ds']['tag'] ?>
+ = $data['zone-ds']['algo'] ?>
= ($data['zone-ds']['algo'] === '15') ? ' (Ed25519)' : '' ?>
+ = $data['zone-ds']['digest_type'] ?>
= ($data['zone-ds']['digest_type'] === '2') ? ' (SHA-256)' : '' ?>
+ = $data['zone-ds']['digest'] ?>
+ priority
.');
-
- if (!($_POST['weight'] >= 0 AND $_POST['weight'] <= 65535))
- output(403, 'Wrong value for weight
.');
-
- if (!($_POST['port'] >= 0 AND $_POST['port'] <= 65535))
- output(403, 'Wrong value for port
.');
-
- $_POST['target'] = formatAbsoluteDomain($_POST['target']);
-
- knotcZoneExec($_POST['zone'], array(
- $values['domain'],
- $values['ttl'],
- 'SRV',
- $_POST['priority'],
- $_POST['weight'],
- $_POST['port'],
- $_POST['target']
- ));
-
- output(200, 'Enregistrement ajouté/retiré.');
-}
-
-?>
-
= linkToDocs('record-srv', 'Documentation du type d\'enregistrement SRV') ?>
diff --git a/pages/ns/sshfp.php b/pg-view/ns/sshfp.php similarity index 60% rename from pages/ns/sshfp.php rename to pg-view/ns/sshfp.php index 9eb48b0..4045651 100644 --- a/pages/ns/sshfp.php +++ b/pg-view/ns/sshfp.php @@ -1,31 +1,3 @@ -algo.'); - - if (!($_POST['type'] === '2')) - output(403, 'Wrong value fortype
.');
-
- if (!(preg_match('/^[a-z0-9]{64}$/D', $_POST['fp'])))
- output(403, 'Wrong value for fp
.');
-
- knotcZoneExec($_POST['zone'], array(
- $values['domain'],
- $values['ttl'],
- 'SSHFP',
- $_POST['algo'],
- $_POST['type'],
- $_POST['fp']
- ));
-
- output(200, 'Enregistrement ajouté/retiré.');
-}
-
-?>
-
= linkToDocs('record-sshfp', 'Documentation du type d\'enregistrement SSHFP') ?>
diff --git a/pages/ns/tlsa.php b/pg-view/ns/tlsa.php similarity index 67% rename from pages/ns/tlsa.php rename to pg-view/ns/tlsa.php index eed1630..dc591bd 100644 --- a/pages/ns/tlsa.php +++ b/pg-view/ns/tlsa.php @@ -1,35 +1,3 @@ -= 0 AND $_POST['use'] <= 3)) - output(403, 'Wrong value foruse
.');
-
- if (!($_POST['selector'] === '0' OR $_POST['selector'] === '1'))
- output(403, 'Wrong value for selector
.');
-
- if (!($_POST['type'] >= 0 AND $_POST['type'] <= 2))
- output(403, 'Wrong value for type
.');
-
- if (!(preg_match('/^[a-zA-Z0-9.-]{1,1024}$/D', $_POST['content'])))
- output(403, 'Wrong value for content
.');
-
- knotcZoneExec($_POST['zone'], array(
- $values['domain'],
- $values['ttl'],
- 'TLSA',
- $_POST['use'],
- $_POST['selector'],
- $_POST['type'],
- $_POST['content']
- ));
-
- output(200, 'Enregistrement ajouté/retiré.');
-}
-
-?>
-
= linkToDocs('record-tlsa', 'Documentation du type d\'enregistrement TLSA') ?>
diff --git a/pages/ns/txt.php b/pg-view/ns/txt.php similarity index 50% rename from pages/ns/txt.php rename to pg-view/ns/txt.php index b33ba6c..a023d57 100644 --- a/pages/ns/txt.php +++ b/pg-view/ns/txt.php @@ -1,23 +1,3 @@ -txt.'); - - knotcZoneExec($_POST['zone'], array( - $values['domain'], - $values['ttl'], - 'TXT', - '"' . $_POST['txt'] . '"' - )); - - output(200, 'Enregistrement ajouté/retiré.'); -} - -?> -= linkToDocs('record-txt', 'Documentation du type d\'enregistrement TXT') ?>
diff --git a/pg-view/ns/zone-add.php b/pg-view/ns/zone-add.php new file mode 100644 index 0000000..d764748 --- /dev/null +++ b/pg-view/ns/zone-add.php @@ -0,0 +1,19 @@ +
+ Pour prouver que vous possédez bien ce domaine, il doit posséder un = linkToDocs('ns-record', 'enregistrement NS') ?> égal à = $proof ?>._domain-verification.= SERVER_NAME ?>.
lors du traitement de ce formulaire.
+
+ La zone sera servie par ces serveurs de noms : +
' . $server . '
';
+?>
+ keytag
.');
-
- if ($_POST['dt'] !== '2' AND $_POST['dt'] !== '4')
- output(403, 'Wrong value for dt
.');
-
- regCheckDomainPossession($_POST['zone']);
-
- $action = checkAction($_POST['action']);
-
- knotcZoneExec(CONF['reg']['registry'], array(
- $_POST['zone'],
- CONF['reg']['ttl'],
- 'DS',
- $_POST['keytag'],
- $_POST['algo'],
- $_POST['dt'],
- $_POST['key']
- ));
-
- output(200, 'Enregistrement ajouté/retiré.');
-}
-
-?>
-
Ici vous pouvez indiquer au registre l'enregistrement DS d'une zone afin de permettre de déléguer la confiance = linkToDocs('dnssec', 'DNSSEC') ?>.
@@ -56,7 +14,7 @@ if (processForm()) { diff --git a/pages/reg/glue.php b/pg-view/reg/glue.php similarity index 64% rename from pages/reg/glue.php rename to pg-view/reg/glue.php index 32bd72e..26affe5 100644 --- a/pages/reg/glue.php +++ b/pg-view/reg/glue.php @@ -1,24 +1,3 @@ - -= linkToDocs('glue-record', 'Documentation sur le glue record'); ?>
@@ -42,9 +21,8 @@ if (processForm()) { diff --git a/pages/reg/index.php b/pg-view/reg/index.php similarity index 100% rename from pages/reg/index.php rename to pg-view/reg/index.php diff --git a/pages/reg/ns.php b/pg-view/reg/ns.php similarity index 57% rename from pages/reg/ns.php rename to pg-view/reg/ns.php index d19fe94..708a2a9 100644 --- a/pages/reg/ns.php +++ b/pg-view/reg/ns.php @@ -1,21 +1,3 @@ - -= linkToDocs('record-ns', 'Documentation du type d\'enregistrement NS') ?>
@@ -32,9 +14,8 @@ if (processForm()) {Domaine | +TTL | +Type | +Contenu | +' . htmlspecialchars($element) . ' | ' . LF;
+ echo ' ' . LF;
+ }
+}
+
+?>
+
---|
+ Enregistrer un nouveau domaine sur son compte. Ce domaine doit être composé uniquement d'au moins 4 lettres latines non accentuées (a-z). +
+ + diff --git a/pg-view/reg/reserved.txt b/pg-view/reg/reserved.txt new file mode 100644 index 0000000..bfbb72f --- /dev/null +++ b/pg-view/reg/reserved.txt @@ -0,0 +1,242 @@ +# List of subdomains not available to register +# +# They may be forbidden because: +# - they may be privileged for impersonating Niver, spamming or fishing +# - they are reserved for a project asking for it and deserving such a well-known name + +niver + +# Registry-related +nic +domain +domains +reg +registry + +# Special subdomains +autoconfig +autodiscover + +# Special TLDs +example +invalid +test +local +localhost +onion + +# Standard-related +ns0 +ns1 +ns2 +ns3 +ns4 +ns5 +ns6 +ns7 +ns8 +ns9 +dns +dns0 +dns1 +dns2 +dns3 +dns4 +dns5 +dns6 +dns7 +dns8 +dns9 +www +wwww +www0 +www1 +www2 +www3 +www4 +www5 +www6 +www7 +www8 +www9 +srv +srv0 +srv1 +srv2 +srv3 +srv4 +srv5 +srv6 +srv7 +srv8 +srv9 +ssh +sftp +http +https +ssl +tls +mtx +matrix +gmi +gemini +ftp +ftps +mx +imap +imaps +smtp +smtps +pop +xmpp +fedi +html +rss +ipv4 +ipv6 + +# Prevent account fishing +account +accounts +register +profile +signup +login +auth +authenticate +connect + +# Commercial +com +free +trial +ads +bank +banks +business +customer +customers +store +stores +shop +shops +job +jobs +marketing +sales + +# Miscellaneous +org +net +com +gov +gouv +edu +api +cdn +support +admin +web +dev +host +portal +beta +alpha +demo +vpn +temp +root +data +stats +chat +about +remote +portal +boost +core +learn +community +meta +news +public +online +join +mobile +tech +space +zone +name +access +search +static +secure +security +bbs +help +info +code +doc +docs +server +servers +client +clients +mail +mails +email +emails +webmail +site +sites +website +websites +blog +blogs +gemlog +gemlogs +capsule +capsules +source +sources +update +updates +forum +forums +service +services +ressource +ressources +image +images +video +videos +radio +radios +music +map +maps +app +apps +dev +devs +developer +developers +social +cloud +clouds +network +networks +survey +surveys +build +builds +upload +uploads +download +downloads +content +contents +drive +drives +home +homes diff --git a/pg-view/reg/transfer.php b/pg-view/reg/transfer.php new file mode 100644 index 0000000..38edb15 --- /dev/null +++ b/pg-view/reg/transfer.php @@ -0,0 +1,11 @@ +
+ Pour prouver que vous êtes autorisé à recevoir le domaine par san possessaire actuele, ledit domaine doit posséder un = linkToDocs('ns-record', 'enregistrement NS') ?> égal à = getAuthToken() ?>._transfer-verification.= SERVER_NAME ?>.
lors du traitement de ce formulaire. Cet enregistrement sera automatiquement retiré une fois validé.
+
Ceci désenregistrera le domaine, et le rendra ainsi à nouveau disponible à l'enregistrement par n'importe qui.
@@ -20,9 +8,8 @@ if (processForm()) {- - = ($_SESSION['type'] === 'approved') ? '👤 ' : '⏳ ' ?>= $_SESSION['display-username'] ?> Se déconnecter - - Anonyme Se connecter - -
- -+ + = ($_SESSION['type'] === 'approved') ? '👤 ' : '⏳ ' ?>= $_SESSION['display-username'] ?> Se déconnecter + + Anonyme Se connecter + +
+ +