window.onload = function () { deleteTempCookies(); buildList(); } function deleteCard(cardNo) { document.getElementById("card" + cardNo).remove(); document.cookie = cardNo + "provName=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = cardNo + "doh=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = cardNo + "dns1v4=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = cardNo + "dns2v4=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = cardNo + "dns1v6=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = cardNo + "dns2v6=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = cardNo + "serverUrl=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = cardNo + "exclWifi=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = cardNo + "useWifi=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = cardNo + "useCell=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = cardNo + "lockProfile=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; } function buildList() { var parent = document.getElementById("dynamicList"); for (var i = 0; i < getCookie("runningNo"); i++) { if (getCookie(i + "provName") != "") { var carddiv = document.createElement("div"); carddiv.classList.add("w3-card"); carddiv.id = "card" + i; var header = document.createElement("header"); header.classList.add("w3-container"); header.classList.add("bar-color"); var headertext = document.createElement("h3"); headertext.classList.add("w3-left"); headertext.appendChild(document.createTextNode(getCookie(i + "provName"))); var headerdel = document.createElement("button"); headerdel.classList.add("w3-button"); headerdel.classList.add("w3-red"); headerdel.classList.add("w3-right") headerdel.innerHTML = "X"; headerdel.setAttribute("onclick", 'deleteCard(' + i + ')'); var infocontainer = document.createElement("div"); infocontainer.classList.add("w3-container"); var infop = document.createElement("p"); var infostring = "Connection type: "; if (getCookie(i + "doh") == "true") { infostring += "DNS-over-HTTPS"; } else { infostring += "DNS-over-TLS"; } infop.appendChild(document.createTextNode(infostring)); infop.appendChild(document.createElement("br")); var dns1v4 = getCookie(i + "dns1v4"); var dns2v4 = getCookie(i + "dns2v4"); var dns1v6 = getCookie(i + "dns1v6"); var dns2v6 = getCookie(i + "dns2v6"); var exclWifi = getCookie(i + "exclWifi"); if (dns1v4 != "") { infostring = "Primary IPv4 DNS Server: " + getCookie(i + "dns1v4"); infop.appendChild(document.createTextNode(infostring)); infop.appendChild(document.createElement("br")); } if (dns2v4 != "") { infostring = "Secondary IPv4 DNS Server: " + dns2v4; infop.appendChild(document.createTextNode(infostring)); infop.appendChild(document.createElement("br")); } if (dns1v6 != "") { infostring = "Primary IPv6 DNS Server: " + dns1v6; infop.appendChild(document.createTextNode(infostring)); infop.appendChild(document.createElement("br")); } if (dns2v6 != "") { infostring = "Secondary IPv6 DNS Server: " + dns2v6; infop.appendChild(document.createTextNode(infostring)); infop.appendChild(document.createElement("br")); } infostring = "Server Address: " + getCookie(i + "serverUrl"); infop.appendChild(document.createTextNode(infostring)); infop.appendChild(document.createElement("br")); if (exclWifi != "") { infostring = "Excluded WiFi SSIDs: " + exclWifi; infop.appendChild(document.createTextNode(infostring)); infop.appendChild(document.createElement("br")); } infostring = ""; if (getCookie(i + "useWifi") == "true") { infostring += "Enabled on WiFi. "; } if (getCookie(i + "useCell") == "true") { infostring += "Enabled on Cellular. "; } if (getCookie(i + "lockProfile" == "true")) { infostring += "Disablement prohibited. "; } infop.appendChild(document.createTextNode(infostring)); header.appendChild(headertext); header.appendChild(headerdel); carddiv.appendChild(header); infocontainer.appendChild(infop); carddiv.appendChild(infocontainer); parent.appendChild(carddiv); } } } function deleteTempCookies() { document.cookie = "provName=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = "doh=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = "dns1v4=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = "dns2v4=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = "dns1v6=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = "dns2v6=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; document.cookie = "serverUrl=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; } function getCookie(cname) { var name = cname + "="; var decodedCookie = decodeURIComponent(document.cookie); var ca = decodedCookie.split(';'); for (var i = 0; i < ca.length; i++) { var c = ca[i]; while (c.charAt(0) == ' ') { c = c.substring(1); } if (c.indexOf(name) == 0) { return c.substring(name.length, c.length); } } return ""; } function deleteAllCookies() { var cookies = document.cookie.split(";"); for (var i = 0; i < cookies.length; i++) { var cookie = cookies[i]; var eqPos = cookie.indexOf("="); var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie; document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Strict; Secure"; } } function getRegDNS(iterator) { var dns1v4 = getCookie(iterator + "dns1v4"); var dns2v4 = getCookie(iterator + "dns2v4"); var dns1v6 = getCookie(iterator + "dns1v6"); var dns2v6 = getCookie(iterator + "dns2v6"); var ip4format = /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; var ip6format = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/; var returnstring = "ServerAddresses\n\n"; var dnsOverride = false; if (ip6format.test(dns1v6)) { dnsOverride = true; returnstring += "" + dns1v6 + "\n"; } if (ip6format.test(dns2v6)) { dnsOverride = true; returnstring += "" + dns2v6 + "\n"; } if (ip4format.test(dns1v4)) { dnsOverride = true; returnstring += "" + dns1v4 + "\n"; } if (ip4format.test(dns2v4)) { dnsOverride = true; returnstring += "" + dns2v4 + "\n"; } if (dnsOverride) { returnstring += "\n"; return returnstring; } else { return ""; } } function saveDynamicDataToFile() { var fileString = "\n"; fileString += "\n"; fileString += "\n"; fileString += "\n"; fileString += "PayloadContent\n"; fileString += "\n"; //DNS settings start for (var i = 0; i < getCookie("runningNo"); i++) { var provName = getCookie(i + "provName"); if (provName != "") { //This check is to avoid empty configurations leftover by deletion. var encValue = null; if (getCookie(i + "doh") == "true") { encValue = "HTTPS"; } else { encValue = "TLS"; } var exclWifi = getCookie(i + "") fileString += "\n"; fileString += "DNSSettings\n"; fileString += "\n"; fileString += "DNSProtocol\n"; fileString += "" + encValue + "\n"; fileString += getRegDNS(i); if (encValue == "HTTPS") { fileString += "ServerURL\n"; } else { fileString += "ServerName\n"; } fileString += "" + getCookie(i + "serverUrl") + "\n"; fileString += "\n"; fileString += "OnDemandRules\n"; fileString += "\n"; if (exclWifi != "") { fileString += "\n"; fileString += "Action\n"; fileString += "Disconnect\n"; fileString += "SSIDMatch\n" fileString += "\n"; exclWifi.split(/\s*,\s*/).forEach(function (wifiString) { fileString += "" + wifiString + "\n"; }); fileString += "\n"; fileString += "\n"; fileString += "\n"; fileString += "Action\n"; fileString += "Connect\n"; fileString += "\n"; } if (getCookie(i + "useWifi") == "true") { fileString += "\n"; fileString += "Action\n"; fileString += "Connect\n"; fileString += "InterfaceTypeMatch\n"; fileString += "WiFi\n"; fileString += "\n"; } if (getCookie(i + "useCell") == "true") { fileString += "\n"; fileString += "Action\n"; fileString += "Connect\n"; fileString += "InterfaceTypeMatch\n"; fileString += "Cellular\n"; fileString += "\n"; } fileString += "\n"; fileString += "Action\n"; fileString += "Disconnect\n"; fileString += "\n"; fileString += "\n"; fileString += "PayloadDescription\n"; fileString += "Configures device to use " + provName + " Encrypted DNS over " + encValue + "\n"; fileString += "PayloadDisplayName\n"; fileString += "" + provName + " DNS over " + encValue + "\n"; fileString += "PayloadIdentifier\n"; fileString += "com.apple.dnsSettings.managed." + uuidv4() + "\n"; fileString += "PayloadType\n"; fileString += "com.apple.dnsSettings.managed\n"; fileString += "PayloadUUID\n"; fileString += "" + uuidv4() + "\n"; fileString += "PayloadVersion\n"; fileString += "1\n"; fileString += "ProhibitDisablement\n"; if (getCookie(i + "lockProfile") == "true") { fileString += "\n"; } else { fileString += "\n"; } fileString += "\n"; } } //DNS settings end fileString += "\n"; fileString += "PayloadDescription\n"; fileString += "Adds different encrypted DNS configurations to Big Sur and iOS 14 based systems\n"; fileString += "PayloadDisplayName\n"; fileString += "Encrypted DNS (DoH, DoT)\n"; fileString += "PayloadIdentifier\n"; fileString += "com.notjakob.apple-dns." + uuidv4() + "\n"; fileString += "PayloadRemovalDisallowed\n"; fileString += "\n"; fileString += "PayloadType\n"; fileString += "Configuration\n"; fileString += "PayloadUUID\n"; fileString += "" + uuidv4() + "\n"; fileString += "PayloadVersion\n"; fileString += "1\n"; fileString += "\n"; fileString += ""; var blob = new Blob([fileString], { type: "text/plain;charset=utf-8" }); deleteAllCookies(); saveAs(blob, "dns.mobileconfig"); } function confirmDel() { if (confirm("This will delete all configurations on this page. Continue?") == true) { deleteAllCookies(); window.location.reload(); } }