From 8a9dbe39d5b5f3227f46868b3b15f7cc72a50651 Mon Sep 17 00:00:00 2001 From: Paul Dee Date: Thu, 11 Nov 2021 01:31:43 +0100 Subject: [PATCH] luci-proto-wireguard: display interface public key Signed-off-by: Paul Dee --- .../resources/protocol/wireguard.js | 29 ++++++++++++++++++- .../root/usr/libexec/rpcd/luci.wireguard | 8 +++++ .../usr/share/rpcd/acl.d/luci-wireguard.json | 1 + 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js b/protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js index 5795eaebec..78b3207d9e 100644 --- a/protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js +++ b/protocols/luci-proto-wireguard/htdocs/luci-static/resources/protocol/wireguard.js @@ -11,6 +11,13 @@ var generateKey = rpc.declare({ expect: { keys: {} } }); +var getPublicAndPrivateKeyFromPrivate = rpc.declare({ + object: 'luci.wireguard', + method: 'getPublicAndPrivateKeyFromPrivate', + params: ['privkey'], + expect: { keys: {} } +}); + var generateQrCode = rpc.declare({ object: 'luci.wireguard', method: 'generateQrCode', @@ -88,14 +95,34 @@ return network.registerProtocol('wireguard', { o.validate = validateBase64; o.rmempty = false; + var sections = uci.sections('network'); + var serverName = this.getIfname(); + var server = findSection(sections, serverName); + + o = s.taboption('general', form.Value, 'public_key', _('Public Key'), _('Base64-encoded public key of this interface for sharing.')); + o.rmempty = false; + o.write = function() {/* write nothing */}; + + o.load = function(s) { + return getPublicAndPrivateKeyFromPrivate(server.private_key).then( + function(keypair) { + return keypair.pub || ''; + }, + function(error){ + return _('Error getting PublicKey'); + }, this) + }; + o = s.taboption('general', form.Button, 'generate_key', _('Generate Key')); o.inputstyle = 'apply'; o.onclick = ui.createHandlerFn(this, function(section_id, ev) { return generateKey().then(function(keypair) { var keyInput = document.getElementById('widget.cbid.network.%s.private_key'.format(section_id)), - changeEvent = new Event('change'); + changeEvent = new Event('change'), + pubKeyInput = document.getElementById('widget.cbid.network.%s.public_key'.format(section_id)); keyInput.value = keypair.priv || ''; + pubKeyInput.value = keypair.pub || ''; keyInput.dispatchEvent(changeEvent); }); }, s.section); diff --git a/protocols/luci-proto-wireguard/root/usr/libexec/rpcd/luci.wireguard b/protocols/luci-proto-wireguard/root/usr/libexec/rpcd/luci.wireguard index 681e98e5c4..bbe91cdd6a 100755 --- a/protocols/luci-proto-wireguard/root/usr/libexec/rpcd/luci.wireguard +++ b/protocols/luci-proto-wireguard/root/usr/libexec/rpcd/luci.wireguard @@ -16,6 +16,14 @@ local methods = { return {keys = {priv = prv, pub = pub}} end }, + getPublicAndPrivateKeyFromPrivate = { + args = {privkey = "privkey"}, + call = function(args) + local pubkey = sys.exec("echo %s | wg pubkey 2>/dev/null" % util.shellquote(args.privkey)):sub(1, -2) + + return {keys = {priv = args.privkey, pub = pubkey}} + end + }, generateQrCode = { args = {privkey = "privkey", psk = "psk", allowed_ips = {"allowed_ips"}}, call = function(args) diff --git a/protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json b/protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json index 04877d4f49..aa949b9d14 100644 --- a/protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json +++ b/protocols/luci-proto-wireguard/root/usr/share/rpcd/acl.d/luci-wireguard.json @@ -5,6 +5,7 @@ "ubus": { "luci.wireguard": [ "generateKeyPair", + "getPublicAndPrivateKeyFromPrivate", "generateQrCode" ] } -- 2.30.2