fix crash on membership change with invalid data (#2182)
authorAjay Bura <32841439+ajbura@users.noreply.github.com>
Sun, 26 Jan 2025 11:53:16 +0000 (22:53 +1100)
committerGitHub <noreply@github.com>
Sun, 26 Jan 2025 11:53:16 +0000 (22:53 +1100)
* fix membership change with  invalid data crash

* add more checks around membership change

* fix displayname condition

src/app/hooks/useMemberEventParser.tsx

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