From 3ff3d7f90f3a9d160964d66a4d1d76d0bdd81325 Mon Sep 17 00:00:00 2001
From: Georgy Moshkin <gmoshkin@picodata.io>
Date: Tue, 30 Jan 2024 19:52:47 +0300
Subject: [PATCH] fix: use user 'pico_service' for inter-instance communication

---
 src/cli/test.rs        | 6 ------
 src/lib.rs             | 7 -------
 src/rpc/mod.rs         | 8 +++++++-
 src/rpc/sharding.rs    | 2 --
 src/tarantool.rs       | 2 ++
 src/traft/network.rs   | 7 ++++++-
 src/vshard.rs          | 3 ++-
 test/conftest.py       | 3 +++
 test/int/test_audit.py | 8 ++++----
 test/int/test_ddl.py   | 7 ++++---
 10 files changed, 28 insertions(+), 25 deletions(-)

diff --git a/src/cli/test.rs b/src/cli/test.rs
index 750c2e98d8..3c1ad2f6c3 100644
--- a/src/cli/test.rs
+++ b/src/cli/test.rs
@@ -143,12 +143,6 @@ fn test_one(test: &TestCase) {
     tarantool::set_cfg(&cfg);
 
     crate::schema::init_user_pico_service();
-    tarantool::exec(
-        r#"
-        box.schema.user.grant('guest', 'super', nil, nil, {if_not_exists = true})
-        "#,
-    )
-    .unwrap();
 
     test.run();
     std::process::exit(0i32);
diff --git a/src/lib.rs b/src/lib.rs
index 6e1e70eee9..64affbb7e0 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -228,13 +228,6 @@ fn start_webui() {
 /// Those are used for inter-instance communication
 /// (discovery, rpc, public proc api).
 fn init_handlers() {
-    tarantool::exec(
-        r#"
-        box.schema.user.grant('guest', 'super', nil, nil, {if_not_exists = true})
-        "#,
-    )
-    .expect("box.schema.user.grant should never fail");
-
     let lua = ::tarantool::lua_state();
     for proc in ::tarantool::proc::all_procs().iter() {
         lua.exec_with(
diff --git a/src/rpc/mod.rs b/src/rpc/mod.rs
index 52bade9f32..e48d61a514 100644
--- a/src/rpc/mod.rs
+++ b/src/rpc/mod.rs
@@ -2,8 +2,10 @@
 
 use ::tarantool::network::AsClient as _;
 use ::tarantool::network::Client;
+use ::tarantool::network::Config;
 use ::tarantool::tuple::{DecodeOwned, Encode};
 
+use crate::schema::PICO_SERVICE_USER_NAME;
 use crate::traft::error::Error;
 use crate::traft::node;
 use crate::traft::Result;
@@ -55,7 +57,11 @@ where
     let port: u16 = port.parse().map_err(|err| {
         ::tarantool::error::Error::IO(io::Error::new(io::ErrorKind::InvalidInput, err))
     })?;
-    let client = Client::connect(address, port).await?;
+
+    let mut config = Config::default();
+    config.creds = Some((PICO_SERVICE_USER_NAME.into(), "".into()));
+    let client = Client::connect_with_config(address, port, config).await?;
+
     let tuple = client.call(R::PROC_NAME, request).await?;
     decode_iproto_return_value(tuple)
 }
diff --git a/src/rpc/sharding.rs b/src/rpc/sharding.rs
index 4dca11f0fd..3192adff64 100644
--- a/src/rpc/sharding.rs
+++ b/src/rpc/sharding.rs
@@ -33,8 +33,6 @@ crate::define_rpc_request! {
             }
         }
 
-        // TODO: fix user's permissions
-        lua.exec("box.session.su('admin')")?;
         // TODO: only done on instances with corresponding roles
         lua.exec_with(
             "vshard = require('vshard')
diff --git a/src/tarantool.rs b/src/tarantool.rs
index 05066f98f7..8232ae6fcd 100644
--- a/src/tarantool.rs
+++ b/src/tarantool.rs
@@ -4,6 +4,7 @@ use std::os::unix::ffi::OsStrExt;
 use std::time::Duration;
 use std::time::Instant;
 
+use crate::schema::PICO_SERVICE_USER_NAME;
 use ::tarantool::fiber;
 use ::tarantool::lua_state;
 use ::tarantool::net_box;
@@ -207,6 +208,7 @@ where
     let now = Instant::now();
 
     let conn_opts = net_box::ConnOptions {
+        user: PICO_SERVICE_USER_NAME.into(),
         connect_timeout: timeout,
         ..Default::default()
     };
diff --git a/src/traft/network.rs b/src/traft/network.rs
index 12c3089c97..e140509cba 100644
--- a/src/traft/network.rs
+++ b/src/traft/network.rs
@@ -3,6 +3,7 @@ use crate::instance::InstanceId;
 use crate::mailbox::Mailbox;
 use crate::reachability::InstanceReachabilityManagerRef;
 use crate::rpc;
+use crate::schema::PICO_SERVICE_USER_NAME;
 use crate::storage::{Clusterwide, Instances, PeerAddresses};
 use crate::tlog;
 use crate::traft;
@@ -19,6 +20,7 @@ use ::tarantool::fiber::r#async::timeout::IntoTimeout as _;
 use ::tarantool::fiber::r#async::watch;
 use ::tarantool::network;
 use ::tarantool::network::AsClient as _;
+use ::tarantool::network::Config;
 use ::tarantool::network::Error as NetError;
 use ::tarantool::network::ReconnClient;
 use ::tarantool::tuple::{ToTupleBuffer, Tuple, TupleBuffer};
@@ -187,7 +189,10 @@ impl PoolWorker {
         max_concurrent_fut: usize,
         instance_reachability: InstanceReachabilityManagerRef,
     ) {
-        let client = ReconnClient::new(address.clone(), port);
+        let mut config = Config::default();
+        config.creds = Some((PICO_SERVICE_USER_NAME.into(), "".into()));
+        let client = ReconnClient::with_config(address.clone(), port, config);
+
         let mut client_ver: usize = 0;
         let mut futures = VecDeque::new();
         loop {
diff --git a/src/vshard.rs b/src/vshard.rs
index 0fcecc9d30..eb8d7801b0 100644
--- a/src/vshard.rs
+++ b/src/vshard.rs
@@ -3,6 +3,7 @@ use crate::instance::Instance;
 use crate::replicaset::Replicaset;
 use crate::replicaset::ReplicasetId;
 use crate::replicaset::Weight;
+use crate::schema::PICO_SERVICE_USER_NAME;
 use crate::traft::RaftId;
 use ::tarantool::tlua;
 use std::collections::HashMap;
@@ -88,7 +89,7 @@ impl VshardConfig {
             replicaset.replicas.insert(
                 peer.instance_uuid.clone(),
                 ReplicaSpec {
-                    uri: format!("guest:@{address}"),
+                    uri: format!("{PICO_SERVICE_USER_NAME}:@{address}"),
                     master: r.current_master_id == peer.instance_id,
                     name: peer.instance_id.to_string(),
                 },
diff --git a/test/conftest.py b/test/conftest.py
index 00bade4d4e..4143519af8 100644
--- a/test/conftest.py
+++ b/test/conftest.py
@@ -546,6 +546,9 @@ class Instance:
     def connect(
         self, timeout: int | float, user: str | None = None, password: str | None = None
     ):
+        if user is None:
+            user = "pico_service"
+
         c = Connection(
             self.host,
             self.port,
diff --git a/test/int/test_audit.py b/test/int/test_audit.py
index 44ea1aa5b2..fbdf62f563 100644
--- a/test/int/test_audit.py
+++ b/test/int/test_audit.py
@@ -386,14 +386,14 @@ def test_create_drop_table(instance: Instance):
     assert create_table.name == "foo"
     assert create_table.message == "created table `foo`"
     assert create_table.severity == Severity.Medium
-    assert create_table.initiator == "guest"
+    assert create_table.initiator == "pico_service"
 
     drop_table = take_until_type(events, EventDropTable)
     assert drop_table is not None
     assert drop_table.name == "foo"
     assert drop_table.message == "dropped table `foo`"
     assert drop_table.severity == Severity.Medium
-    assert drop_table.initiator == "guest"
+    assert drop_table.initiator == "pico_service"
 
 
 def test_user(instance: Instance):
@@ -425,7 +425,7 @@ def test_user(instance: Instance):
     assert create_user.auth_type == "chap-sha1"
     assert create_user.message == f"created user `{create_user.user}`"
     assert create_user.severity == Severity.High
-    assert create_user.initiator == "guest"
+    assert create_user.initiator == "pico_service"
 
     change_password = take_until_type(events, EventChangePassword)
     assert change_password is not None
@@ -443,7 +443,7 @@ def test_user(instance: Instance):
     assert drop_user.user == "ymir"
     assert drop_user.message == f"dropped user `{drop_user.user}`"
     assert drop_user.severity == Severity.Medium
-    assert drop_user.initiator == "guest"
+    assert drop_user.initiator == "pico_service"
 
 
 def test_role(instance: Instance):
diff --git a/test/int/test_ddl.py b/test/int/test_ddl.py
index 9e37657bbb..9bece3d434 100644
--- a/test/int/test_ddl.py
+++ b/test/int/test_ddl.py
@@ -80,6 +80,7 @@ def test_ddl_lua_api(cluster: Cluster):
         )
     )
     space_id = 1027
+    initiator_id = 32 # pico_service
     pico_space_def = [
         space_id,
         "space 2",
@@ -88,7 +89,7 @@ def test_ddl_lua_api(cluster: Cluster):
         2,
         True,
         "memtx",
-        0,
+        initiator_id,
     ]
     assert i1.call("box.space._pico_table:get", space_id) == pico_space_def
     assert i2.call("box.space._pico_table:get", space_id) == pico_space_def
@@ -111,7 +112,7 @@ def test_ddl_lua_api(cluster: Cluster):
         3,
         True,
         "memtx",
-        0,
+        initiator_id,
     ]
     assert i1.call("box.space._pico_table:get", space_id) == pico_space_def
     assert i2.call("box.space._pico_table:get", space_id) == pico_space_def
@@ -131,7 +132,7 @@ def test_ddl_lua_api(cluster: Cluster):
         4,
         True,
         "vinyl",
-        0,
+        initiator_id,
     ]
     cluster.create_table(
         dict(
-- 
GitLab