wagon/front/admin.js

230 lines
7.0 KiB
JavaScript
Raw Normal View History

2022-12-04 13:32:36 -07:00
const API_URL = 'https://wg-admin-backend.myhost.mytld'
const TLD = 'mytld'
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
2022-10-21 12:42:34 -06:00
this.cantDelete = data.cantDelete
2022-09-15 08:49:45 -06:00
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
this.isDeleting = ko.observable(false)
2022-09-18 17:33:19 -06:00
}
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([])
self.newUserHostname = ko.observable('')
self.newUsername = ko.observable('')
self.isAddingUser = ko.observable(false)
self.addUserText = ko.computed(() => self.isAddingUser()?'Adding...':'Add')
self.userToDelete = ko.observable('')
self.isDeletingUser = ko.observable(false)
self.deleteUserText = ko.computed(() => self.isDeletingUser()?'Deleting...':'Delete')
2022-11-06 16:08:33 -07:00
self.isLoaded = ko.observable(false)
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()])
self.token = user.token
2022-11-06 16:08:33 -07:00
self.isLoaded(true)
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)
} 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 {
const url = `${API_URL}/peer?t=${self.token}&host=${validHostname}&user=${self.newPeerUser().name}&num=${self.newPeerUser().number}`
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 {
self.newPeerHostname('')
2022-10-21 11:51:52 -06:00
self.peers.push(new Peer({
2022-10-21 12:37:39 -06:00
domain:`${validHostname}.${self.newPeerUser().name}.${TLD}`,
2022-10-21 12:42:34 -06:00
cantDelete: true,
2022-10-21 11:51:52 -06:00
}))
2022-09-15 08:49:45 -06:00
self.newConfigText(parsedRes)
2022-11-07 13:10:59 -07:00
new QRCode(document.getElementById('qrcode'),parsedRes)
2022-09-15 08:49:45 -06:00
}
}
}
// Listen for user hitting enter key
self.addPeerKeyPress = (d,e) => {
2022-09-15 08:49:45 -06:00
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)
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
self.addUser = async () => {
self.isAddingUser(true)
const validHostname = self.newUserHostname().trim().toLowerCase()
const validUsername = self.newUsername().trim().toLowerCase()
if (validHostname.length === 0) {
alert('Please enter a hostname.')
self.isAddingUser(false)
} else if (validUsername.length === 0) {
alert('Please enter a username.')
self.isAddingUser(false)
} else if (!/^([\-\_a-z0-9]{3,12})$/.test(validHostname)) {
alert('Hostname must be 3-12 alphanumeric chars.')
self.isAddingUser(false)
} else if (!/^([\-\_a-z0-9]{3,12})$/.test(validUsername)) {
alert('Username must be 3-12 alphanumeric chars.')
self.isAddingUser(false)
} else if (self.users().map((user)=>user.name).includes(validUsername)) {
alert(`There is already a user named ${validUsername}!`)
self.isAddingUser(false)
} else {
const url = `${API_URL}/user?t=${self.token}&host=${validHostname}&user=${validUsername}`
console.log(url)
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.isAddingUser(false)
}
let parsedRes; try {
parsedRes = await res.text()
} catch (err) {
if (err) console.error(err)
} finally {
self.isAddingUser(false)
}
if (!res.ok) {
alert(res.status)
} else {
self.newUserHostname('')
self.newUsername('')
self.peers.push(new Peer({
domain:`${validHostname}.${validUsername}.${TLD}`,
cantDelete: true,
}))
self.newConfigText(parsedRes)
2022-11-07 13:10:59 -07:00
new QRCode(document.getElementById('qrcode'),parsedRes)
}
}
}
// Listen for user hitting enter key
self.addUserKeyPress = (d,e) => {
if (e.keyCode === 13) self.addUser()
return true
}
2022-11-01 19:21:47 -06:00
self.delUser = async () => {
2022-11-01 19:46:14 -06:00
user = self.userToDelete()
2022-11-01 19:48:51 -06:00
if (confirm(`Are you sure you want to delete ${user.name}?`)) {
2022-11-02 13:24:18 -06:00
self.isDeletingUser(true)
const url = `${API_URL}/user?t=${self.token}&user=${user.name}&un=${user.number}`
try {
const res = await fetch(url, {method: 'DELETE'})
2022-11-02 13:24:18 -06:00
if (res.ok) {
self.users.remove(user)
self.peers().forEach( (peer)=> {
if ( peer.domain.split('.')[1] === user.name)
self.peers.remove(peer)
} )
try {
alert(await res.text())
} catch (err) {
2022-11-02 13:24:18 -06:00
alert('success')
if (err) console.error(err)
2022-11-02 13:24:18 -06:00
} finally { self.isDeletingUser(false) }
}
} catch (err) {
2022-11-02 13:16:16 -06:00
if (err) console.error(err)
alert(`Failed to contact the server. Are you online?`)
} finally {
2022-11-02 13:24:18 -06:00
self.isDeletingUser(false)
}
}
}
2022-09-18 17:33:19 -06:00
self.getUsers()
2022-09-15 08:49:45 -06:00
}
ko.applyBindings(new PeerList())