Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
910aba27
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1187
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
910aba27
编写于
4月 10, 2023
作者:
X
Xiaoyu Wang
提交者:
GitHub
4月 10, 2023
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #20831 from taosdata/feat/table_level_privilege
feat: table level privilege
上级
5cc85e7f
b4f0fcc7
变更
38
展开全部
隐藏空白更改
内联
并排
Showing
38 changed file
with
4620 addition
and
3677 deletion
+4620
-3677
include/common/tmsg.h
include/common/tmsg.h
+25
-10
include/common/ttokendef.h
include/common/ttokendef.h
+49
-49
include/libs/catalog/catalog.h
include/libs/catalog/catalog.h
+10
-6
include/libs/nodes/cmdnodes.h
include/libs/nodes/cmdnodes.h
+2
-0
include/util/taoserror.h
include/util/taoserror.h
+1
-0
include/util/tdef.h
include/util/tdef.h
+1
-0
source/common/src/systable.c
source/common/src/systable.c
+3
-1
source/common/src/tmsg.c
source/common/src/tmsg.c
+97
-2
source/dnode/mnode/impl/inc/mndDef.h
source/dnode/mnode/impl/inc/mndDef.h
+2
-0
source/dnode/mnode/impl/inc/mndStb.h
source/dnode/mnode/impl/inc/mndStb.h
+1
-0
source/dnode/mnode/impl/inc/mndUser.h
source/dnode/mnode/impl/inc/mndUser.h
+1
-0
source/dnode/mnode/impl/src/mndPrivilege.c
source/dnode/mnode/impl/src/mndPrivilege.c
+1
-0
source/dnode/mnode/impl/src/mndStb.c
source/dnode/mnode/impl/src/mndStb.c
+7
-0
source/dnode/mnode/impl/src/mndUser.c
source/dnode/mnode/impl/src/mndUser.c
+363
-3
source/libs/catalog/CMakeLists.txt
source/libs/catalog/CMakeLists.txt
+2
-2
source/libs/catalog/inc/catalogInt.h
source/libs/catalog/inc/catalogInt.h
+18
-7
source/libs/catalog/src/catalog.c
source/libs/catalog/src/catalog.c
+21
-32
source/libs/catalog/src/ctgAsync.c
source/libs/catalog/src/ctgAsync.c
+34
-37
source/libs/catalog/src/ctgCache.c
source/libs/catalog/src/ctgCache.c
+37
-46
source/libs/catalog/src/ctgUtil.c
source/libs/catalog/src/ctgUtil.c
+134
-3
source/libs/catalog/test/CMakeLists.txt
source/libs/catalog/test/CMakeLists.txt
+1
-1
source/libs/catalog/test/catalogTests.cpp
source/libs/catalog/test/catalogTests.cpp
+79
-86
source/libs/nodes/src/nodesUtilFuncs.c
source/libs/nodes/src/nodesUtilFuncs.c
+9
-3
source/libs/parser/inc/parAst.h
source/libs/parser/inc/parAst.h
+9
-2
source/libs/parser/inc/parUtil.h
source/libs/parser/inc/parUtil.h
+2
-4
source/libs/parser/inc/sql.y
source/libs/parser/inc/sql.y
+10
-6
source/libs/parser/src/parAstCreater.c
source/libs/parser/src/parAstCreater.c
+16
-6
source/libs/parser/src/parAstParser.c
source/libs/parser/src/parAstParser.c
+22
-9
source/libs/parser/src/parAuthenticator.c
source/libs/parser/src/parAuthenticator.c
+100
-23
source/libs/parser/src/parInsertSql.c
source/libs/parser/src/parInsertSql.c
+130
-9
source/libs/parser/src/parTranslater.c
source/libs/parser/src/parTranslater.c
+57
-8
source/libs/parser/src/parUtil.c
source/libs/parser/src/parUtil.c
+51
-37
source/libs/parser/src/sql.c
source/libs/parser/src/sql.c
+3315
-3274
source/libs/parser/test/mockCatalog.cpp
source/libs/parser/test/mockCatalog.cpp
+4
-6
source/libs/parser/test/mockCatalogService.cpp
source/libs/parser/test/mockCatalogService.cpp
+2
-2
source/util/src/terror.c
source/util/src/terror.c
+1
-0
tests/system-test/0-others/user_control.py
tests/system-test/0-others/user_control.py
+2
-2
tests/system-test/2-query/odbc.py
tests/system-test/2-query/odbc.py
+1
-1
未找到文件。
include/common/tmsg.h
浏览文件 @
910aba27
...
...
@@ -177,6 +177,16 @@ typedef enum _mgmt_table {
#define TSDB_ALTER_USER_SYSINFO 0xA
#define TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC 0xB
#define TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC 0xC
#define TSDB_ALTER_USER_ADD_READ_TABLE 0xD
#define TSDB_ALTER_USER_REMOVE_READ_TABLE 0xE
#define TSDB_ALTER_USER_ADD_WRITE_TABLE 0xF
#define TSDB_ALTER_USER_REMOVE_WRITE_TABLE 0x10
#define TSDB_ALTER_USER_ADD_READ_TAG 0x11
#define TSDB_ALTER_USER_REMOVE_READ_TAG 0x12
#define TSDB_ALTER_USER_ADD_WRITE_TAG 0x13
#define TSDB_ALTER_USER_REMOVE_WRITE_TAG 0x14
#define TSDB_ALTER_USER_ADD_ALL_TABLE 0x15
#define TSDB_ALTER_USER_REMOVE_ALL_TABLE 0x16
#define TSDB_ALTER_USER_PRIVILEGES 0x2
...
...
@@ -669,13 +679,16 @@ int32_t tSerializeSCreateUserReq(void* buf, int32_t bufLen, SCreateUserReq* pReq
int32_t
tDeserializeSCreateUserReq
(
void
*
buf
,
int32_t
bufLen
,
SCreateUserReq
*
pReq
);
typedef
struct
{
int8_t
alterType
;
int8_t
superUser
;
int8_t
sysInfo
;
int8_t
enable
;
char
user
[
TSDB_USER_LEN
];
char
pass
[
TSDB_USET_PASSWORD_LEN
];
char
objname
[
TSDB_DB_FNAME_LEN
];
// db or topic
int8_t
alterType
;
int8_t
superUser
;
int8_t
sysInfo
;
int8_t
enable
;
char
user
[
TSDB_USER_LEN
];
char
pass
[
TSDB_USET_PASSWORD_LEN
];
char
objname
[
TSDB_DB_FNAME_LEN
];
// db or topic
char
tabName
[
TSDB_TABLE_NAME_LEN
];
char
*
tagCond
;
int32_t
tagCondLen
;
}
SAlterUserReq
;
int32_t
tSerializeSAlterUserReq
(
void
*
buf
,
int32_t
bufLen
,
SAlterUserReq
*
pReq
);
...
...
@@ -698,6 +711,8 @@ typedef struct {
SHashObj
*
createdDbs
;
SHashObj
*
readDbs
;
SHashObj
*
writeDbs
;
SHashObj
*
readTbs
;
SHashObj
*
writeTbs
;
}
SGetUserAuthRsp
;
int32_t
tSerializeSGetUserAuthRsp
(
void
*
buf
,
int32_t
bufLen
,
SGetUserAuthRsp
*
pRsp
);
...
...
@@ -3187,9 +3202,9 @@ typedef struct {
SArray
*
blockTbName
;
SArray
*
blockSchema
;
// the following attributes are extended from SMqDataRsp
int32_t
createTableNum
;
SArray
*
createTableLen
;
SArray
*
createTableReq
;
int32_t
createTableNum
;
SArray
*
createTableLen
;
SArray
*
createTableReq
;
}
STaosxRsp
;
int32_t
tEncodeSTaosxRsp
(
SEncoder
*
pEncoder
,
const
STaosxRsp
*
pRsp
);
...
...
include/common/ttokendef.h
浏览文件 @
910aba27
...
...
@@ -63,55 +63,55 @@
#define TK_READ 45
#define TK_WRITE 46
#define TK_NK_DOT 47
#define TK_
DNODE
48
#define TK_
PORT
49
#define TK_
DNODES
50
#define TK_
NK_IPTOKEN
51
#define TK_
FORCE
52
#define TK_
LOCAL
53
#define TK_
QNODE
54
#define TK_
B
NODE 55
#define TK_
S
NODE 56
#define TK_
M
NODE 57
#define TK_
DATABASE
58
#define TK_
USE
59
#define TK_
FLUSH
60
#define TK_
TRIM
61
#define TK_
COMPACT
62
#define TK_
IF
63
#define TK_
NOT
64
#define TK_
EXISTS
65
#define TK_
BUFFER
66
#define TK_
CACHEMODEL
67
#define TK_CACHE
SIZE
68
#define TK_C
OMP
69
#define TK_
DURATION
70
#define TK_
NK_VARIABLE
71
#define TK_
MAXROWS
72
#define TK_M
IN
ROWS 73
#define TK_
KEEP
74
#define TK_
PAGES
75
#define TK_PAGES
IZE
76
#define TK_
TSDB_PAGESIZE
77
#define TK_
PRECISION
78
#define TK_
REPLICA
79
#define TK_
VGROUPS
80
#define TK_
SINGLE_STABLE
81
#define TK_
RETENTIONS
82
#define TK_
SCHEMALES
S 83
#define TK_
WAL_LEVEL
84
#define TK_WAL_
FSYNC_PERIOD
85
#define TK_WAL_
RETENTION_PERIOD
86
#define TK_WAL_RETENTION_
SIZE
87
#define TK_WAL_R
OLL_PERIOD
88
#define TK_WAL_
SEGMENT_SIZE
89
#define TK_
STT_TRIGGER
90
#define TK_
TABLE_PREFIX
91
#define TK_TABLE_
SUF
FIX 92
#define TK_
NK_COLON
93
#define TK_
MAX_SPEED
94
#define TK_
START
95
#define TK_
WITH
96
#define TK_
WITH
48
#define TK_
DNODE
49
#define TK_
PORT
50
#define TK_
DNODES
51
#define TK_
NK_IPTOKEN
52
#define TK_
FORCE
53
#define TK_
LOCAL
54
#define TK_
Q
NODE 55
#define TK_
B
NODE 56
#define TK_
S
NODE 57
#define TK_
MNODE
58
#define TK_
DATABASE
59
#define TK_
USE
60
#define TK_
FLUSH
61
#define TK_
TRIM
62
#define TK_
COMPACT
63
#define TK_
IF
64
#define TK_
NOT
65
#define TK_
EXISTS
66
#define TK_
BUFFER
67
#define TK_CACHE
MODEL
68
#define TK_C
ACHESIZE
69
#define TK_
COMP
70
#define TK_
DURATION
71
#define TK_
NK_VARIABLE
72
#define TK_M
AX
ROWS 73
#define TK_
MINROWS
74
#define TK_
KEEP
75
#define TK_PAGES
76
#define TK_
PAGESIZE
77
#define TK_
TSDB_PAGESIZE
78
#define TK_
PRECISION
79
#define TK_
REPLICA
80
#define TK_
VGROUPS
81
#define TK_
SINGLE_STABLE
82
#define TK_
RETENTION
S 83
#define TK_
SCHEMALESS
84
#define TK_WAL_
LEVEL
85
#define TK_WAL_
FSYNC_PERIOD
86
#define TK_WAL_RETENTION_
PERIOD
87
#define TK_WAL_R
ETENTION_SIZE
88
#define TK_WAL_
ROLL_PERIOD
89
#define TK_
WAL_SEGMENT_SIZE
90
#define TK_
STT_TRIGGER
91
#define TK_TABLE_
PRE
FIX 92
#define TK_
TABLE_SUFFIX
93
#define TK_
NK_COLON
94
#define TK_
MAX_SPEED
95
#define TK_
START
96
#define TK_TIMESTAMP 97
#define TK_END 98
#define TK_TABLE 99
...
...
include/libs/catalog/catalog.h
浏览文件 @
910aba27
...
...
@@ -29,6 +29,7 @@ extern "C" {
#include "tmsg.h"
#include "tname.h"
#include "transport.h"
#include "nodes.h"
typedef
struct
SCatalog
SCatalog
;
...
...
@@ -49,10 +50,15 @@ typedef enum {
typedef
struct
SUserAuthInfo
{
char
user
[
TSDB_USER_LEN
];
char
dbFName
[
TSDB_DB_FNAME_LEN
]
;
SName
tbName
;
AUTH_TYPE
type
;
}
SUserAuthInfo
;
typedef
struct
SUserAuthRes
{
bool
pass
;
SNode
*
pCond
;
}
SUserAuthRes
;
typedef
struct
SDbInfo
{
int32_t
vgVer
;
int32_t
tbNum
;
...
...
@@ -96,7 +102,7 @@ typedef struct SMetaData {
SArray
*
pTableIndex
;
// pRes = SArray<STableIndexInfo>*
SArray
*
pUdfList
;
// pRes = SFuncInfo*
SArray
*
pIndex
;
// pRes = SIndexInfo*
SArray
*
pUser
;
// pRes =
bool
*
SArray
*
pUser
;
// pRes =
SUserAuthRes
*
SArray
*
pQnodeList
;
// pRes = SArray<SQueryNodeLoad>*
SArray
*
pTableCfg
;
// pRes = STableCfg*
SArray
*
pDnodeList
;
// pRes = SArray<SEpSet>*
...
...
@@ -312,11 +318,9 @@ int32_t catalogUpdateTableIndex(SCatalog* pCtg, STableIndexRsp* pRsp);
int32_t
catalogGetUdfInfo
(
SCatalog
*
pCtg
,
SRequestConnInfo
*
pConn
,
const
char
*
funcName
,
SFuncInfo
*
pInfo
);
int32_t
catalogChkAuth
(
SCatalog
*
pCtg
,
SRequestConnInfo
*
pConn
,
const
char
*
user
,
const
char
*
dbFName
,
AUTH_TYPE
type
,
bool
*
pass
);
int32_t
catalogChkAuth
(
SCatalog
*
pCtg
,
SRequestConnInfo
*
pConn
,
SUserAuthInfo
*
pAuth
,
SUserAuthRes
*
pRes
);
int32_t
catalogChkAuthFromCache
(
SCatalog
*
pCtg
,
const
char
*
user
,
const
char
*
dbFName
,
AUTH_TYPE
type
,
bool
*
pass
,
bool
*
exists
);
int32_t
catalogChkAuthFromCache
(
SCatalog
*
pCtg
,
SUserAuthInfo
*
pAuth
,
SUserAuthRes
*
pRes
,
bool
*
exists
);
int32_t
catalogUpdateUserAuthInfo
(
SCatalog
*
pCtg
,
SGetUserAuthRsp
*
pAuth
);
...
...
include/libs/nodes/cmdnodes.h
浏览文件 @
910aba27
...
...
@@ -456,7 +456,9 @@ typedef struct SGrantStmt {
ENodeType
type
;
char
userName
[
TSDB_USER_LEN
];
char
objName
[
TSDB_DB_NAME_LEN
];
// db or topic
char
tabName
[
TSDB_TABLE_NAME_LEN
];
int64_t
privileges
;
SNode
*
pTagCond
;
}
SGrantStmt
;
typedef
SGrantStmt
SRevokeStmt
;
...
...
include/util/taoserror.h
浏览文件 @
910aba27
...
...
@@ -241,6 +241,7 @@ int32_t* taosGetErrno();
#define TSDB_CODE_MND_INVALID_ALTER_OPER TAOS_DEF_ERROR_CODE(0, 0x0356)
#define TSDB_CODE_MND_AUTH_FAILURE TAOS_DEF_ERROR_CODE(0, 0x0357)
#define TSDB_CODE_MND_USER_NOT_AVAILABLE TAOS_DEF_ERROR_CODE(0, 0x0358)
#define TSDB_CODE_MND_PRIVILEDGE_EXIST TAOS_DEF_ERROR_CODE(0, 0x0359)
// mnode-stable-part1
#define TSDB_CODE_MND_STB_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0360)
...
...
include/util/tdef.h
浏览文件 @
910aba27
...
...
@@ -198,6 +198,7 @@ typedef enum ELogicConditionType {
#define TSDB_STREAM_NAME_LEN 193 // it is a null-terminated string
#define TSDB_DB_NAME_LEN 65
#define TSDB_DB_FNAME_LEN (TSDB_ACCT_ID_LEN + TSDB_DB_NAME_LEN + TSDB_NAME_DELIMITER_LEN)
#define TSDB_PRIVILEDGE_CONDITION_LEN 200
#define TSDB_FUNC_NAME_LEN 65
#define TSDB_FUNC_COMMENT_LEN 1024 * 1024
...
...
source/common/src/systable.c
浏览文件 @
910aba27
...
...
@@ -296,7 +296,9 @@ static const SSysDbTableSchema vnodesSchema[] = {
static
const
SSysDbTableSchema
userUserPrivilegesSchema
[]
=
{
{.
name
=
"user_name"
,
.
bytes
=
TSDB_USER_LEN
+
VARSTR_HEADER_SIZE
,
.
type
=
TSDB_DATA_TYPE_VARCHAR
,
.
sysInfo
=
false
},
{.
name
=
"privilege"
,
.
bytes
=
10
+
VARSTR_HEADER_SIZE
,
.
type
=
TSDB_DATA_TYPE_VARCHAR
,
.
sysInfo
=
false
},
{.
name
=
"object_name"
,
.
bytes
=
TSDB_DB_NAME_LEN
+
VARSTR_HEADER_SIZE
,
.
type
=
TSDB_DATA_TYPE_VARCHAR
,
.
sysInfo
=
false
},
{.
name
=
"db_name"
,
.
bytes
=
TSDB_DB_NAME_LEN
+
VARSTR_HEADER_SIZE
,
.
type
=
TSDB_DATA_TYPE_VARCHAR
,
.
sysInfo
=
false
},
{.
name
=
"table_name"
,
.
bytes
=
TSDB_TABLE_NAME_LEN
+
VARSTR_HEADER_SIZE
,
.
type
=
TSDB_DATA_TYPE_VARCHAR
,
.
sysInfo
=
false
},
{.
name
=
"condition"
,
.
bytes
=
TSDB_PRIVILEDGE_CONDITION_LEN
+
VARSTR_HEADER_SIZE
,
.
type
=
TSDB_DATA_TYPE_VARCHAR
,
.
sysInfo
=
false
},
};
static
const
SSysTableMeta
infosMeta
[]
=
{
...
...
source/common/src/tmsg.c
浏览文件 @
910aba27
...
...
@@ -1150,7 +1150,7 @@ int32_t tDeserializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) {
if
(
tDecodeI64
(
&
decoder
,
&
vload
.
compStorage
)
<
0
)
return
-
1
;
if
(
tDecodeI64
(
&
decoder
,
&
vload
.
pointsWritten
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
&
decoder
,
&
vload
.
numOfCachedTables
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
&
decoder
,
(
int32_t
*
)
&
reserved
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
&
decoder
,
(
int32_t
*
)
&
reserved
)
<
0
)
return
-
1
;
if
(
tDecodeI64
(
&
decoder
,
&
reserved
)
<
0
)
return
-
1
;
if
(
tDecodeI64
(
&
decoder
,
&
reserved
)
<
0
)
return
-
1
;
if
(
taosArrayPush
(
pReq
->
pVloads
,
&
vload
)
==
NULL
)
{
...
...
@@ -1368,6 +1368,12 @@ int32_t tSerializeSAlterUserReq(void *buf, int32_t bufLen, SAlterUserReq *pReq)
if
(
tEncodeCStr
(
&
encoder
,
pReq
->
user
)
<
0
)
return
-
1
;
if
(
tEncodeCStr
(
&
encoder
,
pReq
->
pass
)
<
0
)
return
-
1
;
if
(
tEncodeCStr
(
&
encoder
,
pReq
->
objname
)
<
0
)
return
-
1
;
int32_t
len
=
strlen
(
pReq
->
tabName
);
if
(
tEncodeI32
(
&
encoder
,
len
)
<
0
)
return
-
1
;
if
(
len
>
0
)
{
if
(
tEncodeCStr
(
&
encoder
,
pReq
->
tabName
)
<
0
)
return
-
1
;
}
if
(
tEncodeBinary
(
&
encoder
,
pReq
->
tagCond
,
pReq
->
tagCondLen
)
<
0
)
return
-
1
;
tEndEncode
(
&
encoder
);
int32_t
tlen
=
encoder
.
pos
;
...
...
@@ -1387,6 +1393,16 @@ int32_t tDeserializeSAlterUserReq(void *buf, int32_t bufLen, SAlterUserReq *pReq
if
(
tDecodeCStrTo
(
&
decoder
,
pReq
->
user
)
<
0
)
return
-
1
;
if
(
tDecodeCStrTo
(
&
decoder
,
pReq
->
pass
)
<
0
)
return
-
1
;
if
(
tDecodeCStrTo
(
&
decoder
,
pReq
->
objname
)
<
0
)
return
-
1
;
if
(
!
tDecodeIsEnd
(
&
decoder
))
{
int32_t
len
=
0
;
if
(
tDecodeI32
(
&
decoder
,
&
len
)
<
0
)
return
-
1
;
if
(
len
>
0
)
{
if
(
tDecodeCStrTo
(
&
decoder
,
pReq
->
tabName
)
<
0
)
return
-
1
;
}
uint64_t
tagCondLen
=
0
;
if
(
tDecodeBinaryAlloc
(
&
decoder
,
(
void
**
)
&
pReq
->
tagCond
,
&
tagCondLen
)
<
0
)
return
-
1
;
pReq
->
tagCondLen
=
tagCondLen
;
}
tEndDecode
(
&
decoder
);
tDecoderClear
(
&
decoder
);
...
...
@@ -1429,9 +1445,14 @@ int32_t tSerializeSGetUserAuthRspImpl(SEncoder *pEncoder, SGetUserAuthRsp *pRsp)
int32_t
numOfCreatedDbs
=
taosHashGetSize
(
pRsp
->
createdDbs
);
int32_t
numOfReadDbs
=
taosHashGetSize
(
pRsp
->
readDbs
);
int32_t
numOfWriteDbs
=
taosHashGetSize
(
pRsp
->
writeDbs
);
int32_t
numOfReadTbs
=
taosHashGetSize
(
pRsp
->
readTbs
);
int32_t
numOfWriteTbs
=
taosHashGetSize
(
pRsp
->
writeTbs
);
if
(
tEncodeI32
(
pEncoder
,
numOfCreatedDbs
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
pEncoder
,
numOfReadDbs
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
pEncoder
,
numOfWriteDbs
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
pEncoder
,
numOfReadTbs
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
pEncoder
,
numOfWriteTbs
)
<
0
)
return
-
1
;
char
*
db
=
taosHashIterate
(
pRsp
->
createdDbs
,
NULL
);
while
(
db
!=
NULL
)
{
...
...
@@ -1451,6 +1472,36 @@ int32_t tSerializeSGetUserAuthRspImpl(SEncoder *pEncoder, SGetUserAuthRsp *pRsp)
db
=
taosHashIterate
(
pRsp
->
writeDbs
,
db
);
}
char
*
tb
=
taosHashIterate
(
pRsp
->
readTbs
,
NULL
);
while
(
tb
!=
NULL
)
{
size_t
keyLen
=
0
;
void
*
key
=
taosHashGetKey
(
tb
,
&
keyLen
);
if
(
tEncodeI32
(
pEncoder
,
keyLen
)
<
0
)
return
-
1
;
if
(
tEncodeCStr
(
pEncoder
,
key
)
<
0
)
return
-
1
;
size_t
valueLen
=
0
;
valueLen
=
strlen
(
tb
);
if
(
tEncodeI32
(
pEncoder
,
valueLen
)
<
0
)
return
-
1
;
if
(
tEncodeCStr
(
pEncoder
,
tb
)
<
0
)
return
-
1
;
tb
=
taosHashIterate
(
pRsp
->
readTbs
,
tb
);
}
tb
=
taosHashIterate
(
pRsp
->
writeTbs
,
NULL
);
while
(
tb
!=
NULL
)
{
size_t
keyLen
=
0
;
void
*
key
=
taosHashGetKey
(
tb
,
&
keyLen
);
if
(
tEncodeI32
(
pEncoder
,
keyLen
)
<
0
)
return
-
1
;
if
(
tEncodeCStr
(
pEncoder
,
key
)
<
0
)
return
-
1
;
size_t
valueLen
=
0
;
valueLen
=
strlen
(
tb
);
if
(
tEncodeI32
(
pEncoder
,
valueLen
)
<
0
)
return
-
1
;
if
(
tEncodeCStr
(
pEncoder
,
tb
)
<
0
)
return
-
1
;
tb
=
taosHashIterate
(
pRsp
->
writeTbs
,
tb
);
}
return
0
;
}
...
...
@@ -1473,6 +1524,8 @@ int32_t tDeserializeSGetUserAuthRspImpl(SDecoder *pDecoder, SGetUserAuthRsp *pRs
pRsp
->
createdDbs
=
taosHashInit
(
4
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
),
true
,
HASH_ENTRY_LOCK
);
pRsp
->
readDbs
=
taosHashInit
(
4
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
),
true
,
HASH_ENTRY_LOCK
);
pRsp
->
writeDbs
=
taosHashInit
(
4
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
),
true
,
HASH_ENTRY_LOCK
);
pRsp
->
readTbs
=
taosHashInit
(
4
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
),
true
,
HASH_ENTRY_LOCK
);
pRsp
->
writeTbs
=
taosHashInit
(
4
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BINARY
),
true
,
HASH_ENTRY_LOCK
);
if
(
pRsp
->
readDbs
==
NULL
||
pRsp
->
writeDbs
==
NULL
)
{
return
-
1
;
}
...
...
@@ -1487,9 +1540,13 @@ int32_t tDeserializeSGetUserAuthRspImpl(SDecoder *pDecoder, SGetUserAuthRsp *pRs
int32_t
numOfCreatedDbs
=
0
;
int32_t
numOfReadDbs
=
0
;
int32_t
numOfWriteDbs
=
0
;
int32_t
numOfReadTbs
=
0
;
int32_t
numOfWriteTbs
=
0
;
if
(
tDecodeI32
(
pDecoder
,
&
numOfCreatedDbs
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
pDecoder
,
&
numOfReadDbs
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
pDecoder
,
&
numOfWriteDbs
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
pDecoder
,
&
numOfReadTbs
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
pDecoder
,
&
numOfWriteTbs
)
<
0
)
return
-
1
;
for
(
int32_t
i
=
0
;
i
<
numOfCreatedDbs
;
++
i
)
{
char
db
[
TSDB_DB_FNAME_LEN
]
=
{
0
};
...
...
@@ -1512,6 +1569,42 @@ int32_t tDeserializeSGetUserAuthRspImpl(SDecoder *pDecoder, SGetUserAuthRsp *pRs
taosHashPut
(
pRsp
->
writeDbs
,
db
,
len
,
db
,
len
);
}
for
(
int32_t
i
=
0
;
i
<
numOfReadTbs
;
++
i
)
{
int32_t
keyLen
=
0
;
if
(
tDecodeI32
(
pDecoder
,
&
keyLen
)
<
0
)
return
-
1
;
char
*
key
=
taosMemoryCalloc
(
keyLen
+
1
,
sizeof
(
char
));
if
(
tDecodeCStrTo
(
pDecoder
,
key
)
<
0
)
return
-
1
;
int32_t
valuelen
=
0
;
if
(
tDecodeI32
(
pDecoder
,
&
valuelen
)
<
0
)
return
-
1
;
char
*
value
=
taosMemoryCalloc
(
valuelen
+
1
,
sizeof
(
char
));
if
(
tDecodeCStrTo
(
pDecoder
,
value
)
<
0
)
return
-
1
;
taosHashPut
(
pRsp
->
readTbs
,
key
,
strlen
(
key
),
value
,
valuelen
);
taosMemoryFree
(
key
);
taosMemoryFree
(
value
);
}
for
(
int32_t
i
=
0
;
i
<
numOfWriteTbs
;
++
i
)
{
int32_t
keyLen
=
0
;
if
(
tDecodeI32
(
pDecoder
,
&
keyLen
)
<
0
)
return
-
1
;
char
*
key
=
taosMemoryCalloc
(
keyLen
+
1
,
sizeof
(
char
));
if
(
tDecodeCStrTo
(
pDecoder
,
key
)
<
0
)
return
-
1
;
int32_t
valuelen
=
0
;
if
(
tDecodeI32
(
pDecoder
,
&
valuelen
)
<
0
)
return
-
1
;
char
*
value
=
taosMemoryCalloc
(
valuelen
+
1
,
sizeof
(
char
));
if
(
tDecodeCStrTo
(
pDecoder
,
value
)
<
0
)
return
-
1
;
taosHashPut
(
pRsp
->
writeTbs
,
key
,
strlen
(
key
),
value
,
valuelen
);
taosMemoryFree
(
key
);
taosMemoryFree
(
value
);
}
return
0
;
}
...
...
@@ -1533,6 +1626,8 @@ void tFreeSGetUserAuthRsp(SGetUserAuthRsp *pRsp) {
taosHashCleanup
(
pRsp
->
createdDbs
);
taosHashCleanup
(
pRsp
->
readDbs
);
taosHashCleanup
(
pRsp
->
writeDbs
);
taosHashCleanup
(
pRsp
->
writeTbs
);
taosHashCleanup
(
pRsp
->
readTbs
);
}
int32_t
tSerializeSCreateDropMQSNodeReq
(
void
*
buf
,
int32_t
bufLen
,
SMCreateQnodeReq
*
pReq
)
{
...
...
@@ -6824,7 +6919,7 @@ int32_t tDecodeSMqDataRsp(SDecoder *pDecoder, SMqDataRsp *pRsp) {
}
void
tDeleteSMqDataRsp
(
SMqDataRsp
*
pRsp
)
{
pRsp
->
blockDataLen
=
taosArrayDestroy
(
pRsp
->
blockDataLen
);
;
pRsp
->
blockDataLen
=
taosArrayDestroy
(
pRsp
->
blockDataLen
);
taosArrayDestroyP
(
pRsp
->
blockData
,
(
FDelete
)
taosMemoryFree
);
pRsp
->
blockData
=
NULL
;
taosArrayDestroyP
(
pRsp
->
blockSchema
,
(
FDelete
)
tDeleteSSchemaWrapper
);
...
...
source/dnode/mnode/impl/inc/mndDef.h
浏览文件 @
910aba27
...
...
@@ -280,6 +280,8 @@ typedef struct {
SHashObj
*
readDbs
;
SHashObj
*
writeDbs
;
SHashObj
*
topics
;
SHashObj
*
readTbs
;
SHashObj
*
writeTbs
;
SRWLatch
lock
;
}
SUserObj
;
...
...
source/dnode/mnode/impl/inc/mndStb.h
浏览文件 @
910aba27
...
...
@@ -38,6 +38,7 @@ void mndFreeStb(SStbObj *pStb);
int32_t
mndBuildSMCreateStbRsp
(
SMnode
*
pMnode
,
char
*
dbFName
,
char
*
stbFName
,
void
**
pCont
,
int32_t
*
pLen
);
void
mndExtractDbNameFromStbFullName
(
const
char
*
stbFullName
,
char
*
dst
);
void
mndExtractShortDbNameFromStbFullName
(
const
char
*
stbFullName
,
char
*
dst
);
void
mndExtractTbNameFromStbFullName
(
const
char
*
stbFullName
,
char
*
dst
,
int32_t
dstSize
);
const
char
*
mndGetStbStr
(
const
char
*
src
);
...
...
source/dnode/mnode/impl/inc/mndUser.h
浏览文件 @
910aba27
...
...
@@ -31,6 +31,7 @@ void mndReleaseUser(SMnode *pMnode, SUserObj *pUser);
// for trans test
SSdbRaw
*
mndUserActionEncode
(
SUserObj
*
pUser
);
SHashObj
*
mndDupDbHash
(
SHashObj
*
pOld
);
SHashObj
*
mndDupTableHash
(
SHashObj
*
pOld
);
SHashObj
*
mndDupTopicHash
(
SHashObj
*
pOld
);
int32_t
mndValidateUserAuthInfo
(
SMnode
*
pMnode
,
SUserAuthVersion
*
pUsers
,
int32_t
numOfUses
,
void
**
ppRsp
,
int32_t
*
pRspLen
);
...
...
source/dnode/mnode/impl/src/mndPrivilege.c
浏览文件 @
910aba27
...
...
@@ -35,6 +35,7 @@ int32_t mndCheckTopicPrivilegeByName(SMnode *pMnode, const char *user, EOperType
int32_t
mndSetUserAuthRsp
(
SMnode
*
pMnode
,
SUserObj
*
pUser
,
SGetUserAuthRsp
*
pRsp
)
{
memcpy
(
pRsp
->
user
,
pUser
->
user
,
TSDB_USER_LEN
);
pRsp
->
superAuth
=
1
;
pRsp
->
enable
=
pUser
->
enable
;
pRsp
->
version
=
pUser
->
authVersion
;
return
0
;
}
...
...
source/dnode/mnode/impl/src/mndStb.c
浏览文件 @
910aba27
...
...
@@ -2613,6 +2613,13 @@ void mndExtractDbNameFromStbFullName(const char *stbFullName, char *dst) {
tNameGetFullDbName
(
&
name
,
dst
);
}
void
mndExtractShortDbNameFromStbFullName
(
const
char
*
stbFullName
,
char
*
dst
)
{
SName
name
=
{
0
};
tNameFromString
(
&
name
,
stbFullName
,
T_NAME_ACCT
|
T_NAME_DB
|
T_NAME_TABLE
);
tNameGetDbName
(
&
name
,
dst
);
}
void
mndExtractTbNameFromStbFullName
(
const
char
*
stbFullName
,
char
*
dst
,
int32_t
dstSize
)
{
int32_t
pos
=
-
1
;
int32_t
num
=
0
;
...
...
source/dnode/mnode/impl/src/mndUser.c
浏览文件 @
910aba27
此差异已折叠。
点击以展开。
source/libs/catalog/CMakeLists.txt
浏览文件 @
910aba27
...
...
@@ -8,9 +8,9 @@ target_include_directories(
target_link_libraries
(
catalog
PRIVATE os util transport qcom
PRIVATE os util transport qcom
nodes
)
if
(
${
BUILD_TEST
}
)
ADD_SUBDIRECTORY
(
test
)
endif
(
${
BUILD_TEST
}
)
\ No newline at end of file
endif
(
${
BUILD_TEST
}
)
source/libs/catalog/inc/catalogInt.h
浏览文件 @
910aba27
...
...
@@ -99,6 +99,20 @@ typedef struct SCtgDebug {
uint32_t
showCachePeriodSec
;
}
SCtgDebug
;
typedef
struct
SCtgAuthReq
{
SRequestConnInfo
*
pConn
;
SUserAuthInfo
*
pRawReq
;
SGetUserAuthRsp
authInfo
;
AUTH_TYPE
singleType
;
bool
onlyCache
;
}
SCtgAuthReq
;
typedef
struct
SCtgAuthRsp
{
SUserAuthRes
*
pRawRes
;
bool
metaNotExists
;
}
SCtgAuthRsp
;
typedef
struct
SCtgTbCacheInfo
{
bool
inCache
;
uint64_t
dbId
;
...
...
@@ -214,12 +228,8 @@ typedef struct SCtgRentMgmt {
}
SCtgRentMgmt
;
typedef
struct
SCtgUserAuth
{
int32_t
version
;
SRWLatch
lock
;
bool
superUser
;
SHashObj
*
createdDbs
;
SHashObj
*
readDbs
;
SHashObj
*
writeDbs
;
SRWLatch
lock
;
SGetUserAuthRsp
userAuth
;
}
SCtgUserAuth
;
typedef
struct
SCatalog
{
...
...
@@ -703,7 +713,7 @@ int32_t ctgTbMetaExistInCache(SCatalog* pCtg, char* dbFName, char* tbName, int32
int32_t
ctgReadTbMetaFromCache
(
SCatalog
*
pCtg
,
SCtgTbMetaCtx
*
ctx
,
STableMeta
**
pTableMeta
);
int32_t
ctgReadTbVerFromCache
(
SCatalog
*
pCtg
,
SName
*
pTableName
,
int32_t
*
sver
,
int32_t
*
tver
,
int32_t
*
tbType
,
uint64_t
*
suid
,
char
*
stbName
);
int32_t
ctgChkAuthFromCache
(
SCatalog
*
pCtg
,
char
*
user
,
char
*
dbFName
,
AUTH_TYPE
type
,
bool
*
inCache
,
bool
*
pas
s
);
int32_t
ctgChkAuthFromCache
(
SCatalog
*
pCtg
,
SUserAuthInfo
*
pReq
,
bool
*
inCache
,
SCtgAuthRsp
*
pRe
s
);
int32_t
ctgDropDbCacheEnqueue
(
SCatalog
*
pCtg
,
const
char
*
dbFName
,
int64_t
dbId
);
int32_t
ctgDropDbVgroupEnqueue
(
SCatalog
*
pCtg
,
const
char
*
dbFName
,
bool
syncReq
);
int32_t
ctgDropStbMetaEnqueue
(
SCatalog
*
pCtg
,
const
char
*
dbFName
,
int64_t
dbId
,
const
char
*
stbName
,
uint64_t
suid
,
...
...
@@ -806,6 +816,7 @@ int32_t ctgAcquireVgMetaFromCache(SCatalog *pCtg, const char *dbFName, const cha
int32_t
ctgCopyTbMeta
(
SCatalog
*
pCtg
,
SCtgTbMetaCtx
*
ctx
,
SCtgDBCache
**
pDb
,
SCtgTbCache
**
pTb
,
STableMeta
**
pTableMeta
,
char
*
dbFName
);
void
ctgReleaseVgMetaToCache
(
SCatalog
*
pCtg
,
SCtgDBCache
*
dbCache
,
SCtgTbCache
*
pCache
);
void
ctgReleaseTbMetaToCache
(
SCatalog
*
pCtg
,
SCtgDBCache
*
dbCache
,
SCtgTbCache
*
pCache
);
int32_t
ctgChkSetAuthRes
(
SCatalog
*
pCtg
,
SCtgAuthReq
*
req
,
SCtgAuthRsp
*
res
);
extern
SCatalogMgmt
gCtgMgmt
;
extern
SCtgDebug
gCTGDebug
;
...
...
source/libs/catalog/src/catalog.c
浏览文件 @
910aba27
...
...
@@ -319,14 +319,13 @@ _return:
CTG_RET
(
code
);
}
int32_t
ctgChkAuth
(
SCatalog
*
pCtg
,
SRequestConnInfo
*
pConn
,
const
char
*
user
,
const
char
*
dbFName
,
AUTH_TYPE
type
,
bool
*
pass
,
bool
*
exists
)
{
int32_t
ctgChkAuth
(
SCatalog
*
pCtg
,
SRequestConnInfo
*
pConn
,
SUserAuthInfo
*
pReq
,
SUserAuthRes
*
pRes
,
bool
*
exists
)
{
bool
inCache
=
false
;
int32_t
code
=
0
;
SCtgAuthRsp
rsp
=
{
0
};
rsp
.
pRawRes
=
pRes
;
*
pass
=
false
;
CTG_ERR_RET
(
ctgChkAuthFromCache
(
pCtg
,
(
char
*
)
user
,
(
char
*
)
dbFName
,
type
,
&
inCache
,
pass
));
CTG_ERR_RET
(
ctgChkAuthFromCache
(
pCtg
,
pReq
,
&
inCache
,
&
rsp
));
if
(
inCache
)
{
if
(
exists
)
{
...
...
@@ -339,30 +338,22 @@ int32_t ctgChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, co
return
TSDB_CODE_SUCCESS
;
}
SGetUserAuthRsp
authRsp
=
{
0
};
CTG_ERR_RET
(
ctgGetUserDbAuthFromMnode
(
pCtg
,
pConn
,
user
,
&
authRsp
,
NULL
));
if
(
authRsp
.
superAuth
)
{
*
pass
=
true
;
goto
_return
;
}
if
(
authRsp
.
createdDbs
&&
taosHashGet
(
authRsp
.
createdDbs
,
dbFName
,
strlen
(
dbFName
)))
{
*
pass
=
true
;
goto
_return
;
}
SCtgAuthReq
req
=
{
0
};
req
.
pRawReq
=
pReq
;
req
.
pConn
=
pConn
;
req
.
onlyCache
=
exists
?
true
:
false
;
CTG_ERR_RET
(
ctgGetUserDbAuthFromMnode
(
pCtg
,
pConn
,
pReq
->
user
,
&
req
.
authInfo
,
NULL
));
if
(
CTG_AUTH_READ
(
type
)
&&
authRsp
.
readDbs
&&
taosHashGet
(
authRsp
.
readDbs
,
dbFName
,
strlen
(
dbFName
)))
{
*
pass
=
true
;
}
else
if
(
CTG_AUTH_WRITE
(
type
)
&&
authRsp
.
writeDbs
&&
taosHashGet
(
authRsp
.
writeDbs
,
dbFName
,
strlen
(
dbFName
)))
{
*
pass
=
true
;
CTG_ERR_JRET
(
ctgChkSetAuthRes
(
pCtg
,
&
req
,
&
rsp
));
if
(
rsp
.
metaNotExists
&&
exists
)
{
*
exists
=
false
;
}
_return:
ctgUpdateUserEnqueue
(
pCtg
,
&
authRsp
,
false
);
ctgUpdateUserEnqueue
(
pCtg
,
&
req
.
authInfo
,
false
);
return
TSDB_CODE_SUCCESS
;
CTG_RET
(
code
)
;
}
int32_t
ctgGetTbType
(
SCatalog
*
pCtg
,
SRequestConnInfo
*
pConn
,
SName
*
pTableName
,
int32_t
*
tbType
)
{
...
...
@@ -1368,7 +1359,7 @@ int32_t catalogGetExpiredUsers(SCatalog* pCtg, SUserAuthVersion** users, uint32_
void
*
key
=
taosHashGetKey
(
pAuth
,
&
len
);
strncpy
((
*
users
)[
i
].
user
,
key
,
len
);
(
*
users
)[
i
].
user
[
len
]
=
0
;
(
*
users
)[
i
].
version
=
pAuth
->
version
;
(
*
users
)[
i
].
version
=
pAuth
->
userAuth
.
version
;
++
i
;
if
(
i
>=
*
num
)
{
taosHashCancelIterate
(
pCtg
->
userCache
,
pAuth
);
...
...
@@ -1448,32 +1439,30 @@ _return:
CTG_API_LEAVE
(
code
);
}
int32_t
catalogChkAuth
(
SCatalog
*
pCtg
,
SRequestConnInfo
*
pConn
,
const
char
*
user
,
const
char
*
dbFName
,
AUTH_TYPE
type
,
bool
*
pass
)
{
int32_t
catalogChkAuth
(
SCatalog
*
pCtg
,
SRequestConnInfo
*
pConn
,
SUserAuthInfo
*
pAuth
,
SUserAuthRes
*
pRes
)
{
CTG_API_ENTER
();
if
(
NULL
==
pCtg
||
NULL
==
pConn
||
NULL
==
user
||
NULL
==
dbFName
||
NULL
==
pas
s
)
{
if
(
NULL
==
pCtg
||
NULL
==
pConn
||
NULL
==
pAuth
||
NULL
==
pRe
s
)
{
CTG_API_LEAVE
(
TSDB_CODE_CTG_INVALID_INPUT
);
}
int32_t
code
=
0
;
CTG_ERR_JRET
(
ctgChkAuth
(
pCtg
,
pConn
,
user
,
dbFName
,
type
,
pas
s
,
NULL
));
CTG_ERR_JRET
(
ctgChkAuth
(
pCtg
,
pConn
,
pAuth
,
pRe
s
,
NULL
));
_return:
CTG_API_LEAVE
(
code
);
}
int32_t
catalogChkAuthFromCache
(
SCatalog
*
pCtg
,
const
char
*
user
,
const
char
*
dbFName
,
AUTH_TYPE
type
,
bool
*
pass
,
bool
*
exists
)
{
int32_t
catalogChkAuthFromCache
(
SCatalog
*
pCtg
,
SUserAuthInfo
*
pAuth
,
SUserAuthRes
*
pRes
,
bool
*
exists
)
{
CTG_API_ENTER
();
if
(
NULL
==
pCtg
||
NULL
==
user
||
NULL
==
dbFName
||
NULL
==
pas
s
||
NULL
==
exists
)
{
if
(
NULL
==
pCtg
||
NULL
==
pAuth
||
NULL
==
pRe
s
||
NULL
==
exists
)
{
CTG_API_LEAVE
(
TSDB_CODE_CTG_INVALID_INPUT
);
}
int32_t
code
=
0
;
CTG_ERR_JRET
(
ctgChkAuth
(
pCtg
,
NULL
,
user
,
dbFName
,
type
,
pas
s
,
exists
));
CTG_ERR_JRET
(
ctgChkAuth
(
pCtg
,
NULL
,
pAuth
,
pRe
s
,
exists
));
_return:
...
...
source/libs/catalog/src/ctgAsync.c
浏览文件 @
910aba27
...
...
@@ -1550,45 +1550,20 @@ _return:
int32_t
ctgHandleGetUserRsp
(
SCtgTaskReq
*
tReq
,
int32_t
reqType
,
const
SDataBuf
*
pMsg
,
int32_t
rspCode
)
{
int32_t
code
=
0
;
SCtgTask
*
pTask
=
tReq
->
pTask
;
SCtgUserCtx
*
ctx
=
(
SCtgUserCtx
*
)
pTask
->
taskCtx
;
SCatalog
*
pCtg
=
pTask
->
pJob
->
pCtg
;
bool
pass
=
false
;
SGetUserAuthRsp
*
pOut
=
(
SGetUserAuthRsp
*
)
pTask
->
msgCtx
.
out
;
CTG_ERR_JRET
(
ctgProcessRspMsg
(
pTask
->
msgCtx
.
out
,
reqType
,
pMsg
->
pData
,
pMsg
->
len
,
rspCode
,
pTask
->
msgCtx
.
target
));
if
(
pOut
->
superAuth
)
{
pass
=
true
;
goto
_return
;
}
ctgUpdateUserEnqueue
(
pCtg
,
pOut
,
true
);
taosMemoryFreeClear
(
pTask
->
msgCtx
.
out
);
if
(
pOut
->
createdDbs
&&
taosHashGet
(
pOut
->
createdDbs
,
ctx
->
user
.
dbFName
,
strlen
(
ctx
->
user
.
dbFName
)))
{
pass
=
true
;
goto
_return
;
}
CTG_ERR_JRET
((
*
gCtgAsyncFps
[
pTask
->
type
].
launchFp
)(
pTask
));
if
(
CTG_AUTH_READ
(
ctx
->
user
.
type
)
&&
pOut
->
readDbs
&&
taosHashGet
(
pOut
->
readDbs
,
ctx
->
user
.
dbFName
,
strlen
(
ctx
->
user
.
dbFName
)))
{
pass
=
true
;
}
else
if
(
CTG_AUTH_WRITE
(
ctx
->
user
.
type
)
&&
pOut
->
writeDbs
&&
taosHashGet
(
pOut
->
writeDbs
,
ctx
->
user
.
dbFName
,
strlen
(
ctx
->
user
.
dbFName
)))
{
pass
=
true
;
}
return
TSDB_CODE_SUCCESS
;
_return:
if
(
TSDB_CODE_SUCCESS
==
code
)
{
pTask
->
res
=
taosMemoryCalloc
(
1
,
sizeof
(
bool
));
if
(
NULL
==
pTask
->
res
)
{
code
=
TSDB_CODE_OUT_OF_MEMORY
;
}
else
{
*
(
bool
*
)
pTask
->
res
=
pass
;
}
}
ctgUpdateUserEnqueue
(
pCtg
,
pOut
,
false
);
taosMemoryFreeClear
(
pTask
->
msgCtx
.
out
);
ctgHandleTaskEnd
(
pTask
,
code
);
CTG_RET
(
code
);
...
...
@@ -2067,31 +2042,39 @@ int32_t ctgLaunchGetUdfTask(SCtgTask* pTask) {
}
int32_t
ctgLaunchGetUserTask
(
SCtgTask
*
pTask
)
{
int32_t
code
=
0
;
SCatalog
*
pCtg
=
pTask
->
pJob
->
pCtg
;
SRequestConnInfo
*
pConn
=
&
pTask
->
pJob
->
conn
;
SCtgUserCtx
*
pCtx
=
(
SCtgUserCtx
*
)
pTask
->
taskCtx
;
bool
inCache
=
false
;
bool
pass
=
false
;
SCtgAuthRsp
rsp
=
{
0
}
;
SCtgJob
*
pJob
=
pTask
->
pJob
;
SCtgMsgCtx
*
pMsgCtx
=
CTG_GET_TASK_MSGCTX
(
pTask
,
-
1
);
if
(
NULL
==
pMsgCtx
->
pBatchs
)
{
pMsgCtx
->
pBatchs
=
pJob
->
pBatchs
;
}
CTG_ERR_RET
(
ctgChkAuthFromCache
(
pCtg
,
pCtx
->
user
.
user
,
pCtx
->
user
.
dbFName
,
pCtx
->
user
.
type
,
&
inCache
,
&
pass
));
rsp
.
pRawRes
=
taosMemoryCalloc
(
1
,
sizeof
(
SUserAuthRes
));
if
(
NULL
==
rsp
.
pRawRes
)
{
CTG_ERR_RET
(
TSDB_CODE_OUT_OF_MEMORY
);
}
CTG_ERR_RET
(
ctgChkAuthFromCache
(
pCtg
,
&
pCtx
->
user
,
&
inCache
,
&
rsp
));
if
(
inCache
)
{
pTask
->
res
=
taosMemoryCalloc
(
1
,
sizeof
(
bool
));
if
(
NULL
==
pTask
->
res
)
{
CTG_ERR_RET
(
TSDB_CODE_OUT_OF_MEMORY
);
}
*
(
bool
*
)
pTask
->
res
=
pass
;
pTask
->
res
=
rsp
.
pRawRes
;
CTG_ERR_RET
(
ctgHandleTaskEnd
(
pTask
,
0
));
return
TSDB_CODE_SUCCESS
;
}
CTG_ERR_RET
(
ctgGetUserDbAuthFromMnode
(
pCtg
,
pConn
,
pCtx
->
user
.
user
,
NULL
,
pTask
)
);
taosMemoryFreeClear
(
rsp
.
pRawRes
);
if
(
rsp
.
metaNotExists
)
{
CTG_ERR_RET
(
ctgLaunchSubTask
(
pTask
,
CTG_TASK_GET_TB_META
,
ctgGetTbCfgCb
,
&
pCtx
->
user
.
tbName
));
}
else
{
CTG_ERR_RET
(
ctgGetUserDbAuthFromMnode
(
pCtg
,
pConn
,
pCtx
->
user
.
user
,
NULL
,
pTask
));
}
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -2139,6 +2122,20 @@ _return:
CTG_RET
(
ctgHandleTaskEnd
(
pTask
,
pTask
->
subRes
.
code
));
}
int32_t
ctgGetUserCb
(
SCtgTask
*
pTask
)
{
int32_t
code
=
0
;
CTG_ERR_JRET
(
pTask
->
subRes
.
code
);
CTG_RET
(
ctgLaunchGetUserTask
(
pTask
));
_return:
CTG_RET
(
ctgHandleTaskEnd
(
pTask
,
pTask
->
subRes
.
code
));
}
int32_t
ctgCompDbVgTasks
(
SCtgTask
*
pTask
,
void
*
param
,
bool
*
equal
)
{
SCtgDbVgCtx
*
ctx
=
pTask
->
taskCtx
;
...
...
source/libs/catalog/src/ctgCache.c
浏览文件 @
910aba27
...
...
@@ -678,55 +678,40 @@ _return:
CTG_RET
(
code
);
}
int32_t
ctgChkAuthFromCache
(
SCatalog
*
pCtg
,
char
*
user
,
char
*
dbFName
,
AUTH_TYPE
type
,
bool
*
inCache
,
bool
*
pass
)
{
char
*
p
=
strchr
(
dbFName
,
'.'
);
if
(
p
)
{
++
p
;
}
else
{
p
=
dbFName
;
}
if
(
IS_SYS_DBNAME
(
p
))
{
int32_t
ctgChkAuthFromCache
(
SCatalog
*
pCtg
,
SUserAuthInfo
*
pReq
,
bool
*
inCache
,
SCtgAuthRsp
*
pRes
)
{
if
(
IS_SYS_DBNAME
(
pReq
->
tbName
.
dbname
))
{
*
inCache
=
true
;
*
pass
=
true
;
ctgDebug
(
"sysdb %s, pass"
,
dbFN
ame
);
pRes
->
pRawRes
->
pass
=
true
;
ctgDebug
(
"sysdb %s, pass"
,
pReq
->
tbName
.
dbn
ame
);
return
TSDB_CODE_SUCCESS
;
}
SCtgUserAuth
*
pUser
=
(
SCtgUserAuth
*
)
taosHashGet
(
pCtg
->
userCache
,
user
,
strlen
(
user
));
SCtgUserAuth
*
pUser
=
(
SCtgUserAuth
*
)
taosHashGet
(
pCtg
->
userCache
,
pReq
->
user
,
strlen
(
pReq
->
user
));
if
(
NULL
==
pUser
)
{
ctgDebug
(
"user not in cache, user:%s"
,
user
);
ctgDebug
(
"user not in cache, user:%s"
,
pReq
->
user
);
goto
_return
;
}
*
inCache
=
true
;
ctgDebug
(
"Got user from cache, user:%s"
,
user
);
ctgDebug
(
"Got user from cache, user:%s"
,
pReq
->
user
);
CTG_CACHE_STAT_INC
(
numOfUserHit
,
1
);
if
(
pUser
->
superUser
)
{
*
pass
=
true
;
return
TSDB_CODE_SUCCESS
;
}
SCtgAuthReq
req
=
{
0
};
req
.
pRawReq
=
pReq
;
req
.
onlyCache
=
true
;
CTG_LOCK
(
CTG_READ
,
&
pUser
->
lock
);
if
(
pUser
->
createdDbs
&&
taosHashGet
(
pUser
->
createdDbs
,
dbFName
,
strlen
(
dbFName
)))
{
*
pass
=
true
;
CTG_UNLOCK
(
CTG_READ
,
&
pUser
->
lock
);
return
TSDB_CODE_SUCCESS
;
}
if
(
pUser
->
readDbs
&&
taosHashGet
(
pUser
->
readDbs
,
dbFName
,
strlen
(
dbFName
))
&&
CTG_AUTH_READ
(
type
))
{
*
pass
=
true
;
}
if
(
pUser
->
writeDbs
&&
taosHashGet
(
pUser
->
writeDbs
,
dbFName
,
strlen
(
dbFName
))
&&
CTG_AUTH_WRITE
(
type
))
{
*
pass
=
true
;
}
memcpy
(
&
req
.
authInfo
,
&
pUser
->
userAuth
,
sizeof
(
pUser
->
userAuth
));
int32_t
code
=
ctgChkSetAuthRes
(
pCtg
,
&
req
,
pRes
);
CTG_UNLOCK
(
CTG_READ
,
&
pUser
->
lock
);
CTG_ERR_JRET
(
code
);
if
(
pRes
->
metaNotExists
)
{
goto
_return
;
}
return
TSDB_CODE_SUCCESS
;
CTG_RET
(
code
)
;
_return:
...
...
@@ -2024,11 +2009,7 @@ int32_t ctgOpUpdateUser(SCtgCacheOperation *operation) {
if
(
NULL
==
pUser
)
{
SCtgUserAuth
userAuth
=
{
0
};
userAuth
.
version
=
msg
->
userAuth
.
version
;
userAuth
.
superUser
=
msg
->
userAuth
.
superAuth
;
userAuth
.
createdDbs
=
msg
->
userAuth
.
createdDbs
;
userAuth
.
readDbs
=
msg
->
userAuth
.
readDbs
;
userAuth
.
writeDbs
=
msg
->
userAuth
.
writeDbs
;
memcpy
(
&
userAuth
.
userAuth
,
&
msg
->
userAuth
,
sizeof
(
msg
->
userAuth
));
if
(
taosHashPut
(
pCtg
->
userCache
,
msg
->
userAuth
.
user
,
strlen
(
msg
->
userAuth
.
user
),
&
userAuth
,
sizeof
(
userAuth
)))
{
ctgError
(
"taosHashPut user %s to cache failed"
,
msg
->
userAuth
.
user
);
...
...
@@ -2040,22 +2021,28 @@ int32_t ctgOpUpdateUser(SCtgCacheOperation *operation) {
return
TSDB_CODE_SUCCESS
;
}
pUser
->
version
=
msg
->
userAuth
.
version
;
CTG_LOCK
(
CTG_WRITE
,
&
pUser
->
lock
);
taosHashCleanup
(
pUser
->
createdDbs
);
pUser
->
createdDbs
=
msg
->
userAuth
.
createdDbs
;
taosHashCleanup
(
pUser
->
userAuth
.
createdDbs
);
pUser
->
userAuth
.
createdDbs
=
msg
->
userAuth
.
createdDbs
;
msg
->
userAuth
.
createdDbs
=
NULL
;
taosHashCleanup
(
pUser
->
readDbs
);
pUser
->
readDbs
=
msg
->
userAuth
.
readDbs
;
taosHashCleanup
(
pUser
->
userAuth
.
readDbs
);
pUser
->
userAuth
.
readDbs
=
msg
->
userAuth
.
readDbs
;
msg
->
userAuth
.
readDbs
=
NULL
;
taosHashCleanup
(
pUser
->
writeDbs
);
pUser
->
writeDbs
=
msg
->
userAuth
.
writeDbs
;
taosHashCleanup
(
pUser
->
userAuth
.
writeDbs
);
pUser
->
userAuth
.
writeDbs
=
msg
->
userAuth
.
writeDbs
;
msg
->
userAuth
.
writeDbs
=
NULL
;
taosHashCleanup
(
pUser
->
userAuth
.
readTbs
);
pUser
->
userAuth
.
readTbs
=
msg
->
userAuth
.
readTbs
;
msg
->
userAuth
.
readTbs
=
NULL
;
taosHashCleanup
(
pUser
->
userAuth
.
writeTbs
);
pUser
->
userAuth
.
writeTbs
=
msg
->
userAuth
.
writeTbs
;
msg
->
userAuth
.
writeTbs
=
NULL
;
CTG_UNLOCK
(
CTG_WRITE
,
&
pUser
->
lock
);
_return:
...
...
@@ -2063,6 +2050,8 @@ _return:
taosHashCleanup
(
msg
->
userAuth
.
createdDbs
);
taosHashCleanup
(
msg
->
userAuth
.
readDbs
);
taosHashCleanup
(
msg
->
userAuth
.
writeDbs
);
taosHashCleanup
(
msg
->
userAuth
.
readTbs
);
taosHashCleanup
(
msg
->
userAuth
.
writeTbs
);
taosMemoryFreeClear
(
msg
);
...
...
@@ -2255,6 +2244,8 @@ void ctgFreeCacheOperationData(SCtgCacheOperation *op) {
taosHashCleanup
(
msg
->
userAuth
.
createdDbs
);
taosHashCleanup
(
msg
->
userAuth
.
readDbs
);
taosHashCleanup
(
msg
->
userAuth
.
writeDbs
);
taosHashCleanup
(
msg
->
userAuth
.
readTbs
);
taosHashCleanup
(
msg
->
userAuth
.
writeTbs
);
taosMemoryFreeClear
(
op
->
data
);
break
;
}
...
...
source/libs/catalog/src/ctgUtil.c
浏览文件 @
910aba27
...
...
@@ -174,9 +174,11 @@ void ctgFreeSMetaData(SMetaData* pData) {
}
void
ctgFreeSCtgUserAuth
(
SCtgUserAuth
*
userCache
)
{
taosHashCleanup
(
userCache
->
createdDbs
);
taosHashCleanup
(
userCache
->
readDbs
);
taosHashCleanup
(
userCache
->
writeDbs
);
taosHashCleanup
(
userCache
->
userAuth
.
createdDbs
);
taosHashCleanup
(
userCache
->
userAuth
.
readDbs
);
taosHashCleanup
(
userCache
->
userAuth
.
writeDbs
);
taosHashCleanup
(
userCache
->
userAuth
.
readTbs
);
taosHashCleanup
(
userCache
->
userAuth
.
writeTbs
);
}
void
ctgFreeMetaRent
(
SCtgRentMgmt
*
mgmt
)
{
...
...
@@ -423,6 +425,8 @@ void ctgFreeMsgCtx(SCtgMsgCtx* pCtx) {
taosHashCleanup
(
pOut
->
createdDbs
);
taosHashCleanup
(
pOut
->
readDbs
);
taosHashCleanup
(
pOut
->
writeDbs
);
taosHashCleanup
(
pOut
->
readTbs
);
taosHashCleanup
(
pOut
->
writeTbs
);
taosMemoryFreeClear
(
pCtx
->
out
);
break
;
}
...
...
@@ -1330,6 +1334,133 @@ static void* ctgCloneDnodeList(void* pSrc) { return taosArrayDup((const SArray*)
static
void
ctgFreeDnodeList
(
void
*
p
)
{
taosArrayDestroy
((
SArray
*
)((
SMetaRes
*
)
p
)
->
pRes
);
}
int32_t
ctgChkSetTbAuthRes
(
SCatalog
*
pCtg
,
SCtgAuthReq
*
req
,
SCtgAuthRsp
*
res
)
{
int32_t
code
=
0
;
STableMeta
*
pMeta
=
NULL
;
SGetUserAuthRsp
*
pInfo
=
&
req
->
authInfo
;
SHashObj
*
pTbs
=
(
AUTH_TYPE_READ
==
req
->
singleType
)
?
pInfo
->
readTbs
:
pInfo
->
writeTbs
;
char
tbFullName
[
TSDB_TABLE_FNAME_LEN
];
tNameExtractFullName
(
&
req
->
pRawReq
->
tbName
,
tbFullName
);
char
*
pCond
=
taosHashGet
(
pTbs
,
tbFullName
,
strlen
(
tbFullName
));
if
(
pCond
)
{
if
(
strlen
(
pCond
)
>
1
)
{
CTG_ERR_RET
(
nodesStringToNode
(
pCond
,
&
res
->
pRawRes
->
pCond
));
}
res
->
pRawRes
->
pass
=
true
;
return
TSDB_CODE_SUCCESS
;
}
CTG_ERR_RET
(
catalogGetCachedTableMeta
(
pCtg
,
&
req
->
pRawReq
->
tbName
,
&
pMeta
));
if
(
NULL
==
pMeta
)
{
if
(
req
->
onlyCache
)
{
res
->
metaNotExists
=
true
;
ctgDebug
(
"db %s tb %s meta not in cache for auth"
,
req
->
pRawReq
->
tbName
.
dbname
,
req
->
pRawReq
->
tbName
.
tname
);
return
TSDB_CODE_SUCCESS
;
}
CTG_ERR_RET
(
catalogGetTableMeta
(
pCtg
,
req
->
pConn
,
&
req
->
pRawReq
->
tbName
,
&
pMeta
));
}
if
(
TSDB_SUPER_TABLE
==
pMeta
->
tableType
||
TSDB_NORMAL_TABLE
==
pMeta
->
tableType
)
{
res
->
pRawRes
->
pass
=
false
;
goto
_return
;
}
if
(
TSDB_CHILD_TABLE
==
pMeta
->
tableType
)
{
res
->
pRawRes
->
pass
=
true
;
/*
char stbName[TSDB_TABLE_NAME_LEN] = {0};
CTG_ERR_JRET(ctgGetCachedStbNameFromSuid(pCtg, pMeta->suid, stbName));
if (0 == stbName[0]) {
if (req->onlyCache) {
res->notExists = true;
return TSDB_CODE_SUCCESS;
}
CTG_ERR_RET(catalogRefreshTableMeta(pCtg, req->pConn, &req->pRawReq->tbName, 0));
}
*/
}
_return:
taosMemoryFree
(
pMeta
);
CTG_RET
(
code
);
}
int32_t
ctgChkSetAuthRes
(
SCatalog
*
pCtg
,
SCtgAuthReq
*
req
,
SCtgAuthRsp
*
res
)
{
int32_t
code
=
0
;
SUserAuthInfo
*
pReq
=
req
->
pRawReq
;
SUserAuthRes
*
pRes
=
res
->
pRawRes
;
SGetUserAuthRsp
*
pInfo
=
&
req
->
authInfo
;
pRes
->
pass
=
false
;
pRes
->
pCond
=
NULL
;
if
(
!
pInfo
->
enable
)
{
pRes
->
pass
=
false
;
return
TSDB_CODE_SUCCESS
;
}
if
(
pInfo
->
superAuth
)
{
pRes
->
pass
=
true
;
return
TSDB_CODE_SUCCESS
;
}
char
dbFName
[
TSDB_DB_FNAME_LEN
];
tNameGetFullDbName
(
&
pReq
->
tbName
,
dbFName
);
if
(
pInfo
->
createdDbs
&&
taosHashGet
(
pInfo
->
createdDbs
,
dbFName
,
strlen
(
dbFName
)))
{
pRes
->
pass
=
true
;
return
TSDB_CODE_SUCCESS
;
}
switch
(
pReq
->
type
)
{
case
AUTH_TYPE_READ
:
{
if
(
pInfo
->
readDbs
&&
taosHashGet
(
pInfo
->
readDbs
,
dbFName
,
strlen
(
dbFName
)))
{
pRes
->
pass
=
true
;
return
TSDB_CODE_SUCCESS
;
}
if
(
pInfo
->
readTbs
&&
taosHashGetSize
(
pInfo
->
readTbs
)
>
0
)
{
req
->
singleType
=
AUTH_TYPE_READ
;
CTG_RET
(
ctgChkSetTbAuthRes
(
pCtg
,
req
,
res
));
}
break
;
}
case
AUTH_TYPE_WRITE
:
{
if
(
pInfo
->
writeDbs
&&
taosHashGet
(
pInfo
->
writeDbs
,
dbFName
,
strlen
(
dbFName
)))
{
pRes
->
pass
=
true
;
return
TSDB_CODE_SUCCESS
;
}
if
(
pInfo
->
writeTbs
&&
taosHashGetSize
(
pInfo
->
writeTbs
)
>
0
)
{
req
->
singleType
=
AUTH_TYPE_WRITE
;
CTG_RET
(
ctgChkSetTbAuthRes
(
pCtg
,
req
,
res
));
}
break
;
}
case
AUTH_TYPE_READ_OR_WRITE
:
{
if
((
pInfo
->
readDbs
&&
taosHashGet
(
pInfo
->
readDbs
,
dbFName
,
strlen
(
dbFName
)))
||
(
pInfo
->
writeDbs
&&
taosHashGet
(
pInfo
->
writeDbs
,
dbFName
,
strlen
(
dbFName
)))){
pRes
->
pass
=
true
;
return
TSDB_CODE_SUCCESS
;
}
break
;
}
default:
break
;
}
return
TSDB_CODE_SUCCESS
;
}
#if 0
static int32_t ctgCloneMetaDataArray(SArray* pSrc, __array_item_dup_fn_t copyFunc, SArray** pDst) {
if (NULL == pSrc) {
...
...
source/libs/catalog/test/CMakeLists.txt
浏览文件 @
910aba27
...
...
@@ -9,7 +9,7 @@ IF(NOT TD_DARWIN)
ADD_EXECUTABLE
(
catalogTest
${
SOURCE_LIST
}
)
TARGET_LINK_LIBRARIES
(
catalogTest
PUBLIC os util common catalog transport gtest qcom taos_static
PUBLIC os util common
nodes
catalog transport gtest qcom taos_static
)
TARGET_INCLUDE_DIRECTORIES
(
...
...
source/libs/catalog/test/catalogTests.cpp
浏览文件 @
910aba27
此差异已折叠。
点击以展开。
source/libs/nodes/src/nodesUtilFuncs.c
浏览文件 @
910aba27
...
...
@@ -923,9 +923,15 @@ void nodesDestroyNode(SNode* pNode) {
taosMemoryFree
(((
SDescribeStmt
*
)
pNode
)
->
pMeta
);
break
;
case
QUERY_NODE_RESET_QUERY_CACHE_STMT
:
// no pointer field
case
QUERY_NODE_COMPACT_DATABASE_STMT
:
// no pointer field
case
QUERY_NODE_CREATE_FUNCTION_STMT
:
// no pointer field
case
QUERY_NODE_DROP_FUNCTION_STMT
:
// no pointer field
break
;
case
QUERY_NODE_COMPACT_DATABASE_STMT
:
{
SCompactDatabaseStmt
*
pStmt
=
(
SCompactDatabaseStmt
*
)
pNode
;
nodesDestroyNode
(
pStmt
->
pStart
);
nodesDestroyNode
(
pStmt
->
pEnd
);
break
;
}
case
QUERY_NODE_CREATE_FUNCTION_STMT
:
// no pointer field
case
QUERY_NODE_DROP_FUNCTION_STMT
:
// no pointer field
break
;
case
QUERY_NODE_CREATE_STREAM_STMT
:
{
SCreateStreamStmt
*
pStmt
=
(
SCreateStreamStmt
*
)
pNode
;
...
...
source/libs/parser/inc/parAst.h
浏览文件 @
910aba27
...
...
@@ -82,6 +82,11 @@ typedef struct SAlterOption {
SNodeList
*
pList
;
}
SAlterOption
;
typedef
struct
STokenPair
{
SToken
first
;
SToken
second
;
}
STokenPair
;
extern
SToken
nil_token
;
void
initAstCreateContext
(
SParseContext
*
pParseCxt
,
SAstCreateContext
*
pCxt
);
...
...
@@ -227,8 +232,10 @@ SNode* createMergeVgroupStmt(SAstCreateContext* pCxt, const SToken* pVgId1, cons
SNode
*
createRedistributeVgroupStmt
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pVgId
,
SNodeList
*
pDnodes
);
SNode
*
createSplitVgroupStmt
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pVgId
);
SNode
*
createSyncdbStmt
(
SAstCreateContext
*
pCxt
,
const
SToken
*
pDbName
);
SNode
*
createGrantStmt
(
SAstCreateContext
*
pCxt
,
int64_t
privileges
,
SToken
*
pDbName
,
SToken
*
pUserName
);
SNode
*
createRevokeStmt
(
SAstCreateContext
*
pCxt
,
int64_t
privileges
,
SToken
*
pDbName
,
SToken
*
pUserName
);
SNode
*
createGrantStmt
(
SAstCreateContext
*
pCxt
,
int64_t
privileges
,
STokenPair
*
pPrivLevel
,
SToken
*
pUserName
,
SNode
*
pTagCond
);
SNode
*
createRevokeStmt
(
SAstCreateContext
*
pCxt
,
int64_t
privileges
,
STokenPair
*
pPrivLevel
,
SToken
*
pUserName
,
SNode
*
pTagCond
);
SNode
*
createDeleteStmt
(
SAstCreateContext
*
pCxt
,
SNode
*
pTable
,
SNode
*
pWhere
);
SNode
*
createInsertStmt
(
SAstCreateContext
*
pCxt
,
SNode
*
pTable
,
SNodeList
*
pCols
,
SNode
*
pQuery
);
...
...
source/libs/parser/inc/parUtil.h
浏览文件 @
910aba27
...
...
@@ -97,9 +97,8 @@ int32_t reserveTableVgroupInCache(int32_t acctId, const char* pDb, const char* p
int32_t
reserveTableVgroupInCacheExt
(
const
SName
*
pName
,
SParseMetaCache
*
pMetaCache
);
int32_t
reserveDbVgVersionInCache
(
int32_t
acctId
,
const
char
*
pDb
,
SParseMetaCache
*
pMetaCache
);
int32_t
reserveDbCfgInCache
(
int32_t
acctId
,
const
char
*
pDb
,
SParseMetaCache
*
pMetaCache
);
int32_t
reserveUserAuthInCache
(
int32_t
acctId
,
const
char
*
pUser
,
const
char
*
pDb
,
AUTH_TYPE
type
,
int32_t
reserveUserAuthInCache
(
int32_t
acctId
,
const
char
*
pUser
,
const
char
*
pDb
,
const
char
*
pTable
,
AUTH_TYPE
type
,
SParseMetaCache
*
pMetaCache
);
int32_t
reserveUserAuthInCacheExt
(
const
char
*
pUser
,
const
SName
*
pName
,
AUTH_TYPE
type
,
SParseMetaCache
*
pMetaCache
);
int32_t
reserveUdfInCache
(
const
char
*
pFunc
,
SParseMetaCache
*
pMetaCache
);
int32_t
reserveTableIndexInCache
(
int32_t
acctId
,
const
char
*
pDb
,
const
char
*
pTable
,
SParseMetaCache
*
pMetaCache
);
int32_t
reserveTableCfgInCache
(
int32_t
acctId
,
const
char
*
pDb
,
const
char
*
pTable
,
SParseMetaCache
*
pMetaCache
);
...
...
@@ -110,8 +109,7 @@ int32_t getTableVgroupFromCache(SParseMetaCache* pMetaCache, const SName* pName,
int32_t
getDbVgVersionFromCache
(
SParseMetaCache
*
pMetaCache
,
const
char
*
pDbFName
,
int32_t
*
pVersion
,
int64_t
*
pDbId
,
int32_t
*
pTableNum
,
int64_t
*
pStateTs
);
int32_t
getDbCfgFromCache
(
SParseMetaCache
*
pMetaCache
,
const
char
*
pDbFName
,
SDbCfgInfo
*
pInfo
);
int32_t
getUserAuthFromCache
(
SParseMetaCache
*
pMetaCache
,
const
char
*
pUser
,
const
char
*
pDbFName
,
AUTH_TYPE
type
,
bool
*
pPass
);
int32_t
getUserAuthFromCache
(
SParseMetaCache
*
pMetaCache
,
SUserAuthInfo
*
pAuthReq
,
SUserAuthRes
*
pAuthRes
);
int32_t
getUdfInfoFromCache
(
SParseMetaCache
*
pMetaCache
,
const
char
*
pFunc
,
SFuncInfo
*
pInfo
);
int32_t
getTableIndexFromCache
(
SParseMetaCache
*
pMetaCache
,
const
SName
*
pName
,
SArray
**
pIndexes
);
int32_t
getTableCfgFromCache
(
SParseMetaCache
*
pMetaCache
,
const
SName
*
pName
,
STableCfg
**
pOutput
);
...
...
source/libs/parser/inc/sql.y
浏览文件 @
910aba27
...
...
@@ -94,8 +94,8 @@ sysinfo_opt(A) ::= .
sysinfo_opt(A) ::= SYSINFO NK_INTEGER(B). { A = taosStr2Int8(B.z, NULL, 10); }
/************************************************ grant/revoke ********************************************************/
cmd ::= GRANT privileges(A) ON priv_level(B)
TO user_name(C). { pCxt->pRootNode = createGrantStmt(pCxt, A, &B, &C
); }
cmd ::= REVOKE privileges(A) ON priv_level(B)
FROM user_name(C). { pCxt->pRootNode = createRevokeStmt(pCxt, A, &B, &C
); }
cmd ::= GRANT privileges(A) ON priv_level(B)
with_opt(D) TO user_name(C). { pCxt->pRootNode = createGrantStmt(pCxt, A, &B, &C, D
); }
cmd ::= REVOKE privileges(A) ON priv_level(B)
with_opt(D) FROM user_name(C). { pCxt->pRootNode = createRevokeStmt(pCxt, A, &B, &C, D
); }
%type privileges { int64_t }
%destructor privileges { }
...
...
@@ -113,11 +113,15 @@ priv_type_list(A) ::= priv_type_list(B) NK_COMMA priv_type(C).
priv_type(A) ::= READ. { A = PRIVILEGE_TYPE_READ; }
priv_type(A) ::= WRITE. { A = PRIVILEGE_TYPE_WRITE; }
%type priv_level { SToken }
%type priv_level { SToken
Pair
}
%destructor priv_level { }
priv_level(A) ::= NK_STAR(B) NK_DOT NK_STAR. { A = B; }
priv_level(A) ::= db_name(B) NK_DOT NK_STAR. { A = B; }
priv_level(A) ::= topic_name(B). { A = B; }
priv_level(A) ::= NK_STAR(B) NK_DOT NK_STAR(C). { A.first = B; A.second = C; }
priv_level(A) ::= db_name(B) NK_DOT NK_STAR(C). { A.first = B; A.second = C; }
priv_level(A) ::= db_name(B) NK_DOT table_name(C). { A.first = B; A.second = C; }
priv_level(A) ::= topic_name(B). { A.first = B; A.second = nil_token; }
with_opt(A) ::= . { A = NULL; }
with_opt(A) ::= WITH search_condition(B). { A = B; }
/************************************************ create/drop/alter dnode *********************************************/
cmd ::= CREATE DNODE dnode_endpoint(A). { pCxt->pRootNode = createCreateDnodeStmt(pCxt, &A, NULL); }
...
...
source/libs/parser/src/parAstCreater.c
浏览文件 @
910aba27
...
...
@@ -1961,29 +1961,39 @@ SNode* createSyncdbStmt(SAstCreateContext* pCxt, const SToken* pDbName) {
return
pStmt
;
}
SNode
*
createGrantStmt
(
SAstCreateContext
*
pCxt
,
int64_t
privileges
,
SToken
*
pDbName
,
SToken
*
pUserName
)
{
SNode
*
createGrantStmt
(
SAstCreateContext
*
pCxt
,
int64_t
privileges
,
STokenPair
*
pPrivLevel
,
SToken
*
pUserName
,
SNode
*
pTagCond
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkDbName
(
pCxt
,
pDbName
,
false
)
||
!
checkUserName
(
pCxt
,
pUserName
))
{
if
(
!
checkDbName
(
pCxt
,
&
pPrivLevel
->
first
,
false
)
||
!
checkUserName
(
pCxt
,
pUserName
))
{
return
NULL
;
}
SGrantStmt
*
pStmt
=
(
SGrantStmt
*
)
nodesMakeNode
(
QUERY_NODE_GRANT_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
pStmt
->
privileges
=
privileges
;
COPY_STRING_FORM_ID_TOKEN
(
pStmt
->
objName
,
pDbName
);
COPY_STRING_FORM_ID_TOKEN
(
pStmt
->
objName
,
&
pPrivLevel
->
first
);
if
(
TK_NK_NIL
!=
pPrivLevel
->
second
.
type
&&
TK_NK_STAR
!=
pPrivLevel
->
second
.
type
)
{
COPY_STRING_FORM_ID_TOKEN
(
pStmt
->
tabName
,
&
pPrivLevel
->
second
);
}
COPY_STRING_FORM_ID_TOKEN
(
pStmt
->
userName
,
pUserName
);
pStmt
->
pTagCond
=
pTagCond
;
return
(
SNode
*
)
pStmt
;
}
SNode
*
createRevokeStmt
(
SAstCreateContext
*
pCxt
,
int64_t
privileges
,
SToken
*
pDbName
,
SToken
*
pUserName
)
{
SNode
*
createRevokeStmt
(
SAstCreateContext
*
pCxt
,
int64_t
privileges
,
STokenPair
*
pPrivLevel
,
SToken
*
pUserName
,
SNode
*
pTagCond
)
{
CHECK_PARSER_STATUS
(
pCxt
);
if
(
!
checkDbName
(
pCxt
,
pDbName
,
false
)
||
!
checkUserName
(
pCxt
,
pUserName
))
{
if
(
!
checkDbName
(
pCxt
,
&
pPrivLevel
->
first
,
false
)
||
!
checkUserName
(
pCxt
,
pUserName
))
{
return
NULL
;
}
SRevokeStmt
*
pStmt
=
(
SRevokeStmt
*
)
nodesMakeNode
(
QUERY_NODE_REVOKE_STMT
);
CHECK_OUT_OF_MEM
(
pStmt
);
pStmt
->
privileges
=
privileges
;
COPY_STRING_FORM_ID_TOKEN
(
pStmt
->
objName
,
pDbName
);
COPY_STRING_FORM_ID_TOKEN
(
pStmt
->
objName
,
&
pPrivLevel
->
first
);
if
(
TK_NK_NIL
!=
pPrivLevel
->
second
.
type
&&
TK_NK_STAR
!=
pPrivLevel
->
second
.
type
)
{
COPY_STRING_FORM_ID_TOKEN
(
pStmt
->
tabName
,
&
pPrivLevel
->
second
);
}
COPY_STRING_FORM_ID_TOKEN
(
pStmt
->
userName
,
pUserName
);
pStmt
->
pTagCond
=
pTagCond
;
return
(
SNode
*
)
pStmt
;
}
...
...
source/libs/parser/src/parAstParser.c
浏览文件 @
910aba27
...
...
@@ -154,7 +154,8 @@ static int32_t collectMetaKeyFromRealTableImpl(SCollectMetaKeyCxt* pCxt, const c
code
=
reserveTableVgroupInCache
(
pCxt
->
pParseCxt
->
acctId
,
pDb
,
pTable
,
pCxt
->
pMetaCache
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
reserveUserAuthInCache
(
pCxt
->
pParseCxt
->
acctId
,
pCxt
->
pParseCxt
->
pUser
,
pDb
,
authType
,
pCxt
->
pMetaCache
);
code
=
reserveUserAuthInCache
(
pCxt
->
pParseCxt
->
acctId
,
pCxt
->
pParseCxt
->
pUser
,
pDb
,
pTable
,
authType
,
pCxt
->
pMetaCache
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
reserveDbVgInfoInCache
(
pCxt
->
pParseCxt
->
acctId
,
pDb
,
pCxt
->
pMetaCache
);
...
...
@@ -247,7 +248,7 @@ static int32_t collectMetaKeyFromCreateTable(SCollectMetaKeyCxt* pCxt, SCreateTa
code
=
reserveTableVgroupInCache
(
pCxt
->
pParseCxt
->
acctId
,
pStmt
->
dbName
,
pStmt
->
tableName
,
pCxt
->
pMetaCache
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
reserveUserAuthInCache
(
pCxt
->
pParseCxt
->
acctId
,
pCxt
->
pParseCxt
->
pUser
,
pStmt
->
dbName
,
AUTH_TYPE_WRITE
,
code
=
reserveUserAuthInCache
(
pCxt
->
pParseCxt
->
acctId
,
pCxt
->
pParseCxt
->
pUser
,
pStmt
->
dbName
,
NULL
,
AUTH_TYPE_WRITE
,
pCxt
->
pMetaCache
);
}
return
code
;
...
...
@@ -267,8 +268,8 @@ static int32_t collectMetaKeyFromCreateMultiTable(SCollectMetaKeyCxt* pCxt, SCre
code
=
reserveTableVgroupInCache
(
pCxt
->
pParseCxt
->
acctId
,
pClause
->
dbName
,
pClause
->
tableName
,
pCxt
->
pMetaCache
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
reserveUserAuthInCache
(
pCxt
->
pParseCxt
->
acctId
,
pCxt
->
pParseCxt
->
pUser
,
pClause
->
dbName
,
AUTH_TYPE_WRITE
,
pCxt
->
pMetaCache
);
code
=
reserveUserAuthInCache
(
pCxt
->
pParseCxt
->
acctId
,
pCxt
->
pParseCxt
->
pUser
,
pClause
->
dbName
,
NULL
,
AUTH_TYPE_WRITE
,
pCxt
->
pMetaCache
);
}
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
break
;
...
...
@@ -439,8 +440,9 @@ static int32_t collectMetaKeyFromShowStables(SCollectMetaKeyCxt* pCxt, SShowStmt
int32_t
code
=
reserveTableMetaInCache
(
pCxt
->
pParseCxt
->
acctId
,
TSDB_INFORMATION_SCHEMA_DB
,
TSDB_INS_TABLE_STABLES
,
pCxt
->
pMetaCache
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
reserveUserAuthInCache
(
pCxt
->
pParseCxt
->
acctId
,
pCxt
->
pParseCxt
->
pUser
,
((
SValueNode
*
)
pStmt
->
pDbName
)
->
literal
,
AUTH_TYPE_READ_OR_WRITE
,
pCxt
->
pMetaCache
);
code
=
reserveUserAuthInCache
(
pCxt
->
pParseCxt
->
acctId
,
pCxt
->
pParseCxt
->
pUser
,
((
SValueNode
*
)
pStmt
->
pDbName
)
->
literal
,
NULL
,
AUTH_TYPE_READ_OR_WRITE
,
pCxt
->
pMetaCache
);
}
return
code
;
}
...
...
@@ -457,8 +459,9 @@ static int32_t collectMetaKeyFromShowTables(SCollectMetaKeyCxt* pCxt, SShowStmt*
code
=
reserveDbVgInfoInCache
(
pCxt
->
pParseCxt
->
acctId
,
((
SValueNode
*
)
pStmt
->
pDbName
)
->
literal
,
pCxt
->
pMetaCache
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
reserveUserAuthInCache
(
pCxt
->
pParseCxt
->
acctId
,
pCxt
->
pParseCxt
->
pUser
,
((
SValueNode
*
)
pStmt
->
pDbName
)
->
literal
,
AUTH_TYPE_READ_OR_WRITE
,
pCxt
->
pMetaCache
);
code
=
reserveUserAuthInCache
(
pCxt
->
pParseCxt
->
acctId
,
pCxt
->
pParseCxt
->
pUser
,
((
SValueNode
*
)
pStmt
->
pDbName
)
->
literal
,
NULL
,
AUTH_TYPE_READ_OR_WRITE
,
pCxt
->
pMetaCache
);
}
return
code
;
}
...
...
@@ -561,7 +564,8 @@ static int32_t collectMetaKeyFromShowCreateTable(SCollectMetaKeyCxt* pCxt, SShow
code
=
reserveDbCfgInCache
(
pCxt
->
pParseCxt
->
acctId
,
pStmt
->
dbName
,
pCxt
->
pMetaCache
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
reserveUserAuthInCacheExt
(
pCxt
->
pParseCxt
->
pUser
,
&
name
,
AUTH_TYPE_READ
,
pCxt
->
pMetaCache
);
code
=
reserveUserAuthInCache
(
pCxt
->
pParseCxt
->
acctId
,
pCxt
->
pParseCxt
->
pUser
,
pStmt
->
dbName
,
NULL
,
AUTH_TYPE_READ
,
pCxt
->
pMetaCache
);
}
return
code
;
}
...
...
@@ -610,6 +614,13 @@ static int32_t collectMetaKeyFromCompactDatabase(SCollectMetaKeyCxt* pCxt, SComp
return
reserveDbCfgInCache
(
pCxt
->
pParseCxt
->
acctId
,
pStmt
->
dbName
,
pCxt
->
pMetaCache
);
}
static
int32_t
collectMetaKeyFromGrant
(
SCollectMetaKeyCxt
*
pCxt
,
SGrantStmt
*
pStmt
)
{
if
(
'\0'
==
pStmt
->
tabName
[
0
])
{
return
TSDB_CODE_SUCCESS
;
}
return
reserveTableMetaInCache
(
pCxt
->
pParseCxt
->
acctId
,
pStmt
->
objName
,
pStmt
->
tabName
,
pCxt
->
pMetaCache
);
}
static
int32_t
collectMetaKeyFromQuery
(
SCollectMetaKeyCxt
*
pCxt
,
SNode
*
pStmt
)
{
pCxt
->
pStmt
=
pStmt
;
switch
(
nodeType
(
pStmt
))
{
...
...
@@ -645,6 +656,8 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) {
return
collectMetaKeyFromCompactDatabase
(
pCxt
,
(
SCompactDatabaseStmt
*
)
pStmt
);
case
QUERY_NODE_CREATE_STREAM_STMT
:
return
collectMetaKeyFromCreateStream
(
pCxt
,
(
SCreateStreamStmt
*
)
pStmt
);
case
QUERY_NODE_GRANT_STMT
:
return
collectMetaKeyFromGrant
(
pCxt
,
(
SGrantStmt
*
)
pStmt
);
case
QUERY_NODE_SHOW_DNODES_STMT
:
return
collectMetaKeyFromShowDnodes
(
pCxt
,
(
SShowStmt
*
)
pStmt
);
case
QUERY_NODE_SHOW_MNODES_STMT
:
...
...
source/libs/parser/src/parAuthenticator.c
浏览文件 @
910aba27
...
...
@@ -23,49 +23,112 @@ typedef struct SAuthCxt {
int32_t
errCode
;
}
SAuthCxt
;
typedef
struct
SSelectAuthCxt
{
SAuthCxt
*
pAuthCxt
;
SSelectStmt
*
pSelect
;
}
SSelectAuthCxt
;
static
int32_t
authQuery
(
SAuthCxt
*
pCxt
,
SNode
*
pStmt
);
static
int32_t
checkAuth
(
SAuthCxt
*
pCxt
,
const
char
*
pDbName
,
AUTH_TYPE
type
)
{
static
void
setUserAuthInfo
(
SParseContext
*
pCxt
,
const
char
*
pDbName
,
const
char
*
pTabName
,
AUTH_TYPE
type
,
SUserAuthInfo
*
pAuth
)
{
snprintf
(
pAuth
->
user
,
sizeof
(
pAuth
->
user
),
"%s"
,
pCxt
->
pUser
);
if
(
NULL
==
pTabName
)
{
tNameSetDbName
(
&
pAuth
->
tbName
,
pCxt
->
acctId
,
pDbName
,
strlen
(
pDbName
));
}
else
{
toName
(
pCxt
->
acctId
,
pDbName
,
pTabName
,
&
pAuth
->
tbName
);
}
pAuth
->
type
=
type
;
}
static
int32_t
checkAuth
(
SAuthCxt
*
pCxt
,
const
char
*
pDbName
,
const
char
*
pTabName
,
AUTH_TYPE
type
,
SNode
**
pCond
)
{
SParseContext
*
pParseCxt
=
pCxt
->
pParseCxt
;
if
(
pParseCxt
->
isSuperUser
)
{
return
TSDB_CODE_SUCCESS
;
}
SName
name
;
tNameSetDbName
(
&
name
,
pParseCxt
->
acctId
,
pDbName
,
strlen
(
pDbName
));
char
dbFname
[
TSDB_DB_FNAME_LEN
]
=
{
0
};
tNameGetFullDbName
(
&
name
,
dbFname
);
int32_t
code
=
TSDB_CODE_SUCCESS
;
bool
pass
=
false
;
SUserAuthInfo
authInfo
=
{
0
};
setUserAuthInfo
(
pCxt
->
pParseCxt
,
pDbName
,
pTabName
,
type
,
&
authInfo
);
int32_t
code
=
TSDB_CODE_SUCCESS
;
SUserAuthRes
authRes
=
{
0
};
if
(
NULL
!=
pCxt
->
pMetaCache
)
{
code
=
getUserAuthFromCache
(
pCxt
->
pMetaCache
,
pParseCxt
->
pUser
,
dbFname
,
type
,
&
pas
s
);
code
=
getUserAuthFromCache
(
pCxt
->
pMetaCache
,
&
authInfo
,
&
authRe
s
);
}
else
{
SRequestConnInfo
conn
=
{.
pTrans
=
pParseCxt
->
pTransporter
,
.
requestId
=
pParseCxt
->
requestId
,
.
requestObjRefId
=
pParseCxt
->
requestRid
,
.
mgmtEps
=
pParseCxt
->
mgmtEpSet
};
code
=
catalogChkAuth
(
pParseCxt
->
pCatalog
,
&
conn
,
pParseCxt
->
pUser
,
dbFname
,
type
,
&
pass
);
code
=
catalogChkAuth
(
pParseCxt
->
pCatalog
,
&
conn
,
&
authInfo
,
&
authRes
);
}
return
TSDB_CODE_SUCCESS
==
code
?
(
pass
?
TSDB_CODE_SUCCESS
:
TSDB_CODE_PAR_PERMISSION_DENIED
)
:
code
;
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pCond
)
{
*
pCond
=
authRes
.
pCond
;
}
return
TSDB_CODE_SUCCESS
==
code
?
(
authRes
.
pass
?
TSDB_CODE_SUCCESS
:
TSDB_CODE_PAR_PERMISSION_DENIED
)
:
code
;
}
static
EDealRes
authSubquery
(
SAuthCxt
*
pCxt
,
SNode
*
pStmt
)
{
return
TSDB_CODE_SUCCESS
==
authQuery
(
pCxt
,
pStmt
)
?
DEAL_RES_CONTINUE
:
DEAL_RES_ERROR
;
}
static
int32_t
mergeStableTagCond
(
SNode
**
pWhere
,
SNode
**
pTagCond
)
{
SLogicConditionNode
*
pLogicCond
=
(
SLogicConditionNode
*
)
nodesMakeNode
(
QUERY_NODE_LOGIC_CONDITION
);
if
(
NULL
==
pLogicCond
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
pLogicCond
->
node
.
resType
.
type
=
TSDB_DATA_TYPE_BOOL
;
pLogicCond
->
node
.
resType
.
bytes
=
tDataTypes
[
TSDB_DATA_TYPE_BOOL
].
bytes
;
pLogicCond
->
condType
=
LOGIC_COND_TYPE_AND
;
int32_t
code
=
nodesListMakeStrictAppend
(
&
pLogicCond
->
pParameterList
,
*
pTagCond
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodesListMakeAppend
(
&
pLogicCond
->
pParameterList
,
*
pWhere
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
*
pWhere
=
(
SNode
*
)
pLogicCond
;
}
else
{
nodesDestroyNode
((
SNode
*
)
pLogicCond
);
}
return
code
;
}
static
int32_t
appendStableTagCond
(
SNode
**
pWhere
,
SNode
*
pTagCond
)
{
SNode
*
pTagCondCopy
=
nodesCloneNode
(
pTagCond
);
if
(
NULL
==
pTagCondCopy
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
if
(
NULL
==
*
pWhere
)
{
*
pWhere
=
pTagCondCopy
;
return
TSDB_CODE_SUCCESS
;
}
if
(
QUERY_NODE_LOGIC_CONDITION
==
nodeType
(
*
pWhere
)
&&
LOGIC_COND_TYPE_AND
==
((
SLogicConditionNode
*
)
*
pWhere
)
->
condType
)
{
return
nodesListStrictAppend
(((
SLogicConditionNode
*
)
*
pWhere
)
->
pParameterList
,
pTagCondCopy
);
}
return
mergeStableTagCond
(
pWhere
,
&
pTagCondCopy
);
}
static
EDealRes
authSelectImpl
(
SNode
*
pNode
,
void
*
pContext
)
{
SAuthCxt
*
pCxt
=
pContext
;
SSelectAuthCxt
*
pCxt
=
pContext
;
SAuthCxt
*
pAuthCxt
=
pCxt
->
pAuthCxt
;
if
(
QUERY_NODE_REAL_TABLE
==
nodeType
(
pNode
))
{
pCxt
->
errCode
=
checkAuth
(
pCxt
,
((
SRealTableNode
*
)
pNode
)
->
table
.
dbName
,
AUTH_TYPE_READ
);
return
TSDB_CODE_SUCCESS
==
pCxt
->
errCode
?
DEAL_RES_CONTINUE
:
DEAL_RES_ERROR
;
SNode
*
pTagCond
=
NULL
;
STableNode
*
pTable
=
(
STableNode
*
)
pNode
;
pAuthCxt
->
errCode
=
checkAuth
(
pAuthCxt
,
pTable
->
dbName
,
pTable
->
tableName
,
AUTH_TYPE_READ
,
&
pTagCond
);
if
(
TSDB_CODE_SUCCESS
==
pAuthCxt
->
errCode
&&
NULL
!=
pTagCond
)
{
pAuthCxt
->
errCode
=
appendStableTagCond
(
&
pCxt
->
pSelect
->
pWhere
,
pTagCond
);
}
return
TSDB_CODE_SUCCESS
==
pAuthCxt
->
errCode
?
DEAL_RES_CONTINUE
:
DEAL_RES_ERROR
;
}
else
if
(
QUERY_NODE_TEMP_TABLE
==
nodeType
(
pNode
))
{
return
authSubquery
(
pCxt
,
((
STempTableNode
*
)
pNode
)
->
pSubquery
);
return
authSubquery
(
p
Auth
Cxt
,
((
STempTableNode
*
)
pNode
)
->
pSubquery
);
}
return
DEAL_RES_CONTINUE
;
}
static
int32_t
authSelect
(
SAuthCxt
*
pCxt
,
SSelectStmt
*
pSelect
)
{
nodesWalkSelectStmt
(
pSelect
,
SQL_CLAUSE_FROM
,
authSelectImpl
,
pCxt
);
SSelectAuthCxt
cxt
=
{.
pAuthCxt
=
pCxt
,
.
pSelect
=
pSelect
};
nodesWalkSelectStmt
(
pSelect
,
SQL_CLAUSE_FROM
,
authSelectImpl
,
&
cxt
);
return
pCxt
->
errCode
;
}
...
...
@@ -85,11 +148,20 @@ static int32_t authDropUser(SAuthCxt* pCxt, SDropUserStmt* pStmt) {
}
static
int32_t
authDelete
(
SAuthCxt
*
pCxt
,
SDeleteStmt
*
pDelete
)
{
return
checkAuth
(
pCxt
,
((
SRealTableNode
*
)
pDelete
->
pFromTable
)
->
table
.
dbName
,
AUTH_TYPE_WRITE
);
SNode
*
pTagCond
=
NULL
;
STableNode
*
pTable
=
(
STableNode
*
)
pDelete
->
pFromTable
;
int32_t
code
=
checkAuth
(
pCxt
,
pTable
->
dbName
,
pTable
->
tableName
,
AUTH_TYPE_WRITE
,
&
pTagCond
);
if
(
TSDB_CODE_SUCCESS
==
code
&&
NULL
!=
pTagCond
)
{
code
=
appendStableTagCond
(
&
pDelete
->
pWhere
,
pTagCond
);
}
return
code
;
}
static
int32_t
authInsert
(
SAuthCxt
*
pCxt
,
SInsertStmt
*
pInsert
)
{
int32_t
code
=
checkAuth
(
pCxt
,
((
SRealTableNode
*
)
pInsert
->
pTable
)
->
table
.
dbName
,
AUTH_TYPE_WRITE
);
SNode
*
pTagCond
=
NULL
;
STableNode
*
pTable
=
(
STableNode
*
)
pInsert
->
pTable
;
// todo check tag condition for subtable
int32_t
code
=
checkAuth
(
pCxt
,
pTable
->
dbName
,
pTable
->
tableName
,
AUTH_TYPE_WRITE
,
&
pTagCond
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
authQuery
(
pCxt
,
pInsert
->
pQuery
);
}
...
...
@@ -97,22 +169,27 @@ static int32_t authInsert(SAuthCxt* pCxt, SInsertStmt* pInsert) {
}
static
int32_t
authShowTables
(
SAuthCxt
*
pCxt
,
SShowStmt
*
pStmt
)
{
return
checkAuth
(
pCxt
,
((
SValueNode
*
)
pStmt
->
pDbName
)
->
literal
,
AUTH_TYPE_READ_OR_WRITE
);
return
checkAuth
(
pCxt
,
((
SValueNode
*
)
pStmt
->
pDbName
)
->
literal
,
NULL
,
AUTH_TYPE_READ_OR_WRITE
,
NULL
);
}
static
int32_t
authShowCreateTable
(
SAuthCxt
*
pCxt
,
SShowCreateTableStmt
*
pStmt
)
{
return
checkAuth
(
pCxt
,
pStmt
->
dbName
,
AUTH_TYPE_READ
);
SNode
*
pTagCond
=
NULL
;
// todo check tag condition for subtable
return
checkAuth
(
pCxt
,
pStmt
->
dbName
,
NULL
,
AUTH_TYPE_READ
,
&
pTagCond
);
}
static
int32_t
authCreateTable
(
SAuthCxt
*
pCxt
,
SCreateTableStmt
*
pStmt
)
{
return
checkAuth
(
pCxt
,
pStmt
->
dbName
,
AUTH_TYPE_WRITE
);
SNode
*
pTagCond
=
NULL
;
// todo check tag condition for subtable
return
checkAuth
(
pCxt
,
pStmt
->
dbName
,
NULL
,
AUTH_TYPE_WRITE
,
&
pTagCond
);
}
static
int32_t
authCreateMultiTable
(
SAuthCxt
*
pCxt
,
SCreateMultiTablesStmt
*
pStmt
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
SNode
*
pNode
=
NULL
;
FOREACH
(
pNode
,
pStmt
->
pSubTables
)
{
code
=
checkAuth
(
pCxt
,
((
SCreateSubTableClause
*
)
pNode
)
->
dbName
,
AUTH_TYPE_WRITE
);
SCreateSubTableClause
*
pClause
=
(
SCreateSubTableClause
*
)
pNode
;
code
=
checkAuth
(
pCxt
,
pClause
->
dbName
,
NULL
,
AUTH_TYPE_WRITE
,
NULL
);
if
(
TSDB_CODE_SUCCESS
!=
code
)
{
break
;
}
...
...
@@ -146,7 +223,7 @@ static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) {
case
QUERY_NODE_SHOW_LICENCES_STMT
:
case
QUERY_NODE_SHOW_VGROUPS_STMT
:
case
QUERY_NODE_SHOW_DB_ALIVE_STMT
:
case
QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT
:
case
QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT
:
case
QUERY_NODE_SHOW_CREATE_DATABASE_STMT
:
case
QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT
:
case
QUERY_NODE_SHOW_VNODES_STMT
:
...
...
source/libs/parser/src/parInsertSql.c
浏览文件 @
910aba27
...
...
@@ -15,6 +15,7 @@
#include "parInsertUtil.h"
#include "parToken.h"
#include "scalar.h"
#include "tglobal.h"
#include "ttime.h"
...
...
@@ -565,6 +566,120 @@ static int32_t checkAndTrimValue(SToken* pToken, char* tmpTokenBuf, SMsgBuf* pMs
return
TSDB_CODE_SUCCESS
;
}
typedef
struct
SRewriteTagCondCxt
{
SArray
*
pTagVals
;
SArray
*
pTagName
;
int32_t
code
;
}
SRewriteTagCondCxt
;
static
int32_t
rewriteTagCondColumnImpl
(
STagVal
*
pVal
,
SNode
**
pNode
)
{
SValueNode
*
pValue
=
(
SValueNode
*
)
nodesMakeNode
(
QUERY_NODE_VALUE
);
if
(
NULL
==
pValue
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
pValue
->
node
.
resType
.
type
=
pVal
->
type
;
switch
(
pVal
->
type
)
{
case
TSDB_DATA_TYPE_BOOL
:
pValue
->
datum
.
b
=
*
(
int8_t
*
)(
&
pVal
->
i64
);
break
;
case
TSDB_DATA_TYPE_TINYINT
:
pValue
->
datum
.
i
=
*
(
int8_t
*
)(
&
pVal
->
i64
);
break
;
case
TSDB_DATA_TYPE_SMALLINT
:
pValue
->
datum
.
i
=
*
(
int16_t
*
)(
&
pVal
->
i64
);
break
;
case
TSDB_DATA_TYPE_INT
:
pValue
->
datum
.
i
=
*
(
int32_t
*
)(
&
pVal
->
i64
);
break
;
case
TSDB_DATA_TYPE_BIGINT
:
pValue
->
datum
.
i
=
pVal
->
i64
;
break
;
case
TSDB_DATA_TYPE_FLOAT
:
pValue
->
datum
.
d
=
*
(
float
*
)(
&
pVal
->
i64
);
break
;
case
TSDB_DATA_TYPE_DOUBLE
:
pValue
->
datum
.
d
=
*
(
double
*
)(
&
pVal
->
i64
);
break
;
case
TSDB_DATA_TYPE_VARCHAR
:
case
TSDB_DATA_TYPE_NCHAR
:
pValue
->
datum
.
p
=
taosMemoryCalloc
(
1
,
pVal
->
nData
+
VARSTR_HEADER_SIZE
);
if
(
NULL
==
pValue
->
datum
.
p
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
varDataSetLen
(
pValue
->
datum
.
p
,
pVal
->
nData
);
memcpy
(
varDataVal
(
pValue
->
datum
.
p
),
pVal
->
pData
,
pVal
->
nData
);
break
;
case
TSDB_DATA_TYPE_TIMESTAMP
:
pValue
->
datum
.
i
=
pVal
->
i64
;
break
;
case
TSDB_DATA_TYPE_UTINYINT
:
pValue
->
datum
.
i
=
*
(
uint8_t
*
)(
&
pVal
->
i64
);
break
;
case
TSDB_DATA_TYPE_USMALLINT
:
pValue
->
datum
.
i
=
*
(
uint16_t
*
)(
&
pVal
->
i64
);
break
;
case
TSDB_DATA_TYPE_UINT
:
pValue
->
datum
.
i
=
*
(
uint32_t
*
)(
&
pVal
->
i64
);
break
;
case
TSDB_DATA_TYPE_UBIGINT
:
pValue
->
datum
.
i
=
*
(
uint64_t
*
)(
&
pVal
->
i64
);
break
;
case
TSDB_DATA_TYPE_JSON
:
case
TSDB_DATA_TYPE_VARBINARY
:
case
TSDB_DATA_TYPE_DECIMAL
:
case
TSDB_DATA_TYPE_BLOB
:
case
TSDB_DATA_TYPE_MEDIUMBLOB
:
default:
return
TSDB_CODE_FAILED
;
}
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
rewriteTagCondColumn
(
SArray
*
pTagVals
,
SArray
*
pTagName
,
SNode
**
pNode
)
{
SColumnNode
*
pCol
=
(
SColumnNode
*
)
*
pNode
;
int32_t
ntags
=
taosArrayGetSize
(
pTagName
);
for
(
int32_t
i
=
0
;
i
<
ntags
;
++
i
)
{
char
*
pTagColName
=
taosArrayGet
(
pTagName
,
i
);
if
(
0
==
strcmp
(
pTagColName
,
pCol
->
colName
))
{
return
rewriteTagCondColumnImpl
(
taosArrayGet
(
pTagVals
,
i
),
pNode
);
}
}
return
TSDB_CODE_PAR_PERMISSION_DENIED
;
}
static
EDealRes
rewriteTagCond
(
SNode
**
pNode
,
void
*
pContext
)
{
if
(
QUERY_NODE_COLUMN
==
nodeType
(
*
pNode
))
{
SRewriteTagCondCxt
*
pCxt
=
pContext
;
pCxt
->
code
=
rewriteTagCondColumn
(
pCxt
->
pTagVals
,
pCxt
->
pTagName
,
pNode
);
return
(
TSDB_CODE_SUCCESS
==
pCxt
->
code
?
DEAL_RES_IGNORE_CHILD
:
DEAL_RES_ERROR
);
}
return
DEAL_RES_CONTINUE
;
}
static
int32_t
setTagVal
(
SArray
*
pTagVals
,
SArray
*
pTagName
,
SNode
*
pCond
)
{
SRewriteTagCondCxt
cxt
=
{.
code
=
TSDB_CODE_SUCCESS
,
.
pTagVals
=
pTagVals
,
.
pTagName
=
pTagName
};
nodesRewriteExpr
(
&
pCond
,
rewriteTagCond
,
&
cxt
);
return
cxt
.
code
;
}
static
int32_t
checkTagCondResult
(
SNode
*
pResult
)
{
return
(
QUERY_NODE_VALUE
==
nodeType
(
pResult
)
&&
((
SValueNode
*
)
pResult
)
->
datum
.
b
)
?
TSDB_CODE_SUCCESS
:
TSDB_CODE_PAR_PERMISSION_DENIED
;
}
int32_t
checkSubtablePrivilege
(
SArray
*
pTagVals
,
SArray
*
pTagName
,
SNode
*
pCond
)
{
int32_t
code
=
setTagVal
(
pTagVals
,
pTagName
,
pCond
);
SNode
*
pNew
=
NULL
;
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
scalarCalculateConstants
(
pCond
,
&
pNew
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
checkTagCondResult
(
pNew
);
}
nodesDestroyNode
(
pNew
);
return
code
;
}
// pSql -> tag1_value, ...)
static
int32_t
parseTagsClauseImpl
(
SInsertParseContext
*
pCxt
,
SVnodeModifyOpStmt
*
pStmt
)
{
int32_t
code
=
TSDB_CODE_SUCCESS
;
...
...
@@ -722,25 +837,31 @@ static int32_t parseUsingClauseBottom(SInsertParseContext* pCxt, SVnodeModifyOpS
return
code
;
}
static
void
setUserAuthInfo
(
SParseContext
*
pCxt
,
SName
*
pTbName
,
SUserAuthInfo
*
pInfo
)
{
snprintf
(
pInfo
->
user
,
sizeof
(
pInfo
->
user
),
"%s"
,
pCxt
->
pUser
);
memcpy
(
&
pInfo
->
tbName
,
pTbName
,
sizeof
(
SName
));
pInfo
->
type
=
AUTH_TYPE_WRITE
;
}
static
int32_t
checkAuth
(
SParseContext
*
pCxt
,
SName
*
pTbName
,
bool
*
pMissCache
)
{
char
dbFName
[
TSDB_DB_FNAME_LEN
]
;
tNameGetFullDbName
(
pTbName
,
dbFName
)
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
bool
pass
=
true
;
bool
exists
=
true
;
int32_t
code
=
TSDB_CODE_SUCCESS
;
SUserAuthInfo
authInfo
=
{
0
}
;
setUserAuthInfo
(
pCxt
,
pTbName
,
&
authInfo
)
;
SUserAuthRes
authRes
=
{
0
}
;
bool
exists
=
true
;
if
(
pCxt
->
async
)
{
code
=
catalogChkAuthFromCache
(
pCxt
->
pCatalog
,
pCxt
->
pUser
,
dbFName
,
AUTH_TYPE_WRITE
,
&
pas
s
,
&
exists
);
code
=
catalogChkAuthFromCache
(
pCxt
->
pCatalog
,
&
authInfo
,
&
authRe
s
,
&
exists
);
}
else
{
SRequestConnInfo
conn
=
{.
pTrans
=
pCxt
->
pTransporter
,
.
requestId
=
pCxt
->
requestId
,
.
requestObjRefId
=
pCxt
->
requestRid
,
.
mgmtEps
=
pCxt
->
mgmtEpSet
};
code
=
catalogChkAuth
(
pCxt
->
pCatalog
,
&
conn
,
pCxt
->
pUser
,
dbFName
,
AUTH_TYPE_WRITE
,
&
pas
s
);
code
=
catalogChkAuth
(
pCxt
->
pCatalog
,
&
conn
,
&
authInfo
,
&
authRe
s
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
if
(
!
exists
)
{
*
pMissCache
=
true
;
}
else
if
(
!
pass
)
{
}
else
if
(
!
authRes
.
pass
)
{
code
=
TSDB_CODE_PAR_PERMISSION_DENIED
;
}
}
...
...
@@ -1901,7 +2022,7 @@ static int32_t buildInsertUserAuthReq(const char* pUser, SName* pName, SArray**
SUserAuthInfo
userAuth
=
{.
type
=
AUTH_TYPE_WRITE
};
snprintf
(
userAuth
.
user
,
sizeof
(
userAuth
.
user
),
"%s"
,
pUser
);
tNameGetFullDbName
(
pName
,
userAuth
.
dbFName
);
//
tNameGetFullDbName(pName, userAuth.dbFName);
taosArrayPush
(
*
pUserAuth
,
&
userAuth
);
return
TSDB_CODE_SUCCESS
;
...
...
source/libs/parser/src/parTranslater.c
浏览文件 @
910aba27
...
...
@@ -978,7 +978,8 @@ static EDealRes translateColumnUseAlias(STranslateContext* pCxt, SColumnNode** p
}
static
EDealRes
translateColumn
(
STranslateContext
*
pCxt
,
SColumnNode
**
pCol
)
{
if
(
NULL
==
pCxt
->
pCurrStmt
||
isSelectStmt
(
pCxt
->
pCurrStmt
)
&&
NULL
==
((
SSelectStmt
*
)
pCxt
->
pCurrStmt
)
->
pFromTable
)
{
if
(
NULL
==
pCxt
->
pCurrStmt
||
(
isSelectStmt
(
pCxt
->
pCurrStmt
)
&&
NULL
==
((
SSelectStmt
*
)
pCxt
->
pCurrStmt
)
->
pFromTable
))
{
return
generateDealNodeErrMsg
(
pCxt
,
TSDB_CODE_PAR_INVALID_COLUMN
,
(
*
pCol
)
->
colName
);
}
...
...
@@ -6474,22 +6475,69 @@ static int32_t translateDropFunction(STranslateContext* pCxt, SDropFunctionStmt*
return
buildCmdMsg
(
pCxt
,
TDMT_MND_DROP_FUNC
,
(
FSerializeFunc
)
tSerializeSDropFuncReq
,
&
req
);
}
static
int32_t
createRealTableForGrantTable
(
SGrantStmt
*
pStmt
,
SRealTableNode
**
pTable
)
{
SRealTableNode
*
pRealTable
=
(
SRealTableNode
*
)
nodesMakeNode
(
QUERY_NODE_REAL_TABLE
);
if
(
NULL
==
pRealTable
)
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
strcpy
(
pRealTable
->
table
.
dbName
,
pStmt
->
objName
);
strcpy
(
pRealTable
->
table
.
tableName
,
pStmt
->
tabName
);
strcpy
(
pRealTable
->
table
.
tableAlias
,
pStmt
->
tabName
);
*
pTable
=
pRealTable
;
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
translateGrantTagCond
(
STranslateContext
*
pCxt
,
SGrantStmt
*
pStmt
,
SAlterUserReq
*
pReq
)
{
if
(
NULL
==
pStmt
->
pTagCond
)
{
return
TSDB_CODE_SUCCESS
;
}
if
(
'\0'
==
pStmt
->
tabName
[
0
]
||
'*'
==
pStmt
->
tabName
[
0
])
{
return
generateSyntaxErrMsgExt
(
&
pCxt
->
msgBuf
,
TSDB_CODE_PAR_SYNTAX_ERROR
,
"The With clause can only be used for table level privilege"
);
}
pCxt
->
pCurrStmt
=
(
SNode
*
)
pStmt
;
SRealTableNode
*
pTable
=
NULL
;
int32_t
code
=
createRealTableForGrantTable
(
pStmt
,
&
pTable
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
SName
name
;
code
=
getTableMetaImpl
(
pCxt
,
toName
(
pCxt
->
pParseCxt
->
acctId
,
pTable
->
table
.
dbName
,
pTable
->
table
.
tableName
,
&
name
),
&
(
pTable
->
pMeta
));
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
addNamespace
(
pCxt
,
pTable
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
translateExpr
(
pCxt
,
&
pStmt
->
pTagCond
);
}
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
nodesNodeToString
(
pStmt
->
pTagCond
,
false
,
&
pReq
->
tagCond
,
&
pReq
->
tagCondLen
);
}
nodesDestroyNode
((
SNode
*
)
pTable
);
return
code
;
}
static
int32_t
translateGrant
(
STranslateContext
*
pCxt
,
SGrantStmt
*
pStmt
)
{
SAlterUserReq
req
=
{
0
};
if
(
BIT_FLAG_TEST_MASK
(
pStmt
->
privileges
,
PRIVILEGE_TYPE_ALL
)
||
(
BIT_FLAG_TEST_MASK
(
pStmt
->
privileges
,
PRIVILEGE_TYPE_READ
)
&&
BIT_FLAG_TEST_MASK
(
pStmt
->
privileges
,
PRIVILEGE_TYPE_WRITE
)))
{
req
.
alterType
=
TSDB_ALTER_USER_ADD_ALL_DB
;
req
.
alterType
=
(
'\0'
==
pStmt
->
tabName
[
0
]
?
TSDB_ALTER_USER_ADD_ALL_DB
:
TSDB_ALTER_USER_ADD_ALL_TABLE
)
;
}
else
if
(
BIT_FLAG_TEST_MASK
(
pStmt
->
privileges
,
PRIVILEGE_TYPE_READ
))
{
req
.
alterType
=
TSDB_ALTER_USER_ADD_READ_DB
;
req
.
alterType
=
(
'\0'
==
pStmt
->
tabName
[
0
]
?
TSDB_ALTER_USER_ADD_READ_DB
:
TSDB_ALTER_USER_ADD_READ_TABLE
)
;
}
else
if
(
BIT_FLAG_TEST_MASK
(
pStmt
->
privileges
,
PRIVILEGE_TYPE_WRITE
))
{
req
.
alterType
=
TSDB_ALTER_USER_ADD_WRITE_DB
;
req
.
alterType
=
(
'\0'
==
pStmt
->
tabName
[
0
]
?
TSDB_ALTER_USER_ADD_WRITE_DB
:
TSDB_ALTER_USER_ADD_WRITE_TABLE
)
;
}
else
if
(
BIT_FLAG_TEST_MASK
(
pStmt
->
privileges
,
PRIVILEGE_TYPE_SUBSCRIBE
))
{
req
.
alterType
=
TSDB_ALTER_USER_ADD_SUBSCRIBE_TOPIC
;
}
strcpy
(
req
.
user
,
pStmt
->
userName
);
sprintf
(
req
.
objname
,
"%d.%s"
,
pCxt
->
pParseCxt
->
acctId
,
pStmt
->
objName
);
return
buildCmdMsg
(
pCxt
,
TDMT_MND_ALTER_USER
,
(
FSerializeFunc
)
tSerializeSAlterUserReq
,
&
req
);
sprintf
(
req
.
tabName
,
"%s"
,
pStmt
->
tabName
);
int32_t
code
=
translateGrantTagCond
(
pCxt
,
pStmt
,
&
req
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
code
=
buildCmdMsg
(
pCxt
,
TDMT_MND_ALTER_USER
,
(
FSerializeFunc
)
tSerializeSAlterUserReq
,
&
req
);
}
return
code
;
}
static
int32_t
translateRevoke
(
STranslateContext
*
pCxt
,
SRevokeStmt
*
pStmt
)
{
...
...
@@ -6497,16 +6545,17 @@ static int32_t translateRevoke(STranslateContext* pCxt, SRevokeStmt* pStmt) {
if
(
BIT_FLAG_TEST_MASK
(
pStmt
->
privileges
,
PRIVILEGE_TYPE_ALL
)
||
(
BIT_FLAG_TEST_MASK
(
pStmt
->
privileges
,
PRIVILEGE_TYPE_READ
)
&&
BIT_FLAG_TEST_MASK
(
pStmt
->
privileges
,
PRIVILEGE_TYPE_WRITE
)))
{
req
.
alterType
=
TSDB_ALTER_USER_REMOVE_ALL_DB
;
req
.
alterType
=
(
'\0'
==
pStmt
->
tabName
[
0
]
?
TSDB_ALTER_USER_REMOVE_ALL_DB
:
TSDB_ALTER_USER_REMOVE_ALL_TABLE
)
;
}
else
if
(
BIT_FLAG_TEST_MASK
(
pStmt
->
privileges
,
PRIVILEGE_TYPE_READ
))
{
req
.
alterType
=
TSDB_ALTER_USER_REMOVE_READ_DB
;
req
.
alterType
=
(
'\0'
==
pStmt
->
tabName
[
0
]
?
TSDB_ALTER_USER_REMOVE_READ_DB
:
TSDB_ALTER_USER_REMOVE_READ_TABLE
)
;
}
else
if
(
BIT_FLAG_TEST_MASK
(
pStmt
->
privileges
,
PRIVILEGE_TYPE_WRITE
))
{
req
.
alterType
=
TSDB_ALTER_USER_REMOVE_WRITE_DB
;
req
.
alterType
=
(
'\0'
==
pStmt
->
tabName
[
0
]
?
TSDB_ALTER_USER_REMOVE_WRITE_DB
:
TSDB_ALTER_USER_REMOVE_WRITE_TABLE
)
;
}
else
if
(
BIT_FLAG_TEST_MASK
(
pStmt
->
privileges
,
PRIVILEGE_TYPE_SUBSCRIBE
))
{
req
.
alterType
=
TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC
;
}
strcpy
(
req
.
user
,
pStmt
->
userName
);
sprintf
(
req
.
objname
,
"%d.%s"
,
pCxt
->
pParseCxt
->
acctId
,
pStmt
->
objName
);
sprintf
(
req
.
tabName
,
"%s"
,
pStmt
->
tabName
);
return
buildCmdMsg
(
pCxt
,
TDMT_MND_ALTER_USER
,
(
FSerializeFunc
)
tSerializeSAlterUserReq
,
&
req
);
}
...
...
source/libs/parser/src/parUtil.c
浏览文件 @
910aba27
...
...
@@ -17,7 +17,7 @@
#include "cJSON.h"
#include "querynodes.h"
#define USER_AUTH_KEY_MAX_LEN TSDB_USER_LEN + TSDB_
DB
_FNAME_LEN + 2
#define USER_AUTH_KEY_MAX_LEN TSDB_USER_LEN + TSDB_
TABLE
_FNAME_LEN + 2
const
void
*
nullPointer
=
NULL
;
...
...
@@ -496,24 +496,44 @@ int32_t getVnodeSysTableTargetName(int32_t acctId, SNode* pWhere, SName* pName)
return
TSDB_CODE_SUCCESS
;
}
static
int32_t
userAuthToString
(
int32_t
acctId
,
const
char
*
pUser
,
const
char
*
pDb
,
AUTH_TYPE
type
,
char
*
pStr
)
{
return
sprintf
(
pStr
,
"%s*%d.%s*%d"
,
pUser
,
acctId
,
pDb
,
type
);
static
int32_t
userAuthToString
(
int32_t
acctId
,
const
char
*
pUser
,
const
char
*
pDb
,
const
char
*
pTable
,
AUTH_TYPE
type
,
char
*
pStr
)
{
return
sprintf
(
pStr
,
"%s*%d*%s*%s*%d"
,
pUser
,
acctId
,
pDb
,
(
NULL
!=
pTable
&&
'\0'
==
pTable
[
0
])
?
NULL
:
pTable
,
type
);
}
static
int32_t
userAuthToStringExt
(
const
char
*
pUser
,
const
char
*
pDbFName
,
AUTH_TYPE
type
,
char
*
pStr
)
{
return
sprintf
(
pStr
,
"%s*%s*%d"
,
pUser
,
pDbFName
,
type
);
static
int32_t
getIntegerFromAuthStr
(
const
char
*
pStart
,
char
**
pNext
)
{
char
*
p
=
strchr
(
pStart
,
'*'
);
char
buf
[
10
]
=
{
0
};
if
(
NULL
==
p
)
{
strcpy
(
buf
,
pStart
);
*
pNext
=
NULL
;
}
else
{
strncpy
(
buf
,
pStart
,
p
-
pStart
);
*
pNext
=
++
p
;
}
return
taosStr2Int32
(
buf
,
NULL
,
10
);
}
static
void
getStringFromAuthStr
(
const
char
*
pStart
,
char
*
pStr
,
char
**
pNext
)
{
char
*
p
=
strchr
(
pStart
,
'*'
);
if
(
NULL
==
p
)
{
strcpy
(
pStr
,
pStart
);
*
pNext
=
NULL
;
}
else
{
strncpy
(
pStr
,
pStart
,
p
-
pStart
);
*
pNext
=
++
p
;
}
}
static
void
stringToUserAuth
(
const
char
*
pStr
,
int32_t
len
,
SUserAuthInfo
*
pUserAuth
)
{
char
*
p1
=
strchr
(
pStr
,
'*'
);
strncpy
(
pUserAuth
->
user
,
pStr
,
p1
-
pStr
);
++
p1
;
char
*
p2
=
strchr
(
p1
,
'*'
);
strncpy
(
pUserAuth
->
dbFName
,
p1
,
p2
-
p1
);
++
p2
;
char
buf
[
10
]
=
{
0
};
strncpy
(
buf
,
p2
,
len
-
(
p2
-
pStr
));
pUserAuth
->
type
=
taosStr2Int32
(
buf
,
NULL
,
10
);
char
*
p
=
NULL
;
getStringFromAuthStr
(
pStr
,
pUserAuth
->
user
,
&
p
);
pUserAuth
->
tbName
.
acctId
=
getIntegerFromAuthStr
(
p
,
&
p
);
getStringFromAuthStr
(
p
,
pUserAuth
->
tbName
.
dbname
,
&
p
);
getStringFromAuthStr
(
p
,
pUserAuth
->
tbName
.
tname
,
&
p
);
pUserAuth
->
tbName
.
type
=
TSDB_TABLE_NAME_T
;
pUserAuth
->
type
=
getIntegerFromAuthStr
(
p
,
&
p
);
}
static
int32_t
buildTableReq
(
SHashObj
*
pTablesHash
,
SArray
**
pTables
)
{
...
...
@@ -584,10 +604,12 @@ static int32_t buildUserAuthReq(SHashObj* pUserAuthHash, SArray** pUserAuth) {
}
void
*
p
=
taosHashIterate
(
pUserAuthHash
,
NULL
);
while
(
NULL
!=
p
)
{
size_t
len
=
0
;
char
*
pKey
=
taosHashGetKey
(
p
,
&
len
);
size_t
len
=
0
;
char
*
pKey
=
taosHashGetKey
(
p
,
&
len
);
char
key
[
USER_AUTH_KEY_MAX_LEN
]
=
{
0
};
strncpy
(
key
,
pKey
,
len
);
SUserAuthInfo
userAuth
=
{
0
};
stringToUserAuth
(
pK
ey
,
len
,
&
userAuth
);
stringToUserAuth
(
k
ey
,
len
,
&
userAuth
);
taosArrayPush
(
*
pUserAuth
,
&
userAuth
);
p
=
taosHashIterate
(
pUserAuthHash
,
p
);
}
...
...
@@ -712,7 +734,8 @@ static int32_t putUserAuthToCache(const SArray* pUserAuthReq, const SArray* pUse
for
(
int32_t
i
=
0
;
i
<
nvgs
;
++
i
)
{
SUserAuthInfo
*
pUser
=
taosArrayGet
(
pUserAuthReq
,
i
);
char
key
[
USER_AUTH_KEY_MAX_LEN
]
=
{
0
};
int32_t
len
=
userAuthToStringExt
(
pUser
->
user
,
pUser
->
dbFName
,
pUser
->
type
,
key
);
int32_t
len
=
userAuthToString
(
pUser
->
tbName
.
acctId
,
pUser
->
user
,
pUser
->
tbName
.
dbname
,
pUser
->
tbName
.
tname
,
pUser
->
type
,
key
);
if
(
TSDB_CODE_SUCCESS
!=
putMetaDataToHash
(
key
,
len
,
pUserAuthData
,
i
,
pUserAuth
))
{
return
TSDB_CODE_OUT_OF_MEMORY
;
}
...
...
@@ -910,33 +933,24 @@ static int32_t reserveUserAuthInCacheImpl(const char* pKey, int32_t len, SParseM
return
TSDB_CODE_OUT_OF_MEMORY
;
}
}
bool
pass
=
false
;
return
taosHashPut
(
pMetaCache
->
pUserAuth
,
pKey
,
len
,
&
pass
,
sizeof
(
pass
));
return
taosHashPut
(
pMetaCache
->
pUserAuth
,
pKey
,
len
,
&
nullPointer
,
POINTER_BYTES
);
}
int32_t
reserveUserAuthInCache
(
int32_t
acctId
,
const
char
*
pUser
,
const
char
*
pDb
,
AUTH_TYPE
type
,
int32_t
reserveUserAuthInCache
(
int32_t
acctId
,
const
char
*
pUser
,
const
char
*
pDb
,
const
char
*
pTable
,
AUTH_TYPE
type
,
SParseMetaCache
*
pMetaCache
)
{
char
key
[
USER_AUTH_KEY_MAX_LEN
]
=
{
0
};
int32_t
len
=
userAuthToString
(
acctId
,
pUser
,
pDb
,
type
,
key
);
return
reserveUserAuthInCacheImpl
(
key
,
len
,
pMetaCache
);
}
int32_t
reserveUserAuthInCacheExt
(
const
char
*
pUser
,
const
SName
*
pName
,
AUTH_TYPE
type
,
SParseMetaCache
*
pMetaCache
)
{
char
dbFName
[
TSDB_DB_FNAME_LEN
]
=
{
0
};
tNameGetFullDbName
(
pName
,
dbFName
);
char
key
[
USER_AUTH_KEY_MAX_LEN
]
=
{
0
};
int32_t
len
=
userAuthToStringExt
(
pUser
,
dbFName
,
type
,
key
);
int32_t
len
=
userAuthToString
(
acctId
,
pUser
,
pDb
,
pTable
,
type
,
key
);
return
reserveUserAuthInCacheImpl
(
key
,
len
,
pMetaCache
);
}
int32_t
getUserAuthFromCache
(
SParseMetaCache
*
pMetaCache
,
const
char
*
pUser
,
const
char
*
pDbFName
,
AUTH_TYPE
type
,
bool
*
pPass
)
{
char
key
[
USER_AUTH_KEY_MAX_LEN
]
=
{
0
};
int32_t
len
=
userAuthToStringExt
(
pUser
,
pDbFName
,
type
,
key
);
bool
*
pRes
=
NULL
;
int32_t
code
=
getMetaDataFromHash
(
key
,
len
,
pMetaCache
->
pUserAuth
,
(
void
**
)
&
pRes
);
int32_t
getUserAuthFromCache
(
SParseMetaCache
*
pMetaCache
,
SUserAuthInfo
*
pAuthReq
,
SUserAuthRes
*
pAuthRes
)
{
char
key
[
USER_AUTH_KEY_MAX_LEN
]
=
{
0
};
int32_t
len
=
userAuthToString
(
pAuthReq
->
tbName
.
acctId
,
pAuthReq
->
user
,
pAuthReq
->
tbName
.
dbname
,
pAuthReq
->
tbName
.
tname
,
pAuthReq
->
type
,
key
);
SUserAuthRes
*
pAuth
=
NULL
;
int32_t
code
=
getMetaDataFromHash
(
key
,
len
,
pMetaCache
->
pUserAuth
,
(
void
**
)
&
pAuth
);
if
(
TSDB_CODE_SUCCESS
==
code
)
{
*
pPass
=
*
pRes
;
memcpy
(
pAuthRes
,
pAuth
,
sizeof
(
SUserAuthRes
))
;
}
return
code
;
}
...
...
source/libs/parser/src/sql.c
浏览文件 @
910aba27
此差异已折叠。
点击以展开。
source/libs/parser/test/mockCatalog.cpp
浏览文件 @
910aba27
...
...
@@ -279,15 +279,13 @@ int32_t __catalogGetDBCfg(SCatalog* pCtg, SRequestConnInfo* pConn, const char* d
return
g_mockCatalogService
->
catalogGetDBCfg
(
dbFName
,
pDbCfg
);
}
int32_t
__catalogChkAuth
(
SCatalog
*
pCtg
,
SRequestConnInfo
*
pConn
,
const
char
*
user
,
const
char
*
dbFName
,
AUTH_TYPE
type
,
bool
*
pass
)
{
*
pass
=
true
;
int32_t
__catalogChkAuth
(
SCatalog
*
pCtg
,
SRequestConnInfo
*
pConn
,
SUserAuthInfo
*
pAuth
,
SUserAuthRes
*
pRes
)
{
pRes
->
pass
=
true
;
return
0
;
}
int32_t
__catalogChkAuthFromCache
(
SCatalog
*
pCtg
,
const
char
*
user
,
const
char
*
dbFName
,
AUTH_TYPE
type
,
bool
*
pass
,
bool
*
exists
)
{
*
pass
=
true
;
int32_t
__catalogChkAuthFromCache
(
SCatalog
*
pCtg
,
SUserAuthInfo
*
pAuth
,
SUserAuthRes
*
pRes
,
bool
*
exists
)
{
pRes
->
pass
=
true
;
*
exists
=
true
;
return
0
;
}
...
...
source/libs/parser/test/mockCatalogService.cpp
浏览文件 @
910aba27
...
...
@@ -589,8 +589,8 @@ class MockCatalogServiceImpl {
*
pUserAuthData
=
taosArrayInit
(
num
,
sizeof
(
SMetaRes
));
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
SMetaRes
res
=
{
0
};
res
.
pRes
=
taosMemoryCalloc
(
1
,
sizeof
(
bool
));
*
(
bool
*
)(
res
.
pRes
)
=
true
;
res
.
pRes
=
taosMemoryCalloc
(
1
,
sizeof
(
SUserAuthRes
));
((
SUserAuthRes
*
)
res
.
pRes
)
->
pass
=
true
;
taosArrayPush
(
*
pUserAuthData
,
&
res
);
}
}
...
...
source/util/src/terror.c
浏览文件 @
910aba27
...
...
@@ -190,6 +190,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_NO_USER_FROM_CONN, "Can not get user from
TAOS_DEFINE_ERROR
(
TSDB_CODE_MND_TOO_MANY_USERS
,
"Too many users"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_MND_INVALID_ALTER_OPER
,
"Invalid alter operation"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_MND_AUTH_FAILURE
,
"Authentication failure"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_MND_PRIVILEDGE_EXIST
,
"User already have this priviledge"
)
//mnode-stable-part1
TAOS_DEFINE_ERROR
(
TSDB_CODE_MND_STB_ALREADY_EXIST
,
"STable already exists"
)
...
...
tests/system-test/0-others/user_control.py
浏览文件 @
910aba27
...
...
@@ -444,7 +444,7 @@ class TDTestCase:
self
.
__grant_user_privileges
(
privilege
=
""
,
dbname
=
"db"
,
user_name
=
self
.
__user_list
[
0
])
,
self
.
__grant_user_privileges
(
privilege
=
" "
.
join
(
self
.
__privilege
),
user_name
=
self
.
__user_list
[
0
])
,
f
"GRANT
{
self
.
__privilege
[
0
]
}
ON * TO
{
self
.
__user_list
[
0
]
}
"
,
f
"GRANT
{
self
.
__privilege
[
0
]
}
ON
{
DBNAME
}
.
{
NTBNAME
}
TO
{
self
.
__user_list
[
0
]
}
"
,
#
f"GRANT {self.__privilege[0]} ON {DBNAME}.{NTBNAME} TO {self.__user_list[0]}" ,
]
def
__revoke_err
(
self
):
...
...
@@ -456,7 +456,7 @@ class TDTestCase:
self
.
__revoke_user_privileges
(
privilege
=
""
,
dbname
=
"db"
,
user_name
=
self
.
__user_list
[
0
])
,
self
.
__revoke_user_privileges
(
privilege
=
" "
.
join
(
self
.
__privilege
),
user_name
=
self
.
__user_list
[
0
])
,
f
"REVOKE
{
self
.
__privilege
[
0
]
}
ON * FROM
{
self
.
__user_list
[
0
]
}
"
,
f
"REVOKE
{
self
.
__privilege
[
0
]
}
ON
{
DBNAME
}
.
{
NTBNAME
}
FROM
{
self
.
__user_list
[
0
]
}
"
,
#
f"REVOKE {self.__privilege[0]} ON {DBNAME}.{NTBNAME} FROM {self.__user_list[0]}" ,
]
def
test_grant_err
(
self
):
...
...
tests/system-test/2-query/odbc.py
浏览文件 @
910aba27
...
...
@@ -22,7 +22,7 @@ class TDTestCase:
tdSql
.
execute
(
"insert into db.ctb using db.stb tags(1) (ts, c1) values (now, 1)"
)
tdSql
.
query
(
"select count(*) from information_schema.ins_columns"
)
tdSql
.
checkData
(
0
,
0
,
27
2
)
tdSql
.
checkData
(
0
,
0
,
27
4
)
tdSql
.
query
(
"select * from information_schema.ins_columns where table_name = 'ntb'"
)
tdSql
.
checkRows
(
14
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录