Skip to content

Commit 508ba38

Browse files
committed
Added support for sessionId, secret as parameters
1 parent 9bab7ea commit 508ba38

File tree

7 files changed

+45
-12
lines changed

7 files changed

+45
-12
lines changed

crates/sshx-core/proto/sshx.proto

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ message OpenRequest {
4242
bytes encrypted_zeros = 2; // Encrypted zero block, for client verification.
4343
string name = 3; // Name of the session (user@hostname).
4444
optional bytes write_password_hash = 4; // Hashed write password, if read-only mode is enabled.
45+
optional string session_id = 5; // Add this field
4546
}
4647

4748
// Details of a newly-created sshx session.

crates/sshx-server/src/grpc.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ impl SshxService for GrpcServer {
4848
if origin.is_empty() {
4949
return Err(Status::invalid_argument("origin is empty"));
5050
}
51-
let name = rand_alphanumeric(10);
51+
let name = request.session_id.unwrap_or_else(|| rand_alphanumeric(10));
5252
info!(%name, "creating new session");
5353

5454
match self.0.lookup(&name) {

crates/sshx-server/tests/simple.rs

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ async fn test_rpc() -> Result<()> {
1616
encrypted_zeros: Encrypt::new("").zeros().into(),
1717
name: String::new(),
1818
write_password_hash: None,
19+
session_id: None,
1920
};
2021
let resp = client.open(req).await?;
2122
assert!(!resp.into_inner().name.is_empty());

crates/sshx-server/tests/snapshot.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ pub mod common;
1616
async fn test_basic_restore() -> Result<()> {
1717
let server = TestServer::new().await;
1818

19-
let mut controller = Controller::new(&server.endpoint(), "", Runner::Echo, false).await?;
19+
let mut controller =
20+
Controller::new(&server.endpoint(), "", Runner::Echo, false, None, None).await?;
2021
let name = controller.name().to_owned();
2122
let key = controller.encryption_key().to_owned();
2223
tokio::spawn(async move { controller.run().await });

crates/sshx-server/tests/with_client.rs

+15-8
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ pub mod common;
1414
#[tokio::test]
1515
async fn test_handshake() -> Result<()> {
1616
let server = TestServer::new().await;
17-
let controller = Controller::new(&server.endpoint(), "", Runner::Echo, false).await?;
17+
let controller =
18+
Controller::new(&server.endpoint(), "", Runner::Echo, false, None, None).await?;
1819
controller.close().await?;
1920
Ok(())
2021
}
@@ -23,7 +24,7 @@ async fn test_handshake() -> Result<()> {
2324
async fn test_command() -> Result<()> {
2425
let server = TestServer::new().await;
2526
let runner = Runner::Shell("/bin/bash".into());
26-
let mut controller = Controller::new(&server.endpoint(), "", runner, false).await?;
27+
let mut controller = Controller::new(&server.endpoint(), "", runner, false, None, None).await?;
2728

2829
let session = server
2930
.state()
@@ -71,7 +72,8 @@ async fn test_ws_missing() -> Result<()> {
7172
async fn test_ws_basic() -> Result<()> {
7273
let server = TestServer::new().await;
7374

74-
let mut controller = Controller::new(&server.endpoint(), "", Runner::Echo, false).await?;
75+
let mut controller =
76+
Controller::new(&server.endpoint(), "", Runner::Echo, false, None, None).await?;
7577
let name = controller.name().to_owned();
7678
let key = controller.encryption_key().to_owned();
7779
tokio::spawn(async move { controller.run().await });
@@ -103,7 +105,8 @@ async fn test_ws_basic() -> Result<()> {
103105
async fn test_ws_resize() -> Result<()> {
104106
let server = TestServer::new().await;
105107

106-
let mut controller = Controller::new(&server.endpoint(), "", Runner::Echo, false).await?;
108+
let mut controller =
109+
Controller::new(&server.endpoint(), "", Runner::Echo, false, None, None).await?;
107110
let name = controller.name().to_owned();
108111
let key = controller.encryption_key().to_owned();
109112
tokio::spawn(async move { controller.run().await });
@@ -147,7 +150,8 @@ async fn test_ws_resize() -> Result<()> {
147150
async fn test_users_join() -> Result<()> {
148151
let server = TestServer::new().await;
149152

150-
let mut controller = Controller::new(&server.endpoint(), "", Runner::Echo, false).await?;
153+
let mut controller =
154+
Controller::new(&server.endpoint(), "", Runner::Echo, false, None, None).await?;
151155
let name = controller.name().to_owned();
152156
let key = controller.encryption_key().to_owned();
153157
tokio::spawn(async move { controller.run().await });
@@ -176,7 +180,8 @@ async fn test_users_join() -> Result<()> {
176180
async fn test_users_metadata() -> Result<()> {
177181
let server = TestServer::new().await;
178182

179-
let mut controller = Controller::new(&server.endpoint(), "", Runner::Echo, false).await?;
183+
let mut controller =
184+
Controller::new(&server.endpoint(), "", Runner::Echo, false, None, None).await?;
180185
let name = controller.name().to_owned();
181186
let key = controller.encryption_key().to_owned();
182187
tokio::spawn(async move { controller.run().await });
@@ -201,7 +206,8 @@ async fn test_users_metadata() -> Result<()> {
201206
async fn test_chat_messages() -> Result<()> {
202207
let server = TestServer::new().await;
203208

204-
let mut controller = Controller::new(&server.endpoint(), "", Runner::Echo, false).await?;
209+
let mut controller =
210+
Controller::new(&server.endpoint(), "", Runner::Echo, false, None, None).await?;
205211
let name = controller.name().to_owned();
206212
let key = controller.encryption_key().to_owned();
207213
tokio::spawn(async move { controller.run().await });
@@ -234,7 +240,8 @@ async fn test_read_write_permissions() -> Result<()> {
234240
let server = TestServer::new().await;
235241

236242
// create controller with read-only mode enabled
237-
let mut controller = Controller::new(&server.endpoint(), "", Runner::Echo, true).await?;
243+
let mut controller =
244+
Controller::new(&server.endpoint(), "", Runner::Echo, true, None, None).await?;
238245
let name = controller.name().to_owned();
239246
let key = controller.encryption_key().to_owned();
240247
let write_url = controller

crates/sshx/src/controller.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,15 @@ impl Controller {
5252
name: &str,
5353
runner: Runner,
5454
enable_readers: bool,
55+
session_id: Option<String>,
56+
secret: Option<String>,
5557
) -> Result<Self> {
5658
debug!(%origin, "connecting to server");
57-
let encryption_key = rand_alphanumeric(14); // 83.3 bits of entropy
59+
60+
let encryption_key = match secret {
61+
Some(s) => s,
62+
None => rand_alphanumeric(14), // 83.3 bits of entropy
63+
};
5864

5965
let kdf_task = {
6066
let encryption_key = encryption_key.clone();
@@ -85,6 +91,7 @@ impl Controller {
8591
encrypted_zeros: encrypt.zeros().into(),
8692
name: name.into(),
8793
write_password_hash,
94+
session_id,
8895
};
8996
let mut resp = client.open(req).await?.into_inner();
9097
resp.url = resp.url + "#" + &encryption_key;

crates/sshx/src/main.rs

+17-1
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ struct Args {
3131
/// editors.
3232
#[clap(long)]
3333
enable_readers: bool,
34+
35+
/// Optional custom session ID.
36+
#[clap(long)]
37+
session_id: Option<String>,
38+
39+
/// Optional encryption key.
40+
#[clap(long)]
41+
secret: Option<String>,
3442
}
3543

3644
fn print_greeting(shell: &str, controller: &Controller) {
@@ -90,7 +98,15 @@ async fn start(args: Args) -> Result<()> {
9098
});
9199

92100
let runner = Runner::Shell(shell.clone());
93-
let mut controller = Controller::new(&args.server, &name, runner, args.enable_readers).await?;
101+
let mut controller = Controller::new(
102+
&args.server,
103+
&name,
104+
runner,
105+
args.enable_readers,
106+
args.session_id,
107+
args.secret,
108+
)
109+
.await?;
94110
if args.quiet {
95111
println!("{}", controller.url());
96112
} else {

0 commit comments

Comments
 (0)