];
function isFileInSafeList(file){
- for (name of safeList) {
+ for (let name of safeList) {
if (file === name)
return true;
}
}
function normalizeKey(s) {
- return s.replace(/\s+/g, ' ').trim();
+ return s?.replace(/\s+/g, ' ')?.trim();
}
function determineKeyEnv() {
);
}
+function safeText(str) {
+ return String(str).replace(/[&<>"']/g, s => ({
+ '&': '&', '<': '<', '>': '>', '"': '"', "'": '''
+ }[s]));
+}
+
function renderKeyItem(pubkey) {
const safeFile = isFileInSafeList(pubkey?.filename);
const lines = pubkey?.key?.trim()?.split('\n').map(line =>
- [ E('br'), E('code', line) ]
+ [ E('br'), E('code', {}, [ safeText(line) ]) ]
).flat();
return E('div', {
class: 'item',
'data-file': pubkey?.filename,
'data-key': normalizeKey(pubkey?.key)
}, [
- E('strong', [ pubkey?.filename || _('Unnamed key') ]),
+ E('strong', {}, [ pubkey?.filename || _('Unnamed key') ]),
...lines
]);
}
click: isReadonlyView ? null : removeKey,
'data-key': pubkey.src
}, [
- E('strong', [ pubkey.comment || _('Unnamed key') ]), E('br'),
- E('small', [
+ E('strong', {}, [ pubkey.comment || _('Unnamed key') ]), E('br'),
+ E('small', {}, [
'%s, %s'.format(pubkey.type, pubkey.curve || _('%d Bit').format(pubkey.bits)),
- pubkey.options ? E([], [
+ pubkey.options ? E([], {}, [
' / ', _('Options:'), ' ',
- E('code', Object.keys(pubkey.options).sort().join(', '))
+ E('code', {}, [Object.keys(pubkey.options).sort().join(', ')])
]) : '',
- E('br'), E('code', pubkey.fprint)
+ E('br'), E('code', {}, [pubkey.fprint])
])
]);
}