@@ -57,6 +57,7 @@ impl SessionManager {
5757
5858 pub async fn create_session (
5959 & self ,
60+ requested_session_id : & str ,
6061 shell : & str ,
6162 env : & HashMap < String , String > ,
6263 ) -> Result < String , Status > {
@@ -71,19 +72,25 @@ impl SessionManager {
7172 let shell = if shell. is_empty ( ) { "/bin/bash" } else { shell } ;
7273 let ( master_fd, child_pid) = spawn_shell ( shell, env) ?;
7374
74- let id_num = self . next_id . fetch_add ( 1 , Ordering :: Relaxed ) ;
75- let session_id = format ! ( "sess_{id_num:04}" ) ;
75+ let session_id = if requested_session_id. is_empty ( ) {
76+ let id_num = self . next_id . fetch_add ( 1 , Ordering :: Relaxed ) ;
77+ format ! ( "sess_{id_num:04}" )
78+ } else {
79+ requested_session_id. to_string ( )
80+ } ;
7681
7782 let session = Arc :: new ( Session {
7883 master_fd : RawFdWrapper { fd : master_fd } ,
7984 child_pid,
8085 exec_lock : Mutex :: new ( ( ) ) ,
8186 } ) ;
8287
83- self . sessions
84- . write ( )
85- . await
86- . insert ( session_id. clone ( ) , session) ;
88+ let replaced = self . sessions . write ( ) . await . insert ( session_id. clone ( ) , session) ;
89+ if replaced. is_some ( ) {
90+ return Err ( Status :: already_exists ( format ! (
91+ "session {session_id} already exists"
92+ ) ) ) ;
93+ }
8794
8895 debug ! ( session_id, child_pid, shell, "created session" ) ;
8996 Ok ( session_id)
@@ -668,7 +675,10 @@ mod tests {
668675 async fn session_manager_create_and_destroy ( ) {
669676 let manager = SessionManager :: new ( ) ;
670677 let env = HashMap :: new ( ) ;
671- let session_id = manager. create_session ( "/bin/sh" , & env) . await . unwrap ( ) ;
678+ let session_id = manager
679+ . create_session ( "sess_test_1" , "/bin/sh" , & env)
680+ . await
681+ . unwrap ( ) ;
672682 assert ! ( session_id. starts_with( "sess_" ) ) ;
673683
674684 // Session should be accessible
@@ -686,8 +696,14 @@ mod tests {
686696 let manager = SessionManager :: new ( ) ;
687697 let env = HashMap :: new ( ) ;
688698
689- let id1 = manager. create_session ( "/bin/sh" , & env) . await . unwrap ( ) ;
690- let id2 = manager. create_session ( "/bin/sh" , & env) . await . unwrap ( ) ;
699+ let id1 = manager
700+ . create_session ( "sess_test_1" , "/bin/sh" , & env)
701+ . await
702+ . unwrap ( ) ;
703+ let id2 = manager
704+ . create_session ( "sess_test_2" , "/bin/sh" , & env)
705+ . await
706+ . unwrap ( ) ;
691707 assert_ne ! ( id1, id2) ;
692708
693709 manager. destroy_session ( & id1) . await . unwrap ( ) ;
@@ -701,12 +717,15 @@ mod tests {
701717
702718 let mut ids = Vec :: new ( ) ;
703719 for _ in 0 ..MAX_SESSIONS {
704- let id = manager. create_session ( "/bin/sh" , & env) . await . unwrap ( ) ;
720+ let id = manager
721+ . create_session ( "" , "/bin/sh" , & env)
722+ . await
723+ . unwrap ( ) ;
705724 ids. push ( id) ;
706725 }
707726
708727 // Next session should fail with resource exhausted
709- let result = manager. create_session ( "/bin/sh" , & env) . await ;
728+ let result = manager. create_session ( "" , " /bin/sh", & env) . await ;
710729 assert ! ( result. is_err( ) ) ;
711730 assert_eq ! ( result. unwrap_err( ) . code( ) , tonic:: Code :: ResourceExhausted ) ;
712731
@@ -721,7 +740,7 @@ mod tests {
721740 let manager = SessionManager :: new ( ) ;
722741 let env = HashMap :: new ( ) ;
723742 // Empty shell should default to /bin/bash
724- let id = manager. create_session ( "" , & env) . await . unwrap ( ) ;
743+ let id = manager. create_session ( "" , "" , & env) . await . unwrap ( ) ;
725744 assert ! ( id. starts_with( "sess_" ) ) ;
726745 manager. destroy_session ( & id) . await . unwrap ( ) ;
727746 }
@@ -731,8 +750,8 @@ mod tests {
731750 let manager = SessionManager :: new ( ) ;
732751 let env = HashMap :: new ( ) ;
733752
734- manager. create_session ( "/bin/sh" , & env) . await . unwrap ( ) ;
735- manager. create_session ( "/bin/sh" , & env) . await . unwrap ( ) ;
753+ manager. create_session ( "sess_test_1" , " /bin/sh", & env) . await . unwrap ( ) ;
754+ manager. create_session ( "sess_test_2" , " /bin/sh", & env) . await . unwrap ( ) ;
736755
737756 manager. destroy_all ( ) . await ;
738757
@@ -746,7 +765,7 @@ mod tests {
746765 let manager = SessionManager :: new ( ) ;
747766 let env = HashMap :: new ( ) ;
748767 let result = manager
749- . create_session ( "/nonexistent/shell" , & env)
768+ . create_session ( "" , " /nonexistent/shell", & env)
750769 . await ;
751770 assert ! ( result. is_err( ) ) ;
752771 }
0 commit comments