2022-09-15 08:49:45 -06:00
|
|
|
const API_URL = 'https://wgapi-test-admin-backend.ksn.gf4'
|
2022-10-20 17:26:45 -06:00
|
|
|
const TLD = 'gf4'
|
2022-09-15 08:49:45 -06:00
|
|
|
|
|
|
|
function Peer(data) {
|
2022-09-15 21:50:35 -06:00
|
|
|
this.domain = data.domain
|
2022-09-15 08:49:45 -06:00
|
|
|
this.pubkey = data.pubkey
|
|
|
|
this.ipv4 = data.ipv4
|
|
|
|
this.ipv6 = data.ipv6
|
|
|
|
this.isDeleting = ko.observable(false)
|
|
|
|
this.deleteText = ko.computed(() => this.isDeleting()?'Deleting...':'Delete')
|
|
|
|
}
|
2022-09-18 17:33:19 -06:00
|
|
|
function User(data) {
|
|
|
|
this.name = data.name
|
|
|
|
this.number = data.number
|
|
|
|
}
|
2022-09-15 08:49:45 -06:00
|
|
|
|
|
|
|
function PeerList() {
|
|
|
|
let self = this
|
|
|
|
self.peers = ko.observableArray([])
|
2022-09-18 17:33:19 -06:00
|
|
|
self.newPeerHostname = ko.observable('')
|
|
|
|
self.newPeerUser = ko.observable('')
|
2022-09-15 08:49:45 -06:00
|
|
|
self.newConfigText = ko.observable('')
|
2022-09-21 19:18:21 -06:00
|
|
|
self.isAddingPeer = ko.observable(false)
|
|
|
|
self.addPeerText = ko.computed(() => self.isAddingPeer()?'Adding...':'Add')
|
2022-09-18 18:35:46 -06:00
|
|
|
self.users = ko.observableArray([])
|
2022-09-18 20:35:43 -06:00
|
|
|
self.token = ko.observable('')
|
2022-10-03 12:44:41 -06:00
|
|
|
|
2022-09-15 08:49:45 -06:00
|
|
|
// Initial loading
|
2022-09-18 17:33:19 -06:00
|
|
|
self.getUsers = async () => {
|
2022-09-15 08:49:45 -06:00
|
|
|
let res; try {
|
2022-09-15 21:33:17 -06:00
|
|
|
res = await fetch(`${API_URL}/peer/`)
|
2022-09-15 08:49:45 -06:00
|
|
|
} catch (err) {
|
|
|
|
if (err) console.error(err)
|
|
|
|
alert('Failed to contact API and load peers list. Check your wireguard connection. ')
|
|
|
|
} if (!res.ok) {
|
|
|
|
if (res.status) console.log(res.status)
|
|
|
|
alert('Failed to contact API and load peers list. Check your wireguard connection. ')
|
|
|
|
} else {
|
|
|
|
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(
|
2022-09-15 22:00:48 -06:00
|
|
|
(a,b) => a.ipv4.split('.')[3] - b.ipv4.split('.')[3])
|
2022-09-15 22:02:58 -06:00
|
|
|
.sort(
|
|
|
|
(a,b) => a.ipv4.split('.')[2] - b.ipv4.split('.')[2])
|
2022-09-15 08:49:45 -06:00
|
|
|
.map( (i)=>new Peer(i))
|
|
|
|
)
|
2022-09-18 21:04:11 -06:00
|
|
|
self.users([...new Map(
|
2022-09-18 21:10:00 -06:00
|
|
|
user.peers.filter( (u) =>
|
|
|
|
u.ipv4.split('.')[2]!=='0'
|
|
|
|
).map((u)=>new User({
|
2022-09-18 21:04:11 -06:00
|
|
|
name: u.domain.split('.')[1],
|
|
|
|
number: u.ipv4.split('.')[2],
|
|
|
|
})).map(i=>[i['number'],i])
|
|
|
|
).values()])
|
2022-09-18 17:33:19 -06:00
|
|
|
self.token(user.token)
|
2022-09-15 08:49:45 -06:00
|
|
|
}
|
|
|
|
}
|
2022-10-03 12:44:41 -06:00
|
|
|
|
2022-09-15 08:49:45 -06:00
|
|
|
self.addPeer = async () => {
|
2022-09-21 19:18:21 -06:00
|
|
|
self.isAddingPeer(true)
|
|
|
|
const validHostname = self.newPeerHostname().trim().toLowerCase()
|
|
|
|
if (validHostname.length === 0) {
|
2022-09-15 08:49:45 -06:00
|
|
|
alert('Please enter a hostname.')
|
2022-09-21 19:18:21 -06:00
|
|
|
self.isAddingPeer(false)
|
|
|
|
} else if (!/^([\-\_a-z0-9]{3,12})$/.test(validHostname)) {
|
2022-09-15 08:49:45 -06:00
|
|
|
alert('Name must be 3-12 alphanumeric chars.')
|
2022-09-21 19:18:21 -06:00
|
|
|
self.isAddingPeer(false)
|
2022-10-20 17:26:45 -06:00
|
|
|
} else if (self.peers().map((peer)=>peer.domain.slice(0,peer.domain.lastIndexOf('.'))).includes(`${validHostname}.${self.newPeerUser().name}`)) {
|
2022-10-20 14:22:53 -06:00
|
|
|
alert(`There is already a peer named ${validHostname}.${self.newPeerUser().name}!`)
|
2022-09-21 19:18:21 -06:00
|
|
|
self.isAddingPeer(false)
|
2022-09-15 08:49:45 -06:00
|
|
|
} else {
|
2022-10-20 16:15:20 -06:00
|
|
|
const url = `${API_URL}/peer?t=${self.token()}&host=${validHostname}&user=${self.newPeerUser().name}&num=${self.newPeerUser().number}`
|
2022-10-20 14:25:35 -06:00
|
|
|
let res; try {
|
|
|
|
res = await fetch(url, {method: 'POST'})
|
|
|
|
} catch (err) {
|
|
|
|
alert('Failed to contact server. Are you online?')
|
|
|
|
if (err) console.error(err)
|
|
|
|
self.isAddingPeer(false)
|
|
|
|
}
|
2022-09-15 08:49:45 -06:00
|
|
|
let parsedRes; try {
|
|
|
|
parsedRes = await res.text()
|
|
|
|
} catch (err) {
|
|
|
|
if (err) console.error(err)
|
2022-09-21 19:18:21 -06:00
|
|
|
} finally { self.isAddingPeer(false) }
|
2022-09-15 08:49:45 -06:00
|
|
|
if (!res.ok) {
|
|
|
|
alert(res.status)
|
|
|
|
} else {
|
2022-10-20 17:26:45 -06:00
|
|
|
self.newPeerHostname('')
|
|
|
|
self.peers.push(new Peer({domain:`${validHostName}.${self.newPeerUser().name}.${TLD}`}))
|
2022-09-15 08:49:45 -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-03 12:44:41 -06:00
|
|
|
|
2022-09-15 08:49:45 -06:00
|
|
|
self.delPeer = async (peer) => {
|
2022-09-15 21:50:35 -06:00
|
|
|
if (confirm(`Are you sure you want to delete ${peer.domain}?`)) {
|
2022-09-15 08:49:45 -06:00
|
|
|
peer.isDeleting(true)
|
2022-10-20 18:56:03 -06:00
|
|
|
const url = `${API_URL}/peer?t=${self.token()}&pubkey=${peer.pubkey}`
|
2022-09-15 08:49:45 -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-10-03 12:44:41 -06:00
|
|
|
|
2022-09-18 17:33:19 -06:00
|
|
|
self.getUsers()
|
2022-09-15 08:49:45 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
ko.applyBindings(new PeerList())
|