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",