Skip to content

Commit 9824ac7

Browse files
fvirdiaFernando Virdia
and
Fernando Virdia
authored
Debug feature: log export (#15)
* adding debug log functionality when VERBOSE = true * separate VERBOSE and DEBUG_LOG_ACTIVITY --------- Co-authored-by: Fernando Virdia <[email protected]>
1 parent f3d72c4 commit 9824ac7

11 files changed

+138
-35
lines changed

Diff for: src/background.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ import {
2727
setDisabled
2828
} from './scripts/toggle.js'
2929

30+
import {
31+
debug_log
32+
} from './scripts/debug_log.js'
33+
3034
import {
3135
sendPPModeStatus,
3236
statusRequestListener
@@ -40,7 +44,7 @@ import {
4044

4145
chrome.runtime.onMessage.addListener(async (message, sender, sendResponse) => {
4246
if (VERBOSE) {
43-
console.log(`onMessage: ${message}`);
47+
debug_log(`onMessage: ${message}`);
4448
}
4549
if (message == "enabled_changed") {
4650
const { enabled } = await browser.storage.local.get({ 'enabled': false });
@@ -110,7 +114,7 @@ chrome.runtime.onMessageExternal.addListener(statusRequestListener);
110114

111115
async function onStart() {
112116
if (VERBOSE) {
113-
console.log(`onStart: ${new Date().toISOString().match(/(\d{2}:){2}\d{2}/)[0]}`);
117+
debug_log(`onStart: ${new Date().toISOString().match(/(\d{2}:){2}\d{2}/)[0]}`);
114118
}
115119
// reset enabled/disabled status depending on what the user left it as
116120
const { enabled } = await browser.storage.local.get({ 'enabled': false });

Diff for: src/pages/settings.html

+14
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,20 @@ <h1>Privacy Pass Settings</h1>
5454
<!-- <img id="kagipp-discard-current-token-check" class="checkmark" src="../images/check.svg" /> -->
5555
</div>
5656
</div>
57+
<div class="setting" style="display: none;">
58+
<div class="setting-text">
59+
<div class="setting-name">
60+
Export debug log
61+
</div>
62+
<div class="setting-desc">
63+
Exports a log of the extension activity.
64+
<strong style="color: #FF5A0A">DANGER:</strong> this log includes your search queries!
65+
</div>
66+
</div>
67+
<div id="kagipp-export-debug-log" class="setting-button">
68+
<span>Export log</span>
69+
</div>
70+
</div>
5771
<div class="setting">
5872
<div class="setting-text">
5973
<div class="setting-name">

Diff for: src/pages/settings.js

+31
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ import {
22
clearState
33
} from '../popup/clear.js'
44

5+
import {
6+
DEBUG_LOG_ACTIVITY
7+
} from '../scripts/config.js'
58

69
// ----- generate tokens
710

@@ -12,6 +15,7 @@ const savesessioncookiebtn = document.querySelector("#kagipp-save-session-cookie
1215
const savesessioncookiecheck = document.querySelector("#kagipp-save-session-cookie-check")
1316
const discardtokenbtn = document.querySelector("#kagipp-discard-current-token")
1417
const discardtokencheck = document.querySelector("#kagipp-discard-current-token-check")
18+
const exportdebugbtn = document.querySelector("#kagipp-export-debug-log")
1519

1620
async function generate_tokens() {
1721
// attempt to generate tokens
@@ -73,4 +77,31 @@ if (sessioncookieinp && savesessioncookiebtn) {
7377
const { kagi_session } = await browser.storage.local.get({ "kagi_session": "" })
7478
sessioncookieinp.value = kagi_session
7579
savesessioncookiebtn.addEventListener("click", save_session_cookie_value)
80+
}
81+
82+
async function export_debug_log() {
83+
const { log } = await browser.storage.local.get({ 'log': [] });
84+
const log_txt = JSON.stringify(log);
85+
const filename = "debug_log.txt"
86+
const inputblob = new File([log_txt], filename, {
87+
type: "text/plain"
88+
});
89+
const url = URL.createObjectURL(inputblob);
90+
var link = document.createElement("a"); // Or maybe get it from the current document
91+
link.href = url;
92+
link.download = filename
93+
link.textContent = "download"
94+
link.style.display = "none"
95+
document.body.appendChild(link); // Or append it whereever you want
96+
link.click()
97+
link.remove()
98+
}
99+
100+
if (exportdebugbtn) {
101+
if (DEBUG_LOG_ACTIVITY) {
102+
if (exportdebugbtn.parentNode) {
103+
exportdebugbtn.parentNode.style.display = "inherit"
104+
}
105+
exportdebugbtn.addEventListener("click", export_debug_log)
106+
}
76107
}

Diff for: src/popup/utils.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
// ---- error reporting
22

3+
import {
4+
debug_log
5+
} from '../scripts/debug_log.js';
6+
37
function time() {
48
return new Date().toISOString().match(/(\d{2}:){2}\d{2}/)[0]
59
}
@@ -12,7 +16,7 @@ async function logStatus(msg, type) {
1216
}
1317

1418
async function logError(err) {
15-
console.log(`Error: ${err}`)
19+
debug_log(`Error: ${err}`)
1620
logStatus(err, 'error')
1721
}
1822

Diff for: src/scripts/communication_with_main_extension.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,20 @@ import {
99
VERBOSE
1010
} from './config.js'
1111

12+
import {
13+
debug_log
14+
} from './debug_log.js'
15+
1216
async function sendPPModeStatus() {
1317
if (VERBOSE) {
14-
console.log('sendPPModeStatus')
18+
debug_log('sendPPModeStatus')
1519
}
1620
const { enabled } = await chrome.storage.local.get({ 'enabled': false });
1721
try {
1822
await chrome.runtime.sendMessage(KAGI_EXTENSION_ID, { 'enabled': enabled });
1923
} catch (ex) {
2024
if (VERBOSE) {
21-
console.log(`Main extension not available: ${ex}`)
25+
debug_log(`Main extension not available: ${ex}`)
2226
}
2327
}
2428
}
@@ -30,7 +34,7 @@ async function statusRequestListener(request, sender, sendResponse) {
3034
return;
3135
}
3236
if (VERBOSE) {
33-
console.log(`message from Kagi Search extension: ${request}`)
37+
debug_log(`message from Kagi Search extension: ${request}`)
3438
}
3539
const { enabled } = await chrome.storage.local.get({ 'enabled': false });
3640
sendResponse(enabled); // chrome

Diff for: src/scripts/config.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@ export const IS_FIREFOX = (typeof browser.runtime.getBrowserInfo === 'function')
66

77
// debug settings
88
export const STAGING = false;
9-
export const VERBOSE = false;
109
export const GEN_TOKENS_ON_LOW_COUNT = true;
1110
export const GEN_TOKENS_ON_ZERO_COUNT = true;
11+
// only set DEBUG_LOG_ACTIVITY to true if
12+
// debugging a specific issue
13+
export const DEBUG_LOG_ACTIVITY = false;
14+
export const VERBOSE = DEBUG_LOG_ACTIVITY || false;
1215

1316
// endpoints
1417
export const SCHEME = "https"

Diff for: src/scripts/debug_log.js

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import {
2+
DEBUG_LOG_ACTIVITY,
3+
} from './config.js'
4+
5+
async function debug_log(msg) {
6+
console.log(msg)
7+
// only log activity when extension built as "VERBOSE"
8+
// this is exclusively a debug feature
9+
if (!DEBUG_LOG_ACTIVITY) {
10+
return;
11+
}
12+
let { log } = await browser.storage.local.get({ 'log': [] });
13+
const evt = {
14+
'level': 'info',
15+
'message': msg,
16+
'timestamp': (new Date()).getTime(),
17+
}
18+
log.push(evt)
19+
await browser.storage.local.set({ 'log': log });
20+
}
21+
22+
export {
23+
debug_log
24+
};

Diff for: src/scripts/generation_and_redemption.js

+11-7
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ import {
1717
clearError
1818
} from "../popup/utils.js";
1919

20+
import {
21+
debug_log
22+
} from './debug_log.js'
23+
2024
import {
2125
countTokens,
2226
beginningOfPriorEpoch
@@ -35,7 +39,7 @@ import {
3539

3640
async function unloadNextToken(endpoint) {
3741
if (VERBOSE) {
38-
// console.log(`unloadNextToken: ${endpoint}`)
42+
// debug_log(`unloadNextToken: ${endpoint}`)
3943
}
4044
const { enabled } = await browser.storage.local.get({ 'enabled': false });
4145
if (enabled) {
@@ -54,7 +58,7 @@ async function unloadNextToken(endpoint) {
5458

5559
async function loadNextToken(endpoint) {
5660
if (VERBOSE) {
57-
console.log(`loadNextToken: ${endpoint}`)
61+
debug_log(`loadNextToken: ${endpoint}`)
5862
}
5963
const { enabled } = await browser.storage.local.get({ 'enabled': false });
6064
if (!enabled) {
@@ -116,7 +120,7 @@ async function forceLoadNextToken(endpoint) {
116120

117121
async function genTokens() {
118122
if (VERBOSE) {
119-
console.log('genTokens')
123+
debug_log('genTokens')
120124
}
121125
await logStatus("generating new tokens", 'wait')
122126
// try to fetch the tokens via .onion domain
@@ -151,7 +155,7 @@ async function genTokens() {
151155

152156
async function setPPHeaders(endpoint) {
153157
if (VERBOSE) {
154-
console.log(`setPPHeaders: ${endpoint}`)
158+
debug_log(`setPPHeaders: ${endpoint}`)
155159
}
156160
try {
157161
await loadNextToken(endpoint);
@@ -163,16 +167,16 @@ async function setPPHeaders(endpoint) {
163167

164168
async function unsetPPHeaders(endpoint) {
165169
if (VERBOSE) {
166-
console.log(`unsetPPHeaders: ${endpoint}`)
170+
debug_log(`unsetPPHeaders: ${endpoint}`)
167171
}
168172
await unloadNextToken(endpoint);
169173
}
170174

171175
async function setPPHeadersListener(details) {
172176
if (VERBOSE) {
173-
console.log(`setPPHeadersListener: ${details.statusCode} ${details.url}`)
177+
debug_log(`setPPHeadersListener: ${details.statusCode} ${details.url}`)
174178
const remiaining_tokens = await countTokens();
175-
console.log(`remaining tokens: ${remiaining_tokens}`)
179+
debug_log(`remaining tokens: ${remiaining_tokens}`)
176180
}
177181
const url = new URL(details.url);
178182
const scheme_domain_port = url.origin;

Diff for: src/scripts/headers.js

+13-10
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ import {
4646
DOMAIN
4747
} from './config.js'
4848

49+
import {
50+
debug_log
51+
} from './debug_log.js'
4952

5053
// --- general utilities
5154

@@ -140,15 +143,15 @@ function compileHeaderRuleset(ruleset, offset, ruleEndpointPath = "", rulePriori
140143
async function setHeaderRuleset(ruleset, offset, ruleEndpointPath = "", rulePriority = 1, subDomain = "") {
141144
const rules = compileHeaderRuleset(ruleset, offset, ruleEndpointPath, rulePriority, subDomain);
142145
if (VERBOSE) {
143-
console.log(`setHeaderRuleset: ${rules}`)
146+
debug_log(`setHeaderRuleset: ${rules}`)
144147
}
145148
await browser.declarativeNetRequest.updateDynamicRules(rules)
146149
}
147150

148151
async function unsetHeaderRuleset(ruleset, offset) {
149152
let rule_ids = compileHeaderRuleset(ruleset, offset).removeRuleIds;
150153
if (VERBOSE) {
151-
console.log(`unsetHeaderRuleset: ${rule_ids}`);
154+
debug_log(`unsetHeaderRuleset: ${rule_ids}`);
152155
}
153156
await chrome.declarativeNetRequest.updateDynamicRules({
154157
addRules: [],
@@ -175,11 +178,11 @@ async function unsetRefererRules() {
175178

176179
async function selfRemovingUnsetRefererHeadersListener(details) {
177180
if (VERBOSE) {
178-
console.log(`selfRemovingUnsetRefererHeadersListener: ${details.url}`)
181+
debug_log(`selfRemovingUnsetRefererHeadersListener`)
179182
}
180183
if (!browser.webRequest.onCompleted.hasListener(selfRemovingUnsetRefererHeadersListener)) {
181184
if (VERBOSE) {
182-
console.log(`selfRemovingUnsetRefererHeadersListener: no prior listener, doing nothing`)
185+
debug_log(`selfRemovingUnsetRefererHeadersListener: no prior listener, doing nothing`)
183186
}
184187
return;
185188
}
@@ -237,7 +240,7 @@ function compileHTTPAuthorizationRuleset(endpoint, token_tuple) {
237240

238241
async function setLocaRedirectorHeader() {
239242
if (VERBOSE) {
240-
console.log(`setLocaRedirectorHeader`)
243+
debug_log(`setLocaRedirectorHeader`)
241244
}
242245
// requests with `token=...` as a GET variable (ie, from session link / search bar main without extension)
243246
// search without the redirect rule results in
@@ -292,7 +295,7 @@ async function setLocaRedirectorHeader() {
292295

293296
async function unsetLocaRedirectorHeader() {
294297
if (VERBOSE) {
295-
console.log("unsetLocaRedirectorHeader");
298+
debug_log("unsetLocaRedirectorHeader");
296299
}
297300
await chrome.declarativeNetRequest.updateDynamicRules({
298301
addRules: [],
@@ -302,7 +305,7 @@ async function unsetLocaRedirectorHeader() {
302305

303306
async function setAuthorizationHeader(endpoint, token_tuple) {
304307
if (VERBOSE) {
305-
console.log(`[${endpoint}] ${token_tuple[0].substring(0, 32)}`)
308+
debug_log(`[${endpoint}] ${token_tuple[0].substring(0, 32)}`)
306309
}
307310
await unsetNoTokensRedirect(endpoint);
308311
const rules = compileHTTPAuthorizationRuleset(endpoint, token_tuple);
@@ -317,7 +320,7 @@ async function unsetAuthorizationHeader(endpoint) {
317320
await unsetNoTokensRedirect(endpoint);
318321
let rule_ids = compileHTTPAuthorizationRuleset(endpoint, ["placeholder", 0]).removeRuleIds;
319322
if (VERBOSE) {
320-
// console.log(`unsetAuthorizationHeader: ${rule_ids} ${endpoint}`);
323+
// debug_log(`unsetAuthorizationHeader: ${rule_ids} ${endpoint}`);
321324
}
322325
await chrome.declarativeNetRequest.updateDynamicRules({
323326
addRules: [],
@@ -336,7 +339,7 @@ async function unsetAuthorizationHeader(endpoint) {
336339
}
337340

338341
async function setNoTokensRedirect(endpoint) {
339-
console.log(`setNoTokensRedirect: ${endpoint}`);
342+
debug_log(`setNoTokensRedirect: ${endpoint}`);
340343
let resourceTypes = ["main_frame", "sub_frame", "xmlhttprequest", "csp_report", "font", "image", "media", "object", "other", "ping", "script", "stylesheet", "websocket"];
341344
if (IS_FIREFOX) {
342345
resourceTypes = resourceTypes.concat(["beacon", "imageset", "object_subrequest", "speculative", "web_manifest", "xml_dtd", "xslt"])
@@ -360,7 +363,7 @@ async function setNoTokensRedirect(endpoint) {
360363

361364
async function unsetNoTokensRedirect(endpoint) {
362365
if (VERBOSE) {
363-
// console.log(`unsetNoTokensRedirect: ${endpoint}`)
366+
// debug_log(`unsetNoTokensRedirect: ${endpoint}`)
364367
}
365368
await browser.declarativeNetRequest.updateDynamicRules({
366369
addRules: [], removeRuleIds: [NO_TOKEN_REDIRECT_ID[endpoint]]

Diff for: src/scripts/privacypass.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ import {
1313
VERBOSE,
1414
} from './config.js'
1515

16+
import {
17+
debug_log
18+
} from './debug_log.js'
19+
1620
import {
1721
get_kagi_session
1822
} from './kagi_session.js'
@@ -29,7 +33,7 @@ import {
2933
// returns WWW-Authenticate header
3034
async function getWWWAuthenticateHeader(onion = false) {
3135
if (VERBOSE) {
32-
console.log(`getWWWAuthenticateHeader: onion = ${onion}`)
36+
debug_log(`getWWWAuthenticateHeader: onion = ${onion}`)
3337
}
3438
// get WWW-Authenticate HTTP header value
3539
let origin_wwwa_value = "";
@@ -54,7 +58,7 @@ async function getWWWAuthenticateHeader(onion = false) {
5458
// performs the token generation protocol
5559
async function tokenGenerationProtocol(wwwa_value, onion = false) {
5660
if (VERBOSE) {
57-
console.log(`tokenGenerationProtocol: ${wwwa_value}, onion = ${onion}`)
61+
debug_log(`tokenGenerationProtocol: ${wwwa_value}, onion = ${onion}`)
5862
}
5963
const nr = TOKENS_TO_STASH;
6064
const endpoint = onion ? ONION_ISSUER_REQUEST_ENDPOINT : ISSUER_REQUEST_ENDPOINT;
@@ -125,7 +129,7 @@ async function tokenGenerationProtocol(wwwa_value, onion = false) {
125129
token_finalization_delay = Date.now() - token_finalization_delay;
126130
if (VERBOSE) {
127131
const total_runtime = token_request_delay + token_finalization_delay;
128-
console.log(`> Runtime for generationg ${TOKENS_TO_STASH} tokens: ${total_runtime}`);
132+
debug_log(`> Runtime for generationg ${TOKENS_TO_STASH} tokens: ${total_runtime}`);
129133
}
130134
return tokens;
131135
}

0 commit comments

Comments
 (0)