diff --git a/src/components/views/rooms/RoomPreviewBar.js b/src/components/views/rooms/RoomPreviewBar.js index 7715bd9339..ccd4559586 100644 --- a/src/components/views/rooms/RoomPreviewBar.js +++ b/src/components/views/rooms/RoomPreviewBar.js @@ -35,6 +35,8 @@ const MessageCase = Object.freeze({ Kicked: "Kicked", Banned: "Banned", OtherThreePIDError: "OtherThreePIDError", + InvitedEmailNotFoundInAccount: "InvitedEmailNotFoundInAccount", + InvitedEmailNoIdentityServer: "InvitedEmailNoIdentityServer", InvitedEmailMismatch: "InvitedEmailMismatch", Invite: "Invite", ViewingRoom: "ViewingRoom", @@ -106,12 +108,24 @@ module.exports = React.createClass({ }, _checkInvitedEmail: async function() { - // If this is an invite and we've been told what email - // address was invited, fetch the user's list of Threepids - // so we can check them against the one that was invited + // If this is an invite and we've been told what email address was + // invited, fetch the user's account emails and discovery bindings so we + // can check them against the email that was invited. if (this.props.inviterName && this.props.invitedEmail) { this.setState({busy: true}); try { + // Gather the account 3PIDs + const account3pids = await MatrixClientPeg.get().getThreePids(); + this.setState({ + accountEmails: account3pids.threepids + .filter(b => b.medium === 'email').map(b => b.address), + }); + // If we have an IS connected, use that to lookup the email and + // check the bound MXID. + if (!MatrixClientPeg.get().getIdentityServerUrl()) { + this.setState({busy: false}); + return; + } const authClient = new IdentityAuthClient(); const identityAccessToken = await authClient.getAccessToken(); const result = await MatrixClientPeg.get().lookupThreePid( @@ -157,6 +171,13 @@ module.exports = React.createClass({ if (this.props.invitedEmail) { if (this.state.threePidFetchError) { return MessageCase.OtherThreePIDError; + } else if ( + this.state.accountEmails && + !this.state.accountEmails.includes(this.props.invitedEmail) + ) { + return MessageCase.InvitedEmailNotFoundInAccount; + } else if (!MatrixClientPeg.get().getIdentityServerUrl()) { + return MessageCase.InvitedEmailNoIdentityServer; } else if (this.state.invitedEmailMxid != MatrixClientPeg.get().getUserId()) { return MessageCase.InvitedEmailMismatch; } @@ -337,8 +358,10 @@ module.exports = React.createClass({ title = _t("Something went wrong with your invite to %(roomName)s", {roomName: this._roomName()}); const joinRule = this._joinRule(); - const errCodeMessage = _t("%(errcode)s was returned while trying to valide your invite. You could try to pass this information on to a room admin.", - {errcode: this.state.threePidFetchError.errcode}, + const errCodeMessage = _t( + "An error (%(errcode)s) was returned while trying to validate your " + + "invite. You could try to pass this information on to a room admin.", + {errcode: this.state.threePidFetchError.errcode || _t("unknown error code")}, ); switch (joinRule) { case "invite": @@ -346,6 +369,8 @@ module.exports = React.createClass({ _t("You can only join it with a working invite."), errCodeMessage, ]; + primaryActionLabel = _t("Try to join anyway"); + primaryActionHandler = this.props.onJoinClick; break; case "public": subTitle = _t("You can still join it because this is a public room."); @@ -360,25 +385,51 @@ module.exports = React.createClass({ } break; } + case MessageCase.InvitedEmailNotFoundInAccount: { + title = _t( + "This invite to %(roomName)s was sent to %(email)s which is not " + + "associated with your account", + { + roomName: this._roomName(), + email: this.props.invitedEmail, + }, + ); + subTitle = _t( + "Link this email with your account in Settings to receive invites " + + "directly in Riot.", + ); + primaryActionLabel = _t("Join the discussion"); + primaryActionHandler = this.props.onJoinClick; + break; + } + case MessageCase.InvitedEmailNoIdentityServer: { + title = _t( + "This invite to %(roomName)s was sent to %(email)s", + { + roomName: this._roomName(), + email: this.props.invitedEmail, + }, + ); + subTitle = _t( + "Use an identity server in Settings to receive invites directly in Riot.", + ); + primaryActionLabel = _t("Join the discussion"); + primaryActionHandler = this.props.onJoinClick; + break; + } case MessageCase.InvitedEmailMismatch: { - title = _t("This invite to %(roomName)s wasn't sent to your account", - {roomName: this._roomName()}); - const joinRule = this._joinRule(); - if (joinRule === "public") { - subTitle = _t("You can still join it because this is a public room."); - primaryActionLabel = _t("Join the discussion"); - primaryActionHandler = this.props.onJoinClick; - } else { - subTitle = _t( - "Sign in with a different account, ask for another invite, or " + - "add the e-mail address %(email)s to this account.", - {email: this.props.invitedEmail}, - ); - if (joinRule !== "invite") { - primaryActionLabel = _t("Try to join anyway"); - primaryActionHandler = this.props.onJoinClick; - } - } + title = _t( + "This invite to %(roomName)s was sent to %(email)s", + { + roomName: this._roomName(), + email: this.props.invitedEmail, + }, + ); + subTitle = _t( + "Share this email in Settings to receive invites directly in Riot.", + ); + primaryActionLabel = _t("Join the discussion"); + primaryActionHandler = this.props.onJoinClick; break; } case MessageCase.Invite: { diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 2498b018e3..01a9420aca 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -895,13 +895,17 @@ "Re-join": "Re-join", "You were banned from %(roomName)s by %(memberName)s": "You were banned from %(roomName)s by %(memberName)s", "Something went wrong with your invite to %(roomName)s": "Something went wrong with your invite to %(roomName)s", - "%(errcode)s was returned while trying to valide your invite. You could try to pass this information on to a room admin.": "%(errcode)s was returned while trying to valide your invite. You could try to pass this information on to a room admin.", + "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.": "An error (%(errcode)s) was returned while trying to validate your invite. You could try to pass this information on to a room admin.", + "unknown error code": "unknown error code", "You can only join it with a working invite.": "You can only join it with a working invite.", + "Try to join anyway": "Try to join anyway", "You can still join it because this is a public room.": "You can still join it because this is a public room.", "Join the discussion": "Join the discussion", - "Try to join anyway": "Try to join anyway", - "This invite to %(roomName)s wasn't sent to your account": "This invite to %(roomName)s wasn't sent to your account", - "Sign in with a different account, ask for another invite, or add the e-mail address %(email)s to this account.": "Sign in with a different account, ask for another invite, or add the e-mail address %(email)s to this account.", + "This invite to %(roomName)s was sent to %(email)s which is not associated with your account": "This invite to %(roomName)s was sent to %(email)s which is not associated with your account", + "Link this email with your account in Settings to receive invites directly in Riot.": "Link this email with your account in Settings to receive invites directly in Riot.", + "This invite to %(roomName)s was sent to %(email)s": "This invite to %(roomName)s was sent to %(email)s", + "Use an identity server in Settings to receive invites directly in Riot.": "Use an identity server in Settings to receive invites directly in Riot.", + "Share this email in Settings to receive invites directly in Riot.": "Share this email in Settings to receive invites directly in Riot.", "Do you want to chat with %(user)s?": "Do you want to chat with %(user)s?", "Do you want to join %(roomName)s?": "Do you want to join %(roomName)s?", " invited you": " invited you", @@ -1402,7 +1406,6 @@ "Collapse Reply Thread": "Collapse Reply Thread", "End-to-end encryption information": "End-to-end encryption information", "Failed to set Direct Message status of room": "Failed to set Direct Message status of room", - "unknown error code": "unknown error code", "Failed to forget room %(errCode)s": "Failed to forget room %(errCode)s", "All messages (noisy)": "All messages (noisy)", "All messages": "All messages",