quinoa/src/auth/mod.rs

87 lines
2.3 KiB
Rust

pub mod password;
pub mod ssh_key;
use std::ffi::CStr;
#[derive(Debug, Serialize, Deserialize)]
pub struct Hello<'a> {
#[serde(borrow)]
pub username: &'a str,
#[serde(borrow)]
pub auth_method: Method<'a>,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum Method<'a> {
Password,
SshKey {
/// [Public key](::ssh_key::public::PublicKey).
#[serde(borrow)]
public_key: &'a str,
},
}
mod cstr_as_bytes {
use std::ffi::CStr;
use serde::{Serializer, Deserializer, Deserialize};
pub fn serialize<S>(s: &CStr, ser: S) -> Result<S::Ok, S::Error> where S: Serializer {
ser.serialize_bytes(s.to_bytes_with_nul())
}
pub fn deserialize<'de, D>(de: D) -> Result<&'de CStr, D::Error> where D: Deserializer<'de> {
use serde::de::Error;
let b = <&'de [u8]>::deserialize(de)?;
CStr::from_bytes_with_nul(b)
.map_err(|_| D::Error::invalid_value(serde::de::Unexpected::Bytes(b), &"a sequence of bytes ending with NUL"))
}
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
#[serde(transparent)]
struct ByteSlice<'a>(#[serde(serialize_with = "serialize_bytes")] &'a [u8]);
pub fn serialize_bytes<S>(b: &[u8], ser: S) -> Result<S::Ok, S::Error> where S: serde::Serializer {
ser.serialize_bytes(b)
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
#[serde(transparent)]
pub struct CStrAsBytes<'a>(#[serde(serialize_with = "cstr_as_bytes::serialize", deserialize_with = "cstr_as_bytes::deserialize", borrow)] &'a CStr);
impl<'a> std::ops::Deref for CStrAsBytes<'a> {
type Target = CStr;
fn deref(&self) -> &Self::Target {
self.0
}
}
impl<'a> From<&'a CStr> for CStrAsBytes<'a> {
fn from(value: &'a CStr) -> Self {
Self(value)
}
}
impl<'a> From<CStrAsBytes<'a>> for &'a CStr {
fn from(value: CStrAsBytes<'a>) -> Self {
value.0
}
}
#[derive(Debug, Serialize, Deserialize)]
pub enum Question<'a> {
Prompt { #[serde(borrow)] prompt: CStrAsBytes<'a>, echo: bool },
TextInfo(#[serde(borrow)] CStrAsBytes<'a>),
ErrorMsg(#[serde(borrow)] CStrAsBytes<'a>),
//SshAuthRequest(ssh_key::AuthRequest<'a>),
LoggedIn,
}
#[derive(Debug, Serialize, Deserialize)]
enum Answer<'a> {
Prompt(#[serde(borrow)] CStrAsBytes<'a>),
//SshAuthResponse(ssh_key::AuthResponse<'a>),
}