wagon/front/dashboard.js

125 lines
3.6 KiB
JavaScript
Raw Normal View History

2022-12-04 13:32:36 -07:00
const API_URL = 'https://wg-dashboard-backend.myhost.mytld'
2022-09-12 13:49:18 -06:00
function Peer(data) {
2022-11-07 12:28:29 -07:00
this.domain = data.domain
this.name = data.domain.split('.')[0]
2022-09-13 09:57:20 -06:00
this.pubkey = data.pubkey
this.ipv4 = data.ipv4
this.ipv6 = data.ipv6
2022-11-07 12:35:38 -07:00
this.cantDelete = data.cantDelete
2022-09-12 13:49:18 -06:00
this.isDeleting = ko.observable(false)
this.deleteText = ko.computed(() => this.isDeleting()?'Deleting...':'Delete')
this.crtHref = ko.computed(() => `${API_URL}/ssl?host=${this.name}&type=cert`)
this.keyHref = ko.computed(() => `${API_URL}/ssl?host=${this.name}&type=key`)
2022-09-12 13:49:18 -06:00
}
function PeerList() {
let self = this
self.peers = ko.observableArray([])
self.newPeerName = ko.observable('')
self.newConfigText = ko.observable('')
self.isAdding = ko.observable(false)
self.addText = ko.computed(() => self.isAdding()?'Adding...':'Add')
self.isLoaded = ko.observable(false)
2022-10-20 14:03:54 -06:00
2022-09-12 13:49:18 -06:00
// Initial loading
self.getUser = async () => {
let res; try {
res = await fetch(`${API_URL}/`)
2022-09-13 10:40:35 -06:00
} catch (err) {
2022-09-12 13:49:18 -06:00
if (err) console.error(err)
2022-09-13 10:40:35 -06:00
alert('Failed to contact API and load peers list. Check your wireguard connection. ')
} if (!res.ok) {
2022-09-13 09:57:20 -06:00
if (res.status) console.log(res.status)
2022-09-12 13:49:18 -06:00
alert('Failed to contact API and load peers list. Check your wireguard connection. ')
2022-09-13 10:40:35 -06:00
} else {
2022-09-12 13:49:18 -06:00
let user; try {
user = await res.json()
} catch (err) {
console.error('Failed to parse JSON!')
if (err) console.error(err)
}
self.peers(
user.peers.sort(
(a,b) => a.ipv4.split('.')[3] - b.ipv4.split('.')[3])
.map( (i)=>new Peer(i))
)
self.token = user.token
2022-11-07 13:17:05 -07:00
self.username = user.peers[0].domain.split('.')[1]
self.tld = user.peers[0].domain.split('.')[2]
self.isLoaded(true)
2022-09-12 13:49:18 -06:00
}
}
2022-10-20 14:03:54 -06:00
2022-09-12 13:49:18 -06:00
self.addPeer = async () => {
self.isAdding(true)
const validName = self.newPeerName().trim().toLowerCase()
if (validName.length === 0) {
alert('Please enter a hostname.')
self.isAdding(false)
} else if (!/^([\-\_a-z0-9]{3,12})$/.test(validName)) {
alert('Name must be 3-12 alphanumeric chars.')
self.isAdding(false)
2022-09-13 11:20:57 -06:00
} else if (self.peers().map((peer)=>peer.name).includes(validName)) {
2022-09-12 13:49:18 -06:00
alert(`You already have a peer named ${validName}!`)
self.isAdding(false)
} else {
2022-09-13 09:57:20 -06:00
const url = `${API_URL}/?t=${self.token}&name=${validName}`
2022-09-12 13:49:18 -06:00
let res; try {
2022-09-13 09:57:20 -06:00
res = await fetch(url, {method: 'POST'})
2022-09-12 13:49:18 -06:00
} catch (err) {
alert('Failed to contact server. Are you online?')
if (err) console.error(err)
self.isAdding(false)
}
let parsedRes; try {
parsedRes = await res.text()
} catch (err) {
if (err) console.error(err)
} finally { self.isAdding(false) }
if (!res.ok) {
2022-09-13 09:57:20 -06:00
alert(res.status)
2022-09-12 13:49:18 -06:00
} else {
self.newPeerName('')
2022-11-07 12:35:38 -07:00
self.peers.push(new Peer({
domain: `${validName}.${self.username}.${self.tld}`,
cantDelete: true,
}))
2022-09-12 13:49:18 -06:00
self.newConfigText(parsedRes)
}
}
}
// Listen for user hitting enter key
self.addKeyPress = (d,e) => {
if (e.keyCode === 13) self.addPeer()
return true
}
2022-10-20 14:03:54 -06:00
2022-09-12 13:49:18 -06:00
self.delPeer = async (peer) => {
2022-09-13 11:20:57 -06:00
if (confirm(`Are you sure you want to delete ${peer.name}?`)) {
2022-09-12 13:49:18 -06:00
peer.isDeleting(true)
const url = `${API_URL}/?t=${self.token}&pubkey=${peer.pubkey}`
2022-10-20 14:13:34 -06:00
try {
const res = await fetch(url, {method: 'DELETE'})
if (res.ok) self.peers.remove(peer)
else {
if (res.status===404) self.peers.remove(peer)
try {
alert(await res.text())
} catch (err) {
console.error(`Failed to parse DELETE response into text`)
if (err) console.error(err)
} finally { peer.isDeleting(false) }
}
} catch (err) {
alert(`Failed to contact the server. Are you online?`)
} finally { peer.isDeleting(false) }
2022-09-12 13:49:18 -06:00
}
}
2022-10-20 14:03:54 -06:00
2022-09-12 13:49:18 -06:00
self.getUser()
}
ko.applyBindings(new PeerList())