zone-add.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. if (processForm()) {
  3. $_POST['domain'] = formatAbsoluteDomain($_POST['domain']);
  4. if (query('select', 'zones', ['zone' => $_POST['domain']], 'zone') !== [])
  5. output(403, 'Cette zone existe déjà sur ce service.');
  6. exec(CONF['ns']['kdig_path'] . ' ' . ltrim(strstr($_POST['domain'], '.'), '.') . ' NS +short', $parentAuthoritatives);
  7. if ($parentAuthoritatives === [])
  8. output(403, 'Serveurs de noms de la zone parente introuvables');
  9. foreach ($parentAuthoritatives as $parentAuthoritative)
  10. checkAbsoluteDomainFormat($parentAuthoritative);
  11. exec(CONF['ns']['kdig_path'] . ' ' . $_POST['domain'] . ' NS @' . $parentAuthoritatives[0] . ' +noidn', $results);
  12. if (preg_match('/^' . preg_quote($_POST['domain'], '/') . '[\t ]+[0-9]{1,8}[\t ]+IN[\t ]+NS[\t ]+(?<salt>[0-9a-f]{8})-(?<hash>[0-9a-f]{32})\.auth-owner.+$/m', implode(LF, $results), $matches) !== 1)
  13. output(403, 'Enregistrement d\'authentification introuvable');
  14. checkAuthToken($matches['salt'], $matches['hash']);
  15. rateLimit();
  16. insert('zones', [
  17. 'zone' => $_POST['domain'],
  18. 'username' => $_SESSION['username'],
  19. ]);
  20. $knotZonePath = CONF['ns']['knot_zones_path'] . '/' . $_POST['domain'] . 'zone';
  21. $knotZone = implode(' ', [
  22. $_POST['domain'],
  23. SOA_VALUES['ttl'],
  24. 'SOA',
  25. CONF['ns']['servers'][0],
  26. SOA_VALUES['email'],
  27. 1,
  28. SOA_VALUES['refresh'],
  29. SOA_VALUES['retry'],
  30. SOA_VALUES['expire'],
  31. SOA_VALUES['negative'],
  32. ]) . LF;
  33. foreach (CONF['ns']['servers'] as $server)
  34. $knotZone .= $_POST['domain'] . ' 86400 NS ' . $server . LF;
  35. if (is_int(file_put_contents($knotZonePath, $knotZone)) !== true)
  36. output(500, 'Failed to write new zone file.');
  37. if (chmod($knotZonePath, 0660) !== true)
  38. output(500, 'Failed to chmod new zone file.');
  39. knotcConfExec([
  40. "set 'zone[" . $_POST['domain'] . "]'",
  41. "set 'zone[" . $_POST['domain'] . "].template' 'niver'",
  42. ]);
  43. output(200, 'La zone a été créée.');
  44. }
  45. $proof = getAuthToken();
  46. ?>
  47. <p>
  48. Le domaine doit avoir un <?= linkToDocs('ns-record', 'enregistrement NS') ?> qui commence par <code><?= $proof ?>.auth-owner</code> lors du traitement de ce formulaire.
  49. </p>
  50. <p>
  51. La zone sera servie par ces serveurs de noms :
  52. <ul>
  53. <?php
  54. foreach (CONF['ns']['servers'] as $server)
  55. echo ' <li><code>' . $server . '</code></li>';
  56. ?>
  57. </ul>
  58. </p>
  59. <form method="post">
  60. <label for="domain">Domaine</label><br>
  61. <input required="" placeholder="domain.<?= PLACEHOLDER_DOMAIN ?>." id="domain" name="domain" type="text"><br>
  62. <input value="Ajouter" type="submit">
  63. </form>