more extension logging

This commit is contained in:
antelle 2021-04-11 10:17:02 +02:00
parent 9d4788cb7c
commit 5f4f007b31
No known key found for this signature in database
GPG Key ID: 63C9777AAB7C563C
2 changed files with 32 additions and 2 deletions

View File

@ -8,6 +8,9 @@ import { AppSettingsModel } from 'models/app-settings-model';
import { Alerts } from 'comp/ui/alerts';
import { PasswordGenerator } from 'util/generators/password-generator';
import { GeneratorPresets } from 'comp/app/generator-presets';
import { Logger } from 'util/logger';
const logger = new Logger('browser-extension-connector');
let appModel;
const connectedClients = {};
@ -103,11 +106,17 @@ const ProtocolHandlers = {
'change-public-keys'(request) {
let { publicKey, extensionName, clientID: clientId } = request;
if (connectedClients[clientId]) {
throw new Error('Changing keys is not allowed');
}
const keys = tweetnaclBox.keyPair();
publicKey = kdbxweb.ByteUtils.base64ToBytes(publicKey);
connectedClients[clientId] = { publicKey, extensionName, keys };
logger.info('New client key', clientId, extensionName);
return {
action: 'change-public-keys',
version: getVersion(request),
@ -206,6 +215,8 @@ const BrowserExtensionConnector = {
Events.on('file-opened', this.fileOpened);
Events.on('one-file-closed', this.oneFileClosed);
Events.on('all-files-closed', this.allFilesClosed);
logger.info('Started');
},
stop() {
@ -217,6 +228,8 @@ const BrowserExtensionConnector = {
Events.off('file-opened', this.fileOpened);
Events.off('one-file-closed', this.oneFileClosed);
Events.off('all-files-closed', this.allFilesClosed);
logger.info('Stopped');
},
startWebMessageListener() {
@ -234,6 +247,7 @@ const BrowserExtensionConnector = {
this.connectedSockets = [];
this.connectedSocketState = new WeakMap();
this.server = createServer((socket) => {
logger.info('New connection');
this.connectedSockets.push(socket);
this.connectedSocketState.set(socket, {});
this.checkSocketIdentity(socket);
@ -268,6 +282,7 @@ const BrowserExtensionConnector = {
},
onSocketClose(socket) {
logger.info('Connection closed');
// TODO: remove the client
this.connectedSockets = this.connectedSockets.filter((s) => s !== socket);
this.connectedSocketState.delete(socket);
@ -275,6 +290,7 @@ const BrowserExtensionConnector = {
onSocketData(socket, data) {
if (data.byteLength > MaxIncomingDataLength) {
logger.warn('Too many bytes rejected', data.byteLength);
socket.destroy();
return;
}
@ -303,10 +319,11 @@ const BrowserExtensionConnector = {
return;
}
const lengthBuffer = state.pendingData.slice(0, 4);
const lengthBuffer = kdbxweb.ByteUtils.arrayToBuffer(state.pendingData.slice(0, 4));
const length = new Uint32Array(lengthBuffer)[0];
if (length > MaxIncomingDataLength) {
logger.warn('Large message rejected', length);
socket.destroy();
return;
}
@ -327,6 +344,7 @@ const BrowserExtensionConnector = {
try {
request = JSON.parse(str);
} catch {
logger.warn('Failed to parse message', str);
socket.destroy();
return;
}
@ -379,7 +397,10 @@ const BrowserExtensionConnector = {
sendSocketResponse(socket, response) {
const responseData = Buffer.from(JSON.stringify(response));
const lengthBytes = Buffer.from(new Uint32Array([responseData.byteLength]).buffer);
const lengthBuf = kdbxweb.ByteUtils.arrayToBuffer(
new Uint32Array([responseData.byteLength])
);
const lengthBytes = Buffer.from(lengthBuf);
const data = Buffer.concat([lengthBytes, responseData]);
socket.write(data);
},
@ -417,6 +438,7 @@ const BrowserExtensionConnector = {
},
focusKeeWeb() {
logger.debug('Focus KeeWeb');
if (Launcher) {
Launcher.showMainWindow();
} else {

View File

@ -50,12 +50,14 @@ void connect_keeweb_pipe();
bool check_args(int argc, char *argv[]) {
if (argc < 2) {
std::cerr << "Expected origin argument" << std::endl;
return false;
}
std::string origin = argv[1];
auto found = std::find(kAllowedOrigins.begin(), kAllowedOrigins.end(), origin);
if (found == kAllowedOrigins.end()) {
std::cerr << "Bad origin: " << origin << std::endl;
return false;
}
@ -82,6 +84,7 @@ void stdin_read_cb(uv_stream_t *, ssize_t nread, const uv_buf_t *buf) {
uv_buf_t{.base = buf->base, .len = static_cast<size_t>(nread)});
process_keeweb_queue();
} else if (nread < 0) {
std::cerr << "STDIN read error: " << uv_err_name(nread) << std::endl;
quit_on_error();
}
}
@ -99,6 +102,7 @@ void stdout_write_cb(uv_write_t *req, int status) {
if (success) {
process_stdout_queue();
} else {
std::cerr << "STDOUT write error: " << uv_err_name(status) << std::endl;
quit_on_error();
}
}
@ -144,6 +148,7 @@ void keeweb_write_cb(uv_write_t *req, int status) {
if (success) {
process_keeweb_queue();
} else {
std::cerr << "Error writing to KeeWeb: " << uv_err_name(status) << std::endl;
close_keeweb_pipe();
}
}
@ -167,6 +172,7 @@ void keeweb_pipe_read_cb(uv_stream_t *, ssize_t nread, const uv_buf_t *buf) {
uv_buf_t{.base = buf->base, .len = static_cast<size_t>(nread)});
process_stdout_queue();
} else if (nread < 0) {
std::cerr << "KeeWeb read error: " << uv_err_name(nread) << std::endl;
close_keeweb_pipe();
}
}
@ -192,6 +198,7 @@ void keeweb_pipe_connect_cb(uv_connect_t *req, int status) {
process_keeweb_queue();
} else if (state.keeweb_launched) {
if (state.keeweb_connect_attempts >= kMaxKeeWebConnectAttempts) {
std::cerr << "Cannot connect to KeeWeb: timeout" << std::endl;
quit_on_error();
} else {
set_keeweb_connect_timer();
@ -204,6 +211,7 @@ void keeweb_pipe_connect_cb(uv_connect_t *req, int status) {
.flags = UV_PROCESS_DETACHED};
auto spawn_error = uv_spawn(uv_default_loop(), child_req, &options);
if (spawn_error) {
std::cerr << "Cannot spawn KeeWeb: " << uv_err_name(spawn_error) << std::endl;
quit_on_error();
} else {
uv_unref(reinterpret_cast<uv_handle_t *>(&child_req));