• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #4915

06 Jan 2026 01:30AM UTC coverage: 65.711% (+0.8%) from 64.876%
#4915

push

travis-ci

web-flow
merge: from main to 3.0 branch #34167

185 of 324 new or added lines in 15 files covered. (57.1%)

3013 existing lines in 16 files now uncovered.

206438 of 314159 relevant lines covered (65.71%)

119372024.93 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

84.44
/source/libs/parser/src/parAuthenticator.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
14
 */
15

16
#include "catalog.h"
17
#include "cmdnodes.h"
18
#include "parInt.h"
19

20
typedef struct SAuthCxt {
21
  SParseContext*   pParseCxt;
22
  SParseMetaCache* pMetaCache;
23
  int32_t          errCode;
24
} SAuthCxt;
25

26
typedef struct SSelectAuthCxt {
27
  SAuthCxt*    pAuthCxt;
28
  SSelectStmt* pSelect;
29
} SSelectAuthCxt;
30

31
typedef struct SAuthRewriteCxt {
32
  STableNode* pTarget;
33
} SAuthRewriteCxt;
34

35
static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt);
36

37
static int32_t setUserAuthInfo(SParseContext* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
1,462,012✔
38
                               EPrivObjType objType, bool isView, bool effective, SUserAuthInfo* pAuth) {
39
  if (effective) {
1,462,012✔
40
    snprintf(pAuth->user, sizeof(pAuth->user), "%s", pCxt->pEffectiveUser ? pCxt->pEffectiveUser : "");
×
41
    pAuth->userId = pCxt->effectiveUserId;  // TODO: assign the effective user id
×
42
  } else {
43
    snprintf(pAuth->user, sizeof(pAuth->user), "%s", pCxt->pUser);
1,462,012✔
44
    pAuth->userId = pCxt->userId;
1,462,012✔
45
  }
46

47
  if (NULL == pTabName) {
1,462,012✔
48
    if (pDbName) {
845,443✔
49
      int32_t code = tNameSetDbName(&pAuth->tbName, pCxt->acctId, pDbName, strlen(pDbName));
826,071✔
50
      if (TSDB_CODE_SUCCESS != code) return code;
826,071✔
51
    } else {
52
      pAuth->tbName.acctId = pCxt->acctId;
19,372✔
53
      pAuth->tbName.type = TSDB_SYS_NAME_T;
19,372✔
54
    }
55
  } else {
56
    toName(pCxt->acctId, pDbName, pTabName, &pAuth->tbName);
616,569✔
57
  }
58
  pAuth->privType = privType;
1,462,012✔
59
  pAuth->objType = objType;
1,462,012✔
60
  pAuth->isView = isView;
1,462,012✔
61
  return TSDB_CODE_SUCCESS;
1,462,012✔
62
}
63

64
static int32_t checkAuthByOwner(SAuthCxt* pCxt, SUserAuthInfo* pAuthInfo, SUserAuthRes* pAuthRes) {
1,462,012✔
65
  SParseContext*   pParseCxt = pCxt->pParseCxt;
1,462,012✔
66
  const SPrivInfo* pPrivInfo = privInfoGet(pAuthInfo->privType);
1,462,012✔
67
  if (NULL == pPrivInfo) {
1,462,012✔
68
    return TSDB_CODE_PAR_INTERNAL_ERROR;
×
69
  }
70
  int32_t code = 0;
1,462,012✔
71
  if (pPrivInfo->category == PRIV_CATEGORY_OBJECT || pAuthInfo->objType == PRIV_OBJ_DB) {
1,462,012✔
72
    SPrivInfo privInfoDup = *pPrivInfo;
1,059,348✔
73
    if (privInfoDup.objType <= 0) privInfoDup.objType = PRIV_OBJ_DB;
1,059,348✔
74
    switch (privInfoDup.objType) {
1,059,348✔
75
      case PRIV_OBJ_DB: {
826,071✔
76
        SDbCfgInfo dbCfgInfo = {0};
826,071✔
77
        char       dbFName[TSDB_DB_FNAME_LEN] = {0};
826,071✔
78
        (void)tNameGetFullDbName(&pAuthInfo->tbName, dbFName);
826,071✔
79
        code = getDbCfgFromCache(pCxt->pMetaCache, dbFName, &dbCfgInfo);
826,071✔
80
        if (TSDB_CODE_SUCCESS != code) {
826,071✔
81
          return code;
100,817✔
82
        }
83
        if (dbCfgInfo.ownerId == pAuthInfo->userId) {
725,254✔
84
          pAuthRes->pass[pAuthInfo->isView ? AUTH_RES_VIEW : AUTH_RES_BASIC] = true;
2,448✔
85
#if 0
86
          printf("%s:%d db %s owner match, pass\n", __func__, __LINE__, dbFName);
87
#endif
88
          return TSDB_CODE_SUCCESS;
2,448✔
89
        }
90
        break;
722,806✔
91
      }
92
      default:
233,277✔
93
        return TSDB_CODE_SUCCESS;
233,277✔
94
    }
95
  }
96
_exit:
402,664✔
97
  return TSDB_CODE_SUCCESS;
1,125,470✔
98
}
99

100
static int32_t checkAuthImpl(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
640,254,566✔
101
                             EPrivObjType objType, SNode** pCond, bool isView, bool effective) {
102
  SParseContext* pParseCxt = pCxt->pParseCxt;
640,254,566✔
103
  if (pParseCxt->isSuperUser) {
640,257,764✔
104
    return TSDB_CODE_SUCCESS;
638,796,423✔
105
  }
106

107
  AUTH_RES_TYPE auth_res_type = isView ? AUTH_RES_VIEW : AUTH_RES_BASIC;
1,462,012✔
108
  SUserAuthInfo authInfo = {0};
1,462,012✔
109
  int32_t code = setUserAuthInfo(pCxt->pParseCxt, pDbName, pTabName, privType, objType, isView, effective, &authInfo);
1,462,012✔
110
  if (TSDB_CODE_SUCCESS != code) return code;
1,462,012✔
111
  SUserAuthRes authRes = {0};
1,462,012✔
112
  if (NULL != pCxt->pMetaCache) {
1,462,012✔
113
    code = checkAuthByOwner(pCxt, &authInfo, &authRes);
1,462,012✔
114
    if (code == TSDB_CODE_SUCCESS && authRes.pass[auth_res_type]) {
1,462,012✔
115
      goto _exit;
2,448✔
116
    }
117
    code = getUserAuthFromCache(pCxt->pMetaCache, &authInfo, &authRes);
1,459,564✔
118
#ifdef TD_ENTERPRISE
119
    if (isView && TSDB_CODE_PAR_INTERNAL_ERROR == code) {
1,459,564✔
120
      authInfo.isView = false;
×
121
      code = getUserAuthFromCache(pCxt->pMetaCache, &authInfo, &authRes);
×
122
    }
123
#endif
124
  } else {
125
    SRequestConnInfo conn = {.pTrans = pParseCxt->pTransporter,
×
126
                             .requestId = pParseCxt->requestId,
×
127
                             .requestObjRefId = pParseCxt->requestRid,
×
128
                             .mgmtEps = pParseCxt->mgmtEpSet};
129
    code = catalogChkAuth(pParseCxt->pCatalog, &conn, &authInfo, &authRes);
×
130
  }
131
_exit:
1,462,012✔
132
  if (TSDB_CODE_SUCCESS == code && NULL != pCond) {
1,462,012✔
133
    *pCond = authRes.pCond[auth_res_type];
63,385✔
134
  }
135
  return TSDB_CODE_SUCCESS == code ? (authRes.pass[auth_res_type] ? TSDB_CODE_SUCCESS : TSDB_CODE_PAR_PERMISSION_DENIED)
1,461,074✔
136
                                   : code;
2,922,906✔
137
}
138

139
static int32_t checkAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
640,252,203✔
140
                         EPrivObjType objType, SNode** pCond) {
141
#ifdef TD_ENTERPRISE
142
  return checkAuthImpl(pCxt, pDbName, pTabName, privType, objType, pCond, false, false);
640,252,203✔
143
#else
144
  return TSDB_CODE_SUCCESS;
145
#endif
146
}
147

148
static int32_t authSysPrivileges(SAuthCxt* pCxt, SNode* pStmt, EPrivType type) {
3,227,301✔
149
  return checkAuth(pCxt, NULL, NULL, type, 0, NULL);
3,227,301✔
150
}
151

152
static int32_t authObjPrivileges(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
415,511,027✔
153
                                 EPrivObjType objType) {
154
  if (!pDbName) {
415,511,027✔
155
    return TSDB_CODE_PAR_INTERNAL_ERROR;
×
156
  }
157

158
  return checkAuth(pCxt, pDbName, pTabName, privType, objType, NULL);
415,511,027✔
159
}
160

161
static int32_t checkEffectiveAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
×
162
                                  EPrivObjType objType, SNode** pCond) {
163
  return checkAuthImpl(pCxt, pDbName, pTabName, privType, objType, NULL, false, true);
×
164
}
165

166
static int32_t checkViewAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
7,401✔
167
                             EPrivObjType objType, SNode** pCond) {
168
  return checkAuthImpl(pCxt, pDbName, pTabName, privType, objType, pCond, true, false);
7,401✔
169
}
170

171
static int32_t checkViewEffectiveAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
×
172
                                      EPrivObjType objType, SNode** pCond) {
173
  return checkAuthImpl(pCxt, pDbName, pTabName, privType, objType, pCond, true, true);
×
174
}
175

176
static EDealRes authSubquery(SAuthCxt* pCxt, SNode* pStmt) {
20,864,296✔
177
  return TSDB_CODE_SUCCESS == authQuery(pCxt, pStmt) ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
20,864,296✔
178
}
179

180
static int32_t mergeStableTagCond(SNode** pWhere, SNode* pTagCond) {
×
181
  SLogicConditionNode* pLogicCond = NULL;
×
182
  int32_t              code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogicCond);
×
183
  if (NULL == pLogicCond) {
×
184
    return code;
×
185
  }
186
  pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL;
×
187
  pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes;
×
188
  pLogicCond->condType = LOGIC_COND_TYPE_AND;
×
189
  code = nodesListMakeStrictAppend(&pLogicCond->pParameterList, pTagCond);
×
190
  if (TSDB_CODE_SUCCESS == code) {
×
191
    code = nodesListMakeAppend(&pLogicCond->pParameterList, *pWhere);
×
192
  }
193
  if (TSDB_CODE_SUCCESS == code) {
×
194
    *pWhere = (SNode*)pLogicCond;
×
195
  } else {
196
    nodesDestroyNode((SNode*)pLogicCond);
×
197
  }
198
  return code;
×
199
}
200

201
EDealRes rewriteAuthTable(SNode* pNode, void* pContext) {
5,481✔
202
  if (QUERY_NODE_COLUMN == nodeType(pNode)) {
5,481✔
203
    SColumnNode*     pCol = (SColumnNode*)pNode;
1,827✔
204
    SAuthRewriteCxt* pCxt = (SAuthRewriteCxt*)pContext;
1,827✔
205
    tstrncpy(pCol->tableName, pCxt->pTarget->tableName, TSDB_TABLE_NAME_LEN);
1,827✔
206
    tstrncpy(pCol->tableAlias, pCxt->pTarget->tableAlias, TSDB_TABLE_NAME_LEN);
1,827✔
207
  }
208

209
  return DEAL_RES_CONTINUE;
5,481✔
210
}
211

212
static int32_t rewriteAppendStableTagCond(SNode** pWhere, SNode* pTagCond, STableNode* pTable) {
1,827✔
213
  SNode*  pTagCondCopy = NULL;
1,827✔
214
  int32_t code = nodesCloneNode(pTagCond, &pTagCondCopy);
1,827✔
215
  if (NULL == pTagCondCopy) {
1,827✔
216
    return code;
×
217
  }
218

219
  SAuthRewriteCxt cxt = {.pTarget = pTable};
1,827✔
220
  nodesWalkExpr(pTagCondCopy, rewriteAuthTable, &cxt);
1,827✔
221

222
  if (NULL == *pWhere) {
1,827✔
223
    *pWhere = pTagCondCopy;
1,827✔
224
    return TSDB_CODE_SUCCESS;
1,827✔
225
  }
226

227
  if (QUERY_NODE_LOGIC_CONDITION == nodeType(*pWhere) &&
×
228
      LOGIC_COND_TYPE_AND == ((SLogicConditionNode*)*pWhere)->condType) {
×
229
    return nodesListStrictAppend(((SLogicConditionNode*)*pWhere)->pParameterList, pTagCondCopy);
×
230
  }
231

232
  return mergeStableTagCond(pWhere, pTagCondCopy);
×
233
}
234

235
static EDealRes authSelectImpl(SNode* pNode, void* pContext) {
1,818,077,494✔
236
  SSelectAuthCxt* pCxt = pContext;
1,818,077,494✔
237
  SAuthCxt*       pAuthCxt = pCxt->pAuthCxt;
1,818,077,494✔
238
  bool            isView = false;
1,818,077,500✔
239
  if (QUERY_NODE_REAL_TABLE == nodeType(pNode)) {
1,818,077,500✔
240
    SNode*      pTagCond = NULL;
176,850,528✔
241
    STableNode* pTable = (STableNode*)pNode;
176,850,027✔
242
    if ((pAuthCxt->pParseCxt->enableSysInfo == 0) && IS_INFORMATION_SCHEMA_DB(pTable->dbName) &&
176,850,027✔
243
        (strcmp(pTable->tableName, TSDB_INS_TABLE_VGROUPS) == 0)) {
17,628✔
244
      pAuthCxt->errCode = TSDB_CODE_PAR_PERMISSION_DENIED;
624✔
245
      return DEAL_RES_ERROR;
624✔
246
    }
247
    if (authObjPrivileges(pAuthCxt, pTable->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB) != TSDB_CODE_SUCCESS) {
176,849,883✔
248
      pAuthCxt->errCode = TSDB_CODE_PAR_PERMISSION_DENIED;
1,082✔
249
      return DEAL_RES_ERROR;
1,082✔
250
    }
251
#ifdef TD_ENTERPRISE
252
    SName name = {0};
176,847,839✔
253
    toName(pAuthCxt->pParseCxt->acctId, pTable->dbName, pTable->tableName, &name);
176,848,337✔
254
    STableMeta* pTableMeta = NULL;
176,848,325✔
255
    toName(pAuthCxt->pParseCxt->acctId, pTable->dbName, pTable->tableName, &name);
176,848,811✔
256
    int32_t code = getTargetMetaImpl(pAuthCxt->pParseCxt, pAuthCxt->pMetaCache, &name, &pTableMeta, true);
176,848,834✔
257
    if (TSDB_CODE_SUCCESS == code && TSDB_VIEW_TABLE == pTableMeta->tableType) {
176,848,288✔
258
      isView = true;
7,401✔
259
    }
260
    taosMemoryFree(pTableMeta);
176,848,815✔
261
#endif
262
    if (!isView) {
176,848,235✔
263
      pAuthCxt->errCode =
176,841,423✔
264
          checkAuth(pAuthCxt, pTable->dbName, pTable->tableName, PRIV_TBL_SELECT, PRIV_OBJ_TBL, &pTagCond);
176,840,834✔
265
      if (TSDB_CODE_SUCCESS != pAuthCxt->errCode && NULL != pAuthCxt->pParseCxt->pEffectiveUser) {
176,841,439✔
266
        pAuthCxt->errCode =
×
267
            checkEffectiveAuth(pAuthCxt, pTable->dbName, pTable->tableName, PRIV_TBL_SELECT, PRIV_OBJ_TBL, NULL);
×
268
      }
269
      if (TSDB_CODE_SUCCESS == pAuthCxt->errCode && NULL != pTagCond) {
176,841,412✔
270
        pAuthCxt->errCode = rewriteAppendStableTagCond(&pCxt->pSelect->pWhere, pTagCond, pTable);
1,827✔
271
      }
272
    } else {
273
      pAuthCxt->errCode =
7,401✔
274
          checkViewAuth(pAuthCxt, pTable->dbName, pTable->tableName, PRIV_TBL_SELECT, PRIV_OBJ_TBL, NULL);
7,401✔
275
      if (TSDB_CODE_SUCCESS != pAuthCxt->errCode && NULL != pAuthCxt->pParseCxt->pEffectiveUser) {
7,401✔
276
        pAuthCxt->errCode =
×
277
            checkViewEffectiveAuth(pAuthCxt, pTable->dbName, pTable->tableName, PRIV_TBL_SELECT, PRIV_OBJ_TBL, NULL);
×
278
      }
279
    }
280
    return TSDB_CODE_SUCCESS == pAuthCxt->errCode ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
176,848,801✔
281
  } else if (QUERY_NODE_TEMP_TABLE == nodeType(pNode)) {
1,641,227,953✔
282
    return authSubquery(pAuthCxt, ((STempTableNode*)pNode)->pSubquery);
20,864,303✔
283
  }
284
  return DEAL_RES_CONTINUE;
1,620,363,643✔
285
}
286

287
static int32_t authSelect(SAuthCxt* pCxt, SSelectStmt* pSelect) {
185,712,492✔
288
  SSelectAuthCxt cxt = {.pAuthCxt = pCxt, .pSelect = pSelect};
185,712,492✔
289
  nodesWalkSelectStmt(pSelect, SQL_CLAUSE_FROM, authSelectImpl, &cxt);
185,712,504✔
290
  return pCxt->errCode;
185,712,489✔
291
}
292

293
static int32_t authSetOperator(SAuthCxt* pCxt, SSetOperator* pSetOper) {
9,824,321✔
294
  int32_t code = authQuery(pCxt, pSetOper->pLeft);
9,824,321✔
295
  if (TSDB_CODE_SUCCESS == code) {
9,824,321✔
296
    code = authQuery(pCxt, pSetOper->pRight);
9,824,321✔
297
  }
298
  return code;
9,824,321✔
299
}
300

301
static int32_t authDropUser(SAuthCxt* pCxt, SDropUserStmt* pStmt) {
20,661✔
302
  // if (!pCxt->pParseCxt->isSuperUser || 0 == strcmp(pStmt->userName, TSDB_DEFAULT_USER)) {
303
  //   return TSDB_CODE_PAR_PERMISSION_DENIED;
304
  // }
305
  if (0 == strcmp(pStmt->userName, TSDB_DEFAULT_USER)) {
20,661✔
306
    return TSDB_CODE_PAR_PERMISSION_DENIED;
×
307
  }
308
  return authSysPrivileges(pCxt, (void*)pStmt, PRIV_USER_DROP);  // root has SYSDBA role with USER_DROP privilege
20,661✔
309
}
310

311
static int32_t authDelete(SAuthCxt* pCxt, SDeleteStmt* pDelete) {
1,662,578✔
312
  SNode*      pTagCond = NULL;
1,662,578✔
313
  STableNode* pTable = (STableNode*)pDelete->pFromTable;
1,662,578✔
314
  int32_t     code = checkAuth(pCxt, pTable->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL);
1,662,578✔
315
  if (TSDB_CODE_SUCCESS == code) {
1,662,578✔
316
    code = checkAuth(pCxt, pTable->dbName, pTable->tableName, PRIV_TBL_DELETE, PRIV_OBJ_TBL, &pTagCond);
1,662,578✔
317
  }
318
  if (TSDB_CODE_SUCCESS == code && NULL != pTagCond) {
1,662,578✔
319
    code = rewriteAppendStableTagCond(&pDelete->pWhere, pTagCond, pTable);
×
320
  }
321
  return code;
1,662,578✔
322
}
323

324
static int32_t authInsert(SAuthCxt* pCxt, SInsertStmt* pInsert) {
68,374✔
325
  SNode*      pTagCond = NULL;
68,374✔
326
  STableNode* pTable = (STableNode*)pInsert->pTable;
68,374✔
327
  // todo check tag condition for subtable
328
  int32_t code = checkAuth(pCxt, pTable->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL);
68,374✔
329
  if (TSDB_CODE_SUCCESS == code) {
68,374✔
330
    code = checkAuth(pCxt, pTable->dbName, pTable->tableName, PRIV_TBL_INSERT, PRIV_OBJ_TBL, &pTagCond);
68,374✔
331
  }
332
  return code;
68,374✔
333
}
334

335
static int32_t authShowTables(SAuthCxt* pCxt, SShowStmt* pStmt) {
503,752✔
336
  // return checkAuth(pCxt, ((SValueNode*)pStmt->pDbName)->literal, NULL, AUTH_TYPE_READ_OR_WRITE, NULL);
337
  // stb: more check in server, child table(TODO): more check when filter query result
338
  return authObjPrivileges(pCxt, ((SValueNode*)pStmt->pDbName)->literal, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
503,752✔
339
}
340

341
static int32_t authShowVtables(SAuthCxt* pCxt, SShowStmt* pStmt) { return authShowTables(pCxt, pStmt); }
56,388✔
342

343
static int32_t authShowUsage(SAuthCxt* pCxt, SShowStmt* pStmt) {
284✔
344
  return authObjPrivileges(pCxt, ((SValueNode*)pStmt->pDbName)->literal, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
284✔
345
}
346

347
static int32_t authShowCreateTable(SAuthCxt* pCxt, SShowCreateTableStmt* pStmt) {
73,796✔
348
  // SNode* pTagCond = NULL;
349
  // todo check tag condition for subtable
350
  // return checkAuth(pCxt, pStmt->dbName, pStmt->tableName, AUTH_TYPE_READ, &pTagCond);
351
  PAR_ERR_RET(authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB));
73,796✔
352
  return authObjPrivileges(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_SHOW_CREATE, PRIV_OBJ_TBL);
70,520✔
353
}
354

355
static int32_t authShowCreateView(SAuthCxt* pCxt, SShowCreateViewStmt* pStmt) {
×
356
#ifndef TD_ENTERPRISE
357
  return TSDB_CODE_OPS_NOT_SUPPORT;
358
#else
359
  return TSDB_CODE_SUCCESS;
×
360
#endif
361
}
362

363
static int32_t authCreateTable(SAuthCxt* pCxt, SCreateTableStmt* pStmt) {
19,641,002✔
364
  // SNode* pTagCond = NULL;
365
  // todo check tag condition for subtable
366
  // return checkAuth(pCxt, pStmt->dbName, NULL, AUTH_TYPE_WRITE, &pTagCond);
367
  PAR_ERR_RET(authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB));
19,641,002✔
368
  return authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB);
19,640,690✔
369
}
370

371
static int32_t authCreateVTable(SAuthCxt* pCxt, SCreateVTableStmt* pStmt) {
120,573✔
372
  PAR_ERR_RET(authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB));
120,573✔
373
  PAR_ERR_RET(authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB));
120,573✔
374
  SNode* pCol = NULL;
110,845✔
375
  FOREACH(pCol, pStmt->pCols) {
119,949,100✔
376
    SColumnDefNode* pColDef = (SColumnDefNode*)pCol;
119,845,551✔
377
    if (NULL == pColDef) {
119,845,551✔
378
      PAR_ERR_RET(TSDB_CODE_PAR_INVALID_COLUMN);
×
379
    }
380
    SColumnOptions* pOptions = (SColumnOptions*)pColDef->pOptions;
119,845,551✔
381
    if (pOptions && pOptions->hasRef) {
119,845,551✔
382
      PAR_ERR_RET(authObjPrivileges(pCxt, pOptions->refDb, pOptions->refTable, PRIV_TBL_SELECT, PRIV_OBJ_TBL));
74,824,732✔
383
    }
384
  }
385
  return TSDB_CODE_SUCCESS;
103,549✔
386
}
387

388
static int32_t authCreateVSubTable(SAuthCxt* pCxt, SCreateVSubTableStmt* pStmt) {
189,745✔
389
  int32_t    code = TSDB_CODE_SUCCESS;
189,745✔
390
  SNode*     pNode = NULL;
189,745✔
391
  SNodeList* pTmpList = pStmt->pSpecificColRefs ? pStmt->pSpecificColRefs : pStmt->pColRefs;
189,745✔
392
  PAR_ERR_RET(authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB));
189,745✔
393
  PAR_ERR_RET(authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB));
189,745✔
394
  if (NULL == pTmpList) {
180,017✔
395
    // no column reference
396
    return TSDB_CODE_SUCCESS;
787✔
397
  }
398

399
  FOREACH(pNode, pTmpList) {
45,616,878✔
400
    SColumnRefNode* pColRef = (SColumnRefNode*)pNode;
45,444,944✔
401
    if (NULL == pColRef) {
45,444,944✔
402
      PAR_ERR_RET(TSDB_CODE_PAR_INVALID_COLUMN);
×
403
    }
404
    PAR_ERR_RET(authObjPrivileges(pCxt, pColRef->refDbName, pColRef->refTableName, PRIV_TBL_SELECT, PRIV_OBJ_TBL));
45,444,944✔
405
  }
406
  return code;
171,934✔
407
}
408

409
static int32_t authCreateStream(SAuthCxt* pCxt, SCreateStreamStmt* pStmt) {
244,001✔
410
  int32_t code = TSDB_CODE_SUCCESS;
244,001✔
411

412
  if (IS_SYS_DBNAME(pStmt->streamDbName)) {
244,001✔
413
    return TSDB_CODE_PAR_PERMISSION_DENIED;
×
414
  }
415
  if (IS_SYS_DBNAME(pStmt->targetDbName)) {
244,001✔
416
    return TSDB_CODE_PAR_PERMISSION_DENIED;
40✔
417
  }
418
  if (pStmt->pTrigger) {
243,961✔
419
    SStreamTriggerNode* pTrigger = (SStreamTriggerNode*)pStmt->pTrigger;
243,961✔
420
    STableNode*         pTriggerTable = (STableNode*)pTrigger->pTrigerTable;
243,961✔
421
    if (pTriggerTable) {
243,961✔
422
      if (IS_SYS_DBNAME(pTriggerTable->dbName)) return TSDB_CODE_PAR_PERMISSION_DENIED;
239,711✔
423
      PAR_ERR_RET(
239,671✔
424
          authObjPrivileges(pCxt, pTriggerTable->dbName, pTriggerTable->tableName, PRIV_TBL_SELECT, PRIV_OBJ_TBL));
425
      PAR_ERR_RET(authObjPrivileges(pCxt, pTriggerTable->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB));
238,879✔
426
    }
427
  }
428

429
  PAR_ERR_RET(authObjPrivileges(pCxt, ((SCreateStreamStmt*)pStmt)->streamDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB));
243,129✔
430
  PAR_ERR_RET(
243,129✔
431
      authObjPrivileges(pCxt, ((SCreateStreamStmt*)pStmt)->streamDbName, NULL, PRIV_STREAM_CREATE, PRIV_OBJ_DB));
432
  if (pStmt->targetDbName[0] != '\0') {
242,535✔
433
    PAR_ERR_RET(authObjPrivileges(pCxt, ((SCreateStreamStmt*)pStmt)->targetDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB));
239,496✔
434
    PAR_ERR_RET(authObjPrivileges(pCxt, ((SCreateStreamStmt*)pStmt)->targetDbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB));
239,496✔
435
  }
436
  if (pStmt->pQuery) {
242,337✔
437
    PAR_ERR_RET(authQuery(pCxt, pStmt->pQuery));
239,298✔
438
  }
439
  return code;
241,941✔
440
}
441

442
static int32_t authCreateTopic(SAuthCxt* pCxt, SCreateTopicStmt* pStmt) {
160,035✔
443
  int32_t code = TSDB_CODE_SUCCESS;
160,035✔
444

445
  if (IS_SYS_DBNAME(pStmt->subDbName)) {
160,035✔
UNCOV
446
    return TSDB_CODE_PAR_PERMISSION_DENIED;
×
447
  }
448
  if (NULL != pStmt->pQuery) {
160,035✔
449
    PAR_ERR_RET(authQuery(pCxt, pStmt->pQuery));
126,608✔
450
  }
451
  if (NULL != pStmt->pWhere) {
159,877✔
452
    PAR_ERR_RET(authObjPrivileges(pCxt, ((SCreateTopicStmt*)pStmt)->subDbName, ((SCreateTopicStmt*)pStmt)->subSTbName,
6,099✔
453
                                  PRIV_TBL_SELECT, PRIV_OBJ_TBL));
454
  }
455
  if (((SCreateTopicStmt*)pStmt)->subDbName[0] != '\0') {
159,877✔
456
    PAR_ERR_RET(authObjPrivileges(pCxt, ((SCreateTopicStmt*)pStmt)->subDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB));
33,427✔
457
  }
458

459
  return code;
159,877✔
460
}
461

462
static int32_t authCreateMultiTable(SAuthCxt* pCxt, SCreateMultiTablesStmt* pStmt) {
29,584,734✔
463
  int32_t code = TSDB_CODE_SUCCESS;
29,584,734✔
464
  SNode*  pNode = NULL;
29,584,734✔
465
  FOREACH(pNode, pStmt->pSubTables) {
65,065,237✔
466
    if (pNode->type == QUERY_NODE_CREATE_SUBTABLE_CLAUSE) {
35,474,489✔
467
      SCreateSubTableClause* pClause = (SCreateSubTableClause*)pNode;
35,474,580✔
468
      code = authObjPrivileges(pCxt, pClause->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
35,474,580✔
469
      if (TSDB_CODE_SUCCESS != code) {
35,469,843✔
470
        break;
156✔
471
      }
472
      code = authObjPrivileges(pCxt, pClause->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB);
35,469,687✔
473
      if (TSDB_CODE_SUCCESS != code) {
35,480,108✔
UNCOV
474
        break;
×
475
      }
476
    } else {
477
      SCreateSubTableFromFileClause* pClause = (SCreateSubTableFromFileClause*)pNode;
×
UNCOV
478
      code = authObjPrivileges(pCxt, pClause->useDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
×
UNCOV
479
      if (TSDB_CODE_SUCCESS != code) {
×
480
        break;
×
481
      }
482
      code = authObjPrivileges(pCxt, pClause->useDbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB);
×
483
      if (TSDB_CODE_SUCCESS != code) {
395✔
UNCOV
484
        break;
×
485
      }
486
    }
487
  }
488
  return code;
29,585,399✔
489
}
490

491
static int32_t authDropTable(SAuthCxt* pCxt, SDropTableStmt* pStmt) {
1,966,855✔
492
  int32_t code = TSDB_CODE_SUCCESS;
1,966,855✔
493
  if (pStmt->withOpt && !pCxt->pParseCxt->isSuperUser) {
1,966,855✔
494
    return TSDB_CODE_PAR_PERMISSION_DENIED;
248✔
495
  }
496
  SNode* pNode = NULL;
1,966,607✔
497
  FOREACH(pNode, pStmt->pTables) {
4,041,665✔
498
    SDropTableClause* pClause = (SDropTableClause*)pNode;
2,075,058✔
499
    PAR_ERR_RET(checkAuth(pCxt, pClause->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL));
2,075,058✔
500

501
    if (!pStmt->withOpt) {
2,075,058✔
502
      // for child table, check privileges of its super table later
503
      if (checkAuth(pCxt, pClause->dbName, pClause->tableName, PRIV_CM_DROP, PRIV_OBJ_TBL, NULL)) {
1,940,950✔
UNCOV
504
        code = TSDB_CODE_PAR_PERMISSION_DENIED;
×
UNCOV
505
        break;
×
506
      }
507
    }
508
  }
509

510
  return code;
1,966,607✔
511
}
512

513
static int32_t authDropStable(SAuthCxt* pCxt, SDropSuperTableStmt* pStmt) {
75,872✔
514
  if (pStmt->withOpt && !pCxt->pParseCxt->isSuperUser) {
75,872✔
515
    return TSDB_CODE_PAR_PERMISSION_DENIED;
124✔
516
  }
517
  PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL));
75,748✔
518
  if (!pStmt->withOpt) {
75,748✔
519
    PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_DROP, PRIV_OBJ_TBL, NULL));
26,950✔
520
  }
521
  return 0;
75,748✔
522
}
523

524
static int32_t authDropVtable(SAuthCxt* pCxt, SDropVirtualTableStmt* pStmt) {
68,757✔
525
  if (pStmt->withOpt && !pCxt->pParseCxt->isSuperUser) {
68,757✔
UNCOV
526
    return TSDB_CODE_PAR_PERMISSION_DENIED;
×
527
  }
528
  PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL));
68,757✔
529
  if (!pStmt->withOpt) {
68,757✔
530
    PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_DROP, PRIV_OBJ_TBL, NULL));
68,757✔
531
  }
532
  return 0;
59,013✔
533
}
534

535
static int32_t authAlterTable(SAuthCxt* pCxt, SAlterTableStmt* pStmt) {
17,981,396✔
536
  SNode* pTagCond = NULL;
17,981,396✔
537
  // todo check tag condition for subtable
538
  PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL));
17,981,396✔
539
  return checkAuth(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_ALTER, PRIV_OBJ_TBL, NULL);
17,980,484✔
540
}
541

542
static int32_t authAlterVTable(SAuthCxt* pCxt, SAlterTableStmt* pStmt) {
361,543✔
543
  PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL));
361,543✔
544
  PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_ALTER, PRIV_OBJ_TBL, NULL));
361,543✔
545
  if (pStmt->alterType == TSDB_ALTER_TABLE_ADD_COLUMN_WITH_COLUMN_REF ||
307,951✔
546
      pStmt->alterType == TSDB_ALTER_TABLE_ALTER_COLUMN_REF) {
280,536✔
547
    PAR_ERR_RET(checkAuth(pCxt, pStmt->refDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL));
118,560✔
548
    PAR_ERR_RET(checkAuth(pCxt, pStmt->refDbName, pStmt->refTableName, PRIV_TBL_SELECT, PRIV_OBJ_TBL, NULL));
118,560✔
549
  }
550
  PAR_RET(TSDB_CODE_SUCCESS);
288,463✔
551
}
552

553
static int32_t authCreateView(SAuthCxt* pCxt, SCreateViewStmt* pStmt) {
17,222✔
554
#ifndef TD_ENTERPRISE
555
  return TSDB_CODE_OPS_NOT_SUPPORT;
556
#else
557
  int32_t code = checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL);
17,222✔
558
  if (TSDB_CODE_SUCCESS == code) {
17,222✔
559
    code = checkAuth(pCxt, pStmt->dbName, NULL, PRIV_VIEW_CREATE, PRIV_OBJ_DB, NULL);
17,222✔
560
  }
561
  if (TSDB_CODE_SUCCESS == code) {
17,222✔
562
    code = authQuery(pCxt, pStmt->pQuery);
17,222✔
563
  }
564
  return code;
17,222✔
565
#endif
566
}
567

UNCOV
568
static int32_t authDropView(SAuthCxt* pCxt, SDropViewStmt* pStmt) {
×
569
#ifndef TD_ENTERPRISE
570
  return TSDB_CODE_OPS_NOT_SUPPORT;
571
#else
UNCOV
572
  int32_t code = checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL);
×
UNCOV
573
  if (TSDB_CODE_SUCCESS == code) {
×
UNCOV
574
    code = checkViewAuth(pCxt, pStmt->dbName, pStmt->viewName, PRIV_CM_DROP, PRIV_OBJ_VIEW, NULL);
×
575
  }
576
  if (code == 0) {
×
577
    pStmt->hasPrivilege = true;
×
578
  } else {
579
    code = 0;  // check owner in parTranslater
×
580
  }
UNCOV
581
  return code;
×
582
#endif
583
}
584

585
static int32_t authCreateIndex(SAuthCxt* pCxt, SCreateIndexStmt* pStmt) {
11,195✔
586
  int32_t code = authObjPrivileges(pCxt, ((SCreateIndexStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
11,195✔
587

588
  if (TSDB_CODE_SUCCESS == code) {
11,195✔
589
    code = authObjPrivileges(pCxt, ((SCreateIndexStmt*)pStmt)->dbName, ((SCreateIndexStmt*)pStmt)->tableName,
11,195✔
590
                             PRIV_TBL_SELECT, PRIV_OBJ_TBL);
591
  }
592

593
  if (TSDB_CODE_SUCCESS == code) {
11,195✔
594
    code = authObjPrivileges(pCxt, ((SCreateIndexStmt*)pStmt)->dbName, ((SCreateIndexStmt*)pStmt)->tableName,
11,195✔
595
                             PRIV_IDX_CREATE, PRIV_OBJ_TBL);
596
  }
597

598
  return code;
11,195✔
599
}
600

601
static int32_t authDropIndex(SAuthCxt* pCxt, SDropIndexStmt* pStmt) {
3,126✔
602
  int32_t code = authObjPrivileges(pCxt, ((SDropIndexStmt*)pStmt)->indexDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
3,126✔
603
  if (TSDB_CODE_SUCCESS == code) {
3,126✔
604
    code = authObjPrivileges(pCxt, ((SDropIndexStmt*)pStmt)->indexDbName, ((SDropIndexStmt*)pStmt)->indexName,
3,126✔
605
                             PRIV_CM_DROP, PRIV_OBJ_IDX);
606
  }
607
  return code;
3,126✔
608
}
609

610
static int32_t authShowIndexes(SAuthCxt* pCxt, SShowStmt* pStmt) { return authShowTables(pCxt, pStmt); }
4,080✔
611

612
static int32_t authCreateTsma(SAuthCxt* pCxt, SCreateTSMAStmt* pStmt) {
773✔
613
  int32_t code = authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
773✔
614
  if (TSDB_CODE_SUCCESS == code) {
773✔
615
    code = authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB);
773✔
616
  }
617
  if (!pStmt->pOptions->recursiveTsma) {
773✔
618
    if (TSDB_CODE_SUCCESS == code) {
773✔
619
      code = authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, ((SCreateTSMAStmt*)pStmt)->tableName,
773✔
620
                               PRIV_TBL_SELECT, PRIV_OBJ_TBL);
621
    }
622

623
    if (TSDB_CODE_SUCCESS == code) {
773✔
624
      code = authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, NULL,
773✔
625
                               PRIV_STREAM_CREATE, PRIV_OBJ_DB);
626
    }
627
    if (TSDB_CODE_SUCCESS == code) {
773✔
628
      code = authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, ((SCreateTSMAStmt*)pStmt)->tableName,
773✔
629
                               PRIV_TSMA_CREATE, PRIV_OBJ_TBL);
630
    }
631
  }
632

633
  return code;
773✔
634
}
635

UNCOV
636
static int32_t authDropTsma(SAuthCxt* pCxt, SDropTSMAStmt* pStmt) {
×
UNCOV
637
  int32_t code = authObjPrivileges(pCxt, ((SDropTSMAStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
×
UNCOV
638
  if (TSDB_CODE_SUCCESS == code) {
×
639
    code = authObjPrivileges(pCxt, ((SDropTSMAStmt*)pStmt)->dbName, ((SDropTSMAStmt*)pStmt)->tsmaName, PRIV_CM_DROP,
×
640
                             PRIV_OBJ_TSMA);
641
  }
642
  return code;
×
643
}
644

645
static int32_t authCreateRsma(SAuthCxt* pCxt, SCreateRsmaStmt* pStmt) {
105,641✔
646
  int32_t code = authObjPrivileges(pCxt, ((SCreateRsmaStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
105,641✔
647
  if (TSDB_CODE_SUCCESS == code) {
105,641✔
648
    code = authObjPrivileges(pCxt, ((SCreateRsmaStmt*)pStmt)->dbName, ((SCreateRsmaStmt*)pStmt)->tableName,
105,641✔
649
                             PRIV_TBL_SELECT, PRIV_OBJ_TBL);
650
  }
651
  if (TSDB_CODE_SUCCESS == code) {
105,641✔
652
    code = authObjPrivileges(pCxt, ((SCreateRsmaStmt*)pStmt)->dbName, ((SCreateRsmaStmt*)pStmt)->tableName,
105,641✔
653
                             PRIV_TBL_INSERT, PRIV_OBJ_TBL);
654
  }
655
  if (TSDB_CODE_SUCCESS == code) {
105,641✔
656
    code = authObjPrivileges(pCxt, ((SCreateRsmaStmt*)pStmt)->dbName, ((SCreateRsmaStmt*)pStmt)->tableName,
105,641✔
657
                             PRIV_RSMA_CREATE, PRIV_OBJ_TBL);
658
  }
659
  return code;
105,641✔
660
}
661

662
static int32_t authDropRsma(SAuthCxt* pCxt, SDropRsmaStmt* pStmt) {
2,127✔
663
  int32_t code = authObjPrivileges(pCxt, ((SDropRsmaStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
2,127✔
664
  if (TSDB_CODE_SUCCESS == code) {
2,127✔
665
    code = authObjPrivileges(pCxt, ((SDropRsmaStmt*)pStmt)->dbName, ((SDropRsmaStmt*)pStmt)->rsmaName, PRIV_CM_DROP,
2,127✔
666
                             PRIV_OBJ_RSMA);
667
  }
668
  return code;
2,127✔
669
}
670

671
static int32_t authShowCreateRsma(SAuthCxt* pCxt, SShowCreateRsmaStmt* pStmt) {
2,127✔
672
  int32_t code = authObjPrivileges(pCxt, ((SShowCreateRsmaStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
2,127✔
673
  if (TSDB_CODE_SUCCESS == code) {
2,127✔
674
    code = authObjPrivileges(pCxt, ((SShowCreateRsmaStmt*)pStmt)->dbName, ((SShowCreateRsmaStmt*)pStmt)->rsmaName,
2,127✔
675
                             PRIV_CM_SHOW_CREATE, PRIV_OBJ_RSMA);
676
  }
677
  if (code == 0) pStmt->hasPrivilege = true;
2,127✔
678
  return 0;  // return 0 and check owner later in translateShowCreateRsma since rsma ctgCatalog not available yet
2,127✔
679
}
680

681
static int32_t authGrant(SAuthCxt* pCxt, SGrantStmt* pStmt) {
556,340✔
682
  if (pStmt->optrType == TSDB_ALTER_ROLE_ROLE) {
556,340✔
683
    if (IS_SYS_PREFIX(pStmt->roleName)) {
2,163✔
684
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSDBA) == 0) {
2,010✔
685
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_GRANT_SYSDBA);
153✔
686
      }
687
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSSEC) == 0) {
1,857✔
688
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_GRANT_SYSSEC);
153✔
689
      }
690
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSAUDIT) == 0) {
1,704✔
691
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_GRANT_SYSAUDIT);
153✔
692
      }
693
    }
694
  }
695
  return authSysPrivileges(pCxt, (void*)pStmt, PRIV_GRANT_PRIVILEGE);
555,881✔
696
}
697

698
static int32_t authRevoke(SAuthCxt* pCxt, SRevokeStmt* pStmt) {
401,861✔
699
  if (pStmt->optrType == TSDB_ALTER_ROLE_ROLE) {
401,861✔
700
    if (IS_SYS_PREFIX(pStmt->roleName)) {
1,245✔
701
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSDBA) == 0) {
1,245✔
UNCOV
702
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_REVOKE_SYSDBA);
×
703
      }
704
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSSEC) == 0) {
1,245✔
705
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_REVOKE_SYSSEC);
×
706
      }
707
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSAUDIT) == 0) {
1,245✔
708
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_REVOKE_SYSAUDIT);
×
709
      }
710
    }
711
  }
712
  return authSysPrivileges(pCxt, (void*)pStmt, PRIV_REVOKE_PRIVILEGE);
401,861✔
713
}
714

715
static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) {
293,588,547✔
716
  int32_t code = TSDB_CODE_SUCCESS;
293,588,547✔
717
#ifdef TD_ENTERPRISE
718
  switch (nodeType(pStmt)) {
293,588,547✔
719
    case QUERY_NODE_SET_OPERATOR:
9,824,321✔
720
      return authSetOperator(pCxt, (SSetOperator*)pStmt);
9,824,321✔
721
    case QUERY_NODE_SELECT_STMT:
185,712,458✔
722
      return authSelect(pCxt, (SSelectStmt*)pStmt);
185,712,458✔
723
    case QUERY_NODE_CREATE_ROLE_STMT:
153✔
724
      return authSysPrivileges(pCxt, pStmt, PRIV_ROLE_CREATE);
153✔
UNCOV
725
    case QUERY_NODE_DROP_ROLE_STMT:
×
UNCOV
726
      return authSysPrivileges(pCxt, pStmt, PRIV_ROLE_DROP);
×
727
    case QUERY_NODE_CREATE_USER_STMT:
47,639✔
728
      return authSysPrivileges(pCxt, pStmt, PRIV_USER_CREATE);
47,639✔
729
    case QUERY_NODE_DROP_USER_STMT:
20,661✔
730
      return authDropUser(pCxt, (SDropUserStmt*)pStmt);
20,661✔
731
    case QUERY_NODE_DELETE_STMT:
1,662,578✔
732
      return authDelete(pCxt, (SDeleteStmt*)pStmt);
1,662,578✔
733
    case QUERY_NODE_INSERT_STMT:
68,374✔
734
      return authInsert(pCxt, (SInsertStmt*)pStmt);
68,374✔
735
    case QUERY_NODE_CREATE_TABLE_STMT:
19,641,002✔
736
      return authCreateTable(pCxt, (SCreateTableStmt*)pStmt);
19,641,002✔
737
    case QUERY_NODE_CREATE_VIRTUAL_TABLE_STMT:
120,573✔
738
      return authCreateVTable(pCxt, (SCreateVTableStmt*)pStmt);
120,573✔
739
    case QUERY_NODE_CREATE_VIRTUAL_SUBTABLE_STMT:
189,745✔
740
      return authCreateVSubTable(pCxt, (SCreateVSubTableStmt*)pStmt);
189,745✔
741
    case QUERY_NODE_CREATE_MULTI_TABLES_STMT:
29,584,900✔
742
      return authCreateMultiTable(pCxt, (SCreateMultiTablesStmt*)pStmt);
29,584,900✔
743
    case QUERY_NODE_CREATE_STREAM_STMT:
244,001✔
744
      return authCreateStream(pCxt, (SCreateStreamStmt*)pStmt);
244,001✔
745
    case QUERY_NODE_CREATE_TOPIC_STMT:
160,035✔
746
      return authCreateTopic(pCxt, (SCreateTopicStmt*)pStmt);
160,035✔
747
    case QUERY_NODE_DROP_TABLE_STMT:
1,966,855✔
748
      return authDropTable(pCxt, (SDropTableStmt*)pStmt);
1,966,855✔
749
    case QUERY_NODE_DROP_SUPER_TABLE_STMT:
75,872✔
750
      return authDropStable(pCxt, (SDropSuperTableStmt*)pStmt);
75,872✔
751
    case QUERY_NODE_DROP_VIRTUAL_TABLE_STMT:
68,757✔
752
      return authDropVtable(pCxt, (SDropVirtualTableStmt*)pStmt);
68,757✔
753
    case QUERY_NODE_ALTER_TABLE_STMT:
17,981,396✔
754
    case QUERY_NODE_ALTER_SUPER_TABLE_STMT:
755
      return authAlterTable(pCxt, (SAlterTableStmt*)pStmt);
17,981,396✔
756
    case QUERY_NODE_ALTER_VIRTUAL_TABLE_STMT:
361,543✔
757
      return authAlterVTable(pCxt, (SAlterTableStmt*)pStmt);
361,543✔
758
    case QUERY_NODE_SHOW_MODULES_STMT:
99,935✔
759
    case QUERY_NODE_SHOW_BACKUP_NODES_STMT:
760
    case QUERY_NODE_SHOW_CLUSTER_STMT:
761
    case QUERY_NODE_SHOW_DB_ALIVE_STMT:
762
    // case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT:
763
    case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
764
    case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT:  // TODO: check in mnode
765
    case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
766
    case QUERY_NODE_SHOW_SCORES_STMT:
767
    case QUERY_NODE_SHOW_ARBGROUPS_STMT:
768
    case QUERY_NODE_SHOW_ENCRYPTIONS_STMT:
769
    case QUERY_NODE_SHOW_MOUNTS_STMT:
770
    case QUERY_NODE_SHOW_ENCRYPT_ALGORITHMS_STMT:
771
    case QUERY_NODE_SHOW_ENCRYPT_STATUS_STMT:
772
      return !pCxt->pParseCxt->enableSysInfo ? TSDB_CODE_PAR_PERMISSION_DENIED : TSDB_CODE_SUCCESS;
99,935✔
773
    case QUERY_NODE_SHOW_USERS_STMT:
3,666✔
774
    case QUERY_NODE_SHOW_USERS_FULL_STMT:
775
      return authSysPrivileges(pCxt, pStmt, PRIV_USER_SHOW);
3,666✔
776
    case QUERY_NODE_SHOW_ROLES_STMT:
153✔
777
      return authSysPrivileges(pCxt, pStmt, PRIV_ROLE_SHOW);
153✔
778
    case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT:
3,554✔
779
    case QUERY_NODE_SHOW_ROLE_PRIVILEGES_STMT:
780
    case QUERY_NODE_SHOW_ROLE_COL_PRIVILEGES_STMT:
781
      return authSysPrivileges(pCxt, pStmt, PRIV_SHOW_PRIVILEGES);
3,554✔
782
    case QUERY_NODE_SHOW_DNODES_STMT:
404,203✔
783
    case QUERY_NODE_SHOW_MNODES_STMT:
784
    case QUERY_NODE_SHOW_QNODES_STMT:
785
    case QUERY_NODE_SHOW_SNODES_STMT:
786
    case QUERY_NODE_SHOW_BNODES_STMT:
787
    case QUERY_NODE_SHOW_ANODES_STMT:
788
    case QUERY_NODE_SHOW_ANODES_FULL_STMT:
789
    case QUERY_NODE_SHOW_XNODES_STMT: // TODO: check auth for xnode resources
790
    case QUERY_NODE_SHOW_XNODE_TASKS_STMT:
791
    case QUERY_NODE_SHOW_XNODE_AGENTS_STMT:
792
    case QUERY_NODE_SHOW_XNODE_JOBS_STMT:
793
      return authSysPrivileges(pCxt, pStmt, PRIV_NODES_SHOW);
404,203✔
794
    case QUERY_NODE_SHOW_CLUSTER_MACHINES_STMT:
5,403✔
795
    case QUERY_NODE_SHOW_LICENCES_STMT:
796
    case QUERY_NODE_SHOW_GRANTS_FULL_STMT:
797
    case QUERY_NODE_SHOW_GRANTS_LOGS_STMT:
798
      return authSysPrivileges(pCxt, pStmt, PRIV_GRANTS_SHOW);
5,403✔
799
    case QUERY_NODE_SHOW_TABLES_STMT:
443,284✔
800
    case QUERY_NODE_SHOW_STABLES_STMT:
801
      return authShowTables(pCxt, (SShowStmt*)pStmt);
443,284✔
802
    case QUERY_NODE_SHOW_VTABLES_STMT:
56,388✔
803
      return authShowVtables(pCxt, (SShowStmt*)pStmt);
56,388✔
804
    case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
73,796✔
805
    case QUERY_NODE_SHOW_CREATE_VTABLE_STMT:
806
    case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
807
      return authShowCreateTable(pCxt, (SShowCreateTableStmt*)pStmt);
73,796✔
UNCOV
808
    case QUERY_NODE_SHOW_CREATE_VIEW_STMT:
×
UNCOV
809
      return authShowCreateView(pCxt, (SShowCreateViewStmt*)pStmt);
×
810
    case QUERY_NODE_CREATE_VIEW_STMT:
17,222✔
811
      return authCreateView(pCxt, (SCreateViewStmt*)pStmt);
17,222✔
812
    case QUERY_NODE_DROP_VIEW_STMT:
×
UNCOV
813
      return authDropView(pCxt, (SDropViewStmt*)pStmt);
×
814
    case QUERY_NODE_CREATE_INDEX_STMT:
11,195✔
815
      return authCreateIndex(pCxt, (SCreateIndexStmt*)pStmt);
11,195✔
816
    case QUERY_NODE_DROP_INDEX_STMT:
3,126✔
817
      return authDropIndex(pCxt, (SDropIndexStmt*)pStmt);
3,126✔
818
    case QUERY_NODE_SHOW_INDEXES_STMT:
4,080✔
819
      return authShowIndexes(pCxt, (SShowStmt*)pStmt);
4,080✔
820
    case QUERY_NODE_CREATE_TSMA_STMT:
773✔
821
      return authCreateTsma(pCxt, (SCreateTSMAStmt*)pStmt);
773✔
UNCOV
822
    case QUERY_NODE_DROP_TSMA_STMT:
×
UNCOV
823
      return authDropTsma(pCxt, (SDropTSMAStmt*)pStmt);
×
824
    case QUERY_NODE_CREATE_RSMA_STMT:
105,641✔
825
      return authCreateRsma(pCxt, (SCreateRsmaStmt*)pStmt);
105,641✔
826
    case QUERY_NODE_DROP_RSMA_STMT:
2,127✔
827
      return authDropRsma(pCxt, (SDropRsmaStmt*)pStmt);
2,127✔
828
    case QUERY_NODE_ALTER_RSMA_STMT:
19,143✔
829
      return authObjPrivileges(pCxt, ((SAlterRsmaStmt*)pStmt)->dbName, ((SAlterRsmaStmt*)pStmt)->rsmaName,
19,143✔
830
                               PRIV_CM_ALTER, PRIV_OBJ_RSMA);
831
    case QUERY_NODE_SHOW_CREATE_RSMA_STMT:
2,127✔
832
      return authShowCreateRsma(pCxt, (SShowCreateRsmaStmt*)pStmt);
2,127✔
833
    case QUERY_NODE_CREATE_DATABASE_STMT:
1,254,358✔
834
      return authSysPrivileges(pCxt, pStmt, PRIV_DB_CREATE);
1,254,358✔
835
    case QUERY_NODE_BALANCE_VGROUP_STMT:
11,135✔
836
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_BALANCE);
11,135✔
837
    case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT:
2,101✔
838
    case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
839
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_BALANCE_LEADER);
2,101✔
UNCOV
840
    case QUERY_NODE_MERGE_VGROUP_STMT:
×
UNCOV
841
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_MERGE);
×
842
    case QUERY_NODE_SPLIT_VGROUP_STMT:
16,306✔
843
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_SPLIT);
16,306✔
844
    case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
43,321✔
845
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_REDISTRIBUTE);
43,321✔
846
    case QUERY_NODE_CREATE_FUNCTION_STMT:
46,154✔
847
      return authSysPrivileges(pCxt, pStmt, PRIV_FUNC_CREATE);
46,154✔
848
    case QUERY_NODE_DROP_FUNCTION_STMT:
35,882✔
849
      return authSysPrivileges(pCxt, pStmt, PRIV_FUNC_DROP);
35,882✔
850
    case QUERY_NODE_SHOW_FUNCTIONS_STMT:
36,599✔
851
      return authSysPrivileges(pCxt, pStmt, PRIV_FUNC_SHOW);
36,599✔
852
    case QUERY_NODE_GRANT_STMT:
556,340✔
853
      return authGrant(pCxt, (SGrantStmt*)pStmt);
556,340✔
854
    case QUERY_NODE_REVOKE_STMT:
401,861✔
855
      return authRevoke(pCxt, (SRevokeStmt*)pStmt);
401,861✔
856
    case QUERY_NODE_CREATE_DNODE_STMT:
252,239✔
857
    case QUERY_NODE_CREATE_MNODE_STMT:
858
    case QUERY_NODE_CREATE_QNODE_STMT:
859
    case QUERY_NODE_CREATE_SNODE_STMT:
860
    case QUERY_NODE_CREATE_BNODE_STMT:
861
    case QUERY_NODE_CREATE_ANODE_STMT:
862
      return authSysPrivileges(pCxt, pStmt, PRIV_NODE_CREATE);
252,239✔
863
    case QUERY_NODE_DROP_DNODE_STMT:
85,573✔
864
    case QUERY_NODE_DROP_MNODE_STMT:
865
    case QUERY_NODE_DROP_QNODE_STMT:
866
    case QUERY_NODE_DROP_SNODE_STMT:
867
    case QUERY_NODE_DROP_BNODE_STMT:
868
    case QUERY_NODE_DROP_ANODE_STMT:
869
      return authSysPrivileges(pCxt, pStmt, PRIV_NODE_DROP);
85,573✔
870
    case QUERY_NODE_ALTER_DATABASE_STMT:
173,997✔
871
      return authObjPrivileges(pCxt, ((SAlterDatabaseStmt*)pStmt)->dbName, NULL, PRIV_CM_ALTER, PRIV_OBJ_DB);
173,997✔
872
    case QUERY_NODE_DROP_DATABASE_STMT:
1,036,203✔
873
      return authObjPrivileges(pCxt, ((SDropDatabaseStmt*)pStmt)->dbName, NULL, PRIV_CM_DROP, PRIV_OBJ_DB);
1,036,203✔
874
    case QUERY_NODE_USE_DATABASE_STMT:
1,940,512✔
875
      return authObjPrivileges(pCxt, ((SAlterDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
1,940,512✔
876
    case QUERY_NODE_FLUSH_DATABASE_STMT:
1,720,626✔
877
      return authObjPrivileges(pCxt, ((SFlushDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_FLUSH, PRIV_OBJ_DB);
1,720,626✔
878
    case QUERY_NODE_COMPACT_DATABASE_STMT:
25,877✔
879
      return authObjPrivileges(pCxt, ((SCompactDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_COMPACT, PRIV_OBJ_DB);
25,877✔
880
    case QUERY_NODE_TRIM_DATABASE_STMT:
7,802✔
881
      return authObjPrivileges(pCxt, ((STrimDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_TRIM, PRIV_OBJ_DB);
7,802✔
882
    case QUERY_NODE_ROLLUP_DATABASE_STMT:
9,217✔
883
      return authObjPrivileges(pCxt, ((SRollupDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_ROLLUP, PRIV_OBJ_DB);
9,217✔
884
    case QUERY_NODE_SCAN_DATABASE_STMT:
86✔
885
      return authObjPrivileges(pCxt, ((SScanDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_SCAN, PRIV_OBJ_DB);
86✔
UNCOV
886
    case QUERY_NODE_SSMIGRATE_DATABASE_STMT:
×
UNCOV
887
      return authObjPrivileges(pCxt, ((SSsMigrateDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_SSMIGRATE, PRIV_OBJ_DB);
×
888
    case QUERY_NODE_SHOW_USAGE_STMT:  // disk info
6✔
889
      return authShowUsage(pCxt, (SShowStmt*)pStmt);
6✔
890
      // check in mnode
891
    case QUERY_NODE_SHOW_VGROUPS_STMT:
631,468✔
892
    case QUERY_NODE_SHOW_VNODES_STMT:
893
    case QUERY_NODE_SHOW_COMPACTS_STMT:
894
    case QUERY_NODE_SHOW_RETENTIONS_STMT:
895
    case QUERY_NODE_SHOW_SCANS_STMT:
896
    case QUERY_NODE_SHOW_SSMIGRATES_STMT:
897
      return TSDB_CODE_SUCCESS;
631,468✔
898
    default:
16,319,725✔
899
      break;
16,319,725✔
900
  }
901
#endif
902
  return code;
16,319,725✔
903
}
904

905
int32_t authenticate(SParseContext* pParseCxt, SQuery* pQuery, SParseMetaCache* pMetaCache) {
252,698,752✔
906
  SAuthCxt cxt = {.pParseCxt = pParseCxt, .pMetaCache = pMetaCache, .errCode = TSDB_CODE_SUCCESS};
252,698,752✔
907
  return authQuery(&cxt, pQuery->pRoot);
252,700,071✔
908
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc