diff options
| author | Luke Bratch <luke@bratch.co.uk> | 2025-12-28 01:46:05 +0000 |
|---|---|---|
| committer | Luke Bratch <luke@bratch.co.uk> | 2025-12-28 01:46:05 +0000 |
| commit | 16c2130e0b562f2452e5f2aa4e48e9e7345c22e8 (patch) | |
| tree | c6c97ef1ef88b6512267aea9df52802b540a7cd4 | |
| parent | 3ff65d3ee9458b9ae961547a649e94c407e23333 (diff) | |
Add support for updating TXT records.
| -rw-r--r-- | dns.php | 68 |
1 files changed, 65 insertions, 3 deletions
@@ -212,6 +212,63 @@ if (isset($_GET['mode']) && isset($_GET['zone']) && isset($_GET['hash'])) { writezone($_GET['zone'], $newzonetext); echo "<p>record(s) updated :)</p>"; } + + } else if ($_GET['mode'] == "txt" && isset($_POST['record'])) { + $zonetext = getzone($_GET['zone']); + // Only use \n for newlines + $zonetext = str_replace("\r", "", $zonetext); + // Split into individual lines + $zonelines = explode("\n", $zonetext); + $matches = array(); + // Find lines that ended with the hash provided (if any) + $i = 0; + foreach ($zonelines as $line) { + if (preg_match("/^[^;].*;.*" . $_GET['hash'] . "$/", $line)) { + array_push($matches, array($i, $line)); + } + $i++; + } + + // Go through the lines that matched the hash and see if we can find an update to do + foreach ($matches as $arrline) { + $line = $arrline[1]; + // Get rid of the comment + $exploded = explode(";", $line); + $record = $exploded[0]; + // Split into individual components + $parts = preg_split("/\s+/", $record); + // Make sure the last element isn't blank (would happen if the comment had a space before it) + while ($parts[sizeof($parts) - 1] == "") { + array_pop($parts); + } + + $parts[sizeof($parts) - 1] = $_POST['record']; + + // Update original zone file array with the new line at the correct position + $zonelines[$arrline[0]] = preg_replace('/((TXT|txt)\s+)[^;]+(;.*)/', "$1" . $parts[sizeof($parts) - 1] . " $3", $line); + } + + // Next we need to turn the zone file array back into a string again + $newzonetext = ""; + // If the last element was blank, remove it since we'll add a new blank ourselves + if ($zonelines[sizeof($zonelines) - 1] == "") { + array_pop($zonelines); + } + // Do the actual converstion to string + foreach ($zonelines as $line) { + $newzonetext .= $line . "\n"; + } + // See if there was actually a change as a result of this request... + if ($zonetext == $newzonetext) { + // ...if not, abandon ship + echo "<p>no changes detected :)</p>"; + } else { + // ...if so, increment the serial number and... + $newzonetext = incrementserial($newzonetext)[0]; + // ...finally write the zone with the updated record(s) + writezone($_GET['zone'], $newzonetext); + echo "<p>record(s) updated :)</p>"; + } } } else if (isset($_POST['domain']) && isset($_POST['password']) && !isset($_POST['zonetext'])) { if (!preg_match('/^[0-9A-Za-z\.\-]*$/', $_POST['domain'])) { @@ -224,14 +281,19 @@ if (isset($_GET['mode']) && isset($_GET['zone']) && isset($_GET['hash'])) { ?> <p>1. Your zonefile is below.</p> <p>2. Ensure the first line always ends with a SHA-256 hash of your chosen password.</p> - <p>3. To automatically update a particular record, give the line a comment ending with a secret ID (e.g. a SHA-256 hash), e.g.:</p> + <p>3. To automatically update a particular A or AAAA record with the source IP address of your request, give the line a comment ending with a secret ID (e.g. a SHA-256 hash), e.g.:</p> <pre> test 300 IN A 192.168.0.1 ; sha256 = 7f480e744a79953eb916b68f540e0eeec6f9cf23edf4aa08cc1cdf5f077c0f6f test 300 IN AAAA ::1 ; sha256 = b493d48364afe44d11c0165cf470a4164d1e2609911ef998be868d46ade3de4e </pre> - <p>And then do an HTTP(S) request to:</p> + <p>Then do an HTTP(S) GET request to:</p> <pre>https://bladns.net/dns.php?mode=update&zone=<strong>yourdomain.tld</strong>&hash=<strong>yourid</strong></pre> - <p>Your record will be updated with the IP you did the request from.</p> + <p>Your record will be updated with the IP address you did the request from.</p> + <p>4. To update a TXT record, do an HTTP(S) POST request to:</p> + <pre>https://bladns.net/dns.php?mode=txt&zone=<strong>yourdomain.tld</strong>&hash=<strong>yourid</strong></pre> + <p>Include a POST value named "record" containing the text you would like in the TXT record. Example cURL:</p> + <pre>curl "https://bladns.net/dns.php?mode=txt&zone=<strong>yourdomain.tld</strong>&hash=<strong>yourid</strong>" --data-raw 'record="foo bar baz"'</pre> + <p></p> <form action="dns.php" method="post"> <textarea rows="24" cols="80" name="zonetext" autofocus><?php echo $zonefile; ?></textarea><br> <?php |
