From f0d62412a7554e11628b2d2769377e1ceb58b529 Mon Sep 17 00:00:00 2001 From: Eugene Date: Sun, 3 Jul 2022 18:46:07 +0200 Subject: [PATCH] External host setting (#162) --- warpgate-common/src/config.rs | 15 +++++++-- warpgate-protocol-http/src/api/info.rs | 10 ++++++ warpgate-protocol-http/src/catchall.rs | 1 + warpgate-web/src/admin/Targets.svelte | 32 +++++++++++++++---- warpgate-web/src/admin/lib/ssh.ts | 5 --- warpgate-web/src/common/http.ts | 3 ++ warpgate-web/src/common/ssh.ts | 9 ++++++ warpgate-web/src/gateway/TargetList.svelte | 9 +++--- .../src/gateway/lib/openapi-schema.json | 3 ++ warpgate-web/src/gateway/lib/store.ts | 2 +- 10 files changed, 70 insertions(+), 19 deletions(-) delete mode 100644 warpgate-web/src/admin/lib/ssh.ts create mode 100644 warpgate-web/src/common/http.ts create mode 100644 warpgate-web/src/common/ssh.ts diff --git a/warpgate-common/src/config.rs b/warpgate-common/src/config.rs index 756900d9..e169ab40 100644 --- a/warpgate-common/src/config.rs +++ b/warpgate-common/src/config.rs @@ -19,31 +19,38 @@ const fn _default_port() -> u16 { 22 } +#[inline] fn _default_username() -> String { "root".to_owned() } +#[inline] fn _default_empty_string() -> String { "".to_owned() } +#[inline] fn _default_recordings_path() -> String { "./data/recordings".to_owned() } +#[inline] fn _default_database_url() -> Secret { Secret::new("sqlite:data/db".to_owned()) } +#[inline] fn _default_http_listen() -> String { "0.0.0.0:8888".to_owned() } +#[inline] fn _default_retention() -> Duration { Duration::SECOND * 60 * 60 * 24 * 7 } -fn _default_empty_string_vec() -> Vec { +#[inline] +fn _default_empty_vec() -> Vec { vec![] } @@ -89,7 +96,7 @@ pub struct TargetWebAdminOptions {} #[derive(Debug, Deserialize, Serialize, Clone, Object)] pub struct Target { pub name: String, - #[serde(default = "_default_empty_string_vec")] + #[serde(default = "_default_empty_vec")] pub allow_roles: Vec, #[serde(flatten)] pub options: TargetOptions, @@ -239,6 +246,9 @@ pub struct WarpgateConfigStore { #[serde(default)] pub recordings: RecordingsConfig, + #[serde(default)] + pub external_host: Option, + #[serde(default = "_default_database_url")] pub database_url: Secret, @@ -259,6 +269,7 @@ impl Default for WarpgateConfigStore { users: vec![], roles: vec![], recordings: RecordingsConfig::default(), + external_host: None, database_url: _default_database_url(), ssh: SSHConfig::default(), http: HTTPConfig::default(), diff --git a/warpgate-protocol-http/src/api/info.rs b/warpgate-protocol-http/src/api/info.rs index 5706868e..19eb1d16 100644 --- a/warpgate-protocol-http/src/api/info.rs +++ b/warpgate-protocol-http/src/api/info.rs @@ -3,6 +3,7 @@ use std::net::ToSocketAddrs; use crate::common::SessionExt; use poem::session::Session; use poem::web::Data; +use poem::Request; use poem_openapi::payload::Json; use poem_openapi::{ApiResponse, Object, OpenApi}; use serde::Serialize; @@ -20,6 +21,7 @@ pub struct Info { version: String, username: Option, selected_target: Option, + external_host: Option, ports: PortsInfo, } @@ -34,14 +36,22 @@ impl Api { #[oai(path = "/info", method = "get", operation_id = "get_info")] async fn api_get_info( &self, + req: &Request, session: &Session, services: Data<&Services>, ) -> poem::Result { let config = services.config.lock().await; + let external_host = config + .store + .external_host + .as_deref() + .or_else(|| req.header(http::header::HOST)) + .or_else(|| req.original_uri().host()); Ok(InstanceInfoResponse::Ok(Json(Info { version: env!("CARGO_PKG_VERSION").to_string(), username: session.get_username(), selected_target: session.get_target_name(), + external_host: external_host.map(&str::to_string), ports: if session.is_authenticated() { PortsInfo { ssh: config diff --git a/warpgate-protocol-http/src/catchall.rs b/warpgate-protocol-http/src/catchall.rs index 4eeb6266..63d88b6d 100644 --- a/warpgate-protocol-http/src/catchall.rs +++ b/warpgate-protocol-http/src/catchall.rs @@ -12,6 +12,7 @@ use warpgate_common::{Services, TargetOptions, WarpgateServerHandle}; #[derive(Deserialize)] struct QueryParams { + #[serde(rename="warpgate-target")] warpgate_target: Option, } diff --git a/warpgate-web/src/admin/Targets.svelte b/warpgate-web/src/admin/Targets.svelte index de362531..8867df87 100644 --- a/warpgate-web/src/admin/Targets.svelte +++ b/warpgate-web/src/admin/Targets.svelte @@ -1,7 +1,10 @@ @@ -36,7 +41,11 @@ $: sshUsername = getSSHUsername(selectedUser, selectedTarget) +

Access instructions

{#if selectedTarget?.options.kind === 'TargetSSHOptions'} -

Connection instructions

{#if users} + - - + + + + + {/if} + + {#if selectedTarget?.options.kind === 'TargetHTTPOptions'} + + + {/if}
diff --git a/warpgate-web/src/admin/lib/ssh.ts b/warpgate-web/src/admin/lib/ssh.ts deleted file mode 100644 index 7901623a..00000000 --- a/warpgate-web/src/admin/lib/ssh.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { Target, UserSnapshot } from './api' - -export function getSSHUsername (user: UserSnapshot|undefined, target: Target|undefined): string { - return `${user?.username ?? ''}:${target?.name}` -} diff --git a/warpgate-web/src/common/http.ts b/warpgate-web/src/common/http.ts new file mode 100644 index 00000000..7503c6a0 --- /dev/null +++ b/warpgate-web/src/common/http.ts @@ -0,0 +1,3 @@ +export function makeTargetURL (targetName: string): string { + return `${location.protocol}//${location.host}/?warpgate-target=${targetName}` +} diff --git a/warpgate-web/src/common/ssh.ts b/warpgate-web/src/common/ssh.ts new file mode 100644 index 00000000..16547ac3 --- /dev/null +++ b/warpgate-web/src/common/ssh.ts @@ -0,0 +1,9 @@ +import type { Info } from 'gateway/lib/api' + +export function makeSSHUsername (targetName?: string, username?: string): string { + return `${username ?? 'username'}:${targetName ?? 'target'}` +} + +export function makeExampleSSHCommand (targetName?: string, username?: string, serverInfo?: Info): string { + return `ssh ${makeSSHUsername(targetName, username)}@${serverInfo?.externalHost ?? 'warpgate-host'} -p ${serverInfo?.ports.ssh ?? 'warpgate-port'}` +} diff --git a/warpgate-web/src/gateway/TargetList.svelte b/warpgate-web/src/gateway/TargetList.svelte index 11ca11f6..75e41739 100644 --- a/warpgate-web/src/gateway/TargetList.svelte +++ b/warpgate-web/src/gateway/TargetList.svelte @@ -1,6 +1,7 @@