[APP-3801] implement remote environments auth (#9331)

This commit is contained in:
Moira Huang
2026-04-28 21:31:23 -05:00
committed by GitHub
parent c325d146ab
commit f0c8b7f723
21 changed files with 685 additions and 69 deletions
@@ -1,5 +1,10 @@
use crate::auth::auth_state::AuthStateProvider;
use crate::remote_server::auth_context::server_api_auth_context;
use instant::Instant;
use remote_server::auth::RemoteServerAuthContext;
use settings::Setting;
use std::path::PathBuf;
use std::sync::Arc;
use warp_core::SessionId;
use warpui::{Entity, ModelContext, ModelHandle, SingletonEntity, WeakModelHandle};
@@ -7,6 +12,7 @@ use crate::terminal::warpify::settings::SshExtensionInstallMode;
use crate::remote_server::manager::{RemoteServerManager, RemoteServerManagerEvent};
use crate::remote_server::ssh_transport::SshTransport;
use crate::server::server_api::ServerApiProvider;
use crate::terminal::model::session::{IsLegacySSHSession, SessionInfo};
use crate::terminal::model_events::{ModelEvent, ModelEventDispatcher};
use crate::terminal::warpify::settings::WarpifySettings;
@@ -59,6 +65,7 @@ enum SshInitState {
pub struct RemoteServerController<T: EventLoopSender> {
pty_controller: WeakModelHandle<PtyController<T>>,
model_event_dispatcher: ModelHandle<ModelEventDispatcher>,
auth_context: Arc<RemoteServerAuthContext>,
state: SshInitState,
/// Whether the binary was installed during this setup flow.
did_install: bool,
@@ -76,6 +83,10 @@ impl<T: EventLoopSender> RemoteServerController<T> {
model_event_dispatcher: ModelHandle<ModelEventDispatcher>,
ctx: &mut ModelContext<Self>,
) -> Self {
let auth_context = Arc::new(server_api_auth_context(
AuthStateProvider::as_ref(ctx).get().clone(),
ServerApiProvider::as_ref(ctx).get_auth_client(),
));
ctx.subscribe_to_model(&model_event_dispatcher, |me, event, ctx| {
if let ModelEvent::SshInitShell {
pending_session_info,
@@ -104,12 +115,25 @@ impl<T: EventLoopSender> RemoteServerController<T> {
RemoteServerManagerEvent::SessionConnectionFailed { session_id, .. } => {
me.on_session_connection_failed(*session_id, ctx);
}
_ => {}
RemoteServerManagerEvent::SessionConnecting { .. }
| RemoteServerManagerEvent::SessionDisconnected { .. }
| RemoteServerManagerEvent::SessionReconnected { .. }
| RemoteServerManagerEvent::SessionDeregistered { .. }
| RemoteServerManagerEvent::HostConnected { .. }
| RemoteServerManagerEvent::HostDisconnected { .. }
| RemoteServerManagerEvent::NavigatedToDirectory { .. }
| RemoteServerManagerEvent::RepoMetadataSnapshot { .. }
| RemoteServerManagerEvent::RepoMetadataUpdated { .. }
| RemoteServerManagerEvent::RepoMetadataDirectoryLoaded { .. }
| RemoteServerManagerEvent::SetupStateChanged { .. }
| RemoteServerManagerEvent::ClientRequestFailed { .. }
| RemoteServerManagerEvent::ServerMessageDecodingError { .. } => {}
});
Self {
pty_controller,
model_event_dispatcher,
auth_context,
state: SshInitState::Idle,
did_install: false,
remote_platform: None,
@@ -135,7 +159,6 @@ impl<T: EventLoopSender> RemoteServerController<T> {
};
let session_id = info.session_id;
let socket_path = socket_path.clone();
debug_assert!(matches!(self.state, SshInitState::Idle));
match std::mem::replace(&mut self.state, SshInitState::Idle) {
SshInitState::Idle => {}
@@ -158,8 +181,7 @@ impl<T: EventLoopSender> RemoteServerController<T> {
self.flush_stashed_bootstrap(old_info, ctx);
}
}
let transport = SshTransport::new(socket_path);
let transport = SshTransport::new(socket_path, self.auth_context.clone());
self.did_install = false;
self.remote_platform = None;
self.state = SshInitState::AwaitingCheck {
@@ -199,14 +221,13 @@ impl<T: EventLoopSender> RemoteServerController<T> {
match result {
Ok(true) => {
let socket_path = transport.socket_path().clone();
self.state = SshInitState::AwaitingConnect {
session_id,
session_info,
setup_start,
};
RemoteServerManager::handle(ctx).update(ctx, |mgr, ctx| {
mgr.connect_session(session_id, transport, ctx);
});
self.connect_session_for_current_identity(session_id, socket_path, ctx);
}
Ok(false) => {
let install_mode = *WarpifySettings::as_ref(ctx)
@@ -404,14 +425,13 @@ impl<T: EventLoopSender> RemoteServerController<T> {
};
match result {
Ok(()) => {
let socket_path = transport.socket_path().clone();
self.state = SshInitState::AwaitingConnect {
session_id,
session_info,
setup_start,
};
RemoteServerManager::handle(ctx).update(ctx, |mgr, ctx| {
mgr.connect_session(session_id, transport, ctx);
});
self.connect_session_for_current_identity(session_id, socket_path, ctx);
}
Err(err) => {
log::error!("Binary install failed for {session_id:?}: {err}");
@@ -419,4 +439,17 @@ impl<T: EventLoopSender> RemoteServerController<T> {
}
}
}
fn connect_session_for_current_identity(
&mut self,
session_id: SessionId,
socket_path: PathBuf,
ctx: &mut ModelContext<Self>,
) {
let transport = SshTransport::new(socket_path, self.auth_context.clone());
let auth_context = self.auth_context.clone();
RemoteServerManager::handle(ctx).update(ctx, |mgr, ctx| {
mgr.connect_session(session_id, transport, auth_context, ctx);
});
}
}