scylla/authentication/
mod.rs1use async_trait::async_trait;
2use bytes::{BufMut, BytesMut};
3
4pub use crate::frame::Authenticator;
5
6pub type AuthError = String;
8
9#[async_trait]
11pub trait AuthenticatorSession: Send + Sync {
12 async fn evaluate_challenge(
16 &mut self,
17 token: Option<&[u8]>,
18 ) -> Result<Option<Vec<u8>>, AuthError>;
19
20 async fn success(&mut self, token: Option<&[u8]>) -> Result<(), AuthError>;
23}
24
25#[async_trait]
33pub trait AuthenticatorProvider: Sync + Send {
34 async fn start_authentication_session(
37 &self,
38 authenticator_name: &str,
39 ) -> Result<(Option<Vec<u8>>, Box<dyn AuthenticatorSession>), AuthError>;
40}
41
42struct PlainTextAuthenticatorSession;
43
44#[async_trait]
45impl AuthenticatorSession for PlainTextAuthenticatorSession {
46 async fn evaluate_challenge(
47 &mut self,
48 _token: Option<&[u8]>,
49 ) -> Result<Option<Vec<u8>>, AuthError> {
50 Err("Challenges are not expected during PlainTextAuthentication".to_string())
51 }
52
53 async fn success(&mut self, _token: Option<&[u8]>) -> Result<(), AuthError> {
54 Ok(())
55 }
56}
57
58pub struct PlainTextAuthenticator {
60 username: String,
61 password: String,
62}
63
64impl PlainTextAuthenticator {
65 pub fn new(username: String, password: String) -> Self {
67 PlainTextAuthenticator { username, password }
68 }
69}
70
71#[async_trait]
72impl AuthenticatorProvider for PlainTextAuthenticator {
73 async fn start_authentication_session(
74 &self,
75 _authenticator_name: &str,
76 ) -> Result<(Option<Vec<u8>>, Box<dyn AuthenticatorSession>), AuthError> {
77 let mut response = BytesMut::new();
78 let username_as_bytes = self.username.as_bytes();
79 let password_as_bytes = self.password.as_bytes();
80
81 response.put_u8(0);
82 response.put_slice(username_as_bytes);
83 response.put_u8(0);
84 response.put_slice(password_as_bytes);
85
86 Ok((
87 Some(response.to_vec()),
88 Box::new(PlainTextAuthenticatorSession),
89 ))
90 }
91}