Implement usage log, document usage metadata (#108)

This commit is contained in:
Maxim Baz
2019-04-14 16:08:34 +02:00
committed by GitHub
parent bb29fb3122
commit 0027f519c3
7 changed files with 102 additions and 9 deletions

View File

@@ -4,6 +4,7 @@
require("chrome-extension-async");
var TldJS = require("tldjs");
var sha1 = require("sha1");
var idb = require("idb");
// native application id
var appID = "com.github.browserpass.native";
@@ -163,7 +164,7 @@ function copyToClipboard(text) {
* @param bool remove Remove this item from recent history
* @return void
*/
function saveRecent(settings, login, remove = false) {
async function saveRecent(settings, login, remove = false) {
var ignoreInterval = 60000; // 60 seconds - don't increment counter twice within this window
// save store timestamp
@@ -183,6 +184,15 @@ function saveRecent(settings, login, remove = false) {
if (!login.inCurrentDomain && login.recent.count === 1) {
updateMatchingPasswordsCount(settings.tab.id);
}
// save to usage log
const DB_VERSION = 1;
const db = await idb.openDB("browserpass", DB_VERSION, {
upgrade(db) {
db.createObjectStore("log", { keyPath: "time" });
}
});
await db.add("log", { time: Date.now(), host: settings.host, login: login.login });
}
/**
@@ -624,7 +634,7 @@ async function handleMessage(settings, message, sendResponse) {
case "copyPassword":
try {
copyToClipboard(message.login.fields.secret);
saveRecent(settings, message.login);
await saveRecent(settings, message.login);
sendResponse({ status: "ok" });
} catch (e) {
sendResponse({
@@ -636,7 +646,7 @@ async function handleMessage(settings, message, sendResponse) {
case "copyUsername":
try {
copyToClipboard(message.login.fields.login);
saveRecent(settings, message.login);
await saveRecent(settings, message.login);
sendResponse({ status: "ok" });
} catch (e) {
sendResponse({
@@ -689,7 +699,7 @@ async function handleMessage(settings, message, sendResponse) {
// dispatch initial fill request
var filledFields = await fillFields(settings, message.login, fields);
saveRecent(settings, message.login);
await saveRecent(settings, message.login);
// no need to check filledFields, because fillFields() already throws an error if empty
sendResponse({ status: "ok", filledFields: filledFields });
@@ -707,6 +717,17 @@ async function handleMessage(settings, message, sendResponse) {
}
}
break;
case "clearUsageData":
try {
await clearUsageData();
sendResponse({ status: "ok" });
} catch (e) {
sendResponse({
status: "error",
message: e.message
});
}
break;
default:
sendResponse({
status: "error",
@@ -859,6 +880,27 @@ async function receiveMessage(message, sender, sendResponse) {
}
}
/**
* Clear usage data
*
* @since 3.0.10
*
* @return void
*/
async function clearUsageData() {
// clear local storage
localStorage.removeItem("foreignFills");
localStorage.removeItem("recent");
Object.keys(localStorage).forEach(key => {
if (key.startsWith("recent:")) {
localStorage.removeItem(key);
}
});
// clear Indexed DB
await idb.deleteDB("browserpass");
}
/**
* Save settings if they are valid
*