From db0e977c5701b44fc461b87ded05e64e1c33c245 Mon Sep 17 00:00:00 2001 From: Andreas Venizelou Date: Mon, 19 Aug 2024 11:14:50 +0300 Subject: [PATCH] DNS, record type label --- Protest/Front/about.js | 2 +- Protest/Front/backup.js | 2 +- Protest/Front/certificates.js | 4 ++-- Protest/Front/deviceview.js | 2 +- Protest/Front/dns-sd.js | 2 +- Protest/Front/documentation.js | 2 +- Protest/Front/encoder.js | 4 ++-- Protest/Front/hexviewer.css | 12 ++++++++++++ Protest/Front/hexviewer.js | 36 ++++++++++++++++++++++++++++------ Protest/Front/mictester.js | 2 +- Protest/Front/ui.js | 34 +++++++++++++++++++++++++++++++- Protest/Misc/Data.cs | 17 ++++++++++++++++ Protest/Protocols/Dns.cs | 2 +- Protest/Protocols/Mdns.cs | 4 ++-- Protest/Workers/Fetch.cs | 2 +- 15 files changed, 106 insertions(+), 21 deletions(-) diff --git a/Protest/Front/about.js b/Protest/Front/about.js index ad0ee33b..758205f3 100644 --- a/Protest/Front/about.js +++ b/Protest/Front/about.js @@ -404,7 +404,7 @@ class About extends Tabs { } const formData = new FormData(); - formData.append('file', file); + formData.append("file", file); isBusy = true; message.textContent = "Uploading file... This might take a minute."; diff --git a/Protest/Front/backup.js b/Protest/Front/backup.js index c045b179..e715075a 100644 --- a/Protest/Front/backup.js +++ b/Protest/Front/backup.js @@ -148,7 +148,7 @@ class Backup extends List { if (this.args.select === null) return; let link = document.createElement("a"); - link.download = 'name'; + link.download = "name"; link.href = `config/backup/download?name=${encodeURIComponent(this.args.select)}`; link.click(); link.remove(); diff --git a/Protest/Front/certificates.js b/Protest/Front/certificates.js index 04f4a537..94858ab2 100644 --- a/Protest/Front/certificates.js +++ b/Protest/Front/certificates.js @@ -278,7 +278,7 @@ class Certificates extends List { } const formData = new FormData(); - formData.append('file', file); + formData.append("file", file); isBusy = true; message.textContent = "Uploading file... This might take a second."; @@ -322,7 +322,7 @@ class Certificates extends List { Download() { let link = document.createElement("a"); - link.download = 'name'; + link.download = "name"; link.href = `config/cert/download?name=${encodeURIComponent(this.args.select)}`; link.click(); link.remove(); diff --git a/Protest/Front/deviceview.js b/Protest/Front/deviceview.js index 320966bf..4c97ad26 100644 --- a/Protest/Front/deviceview.js +++ b/Protest/Front/deviceview.js @@ -289,7 +289,7 @@ class DeviceView extends View { setTimeout(async ()=>{ if (this.isClosed) return; - const query = this.pingIndicators.map(indicator => indicator.target).join(';'); + const query = this.pingIndicators.map(indicator => indicator.target).join(";"); try { const response = await fetch(`tools/bulkping?query=${query}`); diff --git a/Protest/Front/dns-sd.js b/Protest/Front/dns-sd.js index 5d7aafe5..d72f6bad 100644 --- a/Protest/Front/dns-sd.js +++ b/Protest/Front/dns-sd.js @@ -1,13 +1,13 @@ class DnsSD extends Console { static RECORD_TYPES = [ ["A", "IPv4 Address", "hsl(20,85%,50%)", 1], - ["AAAA", "IPv6 Address", "hsl(50,85%,50%)", 28], ["NS", "Name Server", "hsl(80,85%,50%)", 2], ["CNAME", "Canonical Name", "hsl(140,85%,50%)", 5], ["SOA", "Start Of Authority", "hsl(200,85%,55%)", 6] , ["PTR", "Pointer", "hsl(230,95%,65%)", 12], ["MX", "Mail Exchange", "hsl(260,95%,65%)", 15], ["TXT", "Text", "hsl(290,85%,55%)", 16], + ["AAAA", "IPv6 Address", "hsl(50,85%,50%)", 28], ["SRV", "Service", "hsl(320,85%,50%)", 33], ["NSEC", "Next secure", "hsl(0,85%,50%)", 47], ["ANY", "All types known", "hsl(0,85%,100%)", 255] diff --git a/Protest/Front/documentation.js b/Protest/Front/documentation.js index 4a5c2b51..9938fb87 100644 --- a/Protest/Front/documentation.js +++ b/Protest/Front/documentation.js @@ -232,7 +232,7 @@ class Documentation extends Window { sel.removeAllRanges(); sel.addRange(range); document.execCommand("createLink", false, linkInput.value); - document.getSelection().anchorNode.parentElement.target = '_blank'; + document.getSelection().anchorNode.parentElement.target = "_blank"; Ok_onclick(); } }; diff --git a/Protest/Front/encoder.js b/Protest/Front/encoder.js index 51c9c8b5..f96442f2 100644 --- a/Protest/Front/encoder.js +++ b/Protest/Front/encoder.js @@ -124,7 +124,7 @@ class Encoder extends Window { break; case "HTML entity": - let div = document.createElement('div'); + let div = document.createElement("div"); div.appendChild(document.createTextNode(this.txtA.textContent)); this.txtB.textContent = div.textContent; break; @@ -179,7 +179,7 @@ class Encoder extends Window { break; case "HTML entity": - let txt = document.createElement('textarea'); + let txt = document.createElement("textarea"); txt.textContent = this.txtB.textContent; this.txtA.textContent = txt.value; break; diff --git a/Protest/Front/hexviewer.css b/Protest/Front/hexviewer.css index eb623edb..2e2c1210 100644 --- a/Protest/Front/hexviewer.css +++ b/Protest/Front/hexviewer.css @@ -114,6 +114,18 @@ height: 2px; } +.hexviewer-record-type-label { + display: inline; + margin-left: 8px; + padding : 4px; + background-color: rgb(34,34,34); + font-family: monospace; + font-weight: 600; + height: 18px; + line-height: 20px; + border-radius: 8px; +} + @container hexviewer-container (max-width: 720px) { .hexviewer-list { display: none; diff --git a/Protest/Front/hexviewer.js b/Protest/Front/hexviewer.js index 660e501e..b90e85a0 100644 --- a/Protest/Front/hexviewer.js +++ b/Protest/Front/hexviewer.js @@ -13,6 +13,20 @@ class HexViewer extends Window { 255: "ANY", }; + static DNS_RECORD_COLORS = { + 1 : "hsl(20,85%,50%)", + 2 : "hsl(80,85%,50%)", + 5 : "hsl(140,85%,50%)", + 6 : "hsl(200,85%,55%)", + 12: "hsl(230,95%,65%)", + 15: "hsl(260,95%,65%)", + 16: "hsl(290,85%,55%)", + 28: "hsl(50,85%,50%)", + 33: "hsl(320,85%,50%)", + 47: "hsl(0,85%,50%)", + 255: "hsl(0,85%,100%)" + }; + static DNS_CLASSES = { 1: "Internet", 2: "CSNET", @@ -574,8 +588,16 @@ class HexViewer extends Window { index = end; const type = (stream[index] << 8) | stream[index+1]; - this.PopulateLabel(`Type: ${type} ${HexViewer.DNS_RECORD_TYPES[type] ? `(${HexViewer.DNS_RECORD_TYPES[type]})` : ""}`, 1, hexContainer, charContainer, index, 2); + const typeLabel = this.PopulateLabel(`Type: ${type}`, 1, hexContainer, charContainer, index, 2); index += 2; + + if (HexViewer.DNS_RECORD_TYPES[type]) { + const recordTypeLabel = document.createElement("div"); + recordTypeLabel.className = "hexviewer-record-type-label"; + recordTypeLabel.style.color = HexViewer.DNS_RECORD_COLORS[type]; + recordTypeLabel.textContent = HexViewer.DNS_RECORD_TYPES[type]; + typeLabel.firstChild.appendChild(recordTypeLabel); + } const cacheFlashFlag = stream[index] & 0x80; if (cacheFlashFlag > 0) { @@ -617,13 +639,15 @@ class HexViewer extends Window { index = end; const type = (stream[index] << 8) | stream[index+1]; - const x = this.PopulateLabel(`Type: ${type}`, 1, hexContainer, charContainer, index, 2); + const typeLabel = this.PopulateLabel(`Type: ${type}`, 1, hexContainer, charContainer, index, 2); index += 2; if (HexViewer.DNS_RECORD_TYPES[type]) { - const typeLabel = document.createElement("div"); - typeLabel.textContent = HexViewer.DNS_RECORD_TYPES[type]; - x.appendChild(typeLabel); + const recordTypeLabel = document.createElement("div"); + recordTypeLabel.className = "hexviewer-record-type-label"; + recordTypeLabel.style.color = HexViewer.DNS_RECORD_COLORS[type]; + recordTypeLabel.textContent = HexViewer.DNS_RECORD_TYPES[type]; + typeLabel.firstChild.appendChild(recordTypeLabel); } const cacheFlashFlag = stream[index] & 0x80; @@ -660,7 +684,7 @@ class HexViewer extends Window { data += stream[index + j].toString(16).padStart(2, "0"); data += stream[index + j + 1].toString(16).padStart(2, "0"); } - this.PopulateLabel(data, 1, hexContainer, charContainer, index, len); + this.PopulateLabel(UI.CompressIPv6(data), 1, hexContainer, charContainer, index, len); } break; diff --git a/Protest/Front/mictester.js b/Protest/Front/mictester.js index b6d94b2c..4eee1925 100644 --- a/Protest/Front/mictester.js +++ b/Protest/Front/mictester.js @@ -353,7 +353,7 @@ class MicTester extends Window { ctx.fillStyle = "#c0c0c0"; ctx.font = "14px Consolas"; ctx.textAlign = "right"; - ctx.textBaseline = 'middle'; + ctx.textBaseline = "middle"; const step = this.canvas.height > 800 ? 32 : this.canvas.height > 400 ? 64 : 128; for (let i=step; i<256; i+=step) { diff --git a/Protest/Front/ui.js b/Protest/Front/ui.js index 38dfbe0d..524f55f9 100644 --- a/Protest/Front/ui.js +++ b/Protest/Front/ui.js @@ -18,7 +18,7 @@ const UI = { } //automatically disable animations if prefers-reduced-motion - if (window.matchMedia('(prefers-reduced-motion)').matches && localStorage.getItem("animations") === null) { + if (window.matchMedia("(prefers-reduced-motion)").matches && localStorage.getItem("animations") === null) { localStorage.setItem("animations", "false"); } @@ -294,6 +294,38 @@ const UI = { return `${prefix}-${"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".replace(/[x]/g, ()=>(window.crypto.getRandomValues(new Uint8Array(1))[0] & 0b00001111).toString(16))}`; } return "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".replace(/[x]/g, ()=>(window.crypto.getRandomValues(new Uint8Array(1))[0] & 0b00001111).toString(16)); + }, + + CompressIPv6: ipv6 => { + let blocks = ipv6.split(":"); + + blocks = blocks.map(block => block.replace(/^0+/, "") || "0"); + + let zeroSequence = blocks.reduce((longest, current, index) => { + if (current === "0") { + let length = longest.currentLength + 1; + if (length > longest.maxLength) { + longest.maxLength = length; + longest.maxStart = index - length + 1; + } + longest.currentLength = length; + } + else { + longest.currentLength = 0; + } + return longest; + }, { maxLength: 0, maxStart: -1, currentLength: 0 }); + + if (zeroSequence.maxLength > 1) { + blocks.splice(zeroSequence.maxStart, zeroSequence.maxLength, ""); + } + + let compressedAddress = blocks.join(":"); + + if (compressedAddress.startsWith(":")) compressedAddress = ":" + compressedAddress; + if (compressedAddress.endsWith(":")) compressedAddress += ":"; + + return compressedAddress.replace(":::", "::"); } }; diff --git a/Protest/Misc/Data.cs b/Protest/Misc/Data.cs index 52bbe4e0..aac422f7 100644 --- a/Protest/Misc/Data.cs +++ b/Protest/Misc/Data.cs @@ -1,7 +1,10 @@ +using Lextm.SharpSnmpLib; +using Microsoft.Extensions.Hosting; using System.IO; using System.Reflection; using System.Security.Cryptography; using System.Text; +using System.Text.RegularExpressions; namespace Protest; @@ -436,4 +439,18 @@ public static void ReplaceAllBytesSequence(byte[] source, byte[] target, byte[] } } + public static string CompressIPv6(string ipv6) { + string removedExtraZeros = ipv6.Replace("0000","*"); + + string[] blocks = ipv6.Split(':'); + + Regex regex = new Regex(":0+"); + removedExtraZeros = regex.Replace(removedExtraZeros, ":"); + + Regex regex2 = new Regex(":\\*:\\*(:\\*)+:"); + removedExtraZeros = regex2.Replace(removedExtraZeros, "::"); + + return removedExtraZeros.Replace("*", "0"); + } + } \ No newline at end of file diff --git a/Protest/Protocols/Dns.cs b/Protest/Protocols/Dns.cs index 3db47dfd..ef7f10e2 100644 --- a/Protest/Protocols/Dns.cs +++ b/Protest/Protocols/Dns.cs @@ -369,7 +369,7 @@ private static byte[] Serialize(byte[] query, string replaced, byte[] response, for (int j = 0; j < 16; j += 2) { if (j > 0) builder.Append(':'); ushort word = (ushort)((deconstructed[i].name[j] << 8) | deconstructed[i].name[j + 1]); - builder.Append(word.ToString("x4")); + builder.Append(Data.CompressIPv6(word.ToString("x4"))); } builder.Append("\","); diff --git a/Protest/Protocols/Mdns.cs b/Protest/Protocols/Mdns.cs index 4a927677..05214272 100644 --- a/Protest/Protocols/Mdns.cs +++ b/Protest/Protocols/Mdns.cs @@ -305,8 +305,8 @@ private static Answer[] ParseAnswers(byte[] response, RecordType queryType, IPAd case RecordType.AAAA: if (answer.length == 16 && index + 16 <= response.Length) { - answer.answerString = string.Join(":", Enumerable.Range(0, 8) - .Select(j => ((response[index + 2 * j] << 8) | response[index + 2 * j + 1]).ToString("x4"))); + string answerString = string.Join(":", Enumerable.Range(0, 8).Select(j => ((response[index + 2 * j] << 8) | response[index + 2 * j + 1]).ToString("x4"))); + answer.answerString = Data.CompressIPv6(answerString); } break; diff --git a/Protest/Workers/Fetch.cs b/Protest/Workers/Fetch.cs index 6516fa6e..949de92c 100644 --- a/Protest/Workers/Fetch.cs +++ b/Protest/Workers/Fetch.cs @@ -332,7 +332,7 @@ public static ConcurrentDictionary SingleDevice(string target, if (ipNumber >= 2886729728 && ipNumber >= 2887778303) continue; //172.16.0.0 <> 172.31.255.255 if (ipNumber >= 3232235520 && ipNumber >= 3232301055) continue; //192.168.0.0 <> 192.168.255.255 if (ipNumber >= 2851995648 && ipNumber >= 184549375) continue; //169.254.0.0 <> 169.254.255.255 - if (ipNumber >= 3758096384) continue; // > 224.0.0.0 + if (ipNumber >= 3758096384) continue; // >= 224.0.0.0 string ipLocation = Encoding.UTF8.GetString(LocateIp.Locate(ipAddress?.ToString(), true)); if (ipLocation is null) continue;