From 2ae6f601081b4e38f2e2678e42a0008435f61dfe Mon Sep 17 00:00:00 2001 From: Johnathan Sharratt Date: Sun, 3 Mar 2024 23:45:58 +1100 Subject: [PATCH] Fixed an issue where you could not log into other devices --- crates/model/src/logic/copy_bank.rs | 14 +++++++++----- crates/model/src/responses/copy_bank.rs | 18 +++++++++++------- crates/web/src/process/login_bank.rs | 25 +++++++++++++++++++++---- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/crates/model/src/logic/copy_bank.rs b/crates/model/src/logic/copy_bank.rs index 144a30a9..dfe1b0e5 100644 --- a/crates/model/src/logic/copy_bank.rs +++ b/crates/model/src/logic/copy_bank.rs @@ -8,7 +8,10 @@ use crate::{ ledger_type::LedgerEntry, password_hash::PasswordHash, requests::{copy_bank::RequestCopyBank, new_bank::RequestNewBank}, - responses::{copy_bank::ResponseCopyBank, create_bank::ResponseCreateBank}, + responses::{ + copy_bank::{Copied, ResponseCopyBank}, + create_bank::ResponseCreateBank, + }, secret::LedgerSecret, transaction::Transaction, }; @@ -35,13 +38,14 @@ impl Ledger { // Check the password if bank.password != req.password { return Ok(ResponseCopyBank::Denied { - err_msg: format!("Invalid bank or password."), + err_msg: format!("Invalid password."), }); } // Send the ledger! - Ok(ResponseCopyBank::Copied { - ledger: ledger.clone(), - }) + Ok(ResponseCopyBank::Copied(Copied { + bank_secret: ledger.bank_secret.clone(), + entries: ledger.entries.values().cloned().collect(), + })) } } diff --git a/crates/model/src/responses/copy_bank.rs b/crates/model/src/responses/copy_bank.rs index 236f9f10..edf9e1ed 100644 --- a/crates/model/src/responses/copy_bank.rs +++ b/crates/model/src/responses/copy_bank.rs @@ -1,11 +1,17 @@ use std::fmt::Display; -use crate::{bank_id::BankId, ledger::LedgerForBank}; +use crate::{bank_id::BankId, ledger::LedgerMessage, secret::LedgerSecret}; use serde::{Deserialize, Serialize}; +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct Copied { + pub bank_secret: LedgerSecret, + pub entries: Vec, +} + #[derive(Debug, Clone, Deserialize, Serialize)] pub enum ResponseCopyBank { - Copied { ledger: LedgerForBank }, + Copied(Copied), Denied { err_msg: String }, DoesNotExist { bank_id: BankId }, } @@ -13,11 +19,9 @@ pub enum ResponseCopyBank { impl Display for ResponseCopyBank { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { - ResponseCopyBank::Copied { ledger } => write!( - f, - "ResponseCopyBank::Copied (entries={})", - ledger.entries.len() - ), + ResponseCopyBank::Copied(Copied { entries, .. }) => { + write!(f, "ResponseCopyBank::Copied (entries={})", entries.len()) + } ResponseCopyBank::Denied { err_msg } => { write!(f, "ResponseCopyBank::Denied ({})", err_msg) } diff --git a/crates/web/src/process/login_bank.rs b/crates/web/src/process/login_bank.rs index fb9c5e82..5d4a2d06 100644 --- a/crates/web/src/process/login_bank.rs +++ b/crates/web/src/process/login_bank.rs @@ -1,6 +1,10 @@ use egui::Ui; use immutable_bank_model::{ - bank_id::BankId, requests::copy_bank::RequestCopyBank, responses::copy_bank::ResponseCopyBank, + bank_id::BankId, + ledger::LedgerForBank, + requests::copy_bank::RequestCopyBank, + responses::copy_bank::{Copied, ResponseCopyBank}, + secret::LedgerSecret, }; use crate::{ @@ -31,16 +35,29 @@ impl LocalApp { }, move |res: ResponseCopyBank, app: &mut LocalApp, frame: &mut eframe::Frame| { match res { - ResponseCopyBank::Copied { ledger } => { + ResponseCopyBank::Copied(Copied { + bank_secret, + entries, + }) => { app.banks.insert( bank_id.clone(), BankWithSecrets { bank_id: bank_id.clone(), - secret: ledger.bank_secret.clone(), + secret: bank_secret.clone(), password: password_hash, }, ); - app.ledger.banks.insert(bank_id.clone(), ledger); + app.ledger.banks.insert( + bank_id.clone(), + LedgerForBank { + broker_secret: LedgerSecret::new(), + bank_secret: bank_secret, + entries: entries + .into_iter() + .map(|msg| (msg.broker_signature.clone(), msg)) + .collect(), + }, + ); app.session.replace(LocalSession::new(bank_id.clone())); app.mode = Mode::Summary; app.save_state(frame);