fix crash on membership change with invalid data (#2182)

* fix membership change with  invalid data crash

* add more checks around membership change

* fix displayname condition
This commit is contained in:
Ajay Bura 2025-01-26 22:53:16 +11:00 committed by GitHub
parent d5766b58fe
commit 8e4475bb56
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -18,6 +18,7 @@ export const useMemberEventParser = (): MemberEventParser => {
const prevContent = mEvent.getPrevContent() as IMemberContent; const prevContent = mEvent.getPrevContent() as IMemberContent;
const senderId = mEvent.getSender(); const senderId = mEvent.getSender();
const userId = mEvent.getStateKey(); const userId = mEvent.getStateKey();
const reason = typeof content.reason === 'string' ? content.reason : undefined;
if (!senderId || !userId) if (!senderId || !userId)
return { return {
@ -26,7 +27,10 @@ export const useMemberEventParser = (): MemberEventParser => {
}; };
const senderName = getMxIdLocalPart(senderId); const senderName = getMxIdLocalPart(senderId);
const userName = content.displayname || getMxIdLocalPart(userId); const userName =
typeof content.displayname === 'string'
? content.displayname || getMxIdLocalPart(userId)
: getMxIdLocalPart(userId);
if (isMembershipChanged(mEvent)) { if (isMembershipChanged(mEvent)) {
if (content.membership === Membership.Invite) { if (content.membership === Membership.Invite) {
@ -39,7 +43,7 @@ export const useMemberEventParser = (): MemberEventParser => {
{' accepted '} {' accepted '}
<b>{userName}</b> <b>{userName}</b>
{`'s join request `} {`'s join request `}
{content.reason} {reason}
</> </>
), ),
}; };
@ -51,7 +55,7 @@ export const useMemberEventParser = (): MemberEventParser => {
<> <>
<b>{senderName}</b> <b>{senderName}</b>
{' invited '} {' invited '}
<b>{userName}</b> {content.reason} <b>{userName}</b> {reason}
</> </>
), ),
}; };
@ -64,7 +68,7 @@ export const useMemberEventParser = (): MemberEventParser => {
<> <>
<b>{userName}</b> <b>{userName}</b>
{' request to join room '} {' request to join room '}
{content.reason} {reason}
</> </>
), ),
}; };
@ -91,7 +95,7 @@ export const useMemberEventParser = (): MemberEventParser => {
<> <>
<b>{userName}</b> <b>{userName}</b>
{' rejected the invitation '} {' rejected the invitation '}
{content.reason} {reason}
</> </>
) : ( ) : (
<> <>
@ -99,7 +103,7 @@ export const useMemberEventParser = (): MemberEventParser => {
{' rejected '} {' rejected '}
<b>{userName}</b> <b>{userName}</b>
{`'s join request `} {`'s join request `}
{content.reason} {reason}
</> </>
), ),
}; };
@ -113,7 +117,7 @@ export const useMemberEventParser = (): MemberEventParser => {
<> <>
<b>{userName}</b> <b>{userName}</b>
{' revoked joined request '} {' revoked joined request '}
{content.reason} {reason}
</> </>
) : ( ) : (
<> <>
@ -121,7 +125,7 @@ export const useMemberEventParser = (): MemberEventParser => {
{' revoked '} {' revoked '}
<b>{userName}</b> <b>{userName}</b>
{`'s invite `} {`'s invite `}
{content.reason} {reason}
</> </>
), ),
}; };
@ -134,7 +138,7 @@ export const useMemberEventParser = (): MemberEventParser => {
<> <>
<b>{senderName}</b> <b>{senderName}</b>
{' unbanned '} {' unbanned '}
<b>{userName}</b> {content.reason} <b>{userName}</b> {reason}
</> </>
), ),
}; };
@ -147,13 +151,13 @@ export const useMemberEventParser = (): MemberEventParser => {
<> <>
<b>{userName}</b> <b>{userName}</b>
{' left the room '} {' left the room '}
{content.reason} {reason}
</> </>
) : ( ) : (
<> <>
<b>{senderName}</b> <b>{senderName}</b>
{' kicked '} {' kicked '}
<b>{userName}</b> {content.reason} <b>{userName}</b> {reason}
</> </>
), ),
}; };
@ -166,7 +170,7 @@ export const useMemberEventParser = (): MemberEventParser => {
<> <>
<b>{senderName}</b> <b>{senderName}</b>
{' banned '} {' banned '}
<b>{userName}</b> {content.reason} <b>{userName}</b> {reason}
</> </>
), ),
}; };
@ -174,44 +178,49 @@ export const useMemberEventParser = (): MemberEventParser => {
} }
if (content.displayname !== prevContent.displayname) { if (content.displayname !== prevContent.displayname) {
const prevUserName = prevContent.displayname || userId; const prevUserName =
typeof prevContent.displayname === 'string'
? prevContent.displayname || getMxIdLocalPart(userId)
: getMxIdLocalPart(userId);
return { return {
icon: Icons.Mention, icon: Icons.Mention,
body: content.displayname ? ( body:
<> typeof content.displayname === 'string' ? (
<b>{prevUserName}</b> <>
{' changed display name to '} <b>{prevUserName}</b>
<b>{userName}</b> {' changed display name to '}
</> <b>{userName}</b>
) : ( </>
<> ) : (
<b>{prevUserName}</b> <>
{' removed their display name '} <b>{prevUserName}</b>
</> {' removed their display name '}
), </>
),
}; };
} }
if (content.avatar_url !== prevContent.avatar_url) { if (content.avatar_url !== prevContent.avatar_url) {
return { return {
icon: Icons.User, icon: Icons.User,
body: content.displayname ? ( body:
<> content.avatar_url && typeof content.avatar_url === 'string' ? (
<b>{userName}</b> <>
{' changed their avatar'} <b>{userName}</b>
</> {' changed their avatar'}
) : ( </>
<> ) : (
<b>{userName}</b> <>
{' removed their avatar '} <b>{userName}</b>
</> {' removed their avatar '}
), </>
),
}; };
} }
return { return {
icon: Icons.User, icon: Icons.User,
body: 'Broken membership event', body: 'Membership event with no changes',
}; };
}; };