diff --git a/skins/base/views/molecules/UnknownMessageTile.js b/skins/base/views/molecules/UnknownMessageTile.js
index 27e801c99..b965a4a1f 100644
--- a/skins/base/views/molecules/UnknownMessageTile.js
+++ b/skins/base/views/molecules/UnknownMessageTile.js
@@ -25,9 +25,10 @@ module.exports = React.createClass({
mixins: [UnknownMessageTileController],
render: function() {
+ var content = this.props.mxEvent.getContent();
return (
- ?
+ {content.body}
);
},
diff --git a/skins/base/views/organisms/CreateRoom.js b/skins/base/views/organisms/CreateRoom.js
index 4fd7a93ee..21769621e 100644
--- a/skins/base/views/organisms/CreateRoom.js
+++ b/skins/base/views/organisms/CreateRoom.js
@@ -118,6 +118,12 @@ module.exports = React.createClass({
})
},
+ onEncryptChanged: function(ev) {
+ this.setState({
+ encrypt: ev.target.checked,
+ });
+ },
+
render: function() {
var curr_phase = this.state.phase;
if (curr_phase == this.phases.CREATING) {
@@ -142,7 +148,7 @@ module.exports = React.createClass({
-
+
{error_box}
diff --git a/src/MatrixClientPeg.js b/src/MatrixClientPeg.js
index 1acd2a701..322b70f48 100644
--- a/src/MatrixClientPeg.js
+++ b/src/MatrixClientPeg.js
@@ -23,6 +23,16 @@ var matrixClient = null;
var localStorage = window.localStorage;
+function deviceId() {
+ var id = Math.floor(Math.random()*16777215).toString(16);
+ id = "W" + "000000".substring(id.length) + id;
+ if (localStorage) {
+ id = localStorage.getItem("mx_device_id") || id;
+ localStorage.setItem("mx_device_id", id);
+ }
+ return id;
+}
+
function createClient(hs_url, is_url, user_id, access_token) {
var opts = {
baseUrl: hs_url,
@@ -31,6 +41,11 @@ function createClient(hs_url, is_url, user_id, access_token) {
userId: user_id
};
+ if (localStorage) {
+ opts.sessionStore = new Matrix.WebStorageSessionStore(localStorage);
+ opts.deviceId = deviceId();
+ }
+
matrixClient = Matrix.createClient(opts);
}
diff --git a/src/SlashCommands.js b/src/SlashCommands.js
index 2ddebd7d7..907aa26d6 100644
--- a/src/SlashCommands.js
+++ b/src/SlashCommands.js
@@ -18,6 +18,7 @@ limitations under the License.
var MatrixClientPeg = require("./MatrixClientPeg");
var dis = require("./dispatcher");
+var encryption = require("./encryption");
var reject = function(msg) {
return {
@@ -42,6 +43,25 @@ var commands = {
return reject("Usage: /nick ");
},
+ encrypt: function(room_id, args) {
+ if (args == "on") {
+ var client = MatrixClientPeg.get();
+ var members = client.getRoom(room_id).currentState.members;
+ var user_ids = Object.keys(members);
+ return success(
+ encryption.enableEncryption(client, room_id, user_ids)
+ );
+ }
+ if (args == "off") {
+ var client = MatrixClientPeg.get();
+ return success(
+ encryption.disableEncryption(client, room_id)
+ );
+
+ }
+ return reject("Usage: encrypt ");
+ },
+
// Change the room topic
topic: function(room_id, args) {
if (args) {
@@ -230,4 +250,4 @@ module.exports = {
}
return null; // not a command
}
-};
\ No newline at end of file
+};
diff --git a/src/controllers/organisms/CreateRoom.js b/src/controllers/organisms/CreateRoom.js
index 107e94b35..f6404eb23 100644
--- a/src/controllers/organisms/CreateRoom.js
+++ b/src/controllers/organisms/CreateRoom.js
@@ -19,6 +19,8 @@ limitations under the License.
var React = require("react");
var MatrixClientPeg = require("../../MatrixClientPeg");
var PresetValues = require('../atoms/create_room/Presets').Presets;
+var q = require('q');
+var encryption = require("../../encryption");
module.exports = {
propTypes: {
@@ -97,7 +99,20 @@ module.exports = {
return;
}
- var deferred = MatrixClientPeg.get().createRoom(options);
+ var deferred = cli.createRoom(options);
+
+ var response;
+
+ if (this.state.encrypt) {
+ deferred = deferred.then(function(res) {
+ response = res;
+ return encryption.enableEncryption(
+ cli, response.roomId, options.invite
+ );
+ }).then(function() {
+ return q(response) }
+ );
+ }
this.setState({
phase: this.phases.CREATING,
diff --git a/src/encryption.js b/src/encryption.js
new file mode 100644
index 000000000..dea454a3f
--- /dev/null
+++ b/src/encryption.js
@@ -0,0 +1,40 @@
+/*
+Copyright 2015 OpenMarket Ltd
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+'use strict';
+
+function enableEncyption(client, roomId, members) {
+ members = members.slice(0);
+ members.push(client.credentials.userId);
+ // TODO: Check the keys actually match what keys the user has.
+ // TODO: Don't redownload keys each time.
+ return client.downloadKeys(members, "forceDownload").then(function(res) {
+ return client.setRoomEncryption(roomId, {
+ algorithm: "m.olm.v1.curve25519-aes-sha2",
+ members: members,
+ });
+ })
+}
+
+function disableEncryption(client, roomId) {
+ return client.disableRoomEncryption(roomId);
+}
+
+
+module.exports = {
+ enableEncryption: enableEncyption,
+ disableEncryption: disableEncryption,
+}