henry pushed to branch tor-browser-128.8.0esr-14.5-1 at The Tor Project / Applications / Tor Browser
Commits:
-
480957e5
by Henry Wilkes at 2025-03-18T15:21:16+00:00
-
0f529e6f
by Henry Wilkes at 2025-03-18T15:21:16+00:00
3 changed files:
- browser/components/torpreferences/content/torLogDialog.js
- toolkit/components/tor-launcher/TorProvider.sys.mjs
- toolkit/components/tor-launcher/TorProviderBuilder.sys.mjs
Changes:
... | ... | @@ -66,28 +66,22 @@ const gTorLogDialog = { |
66 | 66 | );
|
67 | 67 | });
|
68 | 68 | |
69 | - // A waiting state should not be needed at this point.
|
|
70 | - // Also, we probably cannot even arrive here if the provider failed to
|
|
71 | - // initialize, otherwise we could use a try/catch, and write the exception
|
|
72 | - // text in the logs, instead.
|
|
73 | - TorProviderBuilder.build().then(provider => {
|
|
74 | - Services.obs.addObserver(this, TorProviderTopics.TorLog);
|
|
75 | - window.addEventListener(
|
|
76 | - "unload",
|
|
77 | - () => {
|
|
78 | - Services.obs.removeObserver(this, TorProviderTopics.TorLog);
|
|
79 | - },
|
|
80 | - { once: true }
|
|
81 | - );
|
|
82 | - |
|
83 | - for (const logEntry of provider.getLog()) {
|
|
84 | - this.addLogEntry(logEntry, true);
|
|
85 | - }
|
|
86 | - // Set the initial scroll to the bottom.
|
|
87 | - this._logTable.scrollTo({
|
|
88 | - top: this._logTable.scrollTopMax,
|
|
89 | - behaviour: "instant",
|
|
90 | - });
|
|
69 | + Services.obs.addObserver(this, TorProviderTopics.TorLog);
|
|
70 | + window.addEventListener(
|
|
71 | + "unload",
|
|
72 | + () => {
|
|
73 | + Services.obs.removeObserver(this, TorProviderTopics.TorLog);
|
|
74 | + },
|
|
75 | + { once: true }
|
|
76 | + );
|
|
77 | + |
|
78 | + for (const logEntry of TorProviderBuilder.getLog()) {
|
|
79 | + this.addLogEntry(logEntry, true);
|
|
80 | + }
|
|
81 | + // Set the initial scroll to the bottom.
|
|
82 | + this._logTable.scrollTo({
|
|
83 | + top: this._logTable.scrollTopMax,
|
|
84 | + behaviour: "instant",
|
|
91 | 85 | });
|
92 | 86 | },
|
93 | 87 |
... | ... | @@ -45,12 +45,6 @@ const logger = console.createInstance({ |
45 | 45 | * @property {string} [host] The host to connect for a TCP proxy
|
46 | 46 | * @property {number} [port] The port number to use for a TCP proxy
|
47 | 47 | */
|
48 | -/**
|
|
49 | - * @typedef {object} LogEntry An object with a log message
|
|
50 | - * @property {string} timestamp The local date-time stamp at which we received the message
|
|
51 | - * @property {string} type The message level
|
|
52 | - * @property {string} msg The message
|
|
53 | - */
|
|
54 | 48 | /**
|
55 | 49 | * Stores the data associated with a circuit node.
|
56 | 50 | *
|
... | ... | @@ -69,7 +63,6 @@ const Preferences = Object.freeze({ |
69 | 63 | ControlUseIpc: "extensions.torlauncher.control_port_use_ipc",
|
70 | 64 | ControlHost: "extensions.torlauncher.control_host",
|
71 | 65 | ControlPort: "extensions.torlauncher.control_port",
|
72 | - MaxLogEntries: "extensions.torlauncher.max_tor_log_entries",
|
|
73 | 66 | });
|
74 | 67 | |
75 | 68 | /* Config Keys used to configure tor daemon */
|
... | ... | @@ -141,15 +134,6 @@ export class TorProvider { |
141 | 134 | */
|
142 | 135 | #socksSettings = null;
|
143 | 136 | |
144 | - /**
|
|
145 | - * The logs we received over the control port.
|
|
146 | - * We store a finite number of log entries which can be configured with
|
|
147 | - * extensions.torlauncher.max_tor_log_entries.
|
|
148 | - *
|
|
149 | - * @type {LogEntry[]}
|
|
150 | - */
|
|
151 | - #logs = [];
|
|
152 | - |
|
153 | 137 | #isBootstrapDone = false;
|
154 | 138 | /**
|
155 | 139 | * Keep the last warning to avoid broadcasting an async warning if it is the
|
... | ... | @@ -511,15 +495,6 @@ export class TorProvider { |
511 | 495 | return this.#controller.onionAuthViewKeys();
|
512 | 496 | }
|
513 | 497 | |
514 | - /**
|
|
515 | - * Returns captured log messages.
|
|
516 | - *
|
|
517 | - * @returns {LogEntry[]} The logs we collected from the tor daemon so far.
|
|
518 | - */
|
|
519 | - getLog() {
|
|
520 | - return structuredClone(this.#logs);
|
|
521 | - }
|
|
522 | - |
|
523 | 498 | /**
|
524 | 499 | * @returns {boolean} true if we launched and control tor, false if we are
|
525 | 500 | * using system tor.
|
... | ... | @@ -1033,15 +1008,6 @@ export class TorProvider { |
1033 | 1008 | TorProviderTopics.TorLog
|
1034 | 1009 | );
|
1035 | 1010 | |
1036 | - const maxEntries = Services.prefs.getIntPref(
|
|
1037 | - Preferences.MaxLogEntries,
|
|
1038 | - 1000
|
|
1039 | - );
|
|
1040 | - if (maxEntries > 0 && this.#logs.length >= maxEntries) {
|
|
1041 | - this.#logs.splice(0, 1);
|
|
1042 | - }
|
|
1043 | - |
|
1044 | - this.#logs.push({ type, msg, timestamp });
|
|
1045 | 1011 | switch (type) {
|
1046 | 1012 | case "ERR":
|
1047 | 1013 | logger.error(`[Tor error] ${msg}`);
|
... | ... | @@ -23,6 +23,13 @@ export const TorProviders = Object.freeze({ |
23 | 23 | tor: 1,
|
24 | 24 | });
|
25 | 25 | |
26 | +/**
|
|
27 | + * @typedef {object} LogEntry An object with a log message
|
|
28 | + * @property {string} timestamp The local date-time stamp at which we received the message
|
|
29 | + * @property {string} type The message level
|
|
30 | + * @property {string} msg The message
|
|
31 | + */
|
|
32 | + |
|
26 | 33 | /**
|
27 | 34 | * The factory to get a Tor provider.
|
28 | 35 | * Currently we support only TorProvider, i.e., the one that interacts with
|
... | ... | @@ -36,6 +43,48 @@ export class TorProviderBuilder { |
36 | 43 | */
|
37 | 44 | static #provider = null;
|
38 | 45 | |
46 | + /**
|
|
47 | + * A record of the log messages from all TorProvider instances.
|
|
48 | + *
|
|
49 | + * @type {LogEntry[]}
|
|
50 | + */
|
|
51 | + static #log = [];
|
|
52 | + |
|
53 | + /**
|
|
54 | + * Get a record of historic log entries.
|
|
55 | + *
|
|
56 | + * @returns {LogEntry[]} - The record of entries.
|
|
57 | + */
|
|
58 | + static getLog() {
|
|
59 | + return structuredClone(this.#log);
|
|
60 | + }
|
|
61 | + |
|
62 | + /**
|
|
63 | + * The limit on the number of log entries we should store.
|
|
64 | + *
|
|
65 | + * @type {integer}
|
|
66 | + */
|
|
67 | + static #logLimit;
|
|
68 | + |
|
69 | + /**
|
|
70 | + * The observer that checks for new TorLog messages.
|
|
71 | + *
|
|
72 | + * @type {Function}
|
|
73 | + */
|
|
74 | + static #logObserver;
|
|
75 | + |
|
76 | + /**
|
|
77 | + * Add a new log message.
|
|
78 | + *
|
|
79 | + * @param {LogEntry} logEntry - The log entry to add.
|
|
80 | + */
|
|
81 | + static #addLogEntry(logEntry) {
|
|
82 | + if (this.#logLimit > 0 && this.#log.length >= this.#logLimit) {
|
|
83 | + this.#log.splice(0, 1);
|
|
84 | + }
|
|
85 | + this.#log.push(logEntry);
|
|
86 | + }
|
|
87 | + |
|
39 | 88 | /**
|
40 | 89 | * The observer that checks when the tor process exits, and reinitializes the
|
41 | 90 | * provider.
|
... | ... | @@ -56,6 +105,15 @@ export class TorProviderBuilder { |
56 | 105 | * Initialize the provider of choice.
|
57 | 106 | */
|
58 | 107 | static init() {
|
108 | + this.#logLimit = Services.prefs.getIntPref(
|
|
109 | + "extensions.torlauncher.max_tor_log_entries",
|
|
110 | + 1000
|
|
111 | + );
|
|
112 | + this.#logObserver = subject => {
|
|
113 | + this.#addLogEntry(subject.wrappedJSObject);
|
|
114 | + };
|
|
115 | + Services.obs.addObserver(this.#logObserver, TorProviderTopics.TorLog);
|
|
116 | + |
|
59 | 117 | switch (this.providerType) {
|
60 | 118 | case TorProviders.tor:
|
61 | 119 | // Even though initialization of the initial TorProvider is
|
... | ... | @@ -136,6 +194,7 @@ export class TorProviderBuilder { |
136 | 194 | );
|
137 | 195 | this.#exitObserver = null;
|
138 | 196 | }
|
197 | + Services.obs.removeObserver(this.#logObserver, TorProviderTopics.TorLog);
|
|
139 | 198 | }
|
140 | 199 | |
141 | 200 | /**
|