/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use super::Metadata; use rusqlite::Row; use sync_guid::Guid; #[derive(Debug, Clone, Default)] pub struct UpdatableCreditCardFields { pub cc_name: String, pub cc_number_enc: String, pub cc_number_last_4: String, pub cc_exp_month: i64, pub cc_exp_year: i64, // Credit card types are a fixed set of strings as defined in the link below // (https://searchfox.org/mozilla-central/rev/7ef5cefd0468b8f509efe38e0212de2398f4c8b3/toolkit/modules/CreditCard.jsm#9-22) pub cc_type: String, } #[derive(Debug, Clone, Default)] pub struct CreditCard { pub guid: String, pub cc_name: String, pub cc_number_enc: String, pub cc_number_last_4: String, pub cc_exp_month: i64, pub cc_exp_year: i64, // Credit card types are a fixed set of strings as defined in the link below // (https://searchfox.org/mozilla-central/rev/7ef5cefd0468b8f509efe38e0212de2398f4c8b3/toolkit/modules/CreditCard.jsm#9-22) pub cc_type: String, // The metadata pub time_created: i64, pub time_last_used: Option, pub time_last_modified: i64, pub times_used: i64, } // This is used to "externalize" a credit-card, suitable for handing back to // consumers. impl From for CreditCard { fn from(icc: InternalCreditCard) -> Self { CreditCard { guid: icc.guid.to_string(), cc_name: icc.cc_name, cc_number_enc: icc.cc_number_enc, cc_number_last_4: icc.cc_number_last_4, cc_exp_month: icc.cc_exp_month, cc_exp_year: icc.cc_exp_year, cc_type: icc.cc_type, // note we can't use u64 in uniffi time_created: u64::from(icc.metadata.time_created) as i64, time_last_used: if icc.metadata.time_last_used.0 == 0 { None } else { Some(icc.metadata.time_last_used.0 as i64) }, time_last_modified: u64::from(icc.metadata.time_last_modified) as i64, times_used: icc.metadata.times_used, } } } // NOTE: No `PartialEq` here because the same card number will encrypt to a // different value each time it is encrypted, making it meaningless to compare. #[derive(Debug, Clone, Default)] pub struct InternalCreditCard { pub guid: Guid, pub cc_name: String, pub cc_number_enc: String, pub cc_number_last_4: String, pub cc_exp_month: i64, pub cc_exp_year: i64, // Credit card types are a fixed set of strings as defined in the link below // (https://searchfox.org/mozilla-central/rev/7ef5cefd0468b8f509efe38e0212de2398f4c8b3/toolkit/modules/CreditCard.jsm#9-22) pub cc_type: String, pub metadata: Metadata, } impl InternalCreditCard { pub fn from_row(row: &Row<'_>) -> Result { Ok(Self { guid: Guid::from_string(row.get("guid")?), cc_name: row.get("cc_name")?, cc_number_enc: row.get("cc_number_enc")?, cc_number_last_4: row.get("cc_number_last_4")?, cc_exp_month: row.get("cc_exp_month")?, cc_exp_year: row.get("cc_exp_year")?, cc_type: row.get("cc_type")?, metadata: Metadata { time_created: row.get("time_created")?, time_last_used: row.get("time_last_used")?, time_last_modified: row.get("time_last_modified")?, times_used: row.get("times_used")?, sync_change_counter: row.get("sync_change_counter")?, }, }) } pub fn has_scrubbed_data(&self) -> bool { self.cc_number_enc.is_empty() } }