events: Fix deserialization of AnyGlobalAccountDataEvent for variants with type fragment
This commit is contained in:
		
							parent
							
								
									ceba4586d6
								
							
						
					
					
						commit
						00a17dbe9d
					
				| @ -1,5 +1,10 @@ | |||||||
| # [unreleased] | # [unreleased] | ||||||
| 
 | 
 | ||||||
|  | Bug fixes: | ||||||
|  | 
 | ||||||
|  | - Fix deserialization of `AnyGlobalAccountDataEvent` for variants with a type | ||||||
|  |   fragment. | ||||||
|  | 
 | ||||||
| Improvements: | Improvements: | ||||||
| 
 | 
 | ||||||
|  - Add support for encrypted stickers as sent by several bridges under the flag `compat-encrypted-stickers` |  - Add support for encrypted stickers as sent by several bridges under the flag `compat-encrypted-stickers` | ||||||
|  | |||||||
| @ -182,7 +182,7 @@ mod tests { | |||||||
|         PassPhrase, SecretStorageEncryptionAlgorithm, SecretStorageKeyEventContent, |         PassPhrase, SecretStorageEncryptionAlgorithm, SecretStorageKeyEventContent, | ||||||
|         SecretStorageV1AesHmacSha2Properties, |         SecretStorageV1AesHmacSha2Properties, | ||||||
|     }; |     }; | ||||||
|     use crate::{EventContentFromType, GlobalAccountDataEvent}; |     use crate::{AnyGlobalAccountDataEvent, EventContentFromType, GlobalAccountDataEvent}; | ||||||
| 
 | 
 | ||||||
|     #[test] |     #[test] | ||||||
|     fn key_description_serialization() { |     fn key_description_serialization() { | ||||||
| @ -326,7 +326,7 @@ mod tests { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     #[test] |     #[test] | ||||||
|     fn event_serialization() { |     fn event_content_serialization() { | ||||||
|         let mut content = SecretStorageKeyEventContent::new( |         let mut content = SecretStorageKeyEventContent::new( | ||||||
|             "my_key_id".into(), |             "my_key_id".into(), | ||||||
|             SecretStorageEncryptionAlgorithm::V1AesHmacSha2(SecretStorageV1AesHmacSha2Properties { |             SecretStorageEncryptionAlgorithm::V1AesHmacSha2(SecretStorageV1AesHmacSha2Properties { | ||||||
| @ -346,6 +346,31 @@ mod tests { | |||||||
|         assert_eq!(to_json_value(&content).unwrap(), json); |         assert_eq!(to_json_value(&content).unwrap(), json); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     #[test] | ||||||
|  |     fn event_serialization() { | ||||||
|  |         let mut content = SecretStorageKeyEventContent::new( | ||||||
|  |             "my_key_id".into(), | ||||||
|  |             SecretStorageEncryptionAlgorithm::V1AesHmacSha2(SecretStorageV1AesHmacSha2Properties { | ||||||
|  |                 iv: Some(Base64::parse("YWJjZGVmZ2hpamtsbW5vcA").unwrap()), | ||||||
|  |                 mac: Some(Base64::parse("aWRvbnRrbm93d2hhdGFtYWNsb29rc2xpa2U").unwrap()), | ||||||
|  |             }), | ||||||
|  |         ); | ||||||
|  |         content.name = Some("my_key".to_owned()); | ||||||
|  |         let event = GlobalAccountDataEvent { content }; | ||||||
|  | 
 | ||||||
|  |         let json = json!({ | ||||||
|  |             "type": "m.secret_storage.key.my_key_id", | ||||||
|  |             "content": { | ||||||
|  |                 "name": "my_key", | ||||||
|  |                 "algorithm": "m.secret_storage.v1.aes-hmac-sha2", | ||||||
|  |                 "iv": "YWJjZGVmZ2hpamtsbW5vcA", | ||||||
|  |                 "mac": "aWRvbnRrbm93d2hhdGFtYWNsb29rc2xpa2U" | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|  |         assert_eq!(to_json_value(&event).unwrap(), json); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     #[test] |     #[test] | ||||||
|     fn event_deserialization() { |     fn event_deserialization() { | ||||||
|         let json = json!({ |         let json = json!({ | ||||||
| @ -358,8 +383,8 @@ mod tests { | |||||||
|             } |             } | ||||||
|         }); |         }); | ||||||
| 
 | 
 | ||||||
|         let ev = |         let any_ev = from_json_value::<AnyGlobalAccountDataEvent>(json).unwrap(); | ||||||
|             from_json_value::<GlobalAccountDataEvent<SecretStorageKeyEventContent>>(json).unwrap(); |         assert_matches!(any_ev, AnyGlobalAccountDataEvent::SecretStorageKey(ev)); | ||||||
|         assert_eq!(ev.content.key_id, "my_key_id"); |         assert_eq!(ev.content.key_id, "my_key_id"); | ||||||
|         assert_eq!(ev.content.name.unwrap(), "my_key"); |         assert_eq!(ev.content.name.unwrap(), "my_key"); | ||||||
|         assert_matches!(ev.content.passphrase, None); |         assert_matches!(ev.content.passphrase, None); | ||||||
|  | |||||||
| @ -170,7 +170,17 @@ fn expand_deserialize_impl( | |||||||
|             }; |             }; | ||||||
|             let self_variant = variant.ctor(quote! { Self }); |             let self_variant = variant.ctor(quote! { Self }); | ||||||
|             let content = event.to_event_path(kind, var); |             let content = event.to_event_path(kind, var); | ||||||
|             let ev_types = event.aliases.iter().chain([&event.ev_type]); |             let ev_types = event.aliases.iter().chain([&event.ev_type]).map(|ev_type| { | ||||||
|  |                 if event.has_type_fragment() { | ||||||
|  |                     let ev_type = ev_type.value(); | ||||||
|  |                     let prefix = ev_type | ||||||
|  |                         .strip_suffix('*') | ||||||
|  |                         .expect("event type with type fragment must end with *"); | ||||||
|  |                     quote! { t if t.starts_with(#prefix) } | ||||||
|  |                 } else { | ||||||
|  |                     quote! { #ev_type } | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
| 
 | 
 | ||||||
|             Ok(quote! { |             Ok(quote! { | ||||||
|                 #variant_attrs #(#ev_types)|* => { |                 #variant_attrs #(#ev_types)|* => { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user