finish basic functionality

This commit is contained in:
fyr77 2020-10-24 18:41:05 +02:00
parent b4bbf5b4af
commit e3b200817e
3 changed files with 141 additions and 13 deletions

View file

@ -14,4 +14,5 @@ This tool can generate these profiles from provided data and also provides some
## Thanks
- Eli Grey for [FileSaver.js](https://github.com/eligrey/FileSaver.js)
- [UUIDjs](https://github.com/uuidjs/uuid)
- Paul Miller for [his excellent article](https://paulmillr.com/posts/encrypted-dns/) and the [premade profiles](https://github.com/paulmillr/encrypted-dns).

View file

@ -5,12 +5,69 @@
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>iOS secure DNS</title>
<script src="FileSaver.min.js"></script>
<script src="uuidv4.min.js"></script>
<script>
console.log(uuidv4());
function getRegDNS() {
var dns1v4 = document.getElementById("dns1v4").value;
var dns2v4 = document.getElementById("dns2v4").value;
var dns1v6 = document.getElementById("dns1v6").value;
var dns2v6 = document.getElementById("dns2v6").value;
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 = "<key>ServerAddresses</key>\n<array>\n";
var dnsOverride = false;
if (ip6format.test(dns1v6)) {
console.log("61valid!");
dnsOverride = true;
returnstring += "<string>" + dns1v6 + "</string>\n";
}
if (ip6format.test(dns2v6)) {
console.log("62valid!");
dnsOverride = true;
returnstring += "<string>" + dns2v6 + "</string>\n";
}
if (ip4format.test(dns1v4)) {
console.log("41valid!");
dnsOverride = true;
returnstring += "<string>" + dns1v4 + "</string>\n";
}
if (ip4format.test(dns2v4)) {
console.log("42valid!");
dnsOverride = true;
returnstring += "<string>" + dns2v4 + "</string>\n";
}
if (dnsOverride) {
returnstring += "</array>\n";
return returnstring;
}
else {
return "";
}
}
function createServerUrl(encValue) {
var returnstring = "";
if (encValue == "HTTPS") {
returnstring = "https://" + document.getElementById("serverUrl").value + "\n";
}
else {
returnstring = document.getElementById("serverUrl").value + "\n";
}
return returnstring;
}
function saveDynamicDataToFile() {
var encryption = document.getElementsByName('encryption');
var encValue = null;
var provName = document.getElementById("provName").value;
for (var i = 0, length = encryption.length; i < length; i++) {
if (encryption[i].checked) {
@ -20,32 +77,101 @@
}
}
//var blob = new Blob([userInput], { type: "text/plain;charset=utf-8" });
var blob = new Blob(["<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n<key>PayloadContent</key>\n<array>\n<dict>\n<key>DNSSettings</key>\n<dict>\n<key>DNSProtocol</key>\n<string>" + encValue + "</string>\n<key>ServerAddresses</key>\n<array>\n"], { type: "text/plain;charset=utf-8" });
saveAs(blob, "dns.mobileconfig");
//https://github.com/paulmillr/encrypted-dns/blob/master/cloudflare-https.mobileconfig
//Currently Line 13 done
//https://github.com/paulmillr/encrypted-dns/blob/master/cloudflare-tls.mobileconfig
var fileString = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
fileString += "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n";
fileString += "<plist version=\"1.0\">\n";
fileString += "<dict>\n";
fileString += "<key>PayloadContent</key>\n";
fileString += "<array>\n";
fileString += "<dict>\n";
fileString += "<key>DNSSettings</key>\n";
fileString += "<dict>\n";
fileString += "<key>DNSProtocol</key>\n";
fileString += "<string>" + encValue + "</string>\n";
fileString += getRegDNS();
fileString += "<key>ServerURL</key>\n";
fileString += "<string>" + createServerUrl(encValue);
fileString += "</dict>\n";
fileString += "<key>PayloadDescription</key>\n";
fileString += "<string>Configures device to use " + provName + " Encrypted DNS over " + encValue + "</string>\n";
fileString += "<key>PayloadDisplayName</key>\n";
fileString += "<string>" + provName + " DNS over " + encValue + "</string>\n";
fileString += "<key>PayloadIdentifier</key>\n";
fileString += "<string>com.apple.dnsSettings.managed." + uuidv4() + "\n";
fileString += "<key>PayloadType</key>\n";
fileString += "<string>com.apple.dnsSettings.managed</string>\n";
fileString += "<key>PayloadUUID</key>\n";
fileString += "<string>" + uuidv4() + "</string>\n";
fileString += "<key>PayloadVersion</key>\n";
fileString += "<integer>1</integer>\n";
fileString += "<key>ProhibitDisablement</key>\n";
fileString += "<false/>\n";
fileString += "</dict>\n";
fileString += "</array>\n";
fileString += "<key>PayloadDescription</key>\n";
fileString += "<string>Adds " + provName + " Encrypted DNS over " + encValue + " to Big Sur and iOS 14 based systems</string>\n";
fileString += "<key>PayloadDisplayName</key>\n<string>" + provName + " DNS over " + encValue + "</string>\n";
fileString += "<string>" + provName + " DNS over " + encValue + "</string>\n";
fileString += "<key>PayloadIdentifier</key>\n";
fileString += "<string>com.notjakob.apple-dns</string>\n";
fileString += "<key>PayloadRemovalDisallowed</key>\n";
fileString += "<false/>\n";
fileString += "<key>PayloadType</key>\n";
fileString += "<string>Configuration</string>\n";
fileString += "<key>PayloadUUID</key>\n";
fileString += "<string>" + uuidv4() + "</string>\n";
fileString += "<key>PayloadVersion</key>\n";
fileString += "<integer>1</integer>\n";
fileString += "</dict>\n";
fileString += "</plist>";
var blob = new Blob([fileString], { type: "text/plain;charset=utf-8" });
saveAs(blob, "dns.mobileconfig");
//https://github.com/paulmillr/encrypted-dns/blob/master/cloudflare-https.mobileconfig
//TODO: Premade configs! Fill in fields
}
function switchToHTTPS() {
document.getElementById("serverUrlHttps").style.display = "inline";
document.getElementById("dohdotServerLabel").innerHTML = "DoH";
}
function switchToTLS() {
document.getElementById("serverUrlHttps").style.display = "none";
document.getElementById("dohdotServerLabel").innerHTML = "DoT";
}
</script>
</head>
<body>
<p>
<input type="radio" id="doh" name="encryption" value="HTTPS">
<label for="provName">Name of DNS provider:</label><br>
<input type="text" id="provName">
</p>
<p>
<input type="radio" id="doh" name="encryption" value="HTTPS" onclick="switchToHTTPS()" checked="checked">
<label for="doh">DNS-over-HTTPS (DoH)</label><br>
<input type="radio" id="dot" name="encryption" value="TLS">
<input type="radio" id="dot" name="encryption" value="TLS" onclick="switchToTLS()">
<label for="dot">DNS-over-TLS (DoT)</label>
</p>
<p>
<label for="dns1v4">IPv4 primary DNS:</label><br>
<input type="text" id="dns1v4"><br>
<label for="dns2v4">IPv4 secondary DNS:</label><br>
<input type="text" id="dns2v4"><br>
<label for="dns1v6">IPv6 primary DNS:</label><br>
<input type="text" id="dns1v6"><br>
<label for="dns2v6">IPv6 secondary DNS:</label><br>
<input type="text" id="dns2v6">
</p>
<p>
<label for="serverUrl" id="dohdotServerLabel">DoH</label><label for="serverUrl"> server URL:</label><br>
<span id="serverUrlHttps">https://</span>
<input type="text" id="serverUrl">
</p>
<button type="button" onclick="saveDynamicDataToFile();">Click to Save</button>
<button type="button" onclick="saveDynamicDataToFile();">Download profile</button>
</body>
</html>

1
uuidv4.min.js vendored Normal file
View file

@ -0,0 +1 @@
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).uuidv4=e()}(this,(function(){"use strict";var t="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto),e=new Uint8Array(16);function o(){if(!t)throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return t(e)}var n=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function r(t){return"string"==typeof t&&n.test(t)}for(var i=[],u=0;u<256;++u)i.push((u+256).toString(16).substr(1));return function(t,e,n){var u=(t=t||{}).random||(t.rng||o)();if(u[6]=15&u[6]|64,u[8]=63&u[8]|128,e){n=n||0;for(var f=0;f<16;++f)e[n+f]=u[f];return e}return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,o=(i[t[e+0]]+i[t[e+1]]+i[t[e+2]]+i[t[e+3]]+"-"+i[t[e+4]]+i[t[e+5]]+"-"+i[t[e+6]]+i[t[e+7]]+"-"+i[t[e+8]]+i[t[e+9]]+"-"+i[t[e+10]]+i[t[e+11]]+i[t[e+12]]+i[t[e+13]]+i[t[e+14]]+i[t[e+15]]).toLowerCase();if(!r(o))throw TypeError("Stringified UUID is invalid");return o}(u)}}));