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

taosdata / TDengine / #4818

20 Oct 2025 02:09AM UTC coverage: 61.04% (-0.1%) from 61.141%
#4818

push

travis-ci

web-flow
Merge e6f7b1ad7 into 7e74ade39

155148 of 324487 branches covered (47.81%)

Branch coverage included in aggregate %.

152 of 185 new or added lines in 22 files covered. (82.16%)

4700 existing lines in 117 files now uncovered.

207487 of 269610 relevant lines covered (76.96%)

127870039.14 hits per line

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

84.66
/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, AUTH_TYPE type,
1,262,333✔
38
                               bool isView, bool effective, SUserAuthInfo* pAuth) {
39
  if (effective) {
1,262,333✔
40
    snprintf(pAuth->user, sizeof(pAuth->user), "%s", pCxt->pEffectiveUser ? pCxt->pEffectiveUser : "");
41,258!
41
  } else {
42
    snprintf(pAuth->user, sizeof(pAuth->user), "%s", pCxt->pUser);
1,221,075✔
43
  }
44

45
  if (NULL == pTabName) {
1,262,333✔
46
    int32_t code = tNameSetDbName(&pAuth->tbName, pCxt->acctId, pDbName, strlen(pDbName));
121,067!
47
    if (TSDB_CODE_SUCCESS != code) return code;
121,067!
48
  } else {
49
    toName(pCxt->acctId, pDbName, pTabName, &pAuth->tbName);
1,141,266✔
50
  }
51
  pAuth->type = type;
1,262,333✔
52
  pAuth->isView = isView;
1,262,333✔
53
  return TSDB_CODE_SUCCESS;
1,262,333✔
54
}
55

56
static int32_t checkAuthImpl(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, AUTH_TYPE type, SNode** pCond,
201,846,499✔
57
                             bool isView, bool effective) {
58
  SParseContext* pParseCxt = pCxt->pParseCxt;
201,846,499✔
59
  if (pParseCxt->isSuperUser) {
201,846,845✔
60
    return TSDB_CODE_SUCCESS;
200,586,081✔
61
  }
62

63
  AUTH_RES_TYPE auth_res_type = isView ? AUTH_RES_VIEW : AUTH_RES_BASIC;
1,262,269✔
64
  SUserAuthInfo authInfo = {0};
1,262,269✔
65
  int32_t       code = setUserAuthInfo(pCxt->pParseCxt, pDbName, pTabName, type, isView, effective, &authInfo);
1,262,269✔
66
  if (TSDB_CODE_SUCCESS != code) return code;
1,262,333!
67
  SUserAuthRes authRes = {0};
1,262,333✔
68
  if (NULL != pCxt->pMetaCache) {
1,262,333✔
69
    code = getUserAuthFromCache(pCxt->pMetaCache, &authInfo, &authRes);
1,253,973✔
70
#ifdef TD_ENTERPRISE
71
    if (isView && TSDB_CODE_PAR_INTERNAL_ERROR == code) {
1,253,973✔
72
      authInfo.isView = false;
61,541✔
73
      code = getUserAuthFromCache(pCxt->pMetaCache, &authInfo, &authRes);
61,541✔
74
    }
75
#endif
76
  } else {
77
    SRequestConnInfo conn = {.pTrans = pParseCxt->pTransporter,
8,360✔
78
                             .requestId = pParseCxt->requestId,
8,360✔
79
                             .requestObjRefId = pParseCxt->requestRid,
8,360✔
80
                             .mgmtEps = pParseCxt->mgmtEpSet};
81
    code = catalogChkAuth(pParseCxt->pCatalog, &conn, &authInfo, &authRes);
8,360✔
82
  }
83
  if (TSDB_CODE_SUCCESS == code && NULL != pCond) {
1,262,333!
84
    *pCond = authRes.pCond[auth_res_type];
352,944✔
85
  }
86
  return TSDB_CODE_SUCCESS == code ? (authRes.pass[auth_res_type] ? TSDB_CODE_SUCCESS : TSDB_CODE_PAR_PERMISSION_DENIED)
1,262,333!
87
                                   : code;
2,509,048!
88
}
89

90
static int32_t checkAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, AUTH_TYPE type, SNode** pCond) {
201,372,751✔
91
  return checkAuthImpl(pCxt, pDbName, pTabName, type, pCond, false, false);
201,372,751✔
92
}
93

94
static int32_t checkEffectiveAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, AUTH_TYPE type,
26,786✔
95
                                  SNode** pCond) {
96
  return checkAuthImpl(pCxt, pDbName, pTabName, type, NULL, false, true);
26,786✔
97
}
98

99
static int32_t checkViewAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, AUTH_TYPE type, SNode** pCond) {
441,648✔
100
  return checkAuthImpl(pCxt, pDbName, pTabName, type, NULL, true, false);
441,648✔
101
}
102

103
static int32_t checkViewEffectiveAuth(SAuthCxt* pCxt, const char* pDbName, const char* pTabName, AUTH_TYPE type,
14,472✔
104
                                      SNode** pCond) {
105
  return checkAuthImpl(pCxt, pDbName, pTabName, type, NULL, true, true);
14,472✔
106
}
107

108
static EDealRes authSubquery(SAuthCxt* pCxt, SNode* pStmt) {
14,486,078✔
109
  return TSDB_CODE_SUCCESS == authQuery(pCxt, pStmt) ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
14,486,078!
110
}
111

112
static int32_t mergeStableTagCond(SNode** pWhere, SNode* pTagCond) {
157✔
113
  SLogicConditionNode* pLogicCond = NULL;
157✔
114
  int32_t              code = nodesMakeNode(QUERY_NODE_LOGIC_CONDITION, (SNode**)&pLogicCond);
157✔
115
  if (NULL == pLogicCond) {
157!
116
    return code;
×
117
  }
118
  pLogicCond->node.resType.type = TSDB_DATA_TYPE_BOOL;
157✔
119
  pLogicCond->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_BOOL].bytes;
157✔
120
  pLogicCond->condType = LOGIC_COND_TYPE_AND;
157✔
121
  code = nodesListMakeStrictAppend(&pLogicCond->pParameterList, pTagCond);
157✔
122
  if (TSDB_CODE_SUCCESS == code) {
157!
123
    code = nodesListMakeAppend(&pLogicCond->pParameterList, *pWhere);
157✔
124
  }
125
  if (TSDB_CODE_SUCCESS == code) {
157!
126
    *pWhere = (SNode*)pLogicCond;
157✔
127
  } else {
128
    nodesDestroyNode((SNode*)pLogicCond);
×
129
  }
130
  return code;
157✔
131
}
132

133
EDealRes rewriteAuthTable(SNode* pNode, void* pContext) {
54,204✔
134
  if (QUERY_NODE_COLUMN == nodeType(pNode)) {
54,204✔
135
    SColumnNode*     pCol = (SColumnNode*)pNode;
17,914✔
136
    SAuthRewriteCxt* pCxt = (SAuthRewriteCxt*)pContext;
17,914✔
137
    tstrncpy(pCol->tableName, pCxt->pTarget->tableName, TSDB_TABLE_NAME_LEN);
17,914!
138
    tstrncpy(pCol->tableAlias, pCxt->pTarget->tableAlias, TSDB_TABLE_NAME_LEN);
17,914!
139
  }
140

141
  return DEAL_RES_CONTINUE;
54,204✔
142
}
143

144
static int32_t rewriteAppendStableTagCond(SNode** pWhere, SNode* pTagCond, STableNode* pTable) {
17,452✔
145
  SNode*  pTagCondCopy = NULL;
17,452✔
146
  int32_t code = nodesCloneNode(pTagCond, &pTagCondCopy);
17,452✔
147
  if (NULL == pTagCondCopy) {
17,452!
148
    return code;
×
149
  }
150

151
  SAuthRewriteCxt cxt = {.pTarget = pTable};
17,452✔
152
  nodesWalkExpr(pTagCondCopy, rewriteAuthTable, &cxt);
17,452✔
153

154
  if (NULL == *pWhere) {
17,452✔
155
    *pWhere = pTagCondCopy;
17,295✔
156
    return TSDB_CODE_SUCCESS;
17,295✔
157
  }
158

159
  if (QUERY_NODE_LOGIC_CONDITION == nodeType(*pWhere) &&
157!
160
      LOGIC_COND_TYPE_AND == ((SLogicConditionNode*)*pWhere)->condType) {
×
161
    return nodesListStrictAppend(((SLogicConditionNode*)*pWhere)->pParameterList, pTagCondCopy);
×
162
  }
163

164
  return mergeStableTagCond(pWhere, pTagCondCopy);
157✔
165
}
166

167
static EDealRes authSelectImpl(SNode* pNode, void* pContext) {
1,548,135,796✔
168
  SSelectAuthCxt* pCxt = pContext;
1,548,135,796✔
169
  SAuthCxt*       pAuthCxt = pCxt->pAuthCxt;
1,548,135,796✔
170
  bool            isView = false;
1,548,135,796✔
171
  if (QUERY_NODE_REAL_TABLE == nodeType(pNode)) {
1,548,135,796✔
172
    SNode*      pTagCond = NULL;
126,992,342✔
173
    STableNode* pTable = (STableNode*)pNode;
126,991,643✔
174
#ifdef TD_ENTERPRISE
175
    SName name = {0};
126,991,643✔
176
    toName(pAuthCxt->pParseCxt->acctId, pTable->dbName, pTable->tableName, &name);
126,992,342✔
177
    STableMeta* pTableMeta = NULL;
126,992,789✔
178
    toName(pAuthCxt->pParseCxt->acctId, pTable->dbName, pTable->tableName, &name);
126,993,135✔
179
    int32_t code = getTargetMetaImpl(pAuthCxt->pParseCxt, pAuthCxt->pMetaCache, &name, &pTableMeta, true);
126,993,080✔
180
    if (TSDB_CODE_SUCCESS == code && TSDB_VIEW_TABLE == pTableMeta->tableType) {
126,988,302✔
181
      isView = true;
300,438✔
182
    }
183
    taosMemoryFree(pTableMeta);
126,990,505!
184
#endif
185
    if (!isView) {
126,989,018✔
186
      pAuthCxt->errCode = checkAuth(pAuthCxt, pTable->dbName, pTable->tableName, AUTH_TYPE_READ, &pTagCond);
126,688,580✔
187
      if (TSDB_CODE_SUCCESS != pAuthCxt->errCode && NULL != pAuthCxt->pParseCxt->pEffectiveUser) {
126,691,728✔
188
        pAuthCxt->errCode = checkEffectiveAuth(pAuthCxt, pTable->dbName, pTable->tableName, AUTH_TYPE_READ, NULL);
26,786✔
189
      }
190
      if (TSDB_CODE_SUCCESS == pAuthCxt->errCode && NULL != pTagCond) {
126,692,375✔
191
        pAuthCxt->errCode = rewriteAppendStableTagCond(&pCxt->pSelect->pWhere, pTagCond, pTable);
17,452✔
192
      }
193
    } else {
194
      pAuthCxt->errCode = checkViewAuth(pAuthCxt, pTable->dbName, pTable->tableName, AUTH_TYPE_READ, NULL);
300,438✔
195
      if (TSDB_CODE_SUCCESS != pAuthCxt->errCode && NULL != pAuthCxt->pParseCxt->pEffectiveUser) {
300,438✔
196
        pAuthCxt->errCode = checkViewEffectiveAuth(pAuthCxt, pTable->dbName, pTable->tableName, AUTH_TYPE_READ, NULL);
14,472✔
197
      }
198
    }
199
    return TSDB_CODE_SUCCESS == pAuthCxt->errCode ? DEAL_RES_CONTINUE : DEAL_RES_ERROR;
126,992,806✔
200
  } else if (QUERY_NODE_TEMP_TABLE == nodeType(pNode)) {
1,421,147,967✔
201
    return authSubquery(pAuthCxt, ((STempTableNode*)pNode)->pSubquery);
14,486,986✔
202
  }
203
  return DEAL_RES_CONTINUE;
1,406,660,287✔
204
}
205

206
static int32_t authSelect(SAuthCxt* pCxt, SSelectStmt* pSelect) {
134,610,230✔
207
  SSelectAuthCxt cxt = {.pAuthCxt = pCxt, .pSelect = pSelect};
134,610,230✔
208
  nodesWalkSelectStmt(pSelect, SQL_CLAUSE_FROM, authSelectImpl, &cxt);
134,610,929✔
209
  return pCxt->errCode;
134,611,877✔
210
}
211

212
static int32_t authSetOperator(SAuthCxt* pCxt, SSetOperator* pSetOper) {
4,516,866✔
213
  int32_t code = authQuery(pCxt, pSetOper->pLeft);
4,516,866✔
214
  if (TSDB_CODE_SUCCESS == code) {
4,516,866!
215
    code = authQuery(pCxt, pSetOper->pRight);
4,516,866✔
216
  }
217
  return code;
4,516,866✔
218
}
219

220
static int32_t authDropUser(SAuthCxt* pCxt, SDropUserStmt* pStmt) {
29,783✔
221
  if (!pCxt->pParseCxt->isSuperUser || 0 == strcmp(pStmt->userName, TSDB_DEFAULT_USER)) {
29,783!
222
    return TSDB_CODE_PAR_PERMISSION_DENIED;
967✔
223
  }
224
  return TSDB_CODE_SUCCESS;
28,816✔
225
}
226

227
static int32_t authDelete(SAuthCxt* pCxt, SDeleteStmt* pDelete) {
3,314,630✔
228
  SNode*      pTagCond = NULL;
3,314,630✔
229
  STableNode* pTable = (STableNode*)pDelete->pFromTable;
3,314,630✔
230
  int32_t     code = checkAuth(pCxt, pTable->dbName, pTable->tableName, AUTH_TYPE_WRITE, &pTagCond);
3,314,630✔
231
  if (TSDB_CODE_SUCCESS == code && NULL != pTagCond) {
3,314,630!
232
    code = rewriteAppendStableTagCond(&pDelete->pWhere, pTagCond, pTable);
×
233
  }
234
  return code;
3,314,630✔
235
}
236

237
static int32_t authInsert(SAuthCxt* pCxt, SInsertStmt* pInsert) {
89,170✔
238
  SNode*      pTagCond = NULL;
89,170✔
239
  STableNode* pTable = (STableNode*)pInsert->pTable;
89,170✔
240
  // todo check tag condition for subtable
241
  int32_t code = checkAuth(pCxt, pTable->dbName, pTable->tableName, AUTH_TYPE_WRITE, &pTagCond);
89,170✔
242
  if (TSDB_CODE_SUCCESS == code) {
89,170!
243
    code = authQuery(pCxt, pInsert->pQuery);
89,170✔
244
  }
245
  return code;
89,170✔
246
}
247

248
static int32_t authShowTables(SAuthCxt* pCxt, SShowStmt* pStmt) {
684,150✔
249
  return checkAuth(pCxt, ((SValueNode*)pStmt->pDbName)->literal, NULL, AUTH_TYPE_READ_OR_WRITE, NULL);
684,150✔
250
}
251

252
static int32_t authShowVtables(SAuthCxt* pCxt, SShowStmt* pStmt) { return authShowTables(pCxt, pStmt); }
71,472✔
253

254
static int32_t authShowUsage(SAuthCxt* pCxt, SShowStmt* pStmt) {
×
255
  return checkAuth(pCxt, ((SValueNode*)pStmt->pDbName)->literal, NULL, AUTH_TYPE_READ_OR_WRITE, NULL);
×
256
}
257

258
static int32_t authShowCreateTable(SAuthCxt* pCxt, SShowCreateTableStmt* pStmt) {
123,240✔
259
  SNode* pTagCond = NULL;
123,240✔
260
  // todo check tag condition for subtable
261
  return checkAuth(pCxt, pStmt->dbName, pStmt->tableName, AUTH_TYPE_READ, &pTagCond);
123,240✔
262
}
263

264
static int32_t authShowCreateView(SAuthCxt* pCxt, SShowCreateViewStmt* pStmt) {
×
265
#ifndef TD_ENTERPRISE
266
  return TSDB_CODE_OPS_NOT_SUPPORT;
267
#endif
268

269
  return TSDB_CODE_SUCCESS;
×
270
}
271

272
static int32_t authCreateTable(SAuthCxt* pCxt, SCreateTableStmt* pStmt) {
4,649,248✔
273
  SNode* pTagCond = NULL;
4,649,248✔
274
  // todo check tag condition for subtable
275
  return checkAuth(pCxt, pStmt->dbName, NULL, AUTH_TYPE_WRITE, &pTagCond);
4,649,248✔
276
}
277

278
static int32_t authCreateVTable(SAuthCxt* pCxt, SCreateVTableStmt* pStmt) {
160,355✔
279
  PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, NULL, AUTH_TYPE_WRITE, NULL));
160,355✔
280
  SNode* pCol = NULL;
147,987✔
281
  FOREACH(pCol, pStmt->pCols) {
1,709,389!
282
    SColumnDefNode* pColDef = (SColumnDefNode*)pCol;
1,570,678✔
283
    if (NULL == pColDef) {
1,570,678!
284
      PAR_ERR_RET(TSDB_CODE_PAR_INVALID_COLUMN);
×
285
    }
286
    SColumnOptions* pOptions = (SColumnOptions*)pColDef->pOptions;
1,570,678✔
287
    if (pOptions && pOptions->hasRef) {
1,570,678!
288
      PAR_ERR_RET(checkAuth(pCxt, pOptions->refDb, pOptions->refTable, AUTH_TYPE_READ, NULL));
849,597✔
289
    }
290
  }
291
  return TSDB_CODE_SUCCESS;
138,711✔
292
}
293

294
static int32_t authCreateVSubTable(SAuthCxt* pCxt, SCreateVSubTableStmt* pStmt) {
340,923✔
295
  int32_t    code = TSDB_CODE_SUCCESS;
340,923✔
296
  SNode*     pNode = NULL;
340,923✔
297
  SNodeList* pTmpList = pStmt->pSpecificColRefs ? pStmt->pSpecificColRefs : pStmt->pColRefs;
340,923✔
298
  PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, NULL, AUTH_TYPE_WRITE, NULL));
340,923✔
299
  if (NULL == pTmpList) {
328,555✔
300
    // no column reference
301
    return TSDB_CODE_SUCCESS;
4,704✔
302
  }
303

304
  FOREACH(pNode, pTmpList) {
2,170,171!
305
    SColumnRefNode* pColRef = (SColumnRefNode*)pNode;
1,855,596✔
306
    if (NULL == pColRef) {
1,855,596!
307
      PAR_ERR_RET(TSDB_CODE_PAR_INVALID_COLUMN);
×
308
    }
309
    PAR_ERR_RET(checkAuth(pCxt, pColRef->refDbName, pColRef->refTableName, AUTH_TYPE_READ, NULL));
1,855,596✔
310
  }
311
  return code;
314,575✔
312
}
313

314
static int32_t authCreateStream(SAuthCxt* pCxt, SCreateStreamStmt* pStmt) {
526,704✔
315
  int32_t   code = TSDB_CODE_SUCCESS;
526,704✔
316

317
  if (IS_SYS_DBNAME(pStmt->streamDbName)) {
526,704!
318
    return TSDB_CODE_PAR_PERMISSION_DENIED;
×
319
  }
320
  if (IS_SYS_DBNAME(pStmt->targetDbName)) {
526,704!
321
    return TSDB_CODE_PAR_PERMISSION_DENIED;
117✔
322
  }
323
  if (pStmt->pTrigger) {
526,587!
324
    SStreamTriggerNode *pTrigger = (SStreamTriggerNode*)pStmt->pTrigger;
526,587✔
325
    STableNode* pTriggerTable = (STableNode*)pTrigger->pTrigerTable;
526,587✔
326
    if (pTriggerTable && IS_SYS_DBNAME(pTriggerTable->dbName)) {
526,587!
327
      return TSDB_CODE_PAR_PERMISSION_DENIED;
117✔
328
    }
329
  }
330
  return code;
526,470✔
331
}
332

333
static int32_t authCreateMultiTable(SAuthCxt* pCxt, SCreateMultiTablesStmt* pStmt) {
31,777,071✔
334
  int32_t code = TSDB_CODE_SUCCESS;
31,777,071✔
335
  SNode*  pNode = NULL;
31,777,071✔
336
  FOREACH(pNode, pStmt->pSubTables) {
67,314,214!
337
    if (pNode->type == QUERY_NODE_CREATE_SUBTABLE_CLAUSE) {
35,541,091!
338
      SCreateSubTableClause* pClause = (SCreateSubTableClause*)pNode;
35,541,331✔
339
      code = checkAuth(pCxt, pClause->dbName, NULL, AUTH_TYPE_WRITE, NULL);
35,541,331✔
340
      if (TSDB_CODE_SUCCESS != code) {
35,537,654✔
341
        break;
511✔
342
      }
343
    } else {
UNCOV
344
      SCreateSubTableFromFileClause* pClause = (SCreateSubTableFromFileClause*)pNode;
×
UNCOV
345
      code = checkAuth(pCxt, pClause->useDbName, NULL, AUTH_TYPE_WRITE, NULL);
×
UNCOV
346
      if (TSDB_CODE_SUCCESS != code) {
×
347
        break;
×
348
      }
349
    }
350
  }
351
  return code;
31,774,906✔
352
}
353

354
static int32_t authDropTable(SAuthCxt* pCxt, SDropTableStmt* pStmt) {
10,175,147✔
355
  int32_t code = TSDB_CODE_SUCCESS;
10,175,147✔
356
  if (pStmt->withOpt && !pCxt->pParseCxt->isSuperUser) {
10,175,147!
357
    return TSDB_CODE_PAR_PERMISSION_DENIED;
936✔
358
  }
359
  SNode* pNode = NULL;
10,174,211✔
360
  FOREACH(pNode, pStmt->pTables) {
20,746,596!
361
    SDropTableClause* pClause = (SDropTableClause*)pNode;
10,572,542✔
362
    code = checkAuth(pCxt, pClause->dbName, pClause->tableName, AUTH_TYPE_WRITE, NULL);
10,572,542✔
363
    if (TSDB_CODE_SUCCESS != code) {
10,572,542✔
364
      break;
157✔
365
    }
366
  }
367
  return code;
10,174,211✔
368
}
369

370
static int32_t authDropStable(SAuthCxt* pCxt, SDropSuperTableStmt* pStmt) {
260,826✔
371
  if (pStmt->withOpt && !pCxt->pParseCxt->isSuperUser) {
260,826!
372
    return TSDB_CODE_PAR_PERMISSION_DENIED;
468✔
373
  }
374
  return checkAuth(pCxt, pStmt->dbName, pStmt->tableName, AUTH_TYPE_WRITE, NULL);
260,358✔
375
}
376

377
static int32_t authDropVtable(SAuthCxt* pCxt, SDropVirtualTableStmt* pStmt) {
87,886✔
378
  if (pStmt->withOpt && !pCxt->pParseCxt->isSuperUser) {
87,886!
379
    return TSDB_CODE_PAR_PERMISSION_DENIED;
×
380
  }
381
  return checkAuth(pCxt, pStmt->dbName, pStmt->tableName, AUTH_TYPE_WRITE, NULL);
87,886✔
382
}
383

384
static int32_t authAlterTable(SAuthCxt* pCxt, SAlterTableStmt* pStmt) {
15,310,095✔
385
  SNode* pTagCond = NULL;
15,310,095✔
386
  // todo check tag condition for subtable
387
  return checkAuth(pCxt, pStmt->dbName, pStmt->tableName, AUTH_TYPE_WRITE, NULL);
15,310,095✔
388
}
389

390
static int32_t authAlterVTable(SAuthCxt* pCxt, SAlterTableStmt* pStmt) {
466,711✔
391
  PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, pStmt->tableName, AUTH_TYPE_WRITE, NULL));
466,711✔
392
  if (pStmt->alterType == TSDB_ALTER_TABLE_ADD_COLUMN_WITH_COLUMN_REF ||
398,599✔
393
      pStmt->alterType == TSDB_ALTER_TABLE_ALTER_COLUMN_REF) {
363,769✔
394
    PAR_ERR_RET(checkAuth(pCxt, pStmt->dbName, pStmt->refTableName, AUTH_TYPE_READ, NULL));
155,557✔
395
  }
396
  PAR_RET(TSDB_CODE_SUCCESS);
373,831!
397
}
398

399
static int32_t authCreateView(SAuthCxt* pCxt, SCreateViewStmt* pStmt) {
220,904✔
400
#ifndef TD_ENTERPRISE
401
  return TSDB_CODE_OPS_NOT_SUPPORT;
402
#endif
403
  return checkAuth(pCxt, pStmt->dbName, NULL, AUTH_TYPE_WRITE, NULL);
220,904✔
404
}
405

406
static int32_t authDropView(SAuthCxt* pCxt, SDropViewStmt* pStmt) {
141,210✔
407
#ifndef TD_ENTERPRISE
408
  return TSDB_CODE_OPS_NOT_SUPPORT;
409
#endif
410
  return checkViewAuth(pCxt, pStmt->dbName, pStmt->viewName, AUTH_TYPE_ALTER, NULL);
141,210✔
411
}
412

413
static int32_t authCreateRsma(SAuthCxt* pCxt, SCreateRsmaStmt* pStmt) {
75,924✔
414
  return TSDB_CODE_SUCCESS;
75,924✔
415
}
416

417
static int32_t authDropRsma(SAuthCxt* pCxt, SDropRsmaStmt* pStmt) {
1,539✔
418
  return TSDB_CODE_SUCCESS;
1,539✔
419
}
420

421
static int32_t authQuery(SAuthCxt* pCxt, SNode* pStmt) {
232,636,912✔
422
  switch (nodeType(pStmt)) {
232,636,912✔
423
    case QUERY_NODE_SET_OPERATOR:
4,516,866✔
424
      return authSetOperator(pCxt, (SSetOperator*)pStmt);
4,516,866✔
425
    case QUERY_NODE_SELECT_STMT:
134,610,126✔
426
      return authSelect(pCxt, (SSelectStmt*)pStmt);
134,610,126✔
427
    case QUERY_NODE_DROP_USER_STMT:
29,783✔
428
      return authDropUser(pCxt, (SDropUserStmt*)pStmt);
29,783✔
429
    case QUERY_NODE_DELETE_STMT:
3,314,630✔
430
      return authDelete(pCxt, (SDeleteStmt*)pStmt);
3,314,630✔
431
    case QUERY_NODE_INSERT_STMT:
89,170✔
432
      return authInsert(pCxt, (SInsertStmt*)pStmt);
89,170✔
433
    case QUERY_NODE_CREATE_TABLE_STMT:
4,649,248✔
434
      return authCreateTable(pCxt, (SCreateTableStmt*)pStmt);
4,649,248✔
435
    case QUERY_NODE_CREATE_VIRTUAL_TABLE_STMT:
160,355✔
436
      return authCreateVTable(pCxt, (SCreateVTableStmt*)pStmt);
160,355✔
437
    case QUERY_NODE_CREATE_VIRTUAL_SUBTABLE_STMT:
340,923✔
438
      return authCreateVSubTable(pCxt, (SCreateVSubTableStmt*)pStmt);
340,923✔
439
    case QUERY_NODE_CREATE_MULTI_TABLES_STMT:
31,777,071✔
440
      return authCreateMultiTable(pCxt, (SCreateMultiTablesStmt*)pStmt);
31,777,071✔
441
    case QUERY_NODE_CREATE_STREAM_STMT:
526,704✔
442
      return authCreateStream(pCxt, (SCreateStreamStmt*)pStmt);
526,704✔
443
    case QUERY_NODE_DROP_TABLE_STMT:
10,175,147✔
444
      return authDropTable(pCxt, (SDropTableStmt*)pStmt);
10,175,147✔
445
    case QUERY_NODE_DROP_SUPER_TABLE_STMT:
260,826✔
446
      return authDropStable(pCxt, (SDropSuperTableStmt*)pStmt);
260,826✔
447
    case QUERY_NODE_DROP_VIRTUAL_TABLE_STMT:
87,886✔
448
      return authDropVtable(pCxt, (SDropVirtualTableStmt*)pStmt);
87,886✔
449
    case QUERY_NODE_ALTER_TABLE_STMT:
15,310,095✔
450
    case QUERY_NODE_ALTER_SUPER_TABLE_STMT:
451
      return authAlterTable(pCxt, (SAlterTableStmt*)pStmt);
15,310,095✔
452
    case QUERY_NODE_ALTER_VIRTUAL_TABLE_STMT:
466,711✔
453
      return authAlterVTable(pCxt, (SAlterTableStmt*)pStmt);
466,711✔
454
    case QUERY_NODE_SHOW_DNODES_STMT:
1,582,593✔
455
    case QUERY_NODE_SHOW_MNODES_STMT:
456
    case QUERY_NODE_SHOW_MODULES_STMT:
457
    case QUERY_NODE_SHOW_QNODES_STMT:
458
    case QUERY_NODE_SHOW_SNODES_STMT:
459
    case QUERY_NODE_SHOW_BACKUP_NODES_STMT:
460
    case QUERY_NODE_SHOW_CLUSTER_STMT:
461
    case QUERY_NODE_SHOW_LICENCES_STMT:
462
    case QUERY_NODE_SHOW_VGROUPS_STMT:
463
    case QUERY_NODE_SHOW_DB_ALIVE_STMT:
464
    case QUERY_NODE_SHOW_CLUSTER_ALIVE_STMT:
465
    case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
466
    case QUERY_NODE_SHOW_TABLE_DISTRIBUTED_STMT:
467
    case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
468
    case QUERY_NODE_SHOW_VNODES_STMT:
469
    case QUERY_NODE_SHOW_SCORES_STMT:
470
    case QUERY_NODE_SHOW_USERS_STMT:
471
    case QUERY_NODE_SHOW_USERS_FULL_STMT:
472
    case QUERY_NODE_SHOW_USER_PRIVILEGES_STMT:
473
    case QUERY_NODE_SHOW_GRANTS_FULL_STMT:
474
    case QUERY_NODE_SHOW_GRANTS_LOGS_STMT:
475
    case QUERY_NODE_SHOW_CLUSTER_MACHINES_STMT:
476
    case QUERY_NODE_SHOW_ARBGROUPS_STMT:
477
    case QUERY_NODE_SHOW_ENCRYPTIONS_STMT:
478
    case QUERY_NODE_SHOW_MOUNTS_STMT:
479
      return !pCxt->pParseCxt->enableSysInfo ? TSDB_CODE_PAR_PERMISSION_DENIED : TSDB_CODE_SUCCESS;
1,582,593✔
480
    case QUERY_NODE_SHOW_USAGE_STMT:
1,838✔
481
    case QUERY_NODE_SHOW_ANODES_STMT:
482
    case QUERY_NODE_SHOW_ANODES_FULL_STMT:
483
      return TSDB_CODE_SUCCESS;
1,838✔
484
    case QUERY_NODE_SHOW_TABLES_STMT:
612,678✔
485
    case QUERY_NODE_SHOW_STABLES_STMT:
486
      return authShowTables(pCxt, (SShowStmt*)pStmt);
612,678✔
487
    case QUERY_NODE_SHOW_VTABLES_STMT:
71,472✔
488
      return authShowVtables(pCxt, (SShowStmt*)pStmt);
71,472✔
489
    case QUERY_NODE_SHOW_CREATE_TABLE_STMT:
123,240✔
490
    case QUERY_NODE_SHOW_CREATE_VTABLE_STMT:
491
    case QUERY_NODE_SHOW_CREATE_STABLE_STMT:
492
      return authShowCreateTable(pCxt, (SShowCreateTableStmt*)pStmt);
123,240✔
493
      //    case QUERY_NODE_SHOW_CREATE_VIEW_STMT:
494
      //      return authShowCreateView(pCxt, (SShowCreateViewStmt*)pStmt);
495
    case QUERY_NODE_CREATE_VIEW_STMT:
220,904✔
496
      return authCreateView(pCxt, (SCreateViewStmt*)pStmt);
220,904✔
497
    case QUERY_NODE_DROP_VIEW_STMT:
141,210✔
498
      return authDropView(pCxt, (SDropViewStmt*)pStmt);
141,210✔
499
    case QUERY_NODE_CREATE_RSMA_STMT:
75,924✔
500
      return authCreateRsma(pCxt, (SCreateRsmaStmt*)pStmt);
75,924✔
501
    case QUERY_NODE_DROP_RSMA_STMT:
3,750✔
502
      return authDropRsma(pCxt, (SDropRsmaStmt*)pStmt);
3,750✔
503
    default:
23,487,755✔
504
      break;
23,487,755✔
505
  }
506

507
  return TSDB_CODE_SUCCESS;
23,487,755✔
508
}
509

510
int32_t authenticate(SParseContext* pParseCxt, SQuery* pQuery, SParseMetaCache* pMetaCache) {
209,026,341✔
511
  SAuthCxt cxt = {.pParseCxt = pParseCxt, .pMetaCache = pMetaCache, .errCode = TSDB_CODE_SUCCESS};
209,026,341✔
512
  return authQuery(&cxt, pQuery->pRoot);
209,026,779✔
513
}
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