feat: enhance command classification and error handling; improve process checks and credential security
This commit is contained in:
+56
-53
@@ -364,69 +364,72 @@ fn run_daemon() -> Result<()> {
|
||||
let server = ipc::server::IpcServer::bind_unix(&addr)?;
|
||||
eprintln!("daemon: listening on {}", addr);
|
||||
|
||||
let mut conn = match server.accept() {
|
||||
Ok(c) => c,
|
||||
Err(e) => {
|
||||
eprintln!("daemon: accept error: {}", e);
|
||||
let _ = std::fs::remove_file(&socket_path);
|
||||
return Err(e);
|
||||
}
|
||||
};
|
||||
eprintln!("daemon: client connected");
|
||||
loop {
|
||||
let mut conn = match server.accept() {
|
||||
Ok(c) => c,
|
||||
Err(e) => {
|
||||
eprintln!("daemon: accept error: {}", e);
|
||||
break;
|
||||
}
|
||||
};
|
||||
eprintln!("daemon: client connected");
|
||||
|
||||
let mut running = true;
|
||||
while running {
|
||||
match conn.receive::<ClientRequest>()? {
|
||||
Some(req) => {
|
||||
match req {
|
||||
ClientRequest::Tick => {
|
||||
apply_action(&mut state, Action::Tick);
|
||||
}
|
||||
ClientRequest::KeyPress { key, ctrl, alt, shift } => {
|
||||
let mut modifiers = crossterm::event::KeyModifiers::NONE;
|
||||
if ctrl { modifiers |= crossterm::event::KeyModifiers::CONTROL; }
|
||||
if alt { modifiers |= crossterm::event::KeyModifiers::ALT; }
|
||||
if shift { modifiers |= crossterm::event::KeyModifiers::SHIFT; }
|
||||
let key_event = crossterm::event::KeyEvent::new(
|
||||
key_action_to_code(&key),
|
||||
modifiers,
|
||||
);
|
||||
let actions = controller::input::handle_key(key_event, &mut state);
|
||||
for action in actions {
|
||||
apply_action(&mut state, action);
|
||||
let mut running = true;
|
||||
while running {
|
||||
match conn.receive::<ClientRequest>()? {
|
||||
Some(req) => {
|
||||
match req {
|
||||
ClientRequest::Tick => {
|
||||
apply_action(&mut state, Action::Tick);
|
||||
}
|
||||
apply_action(&mut state, Action::Tick);
|
||||
}
|
||||
ClientRequest::Submit(text) => {
|
||||
state.input.buffer = text;
|
||||
let enter_event = crossterm::event::KeyEvent::new(
|
||||
crossterm::event::KeyCode::Enter,
|
||||
crossterm::event::KeyModifiers::NONE,
|
||||
);
|
||||
let actions = controller::input::handle_key(enter_event, &mut state);
|
||||
for action in actions {
|
||||
apply_action(&mut state, action);
|
||||
ClientRequest::KeyPress { key, ctrl, alt, shift } => {
|
||||
let mut modifiers = crossterm::event::KeyModifiers::NONE;
|
||||
if ctrl { modifiers |= crossterm::event::KeyModifiers::CONTROL; }
|
||||
if alt { modifiers |= crossterm::event::KeyModifiers::ALT; }
|
||||
if shift { modifiers |= crossterm::event::KeyModifiers::SHIFT; }
|
||||
let key_event = crossterm::event::KeyEvent::new(
|
||||
key_action_to_code(&key),
|
||||
modifiers,
|
||||
);
|
||||
let actions = controller::input::handle_key(key_event, &mut state);
|
||||
for action in actions {
|
||||
apply_action(&mut state, action);
|
||||
}
|
||||
apply_action(&mut state, Action::Tick);
|
||||
}
|
||||
ClientRequest::Submit(text) => {
|
||||
state.input.buffer = text;
|
||||
let enter_event = crossterm::event::KeyEvent::new(
|
||||
crossterm::event::KeyCode::Enter,
|
||||
crossterm::event::KeyModifiers::NONE,
|
||||
);
|
||||
let actions = controller::input::handle_key(enter_event, &mut state);
|
||||
for action in actions {
|
||||
apply_action(&mut state, action);
|
||||
}
|
||||
apply_action(&mut state, Action::Tick);
|
||||
}
|
||||
ClientRequest::Resize(w, h) => {
|
||||
apply_action(&mut state, Action::Resize(w, h));
|
||||
apply_action(&mut state, Action::Tick);
|
||||
}
|
||||
ClientRequest::Close => {
|
||||
running = false;
|
||||
}
|
||||
apply_action(&mut state, Action::Tick);
|
||||
}
|
||||
ClientRequest::Resize(w, h) => {
|
||||
apply_action(&mut state, Action::Resize(w, h));
|
||||
apply_action(&mut state, Action::Tick);
|
||||
}
|
||||
ClientRequest::Close => {
|
||||
running = false;
|
||||
}
|
||||
send_daemon_update(&mut conn, &state)?;
|
||||
}
|
||||
None => {
|
||||
running = false;
|
||||
}
|
||||
send_daemon_update(&mut conn, &state)?;
|
||||
}
|
||||
None => {
|
||||
running = false;
|
||||
}
|
||||
}
|
||||
|
||||
eprintln!("daemon: client disconnected, waiting for next connection...");
|
||||
let _ = state.settings.save();
|
||||
}
|
||||
|
||||
let _ = std::fs::remove_file(&socket_path);
|
||||
let _ = state.settings.save();
|
||||
session_lock.unlock();
|
||||
|
||||
Ok(())
|
||||
|
||||
Reference in New Issue
Block a user