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

taosdata / TDengine / #4969

27 Feb 2026 07:19AM UTC coverage: 67.69% (+0.8%) from 66.902%
#4969

push

travis-ci

web-flow
merge: from main to 3.0 #34603

15 of 58 new or added lines in 2 files covered. (25.86%)

5075 existing lines in 154 files now uncovered.

208337 of 307781 relevant lines covered (67.69%)

129686642.38 hits per line

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

87.02
/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
#include "tconfig.h"
20

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

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

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

36
extern SConfig* tsCfg;
37

38
static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt);
39

40
static int32_t setUserAuthInfo(SParseContext* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
1,971,825✔
41
                               EPrivObjType objType, bool isView, bool effective, SUserAuthInfo* pAuth) {
42
  if (effective) {
1,971,825✔
43
    snprintf(pAuth->user, sizeof(pAuth->user), "%s", pCxt->pEffectiveUser ? pCxt->pEffectiveUser : "");
15,064✔
44
    pAuth->userId = pCxt->effectiveUserId;  // TODO: assign the effective user id
15,064✔
45
  } else {
46
    snprintf(pAuth->user, sizeof(pAuth->user), "%s", pCxt->pUser);
1,956,761✔
47
    pAuth->userId = pCxt->userId;
1,956,761✔
48
  }
49

50
  if (NULL == pTabName) {
1,971,825✔
51
    if (pDbName) {
1,201,822✔
52
      int32_t code = tNameSetDbName(&pAuth->tbName, pCxt->acctId, pDbName, strlen(pDbName));
1,057,688✔
53
      if (TSDB_CODE_SUCCESS != code) return code;
1,057,688✔
54
    } else {
55
      pAuth->tbName.acctId = pCxt->acctId;
144,134✔
56
      pAuth->tbName.type = TSDB_SYS_NAME_T;
144,134✔
57
    }
58
  } else {
59
    toName(pCxt->acctId, pDbName, pTabName, &pAuth->tbName);
770,003✔
60
  }
61
  pAuth->privType = privType;
1,971,825✔
62
  pAuth->objType = objType;
1,971,825✔
63
  pAuth->isView = isView;
1,971,825✔
64
  return TSDB_CODE_SUCCESS;
1,971,825✔
65
}
66

67
static int32_t checkAuthByOwner(SAuthCxt* pCxt, SUserAuthInfo* pAuthInfo, SUserAuthRes* pAuthRes, bool *recheck) {
1,938,637✔
68
  SParseContext*   pParseCxt = pCxt->pParseCxt;
1,938,637✔
69
  const SPrivInfo* pPrivInfo = privInfoGet(pAuthInfo->privType);
1,938,637✔
70
  if (NULL == pPrivInfo) {
1,938,637✔
71
    return TSDB_CODE_PAR_INTERNAL_ERROR;
×
72
  }
73
  int32_t code = 0;
1,938,637✔
74
  if (pPrivInfo->category == PRIV_CATEGORY_OBJECT || pAuthInfo->objType == PRIV_OBJ_DB) {
1,938,637✔
75
    SPrivInfo privInfoDup = *pPrivInfo;
1,381,654✔
76
    if (privInfoDup.objType <= 0) privInfoDup.objType = PRIV_OBJ_DB;
1,381,654✔
77
    switch (privInfoDup.objType) {
1,381,654✔
78
      case PRIV_OBJ_DB: {
1,057,688✔
79
        SDbCfgInfo dbCfgInfo = {0};
1,057,688✔
80
        char       dbFName[TSDB_DB_FNAME_LEN] = {0};
1,057,688✔
81
        (void)tNameGetFullDbName(&pAuthInfo->tbName, dbFName);
1,057,688✔
82
        code = getDbCfgFromCache(pCxt->pMetaCache, dbFName, &dbCfgInfo);
1,057,688✔
83
        if (TSDB_CODE_SUCCESS != code) {
1,057,688✔
84
          return code;
63,046✔
85
        }
86
        // rewrite privilege for audit db
87
        if (dbCfgInfo.isAudit && pAuthInfo->objType == PRIV_OBJ_DB) {
994,642✔
88
          if (pAuthInfo->privType == PRIV_DB_USE) {
×
89
            pAuthInfo->useDb = AUTH_OWNED_MASK;
×
90
            if (recheck) *recheck = true;  // recheck since the cached key is changed
×
91
          } else if (pAuthInfo->privType == PRIV_CM_ALTER) {
×
92
            pAuthInfo->privType = PRIV_AUDIT_DB_ALTER;
×
93
            pAuthInfo->objType = PRIV_OBJ_CLUSTER;
×
94
            if (recheck) *recheck = true;  // recheck since the cached key is changed
×
95
          } else if (pAuthInfo->privType == PRIV_CM_DROP) {
×
96
            pAuthInfo->privType = PRIV_AUDIT_DB_DROP;
×
97
            pAuthInfo->objType = PRIV_OBJ_CLUSTER;
×
98
            if (recheck) *recheck = true;  // recheck since the cached key is changed
×
99
          } else if (pAuthInfo->privType == PRIV_TBL_CREATE) {
×
100
            pAuthInfo->privType = PRIV_AUDIT_TBL_CREATE;
×
101
            pAuthInfo->objType = PRIV_OBJ_CLUSTER;
×
102
            if (recheck) *recheck = true;  // recheck since the cached key is changed
×
103
          }
104
          return TSDB_CODE_SUCCESS;
×
105
        }
106
        if (dbCfgInfo.ownerId == pAuthInfo->userId) {
994,642✔
107
          pAuthRes->pass[pAuthInfo->isView ? AUTH_RES_VIEW : AUTH_RES_BASIC] = true;
24,662✔
108
          return TSDB_CODE_SUCCESS;
24,662✔
109
        }
110
        break;
969,980✔
111
      }
112
      default:
323,966✔
113
        return TSDB_CODE_SUCCESS;
323,966✔
114
    }
115
  }
116
_exit:
556,983✔
117
  return TSDB_CODE_SUCCESS;
1,526,963✔
118
}
119

120
static int32_t checkAuthImpl(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
549,808,656✔
121
                             EPrivObjType objType, SNode** pCond, SArray** pPrivCols, bool isView, bool effective) {
122
  SParseContext* pParseCxt = pCxt->pParseCxt;
549,808,656✔
123
  if (pParseCxt->isSuperUser) {
549,811,637✔
124
    return TSDB_CODE_SUCCESS;
547,853,285✔
125
  }
126

127
  AUTH_RES_TYPE auth_res_type = isView ? AUTH_RES_VIEW : AUTH_RES_BASIC;
1,971,825✔
128
  SUserAuthInfo authInfo = {0};
1,971,825✔
129
  int32_t code = setUserAuthInfo(pCxt->pParseCxt, pDbName, pTabName, privType, objType, isView, effective, &authInfo);
1,971,825✔
130
  if (TSDB_CODE_SUCCESS != code) return code;
1,971,825✔
131
  SUserAuthRes authRes = {0};
1,971,825✔
132
  bool         recheck = false;
1,971,825✔
133
  if (NULL != pCxt->pMetaCache && privType != PRIV_VIEW_SELECT && privType != PRIV_AUDIT_TBL_SELECT) {
1,971,825✔
134
    code = checkAuthByOwner(pCxt, &authInfo, &authRes, &recheck);
1,938,637✔
135
    if (code == TSDB_CODE_SUCCESS && authRes.pass[auth_res_type]) {
1,938,637✔
136
      goto _exit;
24,662✔
137
    }
138
    code = getUserAuthFromCache(pCxt->pMetaCache, &authInfo, &authRes);
1,913,975✔
139
#ifdef TD_ENTERPRISE
140
    if (isView && TSDB_CODE_PAR_INTERNAL_ERROR == code) {
1,913,975✔
141
      authInfo.isView = false;
×
142
      code = getUserAuthFromCache(pCxt->pMetaCache, &authInfo, &authRes);
×
143
    }
144
#endif
145
  } else {
146
    recheck = true;  // recheck since the cached key is changed
33,188✔
147
  }
148
  if (recheck) {  // the priv type of view and audit may be rewritten, need to recheck from catalog
1,947,163✔
149
    SRequestConnInfo conn = {.pTrans = pParseCxt->pTransporter,
66,376✔
150
                             .requestId = pParseCxt->requestId,
33,188✔
151
                             .requestObjRefId = pParseCxt->requestRid,
33,188✔
152
                             .mgmtEps = pParseCxt->mgmtEpSet};
153
    code = catalogChkAuth(pParseCxt->pCatalog, &conn, &authInfo, &authRes);
33,188✔
154
  }
155

156
_exit:
1,971,825✔
157
  if (TSDB_CODE_SUCCESS == code) {
1,971,825✔
158
    if (pCond) *pCond = authRes.pCond[auth_res_type];
1,971,825✔
159
    if (pPrivCols) *pPrivCols = authRes.pCols;
1,971,825✔
160
    if (taosArrayGetSize(authRes.pCols) > 0) {
1,971,825✔
161
      pCxt->pParseCxt->hasPrivCols = 1; // used later in translateCheckPrivCols for select *
×
162
    }
163
  }
164
  return TSDB_CODE_SUCCESS == code ? (authRes.pass[auth_res_type] ? TSDB_CODE_SUCCESS : TSDB_CODE_PAR_PERMISSION_DENIED)
1,971,825✔
165
                                   : code;
3,943,650✔
166
}
167

168
static int32_t checkAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
549,593,510✔
169
                         EPrivObjType objType, SNode** pCond, SArray** pPrivCols) {
170
#ifdef TD_ENTERPRISE
171
  return checkAuthImpl(pCxt, pDbName, pTabName, privType, objType, pCond, pPrivCols, false, false);
549,593,510✔
172
#else
173
  return TSDB_CODE_SUCCESS;
174
#endif
175
}
176

177
static int32_t authSysPrivileges(SAuthCxt* pCxt, SNode* pStmt, EPrivType type) {
4,672,148✔
178
  return checkAuth(pCxt, NULL, NULL, type, 0, NULL, NULL);
4,672,148✔
179
}
180

181
static int32_t authObjPrivileges(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
491,338,332✔
182
                                 EPrivObjType objType) {
183
  if (!pDbName) {
491,338,332✔
184
    return TSDB_CODE_PAR_INTERNAL_ERROR;
×
185
  }
186

187
  return checkAuth(pCxt, pDbName, pTabName, privType, objType, NULL, NULL);
491,338,332✔
188
}
189

190
static int32_t checkEffectiveAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
12,856✔
191
                                  EPrivObjType objType, SNode** pCond) {
192
  return checkAuthImpl(pCxt, pDbName, pTabName, privType, objType, NULL, NULL, false, true);
12,856✔
193
}
194

195
static int32_t checkViewAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
215,857✔
196
                             EPrivObjType objType, SNode** pCond) {
197
  return checkAuthImpl(pCxt, pDbName, pTabName, privType, objType, pCond, NULL, true, false);
215,857✔
198
}
199

200
static int32_t checkViewEffectiveAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, EPrivType privType,
2,208✔
201
                                      EPrivObjType objType, SNode** pCond) {
202
  return checkAuthImpl(pCxt, pDbName, pTabName, privType, objType, pCond, NULL, true, true);
2,208✔
203
}
204

205
static EDealRes authSubquery(SAuthCxt* pCxt, SNode* pStmt) {
22,552,969✔
206
  return TSDB_CODE_SUCCESS == authQuery(pCxt, pStmt) ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
22,552,969✔
207
}
208

209
static int32_t mergeStableTagCond(SNode** pWhere, SNode* pTagCond) {
149✔
210
  SLogicConditionNode* pLogicCond = NULL;
149✔
211
  int32_t              code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogicCond);
149✔
212
  if (NULL == pLogicCond) {
149✔
213
    return code;
×
214
  }
215
  pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL;
149✔
216
  pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes;
149✔
217
  pLogicCond->condType = LOGIC_COND_TYPE_AND;
149✔
218
  code = nodesListMakeStrictAppend(&pLogicCond->pParameterList, pTagCond);
149✔
219
  if (TSDB_CODE_SUCCESS == code) {
149✔
220
    code = nodesListMakeAppend(&pLogicCond->pParameterList, *pWhere);
149✔
221
  }
222
  if (TSDB_CODE_SUCCESS == code) {
149✔
223
    *pWhere = (SNode*)pLogicCond;
149✔
224
  } else {
225
    nodesDestroyNode((SNode*)pLogicCond);
×
226
  }
227
  return code;
149✔
228
}
229

230
EDealRes rewriteAuthTable(SNode* pNode, void* pContext) {
19,119✔
231
  if (QUERY_NODE_COLUMN == nodeType(pNode)) {
19,119✔
232
    SColumnNode*     pCol = (SColumnNode*)pNode;
6,224✔
233
    SAuthRewriteCxt* pCxt = (SAuthRewriteCxt*)pContext;
6,224✔
234
    tstrncpy(pCol->tableName, pCxt->pTarget->tableName, TSDB_TABLE_NAME_LEN);
6,224✔
235
    tstrncpy(pCol->tableAlias, pCxt->pTarget->tableAlias, TSDB_TABLE_NAME_LEN);
6,224✔
236
  }
237

238
  return DEAL_RES_CONTINUE;
19,119✔
239
}
240

241
static int32_t rewriteAppendStableTagCond(SNode** pWhere, SNode* pTagCond, STableNode* pTable) {
5,777✔
242
  SNode*  pTagCondCopy = NULL;
5,777✔
243
  int32_t code = nodesCloneNode(pTagCond, &pTagCondCopy);
5,777✔
244
  if (NULL == pTagCondCopy) {
5,777✔
245
    return code;
×
246
  }
247

248
  SAuthRewriteCxt cxt = {.pTarget = pTable};
5,777✔
249
  nodesWalkExpr(pTagCondCopy, rewriteAuthTable, &cxt);
5,777✔
250

251
  if (NULL == *pWhere) {
5,777✔
252
    *pWhere = pTagCondCopy;
5,628✔
253
    return TSDB_CODE_SUCCESS;
5,628✔
254
  }
255

256
  if (QUERY_NODE_LOGIC_CONDITION == nodeType(*pWhere) &&
149✔
257
      LOGIC_COND_TYPE_AND == ((SLogicConditionNode*)*pWhere)->condType) {
×
258
    return nodesListStrictAppend(((SLogicConditionNode*)*pWhere)->pParameterList, pTagCondCopy);
×
259
  }
260

261
  return mergeStableTagCond(pWhere, pTagCondCopy);
149✔
262
}
263
#if 0  
264
/**
265
 * @brief Fast fail path if no star(*) specified in select clause
266
 */
267
static int32_t authSelectTblCols(SSelectStmt* pSelect, STableNode* pTable, SArray* pPrivCols) {
268
  int32_t    code = 0;
269
  SNodeList* pRetrievedCols = NULL;
270
  int32_t    nCols = taosArrayGetSize(pPrivCols);
271

272
  if (nCols <= 0) {
273
    goto _return;
274
  }
275

276
  PAR_ERR_JRET(nodesCollectColumns(pSelect, SQL_CLAUSE_FROM, NULL, COLLECT_COL_TYPE_ALL, &pRetrievedCols));
277

278
  int32_t i = 0, j = 0, k = 0;
279
  SNode*  pNode = NULL;
280
  FOREACH(pNode, pRetrievedCols) {
281
    SColumnNode* pColNode = (SColumnNode*)pNode;
282

283
    j = i;
284

285
    // search in the remaining columns first for better performance if ordered
286
    bool found = false;
287
    for (; i < nCols; ++i) {
288
      SColNameFlag* pColNameFlag = (SColNameFlag*)TARRAY_GET_ELEM(pPrivCols, i);
289
      if (strcmp(pColNode->colName, pColNameFlag->colName) == 0) {
290
        found = true;
291
        ++i;
292
        break;
293
      }
294
    }
295
    if (!found) {
296
      for (k = 0; k < j; ++k) {
297
        SColNameFlag* pColNameFlag = (SColNameFlag*)TARRAY_GET_ELEM(pPrivCols, k);
298
        if (strcmp(pColNode->colName, pColNameFlag->colName) == 0) {
299
          found = true;
300
          break;
301
        }
302
      }
303
    }
304
    if (!found) {
305
      code = TSDB_CODE_PAR_COL_PERMISSION_DENIED;
306
      goto _return;
307
    }
308
  }
309
_return:
310
  nodesDestroyList(pRetrievedCols);
311
  return code;
312
}
313
#endif
314

315
static EDealRes authSelectImpl(SNode* pNode, void* pContext) {
1,618,987,956✔
316
  SSelectAuthCxt* pCxt = pContext;
1,618,987,956✔
317
  SAuthCxt*       pAuthCxt = pCxt->pAuthCxt;
1,618,987,956✔
318
  bool            isView = false;
1,618,989,181✔
319
  bool            isAudit = false;
1,618,989,181✔
320
  if (QUERY_NODE_REAL_TABLE == nodeType(pNode)) {
1,618,989,181✔
321
    SNode*      pTagCond = NULL;
140,813,707✔
322
    // SArray*     pPrivCols = NULL;
323
    STableNode* pTable = (STableNode*)pNode;
140,812,694✔
324
    if ((pAuthCxt->pParseCxt->enableSysInfo == 0) && IS_INFORMATION_SCHEMA_DB(pTable->dbName) &&
140,812,694✔
325
        (strcmp(pTable->tableName, TSDB_INS_TABLE_VGROUPS) == 0)) {
19,891✔
326
      pAuthCxt->errCode = TSDB_CODE_PAR_PERMISSION_DENIED;
692✔
327
      return DEAL_RES_ERROR;
692✔
328
    }
329
    if (authObjPrivileges(pAuthCxt, pTable->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB) != TSDB_CODE_SUCCESS) {
140,811,559✔
330
      pAuthCxt->errCode = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
4,002✔
331
      return DEAL_RES_ERROR;
4,002✔
332
    }
333
#ifdef TD_ENTERPRISE
334
    SName name = {0};
140,807,720✔
335
    toName(pAuthCxt->pParseCxt->acctId, pTable->dbName, pTable->tableName, &name);
140,808,137✔
336
    STableMeta* pTableMeta = NULL;
140,808,302✔
337
    toName(pAuthCxt->pParseCxt->acctId, pTable->dbName, pTable->tableName, &name);
140,808,714✔
338
    int32_t code = getTargetMetaImpl(pAuthCxt->pParseCxt, pAuthCxt->pMetaCache, &name, &pTableMeta, true);
140,808,656✔
339
    if (TSDB_CODE_SUCCESS == code) {
140,808,235✔
340
      if (pTableMeta->isAudit) {
139,770,876✔
341
        isAudit = true;
×
342
      } else if (!pTableMeta->isAudit && (pTableMeta->ownerId == pAuthCxt->pParseCxt->userId)) {
139,770,904✔
343
        // owner has all privileges on the table he owns except audit table
344
        taosMemoryFree(pTableMeta);
134,476,795✔
345
        return DEAL_RES_CONTINUE;
134,476,631✔
346
      }
347
      if (TSDB_VIEW_TABLE == pTableMeta->tableType) {
5,294,438✔
348
        isView = true;
53,060✔
349
      }
350
    }
351
    taosMemoryFree(pTableMeta);
6,331,860✔
352
#endif
353
    if (!isView) {
6,331,830✔
354
      pAuthCxt->errCode =
6,278,770✔
355
          checkAuth(pAuthCxt, pTable->dbName, pTable->tableName, isAudit ? PRIV_AUDIT_TBL_SELECT : PRIV_TBL_SELECT,
6,278,770✔
356
                    PRIV_OBJ_TBL, &pTagCond, NULL);  //&pPrivCols);
357
      if (TSDB_CODE_SUCCESS != pAuthCxt->errCode && NULL != pAuthCxt->pParseCxt->pEffectiveUser) {
6,278,804✔
358
        pAuthCxt->errCode = checkEffectiveAuth(pAuthCxt, pTable->dbName, pTable->tableName,
12,856✔
359
                                               isAudit ? PRIV_AUDIT_TBL_SELECT : PRIV_TBL_SELECT, PRIV_OBJ_TBL, NULL);
360
      }
361
#if 0
362
      if (TSDB_CODE_SUCCESS == pAuthCxt->errCode && NULL != pPrivCols) {
363
        pAuthCxt->errCode = authSelectTblCols(pCxt->pSelect, pTable, pPrivCols);
364
      }
365
#endif
366
      if (TSDB_CODE_SUCCESS == pAuthCxt->errCode && NULL != pTagCond) {
6,278,804✔
367
        pAuthCxt->errCode = rewriteAppendStableTagCond(&pCxt->pSelect->pWhere, pTagCond, pTable);
5,777✔
368
      }
369
    } else {
370
      pAuthCxt->errCode =
53,060✔
371
          checkViewAuth(pAuthCxt, pTable->dbName, pTable->tableName, PRIV_VIEW_SELECT, PRIV_OBJ_VIEW, NULL);
53,060✔
372
      if (TSDB_CODE_SUCCESS != pAuthCxt->errCode && NULL != pAuthCxt->pParseCxt->pEffectiveUser) {
53,060✔
373
        pAuthCxt->errCode =
2,208✔
374
            checkViewEffectiveAuth(pAuthCxt, pTable->dbName, pTable->tableName, PRIV_VIEW_SELECT, PRIV_OBJ_VIEW, NULL);
2,208✔
375
      }
376
    }
377
    return TSDB_CODE_SUCCESS == pAuthCxt->errCode ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
6,331,864✔
378
  } else if (QUERY_NODE_TEMP_TABLE == nodeType(pNode)) {
1,478,177,316✔
379
    return authSubquery(pAuthCxt, ((STempTableNode*)pNode)->pSubquery);
22,552,947✔
380
  }
381
  return DEAL_RES_CONTINUE;
1,455,623,963✔
382
}
383

384
static int32_t authSelect(SAuthCxt* pCxt, SSelectStmt* pSelect) {
152,859,489✔
385
  SSelectAuthCxt cxt = {.pAuthCxt = pCxt, .pSelect = pSelect};
152,859,489✔
386
  nodesWalkSelectStmt(pSelect, SQL_CLAUSE_FROM, authSelectImpl, &cxt);
152,859,560✔
387
  return pCxt->errCode;
152,860,429✔
388
}
389

390
static int32_t authSetOperator(SAuthCxt* pCxt, SSetOperator* pSetOper) {
8,559,500✔
391
  int32_t code = authQuery(pCxt, pSetOper->pLeft);
8,559,500✔
392
  if (TSDB_CODE_SUCCESS == code) {
8,559,500✔
393
    code = authQuery(pCxt, pSetOper->pRight);
8,557,292✔
394
  }
395
  return code;
8,559,500✔
396
}
397

398
static int32_t authDropUser(SAuthCxt* pCxt, SDropUserStmt* pStmt) {
34,669✔
399
  // if (!pCxt->pParseCxt->isSuperUser || 0 == strcmp(pStmt->userName, TSDB_DEFAULT_USER)) {
400
  //   return TSDB_CODE_PAR_PERMISSION_DENIED;
401
  // }
402
  if (0 == strcmp(pStmt->userName, TSDB_DEFAULT_USER)) {
34,669✔
403
    return TSDB_CODE_PAR_PERMISSION_DENIED;
161✔
404
  }
405
  return authSysPrivileges(pCxt, (void*)pStmt, PRIV_USER_DROP);  // root has SYSDBA role with USER_DROP privilege
34,508✔
406
}
407

408
static int32_t authDelete(SAuthCxt* pCxt, SDeleteStmt* pDelete) {
1,732,115✔
409
  SNode*      pTagCond = NULL;
1,732,115✔
410
  STableNode* pTable = (STableNode*)pDelete->pFromTable;
1,732,115✔
411
  int32_t     code = checkAuth(pCxt, pTable->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL);
1,732,115✔
412
  if (TSDB_CODE_SUCCESS == code) {
1,732,115✔
413
    code = checkAuth(pCxt, pTable->dbName, pTable->tableName, PRIV_TBL_DELETE, PRIV_OBJ_TBL, &pTagCond, NULL);
1,732,115✔
414
  } else {
415
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
416
  }
417
  if (TSDB_CODE_SUCCESS == code && NULL != pTagCond) {
1,732,115✔
418
    code = rewriteAppendStableTagCond(&pDelete->pWhere, pTagCond, pTable);
×
419
  }
420
  return code;
1,732,115✔
421
}
422

423
static int32_t authInsert(SAuthCxt* pCxt, SInsertStmt* pInsert) {
244,959✔
424
  SNode*      pTagCond = NULL;
244,959✔
425
  SArray*     pPrivCols = NULL;
244,959✔
426
  STableNode* pTable = (STableNode*)pInsert->pTable;
244,959✔
427
  // todo check tag condition for subtable
428
  int32_t code = checkAuth(pCxt, pTable->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL);
244,959✔
429
  if (TSDB_CODE_SUCCESS == code) {
244,959✔
430
    code = checkAuth(pCxt, pTable->dbName, pTable->tableName, PRIV_TBL_INSERT, PRIV_OBJ_TBL, &pTagCond, &pPrivCols);
244,959✔
431
  } else {
432
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
433
  }
434
  return code;
244,959✔
435
}
436

437
static int32_t authShowTables(SAuthCxt* pCxt, SShowStmt* pStmt) {
547,478✔
438
  // return checkAuth(pCxt, ((SValueNode*)pStmt->pDbName)->literal, NULL, AUTH_TYPE_READ_OR_WRITE, NULL);
439
  // stb: more check in server, child table(TODO): more check when filter query result
440
  if (authObjPrivileges(pCxt, ((SValueNode*)pStmt->pDbName)->literal, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
547,478✔
441
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
4,772✔
442
  }
443
  return 0;
542,706✔
444
}
445

446
static int32_t authShowVtables(SAuthCxt* pCxt, SShowStmt* pStmt) { return authShowTables(pCxt, pStmt); }
58,373✔
447

448
static int32_t authShowUsage(SAuthCxt* pCxt, SShowStmt* pStmt) {
321✔
449
  if (authObjPrivileges(pCxt, ((SValueNode*)pStmt->pDbName)->literal, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
321✔
450
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
451
  }
452
  return 0;
321✔
453
}
454

455
static int32_t authShowCreateTable(SAuthCxt* pCxt, SShowCreateTableStmt* pStmt) {
87,387✔
456
  // SNode* pTagCond = NULL;
457
  // todo check tag condition for subtable
458
  // return checkAuth(pCxt, pStmt->dbName, pStmt->tableName, AUTH_TYPE_READ, &pTagCond);
459
  if (authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
87,387✔
460
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
3,633✔
461
  }
462
  return authObjPrivileges(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_SHOW_CREATE, PRIV_OBJ_TBL);
83,754✔
463
}
464

465
static int32_t authShowCreateView(SAuthCxt* pCxt, SShowCreateViewStmt* pStmt) {
7,336✔
466
#ifndef TD_ENTERPRISE
467
  return TSDB_CODE_OPS_NOT_SUPPORT;
468
#else
469
  int32_t code = authObjPrivileges(pCxt, ((SShowCreateViewStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
7,336✔
470
  if (TSDB_CODE_SUCCESS == code) {
7,336✔
471
    code = checkViewAuth(pCxt, ((SShowCreateViewStmt*)pStmt)->dbName, ((SShowCreateViewStmt*)pStmt)->viewName,
7,336✔
472
                         PRIV_CM_SHOW_CREATE, PRIV_OBJ_VIEW, NULL);
473
  } else {
UNCOV
474
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
475
  }
476
  if (code == 0) pStmt->hasPrivilege = true;
7,336✔
477
  return 0;  // return 0 and check owner later in translateShowCreateView
7,336✔
478
#endif
479
}
480

481
static int32_t authCreateTable(SAuthCxt* pCxt, SCreateTableStmt* pStmt) {
8,116,261✔
482
  // SNode* pTagCond = NULL;
483
  // todo check tag condition for subtable
484
  // return checkAuth(pCxt, pStmt->dbName, NULL, AUTH_TYPE_WRITE, &pTagCond);
485
  if (authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
8,116,261✔
486
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
346✔
487
  }
488
  return authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB);
8,115,915✔
489
}
490

491
static int32_t authCreateVTable(SAuthCxt* pCxt, SCreateVTableStmt* pStmt) {
159,600✔
492
  if (authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
159,600✔
UNCOV
493
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
494
  }
495
  PAR_ERR_RET(authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB));
159,600✔
496
  SNode* pCol = NULL;
149,552✔
497
  FOREACH(pCol, pStmt->pCols) {
137,609,179✔
498
    SColumnDefNode* pColDef = (SColumnDefNode*)pCol;
137,467,163✔
499
    if (NULL == pColDef) {
137,467,163✔
UNCOV
500
      PAR_ERR_RET(TSDB_CODE_PAR_INVALID_COLUMN);
×
501
    }
502
    SColumnOptions* pOptions = (SColumnOptions*)pColDef->pOptions;
137,467,163✔
503
    if (pOptions && pOptions->hasRef) {
137,467,163✔
504
      if (authObjPrivileges(pCxt, pOptions->refDb, pOptions->refTable, PRIV_TBL_SELECT, PRIV_OBJ_TBL)) {
85,768,481✔
505
        return TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
7,536✔
506
      }
507
    }
508
  }
509
  return TSDB_CODE_SUCCESS;
142,016✔
510
}
511

512
static int32_t authCreateVSubTable(SAuthCxt* pCxt, SCreateVSubTableStmt* pStmt) {
263,839✔
513
  int32_t    code = TSDB_CODE_SUCCESS;
263,839✔
514
  SNode*     pNode = NULL;
263,839✔
515
  SNodeList* pTmpList = pStmt->pSpecificColRefs ? pStmt->pSpecificColRefs : pStmt->pColRefs;
263,839✔
516
  if (authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
263,839✔
UNCOV
517
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
518
  }
519
  PAR_ERR_RET(authObjPrivileges(pCxt, pStmt->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB));
263,839✔
520
  if (NULL == pTmpList) {
253,791✔
521
    // no column reference
522
    return TSDB_CODE_SUCCESS;
15,058✔
523
  }
524

525
  FOREACH(pNode, pTmpList) {
52,667,014✔
526
    SColumnRefNode* pColRef = (SColumnRefNode*)pNode;
52,435,817✔
527
    if (NULL == pColRef) {
52,435,817✔
UNCOV
528
      PAR_ERR_RET(TSDB_CODE_PAR_INVALID_COLUMN);
×
529
    }
530
    if (authObjPrivileges(pCxt, pColRef->refDbName, pColRef->refTableName, PRIV_TBL_SELECT, PRIV_OBJ_TBL)) {
52,435,817✔
531
      return TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
7,536✔
532
    }
533
  }
534
  return code;
231,197✔
535
}
536

537
static int32_t authCreateStream(SAuthCxt* pCxt, SCreateStreamStmt* pStmt) {
348,247✔
538
  int32_t code = TSDB_CODE_SUCCESS;
348,247✔
539

540
  if (IS_SYS_DBNAME(pStmt->streamDbName)) {
348,247✔
UNCOV
541
    return TSDB_CODE_PAR_PERMISSION_DENIED;
×
542
  }
543
  if (IS_SYS_DBNAME(pStmt->targetDbName)) {
348,247✔
544
    return TSDB_CODE_PAR_PERMISSION_DENIED;
39✔
545
  }
546
  if (pStmt->pTrigger) {
348,208✔
547
    SStreamTriggerNode* pTrigger = (SStreamTriggerNode*)pStmt->pTrigger;
348,208✔
548
    STableNode*         pTriggerTable = (STableNode*)pTrigger->pTrigerTable;
348,208✔
549
    if (pTriggerTable) {
348,208✔
550
      if (IS_SYS_DBNAME(pTriggerTable->dbName)) return TSDB_CODE_PAR_PERMISSION_DENIED;
343,018✔
551
      if (authObjPrivileges(pCxt, pTriggerTable->dbName, pTriggerTable->tableName, PRIV_TBL_SELECT, PRIV_OBJ_TBL)) {
342,979✔
552
        return TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
876✔
553
      }
554
      if (authObjPrivileges(pCxt, pTriggerTable->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
342,103✔
UNCOV
555
        return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
556
      }
557
    }
558
  }
559

560
  if (authObjPrivileges(pCxt, ((SCreateStreamStmt*)pStmt)->streamDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
347,293✔
UNCOV
561
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
562
  }
563
  PAR_ERR_RET(
347,293✔
564
      authObjPrivileges(pCxt, ((SCreateStreamStmt*)pStmt)->streamDbName, NULL, PRIV_STREAM_CREATE, PRIV_OBJ_DB));
565
  if (pStmt->targetDbName[0] != '\0') {
346,636✔
566
    if (authObjPrivileges(pCxt, ((SCreateStreamStmt*)pStmt)->targetDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
341,040✔
UNCOV
567
      return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
568
    }
569
    if (authObjPrivileges(pCxt, ((SCreateStreamStmt*)pStmt)->targetDbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB)) {
341,040✔
570
      return TSDB_CODE_PAR_TB_CREATE_PERMISSION_DENIED;
219✔
571
    }
572
  }
573
  if (pStmt->pQuery) {
346,417✔
574
    PAR_ERR_RET(authQuery(pCxt, pStmt->pQuery));
340,821✔
575
  }
576
  return code;
345,979✔
577
}
578

579
static int32_t authCreateTopic(SAuthCxt* pCxt, SCreateTopicStmt* pStmt) {
173,708✔
580
  int32_t code = TSDB_CODE_SUCCESS;
173,708✔
581

582
  if (IS_SYS_DBNAME(pStmt->subDbName)) {
173,708✔
583
    return TSDB_CODE_PAR_PERMISSION_DENIED;
×
584
  }
585
  if (NULL != pStmt->pQuery) {
173,708✔
586
    PAR_ERR_RET(authQuery(pCxt, pStmt->pQuery));
136,337✔
587
  }
588
  if (NULL != pStmt->pWhere) {
173,708✔
589
    if (authObjPrivileges(pCxt, ((SCreateTopicStmt*)pStmt)->subDbName, ((SCreateTopicStmt*)pStmt)->subSTbName,
7,655✔
590
                          PRIV_TBL_SELECT, PRIV_OBJ_TBL)) {
UNCOV
591
      return TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
×
592
    }
593
  }
594
  if (((SCreateTopicStmt*)pStmt)->subDbName[0] != '\0') {
173,708✔
595
    if (authObjPrivileges(pCxt, ((SCreateTopicStmt*)pStmt)->subDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB)) {
37,371✔
UNCOV
596
      return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
597
    }
598
  }
599

600
  return code;
173,708✔
601
}
602

603
static int32_t authCreateMultiTable(SAuthCxt* pCxt, SCreateMultiTablesStmt* pStmt) {
31,345,773✔
604
  int32_t code = TSDB_CODE_SUCCESS;
31,345,773✔
605
  SNode*  pNode = NULL;
31,345,773✔
606
  FOREACH(pNode, pStmt->pSubTables) {
69,005,110✔
607
    if (pNode->type == QUERY_NODE_CREATE_SUBTABLE_CLAUSE) {
37,652,847✔
608
      SCreateSubTableClause* pClause = (SCreateSubTableClause*)pNode;
37,660,785✔
609
      code = authObjPrivileges(pCxt, pClause->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
37,660,785✔
610
      if (TSDB_CODE_SUCCESS != code) {
37,648,113✔
611
        code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
173✔
612
        break;
173✔
613
      }
614
      code = authObjPrivileges(pCxt, pClause->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB);
37,647,940✔
615
      if (TSDB_CODE_SUCCESS != code) {
37,659,234✔
UNCOV
616
        break;
×
617
      }
618
    } else {
619
      SCreateSubTableFromFileClause* pClause = (SCreateSubTableFromFileClause*)pNode;
×
UNCOV
620
      code = authObjPrivileges(pCxt, pClause->useDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
×
UNCOV
621
      if (TSDB_CODE_SUCCESS != code) {
×
UNCOV
622
        code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
UNCOV
623
        break;
×
624
      }
UNCOV
625
      code = authObjPrivileges(pCxt, pClause->useDbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB);
×
626
      if (TSDB_CODE_SUCCESS != code) {
103✔
UNCOV
627
        break;
×
628
      }
629
    }
630
  }
631
  return code;
31,350,232✔
632
}
633

634
static int32_t authDropTable(SAuthCxt* pCxt, SDropTableStmt* pStmt) {
2,082,377✔
635
  int32_t code = TSDB_CODE_SUCCESS;
2,082,377✔
636
  if (pStmt->withOpt && !pCxt->pParseCxt->isSuperUser) {
2,082,377✔
637
    return TSDB_CODE_PAR_PERMISSION_DENIED;
252✔
638
  }
639
  SNode* pNode = NULL;
2,082,125✔
640
  FOREACH(pNode, pStmt->pTables) {
4,275,122✔
641
    SDropTableClause* pClause = (SDropTableClause*)pNode;
2,193,146✔
642
    if (checkAuth(pCxt, pClause->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL)) {
2,193,146✔
UNCOV
643
      code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
UNCOV
644
      break;
×
645
    }
646

647
    if (!pStmt->withOpt) {
2,193,146✔
648
      // for child table, check privileges of its super table later
649
      if (checkAuth(pCxt, pClause->dbName, pClause->tableName, PRIV_CM_DROP, PRIV_OBJ_TBL, NULL, NULL)) {
2,053,162✔
650
        code = TSDB_CODE_PAR_PERMISSION_DENIED;
149✔
651
        break;
149✔
652
      }
653
    }
654
  }
655

656
  return code;
2,082,125✔
657
}
658

659
static int32_t authDropStable(SAuthCxt* pCxt, SDropSuperTableStmt* pStmt) {
82,741✔
660
  if (pStmt->withOpt && !pCxt->pParseCxt->isSuperUser) {
82,741✔
661
    return TSDB_CODE_PAR_PERMISSION_DENIED;
126✔
662
  }
663
  if (checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL)) {
82,615✔
UNCOV
664
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
665
  }
666
  if (!pStmt->withOpt) {
82,615✔
667
    PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_DROP, PRIV_OBJ_TBL, NULL, NULL));
30,057✔
668
  }
669
  return 0;
82,615✔
670
}
671

672
static int32_t authDropVtable(SAuthCxt* pCxt, SDropVirtualTableStmt* pStmt) {
71,356✔
673
  if (pStmt->withOpt && !pCxt->pParseCxt->isSuperUser) {
71,356✔
UNCOV
674
    return TSDB_CODE_PAR_PERMISSION_DENIED;
×
675
  }
676
  if (checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL)) {
71,356✔
UNCOV
677
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
678
  }
679
  if (!pStmt->withOpt) {
71,356✔
680
    PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_DROP, PRIV_OBJ_TBL, NULL, NULL));
71,356✔
681
  }
682
  return 0;
61,252✔
683
}
684

685
static int32_t authAlterTable(SAuthCxt* pCxt, SAlterTableStmt* pStmt) {
18,646,003✔
686
  SNode* pTagCond = NULL;
18,646,003✔
687
  // todo check tag condition for subtable
688
  if (checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL)) {
18,646,003✔
689
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
894✔
690
  }
691
  return checkAuth(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_ALTER, PRIV_OBJ_TBL, NULL, NULL);
18,645,109✔
692
}
693

694
static int32_t authAlterVTable(SAuthCxt* pCxt, SAlterTableStmt* pStmt) {
376,374✔
695
  if (checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL)) {
376,374✔
UNCOV
696
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
697
  }
698
  PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, pStmt->tableName, PRIV_CM_ALTER, PRIV_OBJ_TBL, NULL, NULL));
376,374✔
699
  if (pStmt->alterType == TSDB_ALTER_TABLE_ADD_COLUMN_WITH_COLUMN_REF ||
320,702✔
700
      pStmt->alterType == TSDB_ALTER_TABLE_ALTER_COLUMN_REF) {
292,172✔
701
    if (checkAuth(pCxt, pStmt->refDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL)) {
123,417✔
UNCOV
702
      return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
703
    }
704
    if (checkAuth(pCxt, pStmt->refDbName, pStmt->refTableName, PRIV_TBL_SELECT, PRIV_OBJ_TBL, NULL, NULL)) {
123,417✔
705
      return TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
20,248✔
706
    }
707
  }
708
  PAR_RET(TSDB_CODE_SUCCESS);
300,454✔
709
}
710

711
static int32_t authCreateView(SAuthCxt* pCxt, SCreateViewStmt* pStmt) {
205,692✔
712
#ifndef TD_ENTERPRISE
713
  return TSDB_CODE_OPS_NOT_SUPPORT;
714
#else
715
  int32_t code = checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL);
205,692✔
716
  if (TSDB_CODE_SUCCESS == code) {
205,692✔
717
    code = checkAuth(pCxt, pStmt->dbName, NULL, PRIV_VIEW_CREATE, PRIV_OBJ_DB, NULL, NULL);
205,692✔
718
    if (code != TSDB_CODE_SUCCESS && pStmt->orReplace) {
205,692✔
UNCOV
719
      code = checkAuth(pCxt, pStmt->dbName, pStmt->viewName, PRIV_CM_ALTER, PRIV_OBJ_VIEW, NULL, NULL);
×
720
    }
721
  } else {
UNCOV
722
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
723
  }
724
  if (TSDB_CODE_SUCCESS == code) {
205,692✔
725
    if ((code = authQuery(pCxt, pStmt->pQuery))) {
202,132✔
726
      if (code == TSDB_CODE_PAR_PERMISSION_DENIED) code = TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
3,560✔
727
    }
728
  }
729
  return code;
205,692✔
730
#endif
731
}
732

733
static int32_t authDropView(SAuthCxt* pCxt, SDropViewStmt* pStmt) {
155,461✔
734
#ifndef TD_ENTERPRISE
735
  return TSDB_CODE_OPS_NOT_SUPPORT;
736
#else
737
  int32_t code = checkAuth(pCxt, pStmt->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB, NULL, NULL);
155,461✔
738
  if (TSDB_CODE_SUCCESS == code) {
155,461✔
739
    code = checkViewAuth(pCxt, pStmt->dbName, pStmt->viewName, PRIV_CM_DROP, PRIV_OBJ_VIEW, NULL);
155,461✔
740
  } else {
UNCOV
741
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
742
  }
743
  if (code == 0) {
155,461✔
744
    pStmt->hasPrivilege = true;
145,664✔
745
  } else {
746
    code = 0;  // check owner in parTranslater
9,797✔
747
  }
748
  return code;
155,461✔
749
#endif
750
}
751

752
static int32_t authCreateIndex(SAuthCxt* pCxt, SCreateIndexStmt* pStmt) {
12,065✔
753
  int32_t code = authObjPrivileges(pCxt, ((SCreateIndexStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
12,065✔
754

755
  if (TSDB_CODE_SUCCESS == code) {
12,065✔
756
    if (authObjPrivileges(pCxt, ((SCreateIndexStmt*)pStmt)->dbName, ((SCreateIndexStmt*)pStmt)->tableName,
12,065✔
757
                          PRIV_TBL_SELECT, PRIV_OBJ_TBL)) {
UNCOV
758
      code = TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
×
759
    }
760
  } else {
UNCOV
761
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
762
  }
763

764
  if (TSDB_CODE_SUCCESS == code) {
12,065✔
765
    code = authObjPrivileges(pCxt, ((SCreateIndexStmt*)pStmt)->dbName, ((SCreateIndexStmt*)pStmt)->tableName,
12,065✔
766
                             PRIV_IDX_CREATE, PRIV_OBJ_TBL);
767
  }
768

769
  return code;
12,065✔
770
}
771

772
static int32_t authDropIndex(SAuthCxt* pCxt, SDropIndexStmt* pStmt) {
3,372✔
773
  int32_t code = authObjPrivileges(pCxt, ((SDropIndexStmt*)pStmt)->indexDbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
3,372✔
774
  if (TSDB_CODE_SUCCESS == code) {
3,372✔
775
    code = authObjPrivileges(pCxt, ((SDropIndexStmt*)pStmt)->indexDbName, ((SDropIndexStmt*)pStmt)->indexName,
3,372✔
776
                             PRIV_CM_DROP, PRIV_OBJ_IDX);
777
  } else {
UNCOV
778
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
779
  }
780
  return code;
3,372✔
781
}
782

783
static int32_t authShowIndexes(SAuthCxt* pCxt, SShowStmt* pStmt) { return authShowTables(pCxt, pStmt); }
4,498✔
784

785
static int32_t authCreateTsma(SAuthCxt* pCxt, SCreateTSMAStmt* pStmt) {
5,230✔
786
  int32_t code = authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
5,230✔
787
  if (TSDB_CODE_SUCCESS == code) {
5,230✔
788
    if (authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, NULL, PRIV_TBL_CREATE, PRIV_OBJ_DB)) {
5,230✔
UNCOV
789
      code = TSDB_CODE_PAR_TB_CREATE_PERMISSION_DENIED;
×
790
    }
791
  } else {
UNCOV
792
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
793
  }
794
  if (!pStmt->pOptions->recursiveTsma) {
5,230✔
795
    if (TSDB_CODE_SUCCESS == code) {
4,231✔
796
      if (authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, ((SCreateTSMAStmt*)pStmt)->tableName,
4,231✔
797
                            PRIV_TBL_SELECT, PRIV_OBJ_TBL)) {
UNCOV
798
        code = TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
×
799
      }
800
    }
801

802
    if (TSDB_CODE_SUCCESS == code) {
4,231✔
803
      if (authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, NULL, PRIV_STREAM_CREATE, PRIV_OBJ_DB)) {
4,231✔
804
        code = TSDB_CODE_PAR_STREAM_CREATE_PERMISSION_DENIED;
×
805
      }
806
    }
807
    if (TSDB_CODE_SUCCESS == code) {
4,231✔
808
      code = authObjPrivileges(pCxt, ((SCreateTSMAStmt*)pStmt)->dbName, ((SCreateTSMAStmt*)pStmt)->tableName,
4,231✔
809
                               PRIV_TSMA_CREATE, PRIV_OBJ_TBL);
810
    }
811
  }
812

813
  return code;
5,230✔
814
}
815

816
static int32_t authDropTsma(SAuthCxt* pCxt, SDropTSMAStmt* pStmt) {
2,109✔
817
  int32_t code = authObjPrivileges(pCxt, ((SDropTSMAStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
2,109✔
818
  if (TSDB_CODE_SUCCESS == code) {
2,109✔
819
    code = authObjPrivileges(pCxt, ((SDropTSMAStmt*)pStmt)->dbName, ((SDropTSMAStmt*)pStmt)->tsmaName, PRIV_CM_DROP,
2,109✔
820
                             PRIV_OBJ_TSMA);
821
  } else {
822
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
823
  }
824
  return code;
2,109✔
825
}
826

827
static int32_t authCreateRsma(SAuthCxt* pCxt, SCreateRsmaStmt* pStmt) {
111,601✔
828
  int32_t code = authObjPrivileges(pCxt, ((SCreateRsmaStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
111,601✔
829
  if (TSDB_CODE_SUCCESS == code) {
111,601✔
830
    if (authObjPrivileges(pCxt, ((SCreateRsmaStmt*)pStmt)->dbName, ((SCreateRsmaStmt*)pStmt)->tableName,
111,601✔
831
                          PRIV_TBL_SELECT, PRIV_OBJ_TBL)) {
UNCOV
832
      code = TSDB_CODE_PAR_TB_SELECT_PERMISSION_DENIED;
×
833
    }
834
  } else {
UNCOV
835
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
836
  }
837
  if (TSDB_CODE_SUCCESS == code) {
111,601✔
838
    if (authObjPrivileges(pCxt, ((SCreateRsmaStmt*)pStmt)->dbName, ((SCreateRsmaStmt*)pStmt)->tableName,
111,601✔
839
                          PRIV_TBL_INSERT, PRIV_OBJ_TBL)) {
UNCOV
840
      code = TSDB_CODE_PAR_TB_INSERT_PERMISSION_DENIED;
×
841
    }
842
  }
843
  if (TSDB_CODE_SUCCESS == code) {
111,601✔
844
    code = authObjPrivileges(pCxt, ((SCreateRsmaStmt*)pStmt)->dbName, ((SCreateRsmaStmt*)pStmt)->tableName,
111,601✔
845
                             PRIV_RSMA_CREATE, PRIV_OBJ_TBL);
846
  }
847
  return code;
111,601✔
848
}
849

850
static int32_t authDropRsma(SAuthCxt* pCxt, SDropRsmaStmt* pStmt) {
2,247✔
851
  int32_t code = authObjPrivileges(pCxt, ((SDropRsmaStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
2,247✔
852
  if (TSDB_CODE_SUCCESS == code) {
2,247✔
853
    code = authObjPrivileges(pCxt, ((SDropRsmaStmt*)pStmt)->dbName, ((SDropRsmaStmt*)pStmt)->rsmaName, PRIV_CM_DROP,
2,247✔
854
                             PRIV_OBJ_RSMA);
855
  } else {
UNCOV
856
    code = TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
857
  }
858
  return code;
2,247✔
859
}
860

861
static int32_t authShowCreateRsma(SAuthCxt* pCxt, SShowCreateRsmaStmt* pStmt) {
2,247✔
862
#ifndef TD_ENTERPRISE
863
  return TSDB_CODE_OPS_NOT_SUPPORT;
864
#else
865
  int32_t code = authObjPrivileges(pCxt, ((SShowCreateRsmaStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
2,247✔
866
  if (TSDB_CODE_SUCCESS == code) {
2,247✔
867
    code = authObjPrivileges(pCxt, ((SShowCreateRsmaStmt*)pStmt)->dbName, ((SShowCreateRsmaStmt*)pStmt)->rsmaName,
2,247✔
868
                             PRIV_CM_SHOW_CREATE, PRIV_OBJ_RSMA);
869
  } else {
UNCOV
870
    return TSDB_CODE_PAR_DB_USE_PERMISSION_DENIED;
×
871
  }
872
  if (code == 0) pStmt->hasPrivilege = true;
2,247✔
873
  return 0;  // return 0 and check owner later in translateShowCreateRsma since rsma ctgCatalog not available yet
2,247✔
874
#endif
875
}
876

877
static int32_t authCreateDatabase(SAuthCxt* pCxt, SCreateDatabaseStmt* pStmt) {
1,369,093✔
878
  return authSysPrivileges(pCxt, (SNode*)pStmt, PRIV_DB_CREATE);
1,369,093✔
879
}
880

881
static int32_t authAlterDatabase(SAuthCxt* pCxt, SAlterDatabaseStmt* pStmt) {
180,837✔
882
  return authObjPrivileges(pCxt, ((SAlterDatabaseStmt*)pStmt)->dbName, NULL, PRIV_CM_ALTER, PRIV_OBJ_DB);
180,837✔
883
}
884

885
static int32_t authAlterLocal(SAuthCxt* pCxt, SAlterLocalStmt* pStmt) {
403,684✔
886
  int32_t privType = cfgGetPrivType(tsCfg, pStmt->config, 0);
403,684✔
887
  return authSysPrivileges(pCxt, (void*)pStmt, privType);
403,684✔
888
}
889

UNCOV
890
static int32_t authDropRole(SAuthCxt* pCxt, SDropRoleStmt* pStmt) {
×
UNCOV
891
  return authSysPrivileges(pCxt, (SNode*)pStmt, PRIV_ROLE_DROP);
×
892
}
893

894
static int32_t authDropDatabase(SAuthCxt* pCxt, SDropDatabaseStmt* pStmt) {
1,128,958✔
895
  return authObjPrivileges(pCxt, ((SDropDatabaseStmt*)pStmt)->dbName, NULL, PRIV_CM_DROP, PRIV_OBJ_DB);
1,128,958✔
896
}
897

898
static int32_t authUseDatabase(SAuthCxt* pCxt, SUseDatabaseStmt* pStmt) {
113,422,659✔
899
  return authObjPrivileges(pCxt, ((SUseDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_USE, PRIV_OBJ_DB);
113,422,659✔
900
}
901

902
static int32_t authGrant(SAuthCxt* pCxt, SGrantStmt* pStmt) {
813,875✔
903
  if (pStmt->optrType == TSDB_ALTER_ROLE_ROLE) {
813,875✔
904
    if (IS_SYS_PREFIX(pStmt->roleName)) {
2,429✔
905
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSDBA) == 0) {
2,265✔
906
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_GRANT_SYSDBA);
164✔
907
      }
908
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSSEC) == 0) {
2,101✔
909
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_GRANT_SYSSEC);
164✔
910
      }
911
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSAUDIT) == 0) {
1,937✔
912
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_GRANT_SYSAUDIT);
164✔
913
      }
914
    }
915
  }
916
  return authSysPrivileges(pCxt, (void*)pStmt, PRIV_GRANT_PRIVILEGE);
813,383✔
917
}
918

919
static int32_t authRevoke(SAuthCxt* pCxt, SRevokeStmt* pStmt) {
440,028✔
920
  if (pStmt->optrType == TSDB_ALTER_ROLE_ROLE) {
440,028✔
921
    if (IS_SYS_PREFIX(pStmt->roleName)) {
1,548✔
922
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSDBA) == 0) {
1,548✔
UNCOV
923
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_REVOKE_SYSDBA);
×
924
      }
925
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSSEC) == 0) {
1,548✔
UNCOV
926
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_REVOKE_SYSSEC);
×
927
      }
928
      if (strcmp(pStmt->roleName, TSDB_ROLE_SYSAUDIT) == 0) {
1,548✔
929
        return authSysPrivileges(pCxt, (void*)pStmt, PRIV_REVOKE_SYSAUDIT);
×
930
      }
931
    }
932
  }
933
  return authSysPrivileges(pCxt, (void*)pStmt, PRIV_REVOKE_PRIVILEGE);
440,028✔
934
}
935

936
static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) {
471,109,624✔
937
  int32_t code = TSDB_CODE_SUCCESS;
471,109,624✔
938
#ifdef TD_ENTERPRISE
939
  switch (nodeType(pStmt)) {
471,109,624✔
940
    case QUERY_NODE_SET_OPERATOR:
8,559,500✔
941
      return authSetOperator(pCxt, (SSetOperator*)pStmt);
8,559,500✔
942
    case QUERY_NODE_SELECT_STMT:
152,858,511✔
943
      return authSelect(pCxt, (SSelectStmt*)pStmt);
152,858,511✔
944
    case QUERY_NODE_CREATE_ROLE_STMT:
164✔
945
      return authSysPrivileges(pCxt, pStmt, PRIV_ROLE_CREATE);
164✔
UNCOV
946
    case QUERY_NODE_DROP_ROLE_STMT:
×
UNCOV
947
      return authDropRole(pCxt, (SDropRoleStmt*)pStmt);
×
948
    case QUERY_NODE_CREATE_USER_STMT:
72,290✔
949
      return authSysPrivileges(pCxt, pStmt, PRIV_USER_CREATE);
72,290✔
950
    case QUERY_NODE_ALTER_USER_STMT:
37,099✔
951
      return authSysPrivileges(pCxt, pStmt, PRIV_USER_ALTER);
37,099✔
952
    case QUERY_NODE_DROP_USER_STMT:
34,669✔
953
      return authDropUser(pCxt, (SDropUserStmt*)pStmt);
34,669✔
954
    case QUERY_NODE_DELETE_STMT:
1,732,115✔
955
      return authDelete(pCxt, (SDeleteStmt*)pStmt);
1,732,115✔
956
    case QUERY_NODE_INSERT_STMT:
244,959✔
957
      return authInsert(pCxt, (SInsertStmt*)pStmt);
244,959✔
958
    case QUERY_NODE_CREATE_TABLE_STMT:
8,116,261✔
959
      return authCreateTable(pCxt, (SCreateTableStmt*)pStmt);
8,116,261✔
960
    case QUERY_NODE_CREATE_VIRTUAL_TABLE_STMT:
159,600✔
961
      return authCreateVTable(pCxt, (SCreateVTableStmt*)pStmt);
159,600✔
962
    case QUERY_NODE_CREATE_VIRTUAL_SUBTABLE_STMT:
263,839✔
963
      return authCreateVSubTable(pCxt, (SCreateVSubTableStmt*)pStmt);
263,839✔
964
    case QUERY_NODE_CREATE_MULTI_TABLES_STMT:
31,344,946✔
965
      return authCreateMultiTable(pCxt, (SCreateMultiTablesStmt*)pStmt);
31,344,946✔
966
    case QUERY_NODE_CREATE_STREAM_STMT:
348,247✔
967
      return authCreateStream(pCxt, (SCreateStreamStmt*)pStmt);
348,247✔
968
    case QUERY_NODE_CREATE_TOPIC_STMT:
173,708✔
969
      return authCreateTopic(pCxt, (SCreateTopicStmt*)pStmt);
173,708✔
970
    case QUERY_NODE_DROP_TABLE_STMT:
2,082,377✔
971
      return authDropTable(pCxt, (SDropTableStmt*)pStmt);
2,082,377✔
972
    case QUERY_NODE_DROP_SUPER_TABLE_STMT:
82,741✔
973
      return authDropStable(pCxt, (SDropSuperTableStmt*)pStmt);
82,741✔
974
    case QUERY_NODE_DROP_VIRTUAL_TABLE_STMT:
71,356✔
975
      return authDropVtable(pCxt, (SDropVirtualTableStmt*)pStmt);
71,356✔
976
    case QUERY_NODE_ALTER_TABLE_STMT:
18,646,003✔
977
    case QUERY_NODE_ALTER_SUPER_TABLE_STMT:
978
      return authAlterTable(pCxt, (SAlterTableStmt*)pStmt);
18,646,003✔
979
    case QUERY_NODE_ALTER_VIRTUAL_TABLE_STMT:
376,374✔
980
      return authAlterVTable(pCxt, (SAlterTableStmt*)pStmt);
376,374✔
981
    case QUERY_NODE_SHOW_MODULES_STMT:
105,580✔
982
    case QUERY_NODE_SHOW_BACKUP_NODES_STMT:
983
    case QUERY_NODE_SHOW_DB_ALIVE_STMT:
984
    // case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT:
985
    case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
986
    case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT:  // TODO: check in mnode
987
    // case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT: // not check local variables
988
    case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
989
    case QUERY_NODE_SHOW_SCORES_STMT:
990
    case QUERY_NODE_SHOW_ARBGROUPS_STMT:
991
    case QUERY_NODE_SHOW_ENCRYPTIONS_STMT:
992
    case QUERY_NODE_SHOW_MOUNTS_STMT:
993
    case QUERY_NODE_SHOW_ENCRYPT_ALGORITHMS_STMT:
994
    case QUERY_NODE_SHOW_ENCRYPT_STATUS_STMT:
995
      return !pCxt->pParseCxt->enableSysInfo ? TSDB_CODE_PAR_PERMISSION_DENIED : TSDB_CODE_SUCCESS;
105,580✔
996
    case QUERY_NODE_SHOW_USERS_STMT:
128,168✔
997
    case QUERY_NODE_SHOW_USERS_FULL_STMT:
998
      return authSysPrivileges(pCxt, pStmt, PRIV_USER_SHOW);
128,168✔
999
    case QUERY_NODE_SHOW_ROLES_STMT:
164✔
1000
      return authSysPrivileges(pCxt, pStmt, PRIV_ROLE_SHOW);
164✔
1001
    case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT:
3,889✔
1002
    case QUERY_NODE_SHOW_ROLE_PRIVILEGES_STMT:
1003
    case QUERY_NODE_SHOW_ROLE_COL_PRIVILEGES_STMT:
1004
      return authSysPrivileges(pCxt, pStmt, PRIV_SHOW_PRIVILEGES);
3,889✔
1005
    case QUERY_NODE_SHOW_DNODES_STMT:
436,026✔
1006
    case QUERY_NODE_SHOW_MNODES_STMT:
1007
    case QUERY_NODE_SHOW_QNODES_STMT:
1008
    case QUERY_NODE_SHOW_SNODES_STMT:
1009
    case QUERY_NODE_SHOW_BNODES_STMT:
1010
      return authSysPrivileges(pCxt, pStmt, PRIV_NODES_SHOW);
436,026✔
1011
    case QUERY_NODE_SHOW_ANODES_STMT:
10,539✔
1012
    case QUERY_NODE_SHOW_ANODES_FULL_STMT:
1013
    case QUERY_NODE_SHOW_XNODES_STMT:
1014
    case QUERY_NODE_SHOW_XNODE_TASKS_STMT:
1015
    case QUERY_NODE_SHOW_XNODE_AGENTS_STMT:
1016
    case QUERY_NODE_SHOW_XNODE_JOBS_STMT:
1017
      return TSDB_CODE_SUCCESS;
10,539✔
1018
    case QUERY_NODE_SHOW_CLUSTER_MACHINES_STMT:
3,806✔
1019
    // case QUERY_NODE_SHOW_LICENCES_STMT: // do not check auth for basic licence info since it's used for taos logon
1020
    case QUERY_NODE_SHOW_GRANTS_FULL_STMT:
1021
    case QUERY_NODE_SHOW_GRANTS_LOGS_STMT:
1022
      return authSysPrivileges(pCxt, pStmt, PRIV_GRANTS_SHOW);
3,806✔
1023
    case QUERY_NODE_SHOW_TABLES_STMT:
484,607✔
1024
    case QUERY_NODE_SHOW_STABLES_STMT:
1025
      return authShowTables(pCxt, (SShowStmt*)pStmt);
484,607✔
1026
    case QUERY_NODE_SHOW_VTABLES_STMT:
58,373✔
1027
      return authShowVtables(pCxt, (SShowStmt*)pStmt);
58,373✔
1028
    case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
87,387✔
1029
    case QUERY_NODE_SHOW_CREATE_VTABLE_STMT:
1030
    case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
1031
      return authShowCreateTable(pCxt, (SShowCreateTableStmt*)pStmt);
87,387✔
1032
    case QUERY_NODE_SHOW_CREATE_VIEW_STMT:
7,336✔
1033
      return authShowCreateView(pCxt, (SShowCreateViewStmt*)pStmt);
7,336✔
1034
    case QUERY_NODE_CREATE_VIEW_STMT:
205,692✔
1035
      return authCreateView(pCxt, (SCreateViewStmt*)pStmt);
205,692✔
1036
    case QUERY_NODE_DROP_VIEW_STMT:
155,461✔
1037
      return authDropView(pCxt, (SDropViewStmt*)pStmt);
155,461✔
1038
    case QUERY_NODE_CREATE_INDEX_STMT:
12,065✔
1039
      return authCreateIndex(pCxt, (SCreateIndexStmt*)pStmt);
12,065✔
1040
    case QUERY_NODE_DROP_INDEX_STMT:
3,372✔
1041
      return authDropIndex(pCxt, (SDropIndexStmt*)pStmt);
3,372✔
1042
    case QUERY_NODE_SHOW_INDEXES_STMT:
4,498✔
1043
      return authShowIndexes(pCxt, (SShowStmt*)pStmt);
4,498✔
1044
    case QUERY_NODE_CREATE_TSMA_STMT:
5,230✔
1045
      return authCreateTsma(pCxt, (SCreateTSMAStmt*)pStmt);
5,230✔
1046
    case QUERY_NODE_DROP_TSMA_STMT:
2,109✔
1047
      return authDropTsma(pCxt, (SDropTSMAStmt*)pStmt);
2,109✔
1048
    case QUERY_NODE_CREATE_RSMA_STMT:
111,601✔
1049
      return authCreateRsma(pCxt, (SCreateRsmaStmt*)pStmt);
111,601✔
1050
    case QUERY_NODE_DROP_RSMA_STMT:
2,247✔
1051
      return authDropRsma(pCxt, (SDropRsmaStmt*)pStmt);
2,247✔
1052
    case QUERY_NODE_ALTER_RSMA_STMT:
20,223✔
1053
      return authObjPrivileges(pCxt, ((SAlterRsmaStmt*)pStmt)->dbName, ((SAlterRsmaStmt*)pStmt)->rsmaName,
20,223✔
1054
                               PRIV_CM_ALTER, PRIV_OBJ_RSMA);
1055
    case QUERY_NODE_SHOW_CREATE_RSMA_STMT:
2,247✔
1056
      return authShowCreateRsma(pCxt, (SShowCreateRsmaStmt*)pStmt);
2,247✔
1057
    case QUERY_NODE_CREATE_DATABASE_STMT:
1,369,093✔
1058
      return authCreateDatabase(pCxt, (SCreateDatabaseStmt*)pStmt);
1,369,093✔
1059
    case QUERY_NODE_BALANCE_VGROUP_STMT:
11,532✔
1060
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_BALANCE);
11,532✔
1061
    case QUERY_NODE_BALANCE_VGROUP_LEADER_DATABASE_STMT:
2,238✔
1062
    case QUERY_NODE_BALANCE_VGROUP_LEADER_STMT:
1063
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_BALANCE_LEADER);
2,238✔
UNCOV
1064
    case QUERY_NODE_MERGE_VGROUP_STMT:
×
UNCOV
1065
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_MERGE);
×
1066
    case QUERY_NODE_SPLIT_VGROUP_STMT:
18,072✔
1067
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_SPLIT);
18,072✔
1068
    case QUERY_NODE_REDISTRIBUTE_VGROUP_STMT:
44,992✔
1069
      return authSysPrivileges(pCxt, pStmt, PRIV_VG_REDISTRIBUTE);
44,992✔
1070
    case QUERY_NODE_CREATE_FUNCTION_STMT:
11,750✔
1071
      return authSysPrivileges(pCxt, pStmt, PRIV_FUNC_CREATE);
11,750✔
1072
    case QUERY_NODE_DROP_FUNCTION_STMT:
6,766✔
1073
      return authSysPrivileges(pCxt, pStmt, PRIV_FUNC_DROP);
6,766✔
1074
    case QUERY_NODE_SHOW_FUNCTIONS_STMT:
8,942✔
1075
      return authSysPrivileges(pCxt, pStmt, PRIV_FUNC_SHOW);
8,942✔
1076
    case QUERY_NODE_GRANT_STMT:
813,875✔
1077
      return authGrant(pCxt, (SGrantStmt*)pStmt);
813,875✔
1078
    case QUERY_NODE_REVOKE_STMT:
440,028✔
1079
      return authRevoke(pCxt, (SRevokeStmt*)pStmt);
440,028✔
1080
    case QUERY_NODE_CREATE_DNODE_STMT:
281,835✔
1081
    case QUERY_NODE_CREATE_MNODE_STMT:
1082
    case QUERY_NODE_CREATE_QNODE_STMT:
1083
    case QUERY_NODE_CREATE_SNODE_STMT:
1084
    case QUERY_NODE_CREATE_BNODE_STMT:
1085
    case QUERY_NODE_CREATE_ANODE_STMT:
1086
    case QUERY_NODE_CREATE_XNODE_STMT:
1087
      return authSysPrivileges(pCxt, pStmt, PRIV_NODE_CREATE);
281,835✔
1088
    case QUERY_NODE_DROP_DNODE_STMT:
100,840✔
1089
    case QUERY_NODE_DROP_MNODE_STMT:
1090
    case QUERY_NODE_DROP_QNODE_STMT:
1091
    case QUERY_NODE_DROP_SNODE_STMT:
1092
    case QUERY_NODE_DROP_BNODE_STMT:
1093
    case QUERY_NODE_DROP_ANODE_STMT:
1094
    case QUERY_NODE_DROP_XNODE_STMT:
1095
      return authSysPrivileges(pCxt, pStmt, PRIV_NODE_DROP);
100,840✔
1096
    case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
437,392✔
1097
    case QUERY_NODE_SHOW_TRANSACTION_DETAILS_STMT:
1098
      return authSysPrivileges(pCxt, pStmt, PRIV_TRANS_SHOW);
437,392✔
1099
    case QUERY_NODE_KILL_TRANSACTION_STMT:
282✔
1100
      return authSysPrivileges(pCxt, pStmt, PRIV_TRANS_KILL);
282✔
1101
    case QUERY_NODE_SHOW_QUERIES_STMT:
1,384✔
1102
      return authSysPrivileges(pCxt, pStmt, PRIV_QUERY_SHOW);
1,384✔
1103
    case QUERY_NODE_KILL_QUERY_STMT:
42✔
1104
      return authSysPrivileges(pCxt, pStmt, PRIV_QUERY_KILL);
42✔
1105
    case QUERY_NODE_KILL_CONNECTION_STMT:
173✔
1106
      return authSysPrivileges(pCxt, pStmt, PRIV_CONN_KILL);
173✔
1107
    case QUERY_NODE_ALTER_DATABASE_STMT:
180,837✔
1108
      return authAlterDatabase(pCxt, (SAlterDatabaseStmt*)pStmt);
180,837✔
1109
    case QUERY_NODE_ALTER_LOCAL_STMT:
403,684✔
1110
      return authAlterLocal(pCxt, (SAlterLocalStmt*)pStmt);
403,684✔
1111
    case QUERY_NODE_DROP_DATABASE_STMT:
1,128,958✔
1112
      return authDropDatabase(pCxt, (SDropDatabaseStmt*)pStmt);
1,128,958✔
1113
    case QUERY_NODE_USE_DATABASE_STMT:
113,423,889✔
1114
      return authUseDatabase(pCxt, (SUseDatabaseStmt*)pStmt);
113,423,889✔
1115
    case QUERY_NODE_FLUSH_DATABASE_STMT:
1,780,659✔
1116
      return authObjPrivileges(pCxt, ((SFlushDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_FLUSH, PRIV_OBJ_DB);
1,780,659✔
1117
    case QUERY_NODE_COMPACT_DATABASE_STMT:
27,161✔
1118
      return authObjPrivileges(pCxt, ((SCompactDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_COMPACT, PRIV_OBJ_DB);
27,161✔
1119
    case QUERY_NODE_TRIM_DATABASE_STMT:
8,188✔
1120
      return authObjPrivileges(pCxt, ((STrimDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_TRIM, PRIV_OBJ_DB);
8,188✔
1121
    case QUERY_NODE_ROLLUP_DATABASE_STMT:
9,737✔
1122
      return authObjPrivileges(pCxt, ((SRollupDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_ROLLUP, PRIV_OBJ_DB);
9,737✔
1123
    case QUERY_NODE_SCAN_DATABASE_STMT:
104✔
1124
      return authObjPrivileges(pCxt, ((SScanDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_SCAN, PRIV_OBJ_DB);
104✔
UNCOV
1125
    case QUERY_NODE_SSMIGRATE_DATABASE_STMT:
×
UNCOV
1126
      return authObjPrivileges(pCxt, ((SSsMigrateDatabaseStmt*)pStmt)->dbName, NULL, PRIV_DB_SSMIGRATE, PRIV_OBJ_DB);
×
1127
    case QUERY_NODE_SHOW_USAGE_STMT:  // disk info
321✔
1128
      return authShowUsage(pCxt, (SShowStmt*)pStmt);
321✔
1129
    case QUERY_NODE_SHOW_APPS_STMT:
1,384✔
1130
      return authSysPrivileges(pCxt, pStmt, PRIV_APPS_SHOW);
1,384✔
1131
    case QUERY_NODE_SHOW_CLUSTER_STMT:
8,328✔
1132
      return authSysPrivileges(pCxt, pStmt, PRIV_CLUSTER_SHOW);
8,328✔
1133
      // check in mnode
1134
    case QUERY_NODE_SHOW_VGROUPS_STMT:
625,495✔
1135
    case QUERY_NODE_SHOW_VNODES_STMT:
1136
    case QUERY_NODE_SHOW_COMPACTS_STMT:
1137
    case QUERY_NODE_SHOW_RETENTIONS_STMT:
1138
    case QUERY_NODE_SHOW_SCANS_STMT:
1139
    case QUERY_NODE_SHOW_SSMIGRATES_STMT:
1140
      return TSDB_CODE_SUCCESS;
625,495✔
1141
    default:
122,909,340✔
1142
      break;
122,909,340✔
1143
  }
1144
#endif
1145
  return code;
122,909,340✔
1146
}
1147

1148
int32_t authenticate(SParseContext* pParseCxt, SQuery* pQuery, SParseMetaCache* pMetaCache) {
430,752,070✔
1149
  SAuthCxt cxt = {.pParseCxt = pParseCxt, .pMetaCache = pMetaCache, .errCode = TSDB_CODE_SUCCESS};
430,752,070✔
1150
  return authQuery(&cxt, pQuery->pRoot);
430,756,450✔
1151
}
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