Browse Source

add allowed IPs to client creation

pull/313/head
David Calvo 4 years ago
parent
commit
748e24a4a5
  1. 6
      src/lib/Server.js
  2. 24
      src/lib/WireGuard.js
  3. 10
      src/www/index.html
  4. 4
      src/www/js/api.js
  5. 6
      src/www/js/app.js

6
src/lib/Server.js

@ -130,9 +130,9 @@ module.exports = class Server {
res.header('Content-Type', 'text/plain');
res.send(config);
}))
.post('/api/wireguard/client', Util.promisify(async (req) => {
const { name } = req.body;
return WireGuard.createClient({ name });
.post('/api/wireguard/client', Util.promisify(async req => {
const { name, allowedIps } = req.body;
return WireGuard.createClient({ name, allowedIps });
}))
.delete('/api/wireguard/client/:clientId', Util.promisify(async (req) => {
const { clientId } = req.params;

24
src/lib/WireGuard.js

@ -112,7 +112,7 @@ PostDown = ${WG_POST_DOWN}
[Peer]
PublicKey = ${client.publicKey}
PresharedKey = ${client.preSharedKey}
AllowedIPs = ${client.address}/32`;
AllowedIPs = ${client.address}`;
}
debug('Config saving...');
@ -220,7 +220,7 @@ Endpoint = ${WG_HOST}:${WG_PORT}`;
});
}
async createClient({ name }) {
async createClient({ name, allowedIps }) {
if (!name) {
throw new Error('Missing: Name');
}
@ -231,16 +231,20 @@ Endpoint = ${WG_HOST}:${WG_PORT}`;
const publicKey = await Util.exec(`echo ${privateKey} | wg pubkey`);
const preSharedKey = await Util.exec('wg genpsk');
// Calculate next IP
let address;
for (let i = 2; i < 255; i++) {
const client = Object.values(config.clients).find((client) => {
return client.address === WG_DEFAULT_ADDRESS.replace('x', i);
});
if (allowedIps) {
address = allowedIps
} else {
// Calculate next IP
for (let i = 2; i < 255; i++) {
const client = Object.values(config.clients).find(client => {
return client.address.includes(WG_DEFAULT_ADDRESS.replace('x', i));
});
if (!client) {
address = WG_DEFAULT_ADDRESS.replace('x', i);
break;
if (!client) {
address = `${WG_DEFAULT_ADDRESS.replace('x', i)}/32`;
break;
}
}
}

10
src/www/index.html

@ -67,8 +67,8 @@
<p class="text-2xl font-medium dark:text-neutral-200">Clients</p>
</div>
<div class="flex-shrink-0">
<button @click="clientCreate = true; clientCreateName = '';"
class="hover:bg-red-800 hover:border-red-800 hover:text-white text-gray-700 dark:text-neutral-200 border-2 border-gray-100 dark:border-neutral-600 py-2 px-4 rounded inline-flex items-center transition">
<button @click="clientCreate = true; clientCreateName = ''; clientCreateAllowedIps = '';"
class="hover:bg-red-800 hover:border-red-800 hover:text-white text-gray-700 border-2 border-gray-100 py-2 px-4 rounded inline-flex items-center transition">
<svg class="w-4 mr-2" inline xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"
stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2"
@ -349,6 +349,12 @@
type="text" v-model.trim="clientCreateName" placeholder="Name" />
</p>
</div>
<div class="mt-2">
<p class="text-sm text-gray-500">
<input class="rounded p-2 border-2 border-gray-100 focus:border-gray-200 outline-none w-full"
type="text" v-model.trim="clientCreateAllowedIps" placeholder="Allowed IPs (optional)" />
</p>
</div>
</div>
</div>
</div>

4
src/www/js/api.js

@ -72,11 +72,11 @@ class API {
})));
}
async createClient({ name }) {
async createClient({ name, allowedIps }) {
return this.call({
method: 'post',
path: '/wireguard/client',
body: { name },
body: { name, allowedIps },
});
}

6
src/www/js/app.js

@ -36,6 +36,7 @@ new Vue({
clientDelete: null,
clientCreate: null,
clientCreateName: '',
clientCreateAllowedIps: '',
clientEditName: null,
clientEditNameId: null,
clientEditAddress: null,
@ -210,10 +211,11 @@ new Vue({
},
createClient() {
const name = this.clientCreateName;
const allowedIps = this.clientCreateAllowedIps;
if (!name) return;
this.api.createClient({ name })
.catch((err) => alert(err.message || err.toString()))
this.api.createClient({ name, allowedIps })
.catch(err => alert(err.message || err.toString()))
.finally(() => this.refresh().catch(console.error));
},
deleteClient(client) {

Loading…
Cancel
Save