pub(crate) mod from; use rand::{thread_rng, Rng}; use sha2::{Digest, Sha256}; use time::OffsetDateTime; use url::Url; use crate::{AddressType, IdentityId, SecdError, Session, SESSION_DURATION, SESSION_SIZE_BYTES}; pub(crate) fn remove_trailing_slash(url: &mut Url) -> String { let mut u = url.to_string(); if u.ends_with('/') { u.pop(); } u } pub(crate) fn hash(i: &[u8]) -> Vec { let mut hasher = Sha256::new(); hasher.update(i); hasher.finalize().to_vec() } impl AddressType { pub fn get_value(&self) -> Option { match &self { AddressType::Email { email_address } => { email_address.as_ref().map(|a| a.to_string().clone()) } AddressType::Sms { phone_number } => phone_number.as_ref().cloned(), } } } impl Session { pub(crate) fn new(identity_id: IdentityId) -> Result { let token = (0..SESSION_SIZE_BYTES) .map(|_| rand::random::()) .collect::>(); let now = OffsetDateTime::now_utc(); Ok(Session { identity_id, token, created_at: now, expired_at: now .checked_add(time::Duration::new(SESSION_DURATION, 0)) .ok_or(SecdError::Todo)?, revoked_at: None, }) } }