Use window.log in browser context, turn on console eslint rule

This commit is contained in:
Scott Nonnenberg 2018-07-21 12:00:08 -07:00
parent 4320b125dd
commit 5933a34a18
71 changed files with 816 additions and 559 deletions

View file

@ -34,7 +34,7 @@ module.exports = {
'no-underscore-dangle': 'off', 'no-underscore-dangle': 'off',
// though we have a logger, we still remap console to log to disk // though we have a logger, we still remap console to log to disk
'no-console': 'off', 'no-console': 'error',
// consistently place operators at end of line except ternaries // consistently place operators at end of line except ternaries
'operator-linebreak': 'error', 'operator-linebreak': 'error',

View file

@ -8,7 +8,7 @@ const asar = require('asar');
const fs = require('fs'); const fs = require('fs');
const assert = require('assert'); const assert = require('assert');
/* eslint-disable more/no-then */ /* eslint-disable more/no-then, no-console */
module.exports = grunt => { module.exports = grunt => {
const bower = grunt.file.readJSON('bower.json'); const bower = grunt.file.readJSON('bower.json');

6
app/.eslintrc.js Normal file
View file

@ -0,0 +1,6 @@
module.exports = {
rules: {
// On the node.js side, we're still using console.log
'no-console': 'off',
},
};

View file

@ -1,6 +1,6 @@
const addUnhandledErrorHandler = require('electron-unhandled'); const addUnhandledErrorHandler = require('electron-unhandled');
const Errors = require('./types/errors'); const Errors = require('../js/modules/types/errors');
// addHandler :: Unit -> Unit // addHandler :: Unit -> Unit
exports.addHandler = () => { exports.addHandler = () => {

View file

@ -26,10 +26,11 @@
// Implicitly used in `indexeddb-backbonejs-adapter`: // Implicitly used in `indexeddb-backbonejs-adapter`:
// https://github.com/signalapp/Signal-Desktop/blob/4033a9f8137e62ed286170ed5d4941982b1d3a64/components/indexeddb-backbonejs-adapter/backbone-indexeddb.js#L569 // https://github.com/signalapp/Signal-Desktop/blob/4033a9f8137e62ed286170ed5d4941982b1d3a64/components/indexeddb-backbonejs-adapter/backbone-indexeddb.js#L569
window.onInvalidStateError = e => console.log(e); window.onInvalidStateError = error =>
window.log.error(error && error.stack ? error.stack : error);
console.log('background page reloaded'); window.log.info('background page reloaded');
console.log('environment:', window.getEnvironment()); window.log.info('environment:', window.getEnvironment());
let initialLoadComplete = false; let initialLoadComplete = false;
window.owsDesktopApp = {}; window.owsDesktopApp = {};
@ -58,7 +59,7 @@
accountManager = new textsecure.AccountManager(USERNAME, PASSWORD); accountManager = new textsecure.AccountManager(USERNAME, PASSWORD);
accountManager.addEventListener('registration', () => { accountManager.addEventListener('registration', () => {
Whisper.Registration.markDone(); Whisper.Registration.markDone();
console.log('dispatching registration event'); window.log.info('dispatching registration event');
Whisper.events.trigger('registration_done'); Whisper.events.trigger('registration_done');
}); });
} }
@ -66,19 +67,22 @@
}; };
const cancelInitializationMessage = Views.Initialization.setMessage(); const cancelInitializationMessage = Views.Initialization.setMessage();
console.log('Start IndexedDB migrations'); window.log.info('Start IndexedDB migrations');
console.log('Run migrations on database with attachment data'); window.log.info('Run migrations on database with attachment data');
await Migrations0DatabaseWithAttachmentData.run({ Backbone }); await Migrations0DatabaseWithAttachmentData.run({
Backbone,
logger: window.log,
});
console.log('Storage fetch'); window.log.info('Storage fetch');
storage.fetch(); storage.fetch();
const idleDetector = new IdleDetector(); const idleDetector = new IdleDetector();
let isMigrationWithIndexComplete = false; let isMigrationWithIndexComplete = false;
let isMigrationWithoutIndexComplete = false; let isMigrationWithoutIndexComplete = false;
idleDetector.on('idle', async () => { idleDetector.on('idle', async () => {
console.log('Idle processing started'); window.log.info('Idle processing started');
const NUM_MESSAGES_PER_BATCH = 1; const NUM_MESSAGES_PER_BATCH = 1;
if (!isMigrationWithIndexComplete) { if (!isMigrationWithIndexComplete) {
@ -88,7 +92,7 @@
numMessagesPerBatch: NUM_MESSAGES_PER_BATCH, numMessagesPerBatch: NUM_MESSAGES_PER_BATCH,
upgradeMessageSchema, upgradeMessageSchema,
}); });
console.log('Upgrade message schema (with index):', batchWithIndex); window.log.info('Upgrade message schema (with index):', batchWithIndex);
isMigrationWithIndexComplete = batchWithIndex.done; isMigrationWithIndexComplete = batchWithIndex.done;
} }
@ -102,14 +106,17 @@
upgradeMessageSchema, upgradeMessageSchema,
} }
); );
console.log('Upgrade message schema (without index):', batchWithoutIndex); window.log.info(
'Upgrade message schema (without index):',
batchWithoutIndex
);
isMigrationWithoutIndexComplete = batchWithoutIndex.done; isMigrationWithoutIndexComplete = batchWithoutIndex.done;
} }
const areAllMigrationsComplete = const areAllMigrationsComplete =
isMigrationWithIndexComplete && isMigrationWithoutIndexComplete; isMigrationWithIndexComplete && isMigrationWithoutIndexComplete;
if (areAllMigrationsComplete) { if (areAllMigrationsComplete) {
console.log('All migrations are complete. Stopping idle detector.'); window.log.info('All migrations are complete. Stopping idle detector.');
idleDetector.stop(); idleDetector.stop();
} }
}); });
@ -254,22 +261,22 @@
if (newVersion) { if (newVersion) {
if ( if (
lastVersion && lastVersion &&
window.isBeforeVersion(lastVersion, 'v1.15.0-beta.4') window.isBeforeVersion(lastVersion, 'v1.15.0-beta.5')
) { ) {
await window.Signal.Logs.deleteAll(); await window.Signal.Logs.deleteAll();
window.restart(); window.restart();
} }
console.log( window.log.info(
`New version detected: ${currentVersion}; previous: ${lastVersion}` `New version detected: ${currentVersion}; previous: ${lastVersion}`
); );
} }
window.dispatchEvent(new Event('storage_ready')); window.dispatchEvent(new Event('storage_ready'));
console.log('listening for registration events'); window.log.info('listening for registration events');
Whisper.events.on('registration_done', () => { Whisper.events.on('registration_done', () => {
console.log('handling registration event'); window.log.info('handling registration event');
Whisper.RotateSignedPreKeyListener.init(Whisper.events, newVersion); Whisper.RotateSignedPreKeyListener.init(Whisper.events, newVersion);
connect(true); connect(true);
}); });
@ -284,7 +291,7 @@
Whisper.ExpiringMessagesListener.init(Whisper.events); Whisper.ExpiringMessagesListener.init(Whisper.events);
if (Whisper.Import.isIncomplete()) { if (Whisper.Import.isIncomplete()) {
console.log('Import was interrupted, showing import error screen'); window.log.info('Import was interrupted, showing import error screen');
appView.openImporter(); appView.openImporter();
} else if (Whisper.Registration.everDone()) { } else if (Whisper.Registration.everDone()) {
Whisper.RotateSignedPreKeyListener.init(Whisper.events, newVersion); Whisper.RotateSignedPreKeyListener.init(Whisper.events, newVersion);
@ -346,7 +353,7 @@
let disconnectTimer = null; let disconnectTimer = null;
function onOffline() { function onOffline() {
console.log('offline'); window.log.info('offline');
window.removeEventListener('offline', onOffline); window.removeEventListener('offline', onOffline);
window.addEventListener('online', onOnline); window.addEventListener('online', onOnline);
@ -358,13 +365,13 @@
} }
function onOnline() { function onOnline() {
console.log('online'); window.log.info('online');
window.removeEventListener('online', onOnline); window.removeEventListener('online', onOnline);
window.addEventListener('offline', onOffline); window.addEventListener('offline', onOffline);
if (disconnectTimer && isSocketOnline()) { if (disconnectTimer && isSocketOnline()) {
console.log('Already online. Had a blip in online/offline status.'); window.log.warn('Already online. Had a blip in online/offline status.');
clearTimeout(disconnectTimer); clearTimeout(disconnectTimer);
disconnectTimer = null; disconnectTimer = null;
return; return;
@ -385,7 +392,7 @@
} }
function disconnect() { function disconnect() {
console.log('disconnect'); window.log.info('disconnect');
// Clear timer, since we're only called when the timer is expired // Clear timer, since we're only called when the timer is expired
disconnectTimer = null; disconnectTimer = null;
@ -397,14 +404,14 @@
let connectCount = 0; let connectCount = 0;
async function connect(firstRun) { async function connect(firstRun) {
console.log('connect'); window.log.info('connect');
// Bootstrap our online/offline detection, only the first time we connect // Bootstrap our online/offline detection, only the first time we connect
if (connectCount === 0 && navigator.onLine) { if (connectCount === 0 && navigator.onLine) {
window.addEventListener('offline', onOffline); window.addEventListener('offline', onOffline);
} }
if (connectCount === 0 && !navigator.onLine) { if (connectCount === 0 && !navigator.onLine) {
console.log( window.log.warn(
'Starting up offline; will connect when we have network access' 'Starting up offline; will connect when we have network access'
); );
window.addEventListener('online', onOnline); window.addEventListener('online', onOnline);
@ -480,7 +487,7 @@
sendRequestConfigurationSyncMessage, sendRequestConfigurationSyncMessage,
storage, storage,
}); });
console.log('Sync read receipt configuration status:', status); window.log.info('Sync read receipt configuration status:', status);
if (firstRun === true && deviceId !== '1') { if (firstRun === true && deviceId !== '1') {
const hasThemeSetting = Boolean(storage.get('theme-setting')); const hasThemeSetting = Boolean(storage.get('theme-setting'));
@ -494,19 +501,24 @@
); );
Whisper.events.trigger('contactsync:begin'); Whisper.events.trigger('contactsync:begin');
syncRequest.addEventListener('success', () => { syncRequest.addEventListener('success', () => {
console.log('sync successful'); window.log.info('sync successful');
storage.put('synced_at', Date.now()); storage.put('synced_at', Date.now());
Whisper.events.trigger('contactsync'); Whisper.events.trigger('contactsync');
}); });
syncRequest.addEventListener('timeout', () => { syncRequest.addEventListener('timeout', () => {
console.log('sync timed out'); window.log.error('sync timed out');
Whisper.events.trigger('contactsync'); Whisper.events.trigger('contactsync');
}); });
if (Whisper.Import.isComplete()) { if (Whisper.Import.isComplete()) {
textsecure.messaging.sendRequestConfigurationSyncMessage().catch(e => { textsecure.messaging
console.log(e); .sendRequestConfigurationSyncMessage()
}); .catch(error => {
window.log.error(
'Import complete, but failed to send sync message',
error && error.stack ? error.stack : error
);
});
} }
} }
@ -571,7 +583,7 @@
if (id === textsecure.storage.user.getNumber()) { if (id === textsecure.storage.user.getNumber()) {
// special case for syncing details about ourselves // special case for syncing details about ourselves
if (details.profileKey) { if (details.profileKey) {
console.log('Got sync message with our own profile key'); window.log.info('Got sync message with our own profile key');
storage.put('profileKey', details.profileKey); storage.put('profileKey', details.profileKey);
} }
} }
@ -581,7 +593,7 @@
}); });
const validationError = c.validateNumber(); const validationError = c.validateNumber();
if (validationError) { if (validationError) {
console.log( window.log.error(
'Invalid contact received:', 'Invalid contact received:',
Errors.toLogFormat(validationError) Errors.toLogFormat(validationError)
); );
@ -651,7 +663,7 @@
ev.confirm(); ev.confirm();
} catch (error) { } catch (error) {
console.log('onContactReceived error:', Errors.toLogFormat(error)); window.log.error('onContactReceived error:', Errors.toLogFormat(error));
} }
} }
@ -686,7 +698,7 @@
const { expireTimer } = details; const { expireTimer } = details;
const isValidExpireTimer = typeof expireTimer === 'number'; const isValidExpireTimer = typeof expireTimer === 'number';
if (!isValidExpireTimer) { if (!isValidExpireTimer) {
console.log( window.log.error(
'Ignore invalid expire timer.', 'Ignore invalid expire timer.',
'Expected numeric `expireTimer`, got:', 'Expected numeric `expireTimer`, got:',
expireTimer expireTimer
@ -741,7 +753,7 @@
const message = createMessage(data); const message = createMessage(data);
const isDuplicate = await isMessageDuplicate(message); const isDuplicate = await isMessageDuplicate(message);
if (isDuplicate) { if (isDuplicate) {
console.log('Received duplicate message', message.idForLogging()); window.log.warn('Received duplicate message', message.idForLogging());
return event.confirm(); return event.confirm();
} }
@ -835,7 +847,7 @@
return resolve(false); return resolve(false);
}); });
}).catch(error => { }).catch(error => {
console.log('isMessageDuplicate error:', Errors.toLogFormat(error)); window.log.error('isMessageDuplicate error:', Errors.toLogFormat(error));
return false; return false;
}); });
} }
@ -856,7 +868,7 @@
async function onError(ev) { async function onError(ev) {
const { error } = ev; const { error } = ev;
console.log('background onError:', Errors.toLogFormat(error)); window.log.error('background onError:', Errors.toLogFormat(error));
if ( if (
error && error &&
@ -865,7 +877,7 @@
) { ) {
Whisper.events.trigger('unauthorized'); Whisper.events.trigger('unauthorized');
console.log( window.log.warn(
'Client is no longer authorized; deleting local configuration' 'Client is no longer authorized; deleting local configuration'
); );
Whisper.Registration.remove(); Whisper.Registration.remove();
@ -877,9 +889,9 @@
// the conversation list, instead of showing just the QR code screen. // the conversation list, instead of showing just the QR code screen.
Whisper.Registration.markEverDone(); Whisper.Registration.markEverDone();
textsecure.storage.put('number_id', previousNumberId); textsecure.storage.put('number_id', previousNumberId);
console.log('Successfully cleared local configuration'); window.log.info('Successfully cleared local configuration');
} catch (eraseError) { } catch (eraseError) {
console.log( window.log.error(
'Something went wrong clearing local configuration', 'Something went wrong clearing local configuration',
eraseError && eraseError.stack ? eraseError.stack : eraseError eraseError && eraseError.stack ? eraseError.stack : eraseError
); );
@ -891,7 +903,7 @@
if (error && error.name === 'HTTPError' && error.code === -1) { if (error && error.name === 'HTTPError' && error.code === -1) {
// Failed to connect to server // Failed to connect to server
if (navigator.onLine) { if (navigator.onLine) {
console.log('retrying in 1 minute'); window.log.info('retrying in 1 minute');
setTimeout(connect, 60000); setTimeout(connect, 60000);
Whisper.events.trigger('reconnectTimer'); Whisper.events.trigger('reconnectTimer');
@ -945,7 +957,7 @@
const readAt = ev.timestamp; const readAt = ev.timestamp;
const { timestamp } = ev.read; const { timestamp } = ev.read;
const { reader } = ev.read; const { reader } = ev.read;
console.log('read receipt', reader, timestamp); window.log.info('read receipt', reader, timestamp);
if (!storage.get('read-receipt-setting')) { if (!storage.get('read-receipt-setting')) {
return ev.confirm(); return ev.confirm();
@ -967,7 +979,7 @@
const readAt = ev.timestamp; const readAt = ev.timestamp;
const { timestamp } = ev.read; const { timestamp } = ev.read;
const { sender } = ev.read; const { sender } = ev.read;
console.log('read sync', sender, timestamp); window.log.info('read sync', sender, timestamp);
const receipt = Whisper.ReadSyncs.add({ const receipt = Whisper.ReadSyncs.add({
sender, sender,
@ -991,7 +1003,10 @@
}); });
const error = c.validateNumber(); const error = c.validateNumber();
if (error) { if (error) {
console.log('Invalid verified sync received:', Errors.toLogFormat(error)); window.log.error(
'Invalid verified sync received:',
Errors.toLogFormat(error)
);
return; return;
} }
@ -1006,10 +1021,10 @@
state = 'UNVERIFIED'; state = 'UNVERIFIED';
break; break;
default: default:
console.log(`Got unexpected verified state: ${ev.verified.state}`); window.log.error(`Got unexpected verified state: ${ev.verified.state}`);
} }
console.log( window.log.info(
'got verified sync for', 'got verified sync for',
number, number,
state, state,
@ -1041,7 +1056,7 @@
function onDeliveryReceipt(ev) { function onDeliveryReceipt(ev) {
const { deliveryReceipt } = ev; const { deliveryReceipt } = ev;
console.log( window.log.info(
'delivery receipt from', 'delivery receipt from',
`${deliveryReceipt.source}.${deliveryReceipt.sourceDevice}`, `${deliveryReceipt.source}.${deliveryReceipt.sourceDevice}`,
deliveryReceipt.timestamp deliveryReceipt.timestamp

View file

@ -135,7 +135,7 @@
conversation.initialPromise = new Promise((resolve, reject) => { conversation.initialPromise = new Promise((resolve, reject) => {
if (!conversation.isValid()) { if (!conversation.isValid()) {
const validationError = conversation.validationError || {}; const validationError = conversation.validationError || {};
console.log( window.log.error(
'Contact is not valid. Not saving, but adding to collection:', 'Contact is not valid. Not saving, but adding to collection:',
conversation.idForLogging(), conversation.idForLogging(),
validationError.stack validationError.stack
@ -146,7 +146,7 @@
const deferred = conversation.save(); const deferred = conversation.save();
if (!deferred) { if (!deferred) {
console.log('Conversation save failed! ', id, type); window.log.error('Conversation save failed! ', id, type);
return reject(new Error('getOrCreate: Conversation save failed')); return reject(new Error('getOrCreate: Conversation save failed'));
} }
@ -184,17 +184,17 @@
conversations.reset([]); conversations.reset([]);
}, },
load() { load() {
console.log('ConversationController: starting initial fetch'); window.log.info('ConversationController: starting initial fetch');
this._initialPromise = new Promise((resolve, reject) => { this._initialPromise = new Promise((resolve, reject) => {
conversations.fetch().then( conversations.fetch().then(
() => { () => {
console.log('ConversationController: done with initial fetch'); window.log.info('ConversationController: done with initial fetch');
this._initialFetchComplete = true; this._initialFetchComplete = true;
resolve(); resolve();
}, },
error => { error => {
console.log( window.log.error(
'ConversationController: initial fetch failed', 'ConversationController: initial fetch failed',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );

View file

@ -15,7 +15,7 @@
window.Whisper.Database.nolog = true; window.Whisper.Database.nolog = true;
Whisper.Database.handleDOMException = (prefix, error, reject) => { Whisper.Database.handleDOMException = (prefix, error, reject) => {
console.log( window.log.error(
`${prefix}:`, `${prefix}:`,
error && error.name, error && error.name,
error && error.message, error && error.message,
@ -27,12 +27,12 @@
function clearStores(db, names) { function clearStores(db, names) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const storeNames = names || db.objectStoreNames; const storeNames = names || db.objectStoreNames;
console.log('Clearing these indexeddb stores:', storeNames); window.log.info('Clearing these indexeddb stores:', storeNames);
const transaction = db.transaction(storeNames, 'readwrite'); const transaction = db.transaction(storeNames, 'readwrite');
let finished = false; let finished = false;
const finish = via => { const finish = via => {
console.log('clearing all stores done via', via); window.log.info('clearing all stores done via', via);
if (finished) { if (finished) {
resolve(); resolve();
} }
@ -57,10 +57,10 @@
request.onsuccess = () => { request.onsuccess = () => {
count += 1; count += 1;
console.log('Done clearing store', storeName); window.log.info('Done clearing store', storeName);
if (count >= storeNames.length) { if (count >= storeNames.length) {
console.log('Done clearing indexeddb stores'); window.log.info('Done clearing indexeddb stores');
finish('clears complete'); finish('clears complete');
} }
}; };

View file

@ -81,7 +81,7 @@
// TODO: consider keeping a list of numbers we've // TODO: consider keeping a list of numbers we've
// successfully delivered to? // successfully delivered to?
} }
console.log( window.log.info(
'No message for delivery receipt', 'No message for delivery receipt',
receipt.get('source'), receipt.get('source'),
receipt.get('timestamp') receipt.get('timestamp')
@ -90,7 +90,7 @@
return null; return null;
}) })
.catch(error => { .catch(error => {
console.log( window.log.error(
'DeliveryReceipts.onReceipt error:', 'DeliveryReceipts.onReceipt error:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );

View file

@ -6,7 +6,10 @@
try { try {
BUILD_EXPIRATION = parseInt(window.getExpiration(), 10); BUILD_EXPIRATION = parseInt(window.getExpiration(), 10);
if (BUILD_EXPIRATION) { if (BUILD_EXPIRATION) {
console.log('Build expires: ', new Date(BUILD_EXPIRATION).toISOString()); window.log.info(
'Build expires: ',
new Date(BUILD_EXPIRATION).toISOString()
);
} }
} catch (e) { } catch (e) {
// nothing // nothing

View file

@ -15,7 +15,7 @@
// Load messages that have expired and destroy them // Load messages that have expired and destroy them
const expired = new Whisper.MessageCollection(); const expired = new Whisper.MessageCollection();
expired.on('add', async message => { expired.on('add', async message => {
console.log('Message expired', { window.log.info('Message expired', {
sentAt: message.get('sent_at'), sentAt: message.get('sent_at'),
}); });
const conversation = message.getConversation(); const conversation = message.getConversation();
@ -41,7 +41,10 @@
const expiring = new Whisper.MessageCollection(); const expiring = new Whisper.MessageCollection();
expiring.once('add', next => { expiring.once('add', next => {
const expiresAt = next.get('expires_at'); const expiresAt = next.get('expires_at');
console.log('next message expires', new Date(expiresAt).toISOString()); window.log.info(
'next message expires',
new Date(expiresAt).toISOString()
);
let wait = expiresAt - Date.now(); let wait = expiresAt - Date.now();

View file

@ -1,9 +1,9 @@
/* eslint-env node */ /* eslint-env node */
/* eslint strict: ['error', 'never'] */ /* eslint strict: ['error', 'never'] */
/* eslint-disable no-console */
const electron = require('electron'); const electron = require('electron');
const bunyan = require('bunyan');
const _ = require('lodash'); const _ = require('lodash');
const debuglogs = require('./modules/debuglogs'); const debuglogs = require('./modules/debuglogs');
@ -29,11 +29,8 @@ function now() {
return date.toJSON(); return date.toJSON();
} }
function log(...args) { // To avoid [Object object] in our log since console.log handles non-strings smoothly
const consoleArgs = ['INFO ', now()].concat(args); function cleanArgsForIPC(args) {
console._log(...consoleArgs);
// To avoid [Object object] in our log since console.log handles non-strings smoothly
const str = args.map(item => { const str = args.map(item => {
if (typeof item !== 'string') { if (typeof item !== 'string') {
try { try {
@ -46,8 +43,11 @@ function log(...args) {
return item; return item;
}); });
const logText = Privacy.redactAll(str.join(' ')); return str.join(' ');
ipc.send('log-info', logText); }
function log(...args) {
logAtLevel('info', 'INFO ', ...args);
} }
if (window.console) { if (window.console) {
@ -98,37 +98,22 @@ const publish = debuglogs.upload;
// A modern logging interface for the browser // A modern logging interface for the browser
// We create our own stream because we don't want to output JSON to the devtools console.
// Anyway, the default process.stdout stream goes to the command-line, not the devtools.
const logger = bunyan.createLogger({
name: 'log',
streams: [
{
level: 'debug',
stream: {
write(entry) {
console._log(formatLine(JSON.parse(entry)));
},
},
},
],
});
// The Bunyan API: https://github.com/trentm/node-bunyan#log-method-api // The Bunyan API: https://github.com/trentm/node-bunyan#log-method-api
function logAtLevel(level, ...args) { function logAtLevel(level, prefix, ...args) {
const ipcArgs = [`log-${level}`].concat(args); console._log(prefix, now(), ...args);
ipc.send(...ipcArgs);
logger[level](...args); const str = cleanArgsForIPC(args);
const logText = Privacy.redactAll(str);
ipc.send(`log-${level}`, logText);
} }
window.log = { window.log = {
fatal: _.partial(logAtLevel, 'fatal'), fatal: _.partial(logAtLevel, 'fatal', 'FATAL'),
error: _.partial(logAtLevel, 'error'), error: _.partial(logAtLevel, 'error', 'ERROR'),
warn: _.partial(logAtLevel, 'warn'), warn: _.partial(logAtLevel, 'warn', 'WARN '),
info: _.partial(logAtLevel, 'info'), info: _.partial(logAtLevel, 'info', 'INFO '),
debug: _.partial(logAtLevel, 'debug'), debug: _.partial(logAtLevel, 'debug', 'DEBUG'),
trace: _.partial(logAtLevel, 'trace'), trace: _.partial(logAtLevel, 'trace', 'TRACE'),
fetch, fetch,
publish, publish,
}; };

View file

@ -15,7 +15,7 @@
return; return;
} }
console.log('adding', number, 'to blocked list'); window.log.info('adding', number, 'to blocked list');
storage.put('blocked', numbers.concat(number)); storage.put('blocked', numbers.concat(number));
}; };
storage.removeBlockedNumber = number => { storage.removeBlockedNumber = number => {
@ -24,7 +24,7 @@
return; return;
} }
console.log('removing', number, 'from blocked list'); window.log.info('removing', number, 'from blocked list');
storage.put('blocked', _.without(numbers, number)); storage.put('blocked', _.without(numbers, number));
}; };
})(); })();

View file

@ -156,7 +156,7 @@
async onExpiredCollection(message) { async onExpiredCollection(message) {
const removeMessage = () => { const removeMessage = () => {
console.log('Remove expired message from collection', { window.log.info('Remove expired message from collection', {
sentAt: message.get('sent_at'), sentAt: message.get('sent_at'),
}); });
this.messageCollection.remove(message.id); this.messageCollection.remove(message.id);
@ -347,7 +347,7 @@
return lookup; return lookup;
}) })
.catch(error => { .catch(error => {
console.log( window.log.error(
'getIdentityKeys error for conversation', 'getIdentityKeys error for conversation',
this.idForLogging(), this.idForLogging(),
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
@ -361,7 +361,7 @@
lookup[contact.id] = key; lookup[contact.id] = key;
}, },
error => { error => {
console.log( window.log.error(
'getIdentityKeys error for group member', 'getIdentityKeys error for group member',
contact.idForLogging(), contact.idForLogging(),
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
@ -375,7 +375,7 @@
replay(error, message) { replay(error, message) {
const replayable = new textsecure.ReplayableError(error); const replayable = new textsecure.ReplayableError(error);
return replayable.replay(message.attributes).catch(e => { return replayable.replay(message.attributes).catch(e => {
console.log('replay error:', e && e.stack ? e.stack : e); window.log.error('replay error:', e && e.stack ? e.stack : e);
}); });
}, },
decryptOldIncomingKeyErrors() { decryptOldIncomingKeyErrors() {
@ -383,7 +383,10 @@
if (this.get('decryptedOldIncomingKeyErrors')) { if (this.get('decryptedOldIncomingKeyErrors')) {
return Promise.resolve(); return Promise.resolve();
} }
console.log('decryptOldIncomingKeyErrors start for', this.idForLogging()); window.log.info(
'decryptOldIncomingKeyErrors start for',
this.idForLogging()
);
const messages = this.messageCollection.filter(message => { const messages = this.messageCollection.filter(message => {
const errors = message.get('errors'); const errors = message.get('errors');
@ -399,7 +402,7 @@
}); });
const markComplete = () => { const markComplete = () => {
console.log( window.log.info(
'decryptOldIncomingKeyErrors complete for', 'decryptOldIncomingKeyErrors complete for',
this.idForLogging() this.idForLogging()
); );
@ -412,7 +415,7 @@
return markComplete(); return markComplete();
} }
console.log( window.log.info(
'decryptOldIncomingKeyErrors found', 'decryptOldIncomingKeyErrors found',
messages.length, messages.length,
'messages to process' 'messages to process'
@ -449,7 +452,7 @@
) )
) )
.catch(error => { .catch(error => {
console.log( window.log.error(
'decryptOldIncomingKeyErrors error:', 'decryptOldIncomingKeyErrors error:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );
@ -583,7 +586,7 @@
}, },
addKeyChange(id) { addKeyChange(id) {
console.log( window.log.info(
'adding key change advisory for', 'adding key change advisory for',
this.idForLogging(), this.idForLogging(),
id, id,
@ -606,7 +609,7 @@
_.defaults(options, { local: true }); _.defaults(options, { local: true });
if (this.isMe()) { if (this.isMe()) {
console.log( window.log.info(
'refusing to add verified change advisory for our own number' 'refusing to add verified change advisory for our own number'
); );
return; return;
@ -614,7 +617,7 @@
const lastMessage = this.get('timestamp') || Date.now(); const lastMessage = this.get('timestamp') || Date.now();
console.log( window.log.info(
'adding verified change advisory for', 'adding verified change advisory for',
this.idForLogging(), this.idForLogging(),
id, id,
@ -823,7 +826,7 @@
this.queueJob(async () => { this.queueJob(async () => {
const now = Date.now(); const now = Date.now();
console.log( window.log.info(
'Sending message to conversation', 'Sending message to conversation',
this.idForLogging(), this.idForLogging(),
'with timestamp', 'with timestamp',
@ -933,7 +936,7 @@
return Promise.resolve(); return Promise.resolve();
} }
console.log("Update conversation 'expireTimer'", { window.log.info("Update conversation 'expireTimer'", {
id: this.idForLogging(), id: this.idForLogging(),
expireTimer, expireTimer,
source, source,
@ -1085,7 +1088,7 @@
if (this.messageCollection.get(m.id)) { if (this.messageCollection.get(m.id)) {
m = this.messageCollection.get(m.id); m = this.messageCollection.get(m.id);
} else { } else {
console.log( window.log.warn(
'Marked a message as read in the database, but ' + 'Marked a message as read in the database, but ' +
'it was not in messageCollection.' 'it was not in messageCollection.'
); );
@ -1117,7 +1120,7 @@
read = read.filter(item => !item.hasErrors); read = read.filter(item => !item.hasErrors);
if (read.length && options.sendReadReceipts) { if (read.length && options.sendReadReceipts) {
console.log('Sending', read.length, 'read receipts'); window.log.info('Sending', read.length, 'read receipts');
promises.push(textsecure.messaging.syncReadMessages(read)); promises.push(textsecure.messaging.syncReadMessages(read));
if (storage.get('read-receipt-setting')) { if (storage.get('read-receipt-setting')) {
@ -1173,7 +1176,7 @@
// save identity will close all sessions except for .1, so we // save identity will close all sessions except for .1, so we
// must close that one manually. // must close that one manually.
const address = new libsignal.SignalProtocolAddress(id, 1); const address = new libsignal.SignalProtocolAddress(id, 1);
console.log('closing session for', address.toString()); window.log.info('closing session for', address.toString());
const sessionCipher = new libsignal.SessionCipher( const sessionCipher = new libsignal.SessionCipher(
textsecure.storage.protocol, textsecure.storage.protocol,
address address
@ -1197,7 +1200,7 @@
e => { e => {
if (e.name === 'ProfileDecryptError') { if (e.name === 'ProfileDecryptError') {
// probably the profile key has changed. // probably the profile key has changed.
console.log( window.log.error(
'decryptProfile error:', 'decryptProfile error:',
id, id,
profile, profile,
@ -1209,7 +1212,7 @@
}); });
}) })
.catch(error => { .catch(error => {
console.log( window.log.error(
'getProfile error:', 'getProfile error:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );
@ -1365,7 +1368,7 @@
await wrapDeferred(message.save()); await wrapDeferred(message.save());
} }
} catch (error) { } catch (error) {
console.log( window.log.error(
'Problem upgrading message quoted message from database', 'Problem upgrading message quoted message from database',
Errors.toLogFormat(error) Errors.toLogFormat(error)
); );
@ -1532,7 +1535,7 @@
throw new Error('This conversation has no id!'); throw new Error('This conversation has no id!');
} }
if (this.inProgressFetch) { if (this.inProgressFetch) {
console.log('Attempting to start a parallel fetchMessages() call'); window.log.warn('Attempting to start a parallel fetchMessages() call');
return; return;
} }
@ -1550,7 +1553,7 @@
// one-time hit. We do this so we have guarantees about message structure. // one-time hit. We do this so we have guarantees about message structure.
await this.upgradeMessages(this.messageCollection); await this.upgradeMessages(this.messageCollection);
} catch (error) { } catch (error) {
console.log( window.log.error(
'fetchMessages: failed to upgrade messages', 'fetchMessages: failed to upgrade messages',
Errors.toLogFormat(error) Errors.toLogFormat(error)
); );
@ -1758,7 +1761,7 @@
const messageId = message.id; const messageId = message.id;
const isExpiringMessage = Message.hasExpiration(messageJSON); const isExpiringMessage = Message.hasExpiration(messageJSON);
console.log('Add notification', { window.log.info('Add notification', {
conversationId: this.idForLogging(), conversationId: this.idForLogging(),
isExpiringMessage, isExpiringMessage,
messageSentAt, messageSentAt,

View file

@ -59,7 +59,12 @@
storeName: 'messages', storeName: 'messages',
initialize(attributes) { initialize(attributes) {
if (_.isObject(attributes)) { if (_.isObject(attributes)) {
this.set(TypedMessage.initializeSchemaVersion(attributes)); this.set(
TypedMessage.initializeSchemaVersion({
message: attributes,
logger: window.log,
})
);
} }
this.OUR_NUMBER = textsecure.storage.user.getNumber(); this.OUR_NUMBER = textsecure.storage.user.getNumber();
@ -86,7 +91,7 @@
const required = ['conversationId', 'received_at', 'sent_at']; const required = ['conversationId', 'received_at', 'sent_at'];
const missing = _.filter(required, attr => !attributes[attr]); const missing = _.filter(required, attr => !attributes[attr]);
if (missing.length) { if (missing.length) {
console.log(`Message missing attributes: ${missing}`); window.log.warn(`Message missing attributes: ${missing}`);
} }
}, },
isEndSession() { isEndSession() {
@ -860,7 +865,7 @@
errors = [errors]; errors = [errors];
} }
errors.forEach(e => { errors.forEach(e => {
console.log( window.log.error(
'Message.saveErrors:', 'Message.saveErrors:',
e && e.reason ? e.reason : null, e && e.reason ? e.reason : null,
e && e.stack ? e.stack : e e && e.stack ? e.stack : e
@ -972,7 +977,7 @@
groupUpdate.joined = difference; groupUpdate.joined = difference;
} }
if (conversation.get('left')) { if (conversation.get('left')) {
console.log('re-added to a left group'); window.log.warn('re-added to a left group');
attributes.left = false; attributes.left = false;
} }
} else if (dataMessage.group.type === GROUP_TYPES.QUIT) { } else if (dataMessage.group.type === GROUP_TYPES.QUIT) {
@ -1038,7 +1043,7 @@
const shouldLogExpireTimerChange = const shouldLogExpireTimerChange =
message.isExpirationTimerUpdate() || expireTimer; message.isExpirationTimerUpdate() || expireTimer;
if (shouldLogExpireTimerChange) { if (shouldLogExpireTimerChange) {
console.log("Update conversation 'expireTimer'", { window.log.info("Update conversation 'expireTimer'", {
id: conversation.idForLogging(), id: conversation.idForLogging(),
expireTimer, expireTimer,
source: 'handleDataMessage', source: 'handleDataMessage',
@ -1142,7 +1147,7 @@
const handleError = error => { const handleError = error => {
const errorForLog = error && error.stack ? error.stack : error; const errorForLog = error && error.stack ? error.stack : error;
console.log( window.log.error(
'handleDataMessage', 'handleDataMessage',
message.idForLogging(), message.idForLogging(),
'error:', 'error:',
@ -1167,7 +1172,7 @@
() => { () => {
try { try {
if (previousUnread !== message.get('unread')) { if (previousUnread !== message.get('unread')) {
console.log( window.log.warn(
'Caught race condition on new message read state! ' + 'Caught race condition on new message read state! ' +
'Manually starting timers.' 'Manually starting timers.'
); );
@ -1192,7 +1197,7 @@
}, },
() => { () => {
try { try {
console.log( window.log.warn(
'handleDataMessage: Message', 'handleDataMessage: Message',
message.idForLogging(), message.idForLogging(),
'was deleted' 'was deleted'
@ -1257,7 +1262,7 @@
} }
Whisper.ExpiringMessagesListener.update(); Whisper.ExpiringMessagesListener.update();
console.log('Set message expiration', { window.log.info('Set message expiration', {
expiresAt, expiresAt,
sentAt: this.get('sent_at'), sentAt: this.get('sent_at'),
}); });
@ -1364,7 +1369,9 @@
return Promise.resolve(); return Promise.resolve();
} }
console.log('fetchConversation: doing another fetch to get all unread'); window.log.info(
'fetchConversation: doing another fetch to get all unread'
);
return this.fetchConversation(conversationId, limit, unreadCount); return this.fetchConversation(conversationId, limit, unreadCount);
}); });
}, },
@ -1374,7 +1381,7 @@
}, },
fetchExpired() { fetchExpired() {
console.log('Load expired messages'); window.log.info('Load expired messages');
this.fetch({ this.fetch({
conditions: { expires_at: { $lte: Date.now() } }, conditions: { expires_at: { $lte: Date.now() } },
addIndividually: true, addIndividually: true,

View file

@ -134,7 +134,7 @@ function exportContactsAndGroups(db, fileWriter) {
if (storeNames.length === 0) { if (storeNames.length === 0) {
throw new Error('No stores to export'); throw new Error('No stores to export');
} }
console.log('Exporting from these stores:', storeNames.join(', ')); window.log.info('Exporting from these stores:', storeNames.join(', '));
const stream = createOutputStream(fileWriter); const stream = createOutputStream(fileWriter);
@ -153,7 +153,7 @@ function exportContactsAndGroups(db, fileWriter) {
); );
}; };
transaction.oncomplete = () => { transaction.oncomplete = () => {
console.log('transaction complete'); window.log.info('transaction complete');
}; };
const store = transaction.objectStore(storeName); const store = transaction.objectStore(storeName);
@ -168,7 +168,7 @@ function exportContactsAndGroups(db, fileWriter) {
}; };
request.onsuccess = async event => { request.onsuccess = async event => {
if (count === 0) { if (count === 0) {
console.log('cursor opened'); window.log.info('cursor opened');
stream.write(`"${storeName}": [`); stream.write(`"${storeName}": [`);
} }
@ -188,17 +188,17 @@ function exportContactsAndGroups(db, fileWriter) {
} else { } else {
// no more // no more
stream.write(']'); stream.write(']');
console.log('Exported', count, 'items from store', storeName); window.log.info('Exported', count, 'items from store', storeName);
exportedStoreNames.push(storeName); exportedStoreNames.push(storeName);
if (exportedStoreNames.length < storeNames.length) { if (exportedStoreNames.length < storeNames.length) {
stream.write(','); stream.write(',');
} else { } else {
console.log('Exported all stores'); window.log.info('Exported all stores');
stream.write('}'); stream.write('}');
await stream.close(); await stream.close();
console.log('Finished writing all stores to disk'); window.log.info('Finished writing all stores to disk');
resolve(); resolve();
} }
} }
@ -215,11 +215,11 @@ async function importNonMessages(db, parent, options) {
function eliminateClientConfigInBackup(data, targetPath) { function eliminateClientConfigInBackup(data, targetPath) {
const cleaned = _.pick(data, 'conversations', 'groups'); const cleaned = _.pick(data, 'conversations', 'groups');
console.log('Writing configuration-free backup file back to disk'); window.log.info('Writing configuration-free backup file back to disk');
try { try {
fs.writeFileSync(targetPath, JSON.stringify(cleaned)); fs.writeFileSync(targetPath, JSON.stringify(cleaned));
} catch (error) { } catch (error) {
console.log('Error writing cleaned-up backup to disk: ', error.stack); window.log.error('Error writing cleaned-up backup to disk: ', error.stack);
} }
} }
@ -250,7 +250,9 @@ function importFromJsonString(db, jsonString, targetPath, options) {
delete importObject.sessions; delete importObject.sessions;
delete importObject.unprocessed; delete importObject.unprocessed;
console.log('This is a light import; contacts, groups and messages only'); window.log.info(
'This is a light import; contacts, groups and messages only'
);
} }
// We mutate the on-disk backup to prevent the user from importing client // We mutate the on-disk backup to prevent the user from importing client
@ -259,11 +261,11 @@ function importFromJsonString(db, jsonString, targetPath, options) {
eliminateClientConfigInBackup(importObject, targetPath); eliminateClientConfigInBackup(importObject, targetPath);
const storeNames = _.keys(importObject); const storeNames = _.keys(importObject);
console.log('Importing to these stores:', storeNames.join(', ')); window.log.info('Importing to these stores:', storeNames.join(', '));
let finished = false; let finished = false;
const finish = via => { const finish = via => {
console.log('non-messages import done via', via); window.log.info('non-messages import done via', via);
if (finished) { if (finished) {
resolve(result); resolve(result);
} }
@ -281,7 +283,7 @@ function importFromJsonString(db, jsonString, targetPath, options) {
transaction.oncomplete = finish.bind(null, 'transaction complete'); transaction.oncomplete = finish.bind(null, 'transaction complete');
_.each(storeNames, storeName => { _.each(storeNames, storeName => {
console.log('Importing items for store', storeName); window.log.info('Importing items for store', storeName);
if (!importObject[storeName].length) { if (!importObject[storeName].length) {
delete importObject[storeName]; delete importObject[storeName];
@ -294,7 +296,7 @@ function importFromJsonString(db, jsonString, targetPath, options) {
const finishStore = () => { const finishStore = () => {
// added all objects for this store // added all objects for this store
delete importObject[storeName]; delete importObject[storeName];
console.log( window.log.info(
'Done importing to store', 'Done importing to store',
storeName, storeName,
'Total count:', 'Total count:',
@ -304,7 +306,7 @@ function importFromJsonString(db, jsonString, targetPath, options) {
); );
if (_.keys(importObject).length === 0) { if (_.keys(importObject).length === 0) {
// added all object stores // added all object stores
console.log('DB import complete'); window.log.info('DB import complete');
finish('puts scheduled'); finish('puts scheduled');
} }
}; };
@ -455,7 +457,7 @@ async function readAttachment(dir, attachment, name, options) {
const targetPath = path.join(dir, sanitizedName); const targetPath = path.join(dir, sanitizedName);
if (!fs.existsSync(targetPath)) { if (!fs.existsSync(targetPath)) {
console.log(`Warning: attachment ${sanitizedName} not found`); window.log.warn(`Warning: attachment ${sanitizedName} not found`);
return; return;
} }
@ -518,7 +520,7 @@ async function writeThumbnails(rawQuotedAttachments, options) {
) )
); );
} catch (error) { } catch (error) {
console.log( window.log.error(
'writeThumbnails: error exporting conversation', 'writeThumbnails: error exporting conversation',
name, name,
':', ':',
@ -560,7 +562,7 @@ async function writeAttachments(rawAttachments, options) {
try { try {
await Promise.all(promises); await Promise.all(promises);
} catch (error) { } catch (error) {
console.log( window.log.error(
'writeAttachments: error exporting conversation', 'writeAttachments: error exporting conversation',
name, name,
':', ':',
@ -571,7 +573,6 @@ async function writeAttachments(rawAttachments, options) {
} }
async function writeAvatar(avatar, options) { async function writeAvatar(avatar, options) {
console.log('writeAvatar', { avatar, options });
const { dir, message, index, key, newKey } = options; const { dir, message, index, key, newKey } = options;
const name = _getAnonymousAttachmentFileName(message, index); const name = _getAnonymousAttachmentFileName(message, index);
const filename = `${name}-contact-avatar`; const filename = `${name}-contact-avatar`;
@ -618,7 +619,7 @@ async function writeContactAvatars(contact, options) {
) )
); );
} catch (error) { } catch (error) {
console.log( window.log.error(
'writeContactAvatars: error exporting conversation', 'writeContactAvatars: error exporting conversation',
name, name,
':', ':',
@ -633,10 +634,10 @@ async function writeEncryptedAttachment(target, data, options = {}) {
if (fs.existsSync(target)) { if (fs.existsSync(target)) {
if (newKey) { if (newKey) {
console.log(`Deleting attachment ${filename}; key has changed`); window.log.info(`Deleting attachment ${filename}; key has changed`);
fs.unlinkSync(target); fs.unlinkSync(target);
} else { } else {
console.log(`Skipping attachment ${filename}; already exists`); window.log.info(`Skipping attachment ${filename}; already exists`);
return; return;
} }
} }
@ -669,7 +670,7 @@ async function exportConversation(db, conversation, options) {
throw new Error('Need a key to encrypt with!'); throw new Error('Need a key to encrypt with!');
} }
console.log('exporting conversation', name); window.log.info('exporting conversation', name);
const writer = await createFileAndWriter(dir, 'messages.json'); const writer = await createFileAndWriter(dir, 'messages.json');
return new Promise(async (resolve, reject) => { return new Promise(async (resolve, reject) => {
@ -792,7 +793,7 @@ async function exportConversation(db, conversation, options) {
try { try {
await Promise.all([stream.write(']}'), promiseChain, stream.close()]); await Promise.all([stream.write(']}'), promiseChain, stream.close()]);
} catch (error) { } catch (error) {
console.log( window.log.error(
'exportConversation: error exporting conversation', 'exportConversation: error exporting conversation',
name, name,
':', ':',
@ -802,7 +803,7 @@ async function exportConversation(db, conversation, options) {
return; return;
} }
console.log('done exporting conversation', name); window.log.info('done exporting conversation', name);
resolve(); resolve();
} }
}; };
@ -888,12 +889,12 @@ function exportConversations(db, options) {
}); });
}; };
console.log('scheduling export for conversation', name); window.log.info('scheduling export for conversation', name);
// eslint-disable-next-line more/no-then // eslint-disable-next-line more/no-then
promiseChain = promiseChain.then(process); promiseChain = promiseChain.then(process);
cursor.continue(); cursor.continue();
} else { } else {
console.log('Done scheduling conversation exports'); window.log.info('Done scheduling conversation exports');
try { try {
await promiseChain; await promiseChain;
} catch (error) { } catch (error) {
@ -979,7 +980,7 @@ async function loadAttachments(dir, getName, options) {
}) })
); );
console.log('loadAttachments', { message }); window.log.info('loadAttachments', { message });
} }
function saveMessage(db, message) { function saveMessage(db, message) {
@ -1000,7 +1001,7 @@ async function saveAllMessages(db, rawMessages) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let finished = false; let finished = false;
const finish = via => { const finish = via => {
console.log('messages done saving via', via); window.log.info('messages done saving via', via);
if (finished) { if (finished) {
resolve(); resolve();
} }
@ -1026,7 +1027,7 @@ async function saveAllMessages(db, rawMessages) {
request.onsuccess = () => { request.onsuccess = () => {
count += 1; count += 1;
if (count === messages.length) { if (count === messages.length) {
console.log( window.log.info(
'Saved', 'Saved',
messages.length, messages.length,
'messages for conversation', 'messages for conversation',
@ -1066,7 +1067,9 @@ async function importConversation(db, dir, options) {
try { try {
contents = await readFileAsText(dir, 'messages.json'); contents = await readFileAsText(dir, 'messages.json');
} catch (error) { } catch (error) {
console.log(`Warning: could not access messages.json in directory: ${dir}`); window.log.error(
`Warning: could not access messages.json in directory: ${dir}`
);
} }
let promiseChain = Promise.resolve(); let promiseChain = Promise.resolve();
@ -1120,7 +1123,7 @@ async function importConversation(db, dir, options) {
await saveAllMessages(db, messages); await saveAllMessages(db, messages);
await promiseChain; await promiseChain;
console.log( window.log.info(
'Finished importing conversation', 'Finished importing conversation',
conversationId, conversationId,
'Total:', 'Total:',
@ -1208,7 +1211,7 @@ function assembleLookup(db, storeName, keyFunction) {
lookup[keyFunction(cursor.value)] = true; lookup[keyFunction(cursor.value)] = true;
cursor.continue(); cursor.continue();
} else { } else {
console.log(`Done creating ${storeName} lookup`); window.log.info(`Done creating ${storeName} lookup`);
resolve(lookup); resolve(lookup);
} }
}; };
@ -1236,7 +1239,7 @@ function createZip(zipDir, targetDir) {
}); });
archive.on('warning', error => { archive.on('warning', error => {
console.log(`Archive generation warning: ${error.stack}`); window.log.warn(`Archive generation warning: ${error.stack}`);
}); });
archive.on('error', reject); archive.on('error', reject);
@ -1286,7 +1289,7 @@ function createTempDir() {
} }
function deleteAll(pattern) { function deleteAll(pattern) {
console.log(`Deleting ${pattern}`); window.log.info(`Deleting ${pattern}`);
return pify(rimraf)(pattern); return pify(rimraf)(pattern);
} }
@ -1320,10 +1323,10 @@ async function exportToDirectory(directory, options) {
const zip = await createZip(encryptionDir, stagingDir); const zip = await createZip(encryptionDir, stagingDir);
await encryptFile(zip, path.join(directory, 'messages.zip'), options); await encryptFile(zip, path.join(directory, 'messages.zip'), options);
console.log('done backing up!'); window.log.info('done backing up!');
return directory; return directory;
} catch (error) { } catch (error) {
console.log( window.log.error(
'The backup went wrong!', 'The backup went wrong!',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );
@ -1392,7 +1395,7 @@ async function importFromDirectory(directory, options) {
const result = await importNonMessages(db, stagingDir, options); const result = await importNonMessages(db, stagingDir, options);
await importConversations(db, stagingDir, Object.assign({}, options)); await importConversations(db, stagingDir, Object.assign({}, options));
console.log('Done importing from backup!'); window.log.info('Done importing from backup!');
return result; return result;
} finally { } finally {
if (stagingDir) { if (stagingDir) {
@ -1407,10 +1410,10 @@ async function importFromDirectory(directory, options) {
const result = await importNonMessages(db, directory, options); const result = await importNonMessages(db, directory, options);
await importConversations(db, directory, options); await importConversations(db, directory, options);
console.log('Done importing!'); window.log.info('Done importing!');
return result; return result;
} catch (error) { } catch (error) {
console.log( window.log.error(
'The import went wrong!', 'The import went wrong!',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );

View file

@ -1,4 +1,5 @@
/* eslint-env node */ /* eslint-env node */
/* global log */
const fs = require('fs-extra'); const fs = require('fs-extra');
const path = require('path'); const path = require('path');
@ -56,7 +57,7 @@ exports.createConversation = async ({
await Promise.all( await Promise.all(
range(0, numMessages).map(async index => { range(0, numMessages).map(async index => {
await sleep(index * 100); await sleep(index * 100);
console.log(`Create message ${index + 1}`); log.info(`Create message ${index + 1}`);
const messageAttributes = await createRandomMessage({ conversationId }); const messageAttributes = await createRandomMessage({ conversationId });
const message = new WhisperMessage(messageAttributes); const message = new WhisperMessage(messageAttributes);
return deferredToPromise(message.save()); return deferredToPromise(message.save());
@ -107,7 +108,7 @@ const createRandomMessage = async ({ conversationId } = {}) => {
}; };
const message = _createMessage({ commonProperties, conversationId, type }); const message = _createMessage({ commonProperties, conversationId, type });
return Message.initializeSchemaVersion(message); return Message.initializeSchemaVersion({ message, logger: log });
}; };
const _createMessage = ({ commonProperties, conversationId, type } = {}) => { const _createMessage = ({ commonProperties, conversationId, type } = {}) => {

View file

@ -1,4 +1,5 @@
/* eslint-env node */ /* eslint-env node */
/* global log */
exports.setup = (locale, messages) => { exports.setup = (locale, messages) => {
if (!locale) { if (!locale) {
@ -11,7 +12,7 @@ exports.setup = (locale, messages) => {
function getMessage(key, substitutions) { function getMessage(key, substitutions) {
const entry = messages[key]; const entry = messages[key];
if (!entry) { if (!entry) {
console.error( log.error(
`i18n: Attempted to get translation for nonexistent key '${key}'` `i18n: Attempted to get translation for nonexistent key '${key}'`
); );
return ''; return '';

View file

@ -13,7 +13,7 @@ class IdleDetector extends EventEmitter {
} }
start() { start() {
console.log('Start idle detector'); window.log.info('Start idle detector');
this._scheduleNextCallback(); this._scheduleNextCallback();
} }
@ -22,7 +22,7 @@ class IdleDetector extends EventEmitter {
return; return;
} }
console.log('Stop idle detector'); window.log.info('Stop idle detector');
this._clearScheduledCallbacks(); this._clearScheduledCallbacks();
} }

View file

@ -82,6 +82,7 @@ exports.dangerouslyProcessAllWithoutIndex = async ({
minDatabaseVersion, minDatabaseVersion,
numMessagesPerBatch, numMessagesPerBatch,
upgradeMessageSchema, upgradeMessageSchema,
logger,
} = {}) => { } = {}) => {
if (!isString(databaseName)) { if (!isString(databaseName)) {
throw new TypeError("'databaseName' must be a string"); throw new TypeError("'databaseName' must be a string");
@ -102,7 +103,7 @@ exports.dangerouslyProcessAllWithoutIndex = async ({
const connection = await database.open(databaseName); const connection = await database.open(databaseName);
const databaseVersion = connection.version; const databaseVersion = connection.version;
const isValidDatabaseVersion = databaseVersion >= minDatabaseVersion; const isValidDatabaseVersion = databaseVersion >= minDatabaseVersion;
console.log('Database status', { logger.info('Database status', {
databaseVersion, databaseVersion,
isValidDatabaseVersion, isValidDatabaseVersion,
minDatabaseVersion, minDatabaseVersion,
@ -133,7 +134,7 @@ exports.dangerouslyProcessAllWithoutIndex = async ({
break; break;
} }
numCumulativeMessagesProcessed += status.numMessagesProcessed; numCumulativeMessagesProcessed += status.numMessagesProcessed;
console.log( logger.info(
'Upgrade message schema:', 'Upgrade message schema:',
Object.assign({}, status, { Object.assign({}, status, {
numTotalMessages, numTotalMessages,
@ -142,11 +143,11 @@ exports.dangerouslyProcessAllWithoutIndex = async ({
); );
} }
console.log('Close database connection'); logger.info('Close database connection');
connection.close(); connection.close();
const totalDuration = Date.now() - migrationStartTime; const totalDuration = Date.now() - migrationStartTime;
console.log('Attachment migration complete:', { logger.info('Attachment migration complete:', {
totalDuration, totalDuration,
totalMessagesProcessed: numCumulativeMessagesProcessed, totalMessagesProcessed: numCumulativeMessagesProcessed,
}); });

View file

@ -1,7 +1,7 @@
exports.run = transaction => { exports.run = ({ transaction, logger }) => {
const messagesStore = transaction.objectStore('messages'); const messagesStore = transaction.objectStore('messages');
console.log("Create message attachment metadata index: 'hasAttachments'"); logger.info("Create message attachment metadata index: 'hasAttachments'");
messagesStore.createIndex( messagesStore.createIndex(
'hasAttachments', 'hasAttachments',
['conversationId', 'hasAttachments', 'received_at'], ['conversationId', 'hasAttachments', 'received_at'],
@ -9,7 +9,7 @@ exports.run = transaction => {
); );
['hasVisualMediaAttachments', 'hasFileAttachments'].forEach(name => { ['hasVisualMediaAttachments', 'hasFileAttachments'].forEach(name => {
console.log(`Create message attachment metadata index: '${name}'`); logger.info(`Create message attachment metadata index: '${name}'`);
messagesStore.createIndex(name, ['conversationId', 'received_at', name], { messagesStore.createIndex(name, ['conversationId', 'received_at', name], {
unique: false, unique: false,
}); });

View file

@ -1,3 +1,5 @@
/* global window */
const { isString, last } = require('lodash'); const { isString, last } = require('lodash');
const { runMigrations } = require('./run_migrations'); const { runMigrations } = require('./run_migrations');
@ -12,8 +14,8 @@ const migrations = [
{ {
version: '12.0', version: '12.0',
migrate(transaction, next) { migrate(transaction, next) {
console.log('Migration 12'); window.log.info('Migration 12');
console.log('creating object stores'); window.log.info('creating object stores');
const messages = transaction.db.createObjectStore('messages'); const messages = transaction.db.createObjectStore('messages');
messages.createIndex('conversation', ['conversationId', 'received_at'], { messages.createIndex('conversation', ['conversationId', 'received_at'], {
unique: false, unique: false,
@ -46,7 +48,7 @@ const migrations = [
transaction.db.createObjectStore('signedPreKeys'); transaction.db.createObjectStore('signedPreKeys');
transaction.db.createObjectStore('items'); transaction.db.createObjectStore('items');
console.log('creating debug log'); window.log.info('creating debug log');
transaction.db.createObjectStore('debug'); transaction.db.createObjectStore('debug');
next(); next();
@ -55,8 +57,8 @@ const migrations = [
{ {
version: '13.0', version: '13.0',
migrate(transaction, next) { migrate(transaction, next) {
console.log('Migration 13'); window.log.info('Migration 13');
console.log('Adding fields to identity keys'); window.log.info('Adding fields to identity keys');
const identityKeys = transaction.objectStore('identityKeys'); const identityKeys = transaction.objectStore('identityKeys');
const request = identityKeys.openCursor(); const request = identityKeys.openCursor();
const promises = []; const promises = [];
@ -72,9 +74,9 @@ const migrations = [
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
const putRequest = identityKeys.put(attributes, attributes.id); const putRequest = identityKeys.put(attributes, attributes.id);
putRequest.onsuccess = resolve; putRequest.onsuccess = resolve;
putRequest.onerror = e => { putRequest.onerror = error => {
console.log(e); window.log.error(error && error.stack ? error.stack : error);
reject(e); reject(error);
}; };
}) })
); );
@ -88,15 +90,15 @@ const migrations = [
} }
}; };
request.onerror = event => { request.onerror = event => {
console.log(event); window.log.error(event);
}; };
}, },
}, },
{ {
version: '14.0', version: '14.0',
migrate(transaction, next) { migrate(transaction, next) {
console.log('Migration 14'); window.log.info('Migration 14');
console.log('Adding unprocessed message store'); window.log.info('Adding unprocessed message store');
const unprocessed = transaction.db.createObjectStore('unprocessed'); const unprocessed = transaction.db.createObjectStore('unprocessed');
unprocessed.createIndex('received', 'timestamp', { unique: false }); unprocessed.createIndex('received', 'timestamp', { unique: false });
next(); next();
@ -105,8 +107,8 @@ const migrations = [
{ {
version: '15.0', version: '15.0',
migrate(transaction, next) { migrate(transaction, next) {
console.log('Migration 15'); window.log.info('Migration 15');
console.log('Adding messages index for de-duplication'); window.log.info('Adding messages index for de-duplication');
const messages = transaction.objectStore('messages'); const messages = transaction.objectStore('messages');
messages.createIndex('unique', ['source', 'sourceDevice', 'sent_at'], { messages.createIndex('unique', ['source', 'sourceDevice', 'sent_at'], {
unique: true, unique: true,
@ -117,8 +119,8 @@ const migrations = [
{ {
version: '16.0', version: '16.0',
migrate(transaction, next) { migrate(transaction, next) {
console.log('Migration 16'); window.log.info('Migration 16');
console.log('Dropping log table, since we now log to disk'); window.log.info('Dropping log table, since we now log to disk');
transaction.db.deleteObjectStore('debug'); transaction.db.deleteObjectStore('debug');
next(); next();
}, },
@ -126,19 +128,21 @@ const migrations = [
{ {
version: 17, version: 17,
async migrate(transaction, next) { async migrate(transaction, next) {
console.log('Migration 17'); window.log.info('Migration 17');
const start = Date.now(); const start = Date.now();
const messagesStore = transaction.objectStore('messages'); const messagesStore = transaction.objectStore('messages');
console.log('Create index from attachment schema version to attachment'); window.log.info(
'Create index from attachment schema version to attachment'
);
messagesStore.createIndex('schemaVersion', 'schemaVersion', { messagesStore.createIndex('schemaVersion', 'schemaVersion', {
unique: false, unique: false,
}); });
const duration = Date.now() - start; const duration = Date.now() - start;
console.log( window.log.info(
'Complete migration to database version 17', 'Complete migration to database version 17',
`Duration: ${duration}ms` `Duration: ${duration}ms`
); );
@ -148,13 +152,13 @@ const migrations = [
{ {
version: 18, version: 18,
migrate(transaction, next) { migrate(transaction, next) {
console.log('Migration 18'); window.log.info('Migration 18');
const start = Date.now(); const start = Date.now();
Migration18.run(transaction); Migration18.run({ transaction, logger: window.log });
const duration = Date.now() - start; const duration = Date.now() - start;
console.log( window.log.info(
'Complete migration to database version 18', 'Complete migration to database version 18',
`Duration: ${duration}ms` `Duration: ${duration}ms`
); );
@ -169,9 +173,10 @@ const database = {
migrations, migrations,
}; };
exports.run = ({ Backbone, databaseName } = {}) => exports.run = ({ Backbone, databaseName, logger } = {}) =>
runMigrations({ runMigrations({
Backbone, Backbone,
logger,
database: Object.assign( database: Object.assign(
{}, {},
database, database,

View file

@ -16,7 +16,7 @@ const migrations = [
// }, // },
]; ];
exports.run = async ({ Backbone, database } = {}) => { exports.run = async ({ Backbone, database, logger } = {}) => {
const { canRun } = await exports.getStatus({ database }); const { canRun } = await exports.getStatus({ database });
if (!canRun) { if (!canRun) {
throw new Error( throw new Error(
@ -24,7 +24,7 @@ exports.run = async ({ Backbone, database } = {}) => {
); );
} }
await runMigrations({ Backbone, database }); await runMigrations({ Backbone, database, logger });
}; };
exports.getStatus = async ({ database } = {}) => { exports.getStatus = async ({ database } = {}) => {

View file

@ -8,13 +8,13 @@ const { deferredToPromise } = require('../deferred_to_promise');
const closeDatabaseConnection = ({ Backbone } = {}) => const closeDatabaseConnection = ({ Backbone } = {}) =>
deferredToPromise(Backbone.sync('closeall')); deferredToPromise(Backbone.sync('closeall'));
exports.runMigrations = async ({ Backbone, database } = {}) => { exports.runMigrations = async ({ Backbone, database, logger } = {}) => {
if ( if (
!isObject(Backbone) || !isObject(Backbone) ||
!isObject(Backbone.Collection) || !isObject(Backbone.Collection) ||
!isFunction(Backbone.Collection.extend) !isFunction(Backbone.Collection.extend)
) { ) {
throw new TypeError("'Backbone' is required"); throw new TypeError('runMigrations: Backbone is required');
} }
if ( if (
@ -22,7 +22,10 @@ exports.runMigrations = async ({ Backbone, database } = {}) => {
!isString(database.id) || !isString(database.id) ||
!Array.isArray(database.migrations) !Array.isArray(database.migrations)
) { ) {
throw new TypeError("'database' is required"); throw new TypeError('runMigrations: database is required');
}
if (!isObject(logger)) {
throw new TypeError('runMigrations: logger is required');
} }
const { const {
@ -33,7 +36,7 @@ exports.runMigrations = async ({ Backbone, database } = {}) => {
const databaseVersion = await db.getVersion(database.id); const databaseVersion = await db.getVersion(database.id);
const isAlreadyUpgraded = databaseVersion >= lastMigrationVersion; const isAlreadyUpgraded = databaseVersion >= lastMigrationVersion;
console.log('Database status', { logger.info('Database status', {
firstMigrationVersion, firstMigrationVersion,
lastMigrationVersion, lastMigrationVersion,
databaseVersion, databaseVersion,
@ -50,7 +53,7 @@ exports.runMigrations = async ({ Backbone, database } = {}) => {
}))(); }))();
await deferredToPromise(migrationCollection.fetch({ limit: 1 })); await deferredToPromise(migrationCollection.fetch({ limit: 1 }));
console.log('Close database connection'); logger.info('Close database connection');
await closeDatabaseConnection({ Backbone }); await closeDatabaseConnection({ Backbone });
}; };

View file

@ -86,6 +86,7 @@ function initializeMigrations({
Attachments, Attachments,
Type, Type,
VisualType, VisualType,
logger,
}) { }) {
if (!Attachments) { if (!Attachments) {
return null; return null;
@ -131,15 +132,17 @@ function initializeMigrations({
getImageDimensions, getImageDimensions,
makeImageThumbnail, makeImageThumbnail,
makeVideoScreenshot, makeVideoScreenshot,
logger,
}), }),
writeMessageAttachments: MessageType.createAttachmentDataWriter( writeMessageAttachments: MessageType.createAttachmentDataWriter({
createWriterForExisting(attachmentsPath) writeExistingAttachmentData: createWriterForExisting(attachmentsPath),
), logger,
}),
}; };
} }
exports.setup = (options = {}) => { exports.setup = (options = {}) => {
const { Attachments, userDataPath, getRegionCode } = options; const { Attachments, userDataPath, getRegionCode, logger } = options;
const Migrations = initializeMigrations({ const Migrations = initializeMigrations({
userDataPath, userDataPath,
@ -147,6 +150,7 @@ exports.setup = (options = {}) => {
Attachments, Attachments,
Type: AttachmentType, Type: AttachmentType,
VisualType: VisualAttachment, VisualType: VisualAttachment,
logger,
}); });
const Components = { const Components = {

View file

@ -108,9 +108,9 @@ exports._replaceUnicodeOrderOverridesSync = attachment => {
exports.replaceUnicodeOrderOverrides = async attachment => exports.replaceUnicodeOrderOverrides = async attachment =>
exports._replaceUnicodeOrderOverridesSync(attachment); exports._replaceUnicodeOrderOverridesSync(attachment);
exports.removeSchemaVersion = attachment => { exports.removeSchemaVersion = ({ attachment, logger }) => {
if (!exports.isValid(attachment)) { if (!exports.isValid(attachment)) {
console.log( logger.error(
'Attachment.removeSchemaVersion: Invalid input attachment:', 'Attachment.removeSchemaVersion: Invalid input attachment:',
attachment attachment
); );
@ -197,6 +197,7 @@ exports.captureDimensionsAndScreenshot = async (
getImageDimensions, getImageDimensions,
makeImageThumbnail, makeImageThumbnail,
makeVideoScreenshot, makeVideoScreenshot,
logger,
} }
) => { ) => {
const { contentType } = attachment; const { contentType } = attachment;
@ -212,13 +213,17 @@ exports.captureDimensionsAndScreenshot = async (
if (GoogleChrome.isImageTypeSupported(contentType)) { if (GoogleChrome.isImageTypeSupported(contentType)) {
try { try {
const { width, height } = await getImageDimensions(absolutePath); const { width, height } = await getImageDimensions({
objectUrl: absolutePath,
logger,
});
const thumbnailBuffer = await blobToArrayBuffer( const thumbnailBuffer = await blobToArrayBuffer(
await makeImageThumbnail( await makeImageThumbnail({
THUMBNAIL_SIZE, size: THUMBNAIL_SIZE,
absolutePath, objectUrl: absolutePath,
THUMBNAIL_CONTENT_TYPE contentType: THUMBNAIL_CONTENT_TYPE,
) logger,
})
); );
const thumbnailPath = await writeNewAttachmentData(thumbnailBuffer); const thumbnailPath = await writeNewAttachmentData(thumbnailBuffer);
@ -234,7 +239,7 @@ exports.captureDimensionsAndScreenshot = async (
}, },
}; };
} catch (error) { } catch (error) {
console.log( logger.error(
'captureDimensionsAndScreenshot:', 'captureDimensionsAndScreenshot:',
'error processing image; skipping screenshot generation', 'error processing image; skipping screenshot generation',
toLogFormat(error) toLogFormat(error)
@ -246,21 +251,29 @@ exports.captureDimensionsAndScreenshot = async (
let screenshotObjectUrl; let screenshotObjectUrl;
try { try {
const screenshotBuffer = await blobToArrayBuffer( const screenshotBuffer = await blobToArrayBuffer(
await makeVideoScreenshot(absolutePath, THUMBNAIL_CONTENT_TYPE) await makeVideoScreenshot({
objectUrl: absolutePath,
contentType: THUMBNAIL_CONTENT_TYPE,
logger,
})
); );
screenshotObjectUrl = makeObjectUrl( screenshotObjectUrl = makeObjectUrl(
screenshotBuffer, screenshotBuffer,
THUMBNAIL_CONTENT_TYPE THUMBNAIL_CONTENT_TYPE
); );
const { width, height } = await getImageDimensions(screenshotObjectUrl); const { width, height } = await getImageDimensions({
objectUrl: screenshotObjectUrl,
logger,
});
const screenshotPath = await writeNewAttachmentData(screenshotBuffer); const screenshotPath = await writeNewAttachmentData(screenshotBuffer);
const thumbnailBuffer = await blobToArrayBuffer( const thumbnailBuffer = await blobToArrayBuffer(
await makeImageThumbnail( await makeImageThumbnail({
THUMBNAIL_SIZE, size: THUMBNAIL_SIZE,
screenshotObjectUrl, objectUrl: screenshotObjectUrl,
THUMBNAIL_CONTENT_TYPE contentType: THUMBNAIL_CONTENT_TYPE,
) logger,
})
); );
const thumbnailPath = await writeNewAttachmentData(thumbnailBuffer); const thumbnailPath = await writeNewAttachmentData(thumbnailBuffer);
@ -283,7 +296,7 @@ exports.captureDimensionsAndScreenshot = async (
height, height,
}; };
} catch (error) { } catch (error) {
console.log( logger.error(
'captureDimensionsAndScreenshot: error processing video; skipping screenshot generation', 'captureDimensionsAndScreenshot: error processing video; skipping screenshot generation',
toLogFormat(error) toLogFormat(error)
); );

View file

@ -9,7 +9,7 @@ const { isArrayBuffer, isFunction, isUndefined, omit } = require('lodash');
// Promise Attachment // Promise Attachment
exports.migrateDataToFileSystem = async ( exports.migrateDataToFileSystem = async (
attachment, attachment,
{ writeNewAttachmentData } = {} { writeNewAttachmentData, logger } = {}
) => { ) => {
if (!isFunction(writeNewAttachmentData)) { if (!isFunction(writeNewAttachmentData)) {
throw new TypeError("'writeNewAttachmentData' must be a function"); throw new TypeError("'writeNewAttachmentData' must be a function");
@ -19,7 +19,7 @@ exports.migrateDataToFileSystem = async (
const hasData = !isUndefined(data); const hasData = !isUndefined(data);
const shouldSkipSchemaUpgrade = !hasData; const shouldSkipSchemaUpgrade = !hasData;
if (shouldSkipSchemaUpgrade) { if (shouldSkipSchemaUpgrade) {
console.log('WARNING: `attachment.data` is `undefined`'); logger.warn('WARNING: `attachment.data` is `undefined`');
return attachment; return attachment;
} }

View file

@ -13,7 +13,7 @@ exports.parseAndWriteAvatar = upgradeAttachment => async (
contact, contact,
context = {} context = {}
) => { ) => {
const { message, regionCode } = context; const { message, regionCode, logger } = context;
const { avatar } = contact; const { avatar } = contact;
// This is to ensure that an omit() call doesn't pull in prototype props/methods // This is to ensure that an omit() call doesn't pull in prototype props/methods
@ -35,7 +35,7 @@ exports.parseAndWriteAvatar = upgradeAttachment => async (
messageId: idForLogging(message), messageId: idForLogging(message),
}); });
if (error) { if (error) {
console.log( logger.error(
'Contact.parseAndWriteAvatar: contact was malformed.', 'Contact.parseAndWriteAvatar: contact was malformed.',
toLogFormat(error) toLogFormat(error)
); );

View file

@ -1,4 +1,4 @@
const { isFunction, isString, omit } = require('lodash'); const { isFunction, isObject, isString, omit } = require('lodash');
const Contact = require('./contact'); const Contact = require('./contact');
const Attachment = require('./attachment'); const Attachment = require('./attachment');
@ -55,7 +55,7 @@ exports.PRIVATE = PRIVATE;
exports.isValid = () => true; exports.isValid = () => true;
// Schema // Schema
exports.initializeSchemaVersion = message => { exports.initializeSchemaVersion = ({ message, logger }) => {
const isInitialized = const isInitialized =
SchemaVersion.isValid(message.schemaVersion) && message.schemaVersion >= 1; SchemaVersion.isValid(message.schemaVersion) && message.schemaVersion >= 1;
if (isInitialized) { if (isInitialized) {
@ -82,7 +82,9 @@ exports.initializeSchemaVersion = message => {
: INITIAL_SCHEMA_VERSION; : INITIAL_SCHEMA_VERSION;
const messageWithInitialSchema = Object.assign({}, message, { const messageWithInitialSchema = Object.assign({}, message, {
schemaVersion: inheritedSchemaVersion, schemaVersion: inheritedSchemaVersion,
attachments: message.attachments.map(Attachment.removeSchemaVersion), attachments: message.attachments.map(attachment =>
Attachment.removeSchemaVersion({ attachment, logger })
),
}); });
return messageWithInitialSchema; return messageWithInitialSchema;
@ -92,17 +94,24 @@ exports.initializeSchemaVersion = message => {
// type UpgradeStep = (Message, Context) -> Promise Message // type UpgradeStep = (Message, Context) -> Promise Message
// SchemaVersion -> UpgradeStep -> UpgradeStep // SchemaVersion -> UpgradeStep -> UpgradeStep
exports._withSchemaVersion = (schemaVersion, upgrade) => { exports._withSchemaVersion = ({ schemaVersion, upgrade }) => {
if (!SchemaVersion.isValid(schemaVersion)) { if (!SchemaVersion.isValid(schemaVersion)) {
throw new TypeError("'schemaVersion' is invalid"); throw new TypeError('_withSchemaVersion: schemaVersion is invalid');
} }
if (!isFunction(upgrade)) { if (!isFunction(upgrade)) {
throw new TypeError("'upgrade' must be a function"); throw new TypeError('_withSchemaVersion: upgrade must be a function');
} }
return async (message, context) => { return async (message, context) => {
if (!context || !isObject(context.logger)) {
throw new TypeError(
'_withSchemaVersion: context must have logger object'
);
}
const { logger } = context;
if (!exports.isValid(message)) { if (!exports.isValid(message)) {
console.log( logger.error(
'Message._withSchemaVersion: Invalid input message:', 'Message._withSchemaVersion: Invalid input message:',
message message
); );
@ -117,7 +126,7 @@ exports._withSchemaVersion = (schemaVersion, upgrade) => {
const expectedVersion = schemaVersion - 1; const expectedVersion = schemaVersion - 1;
const hasExpectedVersion = message.schemaVersion === expectedVersion; const hasExpectedVersion = message.schemaVersion === expectedVersion;
if (!hasExpectedVersion) { if (!hasExpectedVersion) {
console.log( logger.warn(
'WARNING: Message._withSchemaVersion: Unexpected version:', 'WARNING: Message._withSchemaVersion: Unexpected version:',
`Expected message to have version ${expectedVersion},`, `Expected message to have version ${expectedVersion},`,
`but got ${message.schemaVersion}.`, `but got ${message.schemaVersion}.`,
@ -130,7 +139,7 @@ exports._withSchemaVersion = (schemaVersion, upgrade) => {
try { try {
upgradedMessage = await upgrade(message, context); upgradedMessage = await upgrade(message, context);
} catch (error) { } catch (error) {
console.log( logger.error(
`Message._withSchemaVersion: error updating message ${message.id}:`, `Message._withSchemaVersion: error updating message ${message.id}:`,
Errors.toLogFormat(error) Errors.toLogFormat(error)
); );
@ -138,7 +147,7 @@ exports._withSchemaVersion = (schemaVersion, upgrade) => {
} }
if (!exports.isValid(upgradedMessage)) { if (!exports.isValid(upgradedMessage)) {
console.log( logger.error(
'Message._withSchemaVersion: Invalid upgraded message:', 'Message._withSchemaVersion: Invalid upgraded message:',
upgradedMessage upgradedMessage
); );
@ -186,6 +195,10 @@ exports._mapQuotedAttachments = upgradeAttachment => async (
if (!message.quote) { if (!message.quote) {
return message; return message;
} }
if (!context || !isObject(context.logger)) {
throw new Error('_mapQuotedAttachments: context must have logger object');
}
const { logger } = context;
const upgradeWithContext = async attachment => { const upgradeWithContext = async attachment => {
const { thumbnail } = attachment; const { thumbnail } = attachment;
@ -194,7 +207,7 @@ exports._mapQuotedAttachments = upgradeAttachment => async (
} }
if (!thumbnail.data) { if (!thumbnail.data) {
console.log('Quoted attachment did not have thumbnail data; removing it'); logger.warn('Quoted attachment did not have thumbnail data; removing it');
return omit(attachment, ['thumbnail']); return omit(attachment, ['thumbnail']);
} }
@ -216,39 +229,46 @@ exports._mapQuotedAttachments = upgradeAttachment => async (
}); });
}; };
const toVersion0 = async message => exports.initializeSchemaVersion(message); const toVersion0 = async (message, context) =>
const toVersion1 = exports._withSchemaVersion( exports.initializeSchemaVersion({ message, logger: context.logger });
1, const toVersion1 = exports._withSchemaVersion({
exports._mapAttachments(Attachment.autoOrientJPEG) schemaVersion: 1,
); upgrade: exports._mapAttachments(Attachment.autoOrientJPEG),
const toVersion2 = exports._withSchemaVersion( });
2, const toVersion2 = exports._withSchemaVersion({
exports._mapAttachments(Attachment.replaceUnicodeOrderOverrides) schemaVersion: 2,
); upgrade: exports._mapAttachments(Attachment.replaceUnicodeOrderOverrides),
const toVersion3 = exports._withSchemaVersion( });
3, const toVersion3 = exports._withSchemaVersion({
exports._mapAttachments(Attachment.migrateDataToFileSystem) schemaVersion: 3,
); upgrade: exports._mapAttachments(Attachment.migrateDataToFileSystem),
const toVersion4 = exports._withSchemaVersion( });
4, const toVersion4 = exports._withSchemaVersion({
exports._mapQuotedAttachments(Attachment.migrateDataToFileSystem) schemaVersion: 4,
); upgrade: exports._mapQuotedAttachments(Attachment.migrateDataToFileSystem),
const toVersion5 = exports._withSchemaVersion(5, initializeAttachmentMetadata); });
const toVersion6 = exports._withSchemaVersion( const toVersion5 = exports._withSchemaVersion({
6, schemaVersion: 5,
exports._mapContact( upgrade: initializeAttachmentMetadata,
});
const toVersion6 = exports._withSchemaVersion({
schemaVersion: 6,
upgrade: exports._mapContact(
Contact.parseAndWriteAvatar(Attachment.migrateDataToFileSystem) Contact.parseAndWriteAvatar(Attachment.migrateDataToFileSystem)
) ),
); });
// IMPORTANT: Weve updated our definition of `initializeAttachmentMetadata`, so // IMPORTANT: Weve updated our definition of `initializeAttachmentMetadata`, so
// we need to run it again on existing items that have previously been incorrectly // we need to run it again on existing items that have previously been incorrectly
// classified: // classified:
const toVersion7 = exports._withSchemaVersion(7, initializeAttachmentMetadata); const toVersion7 = exports._withSchemaVersion({
schemaVersion: 7,
upgrade: initializeAttachmentMetadata,
});
const toVersion8 = exports._withSchemaVersion( const toVersion8 = exports._withSchemaVersion({
8, schemaVersion: 8,
exports._mapAttachments(Attachment.captureDimensionsAndScreenshot) upgrade: exports._mapAttachments(Attachment.captureDimensionsAndScreenshot),
); });
const VERSIONS = [ const VERSIONS = [
toVersion0, toVersion0,
@ -275,6 +295,7 @@ exports.upgradeSchema = async (
getImageDimensions, getImageDimensions,
makeImageThumbnail, makeImageThumbnail,
makeVideoScreenshot, makeVideoScreenshot,
logger,
} = {} } = {}
) => { ) => {
if (!isFunction(writeNewAttachmentData)) { if (!isFunction(writeNewAttachmentData)) {
@ -301,6 +322,9 @@ exports.upgradeSchema = async (
if (!isFunction(makeVideoScreenshot)) { if (!isFunction(makeVideoScreenshot)) {
throw new TypeError('context.makeVideoScreenshot is required'); throw new TypeError('context.makeVideoScreenshot is required');
} }
if (!isObject(logger)) {
throw new TypeError('context.logger is required');
}
let message = rawMessage; let message = rawMessage;
// eslint-disable-next-line no-restricted-syntax // eslint-disable-next-line no-restricted-syntax
@ -317,6 +341,7 @@ exports.upgradeSchema = async (
getImageDimensions, getImageDimensions,
makeImageThumbnail, makeImageThumbnail,
makeVideoScreenshot, makeVideoScreenshot,
logger,
}); });
} }
@ -339,9 +364,17 @@ exports.createAttachmentLoader = loadAttachmentData => {
// createAttachmentDataWriter :: (RelativePath -> IO Unit) // createAttachmentDataWriter :: (RelativePath -> IO Unit)
// Message -> // Message ->
// IO (Promise Message) // IO (Promise Message)
exports.createAttachmentDataWriter = writeExistingAttachmentData => { exports.createAttachmentDataWriter = ({
writeExistingAttachmentData,
logger,
}) => {
if (!isFunction(writeExistingAttachmentData)) { if (!isFunction(writeExistingAttachmentData)) {
throw new TypeError("'writeExistingAttachmentData' must be a function"); throw new TypeError(
'createAttachmentDataWriter: writeExistingAttachmentData must be a function'
);
}
if (!isObject(logger)) {
throw new TypeError('createAttachmentDataWriter: logger must be an object');
} }
return async rawMessage => { return async rawMessage => {
@ -349,7 +382,10 @@ exports.createAttachmentDataWriter = writeExistingAttachmentData => {
throw new TypeError("'rawMessage' is not valid"); throw new TypeError("'rawMessage' is not valid");
} }
const message = exports.initializeSchemaVersion(rawMessage); const message = exports.initializeSchemaVersion({
message: rawMessage,
logger,
});
const { attachments, quote, contact } = message; const { attachments, quote, contact } = message;
const hasFilesToWrite = const hasFilesToWrite =
@ -387,7 +423,7 @@ exports.createAttachmentDataWriter = writeExistingAttachmentData => {
// we want to be bulletproof to thumbnails without data // we want to be bulletproof to thumbnails without data
if (!data || !path) { if (!data || !path) {
console.log( logger.warn(
'Thumbnail had neither data nor path.', 'Thumbnail had neither data nor path.',
'id:', 'id:',
message.id, message.id,
@ -418,7 +454,7 @@ exports.createAttachmentDataWriter = writeExistingAttachmentData => {
const messageWithoutAttachmentData = Object.assign( const messageWithoutAttachmentData = Object.assign(
{}, {},
await writeThumbnails(message), await writeThumbnails(message, { logger }),
{ {
contact: await Promise.all((contact || []).map(writeContactAvatar)), contact: await Promise.all((contact || []).map(writeContactAvatar)),
attachments: await Promise.all( attachments: await Promise.all(

View file

@ -10,7 +10,7 @@ const {
exports.blobToArrayBuffer = blobToArrayBuffer; exports.blobToArrayBuffer = blobToArrayBuffer;
exports.getImageDimensions = objectUrl => exports.getImageDimensions = ({ objectUrl, logger }) =>
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
const image = document.createElement('img'); const image = document.createElement('img');
@ -21,14 +21,19 @@ exports.getImageDimensions = objectUrl =>
}); });
}); });
image.addEventListener('error', error => { image.addEventListener('error', error => {
console.log('getImageDimensions error', toLogFormat(error)); logger.error('getImageDimensions error', toLogFormat(error));
reject(error); reject(error);
}); });
image.src = objectUrl; image.src = objectUrl;
}); });
exports.makeImageThumbnail = (size, objectUrl, contentType = 'image/png') => exports.makeImageThumbnail = ({
size,
objectUrl,
contentType = 'image/png',
logger,
}) =>
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
const image = document.createElement('img'); const image = document.createElement('img');
@ -61,14 +66,18 @@ exports.makeImageThumbnail = (size, objectUrl, contentType = 'image/png') =>
}); });
image.addEventListener('error', error => { image.addEventListener('error', error => {
console.log('makeImageThumbnail error', toLogFormat(error)); logger.error('makeImageThumbnail error', toLogFormat(error));
reject(error); reject(error);
}); });
image.src = objectUrl; image.src = objectUrl;
}); });
exports.makeVideoScreenshot = (objectUrl, contentType = 'image/png') => exports.makeVideoScreenshot = ({
objectUrl,
contentType = 'image/png',
logger,
}) =>
new Promise((resolve, reject) => { new Promise((resolve, reject) => {
const video = document.createElement('video'); const video = document.createElement('video');
@ -89,25 +98,33 @@ exports.makeVideoScreenshot = (objectUrl, contentType = 'image/png') =>
video.addEventListener('canplay', capture); video.addEventListener('canplay', capture);
video.addEventListener('error', error => { video.addEventListener('error', error => {
console.log('makeVideoThumbnail error', toLogFormat(error)); logger.error('makeVideoThumbnail error', toLogFormat(error));
reject(error); reject(error);
}); });
video.src = objectUrl; video.src = objectUrl;
}); });
exports.makeVideoThumbnail = async (size, videoObjectUrl) => { exports.makeVideoThumbnail = async ({ size, videoObjectUrl, logger }) => {
let screenshotObjectUrl; let screenshotObjectUrl;
try { try {
const type = 'image/png'; const type = 'image/png';
const blob = await exports.makeVideoScreenshot(videoObjectUrl, type); const blob = await exports.makeVideoScreenshot({
objectUrl: videoObjectUrl,
contentType: type,
logger,
});
const data = await blobToArrayBuffer(blob); const data = await blobToArrayBuffer(blob);
screenshotObjectUrl = arrayBufferToObjectURL({ screenshotObjectUrl = arrayBufferToObjectURL({
data, data,
type, type,
}); });
return exports.makeImageThumbnail(size, screenshotObjectUrl); return exports.makeImageThumbnail({
size,
objectUrl: screenshotObjectUrl,
logger,
});
} finally { } finally {
exports.revokeObjectUrl(screenshotObjectUrl); exports.revokeObjectUrl(screenshotObjectUrl);
} }

View file

@ -6,6 +6,7 @@ const is = require('@sindresorhus/is');
/* global Buffer: false */ /* global Buffer: false */
/* global setTimeout: false */ /* global setTimeout: false */
/* global log: false */
/* eslint-disable more/no-then, no-bitwise, no-nested-ternary */ /* eslint-disable more/no-then, no-bitwise, no-nested-ternary */
@ -159,7 +160,7 @@ function _createSocket(url, { certificateAuthority, proxyUrl }) {
function _promiseAjax(providedUrl, options) { function _promiseAjax(providedUrl, options) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const url = providedUrl || `${options.host}/${options.path}`; const url = providedUrl || `${options.host}/${options.path}`;
console.log(options.type, url); log.info(options.type, url);
const timeout = const timeout =
typeof options.timeout !== 'undefined' ? options.timeout : 10000; typeof options.timeout !== 'undefined' ? options.timeout : 10000;
@ -220,7 +221,7 @@ function _promiseAjax(providedUrl, options) {
if (options.responseType === 'json') { if (options.responseType === 'json') {
if (options.validateResponse) { if (options.validateResponse) {
if (!_validateResponse(result, options.validateResponse)) { if (!_validateResponse(result, options.validateResponse)) {
console.log(options.type, url, response.status, 'Error'); log.error(options.type, url, response.status, 'Error');
reject( reject(
HTTPError( HTTPError(
'promiseAjax: invalid response', 'promiseAjax: invalid response',
@ -233,10 +234,10 @@ function _promiseAjax(providedUrl, options) {
} }
} }
if (response.status >= 0 && response.status < 400) { if (response.status >= 0 && response.status < 400) {
console.log(options.type, url, response.status, 'Success'); log.info(options.type, url, response.status, 'Success');
resolve(result, response.status); resolve(result, response.status);
} else { } else {
console.log(options.type, url, response.status, 'Error'); log.error(options.type, url, response.status, 'Error');
reject( reject(
HTTPError( HTTPError(
'promiseAjax: error response', 'promiseAjax: error response',
@ -249,7 +250,7 @@ function _promiseAjax(providedUrl, options) {
}); });
}) })
.catch(e => { .catch(e => {
console.log(options.type, url, 0, 'Error'); log.error(options.type, url, 0, 'Error');
const stack = `${e.stack}\nInitial stack:\n${options.stack}`; const stack = `${e.stack}\nInitial stack:\n${options.stack}`;
reject(HTTPError('promiseAjax catch', 0, e.toString(), stack)); reject(HTTPError('promiseAjax catch', 0, e.toString(), stack));
}); });
@ -650,7 +651,7 @@ function initialize({ url, cdnUrl, certificateAuthority, proxyUrl }) {
} }
function getMessageSocket() { function getMessageSocket() {
console.log('opening message socket', url); log.info('opening message socket', url);
const fixedScheme = url const fixedScheme = url
.replace('https://', 'wss://') .replace('https://', 'wss://')
.replace('http://', 'ws://'); .replace('http://', 'ws://');
@ -664,7 +665,7 @@ function initialize({ url, cdnUrl, certificateAuthority, proxyUrl }) {
} }
function getProvisioningSocket() { function getProvisioningSocket() {
console.log('opening provisioning socket', url); log.info('opening provisioning socket', url);
const fixedScheme = url const fixedScheme = url
.replace('https://', 'wss://') .replace('https://', 'wss://')
.replace('http://', 'ws://'); .replace('http://', 'ws://');

View file

@ -67,7 +67,7 @@
userSetting, userSetting,
}); });
console.log( window.log.info(
'Update notifications:', 'Update notifications:',
Object.assign({}, status, { Object.assign({}, status, {
isNotificationGroupingSupported, isNotificationGroupingSupported,
@ -128,7 +128,7 @@
iconUrl = last.iconUrl; iconUrl = last.iconUrl;
break; break;
default: default:
console.log( window.log.error(
`Error: Unknown user notification setting: '${userSetting}'` `Error: Unknown user notification setting: '${userSetting}'`
); );
break; break;
@ -161,11 +161,11 @@
return storage.get('notification-setting') || SettingNames.MESSAGE; return storage.get('notification-setting') || SettingNames.MESSAGE;
}, },
onRemove() { onRemove() {
console.log('Remove notification'); window.log.info('Remove notification');
this.update(); this.update();
}, },
clear() { clear() {
console.log('Remove all notifications'); window.log.info('Remove all notifications');
this.reset([]); this.reset([]);
this.update(); this.update();
}, },

View file

@ -24,7 +24,7 @@
_.contains(ids, receipt.get('reader')) _.contains(ids, receipt.get('reader'))
); );
if (receipts.length) { if (receipts.length) {
console.log('Found early read receipts for message'); window.log.info('Found early read receipts for message');
this.remove(receipts); this.remove(receipts);
} }
return receipts; return receipts;
@ -75,7 +75,7 @@
}, reject); }, reject);
}); });
} }
console.log( window.log.info(
'No message for read receipt', 'No message for read receipt',
receipt.get('reader'), receipt.get('reader'),
receipt.get('timestamp') receipt.get('timestamp')
@ -84,7 +84,7 @@
return null; return null;
}) })
.catch(error => { .catch(error => {
console.log( window.log.error(
'ReadReceipts.onReceipt error:', 'ReadReceipts.onReceipt error:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );

View file

@ -14,7 +14,7 @@
timestamp: message.get('sent_at'), timestamp: message.get('sent_at'),
}); });
if (receipt) { if (receipt) {
console.log('Found early read sync for message'); window.log.info('Found early read sync for message');
this.remove(receipt); this.remove(receipt);
return receipt; return receipt;
} }
@ -23,41 +23,49 @@
}, },
onReceipt(receipt) { onReceipt(receipt) {
const messages = new Whisper.MessageCollection(); const messages = new Whisper.MessageCollection();
return messages.fetchSentAt(receipt.get('timestamp')).then(() => { return messages
const message = messages.find( .fetchSentAt(receipt.get('timestamp'))
item => .then(() => {
item.isIncoming() && const message = messages.find(
item.isUnread() && item =>
item.get('source') === receipt.get('sender') item.isIncoming() &&
); item.isUnread() &&
const notificationForMessage = message item.get('source') === receipt.get('sender')
? Whisper.Notifications.findWhere({ messageId: message.id }) );
: null; const notificationForMessage = message
const removedNotification = Whisper.Notifications.remove( ? Whisper.Notifications.findWhere({ messageId: message.id })
notificationForMessage : null;
); const removedNotification = Whisper.Notifications.remove(
const receiptSender = receipt.get('sender'); notificationForMessage
const receiptTimestamp = receipt.get('timestamp'); );
const wasMessageFound = Boolean(message); const receiptSender = receipt.get('sender');
const wasNotificationFound = Boolean(notificationForMessage); const receiptTimestamp = receipt.get('timestamp');
const wasNotificationRemoved = Boolean(removedNotification); const wasMessageFound = Boolean(message);
console.log('Receive read sync:', { const wasNotificationFound = Boolean(notificationForMessage);
receiptSender, const wasNotificationRemoved = Boolean(removedNotification);
receiptTimestamp, window.log.info('Receive read sync:', {
wasMessageFound, receiptSender,
wasNotificationFound, receiptTimestamp,
wasNotificationRemoved, wasMessageFound,
wasNotificationFound,
wasNotificationRemoved,
});
return message
? message.markRead(receipt.get('read_at')).then(() => {
// This notification may result in messages older than this one being
// marked read. We want those messages to have the same expire timer
// start time as this one, so we pass the read_at value through.
this.notifyConversation(message, receipt.get('read_at'));
this.remove(receipt);
})
: Promise.resolve();
})
.catch(error => {
window.log.error(
'ReadSyncs.onReceipt error:',
error && error.stack ? error.stack : error
);
}); });
return message
? message.markRead(receipt.get('read_at')).then(() => {
// This notification may result in messages older than this one being
// marked read. We want those messages to have the same expire timer
// start time as this one, so we pass the read_at value through.
this.notifyConversation(message, receipt.get('read_at'));
this.remove(receipt);
})
: Promise.resolve();
});
}, },
notifyConversation(message, readAt) { notifyConversation(message, readAt) {
const conversation = ConversationController.get({ const conversation = ConversationController.get({

View file

@ -63,7 +63,7 @@
a2 = args[1], a2 = args[1],
a3 = args[2]; a3 = args[2];
const logError = function(error) { const logError = function(error) {
console.log( window.log.error(
'Model caught error triggering', 'Model caught error triggering',
name, name,
'event:', 'event:',

View file

@ -16,11 +16,11 @@
} }
function run() { function run() {
console.log('Rotating signed prekey...'); window.log.info('Rotating signed prekey...');
getAccountManager() getAccountManager()
.rotateSignedPreKey() .rotateSignedPreKey()
.catch(() => { .catch(() => {
console.log( window.log.error(
'rotateSignedPrekey() failed. Trying again in five seconds' 'rotateSignedPrekey() failed. Trying again in five seconds'
); );
setTimeout(runWhenOnline, 5000); setTimeout(runWhenOnline, 5000);
@ -33,7 +33,7 @@
if (navigator.onLine) { if (navigator.onLine) {
run(); run();
} else { } else {
console.log( window.log.info(
'We are offline; keys will be rotated when we are next online' 'We are offline; keys will be rotated when we are next online'
); );
const listener = () => { const listener = () => {
@ -49,7 +49,7 @@
const time = storage.get('nextSignedKeyRotationTime', now); const time = storage.get('nextSignedKeyRotationTime', now);
if (scheduledTime !== time || !timeout) { if (scheduledTime !== time || !timeout) {
console.log( window.log.info(
'Next signed key rotation scheduled for', 'Next signed key rotation scheduled for',
new Date(time).toISOString() new Date(time).toISOString()
); );
@ -69,7 +69,7 @@
Whisper.RotateSignedPreKeyListener = { Whisper.RotateSignedPreKeyListener = {
init(events, newVersion) { init(events, newVersion) {
if (initComplete) { if (initComplete) {
console.log('Rotate signed prekey listener: Already initialized'); window.log.warn('Rotate signed prekey listener: Already initialized');
return; return;
} }
initComplete = true; initComplete = true;

View file

@ -212,14 +212,14 @@
return new Promise(resolve => { return new Promise(resolve => {
prekey.fetch().then( prekey.fetch().then(
() => { () => {
console.log('Successfully fetched prekey:', keyId); window.log.info('Successfully fetched prekey:', keyId);
resolve({ resolve({
pubKey: prekey.get('publicKey'), pubKey: prekey.get('publicKey'),
privKey: prekey.get('privateKey'), privKey: prekey.get('privateKey'),
}); });
}, },
() => { () => {
console.log('Failed to fetch prekey:', keyId); window.log.error('Failed to fetch prekey:', keyId);
resolve(); resolve();
} }
); );
@ -249,7 +249,7 @@
} }
return deferred.then(resolve, error => { return deferred.then(resolve, error => {
console.log( window.log.error(
'removePreKey error:', 'removePreKey error:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );
@ -271,7 +271,7 @@
prekey prekey
.fetch() .fetch()
.then(() => { .then(() => {
console.log( window.log.info(
'Successfully fetched signed prekey:', 'Successfully fetched signed prekey:',
prekey.get('id') prekey.get('id')
); );
@ -284,7 +284,7 @@
}); });
}) })
.fail(() => { .fail(() => {
console.log('Failed to fetch signed prekey:', keyId); window.log.error('Failed to fetch signed prekey:', keyId);
resolve(); resolve();
}); });
}); });
@ -373,7 +373,7 @@
number, number,
}) })
.fail(e => { .fail(e => {
console.log('Failed to save session', encodedNumber, e); window.log.error('Failed to save session', encodedNumber, e);
}) })
.always(() => { .always(() => {
resolve(); resolve();
@ -393,7 +393,7 @@
}); });
}, },
removeSession(encodedNumber) { removeSession(encodedNumber) {
console.log('deleting session for ', encodedNumber); window.log.info('deleting session for ', encodedNumber);
return new Promise(resolve => { return new Promise(resolve => {
const session = new Session({ id: encodedNumber }); const session = new Session({ id: encodedNumber });
session session
@ -436,7 +436,7 @@
address.getName(), address.getName(),
deviceId deviceId
); );
console.log('closing session for', sibling.toString()); window.log.info('closing session for', sibling.toString());
const sessionCipher = new libsignal.SessionCipher( const sessionCipher = new libsignal.SessionCipher(
textsecure.storage.protocol, textsecure.storage.protocol,
sibling sibling
@ -454,7 +454,7 @@
number, number,
deviceId deviceId
); );
console.log('closing session for', address.toString()); window.log.info('closing session for', address.toString());
const sessionCipher = new libsignal.SessionCipher( const sessionCipher = new libsignal.SessionCipher(
textsecure.storage.protocol, textsecure.storage.protocol,
address address
@ -500,19 +500,19 @@
const existing = identityRecord.get('publicKey'); const existing = identityRecord.get('publicKey');
if (!existing) { if (!existing) {
console.log('isTrustedForSending: Nothing here, returning true...'); window.log.info('isTrustedForSending: Nothing here, returning true...');
return true; return true;
} }
if (!equalArrayBuffers(existing, publicKey)) { if (!equalArrayBuffers(existing, publicKey)) {
console.log("isTrustedForSending: Identity keys don't match..."); window.log.info("isTrustedForSending: Identity keys don't match...");
return false; return false;
} }
if (identityRecord.get('verified') === VerifiedStatus.UNVERIFIED) { if (identityRecord.get('verified') === VerifiedStatus.UNVERIFIED) {
console.log('Needs unverified approval!'); window.log.error('Needs unverified approval!');
return false; return false;
} }
if (this.isNonBlockingApprovalRequired(identityRecord)) { if (this.isNonBlockingApprovalRequired(identityRecord)) {
console.log('isTrustedForSending: Needs non-blocking approval!'); window.log.error('isTrustedForSending: Needs non-blocking approval!');
return false; return false;
} }
@ -549,7 +549,7 @@
const oldpublicKey = identityRecord.get('publicKey'); const oldpublicKey = identityRecord.get('publicKey');
if (!oldpublicKey) { if (!oldpublicKey) {
// Lookup failed, or the current key was removed, so save this one. // Lookup failed, or the current key was removed, so save this one.
console.log('Saving new identity...'); window.log.info('Saving new identity...');
identityRecord identityRecord
.save({ .save({
publicKey, publicKey,
@ -562,7 +562,7 @@
resolve(false); resolve(false);
}, reject); }, reject);
} else if (!equalArrayBuffers(oldpublicKey, publicKey)) { } else if (!equalArrayBuffers(oldpublicKey, publicKey)) {
console.log('Replacing existing identity...'); window.log.info('Replacing existing identity...');
const previousStatus = identityRecord.get('verified'); const previousStatus = identityRecord.get('verified');
let verifiedStatus; let verifiedStatus;
if ( if (
@ -588,7 +588,7 @@
}, reject); }, reject);
}, reject); }, reject);
} else if (this.isNonBlockingApprovalRequired(identityRecord)) { } else if (this.isNonBlockingApprovalRequired(identityRecord)) {
console.log('Setting approval status...'); window.log.info('Setting approval status...');
identityRecord identityRecord
.save({ .save({
nonblockingApproval, nonblockingApproval,
@ -680,7 +680,7 @@
reject(identityRecord.validationError); reject(identityRecord.validationError);
} }
} else { } else {
console.log('No identity record for specified publicKey'); window.log.info('No identity record for specified publicKey');
resolve(); resolve();
} }
}, },
@ -821,7 +821,7 @@
}) })
.always(() => { .always(() => {
if (!isPresent && verifiedStatus === VerifiedStatus.DEFAULT) { if (!isPresent && verifiedStatus === VerifiedStatus.DEFAULT) {
console.log('No existing record for default status'); window.log.info('No existing record for default status');
return resolve(); return resolve();
} }

View file

@ -41,7 +41,7 @@ function setupLinux(locale) {
// to other dictionaries // to other dictionaries
const location = process.env.HUNSPELL_DICTIONARIES || '/usr/share/hunspell'; const location = process.env.HUNSPELL_DICTIONARIES || '/usr/share/hunspell';
console.log( window.log.info(
'Detected Linux. Setting up spell check with locale', 'Detected Linux. Setting up spell check with locale',
locale, locale,
'and dictionary location', 'and dictionary location',
@ -49,7 +49,9 @@ function setupLinux(locale) {
); );
spellchecker.setDictionary(locale, location); spellchecker.setDictionary(locale, location);
} else { } else {
console.log('Detected Linux. Using default en_US spell check dictionary'); window.log.info(
'Detected Linux. Using default en_US spell check dictionary'
);
} }
} }
@ -57,7 +59,7 @@ function setupWin7AndEarlier(locale) {
if (process.env.HUNSPELL_DICTIONARIES || locale !== 'en_US') { if (process.env.HUNSPELL_DICTIONARIES || locale !== 'en_US') {
const location = process.env.HUNSPELL_DICTIONARIES; const location = process.env.HUNSPELL_DICTIONARIES;
console.log( window.log.info(
'Detected Windows 7 or below. Setting up spell-check with locale', 'Detected Windows 7 or below. Setting up spell-check with locale',
locale, locale,
'and dictionary location', 'and dictionary location',
@ -65,7 +67,7 @@ function setupWin7AndEarlier(locale) {
); );
spellchecker.setDictionary(locale, location); spellchecker.setDictionary(locale, location);
} else { } else {
console.log( window.log.info(
'Detected Windows 7 or below. Using default en_US spell check dictionary' 'Detected Windows 7 or below. Using default en_US spell check dictionary'
); );
} }
@ -87,7 +89,10 @@ if (process.platform === 'linux') {
setupWin7AndEarlier(locale); setupWin7AndEarlier(locale);
} else { } else {
// OSX and Windows 8+ have OS-level spellcheck APIs // OSX and Windows 8+ have OS-level spellcheck APIs
console.log('Using OS-level spell check API with locale', process.env.LANG); window.log.info(
'Using OS-level spell check API with locale',
process.env.LANG
);
} }
const simpleChecker = { const simpleChecker = {

View file

@ -31,7 +31,10 @@
throw new Error('Tried to store undefined'); throw new Error('Tried to store undefined');
} }
if (!ready) { if (!ready) {
console.log('Called storage.put before storage is ready. key:', key); window.log.warn(
'Called storage.put before storage is ready. key:',
key
);
} }
const item = items.add({ id: key, value }, { merge: true }); const item = items.add({ id: key, value }, { merge: true });
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {

View file

@ -129,7 +129,7 @@
// this.initialLoadComplete. An example of this: on a phone-pairing setup. // this.initialLoadComplete. An example of this: on a phone-pairing setup.
_.defaults(options, { initialLoadComplete: this.initialLoadComplete }); _.defaults(options, { initialLoadComplete: this.initialLoadComplete });
console.log('open inbox'); window.log.info('open inbox');
this.closeInstaller(); this.closeInstaller();
if (!this.inboxView) { if (!this.inboxView) {

View file

@ -29,15 +29,17 @@
this.remove(); this.remove();
}, },
async onDeleteAllData() { async onDeleteAllData() {
console.log('Deleting everything!'); window.log.info('Deleting everything!');
this.step = CLEAR_DATA_STEPS.DELETING; this.step = CLEAR_DATA_STEPS.DELETING;
this.render(); this.render();
try { try {
await Database.close(); await Database.close();
console.log('All database connections closed. Starting delete.'); window.log.info('All database connections closed. Starting delete.');
} catch (error) { } catch (error) {
console.log('Something went wrong closing all database connections.'); window.log.error(
'Something went wrong closing all database connections.'
);
} }
this.clearAllData(); this.clearAllData();
@ -46,7 +48,7 @@
try { try {
await Promise.all([Logs.deleteAll(), Database.drop()]); await Promise.all([Logs.deleteAll(), Database.drop()]);
} catch (error) { } catch (error) {
console.log( window.log.error(
'Something went wrong deleting all data:', 'Something went wrong deleting all data:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );

View file

@ -13,14 +13,14 @@
const $el = this.$(`.${conversation.cid}`); const $el = this.$(`.${conversation.cid}`);
if (!$el || !$el.length) { if (!$el || !$el.length) {
console.log( window.log.warn(
'updateLocation: did not find element for conversation', 'updateLocation: did not find element for conversation',
conversation.idForLogging() conversation.idForLogging()
); );
return; return;
} }
if ($el.length > 1) { if ($el.length > 1) {
console.log( window.log.warn(
'updateLocation: found more than one element for conversation', 'updateLocation: found more than one element for conversation',
conversation.idForLogging() conversation.idForLogging()
); );
@ -33,7 +33,7 @@
const elIndex = $allConversations.index($el); const elIndex = $allConversations.index($el);
if (elIndex < 0) { if (elIndex < 0) {
console.log( window.log.warn(
'updateLocation: did not find index for conversation', 'updateLocation: did not find index for conversation',
conversation.idForLogging() conversation.idForLogging()
); );

View file

@ -259,7 +259,7 @@
}, },
unload(reason) { unload(reason) {
console.log( window.log.info(
'unloading conversation', 'unloading conversation',
this.model.idForLogging(), this.model.idForLogging(),
'due to:', 'due to:',
@ -329,7 +329,7 @@
return; return;
} }
console.log( window.log.info(
'trimming conversation', 'trimming conversation',
this.model.idForLogging(), this.model.idForLogging(),
'of', 'of',
@ -482,7 +482,7 @@
const view = this.loadingScreen; const view = this.loadingScreen;
if (view) { if (view) {
const openDelta = Date.now() - this.openStart; const openDelta = Date.now() - this.openStart;
console.log( window.log.info(
'Conversation', 'Conversation',
this.model.idForLogging(), this.model.idForLogging(),
'took', 'took',
@ -507,7 +507,7 @@
this.model.updateVerified().then(() => { this.model.updateVerified().then(() => {
this.onVerifiedChange(); this.onVerifiedChange();
this.statusFetch = null; this.statusFetch = null;
console.log('done with status fetch'); window.log.info('done with status fetch');
}) })
); );
@ -786,10 +786,10 @@
}, },
fetchMessages() { fetchMessages() {
console.log('fetchMessages'); window.log.info('fetchMessages');
this.$('.bar-container').show(); this.$('.bar-container').show();
if (this.inProgressFetch) { if (this.inProgressFetch) {
console.log('Multiple fetchMessage calls!'); window.log.warn('Multiple fetchMessage calls!');
} }
// Avoiding await, since we want to capture the promise and make it available via // Avoiding await, since we want to capture the promise and make it available via
@ -806,7 +806,7 @@
this.inProgressFetch = null; this.inProgressFetch = null;
}) })
.catch(error => { .catch(error => {
console.log( window.log.error(
'fetchMessages error:', 'fetchMessages error:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );
@ -1195,7 +1195,7 @@
this.showSendConfirmationDialog(e, contacts); this.showSendConfirmationDialog(e, contacts);
} catch (error) { } catch (error) {
this.focusMessageFieldAndClearDisabled(); this.focusMessageFieldAndClearDisabled();
console.log( window.log.error(
'checkUnverifiedSendMessage error:', 'checkUnverifiedSendMessage error:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );
@ -1221,7 +1221,7 @@
this.showSendConfirmationDialog(e, contacts); this.showSendConfirmationDialog(e, contacts);
} catch (error) { } catch (error) {
this.focusMessageFieldAndClearDisabled(); this.focusMessageFieldAndClearDisabled();
console.log( window.log.error(
'checkUntrustedSendMessage error:', 'checkUntrustedSendMessage error:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );
@ -1290,7 +1290,6 @@
if (message) { if (message) {
const quote = await this.model.makeQuote(this.quotedMessage); const quote = await this.model.makeQuote(this.quotedMessage);
console.log('DEBUG', { quote });
this.quote = quote; this.quote = quote;
this.focusMessageFieldAndClearDisabled(); this.focusMessageFieldAndClearDisabled();
@ -1371,7 +1370,7 @@
const attachments = await this.fileInput.getFiles(); const attachments = await this.fileInput.getFiles();
const sendDelta = Date.now() - this.sendStart; const sendDelta = Date.now() - this.sendStart;
console.log('Send pre-checks took', sendDelta, 'milliseconds'); window.log.info('Send pre-checks took', sendDelta, 'milliseconds');
this.model.sendMessage(message, attachments, this.quote); this.model.sendMessage(message, attachments, this.quote);
@ -1381,7 +1380,7 @@
this.forceUpdateMessageFieldSize(e); this.forceUpdateMessageFieldSize(e);
this.fileInput.deleteFiles(); this.fileInput.deleteFiles();
} catch (error) { } catch (error) {
console.log( window.log.error(
'Error pulling attached files before send', 'Error pulling attached files before send',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );

View file

@ -67,7 +67,7 @@
.focus() .focus()
.select(); .select();
} catch (error) { } catch (error) {
console.log( window.log.error(
'DebugLogView error:', 'DebugLogView error:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );

View file

@ -161,10 +161,11 @@
// we use the variable on this here to ensure cleanup if we're interrupted // we use the variable on this here to ensure cleanup if we're interrupted
this.previewObjectUrl = URL.createObjectURL(file); this.previewObjectUrl = URL.createObjectURL(file);
const type = 'image/png'; const type = 'image/png';
const thumbnail = await VisualAttachment.makeVideoScreenshot( const thumbnail = await VisualAttachment.makeVideoScreenshot({
this.previewObjectUrl, objectUrl: this.previewObjectUrl,
type contentType: type,
); logger: window.log,
});
URL.revokeObjectURL(this.previewObjectUrl); URL.revokeObjectURL(this.previewObjectUrl);
const data = await VisualAttachment.blobToArrayBuffer(thumbnail); const data = await VisualAttachment.blobToArrayBuffer(thumbnail);
@ -197,7 +198,7 @@
this.addThumb('images/file.svg'); this.addThumb('images/file.svg');
} }
} catch (e) { } catch (e) {
console.log( window.log.error(
`Was unable to generate thumbnail for file type ${contentType}`, `Was unable to generate thumbnail for file type ${contentType}`,
e && e.stack ? e.stack : e e && e.stack ? e.stack : e
); );
@ -297,10 +298,11 @@
const objectUrl = URL.createObjectURL(file); const objectUrl = URL.createObjectURL(file);
const arrayBuffer = await VisualAttachment.makeImageThumbnail( const arrayBuffer = await VisualAttachment.makeImageThumbnail({
size, size,
objectUrl objectUrl,
); logger: window.log,
});
URL.revokeObjectURL(objectUrl); URL.revokeObjectURL(objectUrl);
return this.readFile(arrayBuffer); return this.readFile(arrayBuffer);

View file

@ -112,7 +112,7 @@
}, },
error => { error => {
if (error.name !== 'ChooseError') { if (error.name !== 'ChooseError') {
console.log( window.log.error(
'Error choosing directory:', 'Error choosing directory:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );
@ -158,7 +158,7 @@
return this.finishLightImport(directory); return this.finishLightImport(directory);
}) })
.catch(error => { .catch(error => {
console.log( window.log.error(
'Error importing:', 'Error importing:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );

View file

@ -193,7 +193,7 @@
this.onEmpty(); this.onEmpty();
break; break;
default: default:
console.log( window.log.error(
'Whisper.InboxView::startConnectionListener:', 'Whisper.InboxView::startConnectionListener:',
'Unknown web socket status:', 'Unknown web socket status:',
status status

View file

@ -104,19 +104,22 @@
) )
.catch(this.handleDisconnect.bind(this)); .catch(this.handleDisconnect.bind(this));
}, },
handleDisconnect(e) { handleDisconnect(error) {
console.log('provisioning failed', e.stack); window.log.error(
'provisioning failed',
error && error.stack ? error.stack : error
);
this.error = e; this.error = error;
this.render(); this.render();
if (e.message === 'websocket closed') { if (error.message === 'websocket closed') {
this.trigger('disconnected'); this.trigger('disconnected');
} else if ( } else if (
e.name !== 'HTTPError' || error.name !== 'HTTPError' ||
(e.code !== CONNECTION_ERROR && e.code !== TOO_MANY_DEVICES) (error.code !== CONNECTION_ERROR && error.code !== TOO_MANY_DEVICES)
) { ) {
throw e; throw error;
} }
}, },
reconnect() { reconnect() {
@ -134,7 +137,7 @@
}, },
setProvisioningUrl(url) { setProvisioningUrl(url) {
if ($('#qr').length === 0) { if ($('#qr').length === 0) {
console.log('Did not find #qr element in the DOM!'); window.log.error('Did not find #qr element in the DOM!');
return; return;
} }
@ -186,7 +189,7 @@
} }
return tsp.removeAllData().then(finish, error => { return tsp.removeAllData().then(finish, error => {
console.log( window.log.error(
'confirmNumber: error clearing database', 'confirmNumber: error clearing database',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );

View file

@ -81,7 +81,10 @@
if (result.name === 'OutgoingIdentityKeyError') { if (result.name === 'OutgoingIdentityKeyError') {
this.onSafetyNumberChanged(); this.onSafetyNumberChanged();
} else { } else {
console.log('failed to toggle verified:', result.stack); window.log.error(
'failed to toggle verified:',
result && result.stack ? result.stack : result
);
} }
} else { } else {
const keyError = _.some( const keyError = _.some(
@ -92,7 +95,10 @@
this.onSafetyNumberChanged(); this.onSafetyNumberChanged();
} else { } else {
_.forEach(result.errors, error => { _.forEach(result.errors, error => {
console.log('failed to toggle verified:', error.stack); window.log.error(
'failed to toggle verified:',
error && error.stack ? error.stack : error
);
}); });
} }
} }

View file

@ -51,7 +51,7 @@
if (this.context) { if (this.context) {
this.context.close().then(() => { this.context.close().then(() => {
console.log('audio context closed'); window.log.info('audio context closed');
}); });
} }
this.context = null; this.context = null;
@ -97,10 +97,12 @@
this.close(); this.close();
if (error && error.name === 'PermissionDeniedError') { if (error && error.name === 'PermissionDeniedError') {
console.log('RecorderView.onError: Microphone access is not allowed!'); window.log.warn(
'RecorderView.onError: Microphone access is not allowed!'
);
window.showPermissionsPopup(); window.showPermissionsPopup();
} else { } else {
console.log( window.log.error(
'RecorderView.onError:', 'RecorderView.onError:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );

View file

@ -23,7 +23,7 @@
change(e) { change(e) {
const value = e.target.checked; const value = e.target.checked;
this.setFn(value); this.setFn(value);
console.log(this.name, 'changed to', value); window.log.info(this.name, 'changed to', value);
}, },
populate() { populate() {
this.$('input').prop('checked', !!this.value); this.$('input').prop('checked', !!this.value);
@ -42,7 +42,7 @@
change(e) { change(e) {
this.value = e.target.checked; this.value = e.target.checked;
this.setFn(this.value); this.setFn(this.value);
console.log('media-permissions changed to', this.value); window.log.info('media-permissions changed to', this.value);
}, },
populate() { populate() {
this.$('input').prop('checked', Boolean(this.value)); this.$('input').prop('checked', Boolean(this.value));
@ -62,7 +62,7 @@
change(e) { change(e) {
const value = this.$(e.target).val(); const value = this.$(e.target).val();
this.setFn(value); this.setFn(value);
console.log(this.name, 'changed to', value); window.log.info(this.name, 'changed to', value);
}, },
populate() { populate() {
this.$(`#${this.name}-${this.value}`).attr('checked', 'checked'); this.$(`#${this.name}-${this.value}`).attr('checked', 'checked');
@ -177,12 +177,12 @@
onsuccess() { onsuccess() {
window.setLastSyncTime(Date.now()); window.setLastSyncTime(Date.now());
this.lastSyncTime = Date.now(); this.lastSyncTime = Date.now();
console.log('sync successful'); window.log.info('sync successful');
this.enable(); this.enable();
this.render(); this.render();
}, },
ontimeout() { ontimeout() {
console.log('sync timed out'); window.log.error('sync timed out');
this.$('.synced_at').hide(); this.$('.synced_at').hide();
this.$('.sync_failed').show(); this.$('.sync_failed').show();
this.enable(); this.enable();
@ -190,7 +190,7 @@
async sync() { async sync() {
this.$('.sync_failed').hide(); this.$('.sync_failed').hide();
if (window.initialData.isPrimary) { if (window.initialData.isPrimary) {
console.log('Tried to sync from device 1'); window.log.warn('Tried to sync from device 1');
return; return;
} }

View file

@ -46,7 +46,7 @@
.catch(this.log.bind(this)); .catch(this.log.bind(this));
}, },
log(s) { log(s) {
console.log(s); window.log.info(s);
this.$('#status').text(s); this.$('#status').text(s);
}, },
validateCode() { validateCode() {

View file

@ -78,14 +78,14 @@
return provisioningCipher.getPublicKey().then(function(pubKey) { return provisioningCipher.getPublicKey().then(function(pubKey) {
return new Promise(function(resolve, reject) { return new Promise(function(resolve, reject) {
var socket = getSocket(); var socket = getSocket();
socket.onclose = function(e) { socket.onclose = function(event) {
console.log('provisioning socket closed', e.code); window.log.info('provisioning socket closed. Code:', event.code);
if (!gotProvisionEnvelope) { if (!gotProvisionEnvelope) {
reject(new Error('websocket closed')); reject(new Error('websocket closed'));
} }
}; };
socket.onopen = function(e) { socket.onopen = function(e) {
console.log('provisioning socket open'); window.log.info('provisioning socket open');
}; };
var wsr = new WebSocketResource(socket, { var wsr = new WebSocketResource(socket, {
keepalive: { path: '/v1/keepalive/provisioning' }, keepalive: { path: '/v1/keepalive/provisioning' },
@ -150,7 +150,7 @@
}) })
); );
} else { } else {
console.log('Unknown websocket message', request.path); window.log.error('Unknown websocket message', request.path);
} }
}, },
}); });
@ -164,7 +164,7 @@
return this.queueTask( return this.queueTask(
function() { function() {
return this.server.getMyKeys().then(function(preKeyCount) { return this.server.getMyKeys().then(function(preKeyCount) {
console.log('prekey count ' + preKeyCount); window.log.info('prekey count ' + preKeyCount);
if (preKeyCount < 10) { if (preKeyCount < 10) {
return generateKeys().then(registerKeys); return generateKeys().then(registerKeys);
} }
@ -196,7 +196,7 @@
); );
}, },
function(error) { function(error) {
console.log( window.log.error(
'Failed to get identity key. Canceling key rotation.' 'Failed to get identity key. Canceling key rotation.'
); );
} }
@ -205,7 +205,7 @@
if (!res) { if (!res) {
return; return;
} }
console.log('Saving new signed prekey', res.keyId); window.log.info('Saving new signed prekey', res.keyId);
return Promise.all([ return Promise.all([
textsecure.storage.put('signedKeyId', signedKeyId + 1), textsecure.storage.put('signedKeyId', signedKeyId + 1),
store.storeSignedPreKey(res.keyId, res.keyPair), store.storeSignedPreKey(res.keyId, res.keyPair),
@ -217,7 +217,7 @@
]) ])
.then(function() { .then(function() {
var confirmed = true; var confirmed = true;
console.log('Confirming new signed prekey', res.keyId); window.log.info('Confirming new signed prekey', res.keyId);
return Promise.all([ return Promise.all([
textsecure.storage.remove('signedKeyRotationRejected'), textsecure.storage.remove('signedKeyRotationRejected'),
store.storeSignedPreKey(res.keyId, res.keyPair, confirmed), store.storeSignedPreKey(res.keyId, res.keyPair, confirmed),
@ -228,7 +228,7 @@
}); });
}) })
.catch(function(e) { .catch(function(e) {
console.log( window.log.error(
'rotateSignedPrekey error:', 'rotateSignedPrekey error:',
e && e.stack ? e.stack : e e && e.stack ? e.stack : e
); );
@ -242,7 +242,10 @@
var rejections = var rejections =
1 + textsecure.storage.get('signedKeyRotationRejected', 0); 1 + textsecure.storage.get('signedKeyRotationRejected', 0);
textsecure.storage.put('signedKeyRotationRejected', rejections); textsecure.storage.put('signedKeyRotationRejected', rejections);
console.log('Signed key rotation rejected count:', rejections); window.log.error(
'Signed key rotation rejected count:',
rejections
);
} else { } else {
throw e; throw e;
} }
@ -274,9 +277,9 @@
var recent = allKeys[0] ? allKeys[0].keyId : 'none'; var recent = allKeys[0] ? allKeys[0].keyId : 'none';
var recentConfirmed = confirmed[0] ? confirmed[0].keyId : 'none'; var recentConfirmed = confirmed[0] ? confirmed[0].keyId : 'none';
console.log('Most recent signed key: ' + recent); window.log.info('Most recent signed key: ' + recent);
console.log('Most recent confirmed signed key: ' + recentConfirmed); window.log.info('Most recent confirmed signed key: ' + recentConfirmed);
console.log( window.log.info(
'Total signed key count:', 'Total signed key count:',
allKeys.length, allKeys.length,
'-', '-',
@ -294,7 +297,7 @@
var created_at = key.created_at || 0; var created_at = key.created_at || 0;
var age = Date.now() - created_at; var age = Date.now() - created_at;
if (age > ARCHIVE_AGE) { if (age > ARCHIVE_AGE) {
console.log( window.log.info(
'Removing confirmed signed prekey:', 'Removing confirmed signed prekey:',
key.keyId, key.keyId,
'with timestamp:', 'with timestamp:',
@ -317,7 +320,7 @@
var created_at = key.created_at || 0; var created_at = key.created_at || 0;
var age = Date.now() - created_at; var age = Date.now() - created_at;
if (age > ARCHIVE_AGE) { if (age > ARCHIVE_AGE) {
console.log( window.log.info(
'Removing unconfirmed signed prekey:', 'Removing unconfirmed signed prekey:',
key.keyId, key.keyId,
'with timestamp:', 'with timestamp:',
@ -355,17 +358,17 @@
) )
.then(function(response) { .then(function(response) {
if (previousNumber && previousNumber !== number) { if (previousNumber && previousNumber !== number) {
console.log( window.log.warn(
'New number is different from old number; deleting all previous data' 'New number is different from old number; deleting all previous data'
); );
return textsecure.storage.protocol.removeAllData().then( return textsecure.storage.protocol.removeAllData().then(
function() { function() {
console.log('Successfully deleted previous data'); window.log.info('Successfully deleted previous data');
return response; return response;
}, },
function(error) { function(error) {
console.log( window.log.error(
'Something went wrong deleting data from previous number', 'Something went wrong deleting data from previous number',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );
@ -432,7 +435,7 @@
clearSessionsAndPreKeys: function() { clearSessionsAndPreKeys: function() {
var store = textsecure.storage.protocol; var store = textsecure.storage.protocol;
console.log('clearing all sessions, prekeys, and signed prekeys'); window.log.info('clearing all sessions, prekeys, and signed prekeys');
return Promise.all([ return Promise.all([
store.clearPreKeyStore(), store.clearPreKeyStore(),
store.clearSignedPreKeysStore(), store.clearSignedPreKeysStore(),
@ -445,7 +448,7 @@
var key = keys.signedPreKey; var key = keys.signedPreKey;
var confirmed = true; var confirmed = true;
console.log('confirmKeys: confirming key', key.keyId); window.log.info('confirmKeys: confirming key', key.keyId);
return store.storeSignedPreKey(key.keyId, key.keyPair, confirmed); return store.storeSignedPreKey(key.keyId, key.keyPair, confirmed);
}, },
generateKeys: function(count, progressCallback) { generateKeys: function(count, progressCallback) {
@ -513,7 +516,7 @@
); );
}, },
registrationDone: function() { registrationDone: function() {
console.log('registration done'); window.log.info('registration done');
this.dispatchEvent(new Event('registration')); this.dispatchEvent(new Event('registration'));
}, },
}); });

View file

@ -35,8 +35,11 @@ ProtoParser.prototype = {
} }
return proto; return proto;
} catch (e) { } catch (error) {
console.log(e); window.log.error(
'ProtoParser.next error:',
error && error.stack ? error.stack : error
);
} }
}, },
}; };

View file

@ -21,7 +21,7 @@
localStorage.removeItem(e.data.key); localStorage.removeItem(e.data.key);
break; break;
case 'done': case 'done':
console.log(e.data.keys); console.error(e.data.keys);
} }
}; };
*/ */

View file

@ -86,7 +86,7 @@ MessageReceiver.prototype.extend({
} }
}, },
close() { close() {
console.log('MessageReceiver.close()'); window.log.info('MessageReceiver.close()');
this.calledClose = true; this.calledClose = true;
// Our WebSocketResource instance will close the socket and emit a 'close' event // Our WebSocketResource instance will close the socket and emit a 'close' event
@ -98,16 +98,16 @@ MessageReceiver.prototype.extend({
return this.drain(); return this.drain();
}, },
onopen() { onopen() {
console.log('websocket open'); window.log.info('websocket open');
}, },
onerror() { onerror() {
console.log('websocket error'); window.log.error('websocket error');
}, },
dispatchAndWait(event) { dispatchAndWait(event) {
return Promise.all(this.dispatchEvent(event)); return Promise.all(this.dispatchEvent(event));
}, },
onclose(ev) { onclose(ev) {
console.log( window.log.info(
'websocket closed', 'websocket closed',
ev.code, ev.code,
ev.reason || '', ev.reason || '',
@ -143,7 +143,7 @@ MessageReceiver.prototype.extend({
// TODO: handle different types of requests. // TODO: handle different types of requests.
if (request.path !== '/api/v1/message') { if (request.path !== '/api/v1/message') {
console.log('got request', request.verb, request.path); window.log.info('got request', request.verb, request.path);
request.respond(200, 'OK'); request.respond(200, 'OK');
if (request.verb === 'PUT' && request.path === '/api/v1/queue/empty') { if (request.verb === 'PUT' && request.path === '/api/v1/queue/empty') {
@ -170,7 +170,7 @@ MessageReceiver.prototype.extend({
this.queueEnvelope(envelope); this.queueEnvelope(envelope);
}, },
error => { error => {
console.log( window.log.error(
'handleRequest error trying to add message to cache:', 'handleRequest error trying to add message to cache:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );
@ -179,7 +179,7 @@ MessageReceiver.prototype.extend({
}) })
.catch(e => { .catch(e => {
request.respond(500, 'Bad encrypted websocket message'); request.respond(500, 'Bad encrypted websocket message');
console.log( window.log.error(
'Error handling incoming message:', 'Error handling incoming message:',
e && e.stack ? e.stack : e e && e.stack ? e.stack : e
); );
@ -215,7 +215,7 @@ MessageReceiver.prototype.extend({
this.incoming = []; this.incoming = [];
const dispatchEmpty = () => { const dispatchEmpty = () => {
console.log("MessageReceiver: emitting 'empty' event"); window.log.info("MessageReceiver: emitting 'empty' event");
const ev = new Event('empty'); const ev = new Event('empty');
return this.dispatchAndWait(ev); return this.dispatchAndWait(ev);
}; };
@ -238,7 +238,7 @@ MessageReceiver.prototype.extend({
const queueDispatch = () => const queueDispatch = () =>
this.addToQueue(() => { this.addToQueue(() => {
console.log('drained'); window.log.info('drained');
}); });
// This promise will resolve when there are no more messages to be processed. // This promise will resolve when there are no more messages to be processed.
@ -282,7 +282,7 @@ MessageReceiver.prototype.extend({
this.queueEnvelope(envelope); this.queueEnvelope(envelope);
} }
} catch (error) { } catch (error) {
console.log('queueCached error handling item', item.id); window.log.error('queueCached error handling item', item.id);
} }
}, },
getEnvelopeId(envelope) { getEnvelopeId(envelope) {
@ -295,15 +295,22 @@ MessageReceiver.prototype.extend({
return new dcodeIO.ByteBuffer.wrap(string, 'binary').toArrayBuffer(); return new dcodeIO.ByteBuffer.wrap(string, 'binary').toArrayBuffer();
}, },
getAllFromCache() { getAllFromCache() {
console.log('getAllFromCache'); window.log.info('getAllFromCache');
return textsecure.storage.unprocessed.getAll().then(items => { return textsecure.storage.unprocessed.getAll().then(items => {
console.log('getAllFromCache loaded', items.length, 'saved envelopes'); window.log.info(
'getAllFromCache loaded',
items.length,
'saved envelopes'
);
return Promise.all( return Promise.all(
_.map(items, item => { _.map(items, item => {
const attempts = 1 + (item.attempts || 0); const attempts = 1 + (item.attempts || 0);
if (attempts >= 5) { if (attempts >= 5) {
console.log('getAllFromCache final attempt for envelope', item.id); window.log.warn(
'getAllFromCache final attempt for envelope',
item.id
);
return textsecure.storage.unprocessed.remove(item.id); return textsecure.storage.unprocessed.remove(item.id);
} }
return textsecure.storage.unprocessed.update(item.id, { attempts }); return textsecure.storage.unprocessed.update(item.id, { attempts });
@ -311,7 +318,7 @@ MessageReceiver.prototype.extend({
).then( ).then(
() => items, () => items,
error => { error => {
console.log( window.log.error(
'getAllFromCache error updating items after load:', 'getAllFromCache error updating items after load:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );
@ -343,7 +350,7 @@ MessageReceiver.prototype.extend({
}, },
queueDecryptedEnvelope(envelope, plaintext) { queueDecryptedEnvelope(envelope, plaintext) {
const id = this.getEnvelopeId(envelope); const id = this.getEnvelopeId(envelope);
console.log('queueing decrypted envelope', id); window.log.info('queueing decrypted envelope', id);
const task = this.handleDecryptedEnvelope.bind(this, envelope, plaintext); const task = this.handleDecryptedEnvelope.bind(this, envelope, plaintext);
const taskWithTimeout = textsecure.createTaskWithTimeout( const taskWithTimeout = textsecure.createTaskWithTimeout(
@ -353,7 +360,7 @@ MessageReceiver.prototype.extend({
const promise = this.addToQueue(taskWithTimeout); const promise = this.addToQueue(taskWithTimeout);
return promise.catch(error => { return promise.catch(error => {
console.log( window.log.error(
'queueDecryptedEnvelope error handling envelope', 'queueDecryptedEnvelope error handling envelope',
id, id,
':', ':',
@ -363,7 +370,7 @@ MessageReceiver.prototype.extend({
}, },
queueEnvelope(envelope) { queueEnvelope(envelope) {
const id = this.getEnvelopeId(envelope); const id = this.getEnvelopeId(envelope);
console.log('queueing envelope', id); window.log.info('queueing envelope', id);
const task = this.handleEnvelope.bind(this, envelope); const task = this.handleEnvelope.bind(this, envelope);
const taskWithTimeout = textsecure.createTaskWithTimeout( const taskWithTimeout = textsecure.createTaskWithTimeout(
@ -373,7 +380,7 @@ MessageReceiver.prototype.extend({
const promise = this.addToQueue(taskWithTimeout); const promise = this.addToQueue(taskWithTimeout);
return promise.catch(error => { return promise.catch(error => {
console.log( window.log.error(
'queueEnvelope error handling envelope', 'queueEnvelope error handling envelope',
id, id,
':', ':',
@ -470,13 +477,13 @@ MessageReceiver.prototype.extend({
switch (envelope.type) { switch (envelope.type) {
case textsecure.protobuf.Envelope.Type.CIPHERTEXT: case textsecure.protobuf.Envelope.Type.CIPHERTEXT:
console.log('message from', this.getEnvelopeId(envelope)); window.log.info('message from', this.getEnvelopeId(envelope));
promise = sessionCipher promise = sessionCipher
.decryptWhisperMessage(ciphertext) .decryptWhisperMessage(ciphertext)
.then(this.unpad); .then(this.unpad);
break; break;
case textsecure.protobuf.Envelope.Type.PREKEY_BUNDLE: case textsecure.protobuf.Envelope.Type.PREKEY_BUNDLE:
console.log('prekey message from', this.getEnvelopeId(envelope)); window.log.info('prekey message from', this.getEnvelopeId(envelope));
promise = this.decryptPreKeyWhisperMessage( promise = this.decryptPreKeyWhisperMessage(
ciphertext, ciphertext,
sessionCipher, sessionCipher,
@ -492,7 +499,7 @@ MessageReceiver.prototype.extend({
this.updateCache(envelope, plaintext).then( this.updateCache(envelope, plaintext).then(
() => plaintext, () => plaintext,
error => { error => {
console.log( window.log.error(
'decrypt failed to save decrypted message contents to cache:', 'decrypt failed to save decrypted message contents to cache:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );
@ -571,7 +578,7 @@ MessageReceiver.prototype.extend({
); );
}, },
handleDataMessage(envelope, msg) { handleDataMessage(envelope, msg) {
console.log('data message from', this.getEnvelopeId(envelope)); window.log.info('data message from', this.getEnvelopeId(envelope));
let p = Promise.resolve(); let p = Promise.resolve();
// eslint-disable-next-line no-bitwise // eslint-disable-next-line no-bitwise
if (msg.flags & textsecure.protobuf.DataMessage.Flags.END_SESSION) { if (msg.flags & textsecure.protobuf.DataMessage.Flags.END_SESSION) {
@ -623,7 +630,7 @@ MessageReceiver.prototype.extend({
throw new Error('Unsupported content message'); throw new Error('Unsupported content message');
}, },
handleCallMessage(envelope) { handleCallMessage(envelope) {
console.log('call message from', this.getEnvelopeId(envelope)); window.log.info('call message from', this.getEnvelopeId(envelope));
this.removeFromCache(envelope); this.removeFromCache(envelope);
}, },
handleReceiptMessage(envelope, receiptMessage) { handleReceiptMessage(envelope, receiptMessage) {
@ -658,7 +665,7 @@ MessageReceiver.prototype.extend({
return Promise.all(results); return Promise.all(results);
}, },
handleNullMessage(envelope) { handleNullMessage(envelope) {
console.log('null message from', this.getEnvelopeId(envelope)); window.log.info('null message from', this.getEnvelopeId(envelope));
this.removeFromCache(envelope); this.removeFromCache(envelope);
}, },
handleSyncMessage(envelope, syncMessage) { handleSyncMessage(envelope, syncMessage) {
@ -675,7 +682,7 @@ MessageReceiver.prototype.extend({
? `group(${sentMessage.message.group.id.toBinary()})` ? `group(${sentMessage.message.group.id.toBinary()})`
: sentMessage.destination; : sentMessage.destination;
console.log( window.log.info(
'sent message to', 'sent message to',
to, to,
sentMessage.timestamp.toNumber(), sentMessage.timestamp.toNumber(),
@ -696,10 +703,10 @@ MessageReceiver.prototype.extend({
} else if (syncMessage.blocked) { } else if (syncMessage.blocked) {
return this.handleBlocked(envelope, syncMessage.blocked); return this.handleBlocked(envelope, syncMessage.blocked);
} else if (syncMessage.request) { } else if (syncMessage.request) {
console.log('Got SyncMessage Request'); window.log.info('Got SyncMessage Request');
return this.removeFromCache(envelope); return this.removeFromCache(envelope);
} else if (syncMessage.read && syncMessage.read.length) { } else if (syncMessage.read && syncMessage.read.length) {
console.log('read messages from', this.getEnvelopeId(envelope)); window.log.info('read messages from', this.getEnvelopeId(envelope));
return this.handleRead(envelope, syncMessage.read); return this.handleRead(envelope, syncMessage.read);
} else if (syncMessage.verified) { } else if (syncMessage.verified) {
return this.handleVerified(envelope, syncMessage.verified); return this.handleVerified(envelope, syncMessage.verified);
@ -741,7 +748,7 @@ MessageReceiver.prototype.extend({
return Promise.all(results); return Promise.all(results);
}, },
handleContacts(envelope, contacts) { handleContacts(envelope, contacts) {
console.log('contact sync'); window.log.info('contact sync');
const attachmentPointer = contacts.blob; const attachmentPointer = contacts.blob;
return this.handleAttachment(attachmentPointer).then(() => { return this.handleAttachment(attachmentPointer).then(() => {
const results = []; const results = [];
@ -764,7 +771,7 @@ MessageReceiver.prototype.extend({
}); });
}, },
handleGroups(envelope, groups) { handleGroups(envelope, groups) {
console.log('group sync'); window.log.info('group sync');
const attachmentPointer = groups.blob; const attachmentPointer = groups.blob;
return this.handleAttachment(attachmentPointer).then(() => { return this.handleAttachment(attachmentPointer).then(() => {
const groupBuffer = new GroupBuffer(attachmentPointer.data); const groupBuffer = new GroupBuffer(attachmentPointer.data);
@ -802,7 +809,7 @@ MessageReceiver.prototype.extend({
return this.dispatchAndWait(ev); return this.dispatchAndWait(ev);
}) })
.catch(e => { .catch(e => {
console.log('error processing group', e); window.log.error('error processing group', e);
}); });
groupDetails = groupBuffer.next(); groupDetails = groupBuffer.next();
promises.push(promise); promises.push(promise);
@ -816,7 +823,7 @@ MessageReceiver.prototype.extend({
}); });
}, },
handleBlocked(envelope, blocked) { handleBlocked(envelope, blocked) {
console.log('Setting these numbers as blocked:', blocked.numbers); window.log.info('Setting these numbers as blocked:', blocked.numbers);
textsecure.storage.put('blocked', blocked.numbers); textsecure.storage.put('blocked', blocked.numbers);
}, },
isBlocked(number) { isBlocked(number) {
@ -900,7 +907,7 @@ MessageReceiver.prototype.extend({
address, address,
options options
); );
console.log('retrying prekey whisper message'); window.log.info('retrying prekey whisper message');
return this.decryptPreKeyWhisperMessage( return this.decryptPreKeyWhisperMessage(
ciphertext, ciphertext,
sessionCipher, sessionCipher,
@ -946,7 +953,7 @@ MessageReceiver.prototype.extend({
}); });
}, },
async handleEndSession(number) { async handleEndSession(number) {
console.log('got end session'); window.log.info('got end session');
const deviceIds = await textsecure.storage.protocol.getDeviceIds(number); const deviceIds = await textsecure.storage.protocol.getDeviceIds(number);
return Promise.all( return Promise.all(
@ -957,7 +964,7 @@ MessageReceiver.prototype.extend({
address address
); );
console.log('deleting sessions for', address.toString()); window.log.info('deleting sessions for', address.toString());
return sessionCipher.deleteAllSessionsForDevice(); return sessionCipher.deleteAllSessionsForDevice();
}) })
); );
@ -1016,7 +1023,7 @@ MessageReceiver.prototype.extend({
textsecure.protobuf.GroupContext.Type.UPDATE textsecure.protobuf.GroupContext.Type.UPDATE
) { ) {
decrypted.group.members = [source]; decrypted.group.members = [source];
console.log('Got message for unknown group'); window.log.warn('Got message for unknown group');
} }
return textsecure.storage.groups.createNewGroup( return textsecure.storage.groups.createNewGroup(
decrypted.group.members, decrypted.group.members,
@ -1027,7 +1034,7 @@ MessageReceiver.prototype.extend({
if (fromIndex < 0) { if (fromIndex < 0) {
// TODO: This could be indication of a race... // TODO: This could be indication of a race...
console.log( window.log.warn(
'Sender was not a member of the group they were sending from' 'Sender was not a member of the group they were sending from'
); );
} }
@ -1082,7 +1089,7 @@ MessageReceiver.prototype.extend({
// this message entirely, like we do for full attachments. // this message entirely, like we do for full attachments.
promises.push( promises.push(
this.handleAttachment(avatar.avatar).catch(error => { this.handleAttachment(avatar.avatar).catch(error => {
console.log( window.log.error(
'Problem loading avatar for contact', 'Problem loading avatar for contact',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );
@ -1108,7 +1115,7 @@ MessageReceiver.prototype.extend({
// this message entirely, like we do for full attachments. // this message entirely, like we do for full attachments.
promises.push( promises.push(
this.handleAttachment(thumbnail).catch(error => { this.handleAttachment(thumbnail).catch(error => {
console.log( window.log.error(
'Problem loading thumbnail for quote', 'Problem loading thumbnail for quote',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );

View file

@ -85,7 +85,7 @@ OutgoingMessage.prototype = {
address address
); );
if (device.registrationId === 0) { if (device.registrationId === 0) {
console.log('device registrationId 0!'); window.log.info('device registrationId 0!');
} }
return builder.processPreKey(device).catch( return builder.processPreKey(device).catch(
function(error) { function(error) {
@ -267,7 +267,7 @@ OutgoingMessage.prototype = {
} else if (error.message === 'Identity key changed') { } else if (error.message === 'Identity key changed') {
error.timestamp = this.timestamp; error.timestamp = this.timestamp;
error.originalMessage = this.message.toArrayBuffer(); error.originalMessage = this.message.toArrayBuffer();
console.log( window.log.error(
'Got "key changed" error from encrypt - no identityKey for application layer', 'Got "key changed" error from encrypt - no identityKey for application layer',
number, number,
deviceIds deviceIds

View file

@ -15,7 +15,7 @@
window.PROTO_ROOT + window.PROTO_ROOT +
') ' + ') ' +
(error && error.stack ? error.stack : error); (error && error.stack ? error.stack : error);
console.log(text); window.log.error(text);
throw error; throw error;
} }
var protos = result.build('signalservice'); var protos = result.build('signalservice');
@ -26,7 +26,7 @@
' (root: ' + ' (root: ' +
window.PROTO_ROOT + window.PROTO_ROOT +
')'; ')';
console.log(text); window.log.error(text);
throw new Error(text); throw new Error(text);
} }
for (var protoName in protos) { for (var protoName in protos) {

View file

@ -663,14 +663,14 @@ MessageSender.prototype = {
}, },
resetSession: function(number, timestamp) { resetSession: function(number, timestamp) {
console.log('resetting secure session'); window.log.info('resetting secure session');
var proto = new textsecure.protobuf.DataMessage(); var proto = new textsecure.protobuf.DataMessage();
proto.body = 'TERMINATE'; proto.body = 'TERMINATE';
proto.flags = textsecure.protobuf.DataMessage.Flags.END_SESSION; proto.flags = textsecure.protobuf.DataMessage.Flags.END_SESSION;
var logError = function(prefix) { var logError = function(prefix) {
return function(error) { return function(error) {
console.log(prefix, error && error.stack ? error.stack : error); window.log.error(prefix, error && error.stack ? error.stack : error);
throw error; throw error;
}; };
}; };
@ -684,7 +684,7 @@ MessageSender.prototype = {
number, number,
deviceId deviceId
); );
console.log('deleting sessions for', address.toString()); window.log.info('deleting sessions for', address.toString());
var sessionCipher = new libsignal.SessionCipher( var sessionCipher = new libsignal.SessionCipher(
textsecure.storage.protocol, textsecure.storage.protocol,
address address
@ -699,7 +699,7 @@ MessageSender.prototype = {
.catch(logError('resetSession/deleteAllSessions1 error:')) .catch(logError('resetSession/deleteAllSessions1 error:'))
.then( .then(
function() { function() {
console.log( window.log.info(
'finished closing local sessions, now sending to contact' 'finished closing local sessions, now sending to contact'
); );
return this.sendIndividualProto(number, proto, timestamp).catch( return this.sendIndividualProto(number, proto, timestamp).catch(

View file

@ -19,15 +19,15 @@
this.ongroup = this.onGroupSyncComplete.bind(this); this.ongroup = this.onGroupSyncComplete.bind(this);
receiver.addEventListener('groupsync', this.ongroup); receiver.addEventListener('groupsync', this.ongroup);
console.log('SyncRequest created. Sending contact sync message...'); window.log.info('SyncRequest created. Sending contact sync message...');
sender sender
.sendRequestContactSyncMessage() .sendRequestContactSyncMessage()
.then(function() { .then(function() {
console.log('SyncRequest now sending group sync messsage...'); window.log.info('SyncRequest now sending group sync messsage...');
return sender.sendRequestGroupSyncMessage(); return sender.sendRequestGroupSyncMessage();
}) })
.catch(function(error) { .catch(function(error) {
console.log( window.log.error(
'SyncRequest error:', 'SyncRequest error:',
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );

View file

@ -17,7 +17,7 @@
' task did not complete in time. Calling stack: ' + ' task did not complete in time. Calling stack: ' +
errorForStack.stack; errorForStack.stack;
console.log(message); window.log.error(message);
return reject(new Error(message)); return reject(new Error(message));
} }
}.bind(this), }.bind(this),
@ -31,7 +31,7 @@
clearTimeout(localTimer); clearTimeout(localTimer);
} }
} catch (error) { } catch (error) {
console.log( window.log.error(
id || '', id || '',
'task ran into problem canceling timer. Calling stack:', 'task ran into problem canceling timer. Calling stack:',
errorForStack.stack errorForStack.stack

View file

@ -62,7 +62,6 @@ describe('MessageReceiver', function() {
mac, mac,
]); ]);
websocketmessage.request.body = message.toArrayBuffer(); websocketmessage.request.body = message.toArrayBuffer();
console.log(new Uint8Array(message.toArrayBuffer()));
done(); done();
}); });
}); });

View file

@ -168,7 +168,7 @@
return; return;
} }
console.log('WebSocketResource.close()'); window.log.info('WebSocketResource.close()');
if (!code) { if (!code) {
code = 3000; code = 3000;
} }
@ -189,7 +189,7 @@
} }
this.closed = true; this.closed = true;
console.log('Dispatching our own socket close event'); window.log.warn('Dispatching our own socket close event');
var ev = new Event('close'); var ev = new Event('close');
ev.code = code; ev.code = code;
ev.reason = reason; ev.reason = reason;
@ -241,7 +241,7 @@
} else { } else {
this.reset(); this.reset();
} }
console.log('Sending a keepalive message'); window.log.info('Sending a keepalive message');
this.wsr.sendRequest({ this.wsr.sendRequest({
verb: 'GET', verb: 'GET',
path: this.path, path: this.path,

View file

@ -1,3 +1,5 @@
/* eslint-disable no-console */
const path = require('path'); const path = require('path');
const url = require('url'); const url = require('url');
const os = require('os'); const os = require('os');
@ -24,7 +26,7 @@ const packageJson = require('./package.json');
const Attachments = require('./app/attachments'); const Attachments = require('./app/attachments');
const autoUpdate = require('./app/auto_update'); const autoUpdate = require('./app/auto_update');
const createTrayIcon = require('./app/tray_icon'); const createTrayIcon = require('./app/tray_icon');
const GlobalErrors = require('./js/modules/global_errors'); const GlobalErrors = require('./app/global_errors');
const logging = require('./app/logging'); const logging = require('./app/logging');
const windowState = require('./app/window_state'); const windowState = require('./app/window_state');
const { createTemplate } = require('./app/menu'); const { createTemplate } = require('./app/menu');

View file

@ -1,8 +1,6 @@
/* global Whisper: false */ /* global Whisper: false */
/* global window: false */ /* global window: false */
console.log('preload');
const electron = require('electron'); const electron = require('electron');
const semver = require('semver'); const semver = require('semver');
@ -34,7 +32,7 @@ window.isBeforeVersion = (toCheck, baseVersion) => {
try { try {
return semver.lt(toCheck, baseVersion); return semver.lt(toCheck, baseVersion);
} catch (error) { } catch (error) {
console.log( window.log.error(
`isBeforeVersion error: toCheck: ${toCheck}, baseVersion: ${baseVersion}`, `isBeforeVersion error: toCheck: ${toCheck}, baseVersion: ${baseVersion}`,
error && error.stack ? error.stack : error error && error.stack ? error.stack : error
); );
@ -55,11 +53,11 @@ window.open = () => null;
window.eval = global.eval = () => null; window.eval = global.eval = () => null;
window.drawAttention = () => { window.drawAttention = () => {
console.log('draw attention'); window.log.info('draw attention');
ipc.send('draw-attention'); ipc.send('draw-attention');
}; };
window.showWindow = () => { window.showWindow = () => {
console.log('show window'); window.log.info('show window');
ipc.send('show-window'); ipc.send('show-window');
}; };
@ -70,7 +68,7 @@ window.setMenuBarVisibility = visibility =>
ipc.send('set-menu-bar-visibility', visibility); ipc.send('set-menu-bar-visibility', visibility);
window.restart = () => { window.restart = () => {
console.log('restart'); window.log.info('restart');
ipc.send('restart'); ipc.send('restart');
}; };
@ -188,7 +186,7 @@ window.removeSetupMenuItems = () => ipc.send('remove-setup-menu-items');
require('./js/logging'); require('./js/logging');
if (config.proxyUrl) { if (config.proxyUrl) {
console.log('using proxy url', config.proxyUrl); window.log.info('Using provided proxy url');
} }
window.nodeSetImmediate = setImmediate; window.nodeSetImmediate = setImmediate;
@ -241,6 +239,7 @@ window.Signal = Signal.setup({
Attachments, Attachments,
userDataPath: app.getPath('userData'), userDataPath: app.getPath('userData'),
getRegionCode: () => window.storage.get('regionCode'), getRegionCode: () => window.storage.get('regionCode'),
logger: window.log,
}); });
// Pulling these in separately since they access filesystem, electron // Pulling these in separately since they access filesystem, electron

View file

@ -1,3 +1,5 @@
/* eslint-disable no-console */
const fs = require('fs'); const fs = require('fs');
const _ = require('lodash'); const _ = require('lodash');

View file

@ -1,3 +1,5 @@
/* eslint-disable no-console */
const fs = require('fs'); const fs = require('fs');
const _ = require('lodash'); const _ = require('lodash');

View file

@ -72,6 +72,7 @@ async function clearDatabase() {
await Signal.Migrations.Migrations0DatabaseWithAttachmentData.run({ await Signal.Migrations.Migrations0DatabaseWithAttachmentData.run({
Backbone, Backbone,
databaseName: Whisper.Database.id, databaseName: Whisper.Database.id,
logger: window.log,
}); });
const convos = new Whisper.ConversationCollection(); const convos = new Whisper.ConversationCollection();

View file

@ -100,7 +100,12 @@ describe('Attachment', () => {
size: 1111, size: 1111,
}; };
const actual = Attachment.removeSchemaVersion(input); const actual = Attachment.removeSchemaVersion({
attachment: input,
logger: {
error: () => null,
},
});
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
}); });
@ -129,6 +134,9 @@ describe('Attachment', () => {
const actual = await Attachment.migrateDataToFileSystem(input, { const actual = await Attachment.migrateDataToFileSystem(input, {
writeNewAttachmentData, writeNewAttachmentData,
logger: {
warn: () => null,
},
}); });
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
@ -150,6 +158,9 @@ describe('Attachment', () => {
const actual = await Attachment.migrateDataToFileSystem(input, { const actual = await Attachment.migrateDataToFileSystem(input, {
writeNewAttachmentData, writeNewAttachmentData,
logger: {
warn: () => null,
},
}); });
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
@ -167,6 +178,9 @@ describe('Attachment', () => {
try { try {
await Attachment.migrateDataToFileSystem(input, { await Attachment.migrateDataToFileSystem(input, {
writeNewAttachmentData, writeNewAttachmentData,
logger: {
warn: () => null,
},
}); });
} catch (error) { } catch (error) {
assert.strictEqual( assert.strictEqual(

View file

@ -8,6 +8,9 @@ const {
describe('Contact', () => { describe('Contact', () => {
const NUMBER = '+12025550099'; const NUMBER = '+12025550099';
const logger = {
error: () => null,
};
describe('parseAndWriteAvatar', () => { describe('parseAndWriteAvatar', () => {
it('handles message with no avatar in contact', async () => { it('handles message with no avatar in contact', async () => {
@ -32,7 +35,10 @@ describe('Contact', () => {
}, },
], ],
}; };
const result = await upgradeVersion(message.contact[0], { message }); const result = await upgradeVersion(message.contact[0], {
message,
logger,
});
assert.deepEqual(result, message.contact[0]); assert.deepEqual(result, message.contact[0]);
}); });
@ -72,6 +78,7 @@ describe('Contact', () => {
const result = await upgradeVersion(message.contact[0], { const result = await upgradeVersion(message.contact[0], {
message, message,
regionCode: 'US', regionCode: 'US',
logger,
}); });
assert.deepEqual(result, expected); assert.deepEqual(result, expected);
}); });
@ -112,7 +119,10 @@ describe('Contact', () => {
}, },
], ],
}; };
const result = await upgradeVersion(message.contact[0], { message }); const result = await upgradeVersion(message.contact[0], {
message,
logger,
});
assert.deepEqual(result, expected); assert.deepEqual(result, expected);
}); });
@ -190,7 +200,10 @@ describe('Contact', () => {
}, },
}; };
const result = await upgradeVersion(message.contact[0], { message }); const result = await upgradeVersion(message.contact[0], {
message,
logger,
});
assert.deepEqual(result, expected); assert.deepEqual(result, expected);
}); });
@ -231,7 +244,10 @@ describe('Contact', () => {
}, },
], ],
}; };
const result = await upgradeVersion(message.contact[0], { message }); const result = await upgradeVersion(message.contact[0], {
message,
logger,
});
assert.deepEqual(result, expected); assert.deepEqual(result, expected);
}); });
@ -272,7 +288,10 @@ describe('Contact', () => {
}, },
], ],
}; };
const result = await upgradeVersion(message.contact[0], { message }); const result = await upgradeVersion(message.contact[0], {
message,
logger,
});
assert.deepEqual(result, expected); assert.deepEqual(result, expected);
}); });
@ -310,7 +329,10 @@ describe('Contact', () => {
displayName: 'Someone Somewhere', displayName: 'Someone Somewhere',
}, },
}; };
const result = await upgradeVersion(message.contact[0], { message }); const result = await upgradeVersion(message.contact[0], {
message,
logger,
});
assert.deepEqual(result, expected); assert.deepEqual(result, expected);
}); });
@ -333,7 +355,10 @@ describe('Contact', () => {
}, },
], ],
}; };
const result = await upgradeVersion(message.contact[0], { message }); const result = await upgradeVersion(message.contact[0], {
message,
logger,
});
assert.deepEqual(result, message.contact[0]); assert.deepEqual(result, message.contact[0]);
}); });
}); });

View file

@ -8,6 +8,11 @@ const {
} = require('../../../js/modules/string_to_array_buffer'); } = require('../../../js/modules/string_to_array_buffer');
describe('Message', () => { describe('Message', () => {
const logger = {
warn: () => null,
error: () => null,
};
describe('createAttachmentDataWriter', () => { describe('createAttachmentDataWriter', () => {
it('should ignore messages that didnt go through attachment migration', async () => { it('should ignore messages that didnt go through attachment migration', async () => {
const input = { const input = {
@ -20,9 +25,10 @@ describe('Message', () => {
}; };
const writeExistingAttachmentData = () => {}; const writeExistingAttachmentData = () => {};
const actual = await Message.createAttachmentDataWriter( const actual = await Message.createAttachmentDataWriter({
writeExistingAttachmentData writeExistingAttachmentData,
)(input); logger,
})(input);
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
@ -39,9 +45,10 @@ describe('Message', () => {
}; };
const writeExistingAttachmentData = () => {}; const writeExistingAttachmentData = () => {};
const actual = await Message.createAttachmentDataWriter( const actual = await Message.createAttachmentDataWriter({
writeExistingAttachmentData writeExistingAttachmentData,
)(input); logger,
})(input);
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
@ -75,9 +82,10 @@ describe('Message', () => {
); );
}; };
const actual = await Message.createAttachmentDataWriter( const actual = await Message.createAttachmentDataWriter({
writeExistingAttachmentData writeExistingAttachmentData,
)(input); logger,
})(input);
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
@ -121,9 +129,10 @@ describe('Message', () => {
); );
}; };
const actual = await Message.createAttachmentDataWriter( const actual = await Message.createAttachmentDataWriter({
writeExistingAttachmentData writeExistingAttachmentData,
)(input); logger,
})(input);
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
@ -170,9 +179,10 @@ describe('Message', () => {
); );
}; };
const actual = await Message.createAttachmentDataWriter( const actual = await Message.createAttachmentDataWriter({
writeExistingAttachmentData writeExistingAttachmentData,
)(input); logger,
})(input);
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
}); });
@ -188,7 +198,10 @@ describe('Message', () => {
schemaVersion: 2, schemaVersion: 2,
}; };
const actual = Message.initializeSchemaVersion(input); const actual = Message.initializeSchemaVersion({
message: input,
logger,
});
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
@ -204,7 +217,10 @@ describe('Message', () => {
schemaVersion: 0, schemaVersion: 0,
}; };
const actual = Message.initializeSchemaVersion(input); const actual = Message.initializeSchemaVersion({
message: input,
logger,
});
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
}); });
@ -232,7 +248,10 @@ describe('Message', () => {
schemaVersion: 7, schemaVersion: 7,
}; };
const actual = Message.initializeSchemaVersion(input); const actual = Message.initializeSchemaVersion({
message: input,
logger,
});
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
}); });
@ -284,6 +303,10 @@ describe('Message', () => {
getImageDimensions: () => ({ height: 10, width: 15 }), getImageDimensions: () => ({ height: 10, width: 15 }),
makeImageThumbnail: () => new Blob(), makeImageThumbnail: () => new Blob(),
makeVideoScreenshot: () => new Blob(), makeVideoScreenshot: () => new Blob(),
logger: {
warn: () => null,
error: () => null,
},
}; };
const actual = await Message.upgradeSchema(input, context); const actual = await Message.upgradeSchema(input, context);
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
@ -323,12 +346,25 @@ describe('Message', () => {
const v3 = async message => const v3 = async message =>
Object.assign({}, message, { hasUpgradedToVersion3: true }); Object.assign({}, message, { hasUpgradedToVersion3: true });
const toVersion1 = Message._withSchemaVersion(1, v1); const toVersion1 = Message._withSchemaVersion({
const toVersion2 = Message._withSchemaVersion(2, v2); schemaVersion: 1,
const toVersion3 = Message._withSchemaVersion(3, v3); upgrade: v1,
});
const toVersion2 = Message._withSchemaVersion({
schemaVersion: 2,
upgrade: v2,
});
const toVersion3 = Message._withSchemaVersion({
schemaVersion: 3,
upgrade: v3,
});
const context = { logger };
const upgradeSchema = async message => const upgradeSchema = async message =>
toVersion3(await toVersion2(await toVersion1(message))); toVersion3(
await toVersion2(await toVersion1(message, context), context),
context
);
const actual = await upgradeSchema(input); const actual = await upgradeSchema(input);
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
@ -367,13 +403,26 @@ describe('Message', () => {
const v3 = async attachment => const v3 = async attachment =>
Object.assign({}, attachment, { hasUpgradedToVersion3: true }); Object.assign({}, attachment, { hasUpgradedToVersion3: true });
const toVersion1 = Message._withSchemaVersion(1, v1); const toVersion1 = Message._withSchemaVersion({
const toVersion2 = Message._withSchemaVersion(2, v2); schemaVersion: 1,
const toVersion3 = Message._withSchemaVersion(3, v3); upgrade: v1,
});
const toVersion2 = Message._withSchemaVersion({
schemaVersion: 2,
upgrade: v2,
});
const toVersion3 = Message._withSchemaVersion({
schemaVersion: 3,
upgrade: v3,
});
const context = { logger };
// NOTE: We upgrade to 3 before 2, i.e. the pipeline should abort: // NOTE: We upgrade to 3 before 2, i.e. the pipeline should abort:
const upgradeSchema = async attachment => const upgradeSchema = async attachment =>
toVersion2(await toVersion3(await toVersion1(attachment))); toVersion2(
await toVersion3(await toVersion1(attachment, context), context),
context
);
const actual = await upgradeSchema(input); const actual = await upgradeSchema(input);
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
@ -385,22 +434,26 @@ describe('Message', () => {
it('should require a version number', () => { it('should require a version number', () => {
const toVersionX = () => {}; const toVersionX = () => {};
assert.throws( assert.throws(
() => Message._withSchemaVersion(toVersionX, 2), () =>
"'schemaVersion' is invalid" Message._withSchemaVersion({ schemaVersion: toVersionX, upgrade: 2 }),
'_withSchemaVersion: schemaVersion is invalid'
); );
}); });
it('should require an upgrade function', () => { it('should require an upgrade function', () => {
assert.throws( assert.throws(
() => Message._withSchemaVersion(2, 3), () => Message._withSchemaVersion({ schemaVersion: 2, upgrade: 3 }),
"'upgrade' must be a function" '_withSchemaVersion: upgrade must be a function'
); );
}); });
it('should skip upgrading if message has already been upgraded', async () => { it('should skip upgrading if message has already been upgraded', async () => {
const upgrade = async message => const upgrade = async message =>
Object.assign({}, message, { foo: true }); Object.assign({}, message, { foo: true });
const upgradeWithVersion = Message._withSchemaVersion(3, upgrade); const upgradeWithVersion = Message._withSchemaVersion({
schemaVersion: 3,
upgrade,
});
const input = { const input = {
id: 'guid-guid-guid-guid', id: 'guid-guid-guid-guid',
@ -410,7 +463,7 @@ describe('Message', () => {
id: 'guid-guid-guid-guid', id: 'guid-guid-guid-guid',
schemaVersion: 4, schemaVersion: 4,
}; };
const actual = await upgradeWithVersion(input); const actual = await upgradeWithVersion(input, { logger });
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
@ -418,7 +471,10 @@ describe('Message', () => {
const upgrade = async () => { const upgrade = async () => {
throw new Error('boom!'); throw new Error('boom!');
}; };
const upgradeWithVersion = Message._withSchemaVersion(3, upgrade); const upgradeWithVersion = Message._withSchemaVersion({
schemaVersion: 3,
upgrade,
});
const input = { const input = {
id: 'guid-guid-guid-guid', id: 'guid-guid-guid-guid',
@ -428,13 +484,16 @@ describe('Message', () => {
id: 'guid-guid-guid-guid', id: 'guid-guid-guid-guid',
schemaVersion: 0, schemaVersion: 0,
}; };
const actual = await upgradeWithVersion(input); const actual = await upgradeWithVersion(input, { logger });
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
it('should return original message if upgrade function returns null', async () => { it('should return original message if upgrade function returns null', async () => {
const upgrade = async () => null; const upgrade = async () => null;
const upgradeWithVersion = Message._withSchemaVersion(3, upgrade); const upgradeWithVersion = Message._withSchemaVersion({
schemaVersion: 3,
upgrade,
});
const input = { const input = {
id: 'guid-guid-guid-guid', id: 'guid-guid-guid-guid',
@ -444,7 +503,7 @@ describe('Message', () => {
id: 'guid-guid-guid-guid', id: 'guid-guid-guid-guid',
schemaVersion: 0, schemaVersion: 0,
}; };
const actual = await upgradeWithVersion(input); const actual = await upgradeWithVersion(input, { logger });
assert.deepEqual(actual, expected); assert.deepEqual(actual, expected);
}); });
}); });
@ -482,7 +541,7 @@ describe('Message', () => {
attachments: [], attachments: [],
}, },
}; };
const result = await upgradeVersion(message); const result = await upgradeVersion(message, { logger });
assert.deepEqual(result, expected); assert.deepEqual(result, expected);
}); });
@ -499,7 +558,7 @@ describe('Message', () => {
attachments: [], attachments: [],
}, },
}; };
const result = await upgradeVersion(message); const result = await upgradeVersion(message, { logger });
assert.deepEqual(result, message); assert.deepEqual(result, message);
}); });
@ -516,7 +575,7 @@ describe('Message', () => {
attachments: [], attachments: [],
}, },
}; };
const result = await upgradeVersion(message); const result = await upgradeVersion(message, { logger });
assert.deepEqual(result, message); assert.deepEqual(result, message);
}); });
@ -553,7 +612,7 @@ describe('Message', () => {
], ],
}, },
}; };
const result = await upgradeVersion(message); const result = await upgradeVersion(message, { logger });
assert.deepEqual(result, expected); assert.deepEqual(result, expected);
}); });
@ -589,7 +648,7 @@ describe('Message', () => {
], ],
}, },
}; };
const result = await upgradeVersion(message); const result = await upgradeVersion(message, { logger });
assert.deepEqual(result, expected); assert.deepEqual(result, expected);
}); });
}); });

View file

@ -32,6 +32,10 @@ export class MediaGridItem extends React.Component<Props, State> {
} }
public onImageError() { public onImageError() {
// tslint:disable-next-line no-console
console.log(
'MediaGridItem: Image failed to load; failing over to placeholder'
);
this.setState({ this.setState({
imageBroken: true, imageBroken: true,
}); });