Skip to content

Commit

Permalink
Merge branch 'hotfix/1.6.1' to move to debuglogs.org for logs
Browse files Browse the repository at this point in the history
  • Loading branch information
scottnonnenberg-signal committed Mar 15, 2018
2 parents 63c8e2f + f9603db commit fad7b70
Show file tree
Hide file tree
Showing 18 changed files with 377 additions and 136 deletions.
2 changes: 2 additions & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,11 @@ test/views/*.js

# ES2015+ files
!js/background.js
!js/logging.js
!js/models/conversations.js
!js/views/attachment_view.js
!js/views/conversation_search_view.js
!js/views/debug_log_view.js
!js/views/file_input_view.js
!js/views/inbox_view.js
!main.js
Expand Down
2 changes: 2 additions & 0 deletions Gruntfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,9 @@ module.exports = function(grunt) {
'!js/Mp3LameEncoder.min.js',
'!js/libsignal-protocol-worker.js',
'!js/components.js',
'!js/logging.js',
'!js/modules/**/*.js',
'!js/views/debug_log_view.js',
'!js/signal_protocol_store.js',
'_locales/**/*'
],
Expand Down
10 changes: 5 additions & 5 deletions _locales/en/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -367,8 +367,8 @@
}
},
"submitDebugLog": {
"message": "Submit debug log",
"description": "Menu item and header text for debug log modal, title case."
"message": "Debug log",
"description": "Menu item and header text for debug log modal (sentence case)"
},
"debugLog": {
"message": "Debug Log",
Expand All @@ -386,9 +386,9 @@
"message": "Go to Support Page",
"description": "Item under the Help menu, takes you to the support page"
},
"fileABug": {
"message": "File a Bug",
"description": "Item under the Help menu, takes you to GitHub new issue form"
"menuReportIssue": {
"message": "Report an Issue",
"description": "Item under the Help menu, takes you to GitHub new issue form (title case)"
},
"aboutSignalDesktop": {
"message": "About Signal Desktop",
Expand Down
2 changes: 1 addition & 1 deletion app/menu.js
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ exports.createTemplate = (options, messages) => {
click: openSupportPage,
},
{
label: messages.fileABug.message,
label: messages.menuReportIssue.message,
click: openNewBugForm,
},
{
Expand Down
2 changes: 0 additions & 2 deletions js/background.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
/* eslint-disable */

/* eslint-env browser */

/* global Backbone: false */
/* global $: false */

Expand Down
3 changes: 1 addition & 2 deletions js/focus_listener.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
(function () {
'use strict';

var windowFocused;
var windowFocused = false;
window.addEventListener('blur', function() {
windowFocused = false;
});
Expand All @@ -12,5 +12,4 @@
window.isFocused = function() {
return windowFocused;
};

})();
89 changes: 35 additions & 54 deletions js/logging.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
/* eslint-env node */

/* eslint strict: ['error', 'never'] */

const electron = require('electron');
const bunyan = require('bunyan');
const _ = require('lodash');

const debuglogs = require('./modules/debuglogs');


const ipc = electron.ipcRenderer;
const PHONE_REGEX = /\+\d{7,12}(\d{3})/g;
Expand All @@ -23,33 +29,31 @@ const LEVELS = {
// Backwards-compatible logging, simple strings and no level (defaulted to INFO)

function redactPhone(text) {
return text.replace(PHONE_REGEX, "+[REDACTED]$1");
return text.replace(PHONE_REGEX, '+[REDACTED]$1');
}

function redactGroup(text) {
return text.replace(GROUP_REGEX, function(match, before, id, after) {
return before + '[REDACTED]' + id.slice(-3) + after;
});
return text.replace(
GROUP_REGEX,
(match, before, id, after) => `${before}[REDACTED]${id.slice(-3)}${after}`
);
}

function now() {
const date = new Date();
return date.toJSON();
}

function log() {
const args = Array.prototype.slice.call(arguments, 0);

function log(...args) {
const consoleArgs = ['INFO ', now()].concat(args);
console._log.apply(console, consoleArgs);
console._log(...consoleArgs);

// To avoid [Object object] in our log since console.log handles non-strings smoothly
const str = args.map(function(item) {
const str = args.map((item) => {
if (typeof item !== 'string') {
try {
return JSON.stringify(item);
}
catch (e) {
} catch (error) {
return item;
}
}
Expand All @@ -71,14 +75,14 @@ if (window.console) {
function getHeader() {
let header = window.navigator.userAgent;

header += ' node/' + window.config.node_version;
header += ' env/' + window.config.environment;
header += ` node/${window.config.node_version}`;
header += ` env/${window.config.environment}`;

return header;
}

function getLevel(level) {
var text = LEVELS[level];
const text = LEVELS[level];
if (!text) {
return BLANK_LEVEL;
}
Expand All @@ -87,45 +91,25 @@ function getLevel(level) {
}

function formatLine(entry) {
return getLevel(entry.level) + ' ' + entry.time + ' ' + entry.msg;
return `${getLevel(entry.level)} ${entry.time} ${entry.msg}`;
}

function format(entries) {
return redactGroup(redactPhone(entries.map(formatLine).join('\n')));
}

function fetch() {
return new Promise(function(resolve) {
return new Promise((resolve) => {
ipc.send('fetch-log');

ipc.on('fetched-log', function(event, text) {
var result = getHeader() + '\n' + format(text);
ipc.on('fetched-log', (event, text) => {
const result = `${getHeader()}\n${format(text)}`;
resolve(result);
});
});
}

function publish(log) {
log = log || fetch();

return new Promise(function(resolve) {
const payload = textsecure.utils.jsonThing({
files: {
'debugLog.txt': {
content: log
}
}
});

$.post('https://api.github.com/gists', payload)
.then(function(response) {
console._log('Posted debug log to ', response.html_url);
resolve(response.html_url);
})
.fail(resolve);
});
}

const publish = debuglogs.upload;

// A modern logging interface for the browser

Expand All @@ -136,22 +120,19 @@ const logger = bunyan.createLogger({
streams: [{
level: 'debug',
stream: {
write: function(entry) {
write(entry) {
console._log(formatLine(JSON.parse(entry)));
}
}
}]
},
},
}],
});

// The Bunyan API: https://github.com/trentm/node-bunyan#log-method-api
function logAtLevel() {
const level = arguments[0];
const args = Array.prototype.slice.call(arguments, 1);

const ipcArgs = ['log-' + level].concat(args);
ipc.send.apply(ipc, ipcArgs);
function logAtLevel(level, ...args) {
const ipcArgs = [`log-${level}`].concat(args);
ipc.send(...ipcArgs);

logger[level].apply(logger, args);
logger[level](...args);
}

window.log = {
Expand All @@ -165,11 +146,11 @@ window.log = {
publish,
};

window.onerror = function(message, script, line, col, error) {
window.onerror = (message, script, line, col, error) => {
const errorInfo = error && error.stack ? error.stack : JSON.stringify(error);
window.log.error('Top-level unhandled error: ' + errorInfo);
window.log.error(`Top-level unhandled error: ${errorInfo}`);
};

window.addEventListener('unhandledrejection', function(rejectionEvent) {
window.log.error('Top-level unhandled promise rejection: ' + rejectionEvent.reason);
window.addEventListener('unhandledrejection', (rejectionEvent) => {
window.log.error(`Top-level unhandled promise rejection: ${rejectionEvent.reason}`);
});
51 changes: 51 additions & 0 deletions js/modules/debuglogs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/* eslint-env node */

const FormData = require('form-data');
const got = require('got');


const BASE_URL = 'https://debuglogs.org';

// Workaround: Submitting `FormData` using native `FormData::submit` procedure
// as integration with `got` results in S3 error saying we haven’t set the
// `Content-Length` header:
// https://github.com/sindresorhus/got/pull/466
const submitFormData = (form, url) =>
new Promise((resolve, reject) => {
form.submit(url, (error) => {
if (error) {
return reject(error);
}

return resolve();
});
});

// upload :: String -> Promise URL
exports.upload = async (content) => {
const signedForm = await got.get(BASE_URL, { json: true });
const { fields, url } = signedForm.body;

const form = new FormData();
// The API expects `key` to be the first field:
form.append('key', fields.key);
Object.entries(fields)
.filter(([key]) => key !== 'key')
.forEach(([key, value]) => {
form.append(key, value);
});

const contentBuffer = Buffer.from(content, 'utf8');
const contentType = 'text/plain';
form.append('Content-Type', contentType);
form.append('file', contentBuffer, {
contentType,
filename: 'signal-desktop-debug-log.txt',
});

// WORKAROUND: See comment on `submitFormData`:
// await got.post(url, { body: form });
await submitFormData(form, url);

return `${BASE_URL}/${fields.key}`;
};
2 changes: 0 additions & 2 deletions js/views/attachment_view.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
/* eslint-env browser */

/* global $: false */
/* global _: false */
/* global Backbone: false */
Expand Down
Loading

0 comments on commit fad7b70

Please sign in to comment.