crypto: Put the user id and device id into the account.

master
Damir Jelić 2020-07-10 15:43:32 +02:00
parent 4ee245dcce
commit 58d79ca9c6
3 changed files with 73 additions and 42 deletions

View File

@ -111,11 +111,11 @@ impl OlmMachine {
/// * `user_id` - The unique id of the user that owns this machine. /// * `user_id` - The unique id of the user that owns this machine.
/// ///
/// * `device_id` - The unique id of the device that owns this machine. /// * `device_id` - The unique id of the device that owns this machine.
pub fn new(user_id: &UserId, device_id: &str) -> Self { pub fn new(user_id: &UserId, device_id: &DeviceId) -> Self {
OlmMachine { OlmMachine {
user_id: user_id.clone(), user_id: user_id.clone(),
device_id: device_id.to_owned(), device_id: device_id.to_owned(),
account: Account::new(), account: Account::new(user_id, &device_id),
uploaded_signed_key_count: None, uploaded_signed_key_count: None,
store: Box::new(MemoryStore::new()), store: Box::new(MemoryStore::new()),
outbound_group_sessions: HashMap::new(), outbound_group_sessions: HashMap::new(),
@ -151,13 +151,13 @@ impl OlmMachine {
} }
None => { None => {
debug!("Creating a new account"); debug!("Creating a new account");
Account::new() Account::new(&user_id, &device_id)
} }
}; };
Ok(OlmMachine { Ok(OlmMachine {
user_id: user_id.clone(), user_id,
device_id: device_id.to_owned(), device_id,
account, account,
uploaded_signed_key_count: None, uploaded_signed_key_count: None,
store, store,
@ -1554,7 +1554,6 @@ impl OlmMachine {
#[cfg(test)] #[cfg(test)]
mod test { mod test {
static USER_ID: &str = "@bob:example.org"; static USER_ID: &str = "@bob:example.org";
static DEVICE_ID: &str = "DEVICEID";
use matrix_sdk_common::js_int::UInt; use matrix_sdk_common::js_int::UInt;
use std::collections::BTreeMap; use std::collections::BTreeMap;
@ -1631,7 +1630,7 @@ mod test {
} }
async fn get_prepared_machine() -> (OlmMachine, OneTimeKeys) { async fn get_prepared_machine() -> (OlmMachine, OneTimeKeys) {
let mut machine = OlmMachine::new(&user_id(), DEVICE_ID); let mut machine = OlmMachine::new(&user_id(), &alice_device_id());
machine.uploaded_signed_key_count = Some(AtomicU64::new(0)); machine.uploaded_signed_key_count = Some(AtomicU64::new(0));
let (_, otk) = machine let (_, otk) = machine
.keys_for_upload() .keys_for_upload()
@ -1731,13 +1730,13 @@ mod test {
#[tokio::test] #[tokio::test]
async fn create_olm_machine() { async fn create_olm_machine() {
let machine = OlmMachine::new(&user_id(), DEVICE_ID); let machine = OlmMachine::new(&user_id(), &alice_device_id());
assert!(machine.should_upload_keys().await); assert!(machine.should_upload_keys().await);
} }
#[tokio::test] #[tokio::test]
async fn receive_keys_upload_response() { async fn receive_keys_upload_response() {
let mut machine = OlmMachine::new(&user_id(), DEVICE_ID); let mut machine = OlmMachine::new(&user_id(), &alice_device_id());
let mut response = keys_upload_response(); let mut response = keys_upload_response();
response response
@ -1775,7 +1774,7 @@ mod test {
#[tokio::test] #[tokio::test]
async fn generate_one_time_keys() { async fn generate_one_time_keys() {
let mut machine = OlmMachine::new(&user_id(), DEVICE_ID); let mut machine = OlmMachine::new(&user_id(), &alice_device_id());
let mut response = keys_upload_response(); let mut response = keys_upload_response();
@ -1802,7 +1801,7 @@ mod test {
#[tokio::test] #[tokio::test]
async fn test_device_key_signing() { async fn test_device_key_signing() {
let machine = OlmMachine::new(&user_id(), DEVICE_ID); let machine = OlmMachine::new(&user_id(), &alice_device_id());
let mut device_keys = machine.device_keys().await; let mut device_keys = machine.device_keys().await;
let identity_keys = machine.account.identity_keys(); let identity_keys = machine.account.identity_keys();
@ -1819,7 +1818,7 @@ mod test {
#[tokio::test] #[tokio::test]
async fn tests_session_invalidation() { async fn tests_session_invalidation() {
let mut machine = OlmMachine::new(&user_id(), DEVICE_ID); let mut machine = OlmMachine::new(&user_id(), &alice_device_id());
let room_id = RoomId::try_from("!test:example.org").unwrap(); let room_id = RoomId::try_from("!test:example.org").unwrap();
machine machine
@ -1835,7 +1834,7 @@ mod test {
#[tokio::test] #[tokio::test]
async fn test_invalid_signature() { async fn test_invalid_signature() {
let machine = OlmMachine::new(&user_id(), DEVICE_ID); let machine = OlmMachine::new(&user_id(), &alice_device_id());
let mut device_keys = machine.device_keys().await; let mut device_keys = machine.device_keys().await;
@ -1850,7 +1849,7 @@ mod test {
#[tokio::test] #[tokio::test]
async fn test_one_time_key_signing() { async fn test_one_time_key_signing() {
let mut machine = OlmMachine::new(&user_id(), DEVICE_ID); let mut machine = OlmMachine::new(&user_id(), &alice_device_id());
machine.uploaded_signed_key_count = Some(AtomicU64::new(49)); machine.uploaded_signed_key_count = Some(AtomicU64::new(49));
let mut one_time_keys = machine.signed_one_time_keys().await.unwrap(); let mut one_time_keys = machine.signed_one_time_keys().await.unwrap();
@ -1870,7 +1869,7 @@ mod test {
#[tokio::test] #[tokio::test]
async fn test_keys_for_upload() { async fn test_keys_for_upload() {
let mut machine = OlmMachine::new(&user_id(), DEVICE_ID); let mut machine = OlmMachine::new(&user_id(), &alice_device_id());
machine.uploaded_signed_key_count = Some(AtomicU64::default()); machine.uploaded_signed_key_count = Some(AtomicU64::default());
let identity_keys = machine.account.identity_keys(); let identity_keys = machine.account.identity_keys();

View File

@ -35,7 +35,7 @@ pub use olm_rs::{
}; };
use matrix_sdk_common::api::r0::keys::SignedKey; use matrix_sdk_common::api::r0::keys::SignedKey;
use matrix_sdk_common::identifiers::RoomId; use matrix_sdk_common::identifiers::{DeviceId, RoomId, UserId};
/// Account holding identity keys for which sessions can be created. /// Account holding identity keys for which sessions can be created.
/// ///
@ -43,6 +43,8 @@ use matrix_sdk_common::identifiers::RoomId;
/// devices. /// devices.
#[derive(Clone)] #[derive(Clone)]
pub struct Account { pub struct Account {
user_id: Arc<UserId>,
device_id: Arc<DeviceId>,
inner: Arc<Mutex<OlmAccount>>, inner: Arc<Mutex<OlmAccount>>,
identity_keys: Arc<IdentityKeys>, identity_keys: Arc<IdentityKeys>,
shared: Arc<AtomicBool>, shared: Arc<AtomicBool>,
@ -58,20 +60,15 @@ impl fmt::Debug for Account {
} }
} }
// #[cfg_attr(tarpaulin, skip)]
impl Default for Account {
fn default() -> Self {
Self::new()
}
}
impl Account { impl Account {
/// Create a fresh new account, this will generate the identity key-pair. /// Create a fresh new account, this will generate the identity key-pair.
pub fn new() -> Self { pub fn new(user_id: &UserId, device_id: &DeviceId) -> Self {
let account = OlmAccount::new(); let account = OlmAccount::new();
let identity_keys = account.parsed_identity_keys(); let identity_keys = account.parsed_identity_keys();
Account { Account {
user_id: Arc::new(user_id.to_owned()),
device_id: Arc::new(device_id.to_owned()),
inner: Arc::new(Mutex::new(account)), inner: Arc::new(Mutex::new(account)),
identity_keys: Arc::new(identity_keys), identity_keys: Arc::new(identity_keys),
shared: Arc::new(AtomicBool::new(false)), shared: Arc::new(AtomicBool::new(false)),
@ -150,11 +147,15 @@ impl Account {
pickle: String, pickle: String,
pickle_mode: PicklingMode, pickle_mode: PicklingMode,
shared: bool, shared: bool,
user_id: &UserId,
device_id: &DeviceId,
) -> Result<Self, OlmAccountError> { ) -> Result<Self, OlmAccountError> {
let account = OlmAccount::unpickle(pickle, pickle_mode)?; let account = OlmAccount::unpickle(pickle, pickle_mode)?;
let identity_keys = account.parsed_identity_keys(); let identity_keys = account.parsed_identity_keys();
Ok(Account { Ok(Account {
user_id: Arc::new(user_id.to_owned()),
device_id: Arc::new(device_id.to_owned()),
inner: Arc::new(Mutex::new(account)), inner: Arc::new(Mutex::new(account)),
identity_keys: Arc::new(identity_keys), identity_keys: Arc::new(identity_keys),
shared: Arc::new(AtomicBool::from(shared)), shared: Arc::new(AtomicBool::from(shared)),
@ -659,15 +660,30 @@ impl std::fmt::Debug for OutboundGroupSession {
pub(crate) mod test { pub(crate) mod test {
use crate::olm::{Account, InboundGroupSession, OutboundGroupSession, Session}; use crate::olm::{Account, InboundGroupSession, OutboundGroupSession, Session};
use matrix_sdk_common::api::r0::keys::SignedKey; use matrix_sdk_common::api::r0::keys::SignedKey;
use matrix_sdk_common::identifiers::RoomId; use matrix_sdk_common::identifiers::{DeviceId, RoomId, UserId};
use olm_rs::session::OlmMessage; use olm_rs::session::OlmMessage;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::convert::TryFrom; use std::convert::TryFrom;
pub(crate) async fn get_account_and_session() -> (Account, Session) { fn alice_id() -> UserId {
let alice = Account::new(); UserId::try_from("@alice:example.org").unwrap()
}
let bob = Account::new(); fn alice_device_id() -> DeviceId {
"ALICEDEVICE".to_string()
}
fn bob_id() -> UserId {
UserId::try_from("@bob:example.org").unwrap()
}
fn bob_device_id() -> DeviceId {
"BOBDEVICE".to_string()
}
pub(crate) async fn get_account_and_session() -> (Account, Session) {
let alice = Account::new(&alice_id(), &alice_device_id());
let bob = Account::new(&bob_id(), &bob_device_id());
bob.generate_one_time_keys(1).await; bob.generate_one_time_keys(1).await;
let one_time_key = bob let one_time_key = bob
@ -694,7 +710,7 @@ pub(crate) mod test {
#[test] #[test]
fn account_creation() { fn account_creation() {
let account = Account::new(); let account = Account::new(&alice_id(), &alice_device_id());
let identyty_keys = account.identity_keys(); let identyty_keys = account.identity_keys();
assert!(!account.shared()); assert!(!account.shared());
@ -715,7 +731,7 @@ pub(crate) mod test {
#[tokio::test] #[tokio::test]
async fn one_time_keys_creation() { async fn one_time_keys_creation() {
let account = Account::new(); let account = Account::new(&alice_id(), &alice_device_id());
let one_time_keys = account.one_time_keys().await; let one_time_keys = account.one_time_keys().await;
assert!(one_time_keys.curve25519().is_empty()); assert!(one_time_keys.curve25519().is_empty());
@ -742,8 +758,8 @@ pub(crate) mod test {
#[tokio::test] #[tokio::test]
async fn session_creation() { async fn session_creation() {
let alice = Account::new(); let alice = Account::new(&alice_id(), &alice_device_id());
let bob = Account::new(); let bob = Account::new(&bob_id(), &bob_device_id());
let alice_keys = alice.identity_keys(); let alice_keys = alice.identity_keys();
alice.generate_one_time_keys(1).await; alice.generate_one_time_keys(1).await;
let one_time_keys = alice.one_time_keys().await; let one_time_keys = alice.one_time_keys().await;

View File

@ -35,7 +35,7 @@ use matrix_sdk_common::identifiers::{DeviceId, RoomId, UserId};
/// SQLite based implementation of a `CryptoStore`. /// SQLite based implementation of a `CryptoStore`.
pub struct SqliteStore { pub struct SqliteStore {
user_id: Arc<String>, user_id: Arc<UserId>,
device_id: Arc<String>, device_id: Arc<String>,
account_id: Option<i64>, account_id: Option<i64>,
path: PathBuf, path: PathBuf,
@ -117,7 +117,7 @@ impl SqliteStore {
let connection = SqliteConnection::connect(url.as_ref()).await?; let connection = SqliteConnection::connect(url.as_ref()).await?;
let store = SqliteStore { let store = SqliteStore {
user_id: Arc::new(user_id.to_string()), user_id: Arc::new(user_id.to_owned()),
device_id: Arc::new(device_id.to_owned()), device_id: Arc::new(device_id.to_owned()),
account_id: None, account_id: None,
sessions: SessionStore::new(), sessions: SessionStore::new(),
@ -568,7 +568,7 @@ impl CryptoStore for SqliteStore {
"SELECT id, pickle, shared FROM accounts "SELECT id, pickle, shared FROM accounts
WHERE user_id = ? and device_id = ?", WHERE user_id = ? and device_id = ?",
) )
.bind(&*self.user_id) .bind(self.user_id.as_str())
.bind(&*self.device_id) .bind(&*self.device_id)
.fetch_optional(&mut *connection) .fetch_optional(&mut *connection)
.await?; .await?;
@ -579,6 +579,8 @@ impl CryptoStore for SqliteStore {
pickle, pickle,
self.get_pickle_mode(), self.get_pickle_mode(),
shared, shared,
&self.user_id,
&self.device_id,
)?) )?)
} else { } else {
return Ok(None); return Ok(None);
@ -788,13 +790,12 @@ mod test {
use crate::device::test::get_device; use crate::device::test::get_device;
use crate::olm::GroupSessionKey; use crate::olm::GroupSessionKey;
use matrix_sdk_common::api::r0::keys::SignedKey; use matrix_sdk_common::api::r0::keys::SignedKey;
use matrix_sdk_common::identifiers::{DeviceId, UserId};
use olm_rs::outbound_group_session::OlmOutboundGroupSession; use olm_rs::outbound_group_session::OlmOutboundGroupSession;
use std::collections::BTreeMap; use std::collections::BTreeMap;
use tempfile::tempdir; use tempfile::tempdir;
use super::{ use super::{Account, CryptoStore, InboundGroupSession, RoomId, Session, SqliteStore, TryFrom};
Account, CryptoStore, InboundGroupSession, RoomId, Session, SqliteStore, TryFrom, UserId,
};
static USER_ID: &str = "@example:localhost"; static USER_ID: &str = "@example:localhost";
static DEVICE_ID: &str = "DEVICEID"; static DEVICE_ID: &str = "DEVICEID";
@ -829,14 +830,29 @@ mod test {
(account, store, dir) (account, store, dir)
} }
fn alice_id() -> UserId {
UserId::try_from("@alice:example.org").unwrap()
}
fn alice_device_id() -> DeviceId {
"ALICEDEVICE".to_string()
}
fn bob_id() -> UserId {
UserId::try_from("@bob:example.org").unwrap()
}
fn bob_device_id() -> DeviceId {
"BOBDEVICE".to_string()
}
fn get_account() -> Account { fn get_account() -> Account {
Account::new() Account::new(&alice_id(), &alice_device_id())
} }
async fn get_account_and_session() -> (Account, Session) { async fn get_account_and_session() -> (Account, Session) {
let alice = Account::new(); let alice = Account::new(&alice_id(), &alice_device_id());
let bob = Account::new(&bob_id(), &bob_device_id());
let bob = Account::new();
bob.generate_one_time_keys(1).await; bob.generate_one_time_keys(1).await;
let one_time_key = bob let one_time_key = bob