summaryrefslogtreecommitdiffhomepage
path: root/applications/luci-app-sshtunnel/htdocs/luci-static
diff options
context:
space:
mode:
authorSergey Ponomarev <stokito@gmail.com>2023-12-17 14:34:32 +0200
committerPaul Donald <itsascambutmailmeanyway@gmail.com>2023-12-27 20:24:25 +0000
commit949e7cbcb33cc457bfcdd27aaf4da487bab89f30 (patch)
tree717662511273f04f154670377cf804f9603e79c0 /applications/luci-app-sshtunnel/htdocs/luci-static
parent3933633dd0de84b1c13af5d8f62b6b2431bf1ca7 (diff)
luci-app-sshtunnel: ssh_keys: list keys without a corresponding .pub
The private keys doesn't have any extension so the only way to clearly say that this file is a key is a presence of the corresponding .pub file. Most of time key files have a prefix id_ e.g. id_rsa etc. The dropbearkey generates a key without a corresponding .pub file e.g. id_dropbearkey. So we need to detect a key files by both .pub file or id_ prefix. Key files without the id_ prefix won't be listed, sorry. Signed-off-by: Sergey Ponomarev <stokito@gmail.com>
Diffstat (limited to 'applications/luci-app-sshtunnel/htdocs/luci-static')
-rw-r--r--applications/luci-app-sshtunnel/htdocs/luci-static/resources/view/sshtunnel/ssh_keys.js43
-rw-r--r--applications/luci-app-sshtunnel/htdocs/luci-static/resources/view/sshtunnel/ssh_servers.js52
2 files changed, 65 insertions, 30 deletions
diff --git a/applications/luci-app-sshtunnel/htdocs/luci-static/resources/view/sshtunnel/ssh_keys.js b/applications/luci-app-sshtunnel/htdocs/luci-static/resources/view/sshtunnel/ssh_keys.js
index 4001404aad..2c3ee7a53f 100644
--- a/applications/luci-app-sshtunnel/htdocs/luci-static/resources/view/sshtunnel/ssh_keys.js
+++ b/applications/luci-app-sshtunnel/htdocs/luci-static/resources/view/sshtunnel/ssh_keys.js
@@ -11,14 +11,16 @@ return view.extend({
load: function () {
return L.resolveDefault(fs.list('/root/.ssh/'), []).then(function (entries) {
var tasks = [
+ // detect if OpenSSH ssh-keygen is installed
L.resolveDefault(fs.stat('/usr/bin/ssh-keygen'), {}),
];
+ var sshKeyNames = _findAllPossibleIdKeys(entries);
+
// read pub keys
- for (var i = 0; i < entries.length; i++) {
- if (entries[i].type === 'file' && entries[i].name.match(/\.pub$/)) {
- tasks.push(Promise.resolve(entries[i].name));
- tasks.push(fs.lines('/root/.ssh/' + entries[i].name));
- }
+ for (var sshKeyName of sshKeyNames) {
+ var sshPubKeyName = sshKeyName + '.pub';
+ tasks.push(Promise.resolve(sshKeyName));
+ tasks.push(fs.lines('/root/.ssh/' + sshPubKeyName));
}
return Promise.all(tasks);
});
@@ -42,12 +44,37 @@ return view.extend({
},
});
+function _findAllPossibleIdKeys(entries) {
+ var sshKeyNames = [];
+ for (var item of entries) {
+ if (item.type !== 'file') {
+ continue
+ }
+ // a key file should have a corresponding .pub file
+ if (item.name.endsWith('.pub')) {
+ var sshPubKeyName = item.name;
+ var sshKeyName = sshPubKeyName.substring(0, sshPubKeyName.length - 4);
+ if (!sshKeyNames.includes(sshKeyName)) {
+ sshKeyNames.push(sshKeyName)
+ }
+ } else {
+ // or at least it should start with id_ e.g. id_dropbear
+ if (item.name.startsWith('id_')) {
+ var sshKeyName = item.name;
+ if (!sshKeyNames.includes(sshKeyName)) {
+ sshKeyNames.push(sshKeyName)
+ }
+ }
+ }
+ }
+ return sshKeyNames;
+}
+
function _splitSshKeys(sshFiles) {
var sshKeys = {};
for (var i = 0; i < sshFiles.length; i++) {
- var sshPubKeyName = sshFiles[i];
- var sshKeyName = sshPubKeyName.substring(0, sshPubKeyName.length - 4);
- i++;
+ var sshKeyName = sshFiles[i];
+ i++; // next is a .pub content
var sshPub = sshFiles[i];
sshKeys[sshKeyName] = '<small><code>' + sshPub + '</code></small>';
}
diff --git a/applications/luci-app-sshtunnel/htdocs/luci-static/resources/view/sshtunnel/ssh_servers.js b/applications/luci-app-sshtunnel/htdocs/luci-static/resources/view/sshtunnel/ssh_servers.js
index 5aa33e6df8..e932806631 100644
--- a/applications/luci-app-sshtunnel/htdocs/luci-static/resources/view/sshtunnel/ssh_servers.js
+++ b/applications/luci-app-sshtunnel/htdocs/luci-static/resources/view/sshtunnel/ssh_servers.js
@@ -5,24 +5,17 @@
'require ui';
'require view';
-var allSshKeys = {};
-
return view.extend({
load: function () {
return L.resolveDefault(fs.list('/root/.ssh/'), []).then(function (entries) {
- var tasks = [];
- for (var i = 0; i < entries.length; i++) {
- if (entries[i].type === 'file' && entries[i].name.match(/\.pub$/)) {
- tasks.push(Promise.resolve(entries[i].name));
- }
- }
- return Promise.all(tasks);
+ var sshKeyNames = _findAllPossibleIdKeys(entries);
+ return Promise.resolve(sshKeyNames);
});
},
render: function (data) {
- var sshKeys = _splitSshKeys(data);
- if (sshKeys.length === 0) {
+ var sshKeyNames = data;
+ if (sshKeyNames.length === 0) {
ui.addNotification(null, E('p', _('No SSH keys found, <a %s>generate a new one</a>').format('href="./ssh_keys"')), 'warning');
}
@@ -58,9 +51,9 @@ return view.extend({
'See <em>ssh_config IdentityFile</em>')
);
o.value('');
- Object.keys(sshKeys).forEach(function (keyName) {
- o.value('/root/.ssh/' + keyName, keyName);
- });
+ for (var sshKeyName of sshKeyNames) {
+ o.value('/root/.ssh/' + sshKeyName, sshKeyName);
+ }
o.optional = true;
@@ -135,13 +128,28 @@ return view.extend({
},
});
-function _splitSshKeys(sshFiles) {
- var sshKeys = {};
- for (var i = 0; i < sshFiles.length; i++) {
- var sshPubKeyName = sshFiles[i];
- var sshKeyName = sshPubKeyName.substring(0, sshPubKeyName.length - 4);
- sshKeys[sshKeyName] = '';
+function _findAllPossibleIdKeys(entries) {
+ var sshKeyNames = [];
+ for (var item of entries) {
+ if (item.type !== 'file') {
+ continue
+ }
+ // a key file should have a corresponding .pub file
+ if (item.name.endsWith('.pub')) {
+ var sshPubKeyName = item.name;
+ var sshKeyName = sshPubKeyName.substring(0, sshPubKeyName.length - 4);
+ if (!sshKeyNames.includes(sshKeyName)) {
+ sshKeyNames.push(sshKeyName)
+ }
+ } else {
+ // or at least it should start with id_ e.g. id_dropbear
+ if (item.name.startsWith('id_')) {
+ var sshKeyName = item.name;
+ if (!sshKeyNames.includes(sshKeyName)) {
+ sshKeyNames.push(sshKeyName)
+ }
+ }
+ }
}
- allSshKeys = sshKeys;
- return sshKeys;
+ return sshKeyNames;
}