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

taosdata / TDengine / #4944

30 Jan 2026 06:19AM UTC coverage: 66.849% (+0.1%) from 66.718%
#4944

push

travis-ci

web-flow
merge: from main to 3.0 #34453

1124 of 2018 new or added lines in 72 files covered. (55.7%)

13677 existing lines in 155 files now uncovered.

205211 of 306978 relevant lines covered (66.85%)

125657591.7 hits per line

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

71.29
/source/dnode/mnode/impl/src/mndRole.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
#define _DEFAULT_SOURCE
17
// clang-format off
18
#ifndef TD_ASTRA
19
#include <uv.h>
20
#endif
21
#include "crypt.h"
22
#include "mndRole.h"
23
#include "mndUser.h"
24
#include "audit.h"
25
#include "mndDb.h"
26
#include "mndMnode.h"
27
#include "mndPrivilege.h"
28
#include "mndShow.h"
29
#include "mndStb.h"
30
#include "mndSync.h"
31
#include "mndTopic.h"
32
#include "mndTrans.h"
33
#include "tbase64.h"
34

35
// clang-format on
36

37
#define MND_ROLE_VER_NUMBER  1
38
#define MND_ROLE_SYSROLE_VER PRIV_INFO_TABLE_VERSION
39

40
static SRoleMgmt roleMgmt = {0};
41

42
static int32_t  mndCreateDefaultRoles(SMnode *pMnode);
43
static int32_t  mndUpgradeDefaultRoles(SMnode *pMnode, int32_t version);
44
static SSdbRow *mndRoleActionDecode(SSdbRaw *pRaw);
45
static int32_t  mndRoleActionInsert(SSdb *pSdb, SRoleObj *pRole);
46
static int32_t  mndRoleActionDelete(SSdb *pSdb, SRoleObj *pRole);
47
static int32_t  mndRoleActionUpdate(SSdb *pSdb, SRoleObj *pOld, SRoleObj *pNew);
48
static int32_t  mndCreateRole(SMnode *pMnode, char *acct, SCreateRoleReq *pCreate, SRpcMsg *pReq);
49
static int32_t  mndProcessCreateRoleReq(SRpcMsg *pReq);
50
static int32_t  mndProcessAlterRoleReq(SRpcMsg *pReq);
51
static int32_t  mndProcessDropRoleReq(SRpcMsg *pReq);
52
static int32_t  mndProcessUpgradeRoleReq(SRpcMsg *pReq);
53
static int32_t  mndProcessUpgradeRoleRsp(SRpcMsg *pReq);
54
static int32_t  mndProcessGetRoleAuthReq(SRpcMsg *pReq);
55
static int32_t  mndRetrieveRoles(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
56
static void     mndCancelGetNextRole(SMnode *pMnode, void *pIter);
57
static int32_t  mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
58
static void     mndCancelGetNextPrivileges(SMnode *pMnode, void *pIter);
59
static int32_t  mndRetrieveColPrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
60
static void     mndCancelGetNextColPrivileges(SMnode *pMnode, void *pIter);
61

62
int32_t mndInitRole(SMnode *pMnode) {
414,379✔
63
  // role management init
64
  roleMgmt.lastUpd = taosGetTimestampMs();
414,379✔
65
  TAOS_CHECK_RETURN(taosThreadRwlockInit(&roleMgmt.rw, NULL));
414,379✔
66

67
  SSdbTable table = {
414,379✔
68
      .sdbType = SDB_ROLE,
69
      .keyType = SDB_KEY_BINARY,
70
      .deployFp = (SdbDeployFp)mndCreateDefaultRoles,
71
      .upgradeFp = (SdbUpgradeFp)mndUpgradeDefaultRoles,
72
      .encodeFp = (SdbEncodeFp)mndRoleActionEncode,
73
      .decodeFp = (SdbDecodeFp)mndRoleActionDecode,
74
      .insertFp = (SdbInsertFp)mndRoleActionInsert,
75
      .updateFp = (SdbUpdateFp)mndRoleActionUpdate,
76
      .deleteFp = (SdbDeleteFp)mndRoleActionDelete,
77
  };
78

79
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_ROLE, mndProcessCreateRoleReq);
414,379✔
80
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_ROLE, mndProcessDropRoleReq);
414,379✔
81
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_ROLE, mndProcessAlterRoleReq);
414,379✔
82
  mndSetMsgHandle(pMnode, TDMT_MND_UPGRADE_ROLE, mndProcessUpgradeRoleReq);
414,379✔
83
  mndSetMsgHandle(pMnode, TDMT_MND_UPGRADE_ROLE_RSP, mndProcessUpgradeRoleRsp);
414,379✔
84

85
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_ROLE, mndRetrieveRoles);
414,379✔
86
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_ROLE, mndCancelGetNextRole);
414,379✔
87
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_ROLE_PRIVILEGES, mndRetrievePrivileges);
414,379✔
88
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_ROLE_PRIVILEGES, mndCancelGetNextPrivileges);
414,379✔
89
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_ROLE_COL_PRIVILEGES, mndRetrieveColPrivileges);
414,379✔
90
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_ROLE_COL_PRIVILEGES, mndCancelGetNextColPrivileges);
414,379✔
91
  return sdbSetTable(pMnode->pSdb, table);
414,379✔
92
}
93

94
void mndCleanupRole(SMnode *pMnode) { (void)taosThreadRwlockDestroy(&roleMgmt.rw); }
414,319✔
95

UNCOV
96
int64_t mndGetRoleLastUpd() {
×
97
  int64_t lastUpd;
UNCOV
98
  (void)taosThreadRwlockRdlock(&roleMgmt.rw);
×
UNCOV
99
  lastUpd = roleMgmt.lastUpd;
×
UNCOV
100
  (void)taosThreadRwlockUnlock(&roleMgmt.rw);
×
UNCOV
101
  return lastUpd;
×
102
}
103

104
void mndSetRoleLastUpd(int64_t updateTime) {
1,162✔
105
  (void)taosThreadRwlockWrlock(&roleMgmt.rw);
1,162✔
106
  roleMgmt.lastUpd = updateTime;
1,162✔
107
  (void)taosThreadRwlockUnlock(&roleMgmt.rw);
1,162✔
108
}
1,162✔
109

UNCOV
110
bool mndNeedRetrieveRole(SUserObj *pUser) {
×
UNCOV
111
  bool result = false;
×
UNCOV
112
  if (taosHashGetSize(pUser->roles) > 0) {
×
UNCOV
113
    (void)taosThreadRwlockRdlock(&roleMgmt.rw);
×
UNCOV
114
    if (pUser->lastRoleRetrieve <= roleMgmt.lastUpd) result = true;
×
UNCOV
115
    (void)taosThreadRwlockUnlock(&roleMgmt.rw);
×
116
  }
117
  return result;
×
118
}
119

120
static int32_t mndFillSystemRolePrivileges(SMnode *pMnode, SRoleObj *pObj, uint32_t roleType) {
1,767,096✔
121
  int32_t       code = 0, lino = 0;
1,767,096✔
122
  SPrivInfoIter iter = {0};
1,767,096✔
123
  privInfoIterInit(&iter);
1,767,096✔
124

125
  char objKey[TSDB_PRIV_MAX_KEY_LEN] = {0};
1,767,096✔
126
  char dbFName[TSDB_DB_FNAME_LEN + 1] = {0};
1,767,096✔
127

128
  SPrivInfo *pPrivInfo = NULL;
1,767,096✔
129
  while (privInfoIterNext(&iter, &pPrivInfo)) {
257,996,016✔
130
    if ((pPrivInfo->sysType & roleType) == 0) continue;
256,228,920✔
131
    if (pPrivInfo->category == PRIV_CATEGORY_SYSTEM) {  // system privileges
92,183,508✔
132
      privAddType(&pObj->sysPrivs, pPrivInfo->privType);
47,711,592✔
133
    } else if (pPrivInfo->category == PRIV_CATEGORY_OBJECT) {  // object privileges
44,471,916✔
134
      snprintf(dbFName, TSDB_DB_FNAME_LEN, "1.%s", pPrivInfo->dbName[0] == 0 ? "*" : pPrivInfo->dbName);
44,471,916✔
135
      int32_t keyLen = privObjKeyF(pPrivInfo, dbFName, "*", objKey, sizeof(objKey));
44,471,916✔
136
      if (!pObj->objPrivs && !(pObj->objPrivs = taosHashInit(1, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true,
44,471,916✔
137
                                                             HASH_ENTRY_LOCK))) {
NEW
138
        TAOS_CHECK_EXIT(terrno);
×
139
      }
140
      SPrivObjPolicies *objPolicy = taosHashGet(pObj->objPrivs, objKey, keyLen + 1);
44,471,916✔
141
      if (objPolicy) {
44,471,916✔
142
        privAddType(&objPolicy->policy, pPrivInfo->privType);
30,924,180✔
143
      } else {
144
        SPrivObjPolicies policies = {0};
13,547,736✔
145
        privAddType(&policies.policy, pPrivInfo->privType);
13,547,736✔
146
        TAOS_CHECK_EXIT(taosHashPut(pObj->objPrivs, objKey, keyLen + 1, &policies, sizeof(policies)));
13,547,736✔
147
      }
148
    }
149
  }
150
_exit:
1,767,096✔
151
  if (code != 0) {
1,767,096✔
UNCOV
152
    mError("role, %s failed at line %d for %s since %s", __func__, lino, pObj->name, tstrerror(code));
×
153
  }
154
  TAOS_RETURN(code);
1,767,096✔
155
}
156

157
/**
158
 * system roles: SYSDBA/SYSSEC/SYSAUDIT/SYSINFO_0/SYSINFO_1
159
 */
160
static int32_t mndCreateDefaultRole(SMnode *pMnode, char *role, uint32_t roleType) {
3,991,266✔
161
  int32_t   code = 0, lino = 0;
3,991,266✔
162
  SRoleObj *pRole = NULL, *pNew = NULL;
3,991,266✔
163
  if (mndAcquireRole(pMnode, role, &pRole) == 0) {
3,991,266✔
164
    if (pRole->version < MND_ROLE_SYSROLE_VER) {
2,224,170✔
UNCOV
165
      mInfo("role:%s version:%" PRId64 " upgrade to version:%d", role, pRole->version, MND_ROLE_SYSROLE_VER);
×
UNCOV
166
      pNew = taosMemoryCalloc(1, sizeof(SRoleObj));
×
UNCOV
167
      if (pNew == NULL) {
×
UNCOV
168
        mndReleaseRole(pMnode, pRole);
×
UNCOV
169
        TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY);
×
170
      }
UNCOV
171
      snprintf(pNew->name, TSDB_ROLE_LEN, "%s", pRole->name);
×
UNCOV
172
      pNew->createdTime = pRole->createdTime;
×
UNCOV
173
      pNew->uid = pRole->uid;
×
UNCOV
174
      pNew->flag = pRole->flag;
×
UNCOV
175
      pNew->updateTime = taosGetTimestampMs();
×
UNCOV
176
      pNew->version = MND_ROLE_SYSROLE_VER;
×
177
      mndReleaseRole(pMnode, pRole);
×
178
    } else {
179
      mndReleaseRole(pMnode, pRole);
2,224,170✔
180
      return 0;
2,224,170✔
181
    }
182
  } else {
183
    pNew = taosMemoryCalloc(1, sizeof(SRoleObj));
1,767,096✔
184
    if (pNew == NULL) {
1,767,096✔
185
      TAOS_RETURN(TSDB_CODE_OUT_OF_MEMORY);
×
186
    }
187
    tstrncpy(pNew->name, role, TSDB_ROLE_LEN);
1,767,096✔
188
    pNew->uid = mndGenerateUid(pNew->name, strlen(pNew->name));
1,767,096✔
189
    pNew->createdTime = taosGetTimestampMs();
1,767,096✔
190
    pNew->updateTime = pNew->createdTime;
1,767,096✔
191
    pNew->enable = 1;
1,767,096✔
192
    pNew->sys = 1;
1,767,096✔
193
    pNew->version = MND_ROLE_SYSROLE_VER;
1,767,096✔
194
  }
195

196
  TAOS_CHECK_EXIT(mndFillSystemRolePrivileges(pMnode, pNew, roleType));
1,767,096✔
197

198
  SSdbRaw *pRaw = mndRoleActionEncode(pNew);
1,767,096✔
199
  if (pRaw == NULL) goto _exit;
1,767,096✔
200
  TAOS_CHECK_EXIT(sdbSetRawStatus(pRaw, SDB_STATUS_READY));
1,767,096✔
201

202
  mInfo("role:%s, will be created when deploying, raw:%p", pNew->name, pRaw);
1,767,096✔
203

204
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_NOTHING, NULL, "create-role");
1,767,096✔
205
  if (pTrans == NULL) {
1,767,096✔
UNCOV
206
    sdbFreeRaw(pRaw);
×
UNCOV
207
    mError("role:%s, failed to create since %s", pNew->name, terrstr());
×
UNCOV
208
    TAOS_CHECK_EXIT(terrno);
×
209
  }
210
  mInfo("trans:%d, used to create role:%s", pTrans->id, pNew->name);
1,767,096✔
211

212
  if (mndTransAppendCommitlog(pTrans, pRaw) != 0) {
1,767,096✔
UNCOV
213
    mError("trans:%d, failed to commit redo log since %s", pTrans->id, terrstr());
×
UNCOV
214
    TAOS_CHECK_EXIT(terrno);
×
215
  }
216
  TAOS_CHECK_EXIT(sdbSetRawStatus(pRaw, SDB_STATUS_READY));
1,767,096✔
217

218
  if (mndTransPrepare(pMnode, pTrans) != 0) {
1,767,096✔
UNCOV
219
    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
×
UNCOV
220
    TAOS_CHECK_EXIT(terrno);
×
221
  }
222

223
_exit:
1,767,096✔
224
  if (pNew) {
1,767,096✔
225
    mndRoleFreeObj(pNew);
1,767,096✔
226
    taosMemoryFree(pNew);
1,767,096✔
227
  }
228
  mndTransDrop(pTrans);
1,767,096✔
229
  TAOS_RETURN(code);
1,767,096✔
230
}
231

232
static int32_t mndCreateDefaultRoles(SMnode *pMnode) {
665,211✔
233
  int32_t code = 0, lino = 0;
665,211✔
234
  TAOS_CHECK_EXIT(mndCreateDefaultRole(pMnode, TSDB_ROLE_SYSDBA, T_ROLE_SYSDBA));
665,211✔
235
  TAOS_CHECK_EXIT(mndCreateDefaultRole(pMnode, TSDB_ROLE_SYSSEC, T_ROLE_SYSSEC));
665,211✔
236
  TAOS_CHECK_EXIT(mndCreateDefaultRole(pMnode, TSDB_ROLE_SYSAUDIT, T_ROLE_SYSAUDIT));
665,211✔
237
  TAOS_CHECK_EXIT(mndCreateDefaultRole(pMnode, TSDB_ROLE_SYSAUDIT_LOG, T_ROLE_SYSAUDIT_LOG));
665,211✔
238
  TAOS_CHECK_EXIT(mndCreateDefaultRole(pMnode, TSDB_ROLE_SYSINFO_0, T_ROLE_SYSINFO_0));
665,211✔
239
  TAOS_CHECK_EXIT(mndCreateDefaultRole(pMnode, TSDB_ROLE_SYSINFO_1, T_ROLE_SYSINFO_1));
665,211✔
240
_exit:
665,211✔
241
  TAOS_RETURN(code);
665,211✔
242
}
243

244
static int32_t tSerializeSRoleObj(void *buf, int32_t bufLen, SRoleObj *pObj) {
13,017,084✔
245
  int32_t  code = 0, lino = 0;
13,017,084✔
246
  int32_t  tlen = 0;
13,017,084✔
247
  SEncoder encoder = {0};
13,017,084✔
248
  tEncoderInit(&encoder, buf, bufLen);
13,017,084✔
249

250
  TAOS_CHECK_EXIT(tStartEncode(&encoder));
13,017,084✔
251
  TAOS_CHECK_EXIT(tEncodeCStr(&encoder, pObj->name));
26,034,168✔
252
  TAOS_CHECK_EXIT(tEncodeI64v(&encoder, pObj->createdTime));
26,034,168✔
253
  TAOS_CHECK_EXIT(tEncodeI64v(&encoder, pObj->updateTime));
26,034,168✔
254
  TAOS_CHECK_EXIT(tEncodeI64v(&encoder, pObj->uid));
26,034,168✔
255
  TAOS_CHECK_EXIT(tEncodeI64v(&encoder, pObj->version));
26,034,168✔
256
  TAOS_CHECK_EXIT(tEncodeU8(&encoder, pObj->flag));
26,034,168✔
257

258
  TAOS_CHECK_EXIT(tSerializePrivSysObjPolicies(&encoder, &pObj->sysPrivs, pObj->objPrivs));
13,017,084✔
259

260
  TAOS_CHECK_EXIT(tSerializePrivTblPolicies(&encoder, pObj->selectTbs));
13,017,084✔
261
  TAOS_CHECK_EXIT(tSerializePrivTblPolicies(&encoder, pObj->insertTbs));
13,017,084✔
262
  TAOS_CHECK_EXIT(tSerializePrivTblPolicies(&encoder, pObj->updateTbs));
13,017,084✔
263
  TAOS_CHECK_EXIT(tSerializePrivTblPolicies(&encoder, pObj->deleteTbs));
13,017,084✔
264

265
  int32_t nParentRoles = taosHashGetSize(pObj->parentRoles);
13,017,084✔
266
  TAOS_CHECK_EXIT(tEncodeI32v(&encoder, nParentRoles));
13,017,084✔
267
  if (nParentRoles > 0) {
13,017,084✔
268
    void *pIter = NULL;
×
269
    while ((pIter = taosHashIterate(pObj->parentRoles, pIter))) {
×
270
      char *roleName = taosHashGetKey(pIter, NULL);
×
271
      TAOS_CHECK_EXIT(tEncodeCStr(&encoder, roleName));
×
272
    }
273
  }
274
  int32_t nSubRoles = taosHashGetSize(pObj->subRoles);
13,017,084✔
275
  TAOS_CHECK_EXIT(tEncodeI32v(&encoder, nSubRoles));
13,017,084✔
276
  if (nSubRoles > 0) {
13,017,084✔
UNCOV
277
    void *pIter = NULL;
×
278
    while ((pIter = taosHashIterate(pObj->subRoles, pIter))) {
×
UNCOV
279
      char *roleName = taosHashGetKey(pIter, NULL);
×
UNCOV
280
      TAOS_CHECK_EXIT(tEncodeCStr(&encoder, roleName));
×
281
    }
282
  }
283

284
  tEndEncode(&encoder);
13,017,084✔
285
  tlen = encoder.pos;
13,017,084✔
286
_exit:
13,017,084✔
287
  tEncoderClear(&encoder);
13,017,084✔
288
  if (code < 0) {
13,017,084✔
UNCOV
289
    mError("role:%s, %s failed at line %d since %s", pObj->name, __func__, lino, tstrerror(code));
×
UNCOV
290
    TAOS_RETURN(code);
×
291
  }
292

293
  return tlen;
13,017,084✔
294
}
295

UNCOV
296
void tFreePrivTblPolicies(SHashObj **ppHash) {
×
UNCOV
297
  if (*ppHash) {
×
UNCOV
298
    void *pIter = NULL;
×
UNCOV
299
    while ((pIter = taosHashIterate(*ppHash, pIter))) {
×
UNCOV
300
      int32_t vlen = taosHashGetValueSize(pIter);  // value is NULL for key 1.db.* or 1.*.*
×
UNCOV
301
      if (vlen == 0) continue;
×
302
      privTblPoliciesFree((SPrivTblPolicies *)pIter);
303
    }
UNCOV
304
    taosHashCleanup(*ppHash);
×
305
    *ppHash = NULL;
×
306
  }
307
}
×
308

309
static int32_t tDeserializeSRoleObj(void *buf, int32_t bufLen, SRoleObj *pObj) {
2,487,512✔
310
  int32_t  code = 0, lino = 0;
2,487,512✔
311
  SDecoder decoder = {0};
2,487,512✔
312
  tDecoderInit(&decoder, buf, bufLen);
2,487,512✔
313

314
  TAOS_CHECK_EXIT(tStartDecode(&decoder));
2,487,512✔
315

316
  TAOS_CHECK_EXIT(tDecodeCStrTo(&decoder, pObj->name));
2,487,512✔
317
  TAOS_CHECK_EXIT(tDecodeI64v(&decoder, &pObj->createdTime));
4,975,024✔
318
  TAOS_CHECK_EXIT(tDecodeI64v(&decoder, &pObj->updateTime));
4,975,024✔
319
  TAOS_CHECK_EXIT(tDecodeI64v(&decoder, &pObj->uid));
4,975,024✔
320
  TAOS_CHECK_EXIT(tDecodeI64v(&decoder, &pObj->version));
4,975,024✔
321
  TAOS_CHECK_EXIT(tDecodeU8(&decoder, &pObj->flag));
4,975,024✔
322

323
  TAOS_CHECK_EXIT(tDeserializePrivSysObjPolicies(&decoder, &pObj->sysPrivs, &pObj->objPrivs));
2,487,512✔
324

325
  TAOS_CHECK_EXIT(tDeserializePrivTblPolicies(&decoder, &pObj->selectTbs));
2,487,512✔
326
  TAOS_CHECK_EXIT(tDeserializePrivTblPolicies(&decoder, &pObj->insertTbs));
2,487,512✔
327
  TAOS_CHECK_EXIT(tDeserializePrivTblPolicies(&decoder, &pObj->updateTbs));
2,487,512✔
328
  TAOS_CHECK_EXIT(tDeserializePrivTblPolicies(&decoder, &pObj->deleteTbs));
2,487,512✔
329

330
  char    roleName[TSDB_ROLE_LEN] = {0};
2,487,512✔
331
  int32_t nParentRoles = 0;
2,487,512✔
332
  TAOS_CHECK_EXIT(tDecodeI32v(&decoder, &nParentRoles));
2,487,512✔
333
  if (nParentRoles > 0) {
2,487,512✔
UNCOV
334
    if (!(pObj->parentRoles =
×
UNCOV
335
              taosHashInit(nParentRoles, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK))) {
×
UNCOV
336
      TAOS_CHECK_EXIT(terrno);
×
337
    }
UNCOV
338
    for (int32_t i = 0; i < nParentRoles; ++i) {
×
UNCOV
339
      TAOS_CHECK_EXIT(tDecodeCStrTo(&decoder, roleName));
×
UNCOV
340
      TAOS_CHECK_EXIT(taosHashPut(pObj->parentRoles, roleName, strlen(roleName) + 1, NULL, 0));
×
341
    }
342
  }
343
  int32_t nSubRoles = 0;
2,487,512✔
344
  TAOS_CHECK_EXIT(tDecodeI32v(&decoder, &nSubRoles));
2,487,512✔
345
  if (nSubRoles > 0) {
2,487,512✔
346
    if (!(pObj->subRoles =
×
UNCOV
347
              taosHashInit(nSubRoles, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK))) {
×
UNCOV
348
      TAOS_CHECK_EXIT(terrno);
×
349
    }
UNCOV
350
    for (int32_t i = 0; i < nSubRoles; ++i) {
×
UNCOV
351
      TAOS_CHECK_EXIT(tDecodeCStrTo(&decoder, roleName));
×
352
      TAOS_CHECK_EXIT(taosHashPut(pObj->subRoles, roleName, strlen(roleName) + 1, NULL, 0));
×
353
    }
354
  }
355

356
_exit:
2,487,512✔
357
  tEndDecode(&decoder);
2,487,512✔
358
  tDecoderClear(&decoder);
2,487,512✔
359
  if (code < 0) {
2,487,512✔
UNCOV
360
    mError("role, %s failed at line %d since %s, row:%p", __func__, lino, tstrerror(code), pObj);
×
361
  }
362
  TAOS_RETURN(code);
2,487,512✔
363
}
364

365
SSdbRaw *mndRoleActionEncode(SRoleObj *pObj) {
6,508,542✔
366
  int32_t  code = 0, lino = 0;
6,508,542✔
367
  void    *buf = NULL;
6,508,542✔
368
  SSdbRaw *pRaw = NULL;
6,508,542✔
369
  int32_t  tlen = tSerializeSRoleObj(NULL, 0, pObj);
6,508,542✔
370
  if (tlen < 0) {
6,508,542✔
UNCOV
371
    TAOS_CHECK_EXIT(tlen);
×
372
  }
373
  int32_t size = sizeof(int32_t) + tlen;
6,508,542✔
374
  if (!(pRaw = sdbAllocRaw(SDB_ROLE, MND_ROLE_VER_NUMBER, size))) {
6,508,542✔
UNCOV
375
    TAOS_CHECK_EXIT(terrno);
×
376
  }
377
  if (!(buf = taosMemoryMalloc(tlen))) {
6,508,542✔
UNCOV
378
    TAOS_CHECK_EXIT(terrno);
×
379
  }
380
  if ((tlen = tSerializeSRoleObj(buf, tlen, pObj)) < 0) {
6,508,542✔
381
    TAOS_CHECK_EXIT(tlen);
×
382
  }
383

384
  int32_t dataPos = 0;
6,508,542✔
385
  SDB_SET_INT32(pRaw, dataPos, tlen, _exit);
6,508,542✔
386
  SDB_SET_BINARY(pRaw, dataPos, buf, tlen, _exit);
6,508,542✔
387
  SDB_SET_DATALEN(pRaw, dataPos, _exit);
6,508,542✔
388
_exit:
6,508,542✔
389
  taosMemoryFreeClear(buf);
6,508,542✔
390
  if (code != TSDB_CODE_SUCCESS) {
6,508,542✔
UNCOV
391
    terrno = code;
×
UNCOV
392
    mError("role, failed at line %d to encode to raw:%p since %s", lino, pRaw, tstrerror(code));
×
UNCOV
393
    sdbFreeRaw(pRaw);
×
UNCOV
394
    return NULL;
×
395
  }
396
  mTrace("role, encode to raw:%p, row:%p", pRaw, pObj);
6,508,542✔
397
  return pRaw;
6,508,542✔
398
}
399

400
static SSdbRow *mndRoleActionDecode(SSdbRaw *pRaw) {
2,487,512✔
401
  int32_t   code = 0, lino = 0;
2,487,512✔
402
  SSdbRow  *pRow = NULL;
2,487,512✔
403
  SRoleObj *pObj = NULL;
2,487,512✔
404
  void     *buf = NULL;
2,487,512✔
405

406
  int8_t sver = 0;
2,487,512✔
407
  TAOS_CHECK_EXIT(sdbGetRawSoftVer(pRaw, &sver));
2,487,512✔
408

409
  if (sver != MND_ROLE_VER_NUMBER) {
2,487,512✔
410
    mError("role, read invalid ver, data ver: %d, curr ver: %d", sver, MND_ROLE_VER_NUMBER);
×
411
    TAOS_CHECK_EXIT(TSDB_CODE_SDB_INVALID_DATA_VER);
×
412
  }
413

414
  if (!(pRow = sdbAllocRow(sizeof(SRoleObj)))) {
2,487,512✔
UNCOV
415
    TAOS_CHECK_EXIT(terrno);
×
416
  }
417

418
  if (!(pObj = sdbGetRowObj(pRow))) {
2,487,512✔
UNCOV
419
    TAOS_CHECK_EXIT(terrno);
×
420
  }
421

422
  int32_t tlen;
2,486,414✔
423
  int32_t dataPos = 0;
2,487,512✔
424
  SDB_GET_INT32(pRaw, dataPos, &tlen, _exit);
2,487,512✔
425
  if (!(buf = taosMemoryMalloc(tlen + 1))) {
2,487,512✔
UNCOV
426
    TAOS_CHECK_EXIT(terrno);
×
427
  }
428
  SDB_GET_BINARY(pRaw, dataPos, buf, tlen, _exit);
2,487,512✔
429
  TAOS_CHECK_EXIT(tDeserializeSRoleObj(buf, tlen, pObj));
2,487,512✔
430
  if (pObj->version < MND_ROLE_SYSROLE_VER) {
2,487,512✔
431
  }
432
  taosInitRWLatch(&pObj->lock);
2,487,512✔
433
_exit:
2,487,512✔
434
  taosMemoryFreeClear(buf);
2,487,512✔
435
  if (code != TSDB_CODE_SUCCESS) {
2,487,512✔
UNCOV
436
    terrno = code;
×
UNCOV
437
    mError("role, failed at line %d to decode from raw:%p since %s", lino, pRaw, tstrerror(code));
×
UNCOV
438
    mndRoleFreeObj(pObj);
×
UNCOV
439
    taosMemoryFreeClear(pRow);
×
UNCOV
440
    return NULL;
×
441
  }
442
  mTrace("role, decode from raw:%p, row:%p", pRaw, pObj);
2,487,512✔
443
  return pRow;
2,487,512✔
444
}
445

446
void mndRoleFreeObj(SRoleObj *pObj) {
5,300,087✔
447
  if (pObj) {
5,300,087✔
448
    taosHashCleanup(pObj->objPrivs);
5,300,087✔
449
    taosHashCleanup(pObj->selectTbs);
5,300,087✔
450
    taosHashCleanup(pObj->insertTbs);
5,300,087✔
451
    taosHashCleanup(pObj->updateTbs);
5,300,087✔
452
    taosHashCleanup(pObj->deleteTbs);
5,300,087✔
453
    taosHashCleanup(pObj->parentRoles);
5,300,087✔
454
    taosHashCleanup(pObj->subRoles);
5,300,087✔
455
    pObj->objPrivs = NULL;
5,300,087✔
456
    pObj->selectTbs = NULL;
5,300,087✔
457
    pObj->insertTbs = NULL;
5,300,087✔
458
    pObj->updateTbs = NULL;
5,300,087✔
459
    pObj->deleteTbs = NULL;
5,300,087✔
460
    pObj->parentRoles = NULL;
5,300,087✔
461
    pObj->subRoles = NULL;
5,300,087✔
462
  }
463
}
5,300,087✔
464

465
static int32_t mndRoleActionInsert(SSdb *pSdb, SRoleObj *pObj) {
2,486,350✔
466
  mTrace("role:%s, perform insert action, row:%p", pObj->name, pObj);
2,486,350✔
467
  return 0;
2,486,350✔
468
}
469

470
static int32_t mndRoleActionDelete(SSdb *pSdb, SRoleObj *pObj) {
2,487,242✔
471
  mTrace("role:%s, perform delete action, row:%p", pObj->name, pObj);
2,487,242✔
472
  mndRoleFreeObj(pObj);
2,487,242✔
473
  return 0;
2,487,242✔
474
}
475

476
static int32_t mndRoleActionUpdate(SSdb *pSdb, SRoleObj *pOld, SRoleObj *pNew) {
1,162✔
477
  mTrace("role:%s, perform update action, old row:%p new row:%p", pOld->name, pOld, pNew);
1,162✔
478
  taosWLockLatch(&pOld->lock);
1,162✔
479
  pOld->updateTime = pNew->updateTime;
1,162✔
480
  pOld->sysPrivs = pNew->sysPrivs;
1,162✔
481
  pOld->version = pNew->version;
1,162✔
482
  pOld->flag = pNew->flag;
1,162✔
483
  TSWAP(pOld->objPrivs, pNew->objPrivs);
1,162✔
484
  TSWAP(pOld->selectTbs, pNew->selectTbs);
1,162✔
485
  TSWAP(pOld->insertTbs, pNew->insertTbs);
1,162✔
486
  TSWAP(pOld->updateTbs, pNew->updateTbs);
1,162✔
487
  TSWAP(pOld->deleteTbs, pNew->deleteTbs);
1,162✔
488
  TSWAP(pOld->parentRoles, pNew->parentRoles);
1,162✔
489
  TSWAP(pOld->subRoles, pNew->subRoles);
1,162✔
490
  taosWUnLockLatch(&pOld->lock);
1,162✔
491
  return 0;
1,162✔
492
}
493

494
int32_t mndAcquireRole(SMnode *pMnode, const char *roleName, SRoleObj **ppRole) {
85,594,638✔
495
  int32_t code = 0;
85,594,638✔
496
  SSdb   *pSdb = pMnode->pSdb;
85,594,638✔
497

498
  *ppRole = sdbAcquire(pSdb, SDB_ROLE, roleName);
85,594,638✔
499
  if (*ppRole == NULL) {
85,594,638✔
500
    if (terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
2,881,211✔
501
      code = TSDB_CODE_MND_ROLE_NOT_EXIST;
2,881,211✔
502
    } else {
UNCOV
503
      code = TSDB_CODE_MND_ROLE_NOT_AVAILABLE;
×
504
    }
505
  }
506
  TAOS_RETURN(code);
85,594,638✔
507
}
508

509
void mndReleaseRole(SMnode *pMnode, SRoleObj *pRole) {
83,829,378✔
510
  SSdb *pSdb = pMnode->pSdb;
83,829,378✔
511
  sdbRelease(pSdb, pRole);
83,829,378✔
512
}
83,829,378✔
513

514
static int32_t mndCreateRole(SMnode *pMnode, char *acct, SCreateRoleReq *pCreate, SRpcMsg *pReq) {
166✔
515
  int32_t  code = 0, lino = 0;
166✔
516
  SRoleObj obj = {0};
166✔
517

518
  tstrncpy(obj.name, pCreate->name, TSDB_ROLE_LEN);
166✔
519
  obj.createdTime = taosGetTimestampMs();
166✔
520
  obj.updateTime = obj.createdTime;
166✔
521
  obj.uid = mndGenerateUid(obj.name, strlen(obj.name));
166✔
522
  obj.version = 1;
166✔
523
  obj.enable = 1;
166✔
524
  obj.sys = 0;
166✔
525
  // TODO: assign default privileges
526

527
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_ROLE, pReq, "create-role");
166✔
528
  if (pTrans == NULL) {
166✔
UNCOV
529
    TAOS_CHECK_EXIT(terrno);
×
530
  }
531
  mInfo("trans:%d, used to create role:%s", pTrans->id, pCreate->name);
166✔
532

533
  SSdbRaw *pCommitRaw = mndRoleActionEncode(&obj);
166✔
534
  if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
166✔
535
    mError("trans:%d, failed to commit redo log since %s", pTrans->id, terrstr());
×
UNCOV
536
    TAOS_CHECK_EXIT(terrno);
×
537
  }
538
  TAOS_CHECK_EXIT(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
166✔
539
  TAOS_CHECK_EXIT(mndTransPrepare(pMnode, pTrans));
166✔
540
_exit:
166✔
541
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
166✔
UNCOV
542
    mError("role:%s, failed at line %d to create role, since %s", obj.name, lino, tstrerror(code));
×
543
  }
544
  mndRoleFreeObj(&obj);
166✔
545
  mndTransDrop(pTrans);
166✔
546
  TAOS_RETURN(code);
166✔
547
}
548

549
static int32_t mndProcessCreateRoleReq(SRpcMsg *pReq) {
166✔
550
  SMnode        *pMnode = pReq->info.node;
166✔
551
  int32_t        code = 0, lino = 0;
166✔
552
  SRoleObj      *pRole = NULL;
166✔
553
  SUserObj      *pOperUser = NULL;
166✔
554
  SUserObj      *pUser = NULL;
166✔
555
  SCreateRoleReq createReq = {0};
166✔
556
  int64_t        tss = taosGetTimestampMs();
166✔
557

558
  if (tDeserializeSCreateRoleReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
166✔
UNCOV
559
    TAOS_CHECK_EXIT(TSDB_CODE_INVALID_MSG);
×
560
  }
561
  if ((code = mndAcquireRole(pMnode, createReq.name, &pRole)) == 0) {
166✔
UNCOV
562
    if (createReq.ignoreExists) {
×
UNCOV
563
      mInfo("role:%s, already exist, ignore exist is set", createReq.name);
×
564
      goto _exit;
×
565
    } else {
UNCOV
566
      TAOS_CHECK_EXIT(TSDB_CODE_MND_ROLE_ALREADY_EXIST);
×
567
    }
568
  } else {
569
    if ((code = terrno) == TSDB_CODE_MND_ROLE_NOT_EXIST) {
166✔
570
      // continue
571
    } else {
UNCOV
572
      goto _exit;
×
573
    }
574
  }
575
  code = mndAcquireUser(pMnode, RPC_MSG_USER(pReq), &pOperUser);
166✔
576
  if (pOperUser == NULL) {
166✔
UNCOV
577
    TAOS_CHECK_EXIT(TSDB_CODE_MND_NO_USER_FROM_CONN);
×
578
  }
579

580
  mInfo("role:%s, start to create by %s", createReq.name, pOperUser->user);
166✔
581

582
  // TAOS_CHECK_EXIT(mndCheckOperPrivilege(pMnode, RPC_MSG_USER(pReq), MND_OPER_CREATE_ROLE));
583
  TAOS_CHECK_EXIT(mndCheckSysObjPrivilege(pMnode, pOperUser, RPC_MSG_TOKEN(pReq), PRIV_ROLE_CREATE, 0, 0, NULL, NULL));
166✔
584

585
  if (createReq.name[0] == 0) {
166✔
UNCOV
586
    TAOS_CHECK_EXIT(TSDB_CODE_MND_ROLE_INVALID_FORMAT);
×
587
  }
588
  code = mndAcquireUser(pMnode, createReq.name, &pUser);
166✔
589
  if (pUser != NULL) {
166✔
590
    TAOS_CHECK_EXIT(TSDB_CODE_MND_USER_ALREADY_EXIST);
×
591
  }
592
  if (sdbGetSize(pMnode->pSdb, SDB_ROLE) >= TSDB_MAX_ROLES) {
166✔
NEW
593
    mError("role:%s, failed to create since reach max role limit %d", createReq.name, TSDB_MAX_ROLES);
×
NEW
594
    TAOS_CHECK_EXIT(TSDB_CODE_MND_TOO_MANY_ROLES);
×
595
  }
596
  TAOS_CHECK_EXIT(mndCreateRole(pMnode, pOperUser->acct, &createReq, pReq));
166✔
597
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
166✔
598

599
  if (tsAuditLevel >= AUDIT_LEVEL_CLUSTER) {
166✔
600
    char    detail[128] = {0};
166✔
601
    int32_t len = snprintf(detail, sizeof(detail), "operUser:%s", pOperUser->user);
166✔
602

603
    int64_t tse = taosGetTimestampMs();
166✔
604
    double  duration = (double)(tse - tss);
166✔
605
    duration = duration / 1000;
166✔
606
    auditRecord(pReq, pMnode->clusterId, "createRole", "", createReq.name, detail, strlen(detail), duration, 0);
166✔
607
  }
608
_exit:
166✔
609
  if (code < 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
166✔
610
    mError("role:%s, failed to create at line %d since %s", createReq.name, lino, tstrerror(code));
×
611
  }
612
  mndReleaseUser(pMnode, pUser);
166✔
613
  mndReleaseUser(pMnode, pOperUser);
166✔
614
  mndReleaseRole(pMnode, pRole);
166✔
615
  tFreeSCreateRoleReq(&createReq);
166✔
616
  TAOS_RETURN(code);
166✔
617
}
618

619
static int32_t mndDropParentRole(SMnode *pMnode, STrans *pTrans, SRoleObj *pObj) {  // TODO
×
UNCOV
620
  return 0;
×
621
}
622

UNCOV
623
static int32_t mndDropRole(SMnode *pMnode, SRpcMsg *pReq, SRoleObj *pObj) {
×
UNCOV
624
  int32_t code = 0, lino = 0;
×
625
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_ROLE, pReq, "drop-role");
×
626
  if (pTrans == NULL) {
×
627
    mError("role:%s, failed to drop since %s", pObj->name, terrstr());
×
628
    TAOS_CHECK_EXIT(terrno);
×
629
  }
630
  mInfo("trans:%d, used to drop role:%s", pTrans->id, pObj->name);
×
631

UNCOV
632
  SSdbRaw *pCommitRaw = mndRoleActionEncode(pObj);
×
633
  if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
×
634
    mError("trans:%d, failed to append commit log since %s", pTrans->id, terrstr());
×
635
    TAOS_CHECK_EXIT(terrno);
×
636
  }
UNCOV
637
  TAOS_CHECK_EXIT(sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED));
×
638
  TAOS_CHECK_EXIT(mndDropParentRole(pMnode, pTrans, pObj));
×
UNCOV
639
  TAOS_CHECK_EXIT(mndUserDropRole(pMnode, pTrans, pObj));
×
640
  TAOS_CHECK_EXIT(mndTransPrepare(pMnode, pTrans));
×
UNCOV
641
  mndSetRoleLastUpd(taosGetTimestampMs());
×
642
_exit:
×
643
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
×
UNCOV
644
    mError("role:%s, failed to drop at line:%d since %s", pObj->name, lino, tstrerror(code));
×
645
  }
646
  mndTransDrop(pTrans);
×
UNCOV
647
  TAOS_RETURN(0);
×
648
}
649

UNCOV
650
static int32_t mndProcessDropRoleReq(SRpcMsg *pReq) {
×
651
  SMnode      *pMnode = pReq->info.node;
×
652
  int32_t      code = 0, lino = 0;
×
653
  SRoleObj    *pObj = NULL;
×
654
  SUserObj    *pOperUser = NULL;
×
655
  SDropRoleReq dropReq = {0};
×
UNCOV
656
  int64_t      tss = taosGetTimestampMs();
×
657

658
  TAOS_CHECK_EXIT(tDeserializeSDropRoleReq(pReq->pCont, pReq->contLen, &dropReq));
×
659
  code = mndAcquireUser(pMnode, RPC_MSG_USER(pReq), &pOperUser);
×
UNCOV
660
  if (pOperUser == NULL) {
×
661
    TAOS_CHECK_EXIT(TSDB_CODE_MND_NO_USER_FROM_CONN);
×
662
  }
663
  mInfo("role:%s, start to drop", dropReq.name);
×
664
  // TAOS_CHECK_EXIT(mndCheckOperPrivilege(pMnode, RPC_MSG_USER(pReq), MND_OPER_DROP_ROLE));
NEW
665
  TAOS_CHECK_EXIT(mndCheckSysObjPrivilege(pMnode, pOperUser, RPC_MSG_TOKEN(pReq), PRIV_ROLE_CREATE, 0, 0, NULL, NULL));
×
666

UNCOV
667
  if (dropReq.name[0] == 0) {
×
UNCOV
668
    TAOS_CHECK_EXIT(TSDB_CODE_MND_ROLE_INVALID_FORMAT);
×
669
  }
670

671
  TAOS_CHECK_EXIT(mndAcquireRole(pMnode, dropReq.name, &pObj));
×
672

UNCOV
673
  TAOS_CHECK_EXIT(mndDropRole(pMnode, pReq, pObj));
×
UNCOV
674
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
×
675

UNCOV
676
  if (tsAuditLevel >= AUDIT_LEVEL_CLUSTER) {
×
UNCOV
677
    int64_t tse = taosGetTimestampMs();
×
678
    double  duration = (double)(tse - tss);
×
679
    duration = duration / 1000;
×
UNCOV
680
    auditRecord(pReq, pMnode->clusterId, "dropRole", "", dropReq.name, dropReq.sql, dropReq.sqlLen, duration, 0);
×
681
  }
UNCOV
682
_exit:
×
UNCOV
683
  if (code < 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
×
UNCOV
684
    mError("role:%s, failed to drop at line %d since %s", dropReq.name, lino, tstrerror(code));
×
685
  }
UNCOV
686
  mndReleaseRole(pMnode, pObj);
×
UNCOV
687
  mndReleaseUser(pMnode, pOperUser);
×
UNCOV
688
  tFreeSDropRoleReq(&dropReq);
×
UNCOV
689
  TAOS_RETURN(code);
×
690
}
691

692
static int32_t mndAlterRole(SMnode *pMnode, SRpcMsg *pReq, SRoleObj *pObj) {
1,162✔
693
  int32_t code = 0, lino = 0;
1,162✔
694
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_ROLE, pReq, "alter-role");
1,162✔
695
  if (pTrans == NULL) {
1,162✔
UNCOV
696
    mError("role:%s, failed to alter since %s", pObj->name, terrstr());
×
UNCOV
697
    TAOS_CHECK_EXIT(terrno);
×
698
  }
699
  mInfo("trans:%d, used to alter role:%s", pTrans->id, pObj->name);
1,162✔
700

701
  SSdbRaw *pCommitRaw = mndRoleActionEncode(pObj);
1,162✔
702
  if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
1,162✔
UNCOV
703
    mError("trans:%d, failed to append commit log since %s", pTrans->id, terrstr());
×
UNCOV
704
    TAOS_CHECK_EXIT(terrno);
×
705
  }
706
  TAOS_CHECK_EXIT(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
1,162✔
707
  TAOS_CHECK_EXIT(mndTransPrepare(pMnode, pTrans));
1,162✔
708
_exit:
1,162✔
709
  if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
1,162✔
UNCOV
710
    mError("role:%s, failed to alter at line:%d since %s", pObj->name, lino, tstrerror(code));
×
711
  }
712
  mndTransDrop(pTrans);
1,162✔
713
  TAOS_RETURN(0);
1,162✔
714
}
715

716
int32_t mndRoleDupObj(SRoleObj *pOld, SRoleObj *pNew) {
1,328✔
717
  int32_t code = 0, lino = 0;
1,328✔
718
  snprintf(pNew->name, TSDB_ROLE_LEN, "%s", pOld->name);
1,328✔
719
  pNew->createdTime = pOld->createdTime;
1,328✔
720
  pNew->uid = pOld->uid;
1,328✔
721
  pNew->version = pOld->version + 1;
1,328✔
722
  pNew->flag = pOld->flag;
1,328✔
723
  pNew->updateTime = taosGetTimestampMs();
1,328✔
724
  pNew->sysPrivs = pOld->sysPrivs;
1,328✔
725

726
  taosRLockLatch(&pOld->lock);
1,328✔
727
  TAOS_CHECK_EXIT(mndDupPrivObjHash(pOld->objPrivs, &pNew->objPrivs));
1,328✔
728
  TAOS_CHECK_EXIT(mndDupPrivTblHash(pOld->selectTbs, &pNew->selectTbs, false));
1,328✔
729
  TAOS_CHECK_EXIT(mndDupPrivTblHash(pOld->insertTbs, &pNew->insertTbs, false));
1,328✔
730
  TAOS_CHECK_EXIT(mndDupPrivTblHash(pOld->updateTbs, &pNew->updateTbs, false));
1,328✔
731
  TAOS_CHECK_EXIT(mndDupPrivTblHash(pOld->deleteTbs, &pNew->deleteTbs, false));
1,328✔
732
  // TODO: alterTbs?
733
  TAOS_CHECK_EXIT(mndDupRoleHash(pOld->parentRoles, &pNew->parentRoles));
1,328✔
734
  TAOS_CHECK_EXIT(mndDupRoleHash(pOld->subRoles, &pNew->subRoles));
1,328✔
735
_exit:
1,328✔
736
  taosRUnLockLatch(&pOld->lock);
1,328✔
737
  if (code < 0) {
1,328✔
UNCOV
738
    mError("role:%s, failed at line %d to dup obj since %s", pOld->name, lino, tstrerror(code));
×
739
  }
740
  TAOS_RETURN(code);
1,328✔
741
}
742

743
static bool mndIsRoleChanged(SRoleObj *pOld, SAlterRoleReq *pAlterReq) {
1,328✔
744
  switch (pAlterReq->alterType) {
1,328✔
UNCOV
745
    case TSDB_ALTER_ROLE_LOCK: {
×
UNCOV
746
      if ((pAlterReq->lock && !pOld->enable) || (!pAlterReq->lock && pOld->enable)) {
×
UNCOV
747
        return false;
×
748
      }
UNCOV
749
      break;
×
750
    }
751
    default:
1,328✔
752
      break;
1,328✔
753
  }
754
  return true;
1,328✔
755
}
756

757
#ifdef TD_ENTERPRISE
758
extern int32_t mndAlterRoleInfo(SMnode *pMnode, SUserObj *pOperUser, const char *token, SRoleObj *pOld, SRoleObj *pNew,
759
                                SAlterRoleReq *pAlterReq);
760
#endif
761

762
static int32_t mndProcessAlterRoleReq(SRpcMsg *pReq) {
1,045,583✔
763
  int32_t       code = 0, lino = 0;
1,045,583✔
764
  SMnode       *pMnode = pReq->info.node;
1,045,583✔
765
  SRoleObj     *pObj = NULL;
1,045,583✔
766
  SRoleObj      newObj = {0};
1,045,583✔
767
  SUserObj     *pOperUser = NULL;
1,045,583✔
768
  SAlterRoleReq alterReq = {0};
1,045,583✔
769
  bool          alterUser = false;
1,045,583✔
770
  int64_t       tss = taosGetTimestampMs();
1,045,583✔
771

772
  TAOS_CHECK_EXIT(tDeserializeSAlterRoleReq(pReq->pCont, pReq->contLen, &alterReq));
1,045,583✔
773

774
  mInfo("role:%s, start to alter, flag:%u", alterReq.principal, alterReq.flag);
1,045,583✔
775
  TAOS_CHECK_EXIT(mndCheckOperPrivilege(pMnode, RPC_MSG_USER(pReq), RPC_MSG_TOKEN(pReq), MND_OPER_ALTER_ROLE));
1,045,583✔
776

777
  TAOS_CHECK_EXIT(mndAcquireUser(pMnode, RPC_MSG_USER(pReq), &pOperUser));
1,045,583✔
778

779
  if (alterReq.principal[0] == 0) {
1,045,583✔
UNCOV
780
    TAOS_CHECK_EXIT(TSDB_CODE_MND_ROLE_INVALID_FORMAT);
×
781
  }
782

783
  if (mndAcquireRole(pMnode, alterReq.principal, &pObj) == 0) {
1,045,583✔
784
    if (alterReq.alterType == TSDB_ALTER_ROLE_ROLE) {
1,328✔
UNCOV
785
      TAOS_CHECK_EXIT(TSDB_CODE_OPS_NOT_SUPPORT);  // not support grant role to role yet
×
786
    }
787
  } else {
788
    if (alterReq.alterType == TSDB_ALTER_ROLE_LOCK) {
1,044,255✔
UNCOV
789
      TAOS_CHECK_EXIT(terrno);
×
790
    }
791
    alterUser = true;
1,044,255✔
792
  }
793

794
  if (alterUser) {
1,045,583✔
795
    mInfo("role:%s, not exist, will alter user instead", alterReq.principal);
1,044,255✔
796
    TAOS_CHECK_EXIT(mndAlterUserFromRole(pReq, pOperUser, &alterReq));
1,044,255✔
797
  } else if (mndIsRoleChanged(pObj, &alterReq)) {
1,328✔
798
    TAOS_CHECK_EXIT(mndRoleDupObj(pObj, &newObj));
1,328✔
799
#ifdef TD_ENTERPRISE
800
    TAOS_CHECK_EXIT(mndAlterRoleInfo(pMnode, pOperUser, RPC_MSG_TOKEN(pReq), pObj, &newObj, &alterReq));
1,328✔
801
#endif
802
    TAOS_CHECK_EXIT(mndAlterRole(pMnode, pReq, &newObj));
1,162✔
803
    if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
1,162✔
804
    mndSetRoleLastUpd(taosGetTimestampMs());
1,162✔
805
  }
806

807
  if (tsAuditLevel >= AUDIT_LEVEL_CLUSTER) {
1,328✔
808
    int64_t tse = taosGetTimestampMs();
1,328✔
809
    double  duration = (double)(tse - tss);
1,328✔
810
    duration = duration / 1000;
1,328✔
811
    auditRecord(pReq, pMnode->clusterId, "alterRole", "", alterReq.principal, alterReq.sql, alterReq.sqlLen, duration,
1,328✔
812
                0);
813
  }
814
_exit:
1,045,583✔
815
  if (code < 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
1,045,583✔
816
    mError("role:%s, failed to alter at line %d since %s", alterReq.principal, lino, tstrerror(code));
1,676✔
817
  }
818
  mndReleaseUser(pMnode, pOperUser);
1,045,583✔
819
  mndReleaseRole(pMnode, pObj);
1,045,583✔
820
  mndRoleFreeObj(&newObj);
1,045,583✔
821
  tFreeSAlterRoleReq(&alterReq);
1,045,583✔
822
  TAOS_RETURN(code);
1,045,583✔
823
}
824

825
static int32_t mndUpgradeDefaultRoles(SMnode *pMnode, int32_t version) {
370,695✔
826
  int32_t code = 0, lino = 0;
370,695✔
827
  if (!mndIsLeader(pMnode)) return code;
370,695✔
828
  SRpcMsg rpcMsg = {.msgType = TDMT_MND_UPGRADE_ROLE, .info.ahandle = 0, .info.notFreeAhandle = 1};
370,695✔
829
  SEpSet  epSet = {0};
370,695✔
830
  mndGetMnodeEpSet(pMnode, &epSet);
370,695✔
831
  TAOS_CHECK_EXIT(tmsgSendReq(&epSet, &rpcMsg));
370,695✔
832
_exit:
370,695✔
833
  if (code < 0) {
370,695✔
NEW
834
    mError("failed at line %d to upgrade roles since %s", lino, tstrerror(code));
×
835
  }
836
  TAOS_RETURN(code);
370,695✔
837
}
838

839
static int32_t mndProcessUpgradeRoleReq(SRpcMsg *pReq) {
370,695✔
840
  return mndCreateDefaultRoles(pReq->info.node);
370,695✔
841
}
842

843
static int32_t mndProcessUpgradeRoleRsp(SRpcMsg *pReq) { return 0; }
370,695✔
844

UNCOV
845
static int32_t mndProcessGetRoleAuthReq(SRpcMsg *pReq) { TAOS_RETURN(0); }
×
846

847
static int32_t mndRetrieveRoles(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
166✔
848
  SMnode   *pMnode = pReq->info.node;
166✔
849
  SSdb     *pSdb = pMnode->pSdb;
166✔
850
  int32_t   code = 0, lino = 0;
166✔
851
  int32_t   numOfRows = 0;
166✔
852
  SRoleObj *pObj = NULL;
166✔
853
  int32_t   cols = 0;
166✔
854
  int32_t   bufSize = TSDB_MAX_SUBROLE * TSDB_ROLE_LEN + VARSTR_HEADER_SIZE;
166✔
855
  char      tBuf[TSDB_MAX_SUBROLE * TSDB_ROLE_LEN + VARSTR_HEADER_SIZE] = {0};
166✔
856

857
  while (numOfRows < rows) {
1,328✔
858
    pShow->pIter = sdbFetch(pSdb, SDB_ROLE, pShow->pIter, (void **)&pObj);
1,328✔
859
    if (pShow->pIter == NULL) break;
1,328✔
860

861
    cols = 0;
1,162✔
862
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
1,162✔
863
    char             name[TSDB_ROLE_LEN + VARSTR_HEADER_SIZE] = {0};
1,162✔
864
    STR_WITH_MAXSIZE_TO_VARSTR(name, pObj->name, pShow->pMeta->pSchemas[cols].bytes);
1,162✔
865
    COL_DATA_SET_VAL_GOTO((const char *)name, false, pObj, pShow->pIter, _exit);
1,162✔
866

867
    if ((pColInfo = taosArrayGet(pBlock->pDataBlock, ++cols))) {
1,162✔
868
      int8_t enable = pObj->enable ? 1 : 0;
1,162✔
869
      COL_DATA_SET_VAL_GOTO((const char *)&enable, false, pObj, pShow->pIter, _exit);
1,162✔
870
    }
871

872
    if ((pColInfo = taosArrayGet(pBlock->pDataBlock, ++cols))) {
1,162✔
873
      COL_DATA_SET_VAL_GOTO((const char *)&pObj->createdTime, false, pObj, pShow->pIter, _exit);
1,162✔
874
    }
875
    if ((pColInfo = taosArrayGet(pBlock->pDataBlock, ++cols))) {
1,162✔
876
      COL_DATA_SET_VAL_GOTO((const char *)&pObj->updateTime, false, pObj, pShow->pIter, _exit);
1,162✔
877
    }
878
    if ((pColInfo = taosArrayGet(pBlock->pDataBlock, ++cols))) {
1,162✔
879
      char *roleType = pObj->sys ? "SYSTEM" : "USER";
1,162✔
880
      STR_WITH_MAXSIZE_TO_VARSTR(tBuf, roleType, pShow->pMeta->pSchemas[cols].bytes);
1,162✔
881
      COL_DATA_SET_VAL_GOTO((const char *)tBuf, false, pObj, pShow->pIter, _exit);
1,162✔
882
    }
883

884
    if ((pColInfo = taosArrayGet(pBlock->pDataBlock, ++cols))) {
1,162✔
885
      void  *pIter = NULL;
1,162✔
886
      size_t klen = 0, tlen = 0;
1,162✔
887
      char  *pBuf = POINTER_SHIFT(tBuf, VARSTR_HEADER_SIZE);
1,162✔
888
      while ((pIter = taosHashIterate(pObj->subRoles, pIter))) {
1,162✔
UNCOV
889
        char *roleName = taosHashGetKey(pIter, &klen);
×
UNCOV
890
        tlen += snprintf(pBuf + tlen, bufSize - tlen, "%s,", roleName);
×
891
      }
892
      if (tlen > 0) {
1,162✔
NEW
893
        pBuf[--tlen] = 0;  // remove last ','
×
894
      } else {
895
        pBuf[0] = 0;
1,162✔
896
      }
897
      varDataSetLen(tBuf, tlen);
1,162✔
898
      COL_DATA_SET_VAL_GOTO((const char *)tBuf, false, pObj, pShow->pIter, _exit);
1,162✔
899
    }
900
    numOfRows++;
1,162✔
901
    sdbRelease(pSdb, pObj);
1,162✔
902
  }
903
  pShow->numOfRows += numOfRows;
166✔
904
_exit:
166✔
905
  if (code < 0) {
166✔
NEW
906
    mError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
907
    TAOS_RETURN(code);
×
908
  }
909
  return numOfRows;
166✔
910
}
911

UNCOV
912
static void mndCancelGetNextRole(SMnode *pMnode, void *pIter) {
×
UNCOV
913
  SSdb *pSdb = pMnode->pSdb;
×
UNCOV
914
  sdbCancelFetchByType(pSdb, pIter, SDB_ROLE);
×
UNCOV
915
}
×
916

917
static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
830✔
918
  int32_t   code = 0, lino = 0;
830✔
919
  SMnode   *pMnode = pReq->info.node;
830✔
920
  SSdb     *pSdb = pMnode->pSdb;
830✔
921
  int32_t   numOfRows = 0;
830✔
922
  int32_t   cols = 0;
830✔
923
  SRoleObj *pObj = NULL;
830✔
924
  char     *pBuf = NULL, *qBuf = NULL;
830✔
925
  char     *sql = NULL;
830✔
926
  char      roleName[TSDB_ROLE_LEN + VARSTR_HEADER_SIZE] = {0};
830✔
927
  int32_t   bufSize = TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE;
830✔
928

929
  bool fetchNextInstance = pShow->restore ? false : true;
830✔
930
  pShow->restore = false;
830✔
931

932
  while (numOfRows < rows) {
6,640✔
933
    if (fetchNextInstance) {
6,640✔
934
      pShow->pIter = sdbFetch(pSdb, SDB_ROLE, pShow->pIter, (void **)&pObj);
6,640✔
935
      if (pShow->pIter == NULL) break;
6,640✔
936
    } else {
UNCOV
937
      fetchNextInstance = true;
×
UNCOV
938
      void *pKey = taosHashGetKey(pShow->pIter, NULL);
×
UNCOV
939
      if (!(pObj = sdbAcquire(pSdb, SDB_ROLE, pKey))) {
×
UNCOV
940
        continue;
×
941
      }
942
    }
943

944
    // count total privileges for current role
945
    int32_t nSysPrivileges = privPopCnt(&pObj->sysPrivs);
5,810✔
946
    int32_t nObjPrivileges = 0;
5,810✔
947
    void   *pIter = NULL;
5,810✔
948
    while ((pIter = taosHashIterate(pObj->objPrivs, pIter))) {
44,488✔
949
      SPrivObjPolicies *pPolices = (SPrivObjPolicies *)pIter;
38,678✔
950
      nObjPrivileges += privPopCnt(&pPolices->policy);
77,356✔
951
    }
952
    int32_t nTblPrivileges = privTblPrivCnt(pObj->selectTbs);
5,810✔
953
    nTblPrivileges += privTblPrivCnt(pObj->insertTbs);
5,810✔
954
    nTblPrivileges += privTblPrivCnt(pObj->updateTbs);
5,810✔
955
    nTblPrivileges += privTblPrivCnt(pObj->deleteTbs);
5,810✔
956

957
    int32_t totalPrivileges = nSysPrivileges + nObjPrivileges + nTblPrivileges;
5,810✔
958

959
    if (numOfRows + totalPrivileges >= rows) {
5,810✔
NEW
960
      if (totalPrivileges >= SHOW_PRIVILEGES_STEP_SIZE) {
×
NEW
961
        mError("role:%s, has too many privileges:%d to show", pObj->name, totalPrivileges);
×
NEW
962
        sdbRelease(pSdb, pObj);
×
NEW
963
        TAOS_CHECK_EXIT(TSDB_CODE_MND_TOO_MANY_PRIVS);
×
964
      }
UNCOV
965
      pShow->restore = true;
×
UNCOV
966
      sdbRelease(pSdb, pObj);
×
UNCOV
967
      break;
×
968
    }
969

970
    if (!pBuf && !(pBuf = taosMemoryMalloc(bufSize))) {
5,810✔
UNCOV
971
      sdbRelease(pSdb, pObj);
×
UNCOV
972
      TAOS_CHECK_EXIT(terrno);
×
973
    }
974

975
    cols = 0;
5,810✔
976
    STR_WITH_MAXSIZE_TO_VARSTR(roleName, pObj->name, pShow->pMeta->pSchemas[cols].bytes);
5,810✔
977

978
    // system privileges
979
    SPrivIter privIter = {0};
5,810✔
980
    privIterInit(&privIter, &pObj->sysPrivs);
5,810✔
981
    SPrivInfo *pPrivInfo = NULL;
5,810✔
982
    while (privIterNext(&privIter, &pPrivInfo)) {
140,270✔
983
      cols = 0;
134,460✔
984
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
134,460✔
985
      COL_DATA_SET_VAL_GOTO((const char *)roleName, false, pObj, pShow->pIter, _exit);
134,460✔
986

987
      if ((pColInfo = taosArrayGet(pBlock->pDataBlock, ++cols))) {
134,460✔
988
        STR_WITH_MAXSIZE_TO_VARSTR(pBuf, pPrivInfo->name, pShow->pMeta->pSchemas[cols].bytes);
134,460✔
989
        COL_DATA_SET_VAL_GOTO((const char *)pBuf, false, pObj, pShow->pIter, _exit);
134,460✔
990
      }
991
      if ((pColInfo = taosArrayGet(pBlock->pDataBlock, ++cols))) {
134,460✔
992
        STR_WITH_MAXSIZE_TO_VARSTR(pBuf, privObjGetName(PRIV_OBJ_CLUSTER), pShow->pMeta->pSchemas[cols].bytes);
134,460✔
993
        COL_DATA_SET_VAL_GOTO((const char *)pBuf, false, pObj, pShow->pIter, _exit);
134,460✔
994
      }
995
      // skip db, table, condition, notes, columns, update_time
996
      COL_DATA_SET_EMPTY_VARCHAR(pBuf, 6);
941,220✔
997

998
      numOfRows++;
134,460✔
999
    }
1000

1001
    // object privileges
1002
    pIter = NULL;
5,810✔
1003
    while ((pIter = taosHashIterate(pObj->objPrivs, pIter))) {
44,488✔
1004
      SPrivObjPolicies *pPolices = (SPrivObjPolicies *)pIter;
38,678✔
1005

1006
      char   *key = taosHashGetKey(pPolices, NULL);
38,678✔
1007
      int32_t objType = PRIV_OBJ_UNKNOWN;
38,678✔
1008
      char    dbName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
38,678✔
1009
      char    tblName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
38,678✔
1010

1011
      if ((code = privObjKeyParse(key, &objType, dbName, sizeof(dbName), tblName, sizeof(tblName), false))) {
38,678✔
UNCOV
1012
        sdbRelease(pSdb, pObj);
×
UNCOV
1013
        TAOS_CHECK_EXIT(code);
×
1014
      }
1015

1016
      SPrivIter privIter = {0};
38,678✔
1017
      privIterInit(&privIter, &pPolices->policy);
38,678✔
1018
      SPrivInfo *pPrivInfo = NULL;
38,678✔
1019
      while (privIterNext(&privIter, &pPrivInfo)) {
164,672✔
1020
        cols = 0;
125,994✔
1021
        SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
125,994✔
1022
        COL_DATA_SET_VAL_GOTO((const char *)roleName, false, pObj, pShow->pIter, _exit);
125,994✔
1023

1024
        if ((pColInfo = taosArrayGet(pBlock->pDataBlock, ++cols))) {
125,994✔
1025
          STR_WITH_MAXSIZE_TO_VARSTR(pBuf, pPrivInfo->name, pShow->pMeta->pSchemas[cols].bytes);
125,994✔
1026
          COL_DATA_SET_VAL_GOTO((const char *)pBuf, false, pObj, pShow->pIter, _exit);
125,994✔
1027
        }
1028

1029
        if ((pColInfo = taosArrayGet(pBlock->pDataBlock, ++cols))) {
125,994✔
1030
          STR_WITH_MAXSIZE_TO_VARSTR(pBuf, privObjGetName(objType), pShow->pMeta->pSchemas[cols].bytes);
125,994✔
1031
          COL_DATA_SET_VAL_GOTO((const char *)pBuf, false, pObj, pShow->pIter, _exit);
125,994✔
1032
        }
1033

1034
        if ((pColInfo = taosArrayGet(pBlock->pDataBlock, ++cols))) {
125,994✔
1035
          STR_WITH_MAXSIZE_TO_VARSTR(pBuf, dbName, pShow->pMeta->pSchemas[cols].bytes);
125,994✔
1036
          COL_DATA_SET_VAL_GOTO((const char *)pBuf, false, pObj, pShow->pIter, _exit);
125,994✔
1037
        }
1038

1039
        if ((pColInfo = taosArrayGet(pBlock->pDataBlock, ++cols))) {
125,994✔
1040
          STR_WITH_MAXSIZE_TO_VARSTR(pBuf, tblName, pShow->pMeta->pSchemas[cols].bytes);
125,994✔
1041
          COL_DATA_SET_VAL_GOTO((const char *)pBuf, false, pObj, pShow->pIter, _exit);
125,994✔
1042
        }
1043

1044
        // skip condition, notes, columns, update_time
1045
        COL_DATA_SET_EMPTY_VARCHAR(pBuf, 4);
629,970✔
1046

1047
        numOfRows++;
125,994✔
1048
      }
1049
    }
1050
    // table level privileges
1051
    TAOS_CHECK_EXIT(mndShowTablePrivileges(pReq, pShow, pBlock, rows - numOfRows, pObj, pObj->name, pObj->selectTbs,
5,810✔
1052
                                           PRIV_TBL_SELECT, pBuf, bufSize, &numOfRows));
1053
    TAOS_CHECK_EXIT(mndShowTablePrivileges(pReq, pShow, pBlock, rows - numOfRows, pObj, pObj->name, pObj->insertTbs,
5,810✔
1054
                                           PRIV_TBL_INSERT, pBuf, bufSize, &numOfRows));
1055
    TAOS_CHECK_EXIT(mndShowTablePrivileges(pReq, pShow, pBlock, rows - numOfRows, pObj, pObj->name, pObj->updateTbs,
5,810✔
1056
                                           PRIV_TBL_UPDATE, pBuf, bufSize, &numOfRows));
1057
    TAOS_CHECK_EXIT(mndShowTablePrivileges(pReq, pShow, pBlock, rows - numOfRows, pObj, pObj->name, pObj->deleteTbs,
5,810✔
1058
                                           PRIV_TBL_DELETE, pBuf, bufSize, &numOfRows));
1059
    sdbRelease(pSdb, pObj);
5,810✔
1060
  }
1061

1062
  pShow->numOfRows += numOfRows;
830✔
1063
_exit:
830✔
1064
  taosMemoryFreeClear(pBuf);
830✔
1065
  taosMemoryFreeClear(sql);
830✔
1066
  if (code < 0) {
830✔
NEW
1067
    mError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
UNCOV
1068
    TAOS_RETURN(code);
×
1069
  }
1070
  return numOfRows;
830✔
1071
}
1072

UNCOV
1073
static void mndCancelGetNextPrivileges(SMnode *pMnode, void *pIter) {
×
UNCOV
1074
  SSdb *pSdb = pMnode->pSdb;
×
UNCOV
1075
  sdbCancelFetchByType(pSdb, pIter, SDB_ROLE);
×
UNCOV
1076
}
×
1077

UNCOV
1078
static int32_t mndRetrieveColPrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
×
UNCOV
1079
  int32_t   code = 0, lino = 0;
×
UNCOV
1080
  SMnode   *pMnode = pReq->info.node;
×
UNCOV
1081
  SSdb     *pSdb = pMnode->pSdb;
×
UNCOV
1082
  int32_t   numOfRows = 0;
×
1083
#if 0
1084
  int32_t   cols = 0;
1085
  SRoleObj *pObj = NULL;
1086
  char     *pBuf = NULL, *qBuf = NULL;
1087
  char     *sql = NULL;
1088
  char      roleName[TSDB_ROLE_LEN + VARSTR_HEADER_SIZE] = {0};
1089
  int32_t   bufSize = TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE;
1090

1091
  bool fetchNextInstance = pShow->restore ? false : true;
1092
  pShow->restore = false;
1093

1094
  while (numOfRows < rows) {
1095
    if (fetchNextInstance) {
1096
      pShow->pIter = sdbFetch(pSdb, SDB_ROLE, pShow->pIter, (void **)&pObj);
1097
      if (pShow->pIter == NULL) break;
1098
    } else {
1099
      fetchNextInstance = true;
1100
      void *pKey = taosHashGetKey(pShow->pIter, NULL);
1101
      if (!(pObj = sdbAcquire(pSdb, SDB_ROLE, pKey))) {
1102
        continue;
1103
      }
1104
    }
1105

1106
    int32_t nSysPrivileges = 0, nObjPrivileges = 0;
1107
    if (nSysPrivileges + nObjPrivileges >= rows) {
1108
      pShow->restore = true;
1109
      sdbRelease(pSdb, pObj);
1110
      break;
1111
    }
1112

1113
    if (!pBuf && !(pBuf = taosMemoryMalloc(bufSize))) {
1114
      sdbRelease(pSdb, pObj);
1115
      TAOS_CHECK_EXIT(terrno);
1116
    }
1117

1118
    cols = 0;
1119
    STR_WITH_MAXSIZE_TO_VARSTR(roleName, pObj->name, pShow->pMeta->pSchemas[cols].bytes);
1120

1121
    SPrivIter privIter = {0};
1122
    privIterInit(&privIter, &pObj->sysPrivs);
1123
    SPrivInfo *pPrivInfo = NULL;
1124
    while (privIterNext(&privIter, &pPrivInfo)) {
1125
      cols = 0;
1126
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
1127
      COL_DATA_SET_VAL_GOTO((const char *)roleName, false, pObj, pShow->pIter, _exit);
1128

1129
      if ((pColInfo = taosArrayGet(pBlock->pDataBlock, ++cols))) {
1130
        STR_WITH_MAXSIZE_TO_VARSTR(pBuf, pPrivInfo->name, pShow->pMeta->pSchemas[cols].bytes);
1131
        COL_DATA_SET_VAL_GOTO((const char *)pBuf, false, pObj, pShow->pIter, _exit);
1132
      }
1133

1134
      // for (int32_t i = 0; i < 6; i++) {
1135
      //   if ((pColInfo = taosArrayGet(pBlock->pDataBlock, ++cols))) {
1136
      //     STR_WITH_MAXSIZE_TO_VARSTR(pBuf, "", 2);
1137
      //     COL_DATA_SET_VAL_GOTO((const char *)pBuf, false, pObj, pShow->pIter, _exit);
1138
      //   }
1139
      // }
1140
      // skip db, table, condition, notes, columns, update_time
1141
      COL_DATA_SET_EMPTY_VARCHAR(pBuf, 7);
1142
      numOfRows++;
1143
    }
1144

1145
    sdbRelease(pSdb, pObj);
1146
  }
1147

1148
  pShow->numOfRows += numOfRows;
1149
_exit:
1150
  taosMemoryFreeClear(pBuf);
1151
  taosMemoryFreeClear(sql);
1152
  if (code < 0) {
1153
    mError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
1154
    TAOS_RETURN(code);
1155
  }
1156
#endif
UNCOV
1157
  return numOfRows;
×
1158
}
1159

UNCOV
1160
static void mndCancelGetNextColPrivileges(SMnode *pMnode, void *pIter) {
×
UNCOV
1161
  SSdb *pSdb = pMnode->pSdb;
×
UNCOV
1162
  sdbCancelFetchByType(pSdb, pIter, SDB_ROLE);
×
UNCOV
1163
}
×
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