diff --git a/core/conversations/src/context.rs b/core/conversations/src/context.rs index cff118e..e35b68d 100644 --- a/core/conversations/src/context.rs +++ b/core/conversations/src/context.rs @@ -6,7 +6,7 @@ use double_ratchets::{RatchetState, restore_ratchet_state}; use storage::{ChatStore, ConversationKind, ConversationMeta}; use crate::{ - conversation::{ConversationId, Convo, Id, PrivateV1Convo}, + conversation::{Conversation, ConversationId, Convo, Id, PrivateV1Convo}, errors::ChatError, inbox::Inbox, proto::{EncryptedPayload, EnvelopeV1, Message}, @@ -148,7 +148,10 @@ impl Context { let (convo, content) = self.inbox.handle_frame(&ephemeral_key, enc_payload)?; - self.persist_convo(&convo)?; + match convo { + Conversation::Private(convo) => self.persist_convo(&convo)?, + }; + self.store.remove_ephemeral_key(&key_hex)?; Ok(content) } diff --git a/core/conversations/src/conversation.rs b/core/conversations/src/conversation.rs index 041541a..2c058dd 100644 --- a/core/conversations/src/conversation.rs +++ b/core/conversations/src/conversation.rs @@ -1,8 +1,13 @@ +mod privatev1; + +use crate::types::{AddressedEncryptedPayload, ContentData}; +use chat_proto::logoschat::encryption::EncryptedPayload; use std::fmt::Debug; use std::sync::Arc; +use storage::ConversationKind; pub use crate::errors::ChatError; -use crate::types::{AddressedEncryptedPayload, ContentData}; +pub use privatev1::PrivateV1Convo; pub type ConversationId<'a> = &'a str; pub type ConversationIdOwned = Arc; @@ -31,8 +36,6 @@ pub trait Convo: Id + Debug { fn convo_type(&self) -> ConversationKind; } -mod privatev1; - -use chat_proto::logoschat::encryption::EncryptedPayload; -pub use privatev1::PrivateV1Convo; -use storage::ConversationKind; +pub enum Conversation { + Private(PrivateV1Convo), +} diff --git a/core/conversations/src/conversation/privatev1.rs b/core/conversations/src/conversation/privatev1.rs index 5d2cf3c..f2f8a22 100644 --- a/core/conversations/src/conversation/privatev1.rs +++ b/core/conversations/src/conversation/privatev1.rs @@ -169,7 +169,7 @@ impl PrivateV1Convo { }) } - pub fn save_ratchet_state(&self, storage: &mut dyn RatchetStore) -> Result<(), ChatError> { + pub fn save_ratchet_state(&self, storage: &mut T) -> Result<(), ChatError> { let record = to_ratchet_record(&self.dr_state); let skipped_keys = to_skipped_key_records(&self.dr_state.skipped_keys()); storage.save_ratchet_state(&self.local_convo_id, &record, &skipped_keys)?; diff --git a/core/conversations/src/inbox/handler.rs b/core/conversations/src/inbox/handler.rs index 33dd52b..b9e1126 100644 --- a/core/conversations/src/inbox/handler.rs +++ b/core/conversations/src/inbox/handler.rs @@ -8,7 +8,7 @@ use std::rc::Rc; use crypto::{PrekeyBundle, SymmetricKey32}; use crate::context::Introduction; -use crate::conversation::{ChatError, ConversationId, Convo, Id, PrivateV1Convo}; +use crate::conversation::{ChatError, Conversation, ConversationId, Convo, Id, PrivateV1Convo}; use crate::crypto::{CopyBytes, PrivateKey, PublicKey}; use crate::inbox::handshake::InboxHandshake; use crate::proto; @@ -115,7 +115,7 @@ impl Inbox { &self, ephemeral_key: &PrivateKey, enc_payload: EncryptedPayload, - ) -> Result<(PrivateV1Convo, Option), ChatError> { + ) -> Result<(Conversation, Option), ChatError> { let handshake = Self::extract_payload(enc_payload)?; let header = handshake @@ -142,7 +142,7 @@ impl Inbox { None => return Err(ChatError::Protocol("expected contentData".into())), }; - Ok((convo, Some(content))) + Ok((Conversation::Private(convo), Some(content))) } } }