mirror of
https://github.com/ArcticFoxes-net/ONC-Converter
synced 2024-11-09 13:51:33 -05:00
Add files
This commit is contained in:
parent
b47a444576
commit
9183ba841f
28
index.html
Normal file
28
index.html
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
<!doctype html>
|
||||||
|
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
|
||||||
|
<title>OpenVPN to ONC</title>
|
||||||
|
<meta name="description" content="Convert OpenVPN config files to ONC files">
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="style.css">
|
||||||
|
<script type="module" src="js/scripts.js"></script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div>
|
||||||
|
<h1>ovpn2onc</h1>
|
||||||
|
<ul>
|
||||||
|
<li>OpenVPN config file (*.ovpn): <input type="file" id="inputopenvpn"></li>
|
||||||
|
<li>Certificates: <input mutliple type="file" id="inputcertificate"></li>
|
||||||
|
</ul>
|
||||||
|
<button id="clickbutton" type="button">Convert</button>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<p>Output</p>
|
||||||
|
<textarea readonly id="output" wrap="off" rows="10" cols="50"></textarea>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
3
js/converter.js
Normal file
3
js/converter.js
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export function convert(parsed) {
|
||||||
|
return {"test": "great content"}
|
||||||
|
}
|
86
js/parser.js
Normal file
86
js/parser.js
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
export function decode (str) {
|
||||||
|
let out = {}
|
||||||
|
const re = /^([^ ]+)( (.*))?$/i
|
||||||
|
const xmlOpen = /^<([^\/].*)>$/i
|
||||||
|
const xmlClose = /^<\/(.*)>$/i
|
||||||
|
let xmlTag = ''
|
||||||
|
let inXml = false
|
||||||
|
let xmlContent = ''
|
||||||
|
let lines = str.split(/[\r\n]+/g)
|
||||||
|
|
||||||
|
for (let line of lines) {
|
||||||
|
if (!line || line.match(/^\s*[;#]/)) continue
|
||||||
|
if (inXml) {
|
||||||
|
const xmlMatch = line.match(xmlClose)
|
||||||
|
if (!xmlMatch) {
|
||||||
|
xmlContent += line + '\n'
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
const tag = xmlMatch[1]
|
||||||
|
if (tag !== xmlTag) {
|
||||||
|
throw 'bad xml tag'
|
||||||
|
}
|
||||||
|
const key = unsafe(xmlTag)
|
||||||
|
const value = unsafe(xmlContent)
|
||||||
|
out[key] = value
|
||||||
|
xmlContent = ''
|
||||||
|
inXml = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
const xmlMatch = line.match(xmlOpen)
|
||||||
|
if (xmlMatch) {
|
||||||
|
inXml = true
|
||||||
|
xmlTag = xmlMatch[1]
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
const match = line.match(re)
|
||||||
|
if (!match) continue
|
||||||
|
const key = unsafe(match[1])
|
||||||
|
const value = match[2] ? unsafe((match[3] || '')) : true
|
||||||
|
out[key] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
function isQuoted (val) {
|
||||||
|
return (val.charAt(0) === '"' && val.slice(-1) === '"') ||
|
||||||
|
(val.charAt(0) === "'" && val.slice(-1) === "'")
|
||||||
|
}
|
||||||
|
|
||||||
|
function unsafe (val, doUnesc) {
|
||||||
|
val = (val || '').trim()
|
||||||
|
if (isQuoted(val)) {
|
||||||
|
// remove the single quotes before calling JSON.parse
|
||||||
|
if (val.charAt(0) === "'") {
|
||||||
|
val = val.substr(1, val.length - 2)
|
||||||
|
}
|
||||||
|
try { val = JSON.parse(val) } catch (_) {}
|
||||||
|
} else {
|
||||||
|
// walk the val to find the first not-escaped ; character
|
||||||
|
var esc = false
|
||||||
|
var unesc = ''
|
||||||
|
for (var i = 0, l = val.length; i < l; i++) {
|
||||||
|
var c = val.charAt(i)
|
||||||
|
if (esc) {
|
||||||
|
if ('\\;#'.indexOf(c) !== -1) {
|
||||||
|
unesc += c
|
||||||
|
} else {
|
||||||
|
unesc += '\\' + c
|
||||||
|
}
|
||||||
|
esc = false
|
||||||
|
} else if (';#'.indexOf(c) !== -1) {
|
||||||
|
break
|
||||||
|
} else if (c === '\\') {
|
||||||
|
esc = true
|
||||||
|
} else {
|
||||||
|
unesc += c
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (esc) {
|
||||||
|
unesc += '\\'
|
||||||
|
}
|
||||||
|
return unesc
|
||||||
|
}
|
||||||
|
return val
|
||||||
|
}
|
23
js/scripts.js
Normal file
23
js/scripts.js
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
import {decode} from '/js/parser.js';
|
||||||
|
import {convert} from '/js/converter.js';
|
||||||
|
|
||||||
|
let clickButton = document.getElementById('clickbutton');
|
||||||
|
clickButton.addEventListener("click", main, false);
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
let selectedFile = document.getElementById('inputopenvpn').files[0];
|
||||||
|
console.log(selectedFile.size + " bytes");
|
||||||
|
let reader = new FileReader();
|
||||||
|
reader.onload = (e => {
|
||||||
|
let content = e.target.result;
|
||||||
|
// remove windows-style newlines
|
||||||
|
content = content.replace(/\r/g, "");
|
||||||
|
let parsed = decode(content);
|
||||||
|
console.log(parsed);
|
||||||
|
let onc = convert(parsed);
|
||||||
|
let output = document.getElementById('output');
|
||||||
|
output.value = JSON.stringify(onc);
|
||||||
|
});
|
||||||
|
// start reading
|
||||||
|
reader.readAsText(selectedFile);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user