diff --git a/src/core/protocol/commands.rs b/src/core/protocol/commands.rs index 5d0cc45..5ba9c2e 100644 --- a/src/core/protocol/commands.rs +++ b/src/core/protocol/commands.rs @@ -11,6 +11,7 @@ mod list_all_users; mod list_databases; mod list_privileges; mod list_users; +mod list_valid_name_prefixes; mod lock_users; mod modify_privileges; mod passwd_user; @@ -29,6 +30,7 @@ pub use list_all_users::*; pub use list_databases::*; pub use list_privileges::*; pub use list_users::*; +pub use list_valid_name_prefixes::*; pub use lock_users::*; pub use modify_privileges::*; pub use passwd_user::*; @@ -68,6 +70,7 @@ pub fn create_client_to_server_message_stream(socket: UnixStream) -> ClientToSer pub enum Request { CheckAuthorization(CheckAuthorizationRequest), + ListValidNamePrefixes, CompleteDatabaseName(CompleteDatabaseNameRequest), CompleteUserName(CompleteUserNameRequest), @@ -95,6 +98,7 @@ pub enum Request { pub enum Response { CheckAuthorization(CheckAuthorizationResponse), + ListValidNamePrefixes(ListValidNamePrefixesResponse), CompleteDatabaseName(CompleteDatabaseNameResponse), CompleteUserName(CompleteUserNameResponse), diff --git a/src/core/protocol/commands/list_valid_name_prefixes.rs b/src/core/protocol/commands/list_valid_name_prefixes.rs new file mode 100644 index 0000000..263de97 --- /dev/null +++ b/src/core/protocol/commands/list_valid_name_prefixes.rs @@ -0,0 +1 @@ +pub type ListValidNamePrefixesResponse = Vec; diff --git a/src/server/session_handler.rs b/src/server/session_handler.rs index 55a061b..8302d03 100644 --- a/src/server/session_handler.rs +++ b/src/server/session_handler.rs @@ -181,6 +181,20 @@ async fn session_handler_with_db_connection( let result = check_authorization(dbs_or_users, unix_user).await; Response::CheckAuthorization(result) } + Request::ListValidNamePrefixes => { + let mut result = Vec::with_capacity(unix_user.groups.len() + 1); + result.push(unix_user.username.to_owned()); + + for group in unix_user + .groups + .iter() + .filter(|x| *x != &unix_user.username) + { + result.push(group.to_owned()); + } + + Response::ListValidNamePrefixes(result) + } Request::CompleteDatabaseName(partial_database_name) => { // TODO: more correct validation here if !partial_database_name