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

taosdata / TDengine / #4822

27 Oct 2025 05:42AM UTC coverage: 59.732% (+1.0%) from 58.728%
#4822

push

travis-ci

web-flow
Merge pull request #33377 from taosdata/fix/main/rename-udf-path

fix: update UDF example links to correct file paths

121214 of 258518 branches covered (46.89%)

Branch coverage included in aggregate %.

193636 of 268583 relevant lines covered (72.1%)

4002399.5 hits per line

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

58.42
/source/dnode/mnode/impl/src/mndUser.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 "mndUser.h"
23
#include "audit.h"
24
#include "mndDb.h"
25
#include "mndPrivilege.h"
26
#include "mndShow.h"
27
#include "mndStb.h"
28
#include "mndTopic.h"
29
#include "mndTrans.h"
30
#include "tbase64.h"
31

32
// clang-format on
33

34
#define USER_VER_NUMBER                      7
35
#define USER_VER_SUPPORT_WHITELIST           5
36
#define USER_VER_SUPPORT_WHITELIT_DUAL_STACK 7
37
#define USER_RESERVE_SIZE                    63
38

39
#define BIT_FLAG_MASK(n)              (1 << n)
40
#define BIT_FLAG_SET_MASK(val, mask)  ((val) |= (mask))
41
#define BIT_FLAG_TEST_MASK(val, mask) (((val) & (mask)) != 0)
42

43
#define PRIVILEGE_TYPE_ALL       BIT_FLAG_MASK(0)
44
#define PRIVILEGE_TYPE_READ      BIT_FLAG_MASK(1)
45
#define PRIVILEGE_TYPE_WRITE     BIT_FLAG_MASK(2)
46
#define PRIVILEGE_TYPE_SUBSCRIBE BIT_FLAG_MASK(3)
47
#define PRIVILEGE_TYPE_ALTER     BIT_FLAG_MASK(4)
48

49
#define ALTER_USER_ADD_PRIVS(_type) ((_type) == TSDB_ALTER_USER_ADD_PRIVILEGES)
50
#define ALTER_USER_DEL_PRIVS(_type) ((_type) == TSDB_ALTER_USER_DEL_PRIVILEGES)
51

52
#define ALTER_USER_ALL_PRIV(_priv) (BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_ALL))
53
#define ALTER_USER_READ_PRIV(_priv) \
54
  (BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_READ) || BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_ALL))
55
#define ALTER_USER_WRITE_PRIV(_priv) \
56
  (BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_WRITE) || BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_ALL))
57
#define ALTER_USER_ALTER_PRIV(_priv) \
58
  (BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_ALTER) || BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_ALL))
59
#define ALTER_USER_SUBSCRIBE_PRIV(_priv) (BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_SUBSCRIBE))
60

61
#define ALTER_USER_TARGET_DB(_tbname) (0 == (_tbname)[0])
62
#define ALTER_USER_TARGET_TB(_tbname) (0 != (_tbname)[0])
63

64
#define ALTER_USER_ADD_READ_DB_PRIV(_type, _priv, _tbname) \
65
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_READ_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
66
#define ALTER_USER_DEL_READ_DB_PRIV(_type, _priv, _tbname) \
67
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_READ_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
68
#define ALTER_USER_ADD_WRITE_DB_PRIV(_type, _priv, _tbname) \
69
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_WRITE_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
70
#define ALTER_USER_DEL_WRITE_DB_PRIV(_type, _priv, _tbname) \
71
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_WRITE_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
72
#define ALTER_USER_ADD_ALTER_DB_PRIV(_type, _priv, _tbname) \
73
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_ALTER_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
74
#define ALTER_USER_DEL_ALTER_DB_PRIV(_type, _priv, _tbname) \
75
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_ALTER_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
76
#define ALTER_USER_ADD_ALL_DB_PRIV(_type, _priv, _tbname) \
77
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_ALL_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
78
#define ALTER_USER_DEL_ALL_DB_PRIV(_type, _priv, _tbname) \
79
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_ALL_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
80

81
#define ALTER_USER_ADD_READ_TB_PRIV(_type, _priv, _tbname) \
82
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_READ_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
83
#define ALTER_USER_DEL_READ_TB_PRIV(_type, _priv, _tbname) \
84
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_READ_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
85
#define ALTER_USER_ADD_WRITE_TB_PRIV(_type, _priv, _tbname) \
86
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_WRITE_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
87
#define ALTER_USER_DEL_WRITE_TB_PRIV(_type, _priv, _tbname) \
88
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_WRITE_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
89
#define ALTER_USER_ADD_ALTER_TB_PRIV(_type, _priv, _tbname) \
90
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_ALTER_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
91
#define ALTER_USER_DEL_ALTER_TB_PRIV(_type, _priv, _tbname) \
92
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_ALTER_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
93
#define ALTER_USER_ADD_ALL_TB_PRIV(_type, _priv, _tbname) \
94
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_ALL_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
95
#define ALTER_USER_DEL_ALL_TB_PRIV(_type, _priv, _tbname) \
96
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_ALL_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
97

98
#define ALTER_USER_ADD_SUBSCRIBE_TOPIC_PRIV(_type, _priv) \
99
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_SUBSCRIBE_PRIV(_priv))
100
#define ALTER_USER_DEL_SUBSCRIBE_TOPIC_PRIV(_type, _priv) \
101
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_SUBSCRIBE_PRIV(_priv))
102

103
static int32_t createDefaultIpWhiteList(SIpWhiteListDual **ppWhiteList);
104
static int32_t createIpWhiteList(void *buf, int32_t len, SIpWhiteListDual **ppWhiteList);
105

106
static bool isIpWhiteListEqual(SIpWhiteListDual *a, SIpWhiteListDual *b);
107
static bool isIpRangeEqual(SIpRange *a, SIpRange *b);
108

109
void destroyIpWhiteTab(SHashObj *pIpWhiteTab);
110

111
#define MND_MAX_USE_HOST (TSDB_PRIVILEDGE_HOST_LEN / 24)
112

113
static int32_t  mndCreateDefaultUsers(SMnode *pMnode);
114
static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw);
115
static int32_t  mndUserActionInsert(SSdb *pSdb, SUserObj *pUser);
116
static int32_t  mndUserActionDelete(SSdb *pSdb, SUserObj *pUser);
117
static int32_t  mndUserActionUpdate(SSdb *pSdb, SUserObj *pOld, SUserObj *pNew);
118
static int32_t  mndCreateUser(SMnode *pMnode, char *acct, SCreateUserReq *pCreate, SRpcMsg *pReq);
119
static int32_t  mndProcessCreateUserReq(SRpcMsg *pReq);
120
static int32_t  mndProcessAlterUserReq(SRpcMsg *pReq);
121
static int32_t  mndProcessDropUserReq(SRpcMsg *pReq);
122
static int32_t  mndProcessGetUserAuthReq(SRpcMsg *pReq);
123
static int32_t  mndProcessGetUserWhiteListReq(SRpcMsg *pReq);
124
static int32_t  mndRetrieveUsers(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
125
static int32_t  mndRetrieveUsersFull(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
126
static void     mndCancelGetNextUser(SMnode *pMnode, void *pIter);
127
static int32_t  mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
128
static void     mndCancelGetNextPrivileges(SMnode *pMnode, void *pIter);
129
static int32_t  mndFetchAllIpWhite(SMnode *pMnode, SHashObj **ppIpWhiteTab);
130
static int32_t  mndProcesSRetrieveIpWhiteReq(SRpcMsg *pReq);
131
static int32_t  mndUpdateIpWhiteImpl(SHashObj *pIpWhiteTab, char *user, char *fqdn, int8_t type, bool *pUpdate);
132

133
static int32_t ipWhiteMgtUpdateAll(SMnode *pMnode);
134
static int32_t ipWhiteMgtRemove(char *user);
135

136
static int32_t createIpWhiteListFromOldVer(void *buf, int32_t len, SIpWhiteList **ppList);
137
static int32_t tDerializeIpWhileListFromOldVer(void *buf, int32_t len, SIpWhiteList *pList);
138
typedef struct {
139
  SHashObj      *pIpWhiteTab;
140
  int64_t        ver;
141
  TdThreadRwlock rw;
142
} SIpWhiteMgt;
143

144
static SIpWhiteMgt ipWhiteMgt;
145

146
const static SIpV4Range defaultIpRange = {.ip = 16777343, .mask = 32};
147

148
static int32_t ipWhiteMgtInit() {
1,306✔
149
  ipWhiteMgt.pIpWhiteTab = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), 1, HASH_ENTRY_LOCK);
1,306✔
150
  if (ipWhiteMgt.pIpWhiteTab == NULL) {
1,306!
151
    TAOS_RETURN(terrno);
×
152
  }
153
  ipWhiteMgt.ver = 0;
1,306✔
154
  (void)taosThreadRwlockInit(&ipWhiteMgt.rw, NULL);
1,306✔
155
  TAOS_RETURN(0);
1,306✔
156
}
157
void ipWhiteMgtCleanup() {
1,306✔
158
  destroyIpWhiteTab(ipWhiteMgt.pIpWhiteTab);
1,306✔
159
  (void)taosThreadRwlockDestroy(&ipWhiteMgt.rw);
1,306✔
160
}
1,306✔
161

162
int32_t ipWhiteMgtUpdate(SMnode *pMnode, char *user, SIpWhiteListDual *pNew) {
2,462✔
163
  int32_t code = 0;
2,462✔
164
  int32_t lino = 0;
2,462✔
165
  bool    update = true;
2,462✔
166
  SArray *fqdns = NULL;
2,462✔
167
  (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
2,462✔
168
  SIpWhiteListDual **ppList = taosHashGet(ipWhiteMgt.pIpWhiteTab, user, strlen(user));
2,462✔
169

170
  if (ppList == NULL || *ppList == NULL) {
2,644!
171
    SIpWhiteListDual *p = cloneIpWhiteList(pNew);
182✔
172
    if (p == NULL) {
182!
173
      update = false;
×
174
      TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
175
    }
176
    if ((code = taosHashPut(ipWhiteMgt.pIpWhiteTab, user, strlen(user), &p, sizeof(void *))) != 0) {
182!
177
      update = false;
×
178
      taosMemoryFree(p);
×
179
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
180
    }
181
  } else {
182
    SIpWhiteListDual *pOld = *ppList;
2,280✔
183
    if (isIpWhiteListEqual(pOld, pNew)) {
2,280✔
184
      update = false;
2,277✔
185
    } else {
186
      taosMemoryFree(pOld);
3!
187
      SIpWhiteListDual *p = cloneIpWhiteList(pNew);
3✔
188
      if (p == NULL) {
3!
189
        update = false;
×
190
        TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
191
      }
192
      if ((code = taosHashPut(ipWhiteMgt.pIpWhiteTab, user, strlen(user), &p, sizeof(void *))) != 0) {
3!
193
        update = false;
×
194
        taosMemoryFree(p);
×
195
        TAOS_CHECK_GOTO(code, &lino, _OVER);
×
196
      }
197
    }
198
  }
199

200
  fqdns = mndGetAllDnodeFqdns(pMnode);  // TODO: update this line after refactor api
2,462✔
201
  if (fqdns == NULL) {
2,462!
202
    update = false;
×
203
    TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
204
  }
205

206
  for (int i = 0; i < taosArrayGetSize(fqdns); i++) {
5,196✔
207
    char *fqdn = taosArrayGetP(fqdns, i);
2,734✔
208
    bool  upd = false;
2,734✔
209
    TAOS_CHECK_GOTO(mndUpdateIpWhiteImpl(ipWhiteMgt.pIpWhiteTab, TSDB_DEFAULT_USER, fqdn, IP_WHITE_ADD, &upd), &lino,
2,734!
210
                    _OVER);
211
    update |= upd;
2,734✔
212
    TAOS_CHECK_GOTO(mndUpdateIpWhiteImpl(ipWhiteMgt.pIpWhiteTab, user, fqdn, IP_WHITE_ADD, &upd), &lino, _OVER);
2,734!
213
    update |= upd;
2,734✔
214
  }
215

216
  if (update) ipWhiteMgt.ver++;
2,462✔
217

218
_OVER:
2,277✔
219
  (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
2,462✔
220
  taosArrayDestroyP(fqdns, NULL);
2,462✔
221
  if (code < 0) {
2,462!
222
    mError("failed to update ip white list for user: %s at line %d since %s", user, lino, tstrerror(code));
×
223
  }
224
  TAOS_RETURN(code);
2,462✔
225
}
226
int32_t ipWhiteMgtRemove(char *user) {
72✔
227
  bool    update = true;
72✔
228
  int32_t code = 0;
72✔
229
  (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
72✔
230
  SIpWhiteListDual **ppList = taosHashGet(ipWhiteMgt.pIpWhiteTab, user, strlen(user));
72✔
231
  if (ppList == NULL || *ppList == NULL) {
72!
232
    update = false;
×
233
  } else {
234
    taosMemoryFree(*ppList);
72!
235
    code = taosHashRemove(ipWhiteMgt.pIpWhiteTab, user, strlen(user));
72✔
236
    if (code != 0) {
72!
237
      update = false;
×
238
    }
239
  }
240

241
  if (update) ipWhiteMgt.ver++;
72!
242
  (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
72✔
243
  return 0;
72✔
244
}
245

246
bool isRangeInWhiteList(SIpWhiteListDual *pList, SIpRange *range) {
9,233✔
247
  for (int i = 0; i < pList->num; i++) {
9,255✔
248
    if (isIpRangeEqual(&pList->pIpRanges[i], range)) {
9,245✔
249
      return true;
9,223✔
250
    }
251
  }
252
  return false;
10✔
253
}
254

255
static int32_t ipWhiteMgtUpdateAll(SMnode *pMnode) {
1,568✔
256
  SHashObj *pNew = NULL;
1,568✔
257
  TAOS_CHECK_RETURN(mndFetchAllIpWhite(pMnode, &pNew));
1,568!
258

259
  SHashObj *pOld = ipWhiteMgt.pIpWhiteTab;
1,568✔
260

261
  ipWhiteMgt.pIpWhiteTab = pNew;
1,568✔
262
  ipWhiteMgt.ver++;
1,568✔
263

264
  destroyIpWhiteTab(pOld);
1,568✔
265
  TAOS_RETURN(0);
1,568✔
266
}
267

268
int64_t mndGetIpWhiteVer(SMnode *pMnode) {
88,076✔
269
  int64_t ver = 0;
88,076✔
270
  int32_t code = 0;
88,076✔
271
  (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
88,076✔
272
  if (ipWhiteMgt.ver == 0) {
88,076!
273
    // get user and dnode ip white list
274
    if ((code = ipWhiteMgtUpdateAll(pMnode)) != 0) {
×
275
      (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
×
276
      mError("%s failed to update ip white list since %s", __func__, tstrerror(code));
×
277
      return ver;
×
278
    }
279
    ipWhiteMgt.ver = taosGetTimestampMs();
×
280
  }
281
  ver = ipWhiteMgt.ver;
88,076✔
282
  (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
88,076✔
283

284
  if (mndEnableIpWhiteList(pMnode) == 0 || tsEnableWhiteList == false) {
88,076!
285
    ver = 0;
88,022✔
286
  }
287
  mDebug("ip-white-list on mnode ver: %" PRId64, ver);
88,076✔
288
  return ver;
88,076✔
289
}
290

291
int32_t mndUpdateIpWhiteImpl(SHashObj *pIpWhiteTab, char *user, char *fqdn, int8_t type, bool *pUpdate) {
10,085✔
292
  int32_t lino = 0;
10,085✔
293
  bool    update = false;
10,085✔
294

295
  SIpRange range = {0};
10,085✔
296
  SIpAddr  addr = {0};
10,085✔
297
  int32_t  code = taosGetIpFromFqdn(tsEnableIpv6, fqdn, &addr);
10,085✔
298
  if (code) {
10,085!
299
    mError("failed to get ip from fqdn: %s at line %d since %s", fqdn, lino, tstrerror(code));
×
300
    TAOS_RETURN(TSDB_CODE_TSC_INVALID_FQDN);
×
301
  }
302

303
  code = tIpStrToUint(&addr, &range);
10,085✔
304
  if (code) {
10,085!
305
    TAOS_RETURN(code);
×
306
  }
307

308
  tIpRangeSetMask(&range, 32);
10,085✔
309

310
  mDebug("ip-white-list may update for user: %s, fqdn: %s", user, fqdn);
10,085✔
311
  SIpWhiteListDual **ppList = taosHashGet(pIpWhiteTab, user, strlen(user));
10,085✔
312
  SIpWhiteListDual  *pList = NULL;
10,085✔
313
  if (ppList != NULL && *ppList != NULL) {
10,085!
314
    pList = *ppList;
9,233✔
315
  }
316

317
  if (type == IP_WHITE_ADD) {
10,085!
318
    if (pList == NULL) {
10,085✔
319
      SIpWhiteListDual *pNewList = taosMemoryCalloc(1, sizeof(SIpWhiteListDual) + sizeof(SIpRange));
852!
320
      if (pNewList == NULL) {
852!
321
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
322
      }
323
      (void)memcpy(pNewList->pIpRanges, &range, sizeof(SIpRange));
852✔
324
      pNewList->num = 1;
852✔
325

326
      if ((code = taosHashPut(pIpWhiteTab, user, strlen(user), &pNewList, sizeof(void *))) != 0) {
852!
327
        taosMemoryFree(pNewList);
×
328
        TAOS_CHECK_GOTO(code, &lino, _OVER);
×
329
      }
330
      update = true;
852✔
331
    } else {
332
      if (!isRangeInWhiteList(pList, &range)) {
9,233✔
333
        int32_t           sz = sizeof(SIpWhiteListDual) + sizeof(SIpRange) * (pList->num + 1);
10✔
334
        SIpWhiteListDual *pNewList = taosMemoryCalloc(1, sz);
10!
335
        if (pNewList == NULL) {
10!
336
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
337
        }
338
        (void)memcpy(pNewList->pIpRanges, pList->pIpRanges, sizeof(SIpRange) * (pList->num));
10✔
339
        memcpy(&pNewList->pIpRanges[pList->num], &range, sizeof(SIpRange));
10✔
340

341
        pNewList->num = pList->num + 1;
10✔
342

343
        if ((code = taosHashPut(pIpWhiteTab, user, strlen(user), &pNewList, sizeof(void *))) != 0) {
10!
344
          taosMemoryFree(pNewList);
×
345
          TAOS_CHECK_GOTO(code, &lino, _OVER);
×
346
        }
347
        taosMemoryFree(pList);
10!
348
        update = true;
10✔
349
      }
350
    }
351
  } else if (type == IP_WHITE_DROP) {
×
352
    if (pList != NULL) {
×
353
      if (isRangeInWhiteList(pList, &range)) {
×
354
        if (pList->num == 1) {
×
355
          if (taosHashRemove(pIpWhiteTab, user, strlen(user)) < 0) {
×
356
            mError("failed to remove ip-white-list for user: %s at line %d", user, lino);
×
357
          }
358
          taosMemoryFree(pList);
×
359
        } else {
360
          int32_t           idx = 0;
×
361
          int32_t           sz = sizeof(SIpWhiteListDual) + sizeof(SIpRange) * (pList->num - 1);
×
362
          SIpWhiteListDual *pNewList = taosMemoryCalloc(1, sz);
×
363
          if (pNewList == NULL) {
×
364
            TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
365
          }
366
          for (int i = 0; i < pList->num; i++) {
×
367
            SIpRange *e = &pList->pIpRanges[i];
×
368
            if (!isIpRangeEqual(e, &range)) {
×
369
              memcpy(&pNewList->pIpRanges[idx], e, sizeof(SIpRange));
×
370
              idx++;
×
371
            }
372
          }
373
          pNewList->num = idx;
×
374
          if ((code = taosHashPut(pIpWhiteTab, user, strlen(user), &pNewList, sizeof(void *)) != 0)) {
×
375
            taosMemoryFree(pNewList);
×
376
            TAOS_CHECK_GOTO(code, &lino, _OVER);
×
377
          }
378
          taosMemoryFree(pList);
×
379
        }
380
        update = true;
×
381
      }
382
    }
383
  }
384
  if (update) {
10,085✔
385
    mDebug("ip-white-list update for user: %s, fqdn: %s", user, fqdn);
862✔
386
  }
387

388
_OVER:
9,230✔
389
  if (pUpdate) *pUpdate = update;
10,085✔
390
  if (code < 0) {
10,085!
391
    mError("failed to update ip-white-list for user: %s, fqdn: %s at line %d since %s", user, fqdn, lino,
×
392
           tstrerror(code));
393
  }
394
  TAOS_RETURN(code);
10,085✔
395
}
396

397
int32_t mndRefreshUserIpWhiteList(SMnode *pMnode) {
1,568✔
398
  int32_t code = 0;
1,568✔
399
  (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
1,568✔
400

401
  if ((code = ipWhiteMgtUpdateAll(pMnode)) != 0) {
1,568!
402
    (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
×
403
    TAOS_RETURN(code);
×
404
  }
405
  ipWhiteMgt.ver = taosGetTimestampMs();
1,568✔
406
  (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
1,568✔
407

408
  TAOS_RETURN(code);
1,568✔
409
}
410

411
int32_t mndUpdateIpWhiteForAllUser(SMnode *pMnode, char *user, char *fqdn, int8_t type, int8_t lock) {
1,334✔
412
  int32_t code = 0;
1,334✔
413
  int32_t lino = 0;
1,334✔
414
  bool    update = false;
1,334✔
415

416
  if (lock) {
1,334!
417
    (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
1,334✔
418
    if (ipWhiteMgt.ver == 0) {
1,334!
419
      TAOS_CHECK_GOTO(ipWhiteMgtUpdateAll(pMnode), &lino, _OVER);
×
420
      ipWhiteMgt.ver = taosGetTimestampMs();
×
421
      mInfo("update ip-white-list, user: %s, ver: %" PRId64, user, ipWhiteMgt.ver);
×
422
    }
423
  }
424

425
  TAOS_CHECK_GOTO(mndUpdateIpWhiteImpl(ipWhiteMgt.pIpWhiteTab, user, fqdn, type, &update), &lino, _OVER);
1,334!
426

427
  void *pIter = taosHashIterate(ipWhiteMgt.pIpWhiteTab, NULL);
1,334✔
428
  while (pIter) {
2,668✔
429
    size_t klen = 0;
1,334✔
430
    char  *key = taosHashGetKey(pIter, &klen);
1,334✔
431

432
    char *keyDup = taosMemoryCalloc(1, klen + 1);
1,334!
433
    if (keyDup == NULL) {
1,334!
434
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
435
    }
436
    (void)memcpy(keyDup, key, klen);
1,334✔
437
    bool upd = false;
1,334✔
438
    code = mndUpdateIpWhiteImpl(ipWhiteMgt.pIpWhiteTab, keyDup, fqdn, type, &upd);
1,334✔
439
    update |= upd;
1,334✔
440
    if (code < 0) {
1,334!
441
      taosMemoryFree(keyDup);
×
442
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
443
    }
444
    taosMemoryFree(keyDup);
1,334!
445

446
    pIter = taosHashIterate(ipWhiteMgt.pIpWhiteTab, pIter);
1,334✔
447
  }
448

449
_OVER:
1,334✔
450
  if (update) ipWhiteMgt.ver++;
1,334✔
451
  if (lock) (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
1,334!
452
  if (code < 0) {
1,334!
453
    mError("failed to update ip-white-list for user: %s, fqdn: %s at line %d since %s", user, fqdn, lino,
×
454
           tstrerror(code));
455
  }
456

457
  TAOS_RETURN(code);
1,334✔
458
}
459

460
static int64_t ipWhiteMgtFillMsg(SUpdateIpWhite *pUpdate) {
5✔
461
  int64_t ver = 0;
5✔
462
  (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
5✔
463
  ver = ipWhiteMgt.ver;
5✔
464
  int32_t num = taosHashGetSize(ipWhiteMgt.pIpWhiteTab);
5✔
465

466
  pUpdate->pUserIpWhite = taosMemoryCalloc(1, num * sizeof(SUpdateUserIpWhite));
5!
467
  if (pUpdate->pUserIpWhite == NULL) {
5!
468
    (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
×
469
    TAOS_RETURN(terrno);
×
470
  }
471

472
  void   *pIter = taosHashIterate(ipWhiteMgt.pIpWhiteTab, NULL);
5✔
473
  int32_t i = 0;
5✔
474
  while (pIter) {
10✔
475
    SUpdateUserIpWhite *pUser = &pUpdate->pUserIpWhite[i];
5✔
476
    SIpWhiteListDual   *list = *(SIpWhiteListDual **)pIter;
5✔
477

478
    size_t klen;
479
    char  *key = taosHashGetKey(pIter, &klen);
5✔
480
    if (list->num != 0) {
5!
481
      pUser->ver = ver;
5✔
482
      (void)memcpy(pUser->user, key, klen);
5✔
483
      pUser->numOfRange = list->num;
5✔
484
      pUser->pIpRanges = taosMemoryCalloc(1, list->num * sizeof(SIpRange));
5!
485
      if (pUser->pIpRanges == NULL) {
5!
486
        (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
×
487
        TAOS_RETURN(terrno);
×
488
      }
489
      (void)memcpy(pUser->pIpRanges, list->pIpRanges, list->num * sizeof(SIpRange));
5✔
490
      i++;
5✔
491
    }
492
    pIter = taosHashIterate(ipWhiteMgt.pIpWhiteTab, pIter);
5✔
493
  }
494
  pUpdate->numOfUser = i;
5✔
495
  pUpdate->ver = ver;
5✔
496

497
  (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
5✔
498
  TAOS_RETURN(0);
5✔
499
}
500

501
void destroyIpWhiteTab(SHashObj *pIpWhiteTab) {
2,874✔
502
  if (pIpWhiteTab == NULL) return;
2,874!
503

504
  void *pIter = taosHashIterate(pIpWhiteTab, NULL);
2,874✔
505
  while (pIter) {
4,486✔
506
    SIpWhiteListDual *list = *(SIpWhiteListDual **)pIter;
1,612✔
507
    taosMemoryFree(list);
1,612!
508
    pIter = taosHashIterate(pIpWhiteTab, pIter);
1,612✔
509
  }
510

511
  taosHashCleanup(pIpWhiteTab);
2,874✔
512
}
513
int32_t mndFetchAllIpWhite(SMnode *pMnode, SHashObj **ppIpWhiteTab) {
1,568✔
514
  int32_t   code = 0;
1,568✔
515
  int32_t   lino = 0;
1,568✔
516
  SSdb     *pSdb = pMnode->pSdb;
1,568✔
517
  void     *pIter = NULL;
1,568✔
518
  SHashObj *pIpWhiteTab = NULL;
1,568✔
519
  SArray   *pUserNames = NULL;
1,568✔
520
  SArray   *fqdns = NULL;
1,568✔
521

522
  pIpWhiteTab = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), 1, HASH_ENTRY_LOCK);
1,568✔
523
  if (pIpWhiteTab == NULL) {
1,568!
524
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
525
  }
526
  pUserNames = taosArrayInit(8, sizeof(void *));
1,568✔
527
  if (pUserNames == NULL) {
1,568!
528
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
529
  }
530

531
  while (1) {
650✔
532
    SUserObj *pUser = NULL;
2,218✔
533
    pIter = sdbFetch(pSdb, SDB_USER, pIter, (void **)&pUser);
2,218✔
534
    if (pIter == NULL) break;
2,218✔
535

536
    SIpWhiteListDual *pWhiteList = cloneIpWhiteList(pUser->pIpWhiteListDual);
650✔
537
    if (pWhiteList == NULL) {
650!
538
      sdbRelease(pSdb, pUser);
×
539
      sdbCancelFetch(pSdb, pIter);
×
540
      TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
541
    }
542
    if ((code = taosHashPut(pIpWhiteTab, pUser->user, strlen(pUser->user), &pWhiteList, sizeof(void *))) != 0) {
650!
543
      taosMemoryFree(pWhiteList);
×
544
      sdbRelease(pSdb, pUser);
×
545
      sdbCancelFetch(pSdb, pIter);
×
546
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
547
    }
548

549
    char *name = taosStrdup(pUser->user);
650!
550
    if (name == NULL) {
650!
551
      sdbRelease(pSdb, pUser);
×
552
      sdbCancelFetch(pSdb, pIter);
×
553
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
554
    }
555
    if (taosArrayPush(pUserNames, &name) == NULL) {
650!
556
      taosMemoryFree(name);
×
557
      sdbRelease(pSdb, pUser);
×
558
      sdbCancelFetch(pSdb, pIter);
×
559
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
560
    }
561

562
    sdbRelease(pSdb, pUser);
650✔
563
  }
564

565
  bool found = false;
1,568✔
566
  for (int i = 0; i < taosArrayGetSize(pUserNames); i++) {
1,593✔
567
    char *name = taosArrayGetP(pUserNames, i);
648✔
568
    if (strlen(name) == strlen(TSDB_DEFAULT_USER) && strncmp(name, TSDB_DEFAULT_USER, strlen(TSDB_DEFAULT_USER)) == 0) {
648!
569
      found = true;
623✔
570
      break;
623✔
571
    }
572
  }
573
  if (found == false) {
1,568✔
574
    char *name = taosStrdup(TSDB_DEFAULT_USER);
945!
575
    if (name == NULL) {
945!
576
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
577
    }
578
    if (taosArrayPush(pUserNames, &name) == NULL) {
945!
579
      taosMemoryFree(name);
×
580
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
581
    }
582
  }
583

584
  fqdns = mndGetAllDnodeFqdns(pMnode);  // TODO: refactor this line after refactor api
1,568✔
585
  if (fqdns == NULL) {
1,568!
586
    TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
587
  }
588

589
  for (int i = 0; i < taosArrayGetSize(fqdns); i++) {
3,469✔
590
    char *fqdn = taosArrayGetP(fqdns, i);
1,901✔
591

592
    for (int j = 0; j < taosArrayGetSize(pUserNames); j++) {
3,850✔
593
      char *name = taosArrayGetP(pUserNames, j);
1,949✔
594
      TAOS_CHECK_GOTO(mndUpdateIpWhiteImpl(pIpWhiteTab, name, fqdn, IP_WHITE_ADD, NULL), &lino, _OVER);
1,949!
595
    }
596
  }
597

598
_OVER:
1,568✔
599
  taosArrayDestroyP(fqdns, NULL);
1,568✔
600
  taosArrayDestroyP(pUserNames, NULL);
1,568✔
601

602
  if (code < 0) {
1,568!
603
    mError("failed to fetch all ip white list at line %d since %s", lino, tstrerror(code));
×
604
    destroyIpWhiteTab(pIpWhiteTab);
×
605
    pIpWhiteTab = NULL;
×
606
  }
607
  *ppIpWhiteTab = pIpWhiteTab;
1,568✔
608
  TAOS_RETURN(code);
1,568✔
609
}
610

611
int32_t mndInitUser(SMnode *pMnode) {
1,306✔
612
  TAOS_CHECK_RETURN(ipWhiteMgtInit());
1,306!
613

614
  SSdbTable table = {
1,306✔
615
      .sdbType = SDB_USER,
616
      .keyType = SDB_KEY_BINARY,
617
      .deployFp = (SdbDeployFp)mndCreateDefaultUsers,
618
      .encodeFp = (SdbEncodeFp)mndUserActionEncode,
619
      .decodeFp = (SdbDecodeFp)mndUserActionDecode,
620
      .insertFp = (SdbInsertFp)mndUserActionInsert,
621
      .updateFp = (SdbUpdateFp)mndUserActionUpdate,
622
      .deleteFp = (SdbDeleteFp)mndUserActionDelete,
623
  };
624

625
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_USER, mndProcessCreateUserReq);
1,306✔
626
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_USER, mndProcessAlterUserReq);
1,306✔
627
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_USER, mndProcessDropUserReq);
1,306✔
628
  mndSetMsgHandle(pMnode, TDMT_MND_GET_USER_AUTH, mndProcessGetUserAuthReq);
1,306✔
629
  mndSetMsgHandle(pMnode, TDMT_MND_GET_USER_WHITELIST, mndProcessGetUserWhiteListReq);
1,306✔
630
  mndSetMsgHandle(pMnode, TDMT_MND_GET_USER_WHITELIST_DUAL, mndProcessGetUserWhiteListReq);
1,306✔
631

632
  mndSetMsgHandle(pMnode, TDMT_MND_RETRIEVE_IP_WHITE, mndProcesSRetrieveIpWhiteReq);
1,306✔
633
  mndSetMsgHandle(pMnode, TDMT_MND_RETRIEVE_IP_WHITE_DUAL, mndProcesSRetrieveIpWhiteReq);
1,306✔
634

635
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_USER, mndRetrieveUsers);
1,306✔
636
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_USER, mndCancelGetNextUser);
1,306✔
637
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_USER_FULL, mndRetrieveUsersFull);
1,306✔
638
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_USER_FULL, mndCancelGetNextUser);
1,306✔
639
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_PRIVILEGES, mndRetrievePrivileges);
1,306✔
640
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_PRIVILEGES, mndCancelGetNextPrivileges);
1,306✔
641
  return sdbSetTable(pMnode->pSdb, table);
1,306✔
642
}
643

644
void mndCleanupUser(SMnode *pMnode) { ipWhiteMgtCleanup(); }
1,306✔
645

646
static bool isDefaultRange(SIpRange *pRange) {
2✔
647
  int32_t code = 0;
2✔
648
  int32_t lino = 0;
2✔
649

650
  SIpRange range4 = {0};
2✔
651
  SIpRange range6 = {0};
2✔
652

653
  code = createDefaultIp4Range(&range4);
2✔
654
  TSDB_CHECK_CODE(code, lino, _error);
2!
655

656
  code = createDefaultIp6Range(&range6);
2✔
657
  TSDB_CHECK_CODE(code, lino, _error);
2!
658

659
  if (isIpRangeEqual(pRange, &range4) || (isIpRangeEqual(pRange, &range6))) {
2!
660
    return true;
×
661
  }
662
_error:
2✔
663
  return false;
2✔
664
};
665

666
static int32_t ipRangeListToStr(SIpRange *range, int32_t num, char *buf, int64_t bufLen) {
152✔
667
  int32_t len = 0;
152✔
668
  for (int i = 0; i < num; i++) {
460✔
669
    SIpRange *pRange = &range[i];
308✔
670
    SIpAddr   addr = {0};
308✔
671
    tIpUintToStr(pRange, &addr);
308✔
672

673
    len += tsnprintf(buf + len, bufLen - len, "%s/%d,", IP_ADDR_STR(&addr), addr.mask);
308✔
674
  }
675
  if (len > 0) buf[len - 1] = 0;
152!
676
  return len;
152✔
677
}
678

679
static bool isIpRangeEqual(SIpRange *a, SIpRange *b) {
13,808✔
680
  // equal or not
681
  if (a->type != b->type) {
13,808✔
682
    return false;
12✔
683
  }
684
  if (a->type == 0) {
13,796✔
685
    SIpV4Range *aP4 = &a->ipV4;
11,519✔
686
    SIpV4Range *bP4 = &b->ipV4;
11,519✔
687
    if (aP4->ip != bP4->ip || aP4->mask != bP4->mask) {
11,519!
688
      return false;
19✔
689
    } else {
690
      return true;
11,500✔
691
    }
692
  } else {
693
    SIpV6Range *aP6 = &a->ipV6;
2,277✔
694
    SIpV6Range *bP6 = &b->ipV6;
2,277✔
695
    if (aP6->addr[0] != bP6->addr[0] || aP6->addr[1] != bP6->addr[1] || aP6->mask != bP6->mask) {
2,277!
696
      return false;
×
697
    } else {
698
      return true;
2,277✔
699
    }
700
  }
701

702
  return true;
703
}
704
static bool isRangeInIpWhiteList(SIpWhiteListDual *pList, SIpRange *tgt) {
1✔
705
  for (int i = 0; i < pList->num; i++) {
4✔
706
    if (isIpRangeEqual(&pList->pIpRanges[i], tgt)) return true;
3!
707
  }
708
  return false;
1✔
709
}
710
static bool isIpWhiteListEqual(SIpWhiteListDual *a, SIpWhiteListDual *b) {
2,280✔
711
  if (a->num != b->num) {
2,280✔
712
    return false;
3✔
713
  }
714
  for (int i = 0; i < a->num; i++) {
6,831✔
715
    if (!isIpRangeEqual(&a->pIpRanges[i], &b->pIpRanges[i])) {
4,554!
716
      return false;
×
717
    }
718
  }
719
  return true;
2,277✔
720
}
721
int32_t convertIpWhiteListToStr(SIpWhiteListDual *pList, char **buf) {
152✔
722
  if (pList->num == 0) {
152!
723
    *buf = NULL;
×
724
    return 0;
×
725
  }
726
  int64_t bufLen = pList->num * 256;
152✔
727
  *buf = taosMemoryCalloc(1, bufLen);
152!
728
  if (*buf == NULL) {
152!
729
    return 0;
×
730
  }
731

732
  int32_t len = ipRangeListToStr(pList->pIpRanges, pList->num, *buf, bufLen);
152✔
733
  if (len == 0) {
152!
734
    taosMemoryFreeClear(*buf);
×
735
    return 0;
×
736
  }
737
  return strlen(*buf);
152✔
738
}
739
int32_t tSerializeIpWhiteList(void *buf, int32_t len, SIpWhiteListDual *pList, uint32_t *pLen) {
5,956✔
740
  int32_t  code = 0;
5,956✔
741
  int32_t  lino = 0;
5,956✔
742
  int32_t  tlen = 0;
5,956✔
743
  SEncoder encoder = {0};
5,956✔
744
  tEncoderInit(&encoder, buf, len);
5,956✔
745

746
  TAOS_CHECK_GOTO(tStartEncode(&encoder), &lino, _OVER);
5,956!
747
  TAOS_CHECK_GOTO(tEncodeI32(&encoder, pList->num), &lino, _OVER);
11,912!
748

749
  for (int i = 0; i < pList->num; i++) {
17,873✔
750
    SIpRange *pRange = &(pList->pIpRanges[i]);
11,917✔
751
    TAOS_CHECK_GOTO(tSerializeIpRange(&encoder, pRange), &lino, _OVER);
11,917!
752
  }
753

754
  tEndEncode(&encoder);
5,956✔
755

756
  tlen = encoder.pos;
5,956✔
757
_OVER:
5,956✔
758
  tEncoderClear(&encoder);
5,956✔
759
  if (code < 0) {
5,956!
760
    mError("failed to serialize ip white list at line %d since %s", lino, tstrerror(code));
×
761
  }
762
  if (pLen) *pLen = tlen;
5,956!
763
  TAOS_RETURN(code);
5,956✔
764
}
765

766
int32_t tDerializeIpWhileList(void *buf, int32_t len, SIpWhiteListDual *pList) {
4,033✔
767
  int32_t  code = 0;
4,033✔
768
  int32_t  lino = 0;
4,033✔
769
  SDecoder decoder = {0};
4,033✔
770
  tDecoderInit(&decoder, buf, len);
4,033✔
771

772
  TAOS_CHECK_GOTO(tStartDecode(&decoder), &lino, _OVER);
4,033!
773
  TAOS_CHECK_GOTO(tDecodeI32(&decoder, &pList->num), &lino, _OVER);
8,066!
774

775
  for (int i = 0; i < pList->num; i++) {
12,102✔
776
    SIpRange *pRange = &(pList->pIpRanges[i]);
8,069✔
777
    TAOS_CHECK_GOTO(tDeserializeIpRange(&decoder, pRange), &lino, _OVER);
8,069!
778
  }
779

780
_OVER:
4,033✔
781
  tEndDecode(&decoder);
4,033✔
782
  tDecoderClear(&decoder);
4,033✔
783
  if (code < 0) {
4,033!
784
    mError("failed to deserialize ip white list at line %d since %s", lino, tstrerror(code));
×
785
  }
786
  TAOS_RETURN(code);
4,033✔
787
}
788

789
int32_t tDerializeIpWhileListFromOldVer(void *buf, int32_t len, SIpWhiteList *pList) {
×
790
  int32_t  code = 0;
×
791
  int32_t  lino = 0;
×
792
  SDecoder decoder = {0};
×
793
  tDecoderInit(&decoder, buf, len);
×
794

795
  TAOS_CHECK_GOTO(tStartDecode(&decoder), &lino, _OVER);
×
796
  TAOS_CHECK_GOTO(tDecodeI32(&decoder, &pList->num), &lino, _OVER);
×
797

798
  for (int i = 0; i < pList->num; i++) {
×
799
    SIpV4Range *pIp4 = &(pList->pIpRange[i]);
×
800
    TAOS_CHECK_GOTO(tDecodeU32(&decoder, &pIp4->ip), &lino, _OVER);
×
801
    TAOS_CHECK_GOTO(tDecodeU32(&decoder, &pIp4->mask), &lino, _OVER);
×
802
  }
803

804
_OVER:
×
805
  tEndDecode(&decoder);
×
806
  tDecoderClear(&decoder);
×
807
  if (code < 0) {
×
808
    mError("failed to deserialize ip white list at line %d since %s", lino, tstrerror(code));
×
809
  }
810
  TAOS_RETURN(code);
×
811
}
812

813
static int32_t createIpWhiteList(void *buf, int32_t len, SIpWhiteListDual **ppList) {
4,033✔
814
  int32_t           code = 0;
4,033✔
815
  int32_t           lino = 0;
4,033✔
816
  int32_t           num = 0;
4,033✔
817
  SIpWhiteListDual *p = NULL;
4,033✔
818
  SDecoder          decoder = {0};
4,033✔
819
  tDecoderInit(&decoder, buf, len);
4,033✔
820

821
  TAOS_CHECK_GOTO(tStartDecode(&decoder), &lino, _OVER);
4,033!
822
  TAOS_CHECK_GOTO(tDecodeI32(&decoder, &num), &lino, _OVER);
4,033!
823

824
  p = taosMemoryCalloc(1, sizeof(SIpWhiteListDual) + num * sizeof(SIpRange));
4,033!
825
  if (p == NULL) {
4,033!
826
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
827
  }
828
  TAOS_CHECK_GOTO(tDerializeIpWhileList(buf, len, p), &lino, _OVER);
4,033!
829

830
_OVER:
4,033✔
831
  tEndDecode(&decoder);
4,033✔
832
  tDecoderClear(&decoder);
4,033✔
833
  if (code < 0) {
4,033!
834
    taosMemoryFreeClear(p);
×
835
    mError("failed to create ip white list at line %d since %s", lino, tstrerror(code));
×
836
  }
837
  *ppList = p;
4,033✔
838
  TAOS_RETURN(code);
4,033✔
839
}
840

841
static int32_t createIpWhiteListFromOldVer(void *buf, int32_t len, SIpWhiteList **ppList) {
×
842
  int32_t       code = 0;
×
843
  int32_t       lino = 0;
×
844
  int32_t       num = 0;
×
845
  SIpWhiteList *p = NULL;
×
846
  SDecoder      decoder = {0};
×
847
  tDecoderInit(&decoder, buf, len);
×
848

849
  TAOS_CHECK_GOTO(tStartDecode(&decoder), &lino, _OVER);
×
850
  TAOS_CHECK_GOTO(tDecodeI32(&decoder, &num), &lino, _OVER);
×
851

852
  p = taosMemoryCalloc(1, sizeof(SIpWhiteList) + num * sizeof(SIpV4Range));
×
853
  if (p == NULL) {
×
854
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
855
  }
856
  TAOS_CHECK_GOTO(tDerializeIpWhileListFromOldVer(buf, len, p), &lino, _OVER);
×
857

858
_OVER:
×
859
  tEndDecode(&decoder);
×
860
  tDecoderClear(&decoder);
×
861
  if (code < 0) {
×
862
    taosMemoryFreeClear(p);
×
863
    mError("failed to create ip white list at line %d since %s", lino, tstrerror(code));
×
864
  }
865
  *ppList = p;
×
866
  TAOS_RETURN(code);
×
867
}
868

869
static int32_t createDefaultIpWhiteList(SIpWhiteListDual **ppWhiteList) {
1,031✔
870
  int32_t code = 0;
1,031✔
871
  int32_t lino = 0;
1,031✔
872
  *ppWhiteList = taosMemoryCalloc(1, sizeof(SIpWhiteListDual) + sizeof(SIpRange) * 2);
1,031!
873
  if (*ppWhiteList == NULL) {
1,031!
874
    TAOS_RETURN(terrno);
×
875
  }
876
  (*ppWhiteList)->num = 2;
1,031✔
877

878
  SIpRange v4 = {0};
1,031✔
879
  SIpRange v6 = {0};
1,031✔
880

881
#ifndef TD_ASTRA
882
  code = createDefaultIp4Range(&v4);
1,031✔
883
  TSDB_CHECK_CODE(code, lino, _error);
1,031!
884

885
  code = createDefaultIp6Range(&v6);
1,031✔
886
  TSDB_CHECK_CODE(code, lino, _error);
1,031!
887

888
#endif
889

890
_error:
1,031✔
891
  if (code != 0) {
1,031!
892
    taosMemoryFree(*ppWhiteList);
×
893
    *ppWhiteList = NULL;
×
894
    mError("failed to create default ip white list at line %d since %s", __LINE__, tstrerror(code));
×
895
  } else {
896
    memcpy(&(*ppWhiteList)->pIpRanges[0], &v4, sizeof(SIpRange));
1,031✔
897
    memcpy(&(*ppWhiteList)->pIpRanges[1], &v6, sizeof(SIpRange));
1,031✔
898
  }
899
  return 0;
1,031✔
900
}
901

902
static int32_t mndCreateDefaultUser(SMnode *pMnode, char *acct, char *user, char *pass) {
852✔
903
  int32_t  code = 0;
852✔
904
  int32_t  lino = 0;
852✔
905
  SUserObj userObj = {0};
852✔
906
  taosEncryptPass_c((uint8_t *)pass, strlen(pass), userObj.pass);
852✔
907
  tstrncpy(userObj.user, user, TSDB_USER_LEN);
852✔
908
  tstrncpy(userObj.acct, acct, TSDB_USER_LEN);
852✔
909
  userObj.createdTime = taosGetTimestampMs();
852✔
910
  userObj.updateTime = userObj.createdTime;
852✔
911
  userObj.sysInfo = 1;
852✔
912
  userObj.enable = 1;
852✔
913
  userObj.ipWhiteListVer = taosGetTimestampMs();
852✔
914
  TAOS_CHECK_RETURN(createDefaultIpWhiteList(&userObj.pIpWhiteListDual));
852!
915
  if (strcmp(user, TSDB_DEFAULT_USER) == 0) {
852!
916
    userObj.superUser = 1;
852✔
917
    userObj.createdb = 1;
852✔
918
  }
919

920
  SSdbRaw *pRaw = mndUserActionEncode(&userObj);
852✔
921
  if (pRaw == NULL) goto _ERROR;
852!
922
  TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_READY), &lino, _ERROR);
852!
923

924
  mInfo("user:%s, will be created when deploying, raw:%p", userObj.user, pRaw);
852!
925

926
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_NOTHING, NULL, "create-user");
852✔
927
  if (pTrans == NULL) {
852!
928
    sdbFreeRaw(pRaw);
×
929
    mError("user:%s, failed to create since %s", userObj.user, terrstr());
×
930
    goto _ERROR;
×
931
  }
932
  mInfo("trans:%d, used to create user:%s", pTrans->id, userObj.user);
852!
933

934
  if (mndTransAppendCommitlog(pTrans, pRaw) != 0) {
852!
935
    mError("trans:%d, failed to commit redo log since %s", pTrans->id, terrstr());
×
936
    mndTransDrop(pTrans);
×
937
    goto _ERROR;
×
938
  }
939
  TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_READY), &lino, _ERROR);
852!
940

941
  if (mndTransPrepare(pMnode, pTrans) != 0) {
852!
942
    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
×
943
    mndTransDrop(pTrans);
×
944
    goto _ERROR;
×
945
  }
946

947
  mndTransDrop(pTrans);
852✔
948
  taosMemoryFree(userObj.pIpWhiteListDual);
852!
949
  return 0;
852✔
950
_ERROR:
×
951
  taosMemoryFree(userObj.pIpWhiteListDual);
×
952
  TAOS_RETURN(terrno ? terrno : TSDB_CODE_APP_ERROR);
×
953
}
954

955
static int32_t mndCreateDefaultUsers(SMnode *pMnode) {
852✔
956
  return mndCreateDefaultUser(pMnode, TSDB_DEFAULT_USER, TSDB_DEFAULT_USER, TSDB_DEFAULT_PASS);
852✔
957
}
958

959
SSdbRaw *mndUserActionEncode(SUserObj *pUser) {
5,956✔
960
  int32_t code = 0;
5,956✔
961
  int32_t lino = 0;
5,956✔
962
  int32_t ipWhiteReserve =
×
963
      pUser->pIpWhiteListDual ? (sizeof(SIpRange) * pUser->pIpWhiteListDual->num + sizeof(SIpWhiteListDual) + 4) : 16;
5,956!
964
  int32_t numOfReadDbs = taosHashGetSize(pUser->readDbs);
5,956✔
965
  int32_t numOfWriteDbs = taosHashGetSize(pUser->writeDbs);
5,956✔
966
  int32_t numOfReadTbs = taosHashGetSize(pUser->readTbs);
5,956✔
967
  int32_t numOfWriteTbs = taosHashGetSize(pUser->writeTbs);
5,956✔
968
  int32_t numOfAlterTbs = taosHashGetSize(pUser->alterTbs);
5,956✔
969
  int32_t numOfReadViews = taosHashGetSize(pUser->readViews);
5,956✔
970
  int32_t numOfWriteViews = taosHashGetSize(pUser->writeViews);
5,956✔
971
  int32_t numOfAlterViews = taosHashGetSize(pUser->alterViews);
5,956✔
972
  int32_t numOfTopics = taosHashGetSize(pUser->topics);
5,956✔
973
  int32_t numOfUseDbs = taosHashGetSize(pUser->useDbs);
5,956✔
974
  int32_t size = sizeof(SUserObj) + USER_RESERVE_SIZE + (numOfReadDbs + numOfWriteDbs) * TSDB_DB_FNAME_LEN +
5,956✔
975
                 numOfTopics * TSDB_TOPIC_FNAME_LEN + ipWhiteReserve;
5,956✔
976
  char    *buf = NULL;
5,956✔
977
  SSdbRaw *pRaw = NULL;
5,956✔
978

979
  char *stb = taosHashIterate(pUser->readTbs, NULL);
5,956✔
980
  while (stb != NULL) {
169,969✔
981
    size_t keyLen = 0;
164,013✔
982
    void  *key = taosHashGetKey(stb, &keyLen);
164,013✔
983
    size += sizeof(int32_t);
164,013✔
984
    size += keyLen;
164,013✔
985

986
    size_t valueLen = 0;
164,013✔
987
    valueLen = strlen(stb) + 1;
164,013✔
988
    size += sizeof(int32_t);
164,013✔
989
    size += valueLen;
164,013✔
990
    stb = taosHashIterate(pUser->readTbs, stb);
164,013✔
991
  }
992

993
  stb = taosHashIterate(pUser->writeTbs, NULL);
5,956✔
994
  while (stb != NULL) {
169,578✔
995
    size_t keyLen = 0;
163,622✔
996
    void  *key = taosHashGetKey(stb, &keyLen);
163,622✔
997
    size += sizeof(int32_t);
163,622✔
998
    size += keyLen;
163,622✔
999

1000
    size_t valueLen = 0;
163,622✔
1001
    valueLen = strlen(stb) + 1;
163,622✔
1002
    size += sizeof(int32_t);
163,622✔
1003
    size += valueLen;
163,622✔
1004
    stb = taosHashIterate(pUser->writeTbs, stb);
163,622✔
1005
  }
1006

1007
  stb = taosHashIterate(pUser->alterTbs, NULL);
5,956✔
1008
  while (stb != NULL) {
6,309✔
1009
    size_t keyLen = 0;
353✔
1010
    void  *key = taosHashGetKey(stb, &keyLen);
353✔
1011
    size += sizeof(int32_t);
353✔
1012
    size += keyLen;
353✔
1013

1014
    size_t valueLen = 0;
353✔
1015
    valueLen = strlen(stb) + 1;
353✔
1016
    size += sizeof(int32_t);
353✔
1017
    size += valueLen;
353✔
1018
    stb = taosHashIterate(pUser->alterTbs, stb);
353✔
1019
  }
1020

1021
  stb = taosHashIterate(pUser->readViews, NULL);
5,956✔
1022
  while (stb != NULL) {
6,074✔
1023
    size_t keyLen = 0;
118✔
1024
    void  *key = taosHashGetKey(stb, &keyLen);
118✔
1025
    size += sizeof(int32_t);
118✔
1026
    size += keyLen;
118✔
1027

1028
    size_t valueLen = 0;
118✔
1029
    valueLen = strlen(stb) + 1;
118✔
1030
    size += sizeof(int32_t);
118✔
1031
    size += valueLen;
118✔
1032
    stb = taosHashIterate(pUser->readViews, stb);
118✔
1033
  }
1034

1035
  stb = taosHashIterate(pUser->writeViews, NULL);
5,956✔
1036
  while (stb != NULL) {
6,047✔
1037
    size_t keyLen = 0;
91✔
1038
    void  *key = taosHashGetKey(stb, &keyLen);
91✔
1039
    size += sizeof(int32_t);
91✔
1040
    size += keyLen;
91✔
1041

1042
    size_t valueLen = 0;
91✔
1043
    valueLen = strlen(stb) + 1;
91✔
1044
    size += sizeof(int32_t);
91✔
1045
    size += valueLen;
91✔
1046
    stb = taosHashIterate(pUser->writeViews, stb);
91✔
1047
  }
1048

1049
  stb = taosHashIterate(pUser->alterViews, NULL);
5,956✔
1050
  while (stb != NULL) {
6,045✔
1051
    size_t keyLen = 0;
89✔
1052
    void  *key = taosHashGetKey(stb, &keyLen);
89✔
1053
    size += sizeof(int32_t);
89✔
1054
    size += keyLen;
89✔
1055

1056
    size_t valueLen = 0;
89✔
1057
    valueLen = strlen(stb) + 1;
89✔
1058
    size += sizeof(int32_t);
89✔
1059
    size += valueLen;
89✔
1060
    stb = taosHashIterate(pUser->alterViews, stb);
89✔
1061
  }
1062

1063
  int32_t *useDb = taosHashIterate(pUser->useDbs, NULL);
5,956✔
1064
  while (useDb != NULL) {
8,422✔
1065
    size_t keyLen = 0;
2,466✔
1066
    void  *key = taosHashGetKey(useDb, &keyLen);
2,466✔
1067
    size += sizeof(int32_t);
2,466✔
1068
    size += keyLen;
2,466✔
1069
    size += sizeof(int32_t);
2,466✔
1070
    useDb = taosHashIterate(pUser->useDbs, useDb);
2,466✔
1071
  }
1072

1073
  pRaw = sdbAllocRaw(SDB_USER, USER_VER_NUMBER, size);
5,956✔
1074
  if (pRaw == NULL) {
5,956!
1075
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1076
  }
1077

1078
  int32_t dataPos = 0;
5,956✔
1079
  SDB_SET_BINARY(pRaw, dataPos, pUser->user, TSDB_USER_LEN, _OVER)
5,956!
1080
  SDB_SET_BINARY(pRaw, dataPos, pUser->pass, TSDB_PASSWORD_LEN, _OVER)
5,956!
1081
  SDB_SET_BINARY(pRaw, dataPos, pUser->acct, TSDB_USER_LEN, _OVER)
5,956!
1082
  SDB_SET_INT64(pRaw, dataPos, pUser->createdTime, _OVER)
5,956!
1083
  SDB_SET_INT64(pRaw, dataPos, pUser->updateTime, _OVER)
5,956!
1084
  SDB_SET_INT8(pRaw, dataPos, pUser->superUser, _OVER)
5,956!
1085
  SDB_SET_INT8(pRaw, dataPos, pUser->sysInfo, _OVER)
5,956!
1086
  SDB_SET_INT8(pRaw, dataPos, pUser->enable, _OVER)
5,956!
1087
  SDB_SET_UINT8(pRaw, dataPos, pUser->flag, _OVER)
5,956!
1088
  SDB_SET_INT32(pRaw, dataPos, pUser->authVersion, _OVER)
5,956!
1089
  SDB_SET_INT32(pRaw, dataPos, pUser->passVersion, _OVER)
5,956!
1090
  SDB_SET_INT32(pRaw, dataPos, numOfReadDbs, _OVER)
5,956!
1091
  SDB_SET_INT32(pRaw, dataPos, numOfWriteDbs, _OVER)
5,956!
1092
  SDB_SET_INT32(pRaw, dataPos, numOfTopics, _OVER)
5,956!
1093

1094
  char *db = taosHashIterate(pUser->readDbs, NULL);
5,956✔
1095
  while (db != NULL) {
6,589✔
1096
    SDB_SET_BINARY(pRaw, dataPos, db, TSDB_DB_FNAME_LEN, _OVER);
633!
1097
    db = taosHashIterate(pUser->readDbs, db);
633✔
1098
  }
1099

1100
  db = taosHashIterate(pUser->writeDbs, NULL);
5,956✔
1101
  while (db != NULL) {
6,566✔
1102
    SDB_SET_BINARY(pRaw, dataPos, db, TSDB_DB_FNAME_LEN, _OVER);
610!
1103
    db = taosHashIterate(pUser->writeDbs, db);
610✔
1104
  }
1105

1106
  char *topic = taosHashIterate(pUser->topics, NULL);
5,956✔
1107
  while (topic != NULL) {
6,004✔
1108
    SDB_SET_BINARY(pRaw, dataPos, topic, TSDB_TOPIC_FNAME_LEN, _OVER);
48!
1109
    topic = taosHashIterate(pUser->topics, topic);
48✔
1110
  }
1111

1112
  SDB_SET_INT32(pRaw, dataPos, numOfReadTbs, _OVER)
5,956!
1113
  SDB_SET_INT32(pRaw, dataPos, numOfWriteTbs, _OVER)
5,956!
1114
  SDB_SET_INT32(pRaw, dataPos, numOfAlterTbs, _OVER)
5,956!
1115
  SDB_SET_INT32(pRaw, dataPos, numOfReadViews, _OVER)
5,956!
1116
  SDB_SET_INT32(pRaw, dataPos, numOfWriteViews, _OVER)
5,956!
1117
  SDB_SET_INT32(pRaw, dataPos, numOfAlterViews, _OVER)
5,956!
1118
  SDB_SET_INT32(pRaw, dataPos, numOfUseDbs, _OVER)
5,956!
1119

1120
  stb = taosHashIterate(pUser->readTbs, NULL);
5,956✔
1121
  while (stb != NULL) {
169,969✔
1122
    size_t keyLen = 0;
164,013✔
1123
    void  *key = taosHashGetKey(stb, &keyLen);
164,013✔
1124
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
164,013!
1125
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
164,013!
1126

1127
    size_t valueLen = 0;
164,013✔
1128
    valueLen = strlen(stb) + 1;
164,013✔
1129
    SDB_SET_INT32(pRaw, dataPos, valueLen, _OVER)
164,013!
1130
    SDB_SET_BINARY(pRaw, dataPos, stb, valueLen, _OVER);
164,013!
1131
    stb = taosHashIterate(pUser->readTbs, stb);
164,013✔
1132
  }
1133

1134
  stb = taosHashIterate(pUser->writeTbs, NULL);
5,956✔
1135
  while (stb != NULL) {
169,578✔
1136
    size_t keyLen = 0;
163,622✔
1137
    void  *key = taosHashGetKey(stb, &keyLen);
163,622✔
1138
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
163,622!
1139
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
163,622!
1140

1141
    size_t valueLen = 0;
163,622✔
1142
    valueLen = strlen(stb) + 1;
163,622✔
1143
    SDB_SET_INT32(pRaw, dataPos, valueLen, _OVER)
163,622!
1144
    SDB_SET_BINARY(pRaw, dataPos, stb, valueLen, _OVER);
163,622!
1145
    stb = taosHashIterate(pUser->writeTbs, stb);
163,622✔
1146
  }
1147

1148
  stb = taosHashIterate(pUser->alterTbs, NULL);
5,956✔
1149
  while (stb != NULL) {
6,309✔
1150
    size_t keyLen = 0;
353✔
1151
    void  *key = taosHashGetKey(stb, &keyLen);
353✔
1152
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
353!
1153
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
353!
1154

1155
    size_t valueLen = 0;
353✔
1156
    valueLen = strlen(stb) + 1;
353✔
1157
    SDB_SET_INT32(pRaw, dataPos, valueLen, _OVER)
353!
1158
    SDB_SET_BINARY(pRaw, dataPos, stb, valueLen, _OVER);
353!
1159
    stb = taosHashIterate(pUser->alterTbs, stb);
353✔
1160
  }
1161

1162
  stb = taosHashIterate(pUser->readViews, NULL);
5,956✔
1163
  while (stb != NULL) {
6,074✔
1164
    size_t keyLen = 0;
118✔
1165
    void  *key = taosHashGetKey(stb, &keyLen);
118✔
1166
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
118!
1167
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
118!
1168

1169
    size_t valueLen = 0;
118✔
1170
    valueLen = strlen(stb) + 1;
118✔
1171
    SDB_SET_INT32(pRaw, dataPos, valueLen, _OVER)
118!
1172
    SDB_SET_BINARY(pRaw, dataPos, stb, valueLen, _OVER);
118!
1173
    stb = taosHashIterate(pUser->readViews, stb);
118✔
1174
  }
1175

1176
  stb = taosHashIterate(pUser->writeViews, NULL);
5,956✔
1177
  while (stb != NULL) {
6,047✔
1178
    size_t keyLen = 0;
91✔
1179
    void  *key = taosHashGetKey(stb, &keyLen);
91✔
1180
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
91!
1181
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
91!
1182

1183
    size_t valueLen = 0;
91✔
1184
    valueLen = strlen(stb) + 1;
91✔
1185
    SDB_SET_INT32(pRaw, dataPos, valueLen, _OVER)
91!
1186
    SDB_SET_BINARY(pRaw, dataPos, stb, valueLen, _OVER);
91!
1187
    stb = taosHashIterate(pUser->writeViews, stb);
91✔
1188
  }
1189

1190
  stb = taosHashIterate(pUser->alterViews, NULL);
5,956✔
1191
  while (stb != NULL) {
6,045✔
1192
    size_t keyLen = 0;
89✔
1193
    void  *key = taosHashGetKey(stb, &keyLen);
89✔
1194
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
89!
1195
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
89!
1196

1197
    size_t valueLen = 0;
89✔
1198
    valueLen = strlen(stb) + 1;
89✔
1199
    SDB_SET_INT32(pRaw, dataPos, valueLen, _OVER)
89!
1200
    SDB_SET_BINARY(pRaw, dataPos, stb, valueLen, _OVER);
89!
1201
    stb = taosHashIterate(pUser->alterViews, stb);
89✔
1202
  }
1203

1204
  useDb = taosHashIterate(pUser->useDbs, NULL);
5,956✔
1205
  while (useDb != NULL) {
8,422✔
1206
    size_t keyLen = 0;
2,466✔
1207
    void  *key = taosHashGetKey(useDb, &keyLen);
2,466✔
1208
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
2,466!
1209
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
2,466!
1210

1211
    SDB_SET_INT32(pRaw, dataPos, *useDb, _OVER)
2,466!
1212
    useDb = taosHashIterate(pUser->useDbs, useDb);
2,466✔
1213
  }
1214

1215
  // save white list
1216
  int32_t num = pUser->pIpWhiteListDual->num;
5,956✔
1217
  int32_t tlen = sizeof(SIpWhiteListDual) + num * sizeof(SIpRange) + 4;
5,956✔
1218
  if ((buf = taosMemoryCalloc(1, tlen)) == NULL) {
5,956!
1219
    TAOS_CHECK_GOTO(terrno, NULL, _OVER);
×
1220
  }
1221
  int32_t len = 0;
5,956✔
1222
  TAOS_CHECK_GOTO(tSerializeIpWhiteList(buf, tlen, pUser->pIpWhiteListDual, &len), &lino, _OVER);
5,956!
1223

1224
  SDB_SET_INT32(pRaw, dataPos, len, _OVER);
5,956!
1225
  SDB_SET_BINARY(pRaw, dataPos, buf, len, _OVER);
5,956!
1226

1227
  SDB_SET_INT64(pRaw, dataPos, pUser->ipWhiteListVer, _OVER);
5,956!
1228
  SDB_SET_INT8(pRaw, dataPos, pUser->passEncryptAlgorithm, _OVER);
5,956!
1229

1230
  SDB_SET_RESERVE(pRaw, dataPos, USER_RESERVE_SIZE, _OVER)
5,956!
1231
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
5,956!
1232

1233
_OVER:
5,956✔
1234
  taosMemoryFree(buf);
5,956!
1235
  if (code < 0) {
5,956!
1236
    mError("user:%s, failed to encode user action to raw:%p at line %d since %s", pUser->user, pRaw, lino,
×
1237
           tstrerror(code));
1238
    sdbFreeRaw(pRaw);
×
1239
    pRaw = NULL;
×
1240
    terrno = code;
×
1241
  }
1242

1243
  mTrace("user:%s, encode user action to raw:%p, row:%p", pUser->user, pRaw, pUser);
5,956✔
1244
  return pRaw;
5,956✔
1245
}
1246

1247
static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) {
4,033✔
1248
  int32_t   code = 0;
4,033✔
1249
  int32_t   lino = 0;
4,033✔
1250
  SSdbRow  *pRow = NULL;
4,033✔
1251
  SUserObj *pUser = NULL;
4,033✔
1252
  char     *key = NULL;
4,033✔
1253
  char     *value = NULL;
4,033✔
1254

1255
  int8_t sver = 0;
4,033✔
1256
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) {
4,033!
1257
    TAOS_CHECK_GOTO(TSDB_CODE_INVALID_PTR, &lino, _OVER);
×
1258
  }
1259

1260
  if (sver < 1 || sver > USER_VER_NUMBER) {
4,033!
1261
    TAOS_CHECK_GOTO(TSDB_CODE_SDB_INVALID_DATA_VER, &lino, _OVER);
×
1262
  }
1263

1264
  pRow = sdbAllocRow(sizeof(SUserObj));
4,033✔
1265
  if (pRow == NULL) {
4,033!
1266
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1267
  }
1268

1269
  pUser = sdbGetRowObj(pRow);
4,033✔
1270
  if (pUser == NULL) {
4,033!
1271
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1272
  }
1273

1274
  int32_t dataPos = 0;
4,033✔
1275
  SDB_GET_BINARY(pRaw, dataPos, pUser->user, TSDB_USER_LEN, _OVER)
4,033!
1276
  SDB_GET_BINARY(pRaw, dataPos, pUser->pass, TSDB_PASSWORD_LEN, _OVER)
4,033!
1277
  SDB_GET_BINARY(pRaw, dataPos, pUser->acct, TSDB_USER_LEN, _OVER)
4,033!
1278
  SDB_GET_INT64(pRaw, dataPos, &pUser->createdTime, _OVER)
4,033!
1279
  SDB_GET_INT64(pRaw, dataPos, &pUser->updateTime, _OVER)
4,033!
1280
  SDB_GET_INT8(pRaw, dataPos, &pUser->superUser, _OVER)
4,033!
1281
  SDB_GET_INT8(pRaw, dataPos, &pUser->sysInfo, _OVER)
4,033!
1282
  SDB_GET_INT8(pRaw, dataPos, &pUser->enable, _OVER)
4,033!
1283
  SDB_GET_UINT8(pRaw, dataPos, &pUser->flag, _OVER)
4,033!
1284
  if (pUser->superUser) pUser->createdb = 1;
4,033✔
1285
  SDB_GET_INT32(pRaw, dataPos, &pUser->authVersion, _OVER)
4,033!
1286
  if (sver >= 4) {
4,033!
1287
    SDB_GET_INT32(pRaw, dataPos, &pUser->passVersion, _OVER)
4,033!
1288
  }
1289

1290
  int32_t numOfReadDbs = 0;
4,033✔
1291
  int32_t numOfWriteDbs = 0;
4,033✔
1292
  int32_t numOfTopics = 0;
4,033✔
1293
  SDB_GET_INT32(pRaw, dataPos, &numOfReadDbs, _OVER)
4,033!
1294
  SDB_GET_INT32(pRaw, dataPos, &numOfWriteDbs, _OVER)
4,033!
1295
  if (sver >= 2) {
4,033!
1296
    SDB_GET_INT32(pRaw, dataPos, &numOfTopics, _OVER)
4,033!
1297
  }
1298

1299
  pUser->readDbs = taosHashInit(numOfReadDbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
4,033✔
1300
  pUser->writeDbs =
4,033✔
1301
      taosHashInit(numOfWriteDbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
4,033✔
1302
  pUser->topics = taosHashInit(numOfTopics, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
4,033✔
1303
  if (pUser->readDbs == NULL || pUser->writeDbs == NULL || pUser->topics == NULL) {
4,033!
1304
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1305
    goto _OVER;
×
1306
  }
1307

1308
  for (int32_t i = 0; i < numOfReadDbs; ++i) {
4,639✔
1309
    char db[TSDB_DB_FNAME_LEN] = {0};
606✔
1310
    SDB_GET_BINARY(pRaw, dataPos, db, TSDB_DB_FNAME_LEN, _OVER)
606!
1311
    int32_t len = strlen(db) + 1;
606✔
1312
    TAOS_CHECK_GOTO(taosHashPut(pUser->readDbs, db, len, db, TSDB_DB_FNAME_LEN), &lino, _OVER);
606!
1313
  }
1314

1315
  for (int32_t i = 0; i < numOfWriteDbs; ++i) {
4,618✔
1316
    char db[TSDB_DB_FNAME_LEN] = {0};
585✔
1317
    SDB_GET_BINARY(pRaw, dataPos, db, TSDB_DB_FNAME_LEN, _OVER)
585!
1318
    int32_t len = strlen(db) + 1;
585✔
1319
    TAOS_CHECK_GOTO(taosHashPut(pUser->writeDbs, db, len, db, TSDB_DB_FNAME_LEN), &lino, _OVER);
585!
1320
  }
1321

1322
  if (sver >= 2) {
4,033!
1323
    for (int32_t i = 0; i < numOfTopics; ++i) {
4,077✔
1324
      char topic[TSDB_TOPIC_FNAME_LEN] = {0};
44✔
1325
      SDB_GET_BINARY(pRaw, dataPos, topic, TSDB_TOPIC_FNAME_LEN, _OVER)
44!
1326
      int32_t len = strlen(topic) + 1;
44✔
1327
      TAOS_CHECK_GOTO(taosHashPut(pUser->topics, topic, len, topic, TSDB_TOPIC_FNAME_LEN), &lino, _OVER);
44!
1328
    }
1329
  }
1330

1331
  if (sver >= 3) {
4,033!
1332
    int32_t numOfReadTbs = 0;
4,033✔
1333
    int32_t numOfWriteTbs = 0;
4,033✔
1334
    int32_t numOfAlterTbs = 0;
4,033✔
1335
    int32_t numOfReadViews = 0;
4,033✔
1336
    int32_t numOfWriteViews = 0;
4,033✔
1337
    int32_t numOfAlterViews = 0;
4,033✔
1338
    int32_t numOfUseDbs = 0;
4,033✔
1339
    SDB_GET_INT32(pRaw, dataPos, &numOfReadTbs, _OVER)
4,033!
1340
    SDB_GET_INT32(pRaw, dataPos, &numOfWriteTbs, _OVER)
4,033!
1341
    if (sver >= 6) {
4,033!
1342
      SDB_GET_INT32(pRaw, dataPos, &numOfAlterTbs, _OVER)
4,033!
1343
      SDB_GET_INT32(pRaw, dataPos, &numOfReadViews, _OVER)
4,033!
1344
      SDB_GET_INT32(pRaw, dataPos, &numOfWriteViews, _OVER)
4,033!
1345
      SDB_GET_INT32(pRaw, dataPos, &numOfAlterViews, _OVER)
4,033!
1346
    }
1347
    SDB_GET_INT32(pRaw, dataPos, &numOfUseDbs, _OVER)
4,033!
1348

1349
    pUser->readTbs =
4,033✔
1350
        taosHashInit(numOfReadTbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
4,033✔
1351
    pUser->writeTbs =
4,033✔
1352
        taosHashInit(numOfWriteTbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
4,033✔
1353
    pUser->alterTbs =
4,033✔
1354
        taosHashInit(numOfAlterTbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
4,033✔
1355

1356
    pUser->readViews =
4,033✔
1357
        taosHashInit(numOfReadViews, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
4,033✔
1358
    pUser->writeViews =
4,033✔
1359
        taosHashInit(numOfWriteViews, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
4,033✔
1360
    pUser->alterViews =
4,033✔
1361
        taosHashInit(numOfAlterViews, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
4,033✔
1362

1363
    pUser->useDbs = taosHashInit(numOfUseDbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
4,033✔
1364

1365
    if (pUser->readTbs == NULL || pUser->writeTbs == NULL || pUser->alterTbs == NULL || pUser->readViews == NULL ||
4,033!
1366
        pUser->writeViews == NULL || pUser->alterViews == NULL || pUser->useDbs == NULL) {
4,033!
1367
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1368
      goto _OVER;
×
1369
    }
1370

1371
    for (int32_t i = 0; i < numOfReadTbs; ++i) {
165,865✔
1372
      int32_t keyLen = 0;
161,832✔
1373
      SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
161,832!
1374

1375
      TAOS_MEMORY_REALLOC(key, keyLen * sizeof(char));
161,832!
1376
      if (key == NULL) {
161,832!
1377
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1378
      }
1379
      (void)memset(key, 0, keyLen);
161,832✔
1380
      SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
161,832!
1381

1382
      int32_t valuelen = 0;
161,832✔
1383
      SDB_GET_INT32(pRaw, dataPos, &valuelen, _OVER);
161,832!
1384
      TAOS_MEMORY_REALLOC(value, valuelen * sizeof(char));
161,832!
1385
      if (value == NULL) {
161,832!
1386
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1387
      }
1388
      (void)memset(value, 0, valuelen);
161,832✔
1389
      SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER)
161,832!
1390

1391
      TAOS_CHECK_GOTO(taosHashPut(pUser->readTbs, key, keyLen, value, valuelen), &lino, _OVER);
161,832!
1392
    }
1393

1394
    for (int32_t i = 0; i < numOfWriteTbs; ++i) {
165,483✔
1395
      int32_t keyLen = 0;
161,450✔
1396
      SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
161,450!
1397

1398
      TAOS_MEMORY_REALLOC(key, keyLen * sizeof(char));
161,450!
1399
      if (key == NULL) {
161,450!
1400
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1401
      }
1402
      (void)memset(key, 0, keyLen);
161,450✔
1403
      SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
161,450!
1404

1405
      int32_t valuelen = 0;
161,450✔
1406
      SDB_GET_INT32(pRaw, dataPos, &valuelen, _OVER);
161,450!
1407
      TAOS_MEMORY_REALLOC(value, valuelen * sizeof(char));
161,450!
1408
      if (value == NULL) {
161,450!
1409
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1410
      }
1411
      (void)memset(value, 0, valuelen);
161,450✔
1412
      SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER)
161,450!
1413

1414
      TAOS_CHECK_GOTO(taosHashPut(pUser->writeTbs, key, keyLen, value, valuelen), &lino, _OVER);
161,450!
1415
    }
1416

1417
    if (sver >= 6) {
4,033!
1418
      for (int32_t i = 0; i < numOfAlterTbs; ++i) {
4,385✔
1419
        int32_t keyLen = 0;
352✔
1420
        SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
352!
1421

1422
        TAOS_MEMORY_REALLOC(key, keyLen * sizeof(char));
352!
1423
        if (key == NULL) {
352!
1424
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1425
        }
1426
        (void)memset(key, 0, keyLen);
352✔
1427
        SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
352!
1428

1429
        int32_t valuelen = 0;
352✔
1430
        SDB_GET_INT32(pRaw, dataPos, &valuelen, _OVER);
352!
1431
        TAOS_MEMORY_REALLOC(value, valuelen * sizeof(char));
352!
1432
        if (value == NULL) {
352!
1433
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1434
        }
1435
        (void)memset(value, 0, valuelen);
352✔
1436
        SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER)
352!
1437

1438
        TAOS_CHECK_GOTO(taosHashPut(pUser->alterTbs, key, keyLen, value, valuelen), &lino, _OVER);
352!
1439
      }
1440

1441
      for (int32_t i = 0; i < numOfReadViews; ++i) {
4,148✔
1442
        int32_t keyLen = 0;
115✔
1443
        SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
115!
1444

1445
        TAOS_MEMORY_REALLOC(key, keyLen * sizeof(char));
115!
1446
        if (key == NULL) {
115!
1447
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1448
        }
1449
        (void)memset(key, 0, keyLen);
115✔
1450
        SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
115!
1451

1452
        int32_t valuelen = 0;
115✔
1453
        SDB_GET_INT32(pRaw, dataPos, &valuelen, _OVER);
115!
1454
        TAOS_MEMORY_REALLOC(value, valuelen * sizeof(char));
115!
1455
        if (value == NULL) {
115!
1456
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1457
        }
1458
        (void)memset(value, 0, valuelen);
115✔
1459
        SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER)
115!
1460

1461
        TAOS_CHECK_GOTO(taosHashPut(pUser->readViews, key, keyLen, value, valuelen), &lino, _OVER);
115!
1462
      }
1463

1464
      for (int32_t i = 0; i < numOfWriteViews; ++i) {
4,121✔
1465
        int32_t keyLen = 0;
88✔
1466
        SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
88!
1467

1468
        TAOS_MEMORY_REALLOC(key, keyLen * sizeof(char));
88!
1469
        if (key == NULL) {
88!
1470
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1471
        }
1472
        (void)memset(key, 0, keyLen);
88✔
1473
        SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
88!
1474

1475
        int32_t valuelen = 0;
88✔
1476
        SDB_GET_INT32(pRaw, dataPos, &valuelen, _OVER);
88!
1477
        TAOS_MEMORY_REALLOC(value, valuelen * sizeof(char));
88!
1478
        if (value == NULL) {
88!
1479
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1480
        }
1481
        (void)memset(value, 0, valuelen);
88✔
1482
        SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER)
88!
1483

1484
        TAOS_CHECK_GOTO(taosHashPut(pUser->writeViews, key, keyLen, value, valuelen), &lino, _OVER);
88!
1485
      }
1486

1487
      for (int32_t i = 0; i < numOfAlterViews; ++i) {
4,118✔
1488
        int32_t keyLen = 0;
85✔
1489
        SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
85!
1490

1491
        TAOS_MEMORY_REALLOC(key, keyLen * sizeof(char));
85!
1492
        if (key == NULL) {
85!
1493
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1494
        }
1495
        (void)memset(key, 0, keyLen);
85✔
1496
        SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
85!
1497

1498
        int32_t valuelen = 0;
85✔
1499
        SDB_GET_INT32(pRaw, dataPos, &valuelen, _OVER);
85!
1500
        TAOS_MEMORY_REALLOC(value, valuelen * sizeof(char));
85!
1501
        if (value == NULL) {
85!
1502
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1503
        }
1504
        (void)memset(value, 0, valuelen);
85✔
1505
        SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER)
85!
1506

1507
        TAOS_CHECK_GOTO(taosHashPut(pUser->alterViews, key, keyLen, value, valuelen), &lino, _OVER);
85!
1508
      }
1509
    }
1510

1511
    for (int32_t i = 0; i < numOfUseDbs; ++i) {
6,456✔
1512
      int32_t keyLen = 0;
2,423✔
1513
      SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
2,423!
1514

1515
      TAOS_MEMORY_REALLOC(key, keyLen * sizeof(char));
2,423!
1516
      if (key == NULL) {
2,423!
1517
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1518
      }
1519
      (void)memset(key, 0, keyLen);
2,423✔
1520
      SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
2,423!
1521

1522
      int32_t ref = 0;
2,423✔
1523
      SDB_GET_INT32(pRaw, dataPos, &ref, _OVER);
2,423!
1524

1525
      TAOS_CHECK_GOTO(taosHashPut(pUser->useDbs, key, keyLen, &ref, sizeof(ref)), &lino, _OVER);
2,423!
1526
    }
1527
  }
1528
  // decoder white list
1529
  if (sver >= USER_VER_SUPPORT_WHITELIST) {
4,033!
1530
    if (sver < USER_VER_SUPPORT_WHITELIT_DUAL_STACK) {
4,033!
1531
      int32_t len = 0;
×
1532
      SDB_GET_INT32(pRaw, dataPos, &len, _OVER);
×
1533

1534
      TAOS_MEMORY_REALLOC(key, len);
×
1535
      if (key == NULL) {
×
1536
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1537
      }
1538
      SDB_GET_BINARY(pRaw, dataPos, key, len, _OVER);
×
1539

1540
      SIpWhiteList *pIpWhiteList = NULL;
×
1541
      TAOS_CHECK_GOTO(createIpWhiteListFromOldVer(key, len, &pIpWhiteList), &lino, _OVER);
×
1542

1543
      SDB_GET_INT64(pRaw, dataPos, &pUser->ipWhiteListVer, _OVER);
×
1544

1545
      code = cvtIpWhiteListToDual(pIpWhiteList, &pUser->pIpWhiteListDual);
×
1546
      if (code != 0) {
×
1547
        taosMemoryFreeClear(pIpWhiteList);
×
1548
      }
1549
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
1550

1551
      taosMemoryFreeClear(pIpWhiteList);
×
1552

1553
    } else if (sver >= USER_VER_SUPPORT_WHITELIT_DUAL_STACK) {
4,033!
1554
      int32_t len = 0;
4,033✔
1555
      SDB_GET_INT32(pRaw, dataPos, &len, _OVER);
4,033!
1556

1557
      TAOS_MEMORY_REALLOC(key, len);
4,033!
1558
      if (key == NULL) {
4,033!
1559
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1560
      }
1561
      SDB_GET_BINARY(pRaw, dataPos, key, len, _OVER);
4,033!
1562

1563
      TAOS_CHECK_GOTO(createIpWhiteList(key, len, &pUser->pIpWhiteListDual), &lino, _OVER);
4,033!
1564
      SDB_GET_INT64(pRaw, dataPos, &pUser->ipWhiteListVer, _OVER);
4,033!
1565
    }
1566
  }
1567

1568
  if (pUser->pIpWhiteListDual == NULL) {
4,033!
1569
    TAOS_CHECK_GOTO(createDefaultIpWhiteList(&pUser->pIpWhiteListDual), &lino, _OVER);
×
1570
    pUser->ipWhiteListVer = taosGetTimestampMs();
×
1571
  }
1572

1573
  SDB_GET_INT8(pRaw, dataPos, &pUser->passEncryptAlgorithm, _OVER);
4,033!
1574

1575
  SDB_GET_RESERVE(pRaw, dataPos, USER_RESERVE_SIZE, _OVER)
4,033!
1576
  taosInitRWLatch(&pUser->lock);
4,033✔
1577

1578
_OVER:
4,033✔
1579
  taosMemoryFree(key);
4,033!
1580
  taosMemoryFree(value);
4,033!
1581
  if (code < 0) {
4,033!
1582
    terrno = code;
×
1583
    mError("user:%s, failed to decode at line %d from raw:%p since %s", pUser == NULL ? "null" : pUser->user, lino,
×
1584
           pRaw, tstrerror(code));
1585
    if (pUser != NULL) {
×
1586
      taosHashCleanup(pUser->readDbs);
×
1587
      taosHashCleanup(pUser->writeDbs);
×
1588
      taosHashCleanup(pUser->topics);
×
1589
      taosHashCleanup(pUser->readTbs);
×
1590
      taosHashCleanup(pUser->writeTbs);
×
1591
      taosHashCleanup(pUser->alterTbs);
×
1592
      taosHashCleanup(pUser->readViews);
×
1593
      taosHashCleanup(pUser->writeViews);
×
1594
      taosHashCleanup(pUser->alterViews);
×
1595
      taosHashCleanup(pUser->useDbs);
×
1596
      taosMemoryFreeClear(pUser->pIpWhiteListDual);
×
1597
    }
1598
    taosMemoryFreeClear(pRow);
×
1599
    return NULL;
×
1600
  }
1601

1602
  mTrace("user:%s, decode from raw:%p, row:%p", pUser->user, pRaw, pUser);
4,033✔
1603
  return pRow;
4,033✔
1604
}
1605

1606
static int32_t mndUserActionInsert(SSdb *pSdb, SUserObj *pUser) {
1,548✔
1607
  mTrace("user:%s, perform insert action, row:%p", pUser->user, pUser);
1,548✔
1608

1609
  SAcctObj *pAcct = sdbAcquire(pSdb, SDB_ACCT, pUser->acct);
1,548✔
1610
  if (pAcct == NULL) {
1,548!
1611
    terrno = TSDB_CODE_MND_ACCT_NOT_EXIST;
×
1612
    mError("user:%s, failed to perform insert action since %s", pUser->user, terrstr());
×
1613
    TAOS_RETURN(terrno);
×
1614
  }
1615
  pUser->acctId = pAcct->acctId;
1,548✔
1616
  sdbRelease(pSdb, pAcct);
1,548✔
1617

1618
  return 0;
1,548✔
1619
}
1620

1621
int32_t mndDupTableHash(SHashObj *pOld, SHashObj **ppNew) {
91,247✔
1622
  int32_t code = 0;
91,247✔
1623
  *ppNew =
91,248✔
1624
      taosHashInit(taosHashGetSize(pOld), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
91,247✔
1625
  if (*ppNew == NULL) {
91,248!
1626
    TAOS_RETURN(terrno);
×
1627
  }
1628

1629
  char *tb = taosHashIterate(pOld, NULL);
91,248✔
1630
  while (tb != NULL) {
417,702✔
1631
    size_t keyLen = 0;
326,454✔
1632
    char  *key = taosHashGetKey(tb, &keyLen);
326,454✔
1633

1634
    int32_t valueLen = strlen(tb) + 1;
326,454✔
1635
    if ((code = taosHashPut(*ppNew, key, keyLen, tb, valueLen)) != 0) {
326,454!
1636
      taosHashCancelIterate(pOld, tb);
×
1637
      taosHashCleanup(*ppNew);
×
1638
      TAOS_RETURN(code);
×
1639
    }
1640
    tb = taosHashIterate(pOld, tb);
326,454✔
1641
  }
1642

1643
  TAOS_RETURN(code);
91,248✔
1644
}
1645

1646
int32_t mndDupUseDbHash(SHashObj *pOld, SHashObj **ppNew) {
4,062✔
1647
  int32_t code = 0;
4,062✔
1648
  *ppNew =
4,062✔
1649
      taosHashInit(taosHashGetSize(pOld), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
4,062✔
1650
  if (*ppNew == NULL) {
4,062!
1651
    TAOS_RETURN(terrno);
×
1652
  }
1653

1654
  int32_t *db = taosHashIterate(pOld, NULL);
4,062✔
1655
  while (db != NULL) {
6,462✔
1656
    size_t keyLen = 0;
2,400✔
1657
    char  *key = taosHashGetKey(db, &keyLen);
2,400✔
1658

1659
    if ((code = taosHashPut(*ppNew, key, keyLen, db, sizeof(*db))) != 0) {
2,400!
1660
      taosHashCancelIterate(pOld, db);
×
1661
      taosHashCleanup(*ppNew);
×
1662
      TAOS_RETURN(code);
×
1663
    }
1664
    db = taosHashIterate(pOld, db);
2,400✔
1665
  }
1666

1667
  TAOS_RETURN(code);
4,062✔
1668
}
1669

1670
int32_t mndUserDupObj(SUserObj *pUser, SUserObj *pNew) {
4,062✔
1671
  int32_t code = 0;
4,062✔
1672
  (void)memcpy(pNew, pUser, sizeof(SUserObj));
4,062✔
1673
  pNew->authVersion++;
4,062✔
1674
  pNew->updateTime = taosGetTimestampMs();
4,062✔
1675

1676
  taosRLockLatch(&pUser->lock);
4,062✔
1677
  TAOS_CHECK_GOTO(mndDupDbHash(pUser->readDbs, &pNew->readDbs), NULL, _OVER);
4,062!
1678
  TAOS_CHECK_GOTO(mndDupDbHash(pUser->writeDbs, &pNew->writeDbs), NULL, _OVER);
4,062!
1679
  TAOS_CHECK_GOTO(mndDupTableHash(pUser->readTbs, &pNew->readTbs), NULL, _OVER);
4,062!
1680
  TAOS_CHECK_GOTO(mndDupTableHash(pUser->writeTbs, &pNew->writeTbs), NULL, _OVER);
4,062!
1681
  TAOS_CHECK_GOTO(mndDupTableHash(pUser->alterTbs, &pNew->alterTbs), NULL, _OVER);
4,062!
1682
  TAOS_CHECK_GOTO(mndDupTableHash(pUser->readViews, &pNew->readViews), NULL, _OVER);
4,062!
1683
  TAOS_CHECK_GOTO(mndDupTableHash(pUser->writeViews, &pNew->writeViews), NULL, _OVER);
4,062!
1684
  TAOS_CHECK_GOTO(mndDupTableHash(pUser->alterViews, &pNew->alterViews), NULL, _OVER);
4,062!
1685
  TAOS_CHECK_GOTO(mndDupTopicHash(pUser->topics, &pNew->topics), NULL, _OVER);
4,062!
1686
  TAOS_CHECK_GOTO(mndDupUseDbHash(pUser->useDbs, &pNew->useDbs), NULL, _OVER);
4,062!
1687
  pNew->pIpWhiteListDual = cloneIpWhiteList(pUser->pIpWhiteListDual);
4,062✔
1688
  if (pNew->pIpWhiteListDual == NULL) {
4,062!
1689
    code = TSDB_CODE_OUT_OF_MEMORY;
×
1690
  }
1691

1692
_OVER:
4,062✔
1693
  taosRUnLockLatch(&pUser->lock);
4,062✔
1694
  TAOS_RETURN(code);
4,062✔
1695
}
1696

1697
void mndUserFreeObj(SUserObj *pUser) {
14,444✔
1698
  taosHashCleanup(pUser->readDbs);
14,444✔
1699
  taosHashCleanup(pUser->writeDbs);
14,444✔
1700
  taosHashCleanup(pUser->topics);
14,444✔
1701
  taosHashCleanup(pUser->readTbs);
14,444✔
1702
  taosHashCleanup(pUser->writeTbs);
14,444✔
1703
  taosHashCleanup(pUser->alterTbs);
14,444✔
1704
  taosHashCleanup(pUser->readViews);
14,444✔
1705
  taosHashCleanup(pUser->writeViews);
14,444✔
1706
  taosHashCleanup(pUser->alterViews);
14,444✔
1707
  taosHashCleanup(pUser->useDbs);
14,444✔
1708
  taosMemoryFreeClear(pUser->pIpWhiteListDual);
14,444!
1709
  pUser->readDbs = NULL;
14,444✔
1710
  pUser->writeDbs = NULL;
14,444✔
1711
  pUser->topics = NULL;
14,444✔
1712
  pUser->readTbs = NULL;
14,444✔
1713
  pUser->writeTbs = NULL;
14,444✔
1714
  pUser->alterTbs = NULL;
14,444✔
1715
  pUser->readViews = NULL;
14,444✔
1716
  pUser->writeViews = NULL;
14,444✔
1717
  pUser->alterViews = NULL;
14,444✔
1718
  pUser->useDbs = NULL;
14,444✔
1719
}
14,444✔
1720

1721
static int32_t mndUserActionDelete(SSdb *pSdb, SUserObj *pUser) {
4,033✔
1722
  mTrace("user:%s, perform delete action, row:%p", pUser->user, pUser);
4,033✔
1723
  mndUserFreeObj(pUser);
4,033✔
1724
  return 0;
4,033✔
1725
}
1726

1727
static int32_t mndUserActionUpdate(SSdb *pSdb, SUserObj *pOld, SUserObj *pNew) {
2,373✔
1728
  mTrace("user:%s, perform update action, old row:%p new row:%p", pOld->user, pOld, pNew);
2,373!
1729
  taosWLockLatch(&pOld->lock);
2,373✔
1730
  pOld->updateTime = pNew->updateTime;
2,373✔
1731
  pOld->authVersion = pNew->authVersion;
2,373✔
1732
  pOld->passVersion = pNew->passVersion;
2,373✔
1733
  pOld->sysInfo = pNew->sysInfo;
2,373✔
1734
  pOld->enable = pNew->enable;
2,373✔
1735
  pOld->flag = pNew->flag;
2,373✔
1736
  (void)memcpy(pOld->pass, pNew->pass, TSDB_PASSWORD_LEN);
2,373✔
1737
  TSWAP(pOld->readDbs, pNew->readDbs);
2,373✔
1738
  TSWAP(pOld->writeDbs, pNew->writeDbs);
2,373✔
1739
  TSWAP(pOld->topics, pNew->topics);
2,373✔
1740
  TSWAP(pOld->readTbs, pNew->readTbs);
2,373✔
1741
  TSWAP(pOld->writeTbs, pNew->writeTbs);
2,373✔
1742
  TSWAP(pOld->alterTbs, pNew->alterTbs);
2,373✔
1743
  TSWAP(pOld->readViews, pNew->readViews);
2,373✔
1744
  TSWAP(pOld->writeViews, pNew->writeViews);
2,373✔
1745
  TSWAP(pOld->alterViews, pNew->alterViews);
2,373✔
1746
  TSWAP(pOld->useDbs, pNew->useDbs);
2,373✔
1747

1748
  int32_t sz = sizeof(SIpWhiteListDual) + pNew->pIpWhiteListDual->num * sizeof(SIpRange);
2,373✔
1749
  TAOS_MEMORY_REALLOC(pOld->pIpWhiteListDual, sz);
2,373!
1750
  if (pOld->pIpWhiteListDual == NULL) {
2,373!
1751
    taosWUnLockLatch(&pOld->lock);
×
1752
    return terrno;
×
1753
  }
1754
  (void)memcpy(pOld->pIpWhiteListDual, pNew->pIpWhiteListDual, sz);
2,373✔
1755
  pOld->ipWhiteListVer = pNew->ipWhiteListVer;
2,373✔
1756

1757
  taosWUnLockLatch(&pOld->lock);
2,373✔
1758

1759
  return 0;
2,373✔
1760
}
1761

1762
int32_t mndAcquireUser(SMnode *pMnode, const char *userName, SUserObj **ppUser) {
209,586✔
1763
  int32_t code = 0;
209,586✔
1764
  SSdb   *pSdb = pMnode->pSdb;
209,586✔
1765

1766
  *ppUser = sdbAcquire(pSdb, SDB_USER, userName);
209,586✔
1767
  if (*ppUser == NULL) {
209,588✔
1768
    if (terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
233!
1769
      code = TSDB_CODE_MND_USER_NOT_EXIST;
233✔
1770
    } else {
1771
      code = TSDB_CODE_MND_USER_NOT_AVAILABLE;
×
1772
    }
1773
  }
1774
  TAOS_RETURN(code);
209,588✔
1775
}
1776

1777
void mndReleaseUser(SMnode *pMnode, SUserObj *pUser) {
209,908✔
1778
  SSdb *pSdb = pMnode->pSdb;
209,908✔
1779
  sdbRelease(pSdb, pUser);
209,908✔
1780
}
209,909✔
1781

1782
int32_t mndEncryptPass(char *pass, int8_t *algo) {
225✔
1783
  int32_t code = 0;
225✔
1784
  if (tsiEncryptPassAlgorithm == DND_CA_SM4) {
225✔
1785
    if (strlen(tsEncryptKey) == 0) {
2!
1786
      code = TSDB_CODE_DNODE_INVALID_ENCRYPTKEY;
×
1787
      goto _OVER;
×
1788
    }
1789
    unsigned char packetData[TSDB_PASSWORD_LEN] = {0};
2✔
1790
    int           newLen = 0;
2✔
1791

1792
    SCryptOpts opts = {0};
2✔
1793
    opts.len = TSDB_PASSWORD_LEN;
2✔
1794
    opts.source = pass;
2✔
1795
    opts.result = packetData;
2✔
1796
    opts.unitLen = TSDB_PASSWORD_LEN;
2✔
1797
    tstrncpy(opts.key, tsEncryptKey, ENCRYPT_KEY_LEN + 1);
2✔
1798

1799
    newLen = CBC_Encrypt(&opts);
2✔
1800

1801
    memcpy(pass, packetData, newLen);
2✔
1802

1803
    if (algo != NULL) *algo = DND_CA_SM4;
2✔
1804
  }
1805
_OVER:
223✔
1806
  return code;
225✔
1807
}
1808

1809
static int32_t addDefaultIpToTable(int8_t enableIpv6, SHashObj *pUniqueTab) {
3✔
1810
  int32_t code = 0;
3✔
1811
  int32_t lino = 0;
3✔
1812
  int32_t dummpy = 0;
3✔
1813

1814
  SIpRange ipv4 = {0}, ipv6 = {0};
3✔
1815
  code = createDefaultIp4Range(&ipv4);
3✔
1816
  TSDB_CHECK_CODE(code, lino, _error);
3!
1817

1818
  code = taosHashPut(pUniqueTab, &ipv4, sizeof(ipv4), &dummpy, sizeof(dummpy));
3✔
1819
  TSDB_CHECK_CODE(code, lino, _error);
3!
1820

1821
  if (enableIpv6) {
3!
1822
    code = createDefaultIp6Range(&ipv6);
×
1823
    TSDB_CHECK_CODE(code, lino, _error);
×
1824

1825
    code = taosHashPut(pUniqueTab, &ipv6, sizeof(ipv6), &dummpy, sizeof(dummpy));
×
1826
    TSDB_CHECK_CODE(code, lino, _error);
×
1827
  }
1828
_error:
3✔
1829
  if (code != 0) {
3!
1830
    mError("failed to add default ip range to table since %s", tstrerror(code));
×
1831
  }
1832
  return code;
3✔
1833
}
1834

1835
static int32_t mndCreateUser(SMnode *pMnode, char *acct, SCreateUserReq *pCreate, SRpcMsg *pReq) {
182✔
1836
  int32_t  code = 0;
182✔
1837
  int32_t  lino = 0;
182✔
1838
  SUserObj userObj = {0};
182✔
1839

1840
  if (pCreate->passIsMd5 == 1) {
182!
1841
    memcpy(userObj.pass, pCreate->pass, TSDB_PASSWORD_LEN - 1);
182✔
1842
    TAOS_CHECK_RETURN(mndEncryptPass(userObj.pass, &userObj.passEncryptAlgorithm));
182!
1843
  } else {
1844
    if (pCreate->isImport != 1) {
×
1845
      taosEncryptPass_c((uint8_t *)pCreate->pass, strlen(pCreate->pass), userObj.pass);
×
1846
      userObj.pass[TSDB_PASSWORD_LEN - 1] = 0;
×
1847
      TAOS_CHECK_RETURN(mndEncryptPass(userObj.pass, &userObj.passEncryptAlgorithm));
×
1848
    } else {
1849
      memcpy(userObj.pass, pCreate->pass, TSDB_PASSWORD_LEN);
×
1850
    }
1851
  }
1852

1853
  tstrncpy(userObj.user, pCreate->user, TSDB_USER_LEN);
182✔
1854
  tstrncpy(userObj.acct, acct, TSDB_USER_LEN);
182✔
1855
  userObj.createdTime = taosGetTimestampMs();
182✔
1856
  userObj.updateTime = userObj.createdTime;
182✔
1857
  userObj.superUser = 0;  // pCreate->superUser;
182✔
1858
  userObj.sysInfo = pCreate->sysInfo;
182✔
1859
  userObj.enable = pCreate->enable;
182✔
1860
  userObj.createdb = pCreate->createDb;
182✔
1861

1862
  if (pCreate->numIpRanges == 0) {
182✔
1863
    TAOS_CHECK_RETURN(createDefaultIpWhiteList(&userObj.pIpWhiteListDual));
179!
1864
  } else {
1865
    SHashObj *pUniqueTab = taosHashInit(64, MurmurHash3_32, true, HASH_NO_LOCK);
3✔
1866
    if (pUniqueTab == NULL) {
3!
1867
      TAOS_RETURN(terrno);
×
1868
    }
1869
    int32_t dummpy = 0;
3✔
1870
    for (int i = 0; i < pCreate->numIpRanges; i++) {
8✔
1871
      SIpRange range = {0};
5✔
1872
      if (pCreate->pIpDualRanges == NULL) {
5!
1873
        range.type = 0;
×
1874
        memcpy(&range.ipV4, &(pCreate->pIpRanges[i]), sizeof(SIpV4Range));
×
1875
      } else {
1876
        memcpy(&range, pCreate->pIpDualRanges + i, sizeof(SIpRange));
5✔
1877
      }
1878

1879
      if ((code = taosHashPut(pUniqueTab, &range, sizeof(range), &dummpy, sizeof(dummpy))) != 0) {
5!
1880
        taosHashCleanup(pUniqueTab);
×
1881
        TAOS_RETURN(code);
×
1882
      }
1883
    }
1884
    code = addDefaultIpToTable(tsEnableIpv6, pUniqueTab);
3✔
1885
    if (code != 0) {
3!
1886
      taosHashCleanup(pUniqueTab);
×
1887
      TAOS_RETURN(code);
×
1888
    }
1889

1890
    if (taosHashGetSize(pUniqueTab) > MND_MAX_USE_HOST) {
3!
1891
      taosHashCleanup(pUniqueTab);
×
1892
      TAOS_RETURN(TSDB_CODE_MND_TOO_MANY_USER_HOST);
×
1893
    }
1894

1895
    int32_t           numOfRanges = taosHashGetSize(pUniqueTab);
3✔
1896
    SIpWhiteListDual *p = taosMemoryCalloc(1, sizeof(SIpWhiteListDual) + numOfRanges * sizeof(SIpRange));
3!
1897
    if (p == NULL) {
3!
1898
      taosHashCleanup(pUniqueTab);
×
1899
      TAOS_RETURN(terrno);
×
1900
    }
1901
    void   *pIter = taosHashIterate(pUniqueTab, NULL);
3✔
1902
    int32_t i = 0;
3✔
1903
    while (pIter) {
10✔
1904
      size_t    len = 0;
7✔
1905
      SIpRange *key = taosHashGetKey(pIter, &len);
7✔
1906
      memcpy(p->pIpRanges + i, key, sizeof(SIpRange));
7✔
1907
      pIter = taosHashIterate(pUniqueTab, pIter);
7✔
1908
      i++;
7✔
1909
    }
1910

1911
    taosHashCleanup(pUniqueTab);
3✔
1912
    p->num = numOfRanges;
3✔
1913
    userObj.pIpWhiteListDual = p;
3✔
1914
  }
1915

1916
  userObj.ipWhiteListVer = taosGetTimestampMs();
182✔
1917

1918
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pReq, "create-user");
182✔
1919
  if (pTrans == NULL) {
182!
1920
    mError("user:%s, failed to create since %s", pCreate->user, terrstr());
×
1921
    taosMemoryFree(userObj.pIpWhiteListDual);
×
1922
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1923
  }
1924
  mInfo("trans:%d, used to create user:%s", pTrans->id, pCreate->user);
182!
1925

1926
  SSdbRaw *pCommitRaw = mndUserActionEncode(&userObj);
182✔
1927
  if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
182!
1928
    mError("trans:%d, failed to commit redo log since %s", pTrans->id, terrstr());
×
1929
    mndTransDrop(pTrans);
×
1930
    TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
1931
  }
1932
  TAOS_CHECK_GOTO(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY), &lino, _OVER);
182!
1933

1934
  if (mndTransPrepare(pMnode, pTrans) != 0) {
182!
1935
    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
×
1936
    mndTransDrop(pTrans);
×
1937
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1938
  }
1939
  if ((code = ipWhiteMgtUpdate(pMnode, userObj.user, userObj.pIpWhiteListDual)) != 0) {
182!
1940
    mndTransDrop(pTrans);
×
1941
    TAOS_CHECK_GOTO(code, &lino, _OVER);
×
1942
  }
1943

1944
  taosMemoryFree(userObj.pIpWhiteListDual);
182!
1945
  mndTransDrop(pTrans);
182✔
1946
  return 0;
182✔
1947
_OVER:
×
1948
  taosMemoryFree(userObj.pIpWhiteListDual);
×
1949

1950
  TAOS_RETURN(code);
×
1951
}
1952

1953
static int32_t mndCheckPasswordMinLen(const char *pwd, int32_t len) {
×
1954
  if (len < TSDB_PASSWORD_MIN_LEN) {
×
1955
    return -1;
×
1956
  }
1957
  return 0;
×
1958
}
1959

1960
static int32_t mndCheckPasswordMaxLen(const char *pwd, int32_t len) {
×
1961
  if (len > TSDB_PASSWORD_MAX_LEN) {
×
1962
    return -1;
×
1963
  }
1964
  return 0;
×
1965
}
1966

1967
static int32_t mndCheckPasswordFmt(const char *pwd, int32_t len) {
×
1968
  if (strcmp(pwd, "taosdata") == 0) {
×
1969
    return 0;
×
1970
  }
1971

1972
  bool charTypes[4] = {0};
×
1973
  for (int32_t i = 0; i < len; ++i) {
×
1974
    if (taosIsBigChar(pwd[i])) {
×
1975
      charTypes[0] = true;
×
1976
    } else if (taosIsSmallChar(pwd[i])) {
×
1977
      charTypes[1] = true;
×
1978
    } else if (taosIsNumberChar(pwd[i])) {
×
1979
      charTypes[2] = true;
×
1980
    } else if (taosIsSpecialChar(pwd[i])) {
×
1981
      charTypes[3] = true;
×
1982
    } else {
1983
      return -1;
×
1984
    }
1985
  }
1986

1987
  int32_t numOfTypes = 0;
×
1988
  for (int32_t i = 0; i < 4; ++i) {
×
1989
    numOfTypes += charTypes[i];
×
1990
  }
1991

1992
  if (numOfTypes < 3) {
×
1993
    return -1;
×
1994
  }
1995

1996
  return 0;
×
1997
}
1998

1999
static int32_t mndProcessCreateUserReq(SRpcMsg *pReq) {
184✔
2000
  SMnode        *pMnode = pReq->info.node;
184✔
2001
  int32_t        code = 0;
184✔
2002
  int32_t        lino = 0;
184✔
2003
  SUserObj      *pUser = NULL;
184✔
2004
  SUserObj      *pOperUser = NULL;
184✔
2005
  SCreateUserReq createReq = {0};
184✔
2006

2007
  if (tDeserializeSCreateUserReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
184!
2008
    TAOS_CHECK_GOTO(TSDB_CODE_INVALID_MSG, &lino, _OVER);
×
2009
  }
2010

2011
  mInfo("user:%s, start to create, createdb:%d, is_import:%d", createReq.user, createReq.createDb, createReq.isImport);
184!
2012

2013
#ifndef TD_ENTERPRISE
2014
  if (createReq.isImport == 1) {
2015
    TAOS_CHECK_GOTO(TSDB_CODE_OPS_NOT_SUPPORT, &lino, _OVER);  // enterprise feature
2016
  }
2017
#endif
2018

2019
  if (createReq.isImport != 1) {
184✔
2020
    TAOS_CHECK_GOTO(mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CREATE_USER), &lino, _OVER);
183!
2021
  } else {
2022
    if (strcmp(pReq->info.conn.user, "root") != 0) {
1!
2023
      mError("The operation is not permitted, user:%s", pReq->info.conn.user);
×
2024
      TAOS_CHECK_GOTO(TSDB_CODE_MND_NO_RIGHTS, &lino, _OVER);
×
2025
    }
2026
  }
2027

2028
  if (createReq.user[0] == 0) {
184!
2029
    TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_USER_FORMAT, &lino, _OVER);
×
2030
  }
2031

2032
  if (createReq.passIsMd5 == 0) {
184!
2033
    int32_t len = strlen(createReq.pass);
×
2034
    if (createReq.isImport != 1) {
×
2035
      if (mndCheckPasswordMinLen(createReq.pass, len) != 0) {
×
2036
        TAOS_CHECK_GOTO(TSDB_CODE_PAR_PASSWD_TOO_SHORT_OR_EMPTY, &lino, _OVER);
×
2037
      }
2038
      if (mndCheckPasswordMaxLen(createReq.pass, len) != 0) {
×
2039
        TAOS_CHECK_GOTO(TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG, &lino, _OVER);
×
2040
      }
2041
      if (mndCheckPasswordFmt(createReq.pass, len) != 0) {
×
2042
        TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_PASS_FORMAT, &lino, _OVER);
×
2043
      }
2044
    }
2045
  }
2046

2047
  code = mndAcquireUser(pMnode, createReq.user, &pUser);
184✔
2048
  if (pUser != NULL) {
184✔
2049
    TAOS_CHECK_GOTO(TSDB_CODE_MND_USER_ALREADY_EXIST, &lino, _OVER);
2!
2050
  }
2051

2052
  code = mndAcquireUser(pMnode, pReq->info.conn.user, &pOperUser);
182✔
2053
  if (pOperUser == NULL) {
182!
2054
    TAOS_CHECK_GOTO(TSDB_CODE_MND_NO_USER_FROM_CONN, &lino, _OVER);
×
2055
  }
2056

2057
  TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_USER), &lino, _OVER);
182!
2058

2059
  code = mndCreateUser(pMnode, pOperUser->acct, &createReq, pReq);
182✔
2060
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
182!
2061

2062
  char detail[1000] = {0};
182✔
2063
  (void)tsnprintf(detail, sizeof(detail), "enable:%d, superUser:%d, sysInfo:%d, password:xxx", createReq.enable,
182✔
2064
                  createReq.superUser, createReq.sysInfo);
182✔
2065
  char operation[15] = {0};
182✔
2066
  if (createReq.isImport == 1) {
182✔
2067
    tstrncpy(operation, "importUser", sizeof(operation));
1✔
2068
  } else {
2069
    tstrncpy(operation, "createUser", sizeof(operation));
181✔
2070
  }
2071

2072
  auditRecord(pReq, pMnode->clusterId, operation, "", createReq.user, detail, strlen(detail));
182✔
2073

2074
_OVER:
184✔
2075
  if (code < 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
184!
2076
    mError("user:%s, failed to create at line %d since %s", createReq.user, lino, tstrerror(code));
2!
2077
  }
2078

2079
  mndReleaseUser(pMnode, pUser);
184✔
2080
  mndReleaseUser(pMnode, pOperUser);
184✔
2081
  tFreeSCreateUserReq(&createReq);
184✔
2082

2083
  TAOS_RETURN(code);
184✔
2084
}
2085

2086
int32_t mndProcessGetUserWhiteListReq(SRpcMsg *pReq) {
222✔
2087
  SMnode              *pMnode = pReq->info.node;
222✔
2088
  int32_t              code = 0;
222✔
2089
  int32_t              lino = 0;
222✔
2090
  int32_t              contLen = 0;
222✔
2091
  void                *pRsp = NULL;
222✔
2092
  SUserObj            *pUser = NULL;
222✔
2093
  SGetUserWhiteListReq wlReq = {0};
222✔
2094
  SGetUserWhiteListRsp wlRsp = {0};
222✔
2095

2096
  int32_t (*serialFn)(void *, int32_t, SGetUserWhiteListRsp *) = NULL;
222✔
2097
  int32_t (*setRspFn)(SMnode * pMnode, SUserObj * pUser, SGetUserWhiteListRsp * pRsp) = NULL;
222✔
2098

2099
  if (pReq->msgType == TDMT_MND_GET_USER_WHITELIST_DUAL) {
222!
2100
    serialFn = tSerializeSGetUserWhiteListDualRsp;
222✔
2101
    setRspFn = mndSetUserWhiteListDualRsp;
222✔
2102
  } else {
2103
    serialFn = tSerializeSGetUserWhiteListRsp;
×
2104
    setRspFn = mndSetUserWhiteListRsp;
×
2105
  }
2106
  if (tDeserializeSGetUserWhiteListReq(pReq->pCont, pReq->contLen, &wlReq) != 0) {
222!
2107
    TAOS_CHECK_GOTO(TSDB_CODE_INVALID_MSG, &lino, _OVER);
×
2108
  }
2109
  mTrace("user: %s, start to get whitelist", wlReq.user);
222!
2110

2111
  code = mndAcquireUser(pMnode, wlReq.user, &pUser);
222✔
2112
  if (pUser == NULL) {
222!
2113
    TAOS_CHECK_GOTO(TSDB_CODE_MND_USER_NOT_EXIST, &lino, _OVER);
×
2114
  }
2115

2116
  TAOS_CHECK_GOTO(setRspFn(pMnode, pUser, &wlRsp), &lino, _OVER);
222!
2117
  contLen = serialFn(NULL, 0, &wlRsp);
222✔
2118
  if (contLen < 0) {
222!
2119
    TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
2120
  }
2121
  pRsp = rpcMallocCont(contLen);
222✔
2122
  if (pRsp == NULL) {
222!
2123
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
2124
  }
2125

2126
  contLen = serialFn(pRsp, contLen, &wlRsp);
222✔
2127
  if (contLen < 0) {
222!
2128
    TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
2129
  }
2130

2131
_OVER:
222✔
2132
  mndReleaseUser(pMnode, pUser);
222✔
2133
  tFreeSGetUserWhiteListDualRsp(&wlRsp);
222✔
2134
  if (code < 0) {
222!
2135
    mError("user:%s, failed to get whitelist at line %d since %s", wlReq.user, lino, tstrerror(code));
×
2136
    rpcFreeCont(pRsp);
×
2137
    pRsp = NULL;
×
2138
    contLen = 0;
×
2139
  }
2140
  pReq->code = code;
222✔
2141
  pReq->info.rsp = pRsp;
222✔
2142
  pReq->info.rspLen = contLen;
222✔
2143

2144
  TAOS_RETURN(code);
222✔
2145
}
2146

2147
int32_t mndProcesSRetrieveIpWhiteReq(SRpcMsg *pReq) {
5✔
2148
  int32_t        code = 0;
5✔
2149
  int32_t        lino = 0;
5✔
2150
  int32_t        len = 0;
5✔
2151
  void          *pRsp = NULL;
5✔
2152
  SUpdateIpWhite ipWhite = {0};
5✔
2153

2154
  // impl later
2155
  SRetrieveIpWhiteReq req = {0};
5✔
2156
  if (tDeserializeRetrieveIpWhite(pReq->pCont, pReq->contLen, &req) != 0) {
5!
2157
    code = TSDB_CODE_INVALID_MSG;
×
2158
    TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2159
  }
2160

2161
  int32_t (*fn)(void *, int32_t, SUpdateIpWhite *) = NULL;
5✔
2162
  if (pReq->msgType == TDMT_MND_RETRIEVE_IP_WHITE) {
5!
2163
    fn = tSerializeSUpdateIpWhite;
×
2164
  } else if (pReq->msgType == TDMT_MND_RETRIEVE_IP_WHITE_DUAL) {
5!
2165
    fn = tSerializeSUpdateIpWhiteDual;
5✔
2166
  }
2167

2168
  TAOS_CHECK_GOTO(ipWhiteMgtFillMsg(&ipWhite), &lino, _OVER);
5!
2169

2170
  len = fn(NULL, 0, &ipWhite);
5✔
2171
  if (len < 0) {
5!
2172
    TAOS_CHECK_GOTO(len, &lino, _OVER);
×
2173
  }
2174

2175
  pRsp = rpcMallocCont(len);
5✔
2176
  if (!pRsp) {
5!
2177
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
2178
  }
2179
  len = fn(pRsp, len, &ipWhite);
5✔
2180
  if (len < 0) {
5!
2181
    TAOS_CHECK_GOTO(len, &lino, _OVER);
×
2182
  }
2183

2184
_OVER:
5✔
2185
  if (code < 0) {
5!
2186
    mError("failed to process retrieve ip white request at line %d since %s", lino, tstrerror(code));
×
2187
    rpcFreeCont(pRsp);
×
2188
    pRsp = NULL;
×
2189
    len = 0;
×
2190
  }
2191
  pReq->code = code;
5✔
2192
  pReq->info.rsp = pRsp;
5✔
2193
  pReq->info.rspLen = len;
5✔
2194

2195
  tFreeSUpdateIpWhiteReq(&ipWhite);
5✔
2196
  TAOS_RETURN(code);
5✔
2197
}
2198

2199
static int32_t mndAlterUser(SMnode *pMnode, SUserObj *pOld, SUserObj *pNew, SRpcMsg *pReq) {
2,280✔
2200
  int32_t code = 0;
2,280✔
2201
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pReq, "alter-user");
2,280✔
2202
  if (pTrans == NULL) {
2,280!
2203
    mError("user:%s, failed to alter since %s", pOld->user, terrstr());
×
2204
    TAOS_RETURN(terrno);
×
2205
  }
2206
  mInfo("trans:%d, used to alter user:%s", pTrans->id, pOld->user);
2,280!
2207

2208
  SSdbRaw *pCommitRaw = mndUserActionEncode(pNew);
2,280✔
2209
  if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
2,280!
2210
    mError("trans:%d, failed to append commit log since %s", pTrans->id, terrstr());
×
2211
    mndTransDrop(pTrans);
×
2212
    TAOS_RETURN(terrno);
×
2213
  }
2214
  code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY);
2,280✔
2215
  if (code < 0) {
2,280!
2216
    mndTransDrop(pTrans);
×
2217
    TAOS_RETURN(code);
×
2218
  }
2219

2220
  if (mndTransPrepare(pMnode, pTrans) != 0) {
2,280!
2221
    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
×
2222
    mndTransDrop(pTrans);
×
2223
    TAOS_RETURN(terrno);
×
2224
  }
2225
  if ((code = ipWhiteMgtUpdate(pMnode, pNew->user, pNew->pIpWhiteListDual)) != 0) {
2,280!
2226
    mndTransDrop(pTrans);
×
2227
    TAOS_RETURN(code);
×
2228
  }
2229
  mndTransDrop(pTrans);
2,280✔
2230
  return 0;
2,280✔
2231
}
2232

2233
static int32_t mndDupObjHash(SHashObj *pOld, int32_t dataLen, SHashObj **ppNew) {
31,294✔
2234
  int32_t code = 0;
31,294✔
2235

2236
  *ppNew =
31,294✔
2237
      taosHashInit(taosHashGetSize(pOld), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
31,294✔
2238
  if (*ppNew == NULL) {
31,294!
2239
    code = terrno ? terrno : TSDB_CODE_OUT_OF_MEMORY;
×
2240
    TAOS_RETURN(code);
×
2241
  }
2242

2243
  char *db = taosHashIterate(pOld, NULL);
31,294✔
2244
  while (db != NULL) {
33,379✔
2245
    int32_t len = strlen(db) + 1;
2,085✔
2246
    if ((code = taosHashPut(*ppNew, db, len, db, dataLen)) != 0) {
2,085!
2247
      taosHashCancelIterate(pOld, db);
×
2248
      taosHashCleanup(*ppNew);
×
2249
      TAOS_RETURN(code);
×
2250
    }
2251
    db = taosHashIterate(pOld, db);
2,085✔
2252
  }
2253

2254
  TAOS_RETURN(code);
31,294✔
2255
}
2256

2257
int32_t mndDupDbHash(SHashObj *pOld, SHashObj **ppNew) { return mndDupObjHash(pOld, TSDB_DB_FNAME_LEN, ppNew); }
27,232✔
2258

2259
int32_t mndDupTopicHash(SHashObj *pOld, SHashObj **ppNew) { return mndDupObjHash(pOld, TSDB_TOPIC_FNAME_LEN, ppNew); }
4,062✔
2260

2261
static int32_t mndTablePriviledge(SMnode *pMnode, SHashObj *hash, SHashObj *useDbHash, SAlterUserReq *alterReq,
1,444✔
2262
                                  SSdb *pSdb) {
2263
  void *pIter = NULL;
1,444✔
2264
  char  tbFName[TSDB_TABLE_FNAME_LEN] = {0};
1,444✔
2265

2266
  (void)snprintf(tbFName, sizeof(tbFName), "%s.%s", alterReq->objname, alterReq->tabName);
1,444✔
2267
  int32_t len = strlen(tbFName) + 1;
1,444✔
2268

2269
  if (alterReq->tagCond != NULL && alterReq->tagCondLen != 0) {
1,483!
2270
    char *value = taosHashGet(hash, tbFName, len);
39✔
2271
    if (value != NULL) {
39!
2272
      TAOS_RETURN(TSDB_CODE_MND_PRIVILEDGE_EXIST);
×
2273
    }
2274

2275
    int32_t condLen = alterReq->tagCondLen;
39✔
2276
    TAOS_CHECK_RETURN(taosHashPut(hash, tbFName, len, alterReq->tagCond, condLen));
39!
2277
  } else {
2278
    TAOS_CHECK_RETURN(taosHashPut(hash, tbFName, len, alterReq->isView ? "v" : "t", 2));
1,405!
2279
  }
2280

2281
  int32_t  dbKeyLen = strlen(alterReq->objname) + 1;
1,444✔
2282
  int32_t  ref = 1;
1,444✔
2283
  int32_t *currRef = taosHashGet(useDbHash, alterReq->objname, dbKeyLen);
1,444✔
2284
  if (NULL != currRef) {
1,444✔
2285
    ref = (*currRef) + 1;
1,182✔
2286
  }
2287
  TAOS_CHECK_RETURN(taosHashPut(useDbHash, alterReq->objname, dbKeyLen, &ref, sizeof(ref)));
1,444!
2288

2289
  TAOS_RETURN(0);
1,444✔
2290
}
2291

2292
static int32_t mndRemoveTablePriviledge(SMnode *pMnode, SHashObj *hash, SHashObj *useDbHash, SAlterUserReq *alterReq,
546✔
2293
                                        SSdb *pSdb) {
2294
  void *pIter = NULL;
546✔
2295
  char  tbFName[TSDB_TABLE_FNAME_LEN] = {0};
546✔
2296
  (void)snprintf(tbFName, sizeof(tbFName), "%s.%s", alterReq->objname, alterReq->tabName);
546✔
2297
  int32_t len = strlen(tbFName) + 1;
546✔
2298

2299
  if (taosHashRemove(hash, tbFName, len) != 0) {
546✔
2300
    TAOS_RETURN(0);  // not found
4✔
2301
  }
2302

2303
  int32_t  dbKeyLen = strlen(alterReq->objname) + 1;
542✔
2304
  int32_t *currRef = taosHashGet(useDbHash, alterReq->objname, dbKeyLen);
542✔
2305
  if (NULL == currRef) {
542!
2306
    return 0;
×
2307
  }
2308

2309
  if (1 == *currRef) {
542✔
2310
    if (taosHashRemove(useDbHash, alterReq->objname, dbKeyLen) != 0) {
223!
2311
      TAOS_RETURN(0);  // not found
×
2312
    }
2313
    return 0;
223✔
2314
  }
2315
  int32_t ref = (*currRef) - 1;
319✔
2316
  TAOS_CHECK_RETURN(taosHashPut(useDbHash, alterReq->objname, dbKeyLen, &ref, sizeof(ref)));
319!
2317

2318
  return 0;
319✔
2319
}
2320

2321
static char *mndUserAuditTypeStr(int32_t type) {
42✔
2322
  if (type == TSDB_ALTER_USER_PASSWD) {
42!
2323
    return "changePassword";
42✔
2324
  }
2325
  if (type == TSDB_ALTER_USER_SUPERUSER) {
×
2326
    return "changeSuperUser";
×
2327
  }
2328
  if (type == TSDB_ALTER_USER_ENABLE) {
×
2329
    return "enableUser";
×
2330
  }
2331
  if (type == TSDB_ALTER_USER_SYSINFO) {
×
2332
    return "userSysInfo";
×
2333
  }
2334
  if (type == TSDB_ALTER_USER_CREATEDB) {
×
2335
    return "userCreateDB";
×
2336
  }
2337
  return "error";
×
2338
}
2339

2340
static int32_t mndProcessAlterUserPrivilegesReq(SAlterUserReq *pAlterReq, SMnode *pMnode, SUserObj *pNewUser) {
2,181✔
2341
  SSdb   *pSdb = pMnode->pSdb;
2,181✔
2342
  void   *pIter = NULL;
2,181✔
2343
  int32_t code = 0;
2,181✔
2344
  int32_t lino = 0;
2,181✔
2345

2346
  if (ALTER_USER_ADD_READ_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
2,181✔
2347
      ALTER_USER_ADD_ALL_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,953!
2348
    if (strcmp(pAlterReq->objname, "1.*") != 0) {
228✔
2349
      int32_t len = strlen(pAlterReq->objname) + 1;
218✔
2350
      SDbObj *pDb = mndAcquireDb(pMnode, pAlterReq->objname);
218✔
2351
      if (pDb == NULL) {
218✔
2352
        mndReleaseDb(pMnode, pDb);
7✔
2353
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);  // TODO: refactor the terrno to code
7!
2354
      }
2355
      if ((code = taosHashPut(pNewUser->readDbs, pAlterReq->objname, len, pAlterReq->objname, TSDB_DB_FNAME_LEN)) !=
211!
2356
          0) {
2357
        mndReleaseDb(pMnode, pDb);
×
2358
        TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2359
      }
2360
      mndReleaseDb(pMnode, pDb);
211✔
2361
    } else {
2362
      while (1) {
16✔
2363
        SDbObj *pDb = NULL;
26✔
2364
        pIter = sdbFetch(pSdb, SDB_DB, pIter, (void **)&pDb);
26✔
2365
        if (pIter == NULL) break;
26✔
2366
        int32_t len = strlen(pDb->name) + 1;
16✔
2367
        if ((code = taosHashPut(pNewUser->readDbs, pDb->name, len, pDb->name, TSDB_DB_FNAME_LEN)) != 0) {
16!
2368
          sdbRelease(pSdb, pDb);
×
2369
          sdbCancelFetch(pSdb, pIter);
×
2370
          TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2371
        }
2372
        sdbRelease(pSdb, pDb);
16✔
2373
      }
2374
    }
2375
  }
2376

2377
  if (ALTER_USER_ADD_WRITE_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
2,174✔
2378
      ALTER_USER_ADD_ALL_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,957!
2379
    if (strcmp(pAlterReq->objname, "1.*") != 0) {
217✔
2380
      int32_t len = strlen(pAlterReq->objname) + 1;
208✔
2381
      SDbObj *pDb = mndAcquireDb(pMnode, pAlterReq->objname);
208✔
2382
      if (pDb == NULL) {
208✔
2383
        mndReleaseDb(pMnode, pDb);
1✔
2384
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);  // TODO: refactor the terrno to code
1!
2385
      }
2386
      if ((code = taosHashPut(pNewUser->writeDbs, pAlterReq->objname, len, pAlterReq->objname, TSDB_DB_FNAME_LEN)) !=
207!
2387
          0) {
2388
        mndReleaseDb(pMnode, pDb);
×
2389
        TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2390
      }
2391
      mndReleaseDb(pMnode, pDb);
207✔
2392
    } else {
2393
      while (1) {
15✔
2394
        SDbObj *pDb = NULL;
24✔
2395
        pIter = sdbFetch(pSdb, SDB_DB, pIter, (void **)&pDb);
24✔
2396
        if (pIter == NULL) break;
24✔
2397
        int32_t len = strlen(pDb->name) + 1;
15✔
2398
        if ((code = taosHashPut(pNewUser->writeDbs, pDb->name, len, pDb->name, TSDB_DB_FNAME_LEN)) != 0) {
15!
2399
          sdbRelease(pSdb, pDb);
×
2400
          sdbCancelFetch(pSdb, pIter);
×
2401
          TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2402
        }
2403
        sdbRelease(pSdb, pDb);
15✔
2404
      }
2405
    }
2406
  }
2407

2408
  if (ALTER_USER_DEL_READ_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
2,173✔
2409
      ALTER_USER_DEL_ALL_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,982!
2410
    if (strcmp(pAlterReq->objname, "1.*") != 0) {
191✔
2411
      int32_t len = strlen(pAlterReq->objname) + 1;
181✔
2412
      SDbObj *pDb = mndAcquireDb(pMnode, pAlterReq->objname);
181✔
2413
      if (pDb == NULL) {
181✔
2414
        mndReleaseDb(pMnode, pDb);
1✔
2415
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);  // TODO: refactor the terrno to code
1!
2416
      }
2417
      code = taosHashRemove(pNewUser->readDbs, pAlterReq->objname, len);
180✔
2418
      if (code < 0) {
180!
2419
        mError("read db:%s, failed to remove db:%s since %s", pNewUser->user, pAlterReq->objname, terrstr());
×
2420
      }
2421
      mndReleaseDb(pMnode, pDb);
180✔
2422
    } else {
2423
      taosHashClear(pNewUser->readDbs);
10✔
2424
    }
2425
  }
2426

2427
  if (ALTER_USER_DEL_WRITE_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
2,172✔
2428
      ALTER_USER_DEL_ALL_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,983!
2429
    if (strcmp(pAlterReq->objname, "1.*") != 0) {
189✔
2430
      int32_t len = strlen(pAlterReq->objname) + 1;
178✔
2431
      SDbObj *pDb = mndAcquireDb(pMnode, pAlterReq->objname);
178✔
2432
      if (pDb == NULL) {
178!
2433
        mndReleaseDb(pMnode, pDb);
×
2434
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);  // TODO: refactor the terrno to code
×
2435
      }
2436
      code = taosHashRemove(pNewUser->writeDbs, pAlterReq->objname, len);
178✔
2437
      if (code < 0) {
178!
2438
        mError("user:%s, failed to remove db:%s since %s", pNewUser->user, pAlterReq->objname, terrstr());
×
2439
      }
2440
      mndReleaseDb(pMnode, pDb);
178✔
2441
    } else {
2442
      taosHashClear(pNewUser->writeDbs);
11✔
2443
    }
2444
  }
2445

2446
  SHashObj *pReadTbs = pNewUser->readTbs;
2,172✔
2447
  SHashObj *pWriteTbs = pNewUser->writeTbs;
2,172✔
2448
  SHashObj *pAlterTbs = pNewUser->alterTbs;
2,172✔
2449

2450
#ifdef TD_ENTERPRISE
2451
  if (pAlterReq->isView) {
2,172✔
2452
    pReadTbs = pNewUser->readViews;
32✔
2453
    pWriteTbs = pNewUser->writeViews;
32✔
2454
    pAlterTbs = pNewUser->alterViews;
32✔
2455
  }
2456
#endif
2457

2458
  if (ALTER_USER_ADD_READ_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
2,172✔
2459
      ALTER_USER_ADD_ALL_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,514!
2460
    TAOS_CHECK_GOTO(mndTablePriviledge(pMnode, pReadTbs, pNewUser->useDbs, pAlterReq, pSdb), &lino, _OVER);
658!
2461
  }
2462

2463
  if (ALTER_USER_ADD_WRITE_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
2,172✔
2464
      ALTER_USER_ADD_ALL_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,522!
2465
    TAOS_CHECK_GOTO(mndTablePriviledge(pMnode, pWriteTbs, pNewUser->useDbs, pAlterReq, pSdb), &lino, _OVER);
650!
2466
  }
2467

2468
  if (ALTER_USER_ADD_ALTER_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
2,172✔
2469
      ALTER_USER_ADD_ALL_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
2,036!
2470
    TAOS_CHECK_GOTO(mndTablePriviledge(pMnode, pAlterTbs, pNewUser->useDbs, pAlterReq, pSdb), &lino, _OVER);
136!
2471
  }
2472

2473
  if (ALTER_USER_DEL_READ_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
2,172✔
2474
      ALTER_USER_DEL_ALL_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,949!
2475
    TAOS_CHECK_GOTO(mndRemoveTablePriviledge(pMnode, pReadTbs, pNewUser->useDbs, pAlterReq, pSdb), &lino, _OVER);
223!
2476
  }
2477

2478
  if (ALTER_USER_DEL_WRITE_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
2,172✔
2479
      ALTER_USER_DEL_ALL_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,955!
2480
    TAOS_CHECK_GOTO(mndRemoveTablePriviledge(pMnode, pWriteTbs, pNewUser->useDbs, pAlterReq, pSdb), &lino, _OVER);
217!
2481
  }
2482

2483
  if (ALTER_USER_DEL_ALTER_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
2,172!
2484
      ALTER_USER_DEL_ALL_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
2,066!
2485
    TAOS_CHECK_GOTO(mndRemoveTablePriviledge(pMnode, pAlterTbs, pNewUser->useDbs, pAlterReq, pSdb), &lino, _OVER);
106!
2486
  }
2487

2488
#ifdef USE_TOPIC
2489
  if (ALTER_USER_ADD_SUBSCRIBE_TOPIC_PRIV(pAlterReq->alterType, pAlterReq->privileges)) {
2,172✔
2490
    int32_t      len = strlen(pAlterReq->objname) + 1;
18✔
2491
    SMqTopicObj *pTopic = NULL;
18✔
2492
    if ((code = mndAcquireTopic(pMnode, pAlterReq->objname, &pTopic)) != 0) {
18!
2493
      mndReleaseTopic(pMnode, pTopic);
×
2494
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2495
    }
2496
    if ((code = taosHashPut(pNewUser->topics, pTopic->name, len, pTopic->name, TSDB_TOPIC_FNAME_LEN)) != 0) {
18!
2497
      mndReleaseTopic(pMnode, pTopic);
×
2498
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2499
    }
2500
    mndReleaseTopic(pMnode, pTopic);
18✔
2501
  }
2502

2503
  if (ALTER_USER_DEL_SUBSCRIBE_TOPIC_PRIV(pAlterReq->alterType, pAlterReq->privileges)) {
2,172✔
2504
    int32_t      len = strlen(pAlterReq->objname) + 1;
12✔
2505
    SMqTopicObj *pTopic = NULL;
12✔
2506
    if ((code = mndAcquireTopic(pMnode, pAlterReq->objname, &pTopic)) != 0) {
12✔
2507
      mndReleaseTopic(pMnode, pTopic);
1✔
2508
      TAOS_CHECK_GOTO(code, &lino, _OVER);
1!
2509
    }
2510
    code = taosHashRemove(pNewUser->topics, pAlterReq->objname, len);
11✔
2511
    if (code < 0) {
11!
2512
      mError("user:%s, failed to remove topic:%s since %s", pNewUser->user, pAlterReq->objname, tstrerror(code));
×
2513
    }
2514
    mndReleaseTopic(pMnode, pTopic);
11✔
2515
  }
2516
#endif
2517
_OVER:
2,160✔
2518
  if (code < 0) {
2,181✔
2519
    mError("user:%s, failed to alter user privileges at line %d since %s", pAlterReq->user, lino, tstrerror(code));
10!
2520
  }
2521
  TAOS_RETURN(code);
2,181✔
2522
}
2523

2524
static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) {
2,365✔
2525
  SMnode       *pMnode = pReq->info.node;
2,365✔
2526
  SSdb         *pSdb = pMnode->pSdb;
2,365✔
2527
  void         *pIter = NULL;
2,365✔
2528
  int32_t       code = 0;
2,365✔
2529
  int32_t       lino = 0;
2,365✔
2530
  SUserObj     *pUser = NULL;
2,365✔
2531
  SUserObj     *pOperUser = NULL;
2,365✔
2532
  SUserObj      newUser = {0};
2,365✔
2533
  SAlterUserReq alterReq = {0};
2,365✔
2534

2535
  TAOS_CHECK_GOTO(tDeserializeSAlterUserReq(pReq->pCont, pReq->contLen, &alterReq), &lino, _OVER);
2,365!
2536

2537
  mInfo("user:%s, start to alter", alterReq.user);
2,365!
2538

2539
  if (alterReq.user[0] == 0) {
2,365!
2540
    TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_USER_FORMAT, &lino, _OVER);
×
2541
  }
2542
  if (alterReq.passIsMd5 == 0) {
2,365✔
2543
    if (TSDB_ALTER_USER_PASSWD == alterReq.alterType) {
2,320!
2544
      int32_t len = strlen(alterReq.pass);
×
2545
      if (mndCheckPasswordMinLen(alterReq.pass, len) != 0) {
×
2546
        TAOS_CHECK_GOTO(TSDB_CODE_PAR_PASSWD_TOO_SHORT_OR_EMPTY, &lino, _OVER);
×
2547
      }
2548
      if (mndCheckPasswordMaxLen(alterReq.pass, len) != 0) {
×
2549
        TAOS_CHECK_GOTO(TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG, &lino, _OVER);
×
2550
      }
2551
      if (mndCheckPasswordFmt(alterReq.pass, len) != 0) {
×
2552
        TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_PASS_FORMAT, &lino, _OVER);
×
2553
      }
2554
    }
2555
  }
2556

2557
  TAOS_CHECK_GOTO(mndAcquireUser(pMnode, alterReq.user, &pUser), &lino, _OVER);
2,365✔
2558

2559
  (void)mndAcquireUser(pMnode, pReq->info.conn.user, &pOperUser);
2,342✔
2560
  if (pOperUser == NULL) {
2,342!
2561
    TAOS_CHECK_GOTO(TSDB_CODE_MND_NO_USER_FROM_CONN, &lino, _OVER);
×
2562
  }
2563

2564
  TAOS_CHECK_GOTO(mndCheckAlterUserPrivilege(pOperUser, pUser, &alterReq), &lino, _OVER);
2,342✔
2565

2566
  TAOS_CHECK_GOTO(mndUserDupObj(pUser, &newUser), &lino, _OVER);
2,291!
2567

2568
  if (alterReq.alterType == TSDB_ALTER_USER_PASSWD) {
2,291✔
2569
    if (alterReq.passIsMd5 == 1) {
42!
2570
      (void)memcpy(newUser.pass, alterReq.pass, TSDB_PASSWORD_LEN);
42✔
2571
    } else {
2572
      taosEncryptPass_c((uint8_t *)alterReq.pass, strlen(alterReq.pass), newUser.pass);
×
2573
    }
2574

2575
    TAOS_CHECK_GOTO(mndEncryptPass(newUser.pass, &newUser.passEncryptAlgorithm), &lino, _OVER);
42!
2576

2577
    if (0 != strncmp(pUser->pass, newUser.pass, TSDB_PASSWORD_LEN)) {
42✔
2578
      ++newUser.passVersion;
39✔
2579
    }
2580
  }
2581

2582
  if (alterReq.alterType == TSDB_ALTER_USER_SUPERUSER) {
2,291!
2583
    newUser.superUser = alterReq.superUser;
×
2584
  }
2585

2586
  if (alterReq.alterType == TSDB_ALTER_USER_ENABLE) {
2,291✔
2587
    newUser.enable = alterReq.enable;
7✔
2588
  }
2589

2590
  if (alterReq.alterType == TSDB_ALTER_USER_SYSINFO) {
2,291✔
2591
    newUser.sysInfo = alterReq.sysInfo;
28✔
2592
  }
2593

2594
  if (alterReq.alterType == TSDB_ALTER_USER_CREATEDB) {
2,291✔
2595
    newUser.createdb = alterReq.createdb;
31✔
2596
  }
2597

2598
  if (ALTER_USER_ADD_PRIVS(alterReq.alterType) || ALTER_USER_DEL_PRIVS(alterReq.alterType)) {
2,291✔
2599
    TAOS_CHECK_GOTO(mndProcessAlterUserPrivilegesReq(&alterReq, pMnode, &newUser), &lino, _OVER);
2,181✔
2600
  }
2601

2602
  if (alterReq.alterType == TSDB_ALTER_USER_ADD_WHITE_LIST) {
2,281✔
2603
    taosMemoryFreeClear(newUser.pIpWhiteListDual);
1!
2604

2605
    int32_t           num = pUser->pIpWhiteListDual->num + alterReq.numIpRanges;
1✔
2606
    int32_t           idx = pUser->pIpWhiteListDual->num;
1✔
2607
    SIpWhiteListDual *pNew = taosMemoryCalloc(1, sizeof(SIpWhiteListDual) + sizeof(SIpRange) * num);
1!
2608

2609
    if (pNew == NULL) {
1!
2610
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
2611
    }
2612

2613
    bool exist = false;
1✔
2614
    (void)memcpy(pNew->pIpRanges, pUser->pIpWhiteListDual->pIpRanges, sizeof(SIpRange) * idx);
1✔
2615
    for (int i = 0; i < alterReq.numIpRanges; i++) {
2✔
2616
      SIpRange range = {0};
1✔
2617
      if (alterReq.pIpDualRanges == NULL) {
1!
2618
        range.type = 0;
×
2619
        memcpy(&range.ipV4, &alterReq.pIpRanges[i], sizeof(SIpV4Range));
×
2620
      } else {
2621
        memcpy(&range, &alterReq.pIpDualRanges[i], sizeof(SIpRange));
1✔
2622
        range = alterReq.pIpDualRanges[i];
1✔
2623
      }
2624
      if (!isRangeInIpWhiteList(pUser->pIpWhiteListDual, &range)) {
1!
2625
        // already exist, just ignore;
2626
        (void)memcpy(&pNew->pIpRanges[idx], &range, sizeof(SIpRange));
1✔
2627
        idx++;
1✔
2628
        continue;
1✔
2629
      } else {
2630
        exist = true;
×
2631
      }
2632
    }
2633
    if (exist) {
1!
2634
      taosMemoryFree(pNew);
×
2635
      TAOS_CHECK_GOTO(TSDB_CODE_MND_USER_HOST_EXIST, &lino, _OVER);
×
2636
    }
2637
    pNew->num = idx;
1✔
2638
    newUser.pIpWhiteListDual = pNew;
1✔
2639
    newUser.ipWhiteListVer = pUser->ipWhiteListVer + 1;
1✔
2640

2641
    if (pNew->num > MND_MAX_USE_HOST) {
1!
2642
      TAOS_CHECK_GOTO(TSDB_CODE_MND_TOO_MANY_USER_HOST, &lino, _OVER);
×
2643
    }
2644
  }
2645
  if (alterReq.alterType == TSDB_ALTER_USER_DROP_WHITE_LIST) {
2,281✔
2646
    taosMemoryFreeClear(newUser.pIpWhiteListDual);
1!
2647

2648
    int32_t           num = pUser->pIpWhiteListDual->num;
1✔
2649
    bool              noexist = true;
1✔
2650
    bool              localHost = false;
1✔
2651
    SIpWhiteListDual *pNew = taosMemoryCalloc(1, sizeof(SIpWhiteListDual) + sizeof(SIpRange) * num);
1!
2652

2653
    if (pNew == NULL) {
1!
2654
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
2655
    }
2656

2657
    if (pUser->pIpWhiteListDual->num > 0) {
1!
2658
      int idx = 0;
1✔
2659
      for (int i = 0; i < pUser->pIpWhiteListDual->num; i++) {
3✔
2660
        SIpRange *oldRange = &pUser->pIpWhiteListDual->pIpRanges[i];
2✔
2661

2662
        bool found = false;
2✔
2663
        for (int j = 0; j < alterReq.numIpRanges; j++) {
4✔
2664
          SIpRange range = {0};
2✔
2665
          if (alterReq.pIpDualRanges == NULL) {
2!
2666
            SIpV4Range *trange = &alterReq.pIpRanges[j];
×
2667
            memcpy(&range.ipV4, trange, sizeof(SIpV4Range));
×
2668
          } else {
2669
            memcpy(&range, &alterReq.pIpDualRanges[j], sizeof(SIpRange));
2✔
2670
          }
2671

2672
          if (isDefaultRange(&range)) {
2!
2673
            localHost = true;
×
2674
            break;
×
2675
          }
2676
          if (isIpRangeEqual(oldRange, &range)) {
2!
2677
            found = true;
×
2678
            break;
×
2679
          }
2680
        }
2681
        if (localHost) break;
2!
2682

2683
        if (found == false) {
2!
2684
          (void)memcpy(&pNew->pIpRanges[idx], oldRange, sizeof(SIpRange));
2✔
2685
          idx++;
2✔
2686
        } else {
2687
          noexist = false;
×
2688
        }
2689
      }
2690
      pNew->num = idx;
1✔
2691
      newUser.pIpWhiteListDual = pNew;
1✔
2692
      newUser.ipWhiteListVer = pUser->ipWhiteListVer + 1;
1✔
2693

2694
    } else {
2695
      pNew->num = 0;
×
2696
      newUser.pIpWhiteListDual = pNew;
×
2697
      newUser.ipWhiteListVer = pUser->ipWhiteListVer + 1;
×
2698
    }
2699

2700
    if (localHost) {
1!
2701
      TAOS_CHECK_GOTO(TSDB_CODE_MND_USER_LOCAL_HOST_NOT_DROP, &lino, _OVER);
×
2702
    }
2703
    if (noexist) {
1!
2704
      TAOS_CHECK_GOTO(TSDB_CODE_MND_USER_HOST_NOT_EXIST, &lino, _OVER);
1!
2705
    }
2706
  }
2707

2708
  code = mndAlterUser(pMnode, pUser, &newUser, pReq);
2,280✔
2709
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
2,280!
2710

2711
  if (alterReq.alterType == TSDB_ALTER_USER_PASSWD) {
2,280✔
2712
    char detail[1000] = {0};
42✔
2713
    (void)tsnprintf(detail, sizeof(detail),
42✔
2714
                    "alterType:%s, enable:%d, superUser:%d, sysInfo:%d, createdb:%d, tabName:%s, password:xxx",
2715
                    mndUserAuditTypeStr(alterReq.alterType), alterReq.enable, alterReq.superUser, alterReq.sysInfo,
42✔
2716
                    alterReq.createdb ? 1 : 0, alterReq.tabName);
42✔
2717
    auditRecord(pReq, pMnode->clusterId, "alterUser", "", alterReq.user, detail, strlen(detail));
42✔
2718
  } else if (alterReq.alterType == TSDB_ALTER_USER_SUPERUSER || alterReq.alterType == TSDB_ALTER_USER_ENABLE ||
2,238!
2719
             alterReq.alterType == TSDB_ALTER_USER_SYSINFO || alterReq.alterType == TSDB_ALTER_USER_CREATEDB) {
2,231✔
2720
    auditRecord(pReq, pMnode->clusterId, "alterUser", "", alterReq.user, alterReq.sql, alterReq.sqlLen);
66✔
2721
  } else if (ALTER_USER_ADD_READ_DB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
2,172✔
2722
             ALTER_USER_ADD_WRITE_DB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
1,951✔
2723
             ALTER_USER_ADD_ALL_DB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
1,844!
2724
             ALTER_USER_ADD_READ_TB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
1,844!
2725
             ALTER_USER_ADD_WRITE_TB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
1,186!
2726
             ALTER_USER_ADD_ALL_TB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName)) {
659!
2727
    if (strcmp(alterReq.objname, "1.*") != 0) {
1,513✔
2728
      SName name = {0};
1,499✔
2729
      TAOS_CHECK_GOTO(tNameFromString(&name, alterReq.objname, T_NAME_ACCT | T_NAME_DB), &lino, _OVER);
1,499!
2730
      auditRecord(pReq, pMnode->clusterId, "GrantPrivileges", name.dbname, alterReq.user, alterReq.sql,
1,499✔
2731
                  alterReq.sqlLen);
2732
    } else {
2733
      auditRecord(pReq, pMnode->clusterId, "GrantPrivileges", "", alterReq.user, alterReq.sql, alterReq.sqlLen);
14✔
2734
    }
2735
  } else if (ALTER_USER_ADD_SUBSCRIBE_TOPIC_PRIV(alterReq.alterType, alterReq.privileges)) {
659✔
2736
    auditRecord(pReq, pMnode->clusterId, "GrantPrivileges", alterReq.objname, alterReq.user, alterReq.sql,
18✔
2737
                alterReq.sqlLen);
2738
  } else if (ALTER_USER_DEL_SUBSCRIBE_TOPIC_PRIV(alterReq.alterType, alterReq.privileges)) {
641✔
2739
    auditRecord(pReq, pMnode->clusterId, "RevokePrivileges", alterReq.objname, alterReq.user, alterReq.sql,
11✔
2740
                alterReq.sqlLen);
2741
  } else {
2742
    if (strcmp(alterReq.objname, "1.*") != 0) {
630✔
2743
      SName name = {0};
614✔
2744
      TAOS_CHECK_GOTO(tNameFromString(&name, alterReq.objname, T_NAME_ACCT | T_NAME_DB), &lino, _OVER);
614✔
2745
      auditRecord(pReq, pMnode->clusterId, "RevokePrivileges", name.dbname, alterReq.user, alterReq.sql,
613✔
2746
                  alterReq.sqlLen);
2747
    } else {
2748
      auditRecord(pReq, pMnode->clusterId, "RevokePrivileges", "", alterReq.user, alterReq.sql, alterReq.sqlLen);
16✔
2749
    }
2750
  }
2751

2752
_OVER:
2,365✔
2753
  if (code < 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
2,365✔
2754
    mError("user:%s, failed to alter at line %d since %s", alterReq.user, lino, tstrerror(code));
86!
2755
  }
2756

2757
  tFreeSAlterUserReq(&alterReq);
2,365✔
2758
  mndReleaseUser(pMnode, pOperUser);
2,365✔
2759
  mndReleaseUser(pMnode, pUser);
2,365✔
2760
  mndUserFreeObj(&newUser);
2,365✔
2761

2762
  TAOS_RETURN(code);
2,365✔
2763
}
2764

2765
static int32_t mndDropUser(SMnode *pMnode, SRpcMsg *pReq, SUserObj *pUser) {
72✔
2766
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pReq, "drop-user");
72✔
2767
  if (pTrans == NULL) {
72!
2768
    mError("user:%s, failed to drop since %s", pUser->user, terrstr());
×
2769
    TAOS_RETURN(terrno);
×
2770
  }
2771
  mInfo("trans:%d, used to drop user:%s", pTrans->id, pUser->user);
72!
2772

2773
  SSdbRaw *pCommitRaw = mndUserActionEncode(pUser);
72✔
2774
  if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
72!
2775
    mError("trans:%d, failed to append commit log since %s", pTrans->id, terrstr());
×
2776
    mndTransDrop(pTrans);
×
2777
    TAOS_RETURN(terrno);
×
2778
  }
2779
  if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED) < 0) {
72!
2780
    mndTransDrop(pTrans);
×
2781
    TAOS_RETURN(terrno);
×
2782
  }
2783

2784
  if (mndTransPrepare(pMnode, pTrans) != 0) {
72!
2785
    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
×
2786
    mndTransDrop(pTrans);
×
2787
    TAOS_RETURN(terrno);
×
2788
  }
2789
  (void)ipWhiteMgtRemove(pUser->user);
72✔
2790

2791
  mndTransDrop(pTrans);
72✔
2792
  TAOS_RETURN(0);
72✔
2793
}
2794

2795
static int32_t mndProcessDropUserReq(SRpcMsg *pReq) {
75✔
2796
  SMnode      *pMnode = pReq->info.node;
75✔
2797
  int32_t      code = 0;
75✔
2798
  int32_t      lino = 0;
75✔
2799
  SUserObj    *pUser = NULL;
75✔
2800
  SDropUserReq dropReq = {0};
75✔
2801

2802
  TAOS_CHECK_GOTO(tDeserializeSDropUserReq(pReq->pCont, pReq->contLen, &dropReq), &lino, _OVER);
75!
2803

2804
  mInfo("user:%s, start to drop", dropReq.user);
75!
2805
  TAOS_CHECK_GOTO(mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_USER), &lino, _OVER);
75!
2806

2807
  if (dropReq.user[0] == 0) {
75!
2808
    TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_USER_FORMAT, &lino, _OVER);
×
2809
  }
2810

2811
  TAOS_CHECK_GOTO(mndAcquireUser(pMnode, dropReq.user, &pUser), &lino, _OVER);
75✔
2812

2813
  TAOS_CHECK_GOTO(mndDropUser(pMnode, pReq, pUser), &lino, _OVER);
72!
2814
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
72!
2815

2816
  auditRecord(pReq, pMnode->clusterId, "dropUser", "", dropReq.user, dropReq.sql, dropReq.sqlLen);
72✔
2817

2818
_OVER:
75✔
2819
  if (code < 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
75!
2820
    mError("user:%s, failed to drop at line %d since %s", dropReq.user, lino, tstrerror(code));
3!
2821
  }
2822

2823
  mndReleaseUser(pMnode, pUser);
75✔
2824
  tFreeSDropUserReq(&dropReq);
75✔
2825
  TAOS_RETURN(code);
75✔
2826
}
2827

2828
static int32_t mndProcessGetUserAuthReq(SRpcMsg *pReq) {
8,194✔
2829
  SMnode         *pMnode = pReq->info.node;
8,194✔
2830
  int32_t         code = 0;
8,194✔
2831
  int32_t         lino = 0;
8,194✔
2832
  int32_t         contLen = 0;
8,194✔
2833
  void           *pRsp = NULL;
8,194✔
2834
  SUserObj       *pUser = NULL;
8,194✔
2835
  SGetUserAuthReq authReq = {0};
8,194✔
2836
  SGetUserAuthRsp authRsp = {0};
8,194✔
2837

2838
  TAOS_CHECK_EXIT(tDeserializeSGetUserAuthReq(pReq->pCont, pReq->contLen, &authReq));
8,194!
2839
  mTrace("user:%s, start to get auth", authReq.user);
8,194✔
2840

2841
  TAOS_CHECK_EXIT(mndAcquireUser(pMnode, authReq.user, &pUser));
8,194✔
2842

2843
  TAOS_CHECK_EXIT(mndSetUserAuthRsp(pMnode, pUser, &authRsp));
8,191!
2844

2845
  contLen = tSerializeSGetUserAuthRsp(NULL, 0, &authRsp);
8,191✔
2846
  if (contLen < 0) {
8,191!
2847
    TAOS_CHECK_EXIT(contLen);
×
2848
  }
2849
  pRsp = rpcMallocCont(contLen);
8,191✔
2850
  if (pRsp == NULL) {
8,191!
2851
    TAOS_CHECK_EXIT(terrno);
×
2852
  }
2853

2854
  contLen = tSerializeSGetUserAuthRsp(pRsp, contLen, &authRsp);
8,191✔
2855
  if (contLen < 0) {
8,191!
2856
    TAOS_CHECK_EXIT(contLen);
×
2857
  }
2858

2859
_exit:
8,191✔
2860
  mndReleaseUser(pMnode, pUser);
8,194✔
2861
  tFreeSGetUserAuthRsp(&authRsp);
8,194✔
2862
  if (code < 0) {
8,194✔
2863
    mError("user:%s, failed to get auth at line %d since %s", authReq.user, lino, tstrerror(code));
3!
2864
    rpcFreeCont(pRsp);
3✔
2865
    pRsp = NULL;
3✔
2866
    contLen = 0;
3✔
2867
  }
2868
  pReq->info.rsp = pRsp;
8,194✔
2869
  pReq->info.rspLen = contLen;
8,194✔
2870
  pReq->code = code;
8,194✔
2871

2872
  TAOS_RETURN(code);
8,194✔
2873
}
2874

2875
static int32_t mndRetrieveUsers(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
60✔
2876
  SMnode   *pMnode = pReq->info.node;
60✔
2877
  SSdb     *pSdb = pMnode->pSdb;
60✔
2878
  int32_t   code = 0;
60✔
2879
  int32_t   lino = 0;
60✔
2880
  int32_t   numOfRows = 0;
60✔
2881
  SUserObj *pUser = NULL;
60✔
2882
  int32_t   cols = 0;
60✔
2883
  int8_t    flag = 0;
60✔
2884
  char     *pWrite = NULL;
60✔
2885
  char     *buf = NULL;
60✔
2886
  char     *varstr = NULL;
60✔
2887

2888
  while (numOfRows < rows) {
212!
2889
    pShow->pIter = sdbFetch(pSdb, SDB_USER, pShow->pIter, (void **)&pUser);
212✔
2890
    if (pShow->pIter == NULL) break;
212✔
2891

2892
    cols = 0;
152✔
2893
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
152✔
2894
    char             name[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
152✔
2895
    STR_WITH_MAXSIZE_TO_VARSTR(name, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
152✔
2896
    COL_DATA_SET_VAL_GOTO((const char *)name, false, pUser, pShow->pIter, _exit);
152!
2897

2898
    cols++;
152✔
2899
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
152✔
2900
    COL_DATA_SET_VAL_GOTO((const char *)&pUser->superUser, false, pUser, pShow->pIter, _exit);
152!
2901

2902
    cols++;
152✔
2903
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
152✔
2904
    COL_DATA_SET_VAL_GOTO((const char *)&pUser->enable, false, pUser, pShow->pIter, _exit);
152!
2905

2906
    cols++;
152✔
2907
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
152✔
2908
    COL_DATA_SET_VAL_GOTO((const char *)&pUser->sysInfo, false, pUser, pShow->pIter, _exit);
152!
2909

2910
    cols++;
152✔
2911
    flag = pUser->createdb ? 1 : 0;
152✔
2912
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
152✔
2913
    COL_DATA_SET_VAL_GOTO((const char *)&flag, false, pUser, pShow->pIter, _exit);
152!
2914

2915
    cols++;
152✔
2916
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
152✔
2917
    COL_DATA_SET_VAL_GOTO((const char *)&pUser->createdTime, false, pUser, pShow->pIter, _exit);
152!
2918

2919
    cols++;
152✔
2920

2921
    int32_t tlen = convertIpWhiteListToStr(pUser->pIpWhiteListDual, &buf);
152✔
2922
    if (tlen != 0) {
152!
2923
      TAOS_MEMORY_REALLOC(varstr, VARSTR_HEADER_SIZE + tlen);
152!
2924
      if (varstr == NULL) {
152!
2925
        sdbRelease(pSdb, pUser);
×
2926
        sdbCancelFetch(pSdb, pShow->pIter);
×
2927
        TAOS_CHECK_GOTO(terrno, &lino, _exit);
×
2928
      }
2929
      varDataSetLen(varstr, tlen);
152✔
2930
      (void)memcpy(varDataVal(varstr), buf, tlen);
152✔
2931

2932
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
152✔
2933
      COL_DATA_SET_VAL_GOTO((const char *)varstr, false, pUser, pShow->pIter, _exit);
152!
2934

2935
      taosMemoryFreeClear(buf);
152!
2936
    } else {
2937
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2938
      COL_DATA_SET_VAL_GOTO((const char *)NULL, true, pUser, pShow->pIter, _exit);
×
2939
    }
2940

2941
    numOfRows++;
152✔
2942
    sdbRelease(pSdb, pUser);
152✔
2943
  }
2944

2945
  pShow->numOfRows += numOfRows;
60✔
2946
_exit:
60✔
2947
  taosMemoryFreeClear(buf);
60!
2948
  taosMemoryFreeClear(varstr);
60!
2949
  if (code < 0) {
60!
2950
    uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2951
    TAOS_RETURN(code);
×
2952
  }
2953
  return numOfRows;
60✔
2954
}
2955

2956
static int32_t mndRetrieveUsersFull(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
×
2957
  int32_t numOfRows = 0;
×
2958
#ifdef TD_ENTERPRISE
2959
  SMnode   *pMnode = pReq->info.node;
×
2960
  SSdb     *pSdb = pMnode->pSdb;
×
2961
  SUserObj *pUser = NULL;
×
2962
  int32_t   code = 0;
×
2963
  int32_t   lino = 0;
×
2964
  int32_t   cols = 0;
×
2965
  int8_t    flag = 0;
×
2966
  char     *pWrite = NULL;
×
2967
  char     *buf = NULL;
×
2968
  char     *varstr = NULL;
×
2969

2970
  while (numOfRows < rows) {
×
2971
    pShow->pIter = sdbFetch(pSdb, SDB_USER, pShow->pIter, (void **)&pUser);
×
2972
    if (pShow->pIter == NULL) break;
×
2973

2974
    cols = 0;
×
2975
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2976
    char             name[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
×
2977
    STR_WITH_MAXSIZE_TO_VARSTR(name, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
×
2978
    COL_DATA_SET_VAL_GOTO((const char *)name, false, pUser, pShow->pIter, _exit);
×
2979

2980
    cols++;
×
2981
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2982
    COL_DATA_SET_VAL_GOTO((const char *)&pUser->superUser, false, pUser, pShow->pIter, _exit);
×
2983

2984
    cols++;
×
2985
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2986
    COL_DATA_SET_VAL_GOTO((const char *)&pUser->enable, false, pUser, pShow->pIter, _exit);
×
2987

2988
    cols++;
×
2989
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2990
    COL_DATA_SET_VAL_GOTO((const char *)&pUser->sysInfo, false, pUser, pShow->pIter, _exit);
×
2991

2992
    cols++;
×
2993
    flag = pUser->createdb ? 1 : 0;
×
2994
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2995
    COL_DATA_SET_VAL_GOTO((const char *)&flag, false, pUser, pShow->pIter, _exit);
×
2996

2997
    // mInfo("pUser->pass:%s", pUser->pass);
2998
    cols++;
×
2999
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
3000
    char pass[TSDB_PASSWORD_LEN + VARSTR_HEADER_SIZE] = {0};
×
3001
    STR_WITH_MAXSIZE_TO_VARSTR(pass, pUser->pass, pShow->pMeta->pSchemas[cols].bytes);
×
3002
    COL_DATA_SET_VAL_GOTO((const char *)pass, false, pUser, pShow->pIter, _exit);
×
3003

3004
    cols++;
×
3005

3006
    int32_t tlen = convertIpWhiteListToStr(pUser->pIpWhiteListDual, &buf);
×
3007
    if (tlen != 0) {
×
3008
      TAOS_MEMORY_REALLOC(varstr, VARSTR_HEADER_SIZE + tlen);
×
3009
      if (varstr == NULL) {
×
3010
        sdbRelease(pSdb, pUser);
×
3011
        sdbCancelFetch(pSdb, pShow->pIter);
×
3012
        TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _exit);
×
3013
      }
3014
      varDataSetLen(varstr, tlen);
×
3015
      (void)memcpy(varDataVal(varstr), buf, tlen);
×
3016

3017
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
3018
      COL_DATA_SET_VAL_GOTO((const char *)varstr, false, pUser, pShow->pIter, _exit);
×
3019

3020
      taosMemoryFreeClear(buf);
×
3021
    } else {
3022
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
3023
      COL_DATA_SET_VAL_GOTO((const char *)NULL, true, pUser, pShow->pIter, _exit);
×
3024
    }
3025

3026
    numOfRows++;
×
3027
    sdbRelease(pSdb, pUser);
×
3028
  }
3029

3030
  pShow->numOfRows += numOfRows;
×
3031
_exit:
×
3032
  taosMemoryFreeClear(buf);
×
3033
  taosMemoryFreeClear(varstr);
×
3034
  if (code < 0) {
×
3035
    uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3036
    TAOS_RETURN(code);
×
3037
  }
3038
#endif
3039
  return numOfRows;
×
3040
}
3041

3042
static void mndCancelGetNextUser(SMnode *pMnode, void *pIter) {
×
3043
  SSdb *pSdb = pMnode->pSdb;
×
3044
  sdbCancelFetchByType(pSdb, pIter, SDB_USER);
×
3045
}
×
3046

3047
static int32_t mndLoopHash(SHashObj *hash, char *priType, SSDataBlock *pBlock, int32_t *pNumOfRows, SSdb *pSdb,
1,260✔
3048
                           SUserObj *pUser, SShowObj *pShow, char **condition, char **sql) {
3049
  char   *value = taosHashIterate(hash, NULL);
1,260✔
3050
  char   *user = pUser->user;
1,260✔
3051
  int32_t code = 0;
1,260✔
3052
  int32_t lino = 0;
1,260✔
3053
  int32_t cols = 0;
1,260✔
3054
  int32_t numOfRows = *pNumOfRows;
1,260✔
3055

3056
  while (value != NULL) {
1,354✔
3057
    cols = 0;
94✔
3058
    char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
94✔
3059
    STR_WITH_MAXSIZE_TO_VARSTR(userName, user, pShow->pMeta->pSchemas[cols].bytes);
94✔
3060
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
94✔
3061
    COL_DATA_SET_VAL_GOTO((const char *)userName, false, NULL, NULL, _exit);
94!
3062

3063
    char privilege[20] = {0};
94✔
3064
    STR_WITH_MAXSIZE_TO_VARSTR(privilege, priType, pShow->pMeta->pSchemas[cols].bytes);
94✔
3065
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
94✔
3066
    COL_DATA_SET_VAL_GOTO((const char *)privilege, false, NULL, NULL, _exit);
94!
3067

3068
    size_t keyLen = 0;
94✔
3069
    void  *key = taosHashGetKey(value, &keyLen);
94✔
3070

3071
    char dbName[TSDB_DB_NAME_LEN] = {0};
94✔
3072
    (void)mndExtractShortDbNameFromStbFullName(key, dbName);
94✔
3073
    char dbNameContent[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
94✔
3074
    STR_WITH_MAXSIZE_TO_VARSTR(dbNameContent, dbName, pShow->pMeta->pSchemas[cols].bytes);
94✔
3075
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
94✔
3076
    COL_DATA_SET_VAL_GOTO((const char *)dbNameContent, false, NULL, NULL, _exit);
94!
3077

3078
    char tableName[TSDB_TABLE_NAME_LEN] = {0};
94✔
3079
    mndExtractTbNameFromStbFullName(key, tableName, TSDB_TABLE_NAME_LEN);
94✔
3080
    char tableNameContent[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
94✔
3081
    STR_WITH_MAXSIZE_TO_VARSTR(tableNameContent, tableName, pShow->pMeta->pSchemas[cols].bytes);
94✔
3082
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
94✔
3083
    COL_DATA_SET_VAL_GOTO((const char *)tableNameContent, false, NULL, NULL, _exit);
94!
3084

3085
    if (strcmp("t", value) != 0 && strcmp("v", value) != 0) {
108✔
3086
      SNode  *pAst = NULL;
14✔
3087
      int32_t sqlLen = 0;
14✔
3088
      size_t  bufSz = strlen(value) + 1;
14✔
3089
      if (bufSz < 6) bufSz = 6;
14!
3090
      TAOS_MEMORY_REALLOC(*sql, bufSz);
14!
3091
      if (*sql == NULL) {
14!
3092
        code = terrno;
×
3093
        goto _exit;
×
3094
      }
3095
      TAOS_MEMORY_REALLOC(*condition, TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE);
14!
3096
      if ((*condition) == NULL) {
14!
3097
        code = terrno;
×
3098
        goto _exit;
×
3099
      }
3100

3101
      if (nodesStringToNode(value, &pAst) == 0) {
14!
3102
        if (nodesNodeToSQLFormat(pAst, *sql, bufSz, &sqlLen, true) != 0) {
14!
3103
          sqlLen = tsnprintf(*sql, bufSz, "error");
×
3104
        }
3105
        nodesDestroyNode(pAst);
14✔
3106
      }
3107

3108
      if (sqlLen == 0) {
14!
3109
        sqlLen = tsnprintf(*sql, bufSz, "error");
×
3110
      }
3111

3112
      STR_WITH_MAXSIZE_TO_VARSTR((*condition), (*sql), pShow->pMeta->pSchemas[cols].bytes);
14✔
3113

3114
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
14✔
3115
      COL_DATA_SET_VAL_GOTO((const char *)(*condition), false, NULL, NULL, _exit);
14!
3116

3117
      char notes[2] = {0};
14✔
3118
      STR_WITH_MAXSIZE_TO_VARSTR(notes, "", sizeof(notes));
14✔
3119
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
14✔
3120
      COL_DATA_SET_VAL_GOTO((const char *)notes, false, NULL, NULL, _exit);
14!
3121
    } else {
3122
      TAOS_MEMORY_REALLOC(*condition, TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE);
80!
3123
      if ((*condition) == NULL) {
80!
3124
        code = terrno;
×
3125
        goto _exit;
×
3126
      }
3127
      STR_WITH_MAXSIZE_TO_VARSTR((*condition), "", pShow->pMeta->pSchemas[cols].bytes);
80✔
3128
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
80✔
3129
      COL_DATA_SET_VAL_GOTO((const char *)(*condition), false, NULL, NULL, _exit);
80!
3130

3131
      char notes[64 + VARSTR_HEADER_SIZE] = {0};
80✔
3132
      STR_WITH_MAXSIZE_TO_VARSTR(notes, value[0] == 'v' ? "view" : "", sizeof(notes));
80✔
3133
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
80✔
3134
      COL_DATA_SET_VAL_GOTO((const char *)notes, false, NULL, NULL, _exit);
80!
3135
    }
3136

3137
    numOfRows++;
94✔
3138
    value = taosHashIterate(hash, value);
94✔
3139
  }
3140
  *pNumOfRows = numOfRows;
1,260✔
3141
_exit:
1,260✔
3142
  if (code < 0) {
1,260!
3143
    uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3144
    sdbRelease(pSdb, pUser);
×
3145
    sdbCancelFetch(pSdb, pShow->pIter);
×
3146
  }
3147
  TAOS_RETURN(code);
1,260✔
3148
}
3149

3150
static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
71✔
3151
  int32_t   code = 0;
71✔
3152
  int32_t   lino = 0;
71✔
3153
  SMnode   *pMnode = pReq->info.node;
71✔
3154
  SSdb     *pSdb = pMnode->pSdb;
71✔
3155
  int32_t   numOfRows = 0;
71✔
3156
  SUserObj *pUser = NULL;
71✔
3157
  int32_t   cols = 0;
71✔
3158
  char     *pWrite = NULL;
71✔
3159
  char     *condition = NULL;
71✔
3160
  char     *sql = NULL;
71✔
3161

3162
  bool fetchNextUser = pShow->restore ? false : true;
71✔
3163
  pShow->restore = false;
71✔
3164

3165
  while (numOfRows < rows) {
281!
3166
    if (fetchNextUser) {
281!
3167
      pShow->pIter = sdbFetch(pSdb, SDB_USER, pShow->pIter, (void **)&pUser);
281✔
3168
      if (pShow->pIter == NULL) break;
281✔
3169
    } else {
3170
      fetchNextUser = true;
×
3171
      void *pKey = taosHashGetKey(pShow->pIter, NULL);
×
3172
      pUser = sdbAcquire(pSdb, SDB_USER, pKey);
×
3173
      if (!pUser) {
×
3174
        continue;
×
3175
      }
3176
    }
3177

3178
    int32_t numOfReadDbs = taosHashGetSize(pUser->readDbs);
210✔
3179
    int32_t numOfWriteDbs = taosHashGetSize(pUser->writeDbs);
210✔
3180
    int32_t numOfTopics = taosHashGetSize(pUser->topics);
210✔
3181
    int32_t numOfReadTbs = taosHashGetSize(pUser->readTbs);
210✔
3182
    int32_t numOfWriteTbs = taosHashGetSize(pUser->writeTbs);
210✔
3183
    int32_t numOfAlterTbs = taosHashGetSize(pUser->alterTbs);
210✔
3184
    int32_t numOfReadViews = taosHashGetSize(pUser->readViews);
210✔
3185
    int32_t numOfWriteViews = taosHashGetSize(pUser->writeViews);
210✔
3186
    int32_t numOfAlterViews = taosHashGetSize(pUser->alterViews);
210✔
3187
    if (numOfRows + numOfReadDbs + numOfWriteDbs + numOfTopics + numOfReadTbs + numOfWriteTbs + numOfAlterTbs +
210✔
3188
            numOfReadViews + numOfWriteViews + numOfAlterViews >=
210!
3189
        rows) {
3190
      mInfo(
×
3191
          "will restore. current num of rows: %d, read dbs %d, write dbs %d, topics %d, read tables %d, write tables "
3192
          "%d, alter tables %d, read views %d, write views %d, alter views %d",
3193
          numOfRows, numOfReadDbs, numOfWriteDbs, numOfTopics, numOfReadTbs, numOfWriteTbs, numOfAlterTbs,
3194
          numOfReadViews, numOfWriteViews, numOfAlterViews);
3195
      pShow->restore = true;
×
3196
      sdbRelease(pSdb, pUser);
×
3197
      break;
×
3198
    }
3199

3200
    if (pUser->superUser) {
210✔
3201
      cols = 0;
71✔
3202
      char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
71✔
3203
      STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
71✔
3204
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
71✔
3205
      COL_DATA_SET_VAL_GOTO((const char *)userName, false, pUser, pShow->pIter, _exit);
71!
3206

3207
      char privilege[20] = {0};
71✔
3208
      STR_WITH_MAXSIZE_TO_VARSTR(privilege, "all", pShow->pMeta->pSchemas[cols].bytes);
71✔
3209
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
71✔
3210
      COL_DATA_SET_VAL_GOTO((const char *)privilege, false, pUser, pShow->pIter, _exit);
71!
3211

3212
      char objName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
71✔
3213
      STR_WITH_MAXSIZE_TO_VARSTR(objName, "all", pShow->pMeta->pSchemas[cols].bytes);
71✔
3214
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
71✔
3215
      COL_DATA_SET_VAL_GOTO((const char *)objName, false, pUser, pShow->pIter, _exit);
71!
3216

3217
      char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
71✔
3218
      STR_WITH_MAXSIZE_TO_VARSTR(tableName, "", pShow->pMeta->pSchemas[cols].bytes);
71✔
3219
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
71✔
3220
      COL_DATA_SET_VAL_GOTO((const char *)tableName, false, pUser, pShow->pIter, _exit);
71!
3221

3222
      TAOS_MEMORY_REALLOC(condition, TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE);
71!
3223
      if (condition == NULL) {
71!
3224
        sdbRelease(pSdb, pUser);
×
3225
        TAOS_CHECK_GOTO(terrno, &lino, _exit);
×
3226
      }
3227
      STR_WITH_MAXSIZE_TO_VARSTR(condition, "", pShow->pMeta->pSchemas[cols].bytes);
71✔
3228
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
71✔
3229
      COL_DATA_SET_VAL_GOTO((const char *)condition, false, pUser, pShow->pIter, _exit);
71!
3230

3231
      char notes[2] = {0};
71✔
3232
      STR_WITH_MAXSIZE_TO_VARSTR(notes, "", sizeof(notes));
71✔
3233
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
71✔
3234
      COL_DATA_SET_VAL_GOTO((const char *)notes, false, pUser, pShow->pIter, _exit);
71!
3235

3236
      numOfRows++;
71✔
3237
    }
3238

3239
    char *db = taosHashIterate(pUser->readDbs, NULL);
210✔
3240
    while (db != NULL) {
267✔
3241
      cols = 0;
57✔
3242
      char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
57✔
3243
      STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
57✔
3244
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
57✔
3245
      COL_DATA_SET_VAL_GOTO((const char *)userName, false, pUser, pShow->pIter, _exit);
57!
3246

3247
      char privilege[20] = {0};
57✔
3248
      STR_WITH_MAXSIZE_TO_VARSTR(privilege, "read", pShow->pMeta->pSchemas[cols].bytes);
57✔
3249
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
57✔
3250
      COL_DATA_SET_VAL_GOTO((const char *)privilege, false, pUser, pShow->pIter, _exit);
57!
3251

3252
      SName name = {0};
57✔
3253
      char  objName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
57✔
3254
      code = tNameFromString(&name, db, T_NAME_ACCT | T_NAME_DB);
57✔
3255
      if (code < 0) {
57!
3256
        sdbRelease(pSdb, pUser);
×
3257
        sdbCancelFetch(pSdb, pShow->pIter);
×
3258
        TAOS_CHECK_GOTO(code, &lino, _exit);
×
3259
      }
3260
      (void)tNameGetDbName(&name, varDataVal(objName));
57✔
3261
      varDataSetLen(objName, strlen(varDataVal(objName)));
57✔
3262
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
57✔
3263
      COL_DATA_SET_VAL_GOTO((const char *)objName, false, pUser, pShow->pIter, _exit);
57!
3264

3265
      char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
57✔
3266
      STR_WITH_MAXSIZE_TO_VARSTR(tableName, "", pShow->pMeta->pSchemas[cols].bytes);
57✔
3267
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
57✔
3268
      COL_DATA_SET_VAL_GOTO((const char *)tableName, false, pUser, pShow->pIter, _exit);
57!
3269

3270
      TAOS_MEMORY_REALLOC(condition, TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE);
57!
3271
      if (condition == NULL) {
57!
3272
        sdbRelease(pSdb, pUser);
×
3273
        sdbCancelFetch(pSdb, pShow->pIter);
×
3274
        TAOS_CHECK_GOTO(terrno, &lino, _exit);
×
3275
      }
3276
      STR_WITH_MAXSIZE_TO_VARSTR(condition, "", pShow->pMeta->pSchemas[cols].bytes);
57✔
3277
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
57✔
3278
      COL_DATA_SET_VAL_GOTO((const char *)condition, false, pUser, pShow->pIter, _exit);
57!
3279

3280
      char notes[2] = {0};
57✔
3281
      STR_WITH_MAXSIZE_TO_VARSTR(notes, "", sizeof(notes));
57✔
3282
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
57✔
3283
      COL_DATA_SET_VAL_GOTO((const char *)notes, false, pUser, pShow->pIter, _exit);
57!
3284

3285
      numOfRows++;
57✔
3286
      db = taosHashIterate(pUser->readDbs, db);
57✔
3287
    }
3288

3289
    db = taosHashIterate(pUser->writeDbs, NULL);
210✔
3290
    while (db != NULL) {
260✔
3291
      cols = 0;
50✔
3292
      char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
50✔
3293
      STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
50✔
3294
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
50✔
3295
      COL_DATA_SET_VAL_GOTO((const char *)userName, false, pUser, pShow->pIter, _exit);
50!
3296

3297
      char privilege[20] = {0};
50✔
3298
      STR_WITH_MAXSIZE_TO_VARSTR(privilege, "write", pShow->pMeta->pSchemas[cols].bytes);
50✔
3299
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
50✔
3300
      COL_DATA_SET_VAL_GOTO((const char *)privilege, false, pUser, pShow->pIter, _exit);
50!
3301

3302
      SName name = {0};
50✔
3303
      char  objName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
50✔
3304
      code = tNameFromString(&name, db, T_NAME_ACCT | T_NAME_DB);
50✔
3305
      if (code < 0) {
50!
3306
        sdbRelease(pSdb, pUser);
×
3307
        sdbCancelFetch(pSdb, pShow->pIter);
×
3308
        TAOS_CHECK_GOTO(code, &lino, _exit);
×
3309
      }
3310
      (void)tNameGetDbName(&name, varDataVal(objName));
50✔
3311
      varDataSetLen(objName, strlen(varDataVal(objName)));
50✔
3312
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
50✔
3313
      COL_DATA_SET_VAL_GOTO((const char *)objName, false, pUser, pShow->pIter, _exit);
50!
3314

3315
      char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
50✔
3316
      STR_WITH_MAXSIZE_TO_VARSTR(tableName, "", pShow->pMeta->pSchemas[cols].bytes);
50✔
3317
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
50✔
3318
      COL_DATA_SET_VAL_GOTO((const char *)tableName, false, pUser, pShow->pIter, _exit);
50!
3319

3320
      TAOS_MEMORY_REALLOC(condition, TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE);
50!
3321
      if (condition == NULL) {
50!
3322
        sdbRelease(pSdb, pUser);
×
3323
        sdbCancelFetch(pSdb, pShow->pIter);
×
3324
        TAOS_CHECK_GOTO(terrno, &lino, _exit);
×
3325
      }
3326
      STR_WITH_MAXSIZE_TO_VARSTR(condition, "", pShow->pMeta->pSchemas[cols].bytes);
50✔
3327
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
50✔
3328
      COL_DATA_SET_VAL_GOTO((const char *)condition, false, pUser, pShow->pIter, _exit);
50!
3329

3330
      char notes[2] = {0};
50✔
3331
      STR_WITH_MAXSIZE_TO_VARSTR(notes, "", sizeof(notes));
50✔
3332
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
50✔
3333
      COL_DATA_SET_VAL_GOTO((const char *)notes, false, pUser, pShow->pIter, _exit);
50!
3334

3335
      numOfRows++;
50✔
3336
      db = taosHashIterate(pUser->writeDbs, db);
50✔
3337
    }
3338

3339
    TAOS_CHECK_EXIT(mndLoopHash(pUser->readTbs, "read", pBlock, &numOfRows, pSdb, pUser, pShow, &condition, &sql));
210!
3340

3341
    TAOS_CHECK_EXIT(mndLoopHash(pUser->writeTbs, "write", pBlock, &numOfRows, pSdb, pUser, pShow, &condition, &sql));
210!
3342

3343
    TAOS_CHECK_EXIT(mndLoopHash(pUser->alterTbs, "alter", pBlock, &numOfRows, pSdb, pUser, pShow, &condition, &sql));
210!
3344

3345
    TAOS_CHECK_EXIT(mndLoopHash(pUser->readViews, "read", pBlock, &numOfRows, pSdb, pUser, pShow, &condition, &sql));
210!
3346

3347
    TAOS_CHECK_EXIT(mndLoopHash(pUser->writeViews, "write", pBlock, &numOfRows, pSdb, pUser, pShow, &condition, &sql));
210!
3348

3349
    TAOS_CHECK_EXIT(mndLoopHash(pUser->alterViews, "alter", pBlock, &numOfRows, pSdb, pUser, pShow, &condition, &sql));
210!
3350

3351
    char *topic = taosHashIterate(pUser->topics, NULL);
210✔
3352
    while (topic != NULL) {
220✔
3353
      cols = 0;
10✔
3354
      char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
10✔
3355
      STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
10✔
3356
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10✔
3357
      COL_DATA_SET_VAL_GOTO((const char *)userName, false, pUser, pShow->pIter, _exit);
10!
3358

3359
      char privilege[20] = {0};
10✔
3360
      STR_WITH_MAXSIZE_TO_VARSTR(privilege, "subscribe", pShow->pMeta->pSchemas[cols].bytes);
10✔
3361
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10✔
3362
      COL_DATA_SET_VAL_GOTO((const char *)privilege, false, pUser, pShow->pIter, _exit);
10!
3363

3364
      char topicName[TSDB_TOPIC_NAME_LEN + VARSTR_HEADER_SIZE + 5] = {0};
10✔
3365
      tstrncpy(varDataVal(topicName), mndGetDbStr(topic), TSDB_TOPIC_NAME_LEN - 2);
10✔
3366
      varDataSetLen(topicName, strlen(varDataVal(topicName)));
10✔
3367
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10✔
3368
      COL_DATA_SET_VAL_GOTO((const char *)topicName, false, pUser, pShow->pIter, _exit);
10!
3369

3370
      char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
10✔
3371
      STR_WITH_MAXSIZE_TO_VARSTR(tableName, "", pShow->pMeta->pSchemas[cols].bytes);
10✔
3372
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10✔
3373
      COL_DATA_SET_VAL_GOTO((const char *)tableName, false, pUser, pShow->pIter, _exit);
10!
3374

3375
      TAOS_MEMORY_REALLOC(condition, TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE);
10!
3376
      if (condition == NULL) {
10!
3377
        sdbRelease(pSdb, pUser);
×
3378
        TAOS_CHECK_GOTO(terrno, &lino, _exit);
×
3379
      }
3380
      STR_WITH_MAXSIZE_TO_VARSTR(condition, "", pShow->pMeta->pSchemas[cols].bytes);
10✔
3381
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10✔
3382
      COL_DATA_SET_VAL_GOTO((const char *)condition, false, pUser, pShow->pIter, _exit);
10!
3383

3384
      char notes[2] = {0};
10✔
3385
      STR_WITH_MAXSIZE_TO_VARSTR(notes, "", sizeof(notes));
10✔
3386
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
10✔
3387
      COL_DATA_SET_VAL_GOTO((const char *)notes, false, pUser, pShow->pIter, _exit);
10!
3388

3389
      numOfRows++;
10✔
3390
      topic = taosHashIterate(pUser->topics, topic);
10✔
3391
    }
3392

3393
    sdbRelease(pSdb, pUser);
210✔
3394
  }
3395

3396
  pShow->numOfRows += numOfRows;
71✔
3397
_exit:
71✔
3398
  taosMemoryFreeClear(condition);
71!
3399
  taosMemoryFreeClear(sql);
71!
3400
  if (code < 0) {
71!
3401
    uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3402
    TAOS_RETURN(code);
×
3403
  }
3404
  return numOfRows;
71✔
3405
}
3406

3407
static void mndCancelGetNextPrivileges(SMnode *pMnode, void *pIter) {
×
3408
  SSdb *pSdb = pMnode->pSdb;
×
3409
  sdbCancelFetchByType(pSdb, pIter, SDB_USER);
×
3410
}
×
3411

3412
int32_t mndValidateUserAuthInfo(SMnode *pMnode, SUserAuthVersion *pUsers, int32_t numOfUses, void **ppRsp,
26,191✔
3413
                                int32_t *pRspLen, int64_t ipWhiteListVer) {
3414
  int32_t           code = 0;
26,191✔
3415
  int32_t           lino = 0;
26,191✔
3416
  int32_t           rspLen = 0;
26,191✔
3417
  void             *pRsp = NULL;
26,191✔
3418
  SUserAuthBatchRsp batchRsp = {0};
26,191✔
3419

3420
  batchRsp.pArray = taosArrayInit(numOfUses, sizeof(SGetUserAuthRsp));
26,191✔
3421
  if (batchRsp.pArray == NULL) {
26,191!
3422
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
3423
  }
3424

3425
  for (int32_t i = 0; i < numOfUses; ++i) {
53,323✔
3426
    SUserObj *pUser = NULL;
27,132✔
3427
    code = mndAcquireUser(pMnode, pUsers[i].user, &pUser);
27,132✔
3428
    if (pUser == NULL) {
27,132✔
3429
      if (TSDB_CODE_MND_USER_NOT_EXIST == code) {
15!
3430
        SGetUserAuthRsp rsp = {.dropped = 1};
15✔
3431
        (void)memcpy(rsp.user, pUsers[i].user, TSDB_USER_LEN);
15✔
3432
        TSDB_CHECK_NULL(taosArrayPush(batchRsp.pArray, &rsp), code, lino, _OVER, TSDB_CODE_OUT_OF_MEMORY);
30!
3433
      }
3434
      mError("user:%s, failed to auth user since %s", pUsers[i].user, tstrerror(code));
15!
3435
      code = 0;
15✔
3436
      continue;
25,769✔
3437
    }
3438

3439
    pUsers[i].version = ntohl(pUsers[i].version);
27,117✔
3440
    if (pUser->authVersion <= pUsers[i].version && ipWhiteListVer == pMnode->ipWhiteVer) {
27,117✔
3441
      mndReleaseUser(pMnode, pUser);
25,754✔
3442
      continue;
25,754✔
3443
    }
3444

3445
    SGetUserAuthRsp rsp = {0};
1,363✔
3446
    code = mndSetUserAuthRsp(pMnode, pUser, &rsp);
1,363✔
3447
    if (code) {
1,363!
3448
      mndReleaseUser(pMnode, pUser);
×
3449
      tFreeSGetUserAuthRsp(&rsp);
×
3450
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
3451
    }
3452

3453
    if (!(taosArrayPush(batchRsp.pArray, &rsp))) {
2,726!
3454
      code = terrno;
×
3455
      mndReleaseUser(pMnode, pUser);
×
3456
      tFreeSGetUserAuthRsp(&rsp);
×
3457
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
3458
    }
3459
    mndReleaseUser(pMnode, pUser);
1,363✔
3460
  }
3461

3462
  if (taosArrayGetSize(batchRsp.pArray) <= 0) {
26,191✔
3463
    *ppRsp = NULL;
24,854✔
3464
    *pRspLen = 0;
24,854✔
3465

3466
    tFreeSUserAuthBatchRsp(&batchRsp);
24,854✔
3467
    return 0;
24,854✔
3468
  }
3469

3470
  rspLen = tSerializeSUserAuthBatchRsp(NULL, 0, &batchRsp);
1,338✔
3471
  if (rspLen < 0) {
1,338!
3472
    TAOS_CHECK_GOTO(rspLen, &lino, _OVER);
×
3473
  }
3474
  pRsp = taosMemoryMalloc(rspLen);
1,338!
3475
  if (pRsp == NULL) {
1,338!
3476
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
3477
  }
3478
  rspLen = tSerializeSUserAuthBatchRsp(pRsp, rspLen, &batchRsp);
1,338✔
3479
  if (rspLen < 0) {
1,338!
3480
    TAOS_CHECK_GOTO(rspLen, &lino, _OVER);
×
3481
  }
3482
_OVER:
1,338✔
3483
  tFreeSUserAuthBatchRsp(&batchRsp);
1,338✔
3484
  if (code < 0) {
1,338!
3485
    uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3486
    taosMemoryFreeClear(pRsp);
×
3487
    rspLen = 0;
×
3488
  }
3489
  *ppRsp = pRsp;
1,338✔
3490
  *pRspLen = rspLen;
1,338✔
3491

3492
  TAOS_RETURN(code);
1,338✔
3493
}
3494

3495
static int32_t mndRemoveDbPrivileges(SHashObj *pHash, const char *dbFName, int32_t dbFNameLen, int32_t *nRemoved) {
162✔
3496
  void *pVal = NULL;
162✔
3497
  while ((pVal = taosHashIterate(pHash, pVal))) {
255✔
3498
    size_t keyLen = 0;
93✔
3499
    char  *pKey = (char *)taosHashGetKey(pVal, &keyLen);
93✔
3500
    if (pKey == NULL || keyLen <= dbFNameLen) continue;
93!
3501
    if ((*(pKey + dbFNameLen) == '.') && strncmp(pKey, dbFName, dbFNameLen) == 0) {
93✔
3502
      TAOS_CHECK_RETURN(taosHashRemove(pHash, pKey, keyLen));
35!
3503
      if (nRemoved) ++(*nRemoved);
35!
3504
    }
3505
  }
3506
  TAOS_RETURN(0);
162✔
3507
}
3508

3509
int32_t mndUserRemoveDb(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SSHashObj **ppUsers) {
1,429✔
3510
  int32_t    code = 0, lino = 0;
1,429✔
3511
  SSdb      *pSdb = pMnode->pSdb;
1,429✔
3512
  int32_t    dbLen = strlen(pDb->name);
1,429✔
3513
  void      *pIter = NULL;
1,429✔
3514
  SUserObj  *pUser = NULL;
1,429✔
3515
  SUserObj   newUser = {0};
1,429✔
3516
  SSHashObj *pUsers = ppUsers ? *ppUsers : NULL;
1,429✔
3517
  bool       output = (ppUsers != NULL);
1,429✔
3518

3519
  while (1) {
1,538✔
3520
    pIter = sdbFetch(pSdb, SDB_USER, pIter, (void **)&pUser);
2,967✔
3521
    if (pIter == NULL) break;
2,967✔
3522

3523
    bool update = false;
1,538✔
3524
    bool inReadDb = (taosHashGet(pUser->readDbs, pDb->name, dbLen + 1) != NULL);
1,538✔
3525
    bool inWriteDb = (taosHashGet(pUser->writeDbs, pDb->name, dbLen + 1) != NULL);
1,538✔
3526
    bool inUseDb = (taosHashGet(pUser->useDbs, pDb->name, dbLen + 1) != NULL);
1,538✔
3527
    bool inReadTbs = taosHashGetSize(pUser->readTbs) > 0;
1,538✔
3528
    bool inWriteTbs = taosHashGetSize(pUser->writeTbs) > 0;
1,538✔
3529
    bool inAlterTbs = taosHashGetSize(pUser->alterTbs) > 0;
1,538✔
3530
    bool inReadViews = taosHashGetSize(pUser->readViews) > 0;
1,538✔
3531
    bool inWriteViews = taosHashGetSize(pUser->writeViews) > 0;
1,538✔
3532
    bool inAlterViews = taosHashGetSize(pUser->alterViews) > 0;
1,538✔
3533
    // no need remove pUser->topics since topics must be dropped ahead of db
3534
    if (!inReadDb && !inWriteDb && !inReadTbs && !inWriteTbs && !inAlterTbs && !inReadViews && !inWriteViews &&
1,538!
3535
        !inAlterViews) {
1,477!
3536
      sdbRelease(pSdb, pUser);
1,477✔
3537
      continue;
1,477✔
3538
    }
3539
    SUserObj *pTargetUser = &newUser;
61✔
3540
    if (output) {
61✔
3541
      if (!pUsers) {
4✔
3542
        TSDB_CHECK_NULL(pUsers = tSimpleHashInit(32, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY)), code, lino,
2!
3543
                        _exit, TSDB_CODE_OUT_OF_MEMORY);
3544
        *ppUsers = pUsers;
2✔
3545
      }
3546
      void   *pVal = NULL;
4✔
3547
      int32_t userLen = strlen(pUser->user) + 1;
4✔
3548
      if ((pVal = tSimpleHashGet(pUsers, pUser->user, userLen)) != NULL) {
4✔
3549
        pTargetUser = (SUserObj *)pVal;
2✔
3550
      } else {
3551
        TAOS_CHECK_EXIT(mndUserDupObj(pUser, &newUser));
2!
3552
        TAOS_CHECK_EXIT(tSimpleHashPut(pUsers, pUser->user, userLen, &newUser, sizeof(SUserObj)));
2!
3553
        TSDB_CHECK_NULL((pVal = tSimpleHashGet(pUsers, pUser->user, userLen)), code, lino, _exit,
2!
3554
                        TSDB_CODE_OUT_OF_MEMORY);
3555
        pTargetUser = (SUserObj *)pVal;
2✔
3556
      }
3557
    } else {
3558
      TAOS_CHECK_EXIT(mndUserDupObj(pUser, &newUser));
57!
3559
    }
3560
    if (inReadDb) {
61✔
3561
      TAOS_CHECK_EXIT(taosHashRemove(pTargetUser->readDbs, pDb->name, dbLen + 1));
13!
3562
    }
3563
    if (inWriteDb) {
61✔
3564
      TAOS_CHECK_EXIT(taosHashRemove(pTargetUser->writeDbs, pDb->name, dbLen + 1));
12!
3565
    }
3566
    if (inUseDb) {
61✔
3567
      TAOS_CHECK_EXIT(taosHashRemove(pTargetUser->useDbs, pDb->name, dbLen + 1));
6!
3568
    }
3569
    update = inReadDb || inWriteDb || inUseDb;
61!
3570

3571
    int32_t nRemovedReadTbs = 0;
61✔
3572
    int32_t nRemovedWriteTbs = 0;
61✔
3573
    int32_t nRemovedAlterTbs = 0;
61✔
3574
    if (inReadTbs || inWriteTbs || inAlterTbs) {
61!
3575
      TAOS_CHECK_EXIT(mndRemoveDbPrivileges(pTargetUser->readTbs, pDb->name, dbLen, &nRemovedReadTbs));
53!
3576
      TAOS_CHECK_EXIT(mndRemoveDbPrivileges(pTargetUser->writeTbs, pDb->name, dbLen, &nRemovedWriteTbs));
53!
3577
      TAOS_CHECK_EXIT(mndRemoveDbPrivileges(pTargetUser->alterTbs, pDb->name, dbLen, &nRemovedAlterTbs));
53!
3578
      if (!update) update = nRemovedReadTbs > 0 || nRemovedWriteTbs > 0 || nRemovedAlterTbs > 0;
53!
3579
    }
3580

3581
    int32_t nRemovedReadViews = 0;
61✔
3582
    int32_t nRemovedWriteViews = 0;
61✔
3583
    int32_t nRemovedAlterViews = 0;
61✔
3584
    if (inReadViews || inWriteViews || inAlterViews) {
61!
3585
      TAOS_CHECK_EXIT(mndRemoveDbPrivileges(pTargetUser->readViews, pDb->name, dbLen, &nRemovedReadViews));
1!
3586
      TAOS_CHECK_EXIT(mndRemoveDbPrivileges(pTargetUser->writeViews, pDb->name, dbLen, &nRemovedWriteViews));
1!
3587
      TAOS_CHECK_EXIT(mndRemoveDbPrivileges(pTargetUser->alterViews, pDb->name, dbLen, &nRemovedAlterViews));
1!
3588
      if (!update) update = nRemovedReadViews > 0 || nRemovedWriteViews > 0 || nRemovedAlterViews > 0;
1!
3589
    }
3590

3591
    if (!output) {
61✔
3592
      if (update) {
57✔
3593
        SSdbRaw *pCommitRaw = mndUserActionEncode(pTargetUser);
9✔
3594
        if (pCommitRaw == NULL) {
9!
3595
          TAOS_CHECK_EXIT(terrno);
×
3596
        }
3597
        TAOS_CHECK_EXIT(mndTransAppendCommitlog(pTrans, pCommitRaw));
9!
3598
        TAOS_CHECK_EXIT(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY));
9!
3599
      }
3600
      mndUserFreeObj(&newUser);
57✔
3601
    }
3602
    sdbRelease(pSdb, pUser);
61✔
3603
  }
3604

3605
_exit:
1,429✔
3606
  if (code < 0) {
1,429!
3607
    uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3608
    mndUserFreeObj(&newUser);
×
3609
  }
3610
  if (pUser != NULL) sdbRelease(pSdb, pUser);
1,429!
3611
  if (pIter != NULL) sdbCancelFetch(pSdb, pIter);
1,429!
3612
  if (!output) mndUserFreeObj(&newUser);
1,429✔
3613
  TAOS_RETURN(code);
1,429✔
3614
}
3615

3616
int32_t mndUserRemoveStb(SMnode *pMnode, STrans *pTrans, char *stb) {
937✔
3617
  int32_t   code = 0;
937✔
3618
  SSdb     *pSdb = pMnode->pSdb;
937✔
3619
  int32_t   len = strlen(stb) + 1;
937✔
3620
  void     *pIter = NULL;
937✔
3621
  SUserObj *pUser = NULL;
937✔
3622
  SUserObj  newUser = {0};
937✔
3623

3624
  while (1) {
939✔
3625
    pIter = sdbFetch(pSdb, SDB_USER, pIter, (void **)&pUser);
1,876✔
3626
    if (pIter == NULL) break;
1,876✔
3627

3628
    if ((code = mndUserDupObj(pUser, &newUser)) != 0) {
939!
3629
      break;
×
3630
    }
3631

3632
    bool inRead = (taosHashGet(newUser.readTbs, stb, len) != NULL);
939✔
3633
    bool inWrite = (taosHashGet(newUser.writeTbs, stb, len) != NULL);
939✔
3634
    bool inAlter = (taosHashGet(newUser.alterTbs, stb, len) != NULL);
939✔
3635
    if (inRead || inWrite || inAlter) {
939!
3636
      code = taosHashRemove(newUser.readTbs, stb, len);
×
3637
      if (code < 0) {
×
3638
        mError("failed to remove readTbs:%s from user:%s", stb, pUser->user);
×
3639
      }
3640
      code = taosHashRemove(newUser.writeTbs, stb, len);
×
3641
      if (code < 0) {
×
3642
        mError("failed to remove writeTbs:%s from user:%s", stb, pUser->user);
×
3643
      }
3644
      code = taosHashRemove(newUser.alterTbs, stb, len);
×
3645
      if (code < 0) {
×
3646
        mError("failed to remove alterTbs:%s from user:%s", stb, pUser->user);
×
3647
      }
3648

3649
      SSdbRaw *pCommitRaw = mndUserActionEncode(&newUser);
×
3650
      if (pCommitRaw == NULL || (code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
×
3651
        code = TSDB_CODE_OUT_OF_MEMORY;
×
3652
        break;
×
3653
      }
3654
      code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY);
×
3655
      if (code != 0) {
×
3656
        mndUserFreeObj(&newUser);
×
3657
        sdbRelease(pSdb, pUser);
×
3658
        TAOS_RETURN(code);
×
3659
      }
3660
    }
3661

3662
    mndUserFreeObj(&newUser);
939✔
3663
    sdbRelease(pSdb, pUser);
939✔
3664
  }
3665

3666
  if (pUser != NULL) sdbRelease(pSdb, pUser);
937!
3667
  if (pIter != NULL) sdbCancelFetch(pSdb, pIter);
937!
3668
  mndUserFreeObj(&newUser);
937✔
3669
  TAOS_RETURN(code);
937✔
3670
}
3671

3672
int32_t mndUserRemoveView(SMnode *pMnode, STrans *pTrans, char *view) {
394✔
3673
  int32_t   code = 0;
394✔
3674
  SSdb     *pSdb = pMnode->pSdb;
394✔
3675
  int32_t   len = strlen(view) + 1;
394✔
3676
  void     *pIter = NULL;
394✔
3677
  SUserObj *pUser = NULL;
394✔
3678
  SUserObj  newUser = {0};
394✔
3679

3680
  while (1) {
412✔
3681
    pIter = sdbFetch(pSdb, SDB_USER, pIter, (void **)&pUser);
806✔
3682
    if (pIter == NULL) break;
806✔
3683

3684
    if ((code = mndUserDupObj(pUser, &newUser)) != 0) {
412!
3685
      break;
×
3686
    }
3687

3688
    bool inRead = (taosHashGet(newUser.readViews, view, len) != NULL);
412✔
3689
    bool inWrite = (taosHashGet(newUser.writeViews, view, len) != NULL);
412✔
3690
    bool inAlter = (taosHashGet(newUser.alterViews, view, len) != NULL);
412✔
3691
    if (inRead || inWrite || inAlter) {
412!
3692
      code = taosHashRemove(newUser.readViews, view, len);
11✔
3693
      if (code < 0) {
11✔
3694
        mError("failed to remove readViews:%s from user:%s", view, pUser->user);
2!
3695
      }
3696
      code = taosHashRemove(newUser.writeViews, view, len);
11✔
3697
      if (code < 0) {
11✔
3698
        mError("failed to remove writeViews:%s from user:%s", view, pUser->user);
5!
3699
      }
3700
      code = taosHashRemove(newUser.alterViews, view, len);
11✔
3701
      if (code < 0) {
11✔
3702
        mError("failed to remove alterViews:%s from user:%s", view, pUser->user);
3!
3703
      }
3704

3705
      SSdbRaw *pCommitRaw = mndUserActionEncode(&newUser);
11✔
3706
      if (pCommitRaw == NULL || (code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
11!
3707
        code = TSDB_CODE_OUT_OF_MEMORY;
×
3708
        break;
×
3709
      }
3710
      code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY);
11✔
3711
      if (code < 0) {
11!
3712
        mndUserFreeObj(&newUser);
×
3713
        sdbRelease(pSdb, pUser);
×
3714
        TAOS_RETURN(code);
×
3715
      }
3716
    }
3717

3718
    mndUserFreeObj(&newUser);
412✔
3719
    sdbRelease(pSdb, pUser);
412✔
3720
  }
3721

3722
  if (pUser != NULL) sdbRelease(pSdb, pUser);
394!
3723
  if (pIter != NULL) sdbCancelFetch(pSdb, pIter);
394!
3724
  mndUserFreeObj(&newUser);
394✔
3725
  TAOS_RETURN(code);
394✔
3726
}
3727

3728
int32_t mndUserRemoveTopic(SMnode *pMnode, STrans *pTrans, char *topic) {
293✔
3729
  int32_t   code = 0;
293✔
3730
  SSdb     *pSdb = pMnode->pSdb;
293✔
3731
  int32_t   len = strlen(topic) + 1;
293✔
3732
  void     *pIter = NULL;
293✔
3733
  SUserObj *pUser = NULL;
293✔
3734
  SUserObj  newUser = {0};
293✔
3735

3736
  while (1) {
331✔
3737
    pIter = sdbFetch(pSdb, SDB_USER, pIter, (void **)&pUser);
624✔
3738
    if (pIter == NULL) {
624✔
3739
      break;
293✔
3740
    }
3741

3742
    if ((code = mndUserDupObj(pUser, &newUser)) != 0) {
331!
3743
      break;
×
3744
    }
3745

3746
    bool inTopic = (taosHashGet(newUser.topics, topic, len) != NULL);
331✔
3747
    if (inTopic) {
331✔
3748
      code = taosHashRemove(newUser.topics, topic, len);
1✔
3749
      if (code < 0) {
1!
3750
        mError("failed to remove topic:%s from user:%s", topic, pUser->user);
×
3751
      }
3752
      SSdbRaw *pCommitRaw = mndUserActionEncode(&newUser);
1✔
3753
      if (pCommitRaw == NULL || (code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
1!
3754
        code = TSDB_CODE_OUT_OF_MEMORY;
×
3755
        break;
×
3756
      }
3757
      code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY);
1✔
3758
      if (code < 0) {
1!
3759
        mndUserFreeObj(&newUser);
×
3760
        sdbRelease(pSdb, pUser);
×
3761
        TAOS_RETURN(code);
×
3762
      }
3763
    }
3764

3765
    mndUserFreeObj(&newUser);
331✔
3766
    sdbRelease(pSdb, pUser);
331✔
3767
  }
3768

3769
  if (pUser != NULL) sdbRelease(pSdb, pUser);
293!
3770
  if (pIter != NULL) sdbCancelFetch(pSdb, pIter);
293!
3771
  mndUserFreeObj(&newUser);
293✔
3772
  TAOS_RETURN(code);
293✔
3773
}
3774

3775
int64_t mndGetUserIpWhiteListVer(SMnode *pMnode, SUserObj *pUser) {
×
3776
  // ver = 0, disable ip white list
3777
  // ver > 0, enable ip white list
3778
  return tsEnableWhiteList ? pUser->ipWhiteListVer : 0;
×
3779
}
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