From 9885ab938ea7ac6b62c4b725ce112a1c315e0182 Mon Sep 17 00:00:00 2001
From: Kerry Archibald <kerrya@element.io>
Date: Tue, 14 Feb 2023 17:35:21 +1300
Subject: [PATCH] decrypt poll relations before processing

---
 spec/unit/models/poll.spec.ts | 4 ++++
 src/models/poll.ts            | 3 +++
 2 files changed, 7 insertions(+)

diff --git a/spec/unit/models/poll.spec.ts b/spec/unit/models/poll.spec.ts
index 9ca3df7a2fa..245d5646501 100644
--- a/spec/unit/models/poll.spec.ts
+++ b/spec/unit/models/poll.spec.ts
@@ -20,6 +20,7 @@ import { M_POLL_END, M_POLL_KIND_DISCLOSED, M_POLL_RESPONSE } from "../../../src
 import { PollStartEvent } from "../../../src/extensible_events_v1/PollStartEvent";
 import { Poll } from "../../../src/models/poll";
 import { getMockClientWithEventEmitter, mockClientMethodsUser } from "../../test-utils/client";
+import { flushPromises } from "../../test-utils/flushPromises";
 
 jest.useFakeTimers();
 
@@ -27,6 +28,7 @@ describe("Poll", () => {
     const userId = "@alice:server.org";
     const mockClient = getMockClientWithEventEmitter({
         ...mockClientMethodsUser(userId),
+        decryptEventIfNeeded: jest.fn().mockResolvedValue(true),
         relations: jest.fn(),
     });
     const roomId = "!room:server";
@@ -172,6 +174,8 @@ describe("Poll", () => {
                 jest.spyOn(poll, "emit");
                 const responses = await poll.getResponses();
 
+                await flushPromises();
+
                 expect(mockClient.relations.mock.calls).toEqual([
                     [roomId, basePollStartEvent.getId(), "m.reference", undefined, { from: undefined }],
                     [roomId, basePollStartEvent.getId(), "m.reference", undefined, { from: "test-next-1" }],
diff --git a/src/models/poll.ts b/src/models/poll.ts
index 7c5d245f7e7..8a080ef9015 100644
--- a/src/models/poll.ts
+++ b/src/models/poll.ts
@@ -149,11 +149,14 @@ export class Poll extends TypedEventEmitter<Exclude<PollEvent, PollEvent.New>, P
             },
         );
 
+        await Promise.all(allRelations.events.map((event) => this.matrixClient.decryptEventIfNeeded(event)));
+
         const responses =
             this.responses ||
             new Relations("m.reference", M_POLL_RESPONSE.name, this.matrixClient, [M_POLL_RESPONSE.altName!]);
 
         const pollEndEvent = allRelations.events.find((event) => M_POLL_END.matches(event.getType()));
+
         if (this.validateEndEvent(pollEndEvent)) {
             this.endEvent = pollEndEvent;
             this.refilterResponsesOnEnd();