mirror of
https://github.com/Xevion/dynamic-preauth.git
synced 2025-12-06 05:15:00 -06:00
use send_state, fix sending state without tx ready, switch to u32 for download token
This commit is contained in:
12
src/main.rs
12
src/main.rs
@@ -102,10 +102,7 @@ async fn handle_socket(session_id: usize, websocket: WebSocket) {
|
|||||||
.expect("Unable to get session");
|
.expect("Unable to get session");
|
||||||
session.tx = Some(tx_channel);
|
session.tx = Some(tx_channel);
|
||||||
|
|
||||||
session.send_message(OutgoingMessage::State {
|
session.send_state();
|
||||||
id: session_id,
|
|
||||||
session: session.clone(),
|
|
||||||
});
|
|
||||||
session.send_message(executable_message);
|
session.send_message(executable_message);
|
||||||
|
|
||||||
// Handle incoming messages
|
// Handle incoming messages
|
||||||
@@ -193,6 +190,13 @@ pub async fn download(req: &mut Request, res: &mut Response, depot: &mut Depot)
|
|||||||
"Content-Type",
|
"Content-Type",
|
||||||
HeaderValue::from_static("application/octet-stream"),
|
HeaderValue::from_static("application/octet-stream"),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Don't try to send state if somehow the session has not connected
|
||||||
|
if session.tx.is_some() {
|
||||||
|
session.send_state();
|
||||||
|
} else {
|
||||||
|
tracing::warn!("Download being made without any connection websocket");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[handler]
|
#[handler]
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ use crate::utility::search;
|
|||||||
|
|
||||||
#[derive(Debug, Serialize, Clone)]
|
#[derive(Debug, Serialize, Clone)]
|
||||||
pub struct Session {
|
pub struct Session {
|
||||||
|
pub id: usize,
|
||||||
pub downloads: Vec<SessionDownload>,
|
pub downloads: Vec<SessionDownload>,
|
||||||
|
|
||||||
pub first_seen: chrono::DateTime<chrono::Utc>,
|
pub first_seen: chrono::DateTime<chrono::Utc>,
|
||||||
@@ -33,7 +34,7 @@ impl Session {
|
|||||||
// Add a download to the session
|
// Add a download to the session
|
||||||
pub fn add_download(&mut self, exe: &Executable) -> &SessionDownload {
|
pub fn add_download(&mut self, exe: &Executable) -> &SessionDownload {
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let token: u64 = rng.gen();
|
let token: u32 = rand::random();
|
||||||
|
|
||||||
let download = SessionDownload {
|
let download = SessionDownload {
|
||||||
token,
|
token,
|
||||||
@@ -47,6 +48,10 @@ impl Session {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn send_message(&mut self, message: OutgoingMessage) {
|
pub fn send_message(&mut self, message: OutgoingMessage) {
|
||||||
|
if self.tx.is_none() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: Error handling, check tx exists
|
// TODO: Error handling, check tx exists
|
||||||
|
|
||||||
let result = self
|
let result = self
|
||||||
@@ -59,11 +64,19 @@ impl Session {
|
|||||||
tracing::error!("Failed to initial session state: {}", e);
|
tracing::error!("Failed to initial session state: {}", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn send_state(&mut self) {
|
||||||
|
let message = OutgoingMessage::State {
|
||||||
|
session: self.clone(),
|
||||||
|
};
|
||||||
|
|
||||||
|
self.send_message(message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Debug, Clone)]
|
#[derive(Serialize, Debug, Clone)]
|
||||||
pub struct SessionDownload {
|
pub struct SessionDownload {
|
||||||
pub token: u64,
|
pub token: u32,
|
||||||
pub filename: String,
|
pub filename: String,
|
||||||
pub last_used: chrono::DateTime<chrono::Utc>,
|
pub last_used: chrono::DateTime<chrono::Utc>,
|
||||||
pub download_time: chrono::DateTime<chrono::Utc>,
|
pub download_time: chrono::DateTime<chrono::Utc>,
|
||||||
@@ -121,6 +134,7 @@ impl<'a> State<'a> {
|
|||||||
self.sessions.insert(
|
self.sessions.insert(
|
||||||
id,
|
id,
|
||||||
Session {
|
Session {
|
||||||
|
id,
|
||||||
downloads: Vec::new(),
|
downloads: Vec::new(),
|
||||||
last_seen: now,
|
last_seen: now,
|
||||||
last_request: now,
|
last_request: now,
|
||||||
@@ -201,7 +215,7 @@ pub enum OutgoingMessage {
|
|||||||
// An alert to the client that a session download has been used.
|
// An alert to the client that a session download has been used.
|
||||||
TokenAlert { token: u64 },
|
TokenAlert { token: u64 },
|
||||||
// A message describing the current session state
|
// A message describing the current session state
|
||||||
State { session: Session, id: usize },
|
State { session: Session },
|
||||||
Executables { executables: Vec<ExecutableJson> },
|
Executables { executables: Vec<ExecutableJson> },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user