a833d62a71
Update protobuf definitions and refactor message receive and decrypt codepath to support new protocol, including various flavors of sync messages (sent messages, contacts, and groups). Also cleans up background.js and lets libtextsecure internalize textsecure.processDecrypted and ensure that it is called before handing DataMessages off to the application. The Envelope structure now has a generic content field and a legacyMessage field for backwards compatibility. We'll send outgoing messages as legacy messages, and sync messages as "content" while continuing to support both legacy and non-legacy messages on the receive side until old clients have a chance to transition.
253 lines
7.4 KiB
JavaScript
253 lines
7.4 KiB
JavaScript
var child_process = require('child_process');
|
|
var util = require('util');
|
|
|
|
module.exports = function(grunt) {
|
|
'use strict';
|
|
|
|
var bower = grunt.file.readJSON('bower.json');
|
|
var components = [];
|
|
for (var i in bower.concat.app) {
|
|
components.push('components/' + bower.concat.app[i] + '/**/*.js');
|
|
}
|
|
|
|
var libtextsecurecomponents = [];
|
|
for (i in bower.concat.libtextsecure) {
|
|
libtextsecurecomponents.push('components/' + bower.concat.libtextsecure[i] + '/**/*.js');
|
|
}
|
|
|
|
grunt.initConfig({
|
|
pkg: grunt.file.readJSON('package.json'),
|
|
concat: {
|
|
components: {
|
|
src: components,
|
|
dest: 'js/components.js',
|
|
},
|
|
libtextsecurecomponents: {
|
|
src: libtextsecurecomponents,
|
|
dest: 'libtextsecure/components.js',
|
|
},
|
|
test: {
|
|
src: [
|
|
'components/mocha/mocha.js',
|
|
'components/chai/chai.js',
|
|
'test/_test.js'
|
|
],
|
|
dest: 'test/test.js',
|
|
},
|
|
//TODO: Move errors back down?
|
|
libtextsecure: {
|
|
options: {
|
|
banner: ";(function() {\n",
|
|
footer: "})();\n",
|
|
},
|
|
src: [
|
|
'libtextsecure/errors.js',
|
|
'libtextsecure/libaxolotl.js',
|
|
'libtextsecure/axolotl_wrapper.js',
|
|
|
|
'libtextsecure/crypto.js',
|
|
'libtextsecure/storage.js',
|
|
'libtextsecure/storage/user.js',
|
|
'libtextsecure/storage/devices.js',
|
|
'libtextsecure/storage/groups.js',
|
|
'libtextsecure/protobufs.js',
|
|
'libtextsecure/websocket.js',
|
|
'libtextsecure/websocket-resources.js',
|
|
'libtextsecure/helpers.js',
|
|
'libtextsecure/stringview.js',
|
|
'libtextsecure/api.js',
|
|
'libtextsecure/account_manager.js',
|
|
'libtextsecure/message_receiver.js',
|
|
'libtextsecure/sendmessage.js',
|
|
'libtextsecure/contacts_parser.js',
|
|
],
|
|
dest: 'js/libtextsecure.js',
|
|
},
|
|
libtextsecuretest: {
|
|
src: [
|
|
'components/mock-socket/dist/mock-socket.js',
|
|
'components/mocha/mocha.js',
|
|
'components/chai/chai.js',
|
|
'libtextsecure/test/_test.js'
|
|
],
|
|
dest: 'libtextsecure/test/test.js',
|
|
}
|
|
},
|
|
sass: {
|
|
stylesheets: {
|
|
files: {
|
|
'stylesheets/manifest.css': 'stylesheets/manifest.scss',
|
|
'stylesheets/options.css': 'stylesheets/options.scss'
|
|
}
|
|
}
|
|
},
|
|
compile: {
|
|
curve25519_compiled: {
|
|
src_files: [
|
|
'native/ed25519/additions/*.c',
|
|
'native/curve25519-donna.c',
|
|
'native/ed25519/*.c',
|
|
'native/ed25519/sha512/sha2big.c'
|
|
],
|
|
methods: [
|
|
'curve25519_donna',
|
|
'curve25519_sign',
|
|
'curve25519_verify',
|
|
'crypto_sign_ed25519_ref10_ge_scalarmult_base',
|
|
'sph_sha512_init',
|
|
'malloc',
|
|
'free'
|
|
]
|
|
}
|
|
},
|
|
jshint: {
|
|
files: [
|
|
'Gruntfile.js',
|
|
'js/background.js',
|
|
'js/chromium.js',
|
|
'js/bimap.js',
|
|
'js/conversation_panel.js',
|
|
'js/database.js',
|
|
'js/inbox_controller.js',
|
|
'js/index.js',
|
|
'js/libphonenumber-util.js',
|
|
'js/options.js',
|
|
'js/panel_controller.js',
|
|
'js/models/*.js',
|
|
'js/views/*.js',
|
|
],
|
|
options: { jshintrc: '.jshintrc' },
|
|
},
|
|
dist: {
|
|
src: [
|
|
'manifest.json',
|
|
'background.html',
|
|
'index.html',
|
|
'conversation.html',
|
|
'options.html',
|
|
'protos/*',
|
|
'js/**',
|
|
'stylesheets/*.css',
|
|
'!js/register.js'
|
|
],
|
|
res: [
|
|
'images/**',
|
|
'fonts/*',
|
|
]
|
|
},
|
|
copy: {
|
|
res: {
|
|
files: [{ expand: true, dest: 'dist/', src: ['<%= dist.res %>'] }],
|
|
},
|
|
src: {
|
|
files: [{ expand: true, dest: 'dist/', src: ['<%= dist.src %>'] }],
|
|
options: {
|
|
process: function(content, srcpath) {
|
|
if (srcpath.match('libtextsecure')) {
|
|
return content.replace(
|
|
/textsecure-service-staging.whispersystems.org/g,
|
|
'textsecure-service-ca.whispersystems.org:4433').replace(
|
|
/whispersystems-textsecure-attachments-staging.s3.amazonaws.com/g,
|
|
'whispersystems-textsecure-attachments.s3.amazonaws.com');
|
|
} else {
|
|
return content;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
jscs: {
|
|
all: {
|
|
src: ['js/**/*.js', '!js/libtextsecure.js', '!js/libaxolotl-worker.js', '!js/components.js', 'test/**/*.js']
|
|
}
|
|
},
|
|
watch: {
|
|
scripts: {
|
|
files: ['<%= jshint.files %>', './js/**/*.js'],
|
|
tasks: ['jshint']
|
|
},
|
|
sass: {
|
|
files: ['./stylesheets/*.scss'],
|
|
tasks: ['sass']
|
|
},
|
|
libtextsecure: {
|
|
files: ['./libtextsecure/*.js', './libtextsecure/storage/*.js'],
|
|
tasks: ['concat:libtextsecure']
|
|
},
|
|
dist: {
|
|
files: ['<%= dist.src %>', '<%= dist.res %>'],
|
|
tasks: ['copy']
|
|
},
|
|
},
|
|
connect: {
|
|
server: {
|
|
options: {
|
|
base: '.',
|
|
port: 9999
|
|
}
|
|
}
|
|
},
|
|
'saucelabs-mocha': {
|
|
all: {
|
|
options: {
|
|
urls: [
|
|
'http://127.0.0.1:9999/test/index.html',
|
|
'http://127.0.0.1:9999/libtextsecure/test/index.html',
|
|
],
|
|
build: process.env.TRAVIS_JOB_ID,
|
|
browsers: [
|
|
{ browserName: 'chrome', version: '40' },
|
|
{ browserName: 'firefox', version: '34' }
|
|
],
|
|
testname: 'TextSecure-Browser Tests'
|
|
}
|
|
}
|
|
},
|
|
});
|
|
|
|
Object.keys(grunt.config.get('pkg').devDependencies).forEach(function(key) {
|
|
if (/^grunt(?!(-cli)?$)/.test(key)) { // ignore grunt and grunt-cli
|
|
grunt.loadNpmTasks(key);
|
|
}
|
|
});
|
|
|
|
grunt.registerMultiTask('compile', 'Compile the C libraries with emscripten.', function() {
|
|
var callback = this.async();
|
|
var outfile = 'build/' + this.target + '.js';
|
|
|
|
var exported_functions = this.data.methods.map(function(name) {
|
|
return "'_" + name + "'";
|
|
});
|
|
var flags = [
|
|
'-O1',
|
|
'-Qunused-arguments',
|
|
'-o', outfile,
|
|
'-Inative/ed25519/nacl_includes -Inative/ed25519 -Inative/ed25519/sha512',
|
|
'-s', "EXPORTED_FUNCTIONS=\"[" + exported_functions.join(',') + "]\""];
|
|
var command = [].concat('emcc', this.data.src_files, flags).join(' ');
|
|
grunt.log.writeln('Compiling via emscripten to ' + outfile);
|
|
|
|
var exitCode = 0;
|
|
grunt.verbose.subhead(command);
|
|
grunt.verbose.writeln(util.format('Expecting exit code %d', exitCode));
|
|
|
|
var child = child_process.exec(command);
|
|
child.stdout.on('data', function (d) { grunt.log.write(d); });
|
|
child.stderr.on('data', function (d) { grunt.log.error(d); });
|
|
child.on('exit', function(code) {
|
|
if (code !== exitCode) {
|
|
grunt.log.error(util.format('Exited with code: %d.', code));
|
|
return callback(false);
|
|
}
|
|
|
|
grunt.verbose.ok(util.format('Exited with code: %d.', code));
|
|
callback(true);
|
|
});
|
|
});
|
|
|
|
grunt.registerTask('dev', ['connect', 'watch', 'sass']);
|
|
grunt.registerTask('test', ['jshint', 'jscs', 'connect', 'saucelabs-mocha']);
|
|
grunt.registerTask('default', ['preen', 'concat', 'sass', 'copy']);
|
|
grunt.registerTask('build', ['compile', 'concat:curve25519', 'concat:libtextsecure']);
|
|
|
|
};
|