diff --git a/src/component-index.js b/src/component-index.js index 488b85670b..751332de1b 100644 --- a/src/component-index.js +++ b/src/component-index.js @@ -49,6 +49,7 @@ module.exports.components['views.create_room.Presets'] = require('./components/v module.exports.components['views.create_room.RoomAlias'] = require('./components/views/create_room/RoomAlias'); module.exports.components['views.dialogs.ChatInviteDialog'] = require('./components/views/dialogs/ChatInviteDialog'); module.exports.components['views.dialogs.DeactivateAccountDialog'] = require('./components/views/dialogs/DeactivateAccountDialog'); +module.exports.components['views.dialogs.EncryptedEventDialog'] = require('./components/views/dialogs/EncryptedEventDialog'); module.exports.components['views.dialogs.ErrorDialog'] = require('./components/views/dialogs/ErrorDialog'); module.exports.components['views.dialogs.LogoutPrompt'] = require('./components/views/dialogs/LogoutPrompt'); module.exports.components['views.dialogs.MultiInviteDialog'] = require('./components/views/dialogs/MultiInviteDialog'); diff --git a/src/components/views/dialogs/LogoutPrompt.js b/src/components/views/dialogs/LogoutPrompt.js index 7c4ba18e82..c4bd7a0474 100644 --- a/src/components/views/dialogs/LogoutPrompt.js +++ b/src/components/views/dialogs/LogoutPrompt.js @@ -18,6 +18,11 @@ var dis = require("../../../dispatcher"); module.exports = React.createClass({ displayName: 'LogoutPrompt', + + propTypes: { + onFinished: React.PropTypes.func, + }, + logOut: function() { dis.dispatch({action: 'logout'}); if (this.props.onFinished) { diff --git a/src/components/views/rooms/EventTile.js b/src/components/views/rooms/EventTile.js index 6a266b2f13..44f2050c51 100644 --- a/src/components/views/rooms/EventTile.js +++ b/src/components/views/rooms/EventTile.js @@ -363,62 +363,11 @@ module.exports = React.createClass({ }, onCryptoClicked: function(e) { - var ErrorDialog = sdk.getComponent("dialogs.ErrorDialog"); + var EncryptedEventDialog = sdk.getComponent("dialogs.EncryptedEventDialog"); var event = this.props.mxEvent; - // XXX: gutwrench - is there any reason not to expose this on MatrixClient itself? - var device = MatrixClientPeg.get()._crypto.getDeviceByIdentityKey( - event.getSender(), - event.getWireContent().algorithm, - event.getWireContent().sender_key - ); - - Modal.createDialog(ErrorDialog, { - title: "End-to-end encryption information", - description: ( - <div> - <table> - <tbody> - <tr> - <td>Sent by</td> - <td>{ event.getSender() }</td> - </tr> - <tr> - <td>Sender device name</td> - <td>{ device.getDisplayName() }</td> - </tr> - <tr> - <td>Sender device ID</td> - <td>{ device.deviceId }</td> - </tr> - <tr> - <td>Sender device verification:</td> - <td>{ MatrixClientPeg.get().isEventSenderVerified(event) ? "verified" : <b>NOT verified</b> }</td> - </tr> - <tr> - <td>Sender device ed25519 fingerprint</td> - <td>{ device.getFingerprint() }</td> - </tr> - <tr> - <td>Sender device curve25519 identity key</td> - <td>{ event.getWireContent().sender_key }</td> - </tr> - <tr> - <td>Algorithm</td> - <td>{ event.getWireContent().algorithm }</td> - </tr> - { - event.getContent().msgtype === 'm.bad.encrypted' ? ( - <tr> - <td>Decryption error</td> - <td>{ event.getContent().body }</td> - </tr> - ) : '' - } - </tbody> - </table> - </div> - ) + Modal.createDialog(EncryptedEventDialog, { + event: event, }); }, diff --git a/src/components/views/rooms/MemberDeviceInfo.js b/src/components/views/rooms/MemberDeviceInfo.js index 22bbdd2ce7..927cc90491 100644 --- a/src/components/views/rooms/MemberDeviceInfo.js +++ b/src/components/views/rooms/MemberDeviceInfo.js @@ -54,33 +54,33 @@ export default class MemberDeviceInfo extends React.Component { var indicator = null, blockButton = null, verifyButton = null; if (this.props.device.isBlocked()) { blockButton = ( - <div className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_unblock" + <button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_unblock" onClick={this.onUnblockClick}> Unblock - </div> + </button> ); } else { blockButton = ( - <div className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_block" + <button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_block" onClick={this.onBlockClick}> Block - </div> + </button> ); } if (this.props.device.isVerified()) { verifyButton = ( - <div className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_unverify" + <button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_unverify" onClick={this.onUnverifyClick}> Unverify - </div> + </button> ); } else { verifyButton = ( - <div className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_verify" + <button className="mx_MemberDeviceInfo_textButton mx_MemberDeviceInfo_verify" onClick={this.onVerifyClick}> Verify - </div> + </button> ); } @@ -101,16 +101,25 @@ export default class MemberDeviceInfo extends React.Component { var deviceName = this.props.device.getDisplayName() || this.props.device.deviceId; + var info; + if (!this.props.hideInfo) { + info = ( + <div> + <div className="mx_MemberDeviceInfo_deviceId">{deviceName}</div> + {indicator} + <div className="mx_MemberDeviceInfo_deviceKey"> + {this.props.device.getFingerprint()} + </div> + </div> + ); + } + // add the deviceId as a titletext to help with debugging return ( <div className="mx_MemberDeviceInfo" title={this.props.device.deviceId}> - <div className="mx_MemberDeviceInfo_deviceId">{deviceName}</div> - {indicator} - <div className="mx_MemberDeviceInfo_deviceKey"> - {this.props.device.getFingerprint()} - </div> - {verifyButton} - {blockButton} + { info } + { verifyButton } + { blockButton } </div> ); } @@ -120,4 +129,5 @@ MemberDeviceInfo.displayName = 'MemberDeviceInfo'; MemberDeviceInfo.propTypes = { userId: React.PropTypes.string.isRequired, device: React.PropTypes.object.isRequired, + hideInfo: React.PropTypes.bool, }; diff --git a/src/components/views/rooms/MessageComposer.js b/src/components/views/rooms/MessageComposer.js index 2f954b908b..ff5c7f5259 100644 --- a/src/components/views/rooms/MessageComposer.js +++ b/src/components/views/rooms/MessageComposer.js @@ -204,7 +204,7 @@ export default class MessageComposer extends React.Component { if (MatrixClientPeg.get().isRoomEncrypted(this.props.room.roomId)) { // FIXME: show a /!\ if there are untrusted devices in the room... controls.push( - <img className="mx_MessageComposer_e2eIcon" src="img/e2e-verified.svg" width="10" height="12" alt="Encrypted room"/> + <img key="e2eIcon" className="mx_MessageComposer_e2eIcon" src="img/e2e-verified.svg" width="10" height="12" alt="Encrypted room"/> ); }