@@ -551,6 +551,102 @@ func (c *JSClient) GetEvent(t ct.TestLike, roomID, eventID string) (*api.Event,
551551 return ev , nil
552552}
553553
554+ func (c * JSClient ) GetEventShield (t ct.TestLike , roomID , eventID string ) (* api.EventShield , error ) {
555+ t .Helper ()
556+ // Serialized output:
557+ //
558+ // {
559+ // shieldColour: 0 | 1 | 2, // NONE | GREY | RED
560+ // shieldReason: 0 ... 7
561+ // }
562+ encryptionInfoSerialised , err := chrome .RunAsyncFn [string ](t , c .browser .Ctx , fmt .Sprintf (`
563+ const ev = window.__client.getRoom("%s")?.getLiveTimeline()?.getEvents().filter((ev, i) => {
564+ return ev.getId() === "%s";
565+ })[0];
566+ const encryptionInfo = await window.__client.getCrypto().getEncryptionInfoForEvent(ev);
567+ return JSON.stringify(encryptionInfo);
568+ ` , roomID , eventID ))
569+ if err != nil {
570+ return nil , fmt .Errorf ("failed to get shield for event %s: %s" , eventID , err )
571+ }
572+
573+ var encryptionInfo struct {
574+ ShieldColour uint `json:"shieldColour"`
575+ ShieldReason uint `json:"shieldReason"`
576+ }
577+
578+ if err := json .Unmarshal ([]byte (* encryptionInfoSerialised ), & encryptionInfo ); err != nil {
579+ return nil , fmt .Errorf ("failed to unmarshal encryption info: %s" , err )
580+ }
581+
582+ if encryptionInfo .ShieldColour == 0 {
583+ // No shield
584+ return nil , nil
585+ }
586+
587+ var eventShield api.EventShield
588+ switch encryptionInfo .ShieldColour {
589+ case 1 :
590+ eventShield .Colour = "grey"
591+ case 2 :
592+ eventShield .Colour = "red"
593+ default :
594+ return nil , fmt .Errorf ("unknown shield colour: %d" , encryptionInfo .ShieldColour )
595+ }
596+
597+ switch encryptionInfo .ShieldReason {
598+ case 0 :
599+ /** An unknown reason from the crypto library (if you see this, it is a bug in matrix-js-sdk). */
600+ eventShield .Code = "Unknown"
601+
602+ case 1 :
603+ /** "Encrypted by an unverified user." */
604+ eventShield .Code = "UnverifiedIdentity"
605+
606+ case 2 :
607+ /** "Encrypted by a device not verified by its owner." */
608+ eventShield .Code = "UnsignedDevice"
609+
610+ case 3 :
611+ /** "Encrypted by an unknown or deleted device." */
612+ eventShield .Code = "UnknownDevice"
613+
614+ case 4 :
615+ /**
616+ * "The authenticity of this encrypted message can't be guaranteed on this device."
617+ *
618+ * i.e.: the key has been forwarded, or retrieved from an insecure backup.
619+ */
620+ eventShield .Code = "AuthenticityNotGuaranteed"
621+
622+ case 5 :
623+ /**
624+ * The (deprecated) sender_key field in the event does not match the Ed25519 key of the device that sent us the
625+ * decryption keys.
626+ *
627+ * No longer used with rust crypto stack, since it doesn't check the sender_key field.
628+ */
629+ eventShield .Code = "MismatchedSenderKey"
630+
631+ case 6 :
632+ /**
633+ * The event was sent unencrypted in an encrypted room.
634+ */
635+ eventShield .Code = "SentInClear"
636+
637+ case 7 :
638+ /**
639+ * The sender was previously verified but changed their identity.
640+ */
641+ eventShield .Code = "VerificationViolation"
642+
643+ default :
644+ return nil , fmt .Errorf ("unknown shield reason code: %d" , encryptionInfo .ShieldReason )
645+ }
646+
647+ return & eventShield , nil
648+ }
649+
554650// StartSyncing to begin syncing from sync v2 / sliding sync.
555651// Tests should call stopSyncing() at the end of the test.
556652func (c * JSClient ) StartSyncing (t ct.TestLike ) (stopSyncing func (), err error ) {
0 commit comments