Serialize, Deserialize invite as base64 string

`loxinvite` is concatenated with an underscore
to try to prevent copy errors from telegram
This commit is contained in:
onyinyang 2024-02-28 15:29:10 -05:00
parent d0407e9e5d
commit 0a12b0fc52
No known key found for this signature in database
GPG Key ID: 156A6435430C2036
2 changed files with 37 additions and 2 deletions

View File

@ -374,6 +374,7 @@ mod tests {
// Test Open Invite and get response
let invite_response_str = body_to_string(invite_response).await;
println!("Base64 invite {:?}", invite_response_str);
let response_data: lox_utils::Invite = serde_json::from_str(&invite_response_str).unwrap();
let token = match lox_utils::validate(&response_data.invite) {
Ok(token) => token,

View File

@ -12,13 +12,47 @@ use serde_with::serde_as;
use std::array::TryFromSliceError;
use std::collections::HashMap;
#[serde_as]
const LOX_INVITE_TOKEN: &str = "loxinvite_";
#[derive(Serialize, Deserialize)]
pub struct Invite {
#[serde_as(as = "[_; OPENINV_LENGTH]")]
#[serde(with = "base64serde")]
pub invite: [u8; OPENINV_LENGTH],
}
mod base64serde {
use base64::{engine::general_purpose::STANDARD_NO_PAD, Engine as _};
use lox_library::OPENINV_LENGTH;
use serde::{Deserialize, Serialize};
use serde::{Deserializer, Serializer};
use crate::LOX_INVITE_TOKEN;
pub fn serialize<S: Serializer>(v: &[u8; OPENINV_LENGTH], s: S) -> Result<S::Ok, S::Error> {
let mut base64 = STANDARD_NO_PAD.encode(v);
base64.insert_str(0, LOX_INVITE_TOKEN);
String::serialize(&base64, s)
}
pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<[u8; OPENINV_LENGTH], D::Error> {
let mut base64 = String::deserialize(d)?;
let encoded_str = base64.split_off(LOX_INVITE_TOKEN.len());
if base64 != LOX_INVITE_TOKEN {
return Err(serde::de::Error::custom("Token identifier does not match"))
}
match STANDARD_NO_PAD.decode(encoded_str) {
Ok(output) => {
let out: Result<[u8; OPENINV_LENGTH], D::Error> = match output.try_into() {
Ok(out) => Ok(out),
Err(e) => Err(serde::de::Error::custom(String::from_utf8(e).unwrap())),
};
out
}
Err(e) => Err(serde::de::Error::custom(e)),
}
}
}
#[derive(Deserialize, Serialize)]
pub struct OpenReqState {
pub request: proto::open_invite::Request,