1import"../chunks/DsnmJJEf.js";import{p as ca,av as b,s as i,c as t,t as f,g as e,a as pa,A as _,n as q,r as a,f as Xe,ay as ke}from"../chunks/BY0bk6Yc.js";import{s as v}from"../chunks/B6oFbeKC.js";import{f as h,a as u}from"../chunks/DXItkK2y.js";import{i as N}from"../chunks/DiSB06Pf.js";import{e as Q,i as X}from"../chunks/BOZOuEyP.js";import{a as H,t as O}from"../chunks/z40oqvJk.js";import{b as je,r as ua}from"../chunks/kUWlVhub.js";import{s as K,c as _a}from"../chunks/BZLnOqJO.js";import{d as ha}from"../chunks/CFtbtvCf.js";import{b as ma}from"../chunks/DhiJda7t.js";import{I as T}from"../chunks/DGiEONFf.js";/* empty css */async function fa(z,S,n){if(e(S)?.raw)try{await navigator.clipboard.writeText(JSON.stringify(e(S).raw,null,2)),_(n,!0),setTimeout(()=>_(n,!1),1500)}catch(x){console.error("Failed to copy:",x)}}var ga=h('<button><h5> </h5> <p> </p> <small class="svelte-15x3kkc"> </small></button>'),Sa=(z,S,n,x)=>{S(),e(n).trim()&&x()},xa=(z,S,n,x)=>{S(),e(n).trim()&&x()},ka=h("<option> </option>"),ya=(z,S,n)=>{e(S).trim()&&n()},Da=h("<option> </option>"),ba=h("<!> Checking DNSSEC...",1),Na=h("<!> Check DNSSEC",1),Ta=h('<div class="status-item info svelte-15x3kkc"><!> <div><strong class="svelte-15x3kkc">CD (Checking Disabled) Flag</strong> <p class="svelte-15x3kkc">SET - DNSSEC validation was disabled for this query</p></div></div>'),Ca=h('<div class="record-ttl svelte-15x3kkc"> </div>'),Ea=h('<div class="record-item"><div class="record-data mono"> </div> <!></div>'),Aa=h('<div class="result-section"><h4> </h4> <div class="records-list"></div></div>'),$a=h('<div class="record-ttl svelte-15x3kkc"> </div>'),wa=h('<div class="record-item"><div class="record-data mono"> </div> <!></div>'),Ra=h('<div class="result-section"><h4> </h4> <div class="records-list"></div></div>'),qa=h('<div class="card results-card"><div class="card-header row"><h3> </h3> <button class="copy-btn"><span><!></span> </button></div> <div class="card-content"><div class="lookup-info"><div class="info-item"><span class="info-label">Query:</span> <span class="info-value mono"> </span></div> <div class="info-item"><span class="info-label">DoH Resolver:</span> <span class="info-value"> </span></div></div> <div class="result-section"><h4>DNSSEC Validation Status</h4> <div class="dnssec-status svelte-15x3kkc"><div><!> <div><strong class="svelte-15x3kkc">AD (Authenticated Data) Flag</strong> <p class="svelte-15x3kkc"> </p></div></div> <!> <div><!> <div><strong class="svelte-15x3kkc">Response Code</strong> <p class="svelte-15x3kkc"> </p></div></div></div> <div class="explanation svelte-15x3kkc"><h5 class="svelte-15x3kkc">Explanation</h5> <p class="svelte-15x3kkc"> </p></div></div> <!> <!></div></div>'),Ha=h(`<div class="card error-card"><div class="card-content"><div class="error-content"><!> <div><strong>DNSSEC Check Failed</strong> <p> </p> <div class="troubleshooting"><p><strong>Troubleshooting Tips:</strong></p> <ul><li>Ensure the domain name is valid and exists</li> <li>Try a different record type if the current one doesn't exist</li> <li>Switch to a different DoH resolver</li> <li>Some domains may not have the requested record type</li></ul></div></div></div></div></div>`),Oa=h(`<div class="card"><header class="card-header"><h1>DNSSEC AD Flag Checker</h1> <p>Query DNS records via DoH and report if the AD (Authenticated Data) bit is set. The AD bit indicates whether the 2 DNS response has been cryptographically verified through DNSSEC validation.</p></header> <div class="card examples-card"><details class="examples-details"><summary class="examples-summary"><!> <h4>Example DNSSEC Tests</h4></summary> <div class="examples-grid"></div></details></div> <div class="card input-card"><div class="card-header"><h3>DNSSEC Query Configuration</h3></div> <div class="card-content"><div class="form-grid svelte-15x3kkc"><div class="form-group svelte-15x3kkc"><label for="domain" class="svelte-15x3kkc">Domain Name <input id="domain" type="text" placeholder="example.com"/></label></div> <div class="form-group svelte-15x3kkc"><label for="recordType" class="svelte-15x3kkc">Record Type <select id="recordType"></select></label></div> <div class="form-group svelte-15x3kkc"><label for="resolver" class="svelte-15x3kkc">DoH Resolver <select id="resolver"></select></label></div></div> <div class="action-section"><button class="lookup-btn"><!></button></div></div></div> <!> <!> <div class="card info-card"><div class="card-header"><h3>About DNSSEC and the AD Flag</h3></div> <div class="card-content"><div class="info-grid"><div class="info-section"><h4>What is DNSSEC?</h4> <p>DNS Security Extensions (DNSSEC) adds cryptographic authentication to DNS responses, protecting against DNS 3 spoofing and cache poisoning attacks by ensuring response integrity.</p></div> <div class="info-section"><h4>The AD (Authenticated Data) Flag</h4> <p>The AD bit in DNS responses indicates that the resolver has successfully validated the response using 4 DNSSEC. When set, you can trust the response hasn't been tampered with.</p></div> <div class="info-section"><h4>Why Use DoH for DNSSEC?</h4> <p>DNS-over-HTTPS preserves DNSSEC validation status in the AD flag, while traditional DNS queries may not 5 expose this information clearly to clients.</p></div> <div class="info-section"><h4>Interpreting Results</h4> <ul><li><strong>AD Set:</strong> Response is cryptographically verified</li> <li><strong>AD Not Set:</strong> Domain unsigned, validation failed, or resolver doesn't validate</li> <li><strong>CD Set:</strong> Validation was disabled for this query</li> <li><strong>SERVFAIL:</strong> May indicate DNSSEC validation failure</li></ul></div></div></div></div></div>`);function Ga(z,S){ca(S,!0);let n=b("example.com"),x=b("A"),Y=b("cloudflare"),j=b(!1),l=b(null),J=b(null),F=b(!1),Z=b(null);const Je=[{value:"A",label:"A",description:"IPv4 address records"},{value:"AAAA",label:"AAAA",description:"IPv6 address records"},{value:"CNAME",label:"CNAME",description:"Canonical name records"},{value:"MX",label:"MX",description:"Mail exchange records"},{value:"TXT",label:"TXT",description:"Text records"},{value:"NS",label:"NS",description:"Name server records"},{value:"SOA",label:"SOA",description:"Start of authority records"}],Ve=[{value:"cloudflare",label:"Cloudflare (1.1.1.1)"},{value:"google",label:"Google (8.8.8.8)"},{value:"quad9",label:"Quad9 (9.9.9.9)"},{value:"opendns",label:"OpenDNS (208.67.222.222)"}
5],We=[{domain:"cloudflare.com",type:"A",description:"DNSSEC-signed domain"},{domain:"dnssec-failed.org",type:"A",description:"DNSSEC validation failure test"},{domain:"example.com",type:"A",description:"Unsigned domain example"},{domain:"google.com",type:"A",description:"Popular signed domain"},{domain:"iana.org",type:"A",description:"Internet registry domain"}];async function I(){_(j,!0),_(J,null),_(l,null);try{const r=await fetch("/api/internal/diagnostics/dns",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"dnssec-adflag",name:e(n).trim(),type:e(x),resolverOpts:{doh:e(Y)}})});if(!r.ok){const s=await r.json().catch(()=>({message:`HTTP ${r.status}`}));throw new Error(s.message||`DNSSEC check failed: ${r.status}`)}_(l,await r.json(),!0)}catch(r){_(J,r.message,!0)}finally{_(j,!1)}}function Ue(r,s){_(n,r.domain,!0),_(x,r.type,!0),_(Z,s,!0),I()}function ye(){_(Z,null)}var ee=Oa(),ae=i(t(ee),2),De=t(ae),te=t(De),Ge=t(te);T(Ge,{name:"chevron-right",size:"xs"}),q(2),a(te);var be=i(te,2);Q(be,21,()=>We,X,(r,s,o)=>{var c=ga();let m;c.__click=()=>Ue(e(s),o);var g=t(c),k=t(g,!0);a(g);var C=i(g,2),ce=t(C,!0);a(C);var P=i(C,2),L=t(P);a(P),a(c),H(c,(E,G)=>O?.(E,G),()=>`Check DNSSEC for ${e(s).domain} (${e(s).description})`),f(E=>{m=K(c,1,"example-card svelte-15x3kkc",null,m,E),v(k,e(s).domain),v(ce,e(s).description),v(L,`${e(s).type??""} record`)},[()=>({selected:e(Z)===o})]),u(r,c)}),a(be),a(De),a(ae);var re=i(ae,2),Ne=i(t(re),2),se=t(Ne),ie=t(se),oe=t(ie),le=i(t(oe));ua(le),le.__change=[Sa,ye,n,I],a(oe),H(oe,(r,s)=>O?.(r,s),()=>"Enter a domain name to check DNSSEC validation status"),a(ie);var de=i(ie,2),ve=t(de),V=i(t(ve));V.__change=[xa,ye,n,I],Q(V,21,()=>Je,X,(r,s)=>{var o=ka(),c=t(o);a(o);var m={};f(()=>{v(c,`${e(s).label??""} - ${e(s).description??""}`),m!==(m=e(s).value)&&(o.value=(o.__value=e(s).value)??"")}),u(r,o)}),a(V),a(ve),H(ve,(r,s)=>O?.(r,s),()=>"Select the DNS record type to query"),a(de);var Te=i(de,2),ne=t(Te),W=i(t(ne));W.__change=[ya,n,I],Q(W,21,()=>Ve,X,(r,s)=>{var o=Da(),c=t(o,!0);a(o);var m={};f(()=>{v(c,e(s).label),m!==(m=e(s).value)&&(o.value=(o.__value=e(s).value)??"")}),u(r,o)}),a(W),a(ne),H(ne,(r,s)=>O?.(r,s),()=>"Choose a DNS-over-HTTPS resolver for the query"),a(Te),a(se);var Ce=i(se,2),U=t(Ce);U.__click=I;var Be=t(U);{var Ke=r=>{var s=ba(),o=Xe(s);T(o,{name:"loader",size:"sm",animate:"spin"}),q(),u(r,s)},Ye=r=>{var s=Na(),o=Xe(s);T(o,{name:"search",size:"sm"}),q(),u(r,s)};N(Be,r=>{e(j)?r(Ke):r(Ye,!1)})}a(U),a(Ce),a(Ne),a(re);var Ee=i(re,2);{var Ze=r=>{var s=qa(),o=t(s),c=t(o),m=t(c);a(c);var g=i(c,2);g.__click=[fa,l,F];var k=t(g),C=t(k);{let d=ke(()=>e(F)?"check":"copy");T(C,{get name(){return e(d)},size:"xs"})}a(k);var ce=i(k);a(g),a(o);var P=i(o,2),L=t(P),E=t(L),G=t(E);H(G,(d,p)=>O?.(d,p),()=>"The domain and record type that was queried");var Ae=i(G,2),ta=t(Ae);a(Ae),a(E);var $e=i(E,2),we=t($e);H(we,(d,p)=>O?.(d,p),()=>"DNS-over-HTTPS resolver used for the query");var Re=i(we,2),ra=t(Re,!0);a(Re),a($e),a(L);var pe=i(L,2),ue=i(t(pe),2),B=t(ue),qe=t(B);{let d=ke(()=>e(l).authenticated?"shield-check":"shield-alert");T(qe,{get name(){return e(d)},size:"md"})}var He=i(qe,2),Oe=i(t(He),2),sa=t(Oe,!0);a(Oe),a(He),a(B);var ze=i(B,2);{var ia=d=>{var p=Ta(),y=t(p);T(y,{name:"info",size:"md"}),q(2),a(p),u(d,p)};N(ze,d=>{e(l).checkingDisabled&&d(ia)})}var _e=i(ze,2),Fe=t(_e);{let d=ke(()=>e(l).rcode===0?"check-circle":"x-circle");T(Fe,{get name(){return e(d)},size:"md"})}var Ie=i(Fe,2),Pe=i(t(Ie),2),oa=t(Pe,!0);a(Pe),a(Ie),a(_e),a(ue);var Le=i(ue,2),Me=i(t(Le),2),la=t(Me,!0);a(Me),a(Le),a(pe);var Qe=i(pe,2);{var da=d=>{var p=Aa(),y=t(p),he=t(y);a(y);var M=i(y,2);Q(M,21,()=>e(l).records,X,(me,D)=>{var A=Ea(),$=t(A),fe=t($,!0);a($);var ge=i($,2);{var Se=w=>{var R=Ca(),xe=t(R);a(R),f(()=>v(xe,`TTL: ${e(D).TTL??""}s`)),u(w,R)};N(ge,w=>{e(D).TTL&&w(Se)})}a(A),f(()=>v(fe,e(D).data)),u(me,A)}),a(M),a(p),f(()=>v(he,`DNS Records (${e(l).records.length??""})`)),u(d,p)};N(Qe,d=>{e(l).records?.length&&d(da)})}var va=i(Qe,2);{var na=d=>{var p=Ra(),y=t(p),he=t(y);a(y);var M=i(y,2);Q(M,21,()=>e(l).authority,X,(me,D)=>{var A=wa(),$=t(A),fe=t($);a($);var ge=i($,2);{var Se=w=>{var R=$a(),xe=t(R);a(R),f(()=>v(xe,`TTL: ${e(D).TTL??""}s`)),u(w,R)};N(ge,w=>{e(D).TTL&&w(Se)})}a(A),f(()=>v(fe,`${e(D).name??""} ${e(D).type??""} ${e(D).data??""}`)),u(me,A)}),a(M),a(p),f(()=>v(he,`Authority Section (${e(l).authority.length??""})`)),u(d,p)};N(va,d=>{e(l).authority?.length&&d(na)})}a(P),a(s),f(()=>{v(m,`DNSSEC Status for ${e(l).name??""}`),g.disabled=e(F),K(k,1,_a(e(F)?"text-green-500":"")),v(ce,` ${e(F)?"Copied!":"Copy Raw JSON"}`),v(ta,`${e(l).name??""} (${e(l).type??""})`),v(ra,e(l).resolver),K(B,1,`status-item ${e(l).authenticated?"success":"warning"}`,"svelte-15x3kkc"),v(sa,e(l).authenticated?"SET - Response is DNSSEC validated":"NOT SET - Response is not val
5idated"),K(_e,1,`status-item ${e(l).rcode===0?"success":"error"}`,"svelte-15x3kkc"),v(oa,e(l).rcodeText),v(la,e(l).explanation)}),u(r,s)};N(Ee,r=>{e(l)&&r(Ze)})}var ea=i(Ee,2);{var aa=r=>{var s=Ha(),o=t(s),c=t(o),m=t(c);T(m,{name:"alert-triangle",size:"md"});var g=i(m,2),k=i(t(g),2),C=t(k,!0);a(k),q(2),a(g),a(c),a(o),a(s),f(()=>v(C,e(J))),u(r,s)};N(ea,r=>{e(J)&&r(aa)})}q(2),a(ee),f(r=>U.disabled=r,[()=>e(j)||!e(n).trim()]),ma(le,()=>e(n),r=>_(n,r)),je(V,()=>e(x),r=>_(x,r)),je(W,()=>e(Y),r=>_(Y,r)),u(z,ee),pa()}ha(["click","change"]);export{Ga as component};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.