397 lines
14 KiB
C++
397 lines
14 KiB
C++
/**
|
|
* Copyright (c) 2021 OceanBase
|
|
* OceanBase CE is licensed under Mulan PubL v2.
|
|
* You can use this software according to the terms and conditions of the Mulan PubL v2.
|
|
* You may obtain a copy of Mulan PubL v2 at:
|
|
* http://license.coscl.org.cn/MulanPubL-2.0
|
|
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
|
|
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
|
|
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
|
|
* See the Mulan PubL v2 for more details.
|
|
*/
|
|
|
|
#define USING_LOG_PREFIX SHARE_SCHEMA
|
|
#include <unistd.h>
|
|
#include <gtest/gtest.h>
|
|
#include "lib/allocator/ob_tc_malloc.h"
|
|
#include "lib/container/ob_se_array.h"
|
|
#include "lib/oblog/ob_log.h"
|
|
#define private public
|
|
#define protected public
|
|
#include "share/schema/ob_priv_mgr.h"
|
|
#include "ob_schema_test_utils.cpp"
|
|
|
|
namespace oceanbase
|
|
{
|
|
using namespace common;
|
|
namespace share
|
|
{
|
|
namespace schema
|
|
{
|
|
class TestPrivMgr : public ::testing::Test
|
|
{
|
|
public:
|
|
virtual void SetUp();
|
|
virtual void TearDown() {}
|
|
protected:
|
|
ObPrivMgr priv_mgr_;
|
|
};
|
|
|
|
void TestPrivMgr::SetUp()
|
|
{
|
|
//obsys::ObSysConfig c1;
|
|
//priv_mgr_.init();
|
|
}
|
|
|
|
#define DB_PRIV_EQUAL(db_priv, db_priv_other) \
|
|
ASSERT_EQ(db_priv.get_tenant_id(), db_priv_other.get_tenant_id()); \
|
|
ASSERT_EQ(db_priv.get_user_id(), db_priv_other.get_user_id()); \
|
|
ASSERT_EQ(db_priv.get_database_name_str(), db_priv_other.get_database_name_str()); \
|
|
ASSERT_EQ(db_priv.get_priv_set(), db_priv_other.get_priv_set());
|
|
|
|
#define TABLE_PRIV_EQUAL(table_priv, table_priv_other) \
|
|
ASSERT_EQ(table_priv.get_tenant_id(), table_priv_other.get_tenant_id()); \
|
|
ASSERT_EQ(table_priv.get_user_id(), table_priv_other.get_user_id()); \
|
|
ASSERT_EQ(table_priv.get_database_name_str(), table_priv_other.get_database_name_str()); \
|
|
ASSERT_EQ(table_priv.get_table_name_str(), table_priv_other.get_table_name_str()); \
|
|
ASSERT_EQ(table_priv.get_priv_set(), table_priv_other.get_priv_set());
|
|
|
|
|
|
TEST_F(TestPrivMgr, privs_test)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
|
|
//----------------privileges constructed as follows---------------
|
|
//---__all_tenant
|
|
//--tenant_id--tenant_name--replica_num--zone_list--resource_pool_list--primary_zone--locked--status--info
|
|
// 1 ob 3 127.0.0.1 127.0.0.1 127.0.0.1 0 0
|
|
// 2 yz 3 127.0.0.1 127.0.0.1 127.0.0.1 0 0
|
|
|
|
//----__all_user
|
|
//--tenant_id--user_id--user_name--host--passwd--privs----locked
|
|
// 1 1 yz1 % empty SELECT false
|
|
// 1 2 yz2 % empty empty false
|
|
// 2 1 t2_u1 % empty empty false
|
|
|
|
//----__all_database_privilige
|
|
//--tenant_id--user_id--database_name--privs
|
|
// 1 2 db SELECT
|
|
// 1 2 ali% ALTER
|
|
// 1 2 alipay% CREATE
|
|
// 2 1 ali CREATE
|
|
|
|
//----__all_table_privilege
|
|
//--tenant_id--user_id--database_name--table_name--privs
|
|
// 1 2 ali sale SELECT, INSERT
|
|
// 1 1 ali customer CREATE, UPDATE
|
|
// 2 1 db2 sale CREATE, UPDATE
|
|
|
|
//-----------------add priv test--------------------
|
|
//----add user db priv
|
|
ObArray<ObDBPriv> db_priv_array;
|
|
ObDBPriv db_priv;
|
|
//db_priv: tenant_id, user_id, db_name, priv_set, sort_value
|
|
FILL_DB_PRIV(db_priv, 1, 2, "db", OB_PRIV_SELECT);
|
|
db_priv_array.push_back(db_priv);
|
|
|
|
db_priv.reset();
|
|
FILL_DB_PRIV(db_priv, 1, 2, "ali%", OB_PRIV_ALTER);
|
|
db_priv_array.push_back(db_priv);
|
|
|
|
db_priv.reset();
|
|
FILL_DB_PRIV(db_priv, 1, 2, "alipay%", OB_PRIV_CREATE);
|
|
db_priv_array.push_back(db_priv);
|
|
|
|
db_priv.reset();
|
|
FILL_DB_PRIV(db_priv, 2, 1, "ali", OB_PRIV_CREATE);
|
|
db_priv_array.push_back(db_priv);
|
|
|
|
ret = priv_mgr_.add_db_privs(db_priv_array);
|
|
ASSERT_TRUE(OB_SUCC(ret));
|
|
|
|
//----add user table priv
|
|
//user(1, "yz2") db(ali) table(sale) priv(SELECT,INSERT)
|
|
ObArray<ObTablePriv> table_priv_array;
|
|
ObTablePriv table_priv;
|
|
FILL_TABLE_PRIV(table_priv, 1, 2, "ali", "sale", OB_PRIV_SELECT | OB_PRIV_INSERT);
|
|
table_priv_array.push_back(table_priv);
|
|
|
|
//user(1, "yz1") db(ali) table(customer) priv(CREATE,UPDATE)
|
|
table_priv.reset();
|
|
FILL_TABLE_PRIV(table_priv, 1, 1, "ali", "customer", OB_PRIV_CREATE | OB_PRIV_UPDATE);
|
|
table_priv_array.push_back(table_priv);
|
|
|
|
//user(1, "yz1") db(ali) table(sale) priv(CREATE,UPDATE)
|
|
table_priv.reset();
|
|
FILL_TABLE_PRIV(table_priv, 1, 1, "taobao", "sale", OB_PRIV_CREATE | OB_PRIV_UPDATE);
|
|
table_priv_array.push_back(table_priv);
|
|
|
|
//user(2, "t2_u1") db(db2) table(sale) priv(CREATE,UPDATE)
|
|
table_priv.reset();
|
|
FILL_TABLE_PRIV(table_priv, 2, 1, "db2", "sale", OB_PRIV_CREATE | OB_PRIV_UPDATE);
|
|
table_priv_array.push_back(table_priv);
|
|
|
|
ret = priv_mgr_.add_table_privs(table_priv_array);
|
|
ASSERT_TRUE(OB_SUCC(ret));
|
|
|
|
ObArray<const ObDBPriv *>db_priv_pointers;
|
|
ret = priv_mgr_.get_db_privs_in_tenant(2, db_priv_pointers);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_EQ(1, db_priv_pointers.count());
|
|
db_priv_pointers.reset();
|
|
ret = priv_mgr_.get_db_privs_in_user(1, 2, db_priv_pointers);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_EQ(3, db_priv_pointers.count());
|
|
|
|
ObArray<const ObTablePriv *>table_priv_pointers;
|
|
ret = priv_mgr_.get_table_privs_in_user(OB_INVALID, OB_INVALID_ID, table_priv_pointers);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_EQ(0, table_priv_pointers.count());
|
|
ret = priv_mgr_.get_table_privs_in_user(1, 2, table_priv_pointers);
|
|
ASSERT_EQ(1, table_priv_pointers.count());
|
|
table_priv_pointers.reset();
|
|
ret = priv_mgr_.get_table_privs_in_tenant(OB_INVALID_ID, table_priv_pointers);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
table_priv_pointers.reset();
|
|
ret = priv_mgr_.get_table_privs_in_tenant(1, table_priv_pointers);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_EQ(3, table_priv_pointers.count());
|
|
|
|
|
|
//-----------------get priv test--------------------
|
|
//get db priv
|
|
const ObDBPriv *p_db_priv = NULL;
|
|
ret = priv_mgr_.get_db_priv(ObOriginalDBKey(1, 2, "db"), p_db_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL != p_db_priv);
|
|
ASSERT_TRUE(1 == p_db_priv->get_tenant_id());
|
|
ASSERT_TRUE(OB_PRIV_SELECT == p_db_priv->get_priv_set());
|
|
|
|
//'alipay_inc' match 'alipay%', because 'alipay' is more specific than 'ali%'
|
|
ret = priv_mgr_.get_db_priv(ObOriginalDBKey(1, 2, "alipay_inc"), p_db_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL != p_db_priv);
|
|
ASSERT_TRUE(1 == p_db_priv->get_tenant_id());
|
|
ASSERT_TRUE(OB_PRIV_CREATE == p_db_priv->get_priv_set());
|
|
|
|
//get table priv
|
|
const ObTablePriv *p_table_priv = NULL;
|
|
ret = priv_mgr_.get_table_priv(ObTablePrivSortKey(1, 2, "ali", "sale"), p_table_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL != p_table_priv);
|
|
ASSERT_TRUE(1 == p_table_priv->get_tenant_id());
|
|
ASSERT_TRUE(2 == p_table_priv->get_user_id());
|
|
ASSERT_TRUE(p_table_priv->get_database_name_str() == "ali");
|
|
ASSERT_TRUE(p_table_priv->get_table_name_str() == "sale");
|
|
ASSERT_TRUE((OB_PRIV_SELECT | OB_PRIV_INSERT) == p_table_priv->get_priv_set());
|
|
ret = priv_mgr_.get_table_priv(ObTablePrivSortKey(1, 2, "ali", "fsdfs"), p_table_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL == p_table_priv);
|
|
|
|
|
|
ret = priv_mgr_.get_table_priv(ObTablePrivSortKey(1, 1, "ali", "customer"), p_table_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL != p_table_priv);
|
|
ASSERT_TRUE(1 == p_table_priv->get_tenant_id());
|
|
ASSERT_TRUE(1 == p_table_priv->get_user_id());
|
|
ASSERT_TRUE(p_table_priv->get_database_name_str() == "ali");
|
|
ASSERT_TRUE(p_table_priv->get_table_name_str() == "customer");
|
|
ASSERT_TRUE((OB_PRIV_CREATE | OB_PRIV_UPDATE) == p_table_priv->get_priv_set());
|
|
|
|
ret = priv_mgr_.get_table_priv(ObTablePrivSortKey(2, 1, "db2", "sale"), p_table_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL != p_table_priv);
|
|
ASSERT_TRUE(2 == p_table_priv->get_tenant_id());
|
|
ASSERT_TRUE(1 == p_table_priv->get_user_id());
|
|
ASSERT_TRUE(p_table_priv->get_database_name_str() == "db2");
|
|
ASSERT_TRUE(p_table_priv->get_table_name_str() == "sale");
|
|
ASSERT_TRUE((OB_PRIV_CREATE | OB_PRIV_UPDATE) == p_table_priv->get_priv_set());
|
|
|
|
//----------------delete priv test------------------
|
|
//----delete db priv
|
|
ObArray<ObOriginalDBKey> db_keys;
|
|
|
|
ObOriginalDBKey db_key;
|
|
db_key.tenant_id_ = 1;
|
|
db_key.user_id_ = 2;
|
|
db_key.db_ = "db";
|
|
db_keys.push_back(db_key);
|
|
|
|
db_key.tenant_id_ = 1;
|
|
db_key.user_id_ = 2;
|
|
db_key.db_ = "ali%";
|
|
db_keys.push_back(db_key);
|
|
|
|
ret = priv_mgr_.del_db_privs(db_keys);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
//db priv with key (1, 2, db) deleted
|
|
ret = priv_mgr_.get_db_priv(ObOriginalDBKey(1, 2, "db"), p_db_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL == p_db_priv);
|
|
|
|
//db priv with key (1, 2, ali%) deleted
|
|
ret = priv_mgr_.get_db_priv(ObOriginalDBKey(1, 2, "ali%"), p_db_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL == p_db_priv);
|
|
|
|
//db priv with key (1, 2, alipay%) has not been deleted
|
|
ret = priv_mgr_.get_db_priv(ObOriginalDBKey(1, 2, "alipay%"), p_db_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL != p_db_priv);
|
|
ret = priv_mgr_.del_db_privs(db_keys);
|
|
ASSERT_NE(OB_SUCCESS, ret);
|
|
|
|
//----delete table priv
|
|
ObArray<ObTablePrivSortKey> table_keys;
|
|
|
|
ObTablePrivSortKey table_key;
|
|
table_key.tenant_id_ = 1;
|
|
table_key.user_id_ = 2;
|
|
table_key.db_ = "ali";
|
|
table_key.table_ = "sale";
|
|
table_keys.push_back(table_key);
|
|
|
|
ret = priv_mgr_.del_table_privs(table_keys);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
//table priv with key(1, 2, ali, sale) deleted
|
|
ret = priv_mgr_.get_table_priv(ObTablePrivSortKey(1, 2, "ali", "sale"), p_table_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL == p_table_priv);
|
|
|
|
//table priv with key(2, 1, db2, sale) has not been deleted
|
|
ret = priv_mgr_.get_table_priv(ObTablePrivSortKey(2, 1, "db2", "sale"), p_table_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL != p_table_priv);
|
|
ret = priv_mgr_.del_table_priv(ObTablePrivSortKey(2, 1, "db2", "sale"));
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ret = priv_mgr_.get_table_priv(ObTablePrivSortKey(2, 1, "db2", "sale"), p_table_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL == p_table_priv);
|
|
ret = priv_mgr_.del_table_priv(ObTablePrivSortKey(2, 1, "db2", "sale"));
|
|
ASSERT_NE(OB_SUCCESS, ret);
|
|
|
|
// dump
|
|
priv_mgr_.dump();
|
|
|
|
}
|
|
|
|
TEST_F(TestPrivMgr, reset_and_assign)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObPrivMgr priv_mgr;
|
|
// db priv
|
|
ObDBPriv db_priv;
|
|
ObArray<ObDBPriv> db_privs;
|
|
FILL_DB_PRIV(db_priv, 1, 2, "nijia", OB_PRIV_ALTER);
|
|
db_privs.push_back(db_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
FILL_DB_PRIV(db_priv, 1, 3, "test", OB_PRIV_ALTER);
|
|
db_privs.push_back(db_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
FILL_DB_PRIV(db_priv, 1, 3, "haha", OB_PRIV_ALTER);
|
|
db_privs.push_back(db_priv);
|
|
ret = priv_mgr.add_db_privs(db_privs);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
// table priv
|
|
ObTablePriv table_priv;
|
|
ObArray<ObTablePriv> table_privs;
|
|
FILL_TABLE_PRIV(table_priv, 1, 2, "nijia", "t1", OB_PRIV_ALTER);
|
|
table_privs.push_back(table_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
FILL_TABLE_PRIV(table_priv, 1, 3, "test", "t2", OB_PRIV_ALTER);
|
|
table_privs.push_back(table_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
FILL_TABLE_PRIV(table_priv, 1, 3, "haha", "t3", OB_PRIV_ALTER);
|
|
table_privs.push_back(table_priv);
|
|
ret = priv_mgr.add_table_privs(table_privs);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
|
|
ObPrivMgr new_priv_mgr;
|
|
ret = new_priv_mgr.assign(priv_mgr);
|
|
for (int64_t i = 0 ; i < db_privs.count(); ++i) {
|
|
const ObDBPriv &cur_db_priv = db_privs.at(i);
|
|
const ObDBPriv *p_db_priv = NULL;
|
|
ret = new_priv_mgr.get_db_priv(cur_db_priv.get_original_key(), p_db_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL != p_db_priv);
|
|
DB_PRIV_EQUAL(cur_db_priv, (*p_db_priv));
|
|
}
|
|
for (int64_t i = 0 ; i < table_privs.count(); ++i) {
|
|
const ObTablePriv &cur_table_priv = table_privs.at(i);
|
|
const ObTablePriv *p_table_priv = NULL;
|
|
ret = new_priv_mgr.get_table_priv(cur_table_priv.get_sort_key(), p_table_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL != p_table_priv);
|
|
TABLE_PRIV_EQUAL(cur_table_priv, (*p_table_priv));
|
|
}
|
|
new_priv_mgr.reset();
|
|
for (int64_t i = 0 ; i < db_privs.count(); ++i) {
|
|
const ObDBPriv &cur_db_priv = db_privs.at(i);
|
|
const ObDBPriv *p_db_priv = NULL;
|
|
ret = new_priv_mgr.get_db_priv(cur_db_priv.get_original_key(), p_db_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL == p_db_priv);
|
|
}
|
|
for (int64_t i = 0 ; i < table_privs.count(); ++i) {
|
|
const ObTablePriv &cur_table_priv = table_privs.at(i);
|
|
const ObTablePriv *p_table_priv = NULL;
|
|
ret = new_priv_mgr.get_table_priv(cur_table_priv.get_sort_key(), p_table_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL == p_table_priv);
|
|
}
|
|
}
|
|
|
|
TEST_F(TestPrivMgr, external_allocator)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObArenaAllocator global_allocator;
|
|
ObPrivMgr priv_mgr(global_allocator);
|
|
ObDBPriv db_priv;
|
|
FILL_DB_PRIV(db_priv, 1, 2, "nijia", OB_PRIV_ALTER);
|
|
ret = priv_mgr.add_db_priv(db_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ObPrivMgr new_priv_mgr;
|
|
ret = new_priv_mgr.assign(priv_mgr);
|
|
const ObDBPriv *p_db_priv = NULL;
|
|
ret = new_priv_mgr.get_db_priv(db_priv.get_original_key(), p_db_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_TRUE(NULL != p_db_priv);
|
|
DB_PRIV_EQUAL(db_priv, (*p_db_priv));
|
|
}
|
|
|
|
TEST_F(TestPrivMgr, get_priv_set)
|
|
{
|
|
int ret = OB_SUCCESS;
|
|
ObPrivMgr priv_mgr;
|
|
// db priv
|
|
ObDBPriv db_priv;
|
|
FILL_DB_PRIV(db_priv, 1, 2, "nijia", OB_PRIV_ALTER);
|
|
ret = priv_mgr.add_db_priv(db_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ObPrivSet priv_set;
|
|
ret = priv_mgr.get_db_priv_set(db_priv.get_original_key(), priv_set);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_EQ(OB_PRIV_ALTER, priv_set);
|
|
// table_priv
|
|
ObTablePriv table_priv;
|
|
FILL_TABLE_PRIV(table_priv, 1, 2, "nijia", "t1", OB_PRIV_ALTER);
|
|
ret = priv_mgr.add_table_priv(table_priv);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ret = priv_mgr.get_table_priv_set(table_priv.get_sort_key(), priv_set);
|
|
ASSERT_EQ(OB_SUCCESS, ret);
|
|
ASSERT_EQ(OB_PRIV_ALTER, priv_set);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
OB_LOGGER.set_log_level("WARN");
|
|
OB_LOGGER.set_log_level("WARN");
|
|
::testing::InitGoogleTest(&argc,argv);
|
|
return RUN_ALL_TESTS();
|
|
}
|