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

taosdata / TDengine / #3541

26 Nov 2024 03:56AM UTC coverage: 60.776% (-0.07%) from 60.846%
#3541

push

travis-ci

web-flow
Merge pull request #28920 from taosdata/fix/TD-33008-3.0

fix(query)[TD-33008]. fix error handling in tsdbCacheRead

120076 of 252763 branches covered (47.51%)

Branch coverage included in aggregate %.

0 of 2 new or added lines in 1 file covered. (0.0%)

1395 existing lines in 154 files now uncovered.

200995 of 275526 relevant lines covered (72.95%)

19612328.37 hits per line

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

65.13
/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
#include <uv.h>
19
#include "mndUser.h"
20
#include "audit.h"
21
#include "mndDb.h"
22
#include "mndPrivilege.h"
23
#include "mndShow.h"
24
#include "mndStb.h"
25
#include "mndTopic.h"
26
#include "mndTrans.h"
27
#include "tbase64.h"
28

29
// clang-format on
30

31
#define USER_VER_NUMBER   6
32
#define USER_RESERVE_SIZE 64
33

34
#define BIT_FLAG_MASK(n)              (1 << n)
35
#define BIT_FLAG_SET_MASK(val, mask)  ((val) |= (mask))
36
#define BIT_FLAG_TEST_MASK(val, mask) (((val) & (mask)) != 0)
37

38
#define PRIVILEGE_TYPE_ALL       BIT_FLAG_MASK(0)
39
#define PRIVILEGE_TYPE_READ      BIT_FLAG_MASK(1)
40
#define PRIVILEGE_TYPE_WRITE     BIT_FLAG_MASK(2)
41
#define PRIVILEGE_TYPE_SUBSCRIBE BIT_FLAG_MASK(3)
42
#define PRIVILEGE_TYPE_ALTER     BIT_FLAG_MASK(4)
43

44
#define ALTER_USER_ADD_PRIVS(_type) ((_type) == TSDB_ALTER_USER_ADD_PRIVILEGES)
45
#define ALTER_USER_DEL_PRIVS(_type) ((_type) == TSDB_ALTER_USER_DEL_PRIVILEGES)
46

47
#define ALTER_USER_ALL_PRIV(_priv) (BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_ALL))
48
#define ALTER_USER_READ_PRIV(_priv) \
49
  (BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_READ) || BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_ALL))
50
#define ALTER_USER_WRITE_PRIV(_priv) \
51
  (BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_WRITE) || BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_ALL))
52
#define ALTER_USER_ALTER_PRIV(_priv) \
53
  (BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_ALTER) || BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_ALL))
54
#define ALTER_USER_SUBSCRIBE_PRIV(_priv) (BIT_FLAG_TEST_MASK((_priv), PRIVILEGE_TYPE_SUBSCRIBE))
55

56
#define ALTER_USER_TARGET_DB(_tbname) (0 == (_tbname)[0])
57
#define ALTER_USER_TARGET_TB(_tbname) (0 != (_tbname)[0])
58

59
#define ALTER_USER_ADD_READ_DB_PRIV(_type, _priv, _tbname) \
60
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_READ_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
61
#define ALTER_USER_DEL_READ_DB_PRIV(_type, _priv, _tbname) \
62
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_READ_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
63
#define ALTER_USER_ADD_WRITE_DB_PRIV(_type, _priv, _tbname) \
64
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_WRITE_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
65
#define ALTER_USER_DEL_WRITE_DB_PRIV(_type, _priv, _tbname) \
66
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_WRITE_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
67
#define ALTER_USER_ADD_ALTER_DB_PRIV(_type, _priv, _tbname) \
68
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_ALTER_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
69
#define ALTER_USER_DEL_ALTER_DB_PRIV(_type, _priv, _tbname) \
70
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_ALTER_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
71
#define ALTER_USER_ADD_ALL_DB_PRIV(_type, _priv, _tbname) \
72
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_ALL_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
73
#define ALTER_USER_DEL_ALL_DB_PRIV(_type, _priv, _tbname) \
74
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_ALL_PRIV(_priv) && ALTER_USER_TARGET_DB(_tbname))
75

76
#define ALTER_USER_ADD_READ_TB_PRIV(_type, _priv, _tbname) \
77
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_READ_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
78
#define ALTER_USER_DEL_READ_TB_PRIV(_type, _priv, _tbname) \
79
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_READ_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
80
#define ALTER_USER_ADD_WRITE_TB_PRIV(_type, _priv, _tbname) \
81
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_WRITE_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
82
#define ALTER_USER_DEL_WRITE_TB_PRIV(_type, _priv, _tbname) \
83
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_WRITE_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
84
#define ALTER_USER_ADD_ALTER_TB_PRIV(_type, _priv, _tbname) \
85
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_ALTER_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
86
#define ALTER_USER_DEL_ALTER_TB_PRIV(_type, _priv, _tbname) \
87
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_ALTER_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
88
#define ALTER_USER_ADD_ALL_TB_PRIV(_type, _priv, _tbname) \
89
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_ALL_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
90
#define ALTER_USER_DEL_ALL_TB_PRIV(_type, _priv, _tbname) \
91
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_ALL_PRIV(_priv) && ALTER_USER_TARGET_TB(_tbname))
92

93
#define ALTER_USER_ADD_SUBSCRIBE_TOPIC_PRIV(_type, _priv) \
94
  (ALTER_USER_ADD_PRIVS(_type) && ALTER_USER_SUBSCRIBE_PRIV(_priv))
95
#define ALTER_USER_DEL_SUBSCRIBE_TOPIC_PRIV(_type, _priv) \
96
  (ALTER_USER_DEL_PRIVS(_type) && ALTER_USER_SUBSCRIBE_PRIV(_priv))
97

98
static int32_t createDefaultIpWhiteList(SIpWhiteList **ppWhiteList);
99
static int32_t createIpWhiteList(void *buf, int32_t len, SIpWhiteList **ppWhiteList);
100
static bool    updateIpWhiteList(SIpWhiteList *pOld, SIpWhiteList *pNew);
101
static bool    isIpWhiteListEqual(SIpWhiteList *a, SIpWhiteList *b);
102
static bool    isIpRangeEqual(SIpV4Range *a, SIpV4Range *b);
103

104
void destroyIpWhiteTab(SHashObj *pIpWhiteTab);
105

106
#define MND_MAX_USE_HOST (TSDB_PRIVILEDGE_HOST_LEN / 24)
107

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

128
static int32_t ipWhiteMgtUpdateAll(SMnode *pMnode);
129
typedef struct {
130
  SHashObj      *pIpWhiteTab;
131
  int64_t        ver;
132
  TdThreadRwlock rw;
133
} SIpWhiteMgt;
134

135
static SIpWhiteMgt ipWhiteMgt;
136

137
const static SIpV4Range defaultIpRange = {.ip = 16777343, .mask = 32};
138

139
static int32_t ipWhiteMgtInit() {
1,996✔
140
  ipWhiteMgt.pIpWhiteTab = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), 1, HASH_ENTRY_LOCK);
1,996✔
141
  if (ipWhiteMgt.pIpWhiteTab == NULL) {
1,996!
142
    TAOS_RETURN(terrno);
×
143
  }
144
  ipWhiteMgt.ver = 0;
1,996✔
145
  (void)taosThreadRwlockInit(&ipWhiteMgt.rw, NULL);
1,996✔
146
  TAOS_RETURN(0);
1,996✔
147
}
148
void ipWhiteMgtCleanup() {
1,995✔
149
  destroyIpWhiteTab(ipWhiteMgt.pIpWhiteTab);
1,995✔
150
  (void)taosThreadRwlockDestroy(&ipWhiteMgt.rw);
1,995✔
151
}
1,995✔
152

153
int32_t ipWhiteMgtUpdate(SMnode *pMnode, char *user, SIpWhiteList *pNew) {
1,281✔
154
  int32_t code = 0;
1,281✔
155
  int32_t lino = 0;
1,281✔
156
  bool    update = true;
1,281✔
157
  SArray *fqdns = NULL;
1,281✔
158
  (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
1,281✔
159
  SIpWhiteList **ppList = taosHashGet(ipWhiteMgt.pIpWhiteTab, user, strlen(user));
1,281✔
160

161
  if (ppList == NULL || *ppList == NULL) {
1,419!
162
    SIpWhiteList *p = cloneIpWhiteList(pNew);
138✔
163
    if (p == NULL) {
138!
164
      update = false;
×
165
      TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
166
    }
167
    if ((code = taosHashPut(ipWhiteMgt.pIpWhiteTab, user, strlen(user), &p, sizeof(void *))) != 0) {
138!
168
      update = false;
×
169
      taosMemoryFree(p);
×
170
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
171
    }
172
  } else {
173
    SIpWhiteList *pOld = *ppList;
1,143✔
174
    if (isIpWhiteListEqual(pOld, pNew)) {
1,143✔
175
      update = false;
1,119✔
176
    } else {
177
      taosMemoryFree(pOld);
24✔
178
      SIpWhiteList *p = cloneIpWhiteList(pNew);
24✔
179
      if (p == NULL) {
24!
180
        update = false;
×
181
        TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
182
      }
183
      if ((code = taosHashPut(ipWhiteMgt.pIpWhiteTab, user, strlen(user), &p, sizeof(void *))) != 0) {
24!
184
        update = false;
×
185
        taosMemoryFree(p);
×
186
        TAOS_CHECK_GOTO(code, &lino, _OVER);
×
187
      }
188
    }
189
  }
190

191
  fqdns = mndGetAllDnodeFqdns(pMnode);  // TODO: update this line after refactor api
1,281✔
192
  if (fqdns == NULL) {
1,281!
193
    update = false;
×
194
    TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
195
  }
196

197
  for (int i = 0; i < taosArrayGetSize(fqdns); i++) {
2,792✔
198
    char *fqdn = taosArrayGetP(fqdns, i);
1,511✔
199
    bool  upd = false;
1,511✔
200
    TAOS_CHECK_GOTO(mndUpdateIpWhiteImpl(ipWhiteMgt.pIpWhiteTab, TSDB_DEFAULT_USER, fqdn, IP_WHITE_ADD, &upd), &lino,
1,511!
201
                    _OVER);
202
    update |= upd;
1,511✔
203
    TAOS_CHECK_GOTO(mndUpdateIpWhiteImpl(ipWhiteMgt.pIpWhiteTab, user, fqdn, IP_WHITE_ADD, &upd), &lino, _OVER);
1,511!
204
    update |= upd;
1,511✔
205
  }
206

207
  // for (int i = 0; i < taosArrayGetSize(pUserNames); i++) {
208
  //   taosMemoryFree(taosArrayGetP(pUserNames, i));
209
  // }
210
  // taosArrayDestroy(pUserNames);
211

212
  if (update) ipWhiteMgt.ver++;
1,281✔
213

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

237
  if (update) ipWhiteMgt.ver++;
53!
238
  (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
53✔
239
  return 0;
53✔
240
}
241

242
bool isRangeInWhiteList(SIpWhiteList *pList, SIpV4Range *range) {
7,084✔
243
  for (int i = 0; i < pList->num; i++) {
8,672✔
244
    if (isIpRangeEqual(&pList->pIpRange[i], range)) {
8,371✔
245
      return true;
6,783✔
246
    }
247
  }
248
  return false;
301✔
249
}
250
#if 0
251
int32_t ipWhiteUpdateForAllUser(SIpWhiteList *pList) {
252
  (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
253

254
  SHashObj *pIpWhiteTab = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), 1, HASH_ENTRY_LOCK);
255
  void     *pIter = taosHashIterate(ipWhiteMgt.pIpWhiteTab, NULL);
256

257
  while (pIter) {
258
    SIpWhiteList *p = *(SIpWhiteList **)pIter;
259
    SIpWhiteList *clone = cloneIpWhiteList(pList);
260
    int32_t       idx = 0;
261
    for (int i = 0; i < pList->num; i++) {
262
      SIpV4Range *e = &pList->pIpRange[i];
263
      if (!isRangeInWhiteList(p, e)) {
264
        clone->pIpRange[idx] = *e;
265
        idx++;
266
      }
267
    }
268
    clone->num = idx;
269

270
    SIpWhiteList *val = NULL;
271
    if (clone->num != 0) {
272
      int32_t sz = clone->num + p->num;
273
      val = taosMemoryCalloc(1, sizeof(SIpWhiteList) + sz * sizeof(SIpV4Range));
274
      (void)memcpy(val->pIpRange, p->pIpRange, sizeof(SIpV4Range) * p->num);
275
      (void)memcpy(((char *)val->pIpRange) + sizeof(SIpV4Range) * p->num, (char *)clone->pIpRange,
276
             sizeof(SIpV4Range) * clone->num);
277

278
    } else {
279
      val = cloneIpWhiteList(p);
280
    }
281
    taosMemoryFree(clone);
282

283
    size_t klen;
284
    void  *key = taosHashGetKey(pIter, &klen);
285
    taosHashPut(pIpWhiteTab, key, klen, val, sizeof(void *));
286
  }
287

288
  destroyIpWhiteTab(ipWhiteMgt.pIpWhiteTab);
289

290
  ipWhiteMgt.pIpWhiteTab = pIpWhiteTab;
291
  ipWhiteMgt.ver++;
292
  (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
293
  return 0;
294
}
295
#endif
296

297
static int32_t ipWhiteMgtUpdateAll(SMnode *pMnode) {
2,040✔
298
  SHashObj *pNew = NULL;
2,040✔
299
  TAOS_CHECK_RETURN(mndFetchAllIpWhite(pMnode, &pNew));
2,040!
300

301
  SHashObj *pOld = ipWhiteMgt.pIpWhiteTab;
2,040✔
302

303
  ipWhiteMgt.pIpWhiteTab = pNew;
2,040✔
304
  ipWhiteMgt.ver++;
2,040✔
305

306
  destroyIpWhiteTab(pOld);
2,040✔
307
  TAOS_RETURN(0);
2,040✔
308
}
309

310
#if 0
311
void ipWhiteMgtUpdate2(SMnode *pMnode) {
312
  (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
313

314
  ipWhiteMgtUpdateAll(pMnode);
315

316
  (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
317
}
318
#endif
319

320
int64_t mndGetIpWhiteVer(SMnode *pMnode) {
103,058✔
321
  int64_t ver = 0;
103,058✔
322
  int32_t code = 0;
103,058✔
323
  (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
103,058✔
324
  if (ipWhiteMgt.ver == 0) {
103,058!
325
    // get user and dnode ip white list
326
    if ((code = ipWhiteMgtUpdateAll(pMnode)) != 0) {
×
327
      (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
×
328
      mError("%s failed to update ip white list since %s", __func__, tstrerror(code));
×
329
      return ver;
×
330
    }
331
    ipWhiteMgt.ver = taosGetTimestampMs();
×
332
  }
333
  ver = ipWhiteMgt.ver;
103,058✔
334
  (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
103,058✔
335

336
  if (mndEnableIpWhiteList(pMnode) == 0 || tsEnableWhiteList == false) {
103,058!
337
    ver = 0;
103,057✔
338
  }
339
  mDebug("ip-white-list on mnode ver: %" PRId64 "", ver);
103,058✔
340
  return ver;
103,058✔
341
}
342

343
int32_t mndUpdateIpWhiteImpl(SHashObj *pIpWhiteTab, char *user, char *fqdn, int8_t type, bool *pUpdate) {
8,573✔
344
  int32_t    lino = 0;
8,573✔
345
  bool       update = false;
8,573✔
346
  SIpV4Range range = {.ip = 0, .mask = 32};
8,573✔
347
  int32_t    code = taosGetIpv4FromFqdn(fqdn, &range.ip);
8,573✔
348
  if (code) {
8,573!
349
    mError("failed to get ip from fqdn: %s at line %d since %s", fqdn, lino, tstrerror(code));
×
350
    TAOS_RETURN(TSDB_CODE_TSC_INVALID_FQDN);
×
351
  }
352
  mDebug("ip-white-list may update for user: %s, fqdn: %s", user, fqdn);
8,573✔
353
  SIpWhiteList **ppList = taosHashGet(pIpWhiteTab, user, strlen(user));
8,573✔
354
  SIpWhiteList  *pList = NULL;
8,573✔
355
  if (ppList != NULL && *ppList != NULL) {
8,573!
356
    pList = *ppList;
7,084✔
357
  }
358

359
  if (type == IP_WHITE_ADD) {
8,573✔
360
    if (pList == NULL) {
8,553✔
361
      SIpWhiteList *pNewList = taosMemoryCalloc(1, sizeof(SIpWhiteList) + sizeof(SIpV4Range));
1,487✔
362
      if (pNewList == NULL) {
1,487!
363
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
364
      }
365
      (void)memcpy(pNewList->pIpRange, &range, sizeof(SIpV4Range));
1,487✔
366
      pNewList->num = 1;
1,487✔
367

368
      if ((code = taosHashPut(pIpWhiteTab, user, strlen(user), &pNewList, sizeof(void *))) != 0) {
1,487!
369
        taosMemoryFree(pNewList);
×
370
        TAOS_CHECK_GOTO(code, &lino, _OVER);
×
371
      }
372
      update = true;
1,487✔
373
    } else {
374
      if (!isRangeInWhiteList(pList, &range)) {
7,066✔
375
        int32_t       sz = sizeof(SIpWhiteList) + sizeof(SIpV4Range) * (pList->num + 1);
301✔
376
        SIpWhiteList *pNewList = taosMemoryCalloc(1, sz);
301✔
377
        if (pNewList == NULL) {
301!
378
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
379
        }
380
        (void)memcpy(pNewList->pIpRange, pList->pIpRange, sizeof(SIpV4Range) * (pList->num));
301✔
381
        pNewList->pIpRange[pList->num].ip = range.ip;
301✔
382
        pNewList->pIpRange[pList->num].mask = range.mask;
301✔
383

384
        pNewList->num = pList->num + 1;
301✔
385

386
        if ((code = taosHashPut(pIpWhiteTab, user, strlen(user), &pNewList, sizeof(void *))) != 0) {
301!
387
          taosMemoryFree(pNewList);
×
388
          TAOS_CHECK_GOTO(code, &lino, _OVER);
×
389
        }
390
        taosMemoryFree(pList);
301✔
391
        update = true;
301✔
392
      }
393
    }
394
  } else if (type == IP_WHITE_DROP) {
20!
395
    if (pList != NULL) {
20✔
396
      if (isRangeInWhiteList(pList, &range)) {
18!
397
        if (pList->num == 1) {
18!
398
          if (taosHashRemove(pIpWhiteTab, user, strlen(user)) < 0) {
18!
399
            mError("failed to remove ip-white-list for user: %s at line %d", user, lino);
×
400
          }
401
          taosMemoryFree(pList);
18✔
402
        } else {
403
          int32_t       idx = 0;
×
404
          int32_t       sz = sizeof(SIpWhiteList) + sizeof(SIpV4Range) * (pList->num - 1);
×
405
          SIpWhiteList *pNewList = taosMemoryCalloc(1, sz);
×
406
          if (pNewList == NULL) {
×
407
            TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
408
          }
409
          for (int i = 0; i < pList->num; i++) {
×
410
            SIpV4Range *e = &pList->pIpRange[i];
×
411
            if (!isIpRangeEqual(e, &range)) {
×
412
              pNewList->pIpRange[idx].ip = e->ip;
×
413
              pNewList->pIpRange[idx].mask = e->mask;
×
414
              idx++;
×
415
            }
416
          }
417
          pNewList->num = idx;
×
418
          if ((code = taosHashPut(pIpWhiteTab, user, strlen(user), &pNewList, sizeof(void *)) != 0)) {
×
419
            taosMemoryFree(pNewList);
×
420
            TAOS_CHECK_GOTO(code, &lino, _OVER);
×
421
          }
422
          taosMemoryFree(pList);
×
423
        }
424
        update = true;
18✔
425
      }
426
    }
427
  }
428
  if (update) {
8,573✔
429
    mDebug("ip-white-list update for user: %s, fqdn: %s", user, fqdn);
1,806✔
430
  }
431

432
_OVER:
6,840✔
433
  if (pUpdate) *pUpdate = update;
8,573✔
434
  if (code < 0) {
8,573!
435
    mError("failed to update ip-white-list for user: %s, fqdn: %s at line %d since %s", user, fqdn, lino,
×
436
           tstrerror(code));
437
  }
438
  TAOS_RETURN(code);
8,573✔
439
}
440

441
int32_t mndRefreshUserIpWhiteList(SMnode *pMnode) {
2,040✔
442
  int32_t code = 0;
2,040✔
443
  (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
2,040✔
444

445
  if ((code = ipWhiteMgtUpdateAll(pMnode)) != 0) {
2,040!
446
    (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
×
447
    TAOS_RETURN(code);
×
448
  }
449
  ipWhiteMgt.ver = taosGetTimestampMs();
2,040✔
450
  (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
2,040✔
451

452
  TAOS_RETURN(code);
2,040✔
453
}
454

455
int32_t mndUpdateIpWhiteForAllUser(SMnode *pMnode, char *user, char *fqdn, int8_t type, int8_t lock) {
1,966✔
456
  int32_t code = 0;
1,966✔
457
  int32_t lino = 0;
1,966✔
458
  bool    update = false;
1,966✔
459

460
  if (lock) {
1,966!
461
    (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
1,966✔
462
    if (ipWhiteMgt.ver == 0) {
1,966!
463
      TAOS_CHECK_GOTO(ipWhiteMgtUpdateAll(pMnode), &lino, _OVER);
×
464
      ipWhiteMgt.ver = taosGetTimestampMs();
×
465
      mInfo("update ip-white-list, user: %s, ver: %" PRId64, user, ipWhiteMgt.ver);
×
466
    }
467
  }
468

469
  TAOS_CHECK_GOTO(mndUpdateIpWhiteImpl(ipWhiteMgt.pIpWhiteTab, user, fqdn, type, &update), &lino, _OVER);
1,966!
470

471
  void *pIter = taosHashIterate(ipWhiteMgt.pIpWhiteTab, NULL);
1,966✔
472
  while (pIter) {
3,938✔
473
    size_t klen = 0;
1,972✔
474
    char  *key = taosHashGetKey(pIter, &klen);
1,972✔
475

476
    char *keyDup = taosMemoryCalloc(1, klen + 1);
1,972✔
477
    if (keyDup == NULL) {
1,972!
478
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
479
    }
480
    (void)memcpy(keyDup, key, klen);
1,972✔
481
    bool upd = false;
1,972✔
482
    code = mndUpdateIpWhiteImpl(ipWhiteMgt.pIpWhiteTab, keyDup, fqdn, type, &upd);
1,972✔
483
    update |= upd;
1,972✔
484
    if (code < 0) {
1,972!
485
      taosMemoryFree(keyDup);
×
486
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
487
    }
488
    taosMemoryFree(keyDup);
1,972✔
489

490
    pIter = taosHashIterate(ipWhiteMgt.pIpWhiteTab, pIter);
1,972✔
491
  }
492

493
_OVER:
1,966✔
494
  if (update) ipWhiteMgt.ver++;
1,966✔
495
  if (lock) (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
1,966!
496
  if (code < 0) {
1,966!
497
    mError("failed to update ip-white-list for user: %s, fqdn: %s at line %d since %s", user, fqdn, lino,
×
498
           tstrerror(code));
499
  }
500

501
  TAOS_RETURN(code);
1,966✔
502
}
503

504
static int64_t ipWhiteMgtFillMsg(SUpdateIpWhite *pUpdate) {
1✔
505
  int64_t ver = 0;
1✔
506
  (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
1✔
507
  ver = ipWhiteMgt.ver;
1✔
508
  int32_t num = taosHashGetSize(ipWhiteMgt.pIpWhiteTab);
1✔
509

510
  pUpdate->pUserIpWhite = taosMemoryCalloc(1, num * sizeof(SUpdateUserIpWhite));
1✔
511
  if (pUpdate->pUserIpWhite == NULL) {
1!
512
    (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
×
513
    TAOS_RETURN(terrno);
×
514
  }
515

516
  void   *pIter = taosHashIterate(ipWhiteMgt.pIpWhiteTab, NULL);
1✔
517
  int32_t i = 0;
1✔
518
  while (pIter) {
2✔
519
    SUpdateUserIpWhite *pUser = &pUpdate->pUserIpWhite[i];
1✔
520
    SIpWhiteList       *list = *(SIpWhiteList **)pIter;
1✔
521

522
    size_t klen;
523
    char  *key = taosHashGetKey(pIter, &klen);
1✔
524
    if (list->num != 0) {
1!
525
      pUser->ver = ver;
1✔
526
      (void)memcpy(pUser->user, key, klen);
1✔
527
      pUser->numOfRange = list->num;
1✔
528
      pUser->pIpRanges = taosMemoryCalloc(1, list->num * sizeof(SIpV4Range));
1✔
529
      if (pUser->pIpRanges == NULL) {
1!
530
        (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
×
531
        TAOS_RETURN(terrno);
×
532
      }
533
      (void)memcpy(pUser->pIpRanges, list->pIpRange, list->num * sizeof(SIpV4Range));
1✔
534
      i++;
1✔
535
    }
536
    pIter = taosHashIterate(ipWhiteMgt.pIpWhiteTab, pIter);
1✔
537
  }
538
  pUpdate->numOfUser = i;
1✔
539
  pUpdate->ver = ver;
1✔
540

541
  (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
1✔
542
  TAOS_RETURN(0);
1✔
543
}
544

545
void destroyIpWhiteTab(SHashObj *pIpWhiteTab) {
4,035✔
546
  if (pIpWhiteTab == NULL) return;
4,035!
547

548
  void *pIter = taosHashIterate(pIpWhiteTab, NULL);
4,035✔
549
  while (pIter) {
6,077✔
550
    SIpWhiteList *list = *(SIpWhiteList **)pIter;
2,042✔
551
    taosMemoryFree(list);
2,042✔
552
    pIter = taosHashIterate(pIpWhiteTab, pIter);
2,042✔
553
  }
554

555
  taosHashCleanup(pIpWhiteTab);
4,035✔
556
}
557
int32_t mndFetchAllIpWhite(SMnode *pMnode, SHashObj **ppIpWhiteTab) {
2,040✔
558
  int32_t   code = 0;
2,040✔
559
  int32_t   lino = 0;
2,040✔
560
  SSdb     *pSdb = pMnode->pSdb;
2,040✔
561
  void     *pIter = NULL;
2,040✔
562
  SHashObj *pIpWhiteTab = NULL;
2,040✔
563
  SArray   *pUserNames = NULL;
2,040✔
564
  SArray   *fqdns = NULL;
2,040✔
565

566
  pIpWhiteTab = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), 1, HASH_ENTRY_LOCK);
2,040✔
567
  if (pIpWhiteTab == NULL) {
2,040!
568
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
569
  }
570
  pUserNames = taosArrayInit(8, sizeof(void *));
2,040✔
571
  if (pUserNames == NULL) {
2,040!
572
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
573
  }
574

575
  while (1) {
488✔
576
    SUserObj *pUser = NULL;
2,528✔
577
    pIter = sdbFetch(pSdb, SDB_USER, pIter, (void **)&pUser);
2,528✔
578
    if (pIter == NULL) break;
2,528✔
579

580
    SIpWhiteList *pWhiteList = cloneIpWhiteList(pUser->pIpWhiteList);
488✔
581
    if (pWhiteList == NULL) {
488!
582
      sdbRelease(pSdb, pUser);
×
583
      sdbCancelFetch(pSdb, pIter);
×
584
      TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
585
    }
586
    if ((code = taosHashPut(pIpWhiteTab, pUser->user, strlen(pUser->user), &pWhiteList, sizeof(void *))) != 0) {
488!
587
      taosMemoryFree(pWhiteList);
×
588
      sdbRelease(pSdb, pUser);
×
589
      sdbCancelFetch(pSdb, pIter);
×
590
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
591
    }
592

593
    char *name = taosStrdup(pUser->user);
488✔
594
    if (name == NULL) {
488!
595
      sdbRelease(pSdb, pUser);
×
596
      sdbCancelFetch(pSdb, pIter);
×
597
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
598
    }
599
    if (taosArrayPush(pUserNames, &name) == NULL) {
488!
600
      taosMemoryFree(name);
×
601
      sdbRelease(pSdb, pUser);
×
602
      sdbCancelFetch(pSdb, pIter);
×
603
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
604
    }
605

606
    sdbRelease(pSdb, pUser);
488✔
607
  }
608

609
  bool found = false;
2,040✔
610
  for (int i = 0; i < taosArrayGetSize(pUserNames); i++) {
2,061✔
611
    char *name = taosArrayGetP(pUserNames, i);
487✔
612
    if (strlen(name) == strlen(TSDB_DEFAULT_USER) && strncmp(name, TSDB_DEFAULT_USER, strlen(TSDB_DEFAULT_USER)) == 0) {
487!
613
      found = true;
466✔
614
      break;
466✔
615
    }
616
  }
617
  if (found == false) {
2,040✔
618
    char *name = taosStrdup(TSDB_DEFAULT_USER);
1,574✔
619
    if (name == NULL) {
1,574!
620
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
621
    }
622
    if (taosArrayPush(pUserNames, &name) == NULL) {
1,574!
623
      taosMemoryFree(name);
×
624
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
625
    }
626
  }
627

628
  fqdns = mndGetAllDnodeFqdns(pMnode);  // TODO: refactor this line after refactor api
2,040✔
629
  if (fqdns == NULL) {
2,040!
630
    TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
631
  }
632

633
  for (int i = 0; i < taosArrayGetSize(fqdns); i++) {
3,565✔
634
    char *fqdn = taosArrayGetP(fqdns, i);
1,525✔
635

636
    for (int j = 0; j < taosArrayGetSize(pUserNames); j++) {
3,138✔
637
      char *name = taosArrayGetP(pUserNames, j);
1,613✔
638
      TAOS_CHECK_GOTO(mndUpdateIpWhiteImpl(pIpWhiteTab, name, fqdn, IP_WHITE_ADD, NULL), &lino, _OVER);
1,613!
639
    }
640
  }
641

642
_OVER:
2,040✔
643
  taosArrayDestroyP(fqdns, taosMemoryFree);
2,040✔
644
  taosArrayDestroyP(pUserNames, taosMemoryFree);
2,040✔
645

646
  if (code < 0) {
2,040!
647
    mError("failed to fetch all ip white list at line %d since %s", lino, tstrerror(code));
×
648
    destroyIpWhiteTab(pIpWhiteTab);
×
649
    pIpWhiteTab = NULL;
×
650
  }
651
  *ppIpWhiteTab = pIpWhiteTab;
2,040✔
652
  TAOS_RETURN(code);
2,040✔
653
}
654

655
int32_t mndInitUser(SMnode *pMnode) {
1,996✔
656
  TAOS_CHECK_RETURN(ipWhiteMgtInit());
1,996!
657

658
  SSdbTable table = {
1,996✔
659
      .sdbType = SDB_USER,
660
      .keyType = SDB_KEY_BINARY,
661
      .deployFp = (SdbDeployFp)mndCreateDefaultUsers,
662
      .encodeFp = (SdbEncodeFp)mndUserActionEncode,
663
      .decodeFp = (SdbDecodeFp)mndUserActionDecode,
664
      .insertFp = (SdbInsertFp)mndUserActionInsert,
665
      .updateFp = (SdbUpdateFp)mndUserActionUpdate,
666
      .deleteFp = (SdbDeleteFp)mndUserActionDelete,
667
  };
668

669
  mndSetMsgHandle(pMnode, TDMT_MND_CREATE_USER, mndProcessCreateUserReq);
1,996✔
670
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_USER, mndProcessAlterUserReq);
1,996✔
671
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_USER, mndProcessDropUserReq);
1,996✔
672
  mndSetMsgHandle(pMnode, TDMT_MND_GET_USER_AUTH, mndProcessGetUserAuthReq);
1,996✔
673
  mndSetMsgHandle(pMnode, TDMT_MND_GET_USER_WHITELIST, mndProcessGetUserWhiteListReq);
1,996✔
674

675
  mndSetMsgHandle(pMnode, TDMT_MND_RETRIEVE_IP_WHITE, mndProcesSRetrieveIpWhiteReq);
1,996✔
676

677
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_USER, mndRetrieveUsers);
1,996✔
678
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_USER, mndCancelGetNextUser);
1,996✔
679
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_USER_FULL, mndRetrieveUsersFull);
1,996✔
680
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_USER_FULL, mndCancelGetNextUser);
1,996✔
681
  mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_PRIVILEGES, mndRetrievePrivileges);
1,996✔
682
  mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_PRIVILEGES, mndCancelGetNextPrivileges);
1,996✔
683
  return sdbSetTable(pMnode->pSdb, table);
1,996✔
684
}
685

686
void mndCleanupUser(SMnode *pMnode) { ipWhiteMgtCleanup(); }
1,995✔
687

688
static void ipRangeToStr(SIpV4Range *range, char *buf) {
5,155✔
689
  struct in_addr addr;
690
  addr.s_addr = range->ip;
5,155✔
691

692
  (void)uv_inet_ntop(AF_INET, &addr, buf, 32);
5,155✔
693
  if (range->mask != 32) {
5,159✔
694
    (void)sprintf(buf + strlen(buf), "/%d", range->mask);
6✔
695
  }
696
  return;
5,159✔
697
}
698
static bool isDefaultRange(SIpV4Range *pRange) {
2✔
699
  static SIpV4Range val = {.ip = 16777343, .mask = 32};
700
  return pRange->ip == val.ip && pRange->mask == val.mask;
2!
701
}
702
static int32_t ipRangeListToStr(SIpV4Range *range, int32_t num, char *buf) {
5,151✔
703
  int32_t len = 0;
5,151✔
704
  for (int i = 0; i < num; i++) {
10,309✔
705
    char        tbuf[36] = {0};
5,157✔
706
    SIpV4Range *pRange = &range[i];
5,157✔
707

708
    ipRangeToStr(&range[i], tbuf);
5,157✔
709
    len += sprintf(buf + len, "%s,", tbuf);
5,158✔
710
  }
711
  if (len > 0) buf[len - 1] = 0;
5,152!
712
  return len;
5,152✔
713
}
714

715
static bool isIpRangeEqual(SIpV4Range *a, SIpV4Range *b) {
9,495✔
716
  // equal or not
717
  return a->ip == b->ip && a->mask == b->mask;
9,495!
718
}
719
static bool isRangeInIpWhiteList(SIpWhiteList *pList, SIpV4Range *tgt) {
1✔
720
  for (int i = 0; i < pList->num; i++) {
4✔
721
    if (isIpRangeEqual(&pList->pIpRange[i], tgt)) return true;
3!
722
  }
723
  return false;
1✔
724
}
725
static bool isIpWhiteListEqual(SIpWhiteList *a, SIpWhiteList *b) {
1,143✔
726
  if (a->num != b->num) {
1,143✔
727
    return false;
24✔
728
  }
729
  for (int i = 0; i < a->num; i++) {
2,238✔
730
    if (!isIpRangeEqual(&a->pIpRange[i], &b->pIpRange[i])) {
1,119!
731
      return false;
×
732
    }
733
  }
734
  return true;
1,119✔
735
}
736
int32_t convertIpWhiteListToStr(SIpWhiteList *pList, char **buf) {
5,147✔
737
  if (pList->num == 0) {
5,147!
738
    *buf = NULL;
×
739
    return 0;
×
740
  }
741
  *buf = taosMemoryCalloc(1, pList->num * 36);
5,147✔
742
  if (*buf == NULL) {
5,155!
743
    return 0;
×
744
  }
745
  int32_t len = ipRangeListToStr(pList->pIpRange, pList->num, *buf);
5,155✔
746
  if (len == 0) {
5,151!
747
    taosMemoryFreeClear(*buf);
×
748
    return 0;
×
749
  }
750
  return strlen(*buf);
5,151✔
751
}
752
int32_t tSerializeIpWhiteList(void *buf, int32_t len, SIpWhiteList *pList, uint32_t *pLen) {
6,431✔
753
  int32_t  code = 0;
6,431✔
754
  int32_t  lino = 0;
6,431✔
755
  int32_t  tlen = 0;
6,431✔
756
  SEncoder encoder = {0};
6,431✔
757
  tEncoderInit(&encoder, buf, len);
6,431✔
758

759
  TAOS_CHECK_GOTO(tStartEncode(&encoder), &lino, _OVER);
6,431!
760
  TAOS_CHECK_GOTO(tEncodeI32(&encoder, pList->num), &lino, _OVER);
12,862!
761

762
  for (int i = 0; i < pList->num; i++) {
12,872✔
763
    SIpV4Range *pRange = &(pList->pIpRange[i]);
6,441✔
764
    TAOS_CHECK_GOTO(tEncodeU32(&encoder, pRange->ip), &lino, _OVER);
12,882!
765
    TAOS_CHECK_GOTO(tEncodeU32(&encoder, pRange->mask), &lino, _OVER);
12,882!
766
  }
767

768
  tEndEncode(&encoder);
6,431✔
769

770
  tlen = encoder.pos;
6,431✔
771
_OVER:
6,431✔
772
  tEncoderClear(&encoder);
6,431✔
773
  if (code < 0) {
6,431!
774
    mError("failed to serialize ip white list at line %d since %s", lino, tstrerror(code));
×
775
  }
776
  if (pLen) *pLen = tlen;
6,431!
777
  TAOS_RETURN(code);
6,431✔
778
}
779

780
int32_t tDerializeIpWhileList(void *buf, int32_t len, SIpWhiteList *pList) {
3,519✔
781
  int32_t  code = 0;
3,519✔
782
  int32_t  lino = 0;
3,519✔
783
  SDecoder decoder = {0};
3,519✔
784
  tDecoderInit(&decoder, buf, len);
3,519✔
785

786
  TAOS_CHECK_GOTO(tStartDecode(&decoder), &lino, _OVER);
3,519!
787
  TAOS_CHECK_GOTO(tDecodeI32(&decoder, &pList->num), &lino, _OVER);
7,038!
788

789
  for (int i = 0; i < pList->num; i++) {
7,044✔
790
    SIpV4Range *pRange = &(pList->pIpRange[i]);
3,525✔
791
    TAOS_CHECK_GOTO(tDecodeU32(&decoder, &pRange->ip), &lino, _OVER);
7,050!
792
    TAOS_CHECK_GOTO(tDecodeU32(&decoder, &pRange->mask), &lino, _OVER);
7,050!
793
  }
794

795
_OVER:
3,519✔
796
  tEndDecode(&decoder);
3,519✔
797
  tDecoderClear(&decoder);
3,519✔
798
  if (code < 0) {
3,519!
799
    mError("failed to deserialize ip white list at line %d since %s", lino, tstrerror(code));
×
800
  }
801

802
  TAOS_RETURN(code);
3,519✔
803
}
804

805
static int32_t createIpWhiteList(void *buf, int32_t len, SIpWhiteList **ppList) {
3,519✔
806
  int32_t       code = 0;
3,519✔
807
  int32_t       lino = 0;
3,519✔
808
  int32_t       num = 0;
3,519✔
809
  SIpWhiteList *p = NULL;
3,519✔
810
  SDecoder      decoder = {0};
3,519✔
811
  tDecoderInit(&decoder, buf, len);
3,519✔
812

813
  TAOS_CHECK_GOTO(tStartDecode(&decoder), &lino, _OVER);
3,519!
814
  TAOS_CHECK_GOTO(tDecodeI32(&decoder, &num), &lino, _OVER);
3,519!
815

816
  p = taosMemoryCalloc(1, sizeof(SIpWhiteList) + num * sizeof(SIpV4Range));
3,519✔
817
  if (p == NULL) {
3,519!
818
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
819
  }
820
  TAOS_CHECK_GOTO(tDerializeIpWhileList(buf, len, p), &lino, _OVER);
3,519!
821

822
_OVER:
3,519✔
823
  tEndDecode(&decoder);
3,519✔
824
  tDecoderClear(&decoder);
3,519✔
825
  if (code < 0) {
3,519!
826
    taosMemoryFreeClear(p);
×
827
    mError("failed to create ip white list at line %d since %s", lino, tstrerror(code));
×
828
  }
829
  *ppList = p;
3,519✔
830
  TAOS_RETURN(code);
3,519✔
831
}
832

833
static int32_t createDefaultIpWhiteList(SIpWhiteList **ppWhiteList) {
1,617✔
834
  *ppWhiteList = taosMemoryCalloc(1, sizeof(SIpWhiteList) + sizeof(SIpV4Range) * 1);
1,617✔
835
  if (*ppWhiteList == NULL) {
1,617!
836
    TAOS_RETURN(terrno);
×
837
  }
838
  (*ppWhiteList)->num = 1;
1,617✔
839
  SIpV4Range *range = &((*ppWhiteList)->pIpRange[0]);
1,617✔
840

841
  struct in_addr addr;
842
  if (uv_inet_pton(AF_INET, "127.0.0.1", &addr) == 0) {
1,617!
843
    range->ip = addr.s_addr;
1,617✔
844
    range->mask = 32;
1,617✔
845
  }
846
  return 0;
1,617✔
847
}
848

849
static int32_t mndCreateDefaultUser(SMnode *pMnode, char *acct, char *user, char *pass) {
1,481✔
850
  int32_t  code = 0;
1,481✔
851
  int32_t  lino = 0;
1,481✔
852
  SUserObj userObj = {0};
1,481✔
853
  taosEncryptPass_c((uint8_t *)pass, strlen(pass), userObj.pass);
1,481✔
854
  tstrncpy(userObj.user, user, TSDB_USER_LEN);
1,481✔
855
  tstrncpy(userObj.acct, acct, TSDB_USER_LEN);
1,481✔
856
  userObj.createdTime = taosGetTimestampMs();
1,481✔
857
  userObj.updateTime = userObj.createdTime;
1,481✔
858
  userObj.sysInfo = 1;
1,481✔
859
  userObj.enable = 1;
1,481✔
860
  userObj.ipWhiteListVer = taosGetTimestampMs();
1,481✔
861
  TAOS_CHECK_RETURN(createDefaultIpWhiteList(&userObj.pIpWhiteList));
1,481!
862
  if (strcmp(user, TSDB_DEFAULT_USER) == 0) {
1,481!
863
    userObj.superUser = 1;
1,481✔
864
    userObj.createdb = 1;
1,481✔
865
  }
866

867
  SSdbRaw *pRaw = mndUserActionEncode(&userObj);
1,481✔
868
  if (pRaw == NULL) goto _ERROR;
1,481!
869
  TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_READY), &lino, _ERROR);
1,481!
870

871
  mInfo("user:%s, will be created when deploying, raw:%p", userObj.user, pRaw);
1,481!
872

873
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_NOTHING, NULL, "create-user");
1,481✔
874
  if (pTrans == NULL) {
1,481!
875
    sdbFreeRaw(pRaw);
×
876
    mError("user:%s, failed to create since %s", userObj.user, terrstr());
×
877
    goto _ERROR;
×
878
  }
879
  mInfo("trans:%d, used to create user:%s", pTrans->id, userObj.user);
1,481!
880

881
  if (mndTransAppendCommitlog(pTrans, pRaw) != 0) {
1,481!
882
    mError("trans:%d, failed to commit redo log since %s", pTrans->id, terrstr());
×
883
    mndTransDrop(pTrans);
×
884
    goto _ERROR;
×
885
  }
886
  TAOS_CHECK_GOTO(sdbSetRawStatus(pRaw, SDB_STATUS_READY), &lino, _ERROR);
1,481!
887

888
  if (mndTransPrepare(pMnode, pTrans) != 0) {
1,481!
889
    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
×
890
    mndTransDrop(pTrans);
×
891
    goto _ERROR;
×
892
  }
893

894
  mndTransDrop(pTrans);
1,481✔
895
  taosMemoryFree(userObj.pIpWhiteList);
1,481✔
896
  return 0;
1,481✔
897
_ERROR:
×
898
  taosMemoryFree(userObj.pIpWhiteList);
×
899
  TAOS_RETURN(terrno ? terrno : TSDB_CODE_APP_ERROR);
×
900
}
901

902
static int32_t mndCreateDefaultUsers(SMnode *pMnode) {
1,481✔
903
  return mndCreateDefaultUser(pMnode, TSDB_DEFAULT_USER, TSDB_DEFAULT_USER, TSDB_DEFAULT_PASS);
1,481✔
904
}
905

906
SSdbRaw *mndUserActionEncode(SUserObj *pUser) {
6,431✔
907
  int32_t code = 0;
6,431✔
908
  int32_t lino = 0;
6,431✔
909
  int32_t ipWhiteReserve =
×
910
      pUser->pIpWhiteList ? (sizeof(SIpV4Range) * pUser->pIpWhiteList->num + sizeof(SIpWhiteList) + 4) : 16;
6,431!
911
  int32_t numOfReadDbs = taosHashGetSize(pUser->readDbs);
6,431✔
912
  int32_t numOfWriteDbs = taosHashGetSize(pUser->writeDbs);
6,431✔
913
  int32_t numOfReadTbs = taosHashGetSize(pUser->readTbs);
6,431✔
914
  int32_t numOfWriteTbs = taosHashGetSize(pUser->writeTbs);
6,431✔
915
  int32_t numOfAlterTbs = taosHashGetSize(pUser->alterTbs);
6,431✔
916
  int32_t numOfReadViews = taosHashGetSize(pUser->readViews);
6,431✔
917
  int32_t numOfWriteViews = taosHashGetSize(pUser->writeViews);
6,431✔
918
  int32_t numOfAlterViews = taosHashGetSize(pUser->alterViews);
6,431✔
919
  int32_t numOfTopics = taosHashGetSize(pUser->topics);
6,431✔
920
  int32_t numOfUseDbs = taosHashGetSize(pUser->useDbs);
6,431✔
921
  int32_t size = sizeof(SUserObj) + USER_RESERVE_SIZE + (numOfReadDbs + numOfWriteDbs) * TSDB_DB_FNAME_LEN +
6,431✔
922
                 numOfTopics * TSDB_TOPIC_FNAME_LEN + ipWhiteReserve;
6,431✔
923
  char    *buf = NULL;
6,431✔
924
  SSdbRaw *pRaw = NULL;
6,431✔
925

926
  char *stb = taosHashIterate(pUser->readTbs, NULL);
6,431✔
927
  while (stb != NULL) {
169,861✔
928
    size_t keyLen = 0;
163,430✔
929
    void  *key = taosHashGetKey(stb, &keyLen);
163,430✔
930
    size += sizeof(int32_t);
163,430✔
931
    size += keyLen;
163,430✔
932

933
    size_t valueLen = 0;
163,430✔
934
    valueLen = strlen(stb) + 1;
163,430✔
935
    size += sizeof(int32_t);
163,430✔
936
    size += valueLen;
163,430✔
937
    stb = taosHashIterate(pUser->readTbs, stb);
163,430✔
938
  }
939

940
  stb = taosHashIterate(pUser->writeTbs, NULL);
6,431✔
941
  while (stb != NULL) {
169,460✔
942
    size_t keyLen = 0;
163,029✔
943
    void  *key = taosHashGetKey(stb, &keyLen);
163,029✔
944
    size += sizeof(int32_t);
163,029✔
945
    size += keyLen;
163,029✔
946

947
    size_t valueLen = 0;
163,029✔
948
    valueLen = strlen(stb) + 1;
163,029✔
949
    size += sizeof(int32_t);
163,029✔
950
    size += valueLen;
163,029✔
951
    stb = taosHashIterate(pUser->writeTbs, stb);
163,029✔
952
  }
953

954
  stb = taosHashIterate(pUser->alterTbs, NULL);
6,431✔
955
  while (stb != NULL) {
6,442✔
956
    size_t keyLen = 0;
11✔
957
    void  *key = taosHashGetKey(stb, &keyLen);
11✔
958
    size += sizeof(int32_t);
11✔
959
    size += keyLen;
11✔
960

961
    size_t valueLen = 0;
11✔
962
    valueLen = strlen(stb) + 1;
11✔
963
    size += sizeof(int32_t);
11✔
964
    size += valueLen;
11✔
965
    stb = taosHashIterate(pUser->alterTbs, stb);
11✔
966
  }
967

968
  stb = taosHashIterate(pUser->readViews, NULL);
6,431✔
969
  while (stb != NULL) {
6,494✔
970
    size_t keyLen = 0;
63✔
971
    void  *key = taosHashGetKey(stb, &keyLen);
63✔
972
    size += sizeof(int32_t);
63✔
973
    size += keyLen;
63✔
974

975
    size_t valueLen = 0;
63✔
976
    valueLen = strlen(stb) + 1;
63✔
977
    size += sizeof(int32_t);
63✔
978
    size += valueLen;
63✔
979
    stb = taosHashIterate(pUser->readViews, stb);
63✔
980
  }
981

982
  stb = taosHashIterate(pUser->writeViews, NULL);
6,431✔
983
  while (stb != NULL) {
6,481✔
984
    size_t keyLen = 0;
50✔
985
    void  *key = taosHashGetKey(stb, &keyLen);
50✔
986
    size += sizeof(int32_t);
50✔
987
    size += keyLen;
50✔
988

989
    size_t valueLen = 0;
50✔
990
    valueLen = strlen(stb) + 1;
50✔
991
    size += sizeof(int32_t);
50✔
992
    size += valueLen;
50✔
993
    stb = taosHashIterate(pUser->writeViews, stb);
50✔
994
  }
995

996
  stb = taosHashIterate(pUser->alterViews, NULL);
6,431✔
997
  while (stb != NULL) {
6,485✔
998
    size_t keyLen = 0;
54✔
999
    void  *key = taosHashGetKey(stb, &keyLen);
54✔
1000
    size += sizeof(int32_t);
54✔
1001
    size += keyLen;
54✔
1002

1003
    size_t valueLen = 0;
54✔
1004
    valueLen = strlen(stb) + 1;
54✔
1005
    size += sizeof(int32_t);
54✔
1006
    size += valueLen;
54✔
1007
    stb = taosHashIterate(pUser->alterViews, stb);
54✔
1008
  }
1009

1010
  int32_t *useDb = taosHashIterate(pUser->useDbs, NULL);
6,431✔
1011
  while (useDb != NULL) {
8,236✔
1012
    size_t keyLen = 0;
1,805✔
1013
    void  *key = taosHashGetKey(useDb, &keyLen);
1,805✔
1014
    size += sizeof(int32_t);
1,805✔
1015
    size += keyLen;
1,805✔
1016
    size += sizeof(int32_t);
1,805✔
1017
    useDb = taosHashIterate(pUser->useDbs, useDb);
1,805✔
1018
  }
1019

1020
  pRaw = sdbAllocRaw(SDB_USER, USER_VER_NUMBER, size);
6,431✔
1021
  if (pRaw == NULL) {
6,431!
1022
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1023
  }
1024

1025
  int32_t dataPos = 0;
6,431✔
1026
  SDB_SET_BINARY(pRaw, dataPos, pUser->user, TSDB_USER_LEN, _OVER)
6,431!
1027
  SDB_SET_BINARY(pRaw, dataPos, pUser->pass, TSDB_PASSWORD_LEN, _OVER)
6,431!
1028
  SDB_SET_BINARY(pRaw, dataPos, pUser->acct, TSDB_USER_LEN, _OVER)
6,431!
1029
  SDB_SET_INT64(pRaw, dataPos, pUser->createdTime, _OVER)
6,431!
1030
  SDB_SET_INT64(pRaw, dataPos, pUser->updateTime, _OVER)
6,431!
1031
  SDB_SET_INT8(pRaw, dataPos, pUser->superUser, _OVER)
6,431!
1032
  SDB_SET_INT8(pRaw, dataPos, pUser->sysInfo, _OVER)
6,431!
1033
  SDB_SET_INT8(pRaw, dataPos, pUser->enable, _OVER)
6,431!
1034
  SDB_SET_UINT8(pRaw, dataPos, pUser->flag, _OVER)
6,431!
1035
  SDB_SET_INT32(pRaw, dataPos, pUser->authVersion, _OVER)
6,431!
1036
  SDB_SET_INT32(pRaw, dataPos, pUser->passVersion, _OVER)
6,431!
1037
  SDB_SET_INT32(pRaw, dataPos, numOfReadDbs, _OVER)
6,431!
1038
  SDB_SET_INT32(pRaw, dataPos, numOfWriteDbs, _OVER)
6,431!
1039
  SDB_SET_INT32(pRaw, dataPos, numOfTopics, _OVER)
6,431!
1040

1041
  char *db = taosHashIterate(pUser->readDbs, NULL);
6,431✔
1042
  while (db != NULL) {
6,587✔
1043
    SDB_SET_BINARY(pRaw, dataPos, db, TSDB_DB_FNAME_LEN, _OVER);
156!
1044
    db = taosHashIterate(pUser->readDbs, db);
156✔
1045
  }
1046

1047
  db = taosHashIterate(pUser->writeDbs, NULL);
6,431✔
1048
  while (db != NULL) {
6,577✔
1049
    SDB_SET_BINARY(pRaw, dataPos, db, TSDB_DB_FNAME_LEN, _OVER);
146!
1050
    db = taosHashIterate(pUser->writeDbs, db);
146✔
1051
  }
1052

1053
  char *topic = taosHashIterate(pUser->topics, NULL);
6,431✔
1054
  while (topic != NULL) {
6,471✔
1055
    SDB_SET_BINARY(pRaw, dataPos, topic, TSDB_TOPIC_FNAME_LEN, _OVER);
40!
1056
    topic = taosHashIterate(pUser->topics, topic);
40✔
1057
  }
1058

1059
  SDB_SET_INT32(pRaw, dataPos, numOfReadTbs, _OVER)
6,431!
1060
  SDB_SET_INT32(pRaw, dataPos, numOfWriteTbs, _OVER)
6,431!
1061
  SDB_SET_INT32(pRaw, dataPos, numOfAlterTbs, _OVER)
6,431!
1062
  SDB_SET_INT32(pRaw, dataPos, numOfReadViews, _OVER)
6,431!
1063
  SDB_SET_INT32(pRaw, dataPos, numOfWriteViews, _OVER)
6,431!
1064
  SDB_SET_INT32(pRaw, dataPos, numOfAlterViews, _OVER)
6,431!
1065
  SDB_SET_INT32(pRaw, dataPos, numOfUseDbs, _OVER)
6,431!
1066

1067
  stb = taosHashIterate(pUser->readTbs, NULL);
6,431✔
1068
  while (stb != NULL) {
169,861✔
1069
    size_t keyLen = 0;
163,430✔
1070
    void  *key = taosHashGetKey(stb, &keyLen);
163,430✔
1071
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
163,430!
1072
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
163,430!
1073

1074
    size_t valueLen = 0;
163,430✔
1075
    valueLen = strlen(stb) + 1;
163,430✔
1076
    SDB_SET_INT32(pRaw, dataPos, valueLen, _OVER)
163,430!
1077
    SDB_SET_BINARY(pRaw, dataPos, stb, valueLen, _OVER);
163,430!
1078
    stb = taosHashIterate(pUser->readTbs, stb);
163,430✔
1079
  }
1080

1081
  stb = taosHashIterate(pUser->writeTbs, NULL);
6,431✔
1082
  while (stb != NULL) {
169,460✔
1083
    size_t keyLen = 0;
163,029✔
1084
    void  *key = taosHashGetKey(stb, &keyLen);
163,029✔
1085
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
163,029!
1086
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
163,029!
1087

1088
    size_t valueLen = 0;
163,029✔
1089
    valueLen = strlen(stb) + 1;
163,029✔
1090
    SDB_SET_INT32(pRaw, dataPos, valueLen, _OVER)
163,029!
1091
    SDB_SET_BINARY(pRaw, dataPos, stb, valueLen, _OVER);
163,029!
1092
    stb = taosHashIterate(pUser->writeTbs, stb);
163,029✔
1093
  }
1094

1095
  stb = taosHashIterate(pUser->alterTbs, NULL);
6,431✔
1096
  while (stb != NULL) {
6,442✔
1097
    size_t keyLen = 0;
11✔
1098
    void  *key = taosHashGetKey(stb, &keyLen);
11✔
1099
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
11!
1100
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
11!
1101

1102
    size_t valueLen = 0;
11✔
1103
    valueLen = strlen(stb) + 1;
11✔
1104
    SDB_SET_INT32(pRaw, dataPos, valueLen, _OVER)
11!
1105
    SDB_SET_BINARY(pRaw, dataPos, stb, valueLen, _OVER);
11!
1106
    stb = taosHashIterate(pUser->alterTbs, stb);
11✔
1107
  }
1108

1109
  stb = taosHashIterate(pUser->readViews, NULL);
6,431✔
1110
  while (stb != NULL) {
6,494✔
1111
    size_t keyLen = 0;
63✔
1112
    void  *key = taosHashGetKey(stb, &keyLen);
63✔
1113
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
63!
1114
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
63!
1115

1116
    size_t valueLen = 0;
63✔
1117
    valueLen = strlen(stb) + 1;
63✔
1118
    SDB_SET_INT32(pRaw, dataPos, valueLen, _OVER)
63!
1119
    SDB_SET_BINARY(pRaw, dataPos, stb, valueLen, _OVER);
63!
1120
    stb = taosHashIterate(pUser->readViews, stb);
63✔
1121
  }
1122

1123
  stb = taosHashIterate(pUser->writeViews, NULL);
6,431✔
1124
  while (stb != NULL) {
6,481✔
1125
    size_t keyLen = 0;
50✔
1126
    void  *key = taosHashGetKey(stb, &keyLen);
50✔
1127
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
50!
1128
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
50!
1129

1130
    size_t valueLen = 0;
50✔
1131
    valueLen = strlen(stb) + 1;
50✔
1132
    SDB_SET_INT32(pRaw, dataPos, valueLen, _OVER)
50!
1133
    SDB_SET_BINARY(pRaw, dataPos, stb, valueLen, _OVER);
50!
1134
    stb = taosHashIterate(pUser->writeViews, stb);
50✔
1135
  }
1136

1137
  stb = taosHashIterate(pUser->alterViews, NULL);
6,431✔
1138
  while (stb != NULL) {
6,485✔
1139
    size_t keyLen = 0;
54✔
1140
    void  *key = taosHashGetKey(stb, &keyLen);
54✔
1141
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
54!
1142
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
54!
1143

1144
    size_t valueLen = 0;
54✔
1145
    valueLen = strlen(stb) + 1;
54✔
1146
    SDB_SET_INT32(pRaw, dataPos, valueLen, _OVER)
54!
1147
    SDB_SET_BINARY(pRaw, dataPos, stb, valueLen, _OVER);
54!
1148
    stb = taosHashIterate(pUser->alterViews, stb);
54✔
1149
  }
1150

1151
  useDb = taosHashIterate(pUser->useDbs, NULL);
6,431✔
1152
  while (useDb != NULL) {
8,236✔
1153
    size_t keyLen = 0;
1,805✔
1154
    void  *key = taosHashGetKey(useDb, &keyLen);
1,805✔
1155
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
1,805!
1156
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
1,805!
1157

1158
    SDB_SET_INT32(pRaw, dataPos, *useDb, _OVER)
1,805!
1159
    useDb = taosHashIterate(pUser->useDbs, useDb);
1,805✔
1160
  }
1161

1162
  // save white list
1163
  int32_t num = pUser->pIpWhiteList->num;
6,431✔
1164
  int32_t tlen = sizeof(SIpWhiteList) + num * sizeof(SIpV4Range) + 4;
6,431✔
1165
  if ((buf = taosMemoryCalloc(1, tlen)) == NULL) {
6,431!
1166
    TAOS_CHECK_GOTO(terrno, NULL, _OVER);
×
1167
  }
1168
  int32_t len = 0;
6,431✔
1169
  TAOS_CHECK_GOTO(tSerializeIpWhiteList(buf, tlen, pUser->pIpWhiteList, &len), &lino, _OVER);
6,431!
1170

1171
  SDB_SET_INT32(pRaw, dataPos, len, _OVER);
6,431!
1172
  SDB_SET_BINARY(pRaw, dataPos, buf, len, _OVER);
6,431!
1173

1174
  SDB_SET_INT64(pRaw, dataPos, pUser->ipWhiteListVer, _OVER);
6,431!
1175

1176
  SDB_SET_RESERVE(pRaw, dataPos, USER_RESERVE_SIZE, _OVER)
6,431!
1177
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
6,431!
1178

1179
_OVER:
6,431✔
1180
  taosMemoryFree(buf);
6,431✔
1181
  if (code < 0) {
6,431!
1182
    mError("user:%s, failed to encode user action to raw:%p at line %d since %s", pUser->user, pRaw, lino,
×
1183
           tstrerror(code));
1184
    sdbFreeRaw(pRaw);
×
1185
    pRaw = NULL;
×
1186
    terrno = code;
×
1187
  }
1188

1189
  mTrace("user:%s, encode user action to raw:%p, row:%p", pUser->user, pRaw, pUser);
6,431✔
1190
  return pRaw;
6,431✔
1191
}
1192

1193
static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) {
3,519✔
1194
  int32_t   code = 0;
3,519✔
1195
  int32_t   lino = 0;
3,519✔
1196
  SSdbRow  *pRow = NULL;
3,519✔
1197
  SUserObj *pUser = NULL;
3,519✔
1198
  char     *key = NULL;
3,519✔
1199
  char     *value = NULL;
3,519✔
1200

1201
  int8_t sver = 0;
3,519✔
1202
  if (sdbGetRawSoftVer(pRaw, &sver) != 0) {
3,519!
1203
    TAOS_CHECK_GOTO(TSDB_CODE_INVALID_PTR, &lino, _OVER);
×
1204
  }
1205

1206
  if (sver < 1 || sver > USER_VER_NUMBER) {
3,519!
1207
    TAOS_CHECK_GOTO(TSDB_CODE_SDB_INVALID_DATA_VER, &lino, _OVER);
×
1208
  }
1209

1210
  pRow = sdbAllocRow(sizeof(SUserObj));
3,519✔
1211
  if (pRow == NULL) {
3,519!
1212
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1213
  }
1214

1215
  pUser = sdbGetRowObj(pRow);
3,519✔
1216
  if (pUser == NULL) {
3,519!
1217
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1218
  }
1219

1220
  int32_t dataPos = 0;
3,519✔
1221
  SDB_GET_BINARY(pRaw, dataPos, pUser->user, TSDB_USER_LEN, _OVER)
3,519!
1222
  SDB_GET_BINARY(pRaw, dataPos, pUser->pass, TSDB_PASSWORD_LEN, _OVER)
3,519!
1223
  SDB_GET_BINARY(pRaw, dataPos, pUser->acct, TSDB_USER_LEN, _OVER)
3,519!
1224
  SDB_GET_INT64(pRaw, dataPos, &pUser->createdTime, _OVER)
3,519!
1225
  SDB_GET_INT64(pRaw, dataPos, &pUser->updateTime, _OVER)
3,519!
1226
  SDB_GET_INT8(pRaw, dataPos, &pUser->superUser, _OVER)
3,519!
1227
  SDB_GET_INT8(pRaw, dataPos, &pUser->sysInfo, _OVER)
3,519!
1228
  SDB_GET_INT8(pRaw, dataPos, &pUser->enable, _OVER)
3,519!
1229
  SDB_GET_UINT8(pRaw, dataPos, &pUser->flag, _OVER)
3,519!
1230
  if (pUser->superUser) pUser->createdb = 1;
3,519✔
1231
  SDB_GET_INT32(pRaw, dataPos, &pUser->authVersion, _OVER)
3,519!
1232
  if (sver >= 4) {
3,519!
1233
    SDB_GET_INT32(pRaw, dataPos, &pUser->passVersion, _OVER)
3,519!
1234
  }
1235

1236
  int32_t numOfReadDbs = 0;
3,519✔
1237
  int32_t numOfWriteDbs = 0;
3,519✔
1238
  int32_t numOfTopics = 0;
3,519✔
1239
  SDB_GET_INT32(pRaw, dataPos, &numOfReadDbs, _OVER)
3,519!
1240
  SDB_GET_INT32(pRaw, dataPos, &numOfWriteDbs, _OVER)
3,519!
1241
  if (sver >= 2) {
3,519!
1242
    SDB_GET_INT32(pRaw, dataPos, &numOfTopics, _OVER)
3,519!
1243
  }
1244

1245
  pUser->readDbs = taosHashInit(numOfReadDbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
3,519✔
1246
  pUser->writeDbs =
3,519✔
1247
      taosHashInit(numOfWriteDbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
3,519✔
1248
  pUser->topics = taosHashInit(numOfTopics, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
3,519✔
1249
  if (pUser->readDbs == NULL || pUser->writeDbs == NULL || pUser->topics == NULL) {
3,519!
1250
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1251
    goto _OVER;
×
1252
  }
1253

1254
  for (int32_t i = 0; i < numOfReadDbs; ++i) {
3,659✔
1255
    char db[TSDB_DB_FNAME_LEN] = {0};
140✔
1256
    SDB_GET_BINARY(pRaw, dataPos, db, TSDB_DB_FNAME_LEN, _OVER)
140!
1257
    int32_t len = strlen(db) + 1;
140✔
1258
    TAOS_CHECK_GOTO(taosHashPut(pUser->readDbs, db, len, db, TSDB_DB_FNAME_LEN), &lino, _OVER);
140!
1259
  }
1260

1261
  for (int32_t i = 0; i < numOfWriteDbs; ++i) {
3,648✔
1262
    char db[TSDB_DB_FNAME_LEN] = {0};
129✔
1263
    SDB_GET_BINARY(pRaw, dataPos, db, TSDB_DB_FNAME_LEN, _OVER)
129!
1264
    int32_t len = strlen(db) + 1;
129✔
1265
    TAOS_CHECK_GOTO(taosHashPut(pUser->writeDbs, db, len, db, TSDB_DB_FNAME_LEN), &lino, _OVER);
129!
1266
  }
1267

1268
  if (sver >= 2) {
3,519!
1269
    for (int32_t i = 0; i < numOfTopics; ++i) {
3,555✔
1270
      char topic[TSDB_TOPIC_FNAME_LEN] = {0};
36✔
1271
      SDB_GET_BINARY(pRaw, dataPos, topic, TSDB_TOPIC_FNAME_LEN, _OVER)
36!
1272
      int32_t len = strlen(topic) + 1;
36✔
1273
      TAOS_CHECK_GOTO(taosHashPut(pUser->topics, topic, len, topic, TSDB_TOPIC_FNAME_LEN), &lino, _OVER);
36!
1274
    }
1275
  }
1276

1277
  if (sver >= 3) {
3,519!
1278
    int32_t numOfReadTbs = 0;
3,519✔
1279
    int32_t numOfWriteTbs = 0;
3,519✔
1280
    int32_t numOfAlterTbs = 0;
3,519✔
1281
    int32_t numOfReadViews = 0;
3,519✔
1282
    int32_t numOfWriteViews = 0;
3,519✔
1283
    int32_t numOfAlterViews = 0;
3,519✔
1284
    int32_t numOfUseDbs = 0;
3,519✔
1285
    SDB_GET_INT32(pRaw, dataPos, &numOfReadTbs, _OVER)
3,519!
1286
    SDB_GET_INT32(pRaw, dataPos, &numOfWriteTbs, _OVER)
3,519!
1287
    if (sver >= 6) {
3,519!
1288
      SDB_GET_INT32(pRaw, dataPos, &numOfAlterTbs, _OVER)
3,519!
1289
      SDB_GET_INT32(pRaw, dataPos, &numOfReadViews, _OVER)
3,519!
1290
      SDB_GET_INT32(pRaw, dataPos, &numOfWriteViews, _OVER)
3,519!
1291
      SDB_GET_INT32(pRaw, dataPos, &numOfAlterViews, _OVER)
3,519!
1292
    }
1293
    SDB_GET_INT32(pRaw, dataPos, &numOfUseDbs, _OVER)
3,519!
1294

1295
    pUser->readTbs =
3,519✔
1296
        taosHashInit(numOfReadTbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
3,519✔
1297
    pUser->writeTbs =
3,519✔
1298
        taosHashInit(numOfWriteTbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
3,519✔
1299
    pUser->alterTbs =
3,519✔
1300
        taosHashInit(numOfAlterTbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
3,519✔
1301

1302
    pUser->readViews =
3,519✔
1303
        taosHashInit(numOfReadViews, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
3,519✔
1304
    pUser->writeViews =
3,519✔
1305
        taosHashInit(numOfWriteViews, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
3,519✔
1306
    pUser->alterViews =
3,519✔
1307
        taosHashInit(numOfAlterViews, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
3,519✔
1308

1309
    pUser->useDbs = taosHashInit(numOfUseDbs, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
3,519✔
1310

1311
    if (pUser->readTbs == NULL || pUser->writeTbs == NULL || pUser->alterTbs == NULL || pUser->readViews == NULL ||
3,519!
1312
        pUser->writeViews == NULL || pUser->alterViews == NULL || pUser->useDbs == NULL) {
3,519!
1313
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1314
      goto _OVER;
×
1315
    }
1316

1317
    for (int32_t i = 0; i < numOfReadTbs; ++i) {
164,760✔
1318
      int32_t keyLen = 0;
161,241✔
1319
      SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
161,241!
1320

1321
      TAOS_MEMORY_REALLOC(key, keyLen * sizeof(char));
161,241!
1322
      if (key == NULL) {
161,241!
1323
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1324
      }
1325
      (void)memset(key, 0, keyLen);
161,241✔
1326
      SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
161,241!
1327

1328
      int32_t valuelen = 0;
161,241✔
1329
      SDB_GET_INT32(pRaw, dataPos, &valuelen, _OVER);
161,241!
1330
      TAOS_MEMORY_REALLOC(value, valuelen * sizeof(char));
161,241!
1331
      if (value == NULL) {
161,241!
1332
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1333
      }
1334
      (void)memset(value, 0, valuelen);
161,241✔
1335
      SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER)
161,241!
1336

1337
      TAOS_CHECK_GOTO(taosHashPut(pUser->readTbs, key, keyLen, value, valuelen), &lino, _OVER);
161,241!
1338
    }
1339

1340
    for (int32_t i = 0; i < numOfWriteTbs; ++i) {
164,361✔
1341
      int32_t keyLen = 0;
160,842✔
1342
      SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
160,842!
1343

1344
      TAOS_MEMORY_REALLOC(key, keyLen * sizeof(char));
160,842!
1345
      if (key == NULL) {
160,842!
1346
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1347
      }
1348
      (void)memset(key, 0, keyLen);
160,842✔
1349
      SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
160,842!
1350

1351
      int32_t valuelen = 0;
160,842✔
1352
      SDB_GET_INT32(pRaw, dataPos, &valuelen, _OVER);
160,842!
1353
      TAOS_MEMORY_REALLOC(value, valuelen * sizeof(char));
160,842!
1354
      if (value == NULL) {
160,842!
1355
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1356
      }
1357
      (void)memset(value, 0, valuelen);
160,842✔
1358
      SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER)
160,842!
1359

1360
      TAOS_CHECK_GOTO(taosHashPut(pUser->writeTbs, key, keyLen, value, valuelen), &lino, _OVER);
160,842!
1361
    }
1362

1363
    if (sver >= 6) {
3,519!
1364
      for (int32_t i = 0; i < numOfAlterTbs; ++i) {
3,530✔
1365
        int32_t keyLen = 0;
11✔
1366
        SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
11!
1367

1368
        TAOS_MEMORY_REALLOC(key, keyLen * sizeof(char));
11!
1369
        if (key == NULL) {
11!
1370
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1371
        }
1372
        (void)memset(key, 0, keyLen);
11✔
1373
        SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
11!
1374

1375
        int32_t valuelen = 0;
11✔
1376
        SDB_GET_INT32(pRaw, dataPos, &valuelen, _OVER);
11!
1377
        TAOS_MEMORY_REALLOC(value, valuelen * sizeof(char));
11!
1378
        if (value == NULL) {
11!
1379
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1380
        }
1381
        (void)memset(value, 0, valuelen);
11✔
1382
        SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER)
11!
1383

1384
        TAOS_CHECK_GOTO(taosHashPut(pUser->alterTbs, key, keyLen, value, valuelen), &lino, _OVER);
11!
1385
      }
1386

1387
      for (int32_t i = 0; i < numOfReadViews; ++i) {
3,582✔
1388
        int32_t keyLen = 0;
63✔
1389
        SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
63!
1390

1391
        TAOS_MEMORY_REALLOC(key, keyLen * sizeof(char));
63!
1392
        if (key == NULL) {
63!
1393
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1394
        }
1395
        (void)memset(key, 0, keyLen);
63✔
1396
        SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
63!
1397

1398
        int32_t valuelen = 0;
63✔
1399
        SDB_GET_INT32(pRaw, dataPos, &valuelen, _OVER);
63!
1400
        TAOS_MEMORY_REALLOC(value, valuelen * sizeof(char));
63!
1401
        if (value == NULL) {
63!
1402
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1403
        }
1404
        (void)memset(value, 0, valuelen);
63✔
1405
        SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER)
63!
1406

1407
        TAOS_CHECK_GOTO(taosHashPut(pUser->readViews, key, keyLen, value, valuelen), &lino, _OVER);
63!
1408
      }
1409

1410
      for (int32_t i = 0; i < numOfWriteViews; ++i) {
3,569✔
1411
        int32_t keyLen = 0;
50✔
1412
        SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
50!
1413

1414
        TAOS_MEMORY_REALLOC(key, keyLen * sizeof(char));
50!
1415
        if (key == NULL) {
50!
1416
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1417
        }
1418
        (void)memset(key, 0, keyLen);
50✔
1419
        SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
50!
1420

1421
        int32_t valuelen = 0;
50✔
1422
        SDB_GET_INT32(pRaw, dataPos, &valuelen, _OVER);
50!
1423
        TAOS_MEMORY_REALLOC(value, valuelen * sizeof(char));
50!
1424
        if (value == NULL) {
50!
1425
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1426
        }
1427
        (void)memset(value, 0, valuelen);
50✔
1428
        SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER)
50!
1429

1430
        TAOS_CHECK_GOTO(taosHashPut(pUser->writeViews, key, keyLen, value, valuelen), &lino, _OVER);
50!
1431
      }
1432

1433
      for (int32_t i = 0; i < numOfAlterViews; ++i) {
3,573✔
1434
        int32_t keyLen = 0;
54✔
1435
        SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
54!
1436

1437
        TAOS_MEMORY_REALLOC(key, keyLen * sizeof(char));
54!
1438
        if (key == NULL) {
54!
1439
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1440
        }
1441
        (void)memset(key, 0, keyLen);
54✔
1442
        SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
54!
1443

1444
        int32_t valuelen = 0;
54✔
1445
        SDB_GET_INT32(pRaw, dataPos, &valuelen, _OVER);
54!
1446
        TAOS_MEMORY_REALLOC(value, valuelen * sizeof(char));
54!
1447
        if (value == NULL) {
54!
1448
          TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1449
        }
1450
        (void)memset(value, 0, valuelen);
54✔
1451
        SDB_GET_BINARY(pRaw, dataPos, value, valuelen, _OVER)
54!
1452

1453
        TAOS_CHECK_GOTO(taosHashPut(pUser->alterViews, key, keyLen, value, valuelen), &lino, _OVER);
54!
1454
      }
1455
    }
1456

1457
    for (int32_t i = 0; i < numOfUseDbs; ++i) {
5,275✔
1458
      int32_t keyLen = 0;
1,756✔
1459
      SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
1,756!
1460

1461
      TAOS_MEMORY_REALLOC(key, keyLen * sizeof(char));
1,756!
1462
      if (key == NULL) {
1,756!
1463
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1464
      }
1465
      (void)memset(key, 0, keyLen);
1,756✔
1466
      SDB_GET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
1,756!
1467

1468
      int32_t ref = 0;
1,756✔
1469
      SDB_GET_INT32(pRaw, dataPos, &ref, _OVER);
1,756!
1470

1471
      TAOS_CHECK_GOTO(taosHashPut(pUser->useDbs, key, keyLen, &ref, sizeof(ref)), &lino, _OVER);
1,756!
1472
    }
1473
  }
1474
  // decoder white list
1475
  if (sver >= 5) {
3,519!
1476
    int32_t len = 0;
3,519✔
1477
    SDB_GET_INT32(pRaw, dataPos, &len, _OVER);
3,519!
1478

1479
    TAOS_MEMORY_REALLOC(key, len);
3,519!
1480
    if (key == NULL) {
3,519!
1481
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1482
    }
1483
    SDB_GET_BINARY(pRaw, dataPos, key, len, _OVER);
3,519!
1484

1485
    TAOS_CHECK_GOTO(createIpWhiteList(key, len, &pUser->pIpWhiteList), &lino, _OVER);
3,519!
1486

1487
    SDB_GET_INT64(pRaw, dataPos, &pUser->ipWhiteListVer, _OVER);
3,519!
1488
  }
1489

1490
  if (pUser->pIpWhiteList == NULL) {
3,519!
1491
    TAOS_CHECK_GOTO(createDefaultIpWhiteList(&pUser->pIpWhiteList), &lino, _OVER);
×
1492
    pUser->ipWhiteListVer = taosGetTimestampMs();
×
1493
  }
1494

1495
  SDB_GET_RESERVE(pRaw, dataPos, USER_RESERVE_SIZE, _OVER)
3,519!
1496
  taosInitRWLatch(&pUser->lock);
3,519✔
1497

1498
_OVER:
3,519✔
1499
  taosMemoryFree(key);
3,519✔
1500
  taosMemoryFree(value);
3,519✔
1501
  if (code < 0) {
3,519!
1502
    terrno = code;
×
1503
    mError("user:%s, failed to decode at line %d from raw:%p since %s", pUser == NULL ? "null" : pUser->user, lino,
×
1504
           pRaw, tstrerror(code));
1505
    if (pUser != NULL) {
×
1506
      taosHashCleanup(pUser->readDbs);
×
1507
      taosHashCleanup(pUser->writeDbs);
×
1508
      taosHashCleanup(pUser->topics);
×
1509
      taosHashCleanup(pUser->readTbs);
×
1510
      taosHashCleanup(pUser->writeTbs);
×
1511
      taosHashCleanup(pUser->alterTbs);
×
1512
      taosHashCleanup(pUser->readViews);
×
1513
      taosHashCleanup(pUser->writeViews);
×
1514
      taosHashCleanup(pUser->alterViews);
×
1515
      taosHashCleanup(pUser->useDbs);
×
1516
      taosMemoryFreeClear(pUser->pIpWhiteList);
×
1517
    }
1518
    taosMemoryFreeClear(pRow);
×
1519
    return NULL;
×
1520
  }
1521

1522
  mTrace("user:%s, decode from raw:%p, row:%p", pUser->user, pRaw, pUser);
3,519✔
1523
  return pRow;
3,519✔
1524
}
1525

1526
static int32_t mndUserActionInsert(SSdb *pSdb, SUserObj *pUser) {
2,199✔
1527
  mTrace("user:%s, perform insert action, row:%p", pUser->user, pUser);
2,199✔
1528

1529
  SAcctObj *pAcct = sdbAcquire(pSdb, SDB_ACCT, pUser->acct);
2,199✔
1530
  if (pAcct == NULL) {
2,199!
1531
    terrno = TSDB_CODE_MND_ACCT_NOT_EXIST;
×
1532
    mError("user:%s, failed to perform insert action since %s", pUser->user, terrstr());
×
1533
    TAOS_RETURN(terrno);
×
1534
  }
1535
  pUser->acctId = pAcct->acctId;
2,199✔
1536
  sdbRelease(pSdb, pAcct);
2,199✔
1537

1538
  return 0;
2,199✔
1539
}
1540

1541
int32_t mndDupTableHash(SHashObj *pOld, SHashObj **ppNew) {
2,869,292✔
1542
  int32_t code = 0;
2,869,292✔
1543
  *ppNew =
2,869,296✔
1544
      taosHashInit(taosHashGetSize(pOld), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
2,869,292✔
1545
  if (*ppNew == NULL) {
2,869,296!
1546
    TAOS_RETURN(terrno);
×
1547
  }
1548

1549
  char *tb = taosHashIterate(pOld, NULL);
2,869,296✔
1550
  while (tb != NULL) {
3,192,689✔
1551
    size_t keyLen = 0;
323,395✔
1552
    char  *key = taosHashGetKey(tb, &keyLen);
323,395✔
1553

1554
    int32_t valueLen = strlen(tb) + 1;
323,395✔
1555
    if ((code = taosHashPut(*ppNew, key, keyLen, tb, valueLen)) != 0) {
323,395!
1556
      taosHashCancelIterate(pOld, tb);
×
1557
      taosHashCleanup(*ppNew);
×
1558
      TAOS_RETURN(code);
×
1559
    }
1560
    tb = taosHashIterate(pOld, tb);
323,395✔
1561
  }
1562

1563
  TAOS_RETURN(code);
2,869,294✔
1564
}
1565

1566
int32_t mndDupUseDbHash(SHashObj *pOld, SHashObj **ppNew) {
5,709✔
1567
  int32_t code = 0;
5,709✔
1568
  *ppNew =
5,709✔
1569
      taosHashInit(taosHashGetSize(pOld), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
5,709✔
1570
  if (*ppNew == NULL) {
5,709!
1571
    TAOS_RETURN(terrno);
×
1572
  }
1573

1574
  int32_t *db = taosHashIterate(pOld, NULL);
5,709✔
1575
  while (db != NULL) {
7,544✔
1576
    size_t keyLen = 0;
1,835✔
1577
    char  *key = taosHashGetKey(db, &keyLen);
1,835✔
1578

1579
    if ((code = taosHashPut(*ppNew, key, keyLen, db, sizeof(*db))) != 0) {
1,835!
1580
      taosHashCancelIterate(pOld, db);
×
1581
      taosHashCleanup(*ppNew);
×
1582
      TAOS_RETURN(code);
×
1583
    }
1584
    db = taosHashIterate(pOld, db);
1,835✔
1585
  }
1586

1587
  TAOS_RETURN(code);
5,709✔
1588
}
1589

1590
int32_t mndUserDupObj(SUserObj *pUser, SUserObj *pNew) {
5,709✔
1591
  int32_t code = 0;
5,709✔
1592
  (void)memcpy(pNew, pUser, sizeof(SUserObj));
5,709✔
1593
  pNew->authVersion++;
5,709✔
1594
  pNew->updateTime = taosGetTimestampMs();
5,709✔
1595

1596
  taosRLockLatch(&pUser->lock);
5,709✔
1597
  TAOS_CHECK_GOTO(mndDupDbHash(pUser->readDbs, &pNew->readDbs), NULL, _OVER);
5,709!
1598
  TAOS_CHECK_GOTO(mndDupDbHash(pUser->writeDbs, &pNew->writeDbs), NULL, _OVER);
5,709!
1599
  TAOS_CHECK_GOTO(mndDupTableHash(pUser->readTbs, &pNew->readTbs), NULL, _OVER);
5,709!
1600
  TAOS_CHECK_GOTO(mndDupTableHash(pUser->writeTbs, &pNew->writeTbs), NULL, _OVER);
5,709!
1601
  TAOS_CHECK_GOTO(mndDupTableHash(pUser->alterTbs, &pNew->alterTbs), NULL, _OVER);
5,709!
1602
  TAOS_CHECK_GOTO(mndDupTableHash(pUser->readViews, &pNew->readViews), NULL, _OVER);
5,709!
1603
  TAOS_CHECK_GOTO(mndDupTableHash(pUser->writeViews, &pNew->writeViews), NULL, _OVER);
5,709!
1604
  TAOS_CHECK_GOTO(mndDupTableHash(pUser->alterViews, &pNew->alterViews), NULL, _OVER);
5,709!
1605
  TAOS_CHECK_GOTO(mndDupTopicHash(pUser->topics, &pNew->topics), NULL, _OVER);
5,709!
1606
  TAOS_CHECK_GOTO(mndDupUseDbHash(pUser->useDbs, &pNew->useDbs), NULL, _OVER);
5,709!
1607
  pNew->pIpWhiteList = cloneIpWhiteList(pUser->pIpWhiteList);
5,709✔
1608
  if (pNew->pIpWhiteList == NULL) {
5,709!
1609
    code = TSDB_CODE_OUT_OF_MEMORY;
×
1610
  }
1611

1612
_OVER:
5,709✔
1613
  taosRUnLockLatch(&pUser->lock);
5,709✔
1614
  TAOS_RETURN(code);
5,709✔
1615
}
1616

1617
void mndUserFreeObj(SUserObj *pUser) {
18,318✔
1618
  taosHashCleanup(pUser->readDbs);
18,318✔
1619
  taosHashCleanup(pUser->writeDbs);
18,318✔
1620
  taosHashCleanup(pUser->topics);
18,318✔
1621
  taosHashCleanup(pUser->readTbs);
18,318✔
1622
  taosHashCleanup(pUser->writeTbs);
18,318✔
1623
  taosHashCleanup(pUser->alterTbs);
18,318✔
1624
  taosHashCleanup(pUser->readViews);
18,318✔
1625
  taosHashCleanup(pUser->writeViews);
18,318✔
1626
  taosHashCleanup(pUser->alterViews);
18,318✔
1627
  taosHashCleanup(pUser->useDbs);
18,318✔
1628
  taosMemoryFreeClear(pUser->pIpWhiteList);
18,318✔
1629
  pUser->readDbs = NULL;
18,318✔
1630
  pUser->writeDbs = NULL;
18,318✔
1631
  pUser->topics = NULL;
18,318✔
1632
  pUser->readTbs = NULL;
18,318✔
1633
  pUser->writeTbs = NULL;
18,318✔
1634
  pUser->alterTbs = NULL;
18,318✔
1635
  pUser->readViews = NULL;
18,318✔
1636
  pUser->writeViews = NULL;
18,318✔
1637
  pUser->alterViews = NULL;
18,318✔
1638
  pUser->useDbs = NULL;
18,318✔
1639
}
18,318✔
1640

1641
static int32_t mndUserActionDelete(SSdb *pSdb, SUserObj *pUser) {
3,517✔
1642
  mTrace("user:%s, perform delete action, row:%p", pUser->user, pUser);
3,517✔
1643
  mndUserFreeObj(pUser);
3,517✔
1644
  return 0;
3,517✔
1645
}
1646

1647
static int32_t mndUserActionUpdate(SSdb *pSdb, SUserObj *pOld, SUserObj *pNew) {
1,223✔
1648
  mTrace("user:%s, perform update action, old row:%p new row:%p", pOld->user, pOld, pNew);
1,223✔
1649
  taosWLockLatch(&pOld->lock);
1,223✔
1650
  pOld->updateTime = pNew->updateTime;
1,223✔
1651
  pOld->authVersion = pNew->authVersion;
1,223✔
1652
  pOld->passVersion = pNew->passVersion;
1,223✔
1653
  pOld->sysInfo = pNew->sysInfo;
1,223✔
1654
  pOld->enable = pNew->enable;
1,223✔
1655
  pOld->flag = pNew->flag;
1,223✔
1656
  (void)memcpy(pOld->pass, pNew->pass, TSDB_PASSWORD_LEN);
1,223✔
1657
  TSWAP(pOld->readDbs, pNew->readDbs);
1,223✔
1658
  TSWAP(pOld->writeDbs, pNew->writeDbs);
1,223✔
1659
  TSWAP(pOld->topics, pNew->topics);
1,223✔
1660
  TSWAP(pOld->readTbs, pNew->readTbs);
1,223✔
1661
  TSWAP(pOld->writeTbs, pNew->writeTbs);
1,223✔
1662
  TSWAP(pOld->alterTbs, pNew->alterTbs);
1,223✔
1663
  TSWAP(pOld->readViews, pNew->readViews);
1,223✔
1664
  TSWAP(pOld->writeViews, pNew->writeViews);
1,223✔
1665
  TSWAP(pOld->alterViews, pNew->alterViews);
1,223✔
1666
  TSWAP(pOld->useDbs, pNew->useDbs);
1,223✔
1667

1668
  int32_t sz = sizeof(SIpWhiteList) + pNew->pIpWhiteList->num * sizeof(SIpV4Range);
1,223✔
1669
  TAOS_MEMORY_REALLOC(pOld->pIpWhiteList, sz);
1,223!
1670
  if (pOld->pIpWhiteList == NULL) {
1,223!
1671
    taosWUnLockLatch(&pOld->lock);
×
1672
    return terrno;
×
1673
  }
1674
  (void)memcpy(pOld->pIpWhiteList, pNew->pIpWhiteList, sz);
1,223✔
1675
  pOld->ipWhiteListVer = pNew->ipWhiteListVer;
1,223✔
1676

1677
  taosWUnLockLatch(&pOld->lock);
1,223✔
1678

1679
  return 0;
1,223✔
1680
}
1681

1682
int32_t mndAcquireUser(SMnode *pMnode, const char *userName, SUserObj **ppUser) {
5,064,082✔
1683
  int32_t code = 0;
5,064,082✔
1684
  SSdb   *pSdb = pMnode->pSdb;
5,064,082✔
1685

1686
  *ppUser = sdbAcquire(pSdb, SDB_USER, userName);
5,064,082✔
1687
  if (*ppUser == NULL) {
5,064,145✔
1688
    if (terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
177!
1689
      code = TSDB_CODE_MND_USER_NOT_EXIST;
177✔
1690
    } else {
1691
      code = TSDB_CODE_MND_USER_NOT_AVAILABLE;
×
1692
    }
1693
  }
1694
  TAOS_RETURN(code);
5,064,145✔
1695
}
1696

1697
void mndReleaseUser(SMnode *pMnode, SUserObj *pUser) {
5,064,486✔
1698
  SSdb *pSdb = pMnode->pSdb;
5,064,486✔
1699
  sdbRelease(pSdb, pUser);
5,064,486✔
1700
}
5,064,701✔
1701

1702
static int32_t mndCreateUser(SMnode *pMnode, char *acct, SCreateUserReq *pCreate, SRpcMsg *pReq) {
138✔
1703
  int32_t  code = 0;
138✔
1704
  int32_t  lino = 0;
138✔
1705
  SUserObj userObj = {0};
138✔
1706
  if (pCreate->isImport != 1) {
138!
1707
    taosEncryptPass_c((uint8_t *)pCreate->pass, strlen(pCreate->pass), userObj.pass);
138✔
1708
  } else {
1709
    // mInfo("pCreate->pass:%s", pCreate->pass)
1710
    strncpy(userObj.pass, pCreate->pass, TSDB_PASSWORD_LEN);
×
1711
  }
1712
  tstrncpy(userObj.user, pCreate->user, TSDB_USER_LEN);
138✔
1713
  tstrncpy(userObj.acct, acct, TSDB_USER_LEN);
138✔
1714
  userObj.createdTime = taosGetTimestampMs();
138✔
1715
  userObj.updateTime = userObj.createdTime;
138✔
1716
  userObj.superUser = 0;  // pCreate->superUser;
138✔
1717
  userObj.sysInfo = pCreate->sysInfo;
138✔
1718
  userObj.enable = pCreate->enable;
138✔
1719
  userObj.createdb = pCreate->createDb;
138✔
1720

1721
  if (pCreate->numIpRanges == 0) {
138✔
1722
    TAOS_CHECK_RETURN(createDefaultIpWhiteList(&userObj.pIpWhiteList));
136!
1723
  } else {
1724
    SHashObj *pUniqueTab = taosHashInit(64, MurmurHash3_32, true, HASH_NO_LOCK);
2✔
1725
    if (pUniqueTab == NULL) {
2!
1726
      TAOS_RETURN(terrno);
×
1727
    }
1728
    int32_t dummpy = 0;
2✔
1729
    for (int i = 0; i < pCreate->numIpRanges; i++) {
6✔
1730
      SIpV4Range range = {.ip = pCreate->pIpRanges[i].ip, .mask = pCreate->pIpRanges[i].mask};
4✔
1731
      if ((code = taosHashPut(pUniqueTab, &range, sizeof(range), &dummpy, sizeof(dummpy))) != 0) {
4!
1732
        taosHashCleanup(pUniqueTab);
×
1733
        TAOS_RETURN(code);
×
1734
      }
1735
    }
1736
    if ((code = taosHashPut(pUniqueTab, &defaultIpRange, sizeof(defaultIpRange), &dummpy, sizeof(dummpy))) != 0) {
2!
1737
      taosHashCleanup(pUniqueTab);
×
1738
      TAOS_RETURN(code);
×
1739
    }
1740

1741
    if (taosHashGetSize(pUniqueTab) > MND_MAX_USE_HOST) {
2!
1742
      taosHashCleanup(pUniqueTab);
×
1743
      TAOS_RETURN(TSDB_CODE_MND_TOO_MANY_USER_HOST);
×
1744
    }
1745

1746
    int32_t       numOfRanges = taosHashGetSize(pUniqueTab);
2✔
1747
    SIpWhiteList *p = taosMemoryCalloc(1, sizeof(SIpWhiteList) + numOfRanges * sizeof(SIpV4Range));
2✔
1748
    if (p == NULL) {
2!
1749
      taosHashCleanup(pUniqueTab);
×
1750
      TAOS_RETURN(terrno);
×
1751
    }
1752
    void   *pIter = taosHashIterate(pUniqueTab, NULL);
2✔
1753
    int32_t i = 0;
2✔
1754
    while (pIter) {
7✔
1755
      size_t      len = 0;
5✔
1756
      SIpV4Range *key = taosHashGetKey(pIter, &len);
5✔
1757
      p->pIpRange[i].ip = key->ip;
5✔
1758
      p->pIpRange[i].mask = key->mask;
5✔
1759
      pIter = taosHashIterate(pUniqueTab, pIter);
5✔
1760

1761
      i++;
5✔
1762
    }
1763

1764
    taosHashCleanup(pUniqueTab);
2✔
1765
    p->num = numOfRanges;
2✔
1766
    userObj.pIpWhiteList = p;
2✔
1767
  }
1768

1769
  userObj.ipWhiteListVer = taosGetTimestampMs();
138✔
1770

1771
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pReq, "create-user");
138✔
1772
  if (pTrans == NULL) {
138!
1773
    mError("user:%s, failed to create since %s", pCreate->user, terrstr());
×
1774
    taosMemoryFree(userObj.pIpWhiteList);
×
1775
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1776
  }
1777
  mInfo("trans:%d, used to create user:%s", pTrans->id, pCreate->user);
138!
1778

1779
  SSdbRaw *pCommitRaw = mndUserActionEncode(&userObj);
138✔
1780
  if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
138!
1781
    mError("trans:%d, failed to commit redo log since %s", pTrans->id, terrstr());
×
1782
    mndTransDrop(pTrans);
×
1783
    TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
1784
  }
1785
  TAOS_CHECK_GOTO(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY), &lino, _OVER);
138!
1786

1787
  if (mndTransPrepare(pMnode, pTrans) != 0) {
138!
1788
    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
×
1789
    mndTransDrop(pTrans);
×
1790
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1791
  }
1792
  if ((code = ipWhiteMgtUpdate(pMnode, userObj.user, userObj.pIpWhiteList)) != 0) {
138!
1793
    mndTransDrop(pTrans);
×
1794
    TAOS_CHECK_GOTO(code, &lino, _OVER);
×
1795
  }
1796

1797
  taosMemoryFree(userObj.pIpWhiteList);
138✔
1798
  mndTransDrop(pTrans);
138✔
1799
  return 0;
138✔
1800
_OVER:
×
1801
  taosMemoryFree(userObj.pIpWhiteList);
×
1802

1803
  TAOS_RETURN(code);
×
1804
}
1805

1806
static int32_t mndProcessCreateUserReq(SRpcMsg *pReq) {
146✔
1807
  SMnode        *pMnode = pReq->info.node;
146✔
1808
  int32_t        code = 0;
146✔
1809
  int32_t        lino = 0;
146✔
1810
  SUserObj      *pUser = NULL;
146✔
1811
  SUserObj      *pOperUser = NULL;
146✔
1812
  SCreateUserReq createReq = {0};
146✔
1813

1814
  if (tDeserializeSCreateUserReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
146!
1815
    TAOS_CHECK_GOTO(TSDB_CODE_INVALID_MSG, &lino, _OVER);
×
1816
  }
1817

1818
  mInfo("user:%s, start to create, createdb:%d, is_import:%d", createReq.user, createReq.isImport, createReq.createDb);
146!
1819

1820
#ifndef TD_ENTERPRISE
1821
  if (createReq.isImport == 1) {
1822
    TAOS_CHECK_GOTO(TSDB_CODE_OPS_NOT_SUPPORT, &lino, _OVER);  // enterprise feature
1823
  }
1824
#endif
1825

1826
  if (createReq.isImport != 1) {
146!
1827
    TAOS_CHECK_GOTO(mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CREATE_USER), &lino, _OVER);
146✔
1828
  } else {
1829
    if (strcmp(pReq->info.conn.user, "root") != 0) {
×
1830
      mError("The operation is not permitted, user:%s", pReq->info.conn.user);
×
1831
      TAOS_CHECK_GOTO(TSDB_CODE_MND_NO_RIGHTS, &lino, _OVER);
×
1832
    }
1833
  }
1834

1835
  if (createReq.user[0] == 0) {
141!
1836
    TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_USER_FORMAT, &lino, _OVER);
×
1837
  }
1838

1839
  if (createReq.pass[0] == 0) {
141!
1840
    TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_PASS_FORMAT, &lino, _OVER);
×
1841
  }
1842

1843
  if (createReq.isImport != 1) {
141!
1844
    if (strlen(createReq.pass) >= TSDB_PASSWORD_LEN) {
141✔
1845
      TAOS_CHECK_GOTO(TSDB_CODE_PAR_NAME_OR_PASSWD_TOO_LONG, &lino, _OVER);
1!
1846
    }
1847
  }
1848

1849
  code = mndAcquireUser(pMnode, createReq.user, &pUser);
140✔
1850
  if (pUser != NULL) {
140✔
1851
    TAOS_CHECK_GOTO(TSDB_CODE_MND_USER_ALREADY_EXIST, &lino, _OVER);
2!
1852
  }
1853

1854
  code = mndAcquireUser(pMnode, pReq->info.conn.user, &pOperUser);
138✔
1855
  if (pOperUser == NULL) {
138!
1856
    TAOS_CHECK_GOTO(TSDB_CODE_MND_NO_USER_FROM_CONN, &lino, _OVER);
×
1857
  }
1858

1859
  TAOS_CHECK_GOTO(grantCheck(TSDB_GRANT_USER), &lino, _OVER);
138!
1860

1861
  code = mndCreateUser(pMnode, pOperUser->acct, &createReq, pReq);
138✔
1862
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
138!
1863

1864
  char detail[1000] = {0};
138✔
1865
  (void)sprintf(detail, "enable:%d, superUser:%d, sysInfo:%d, password:xxx", createReq.enable, createReq.superUser,
138✔
1866
                createReq.sysInfo);
138✔
1867
  char operation[15] = {0};
138✔
1868
  if (createReq.isImport == 1) {
138!
1869
    (void)strcpy(operation, "importUser");
×
1870
  } else {
1871
    (void)strcpy(operation, "createUser");
138✔
1872
  }
1873

1874
  auditRecord(pReq, pMnode->clusterId, operation, "", createReq.user, detail, strlen(detail));
138✔
1875

1876
_OVER:
146✔
1877
  if (code < 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
146!
1878
    mError("user:%s, failed to create at line %d since %s", createReq.user, lino, tstrerror(code));
8!
1879
  }
1880

1881
  mndReleaseUser(pMnode, pUser);
146✔
1882
  mndReleaseUser(pMnode, pOperUser);
146✔
1883
  tFreeSCreateUserReq(&createReq);
146✔
1884

1885
  TAOS_RETURN(code);
146✔
1886
}
1887

1888
int32_t mndProcessGetUserWhiteListReq(SRpcMsg *pReq) {
226✔
1889
  SMnode              *pMnode = pReq->info.node;
226✔
1890
  int32_t              code = 0;
226✔
1891
  int32_t              lino = 0;
226✔
1892
  int32_t              contLen = 0;
226✔
1893
  void                *pRsp = NULL;
226✔
1894
  SUserObj            *pUser = NULL;
226✔
1895
  SGetUserWhiteListReq wlReq = {0};
226✔
1896
  SGetUserWhiteListRsp wlRsp = {0};
226✔
1897

1898
  if (tDeserializeSGetUserWhiteListReq(pReq->pCont, pReq->contLen, &wlReq) != 0) {
226!
1899
    TAOS_CHECK_GOTO(TSDB_CODE_INVALID_MSG, &lino, _OVER);
×
1900
  }
1901
  mTrace("user: %s, start to get whitelist", wlReq.user);
226✔
1902

1903
  code = mndAcquireUser(pMnode, wlReq.user, &pUser);
226✔
1904
  if (pUser == NULL) {
226!
1905
    TAOS_CHECK_GOTO(TSDB_CODE_MND_USER_NOT_EXIST, &lino, _OVER);
×
1906
  }
1907

1908
  TAOS_CHECK_GOTO(mndSetUserWhiteListRsp(pMnode, pUser, &wlRsp), &lino, _OVER);
226!
1909

1910
  contLen = tSerializeSGetUserWhiteListRsp(NULL, 0, &wlRsp);
226✔
1911
  if (contLen < 0) {
226!
1912
    TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
1913
  }
1914
  pRsp = rpcMallocCont(contLen);
226✔
1915
  if (pRsp == NULL) {
226!
1916
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1917
  }
1918

1919
  contLen = tSerializeSGetUserWhiteListRsp(pRsp, contLen, &wlRsp);
226✔
1920
  if (contLen < 0) {
226!
1921
    TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _OVER);
×
1922
  }
1923

1924
_OVER:
226✔
1925
  mndReleaseUser(pMnode, pUser);
226✔
1926
  tFreeSGetUserWhiteListRsp(&wlRsp);
226✔
1927
  if (code < 0) {
226!
1928
    mError("user:%s, failed to get whitelist at line %d since %s", wlReq.user, lino, tstrerror(code));
×
1929
    rpcFreeCont(pRsp);
×
1930
    pRsp = NULL;
×
1931
    contLen = 0;
×
1932
  }
1933
  pReq->code = code;
226✔
1934
  pReq->info.rsp = pRsp;
226✔
1935
  pReq->info.rspLen = contLen;
226✔
1936

1937
  TAOS_RETURN(code);
226✔
1938
}
1939

1940
int32_t mndProcesSRetrieveIpWhiteReq(SRpcMsg *pReq) {
1✔
1941
  int32_t        code = 0;
1✔
1942
  int32_t        lino = 0;
1✔
1943
  int32_t        len = 0;
1✔
1944
  void          *pRsp = NULL;
1✔
1945
  SUpdateIpWhite ipWhite = {0};
1✔
1946

1947
  // impl later
1948
  SRetrieveIpWhiteReq req = {0};
1✔
1949
  if (tDeserializeRetrieveIpWhite(pReq->pCont, pReq->contLen, &req) != 0) {
1!
1950
    code = TSDB_CODE_INVALID_MSG;
×
1951
    TAOS_CHECK_GOTO(code, &lino, _OVER);
×
1952
  }
1953

1954
  TAOS_CHECK_GOTO(ipWhiteMgtFillMsg(&ipWhite), &lino, _OVER);
1!
1955

1956
  len = tSerializeSUpdateIpWhite(NULL, 0, &ipWhite);
1✔
1957
  if (len < 0) {
1!
1958
    TAOS_CHECK_GOTO(len, &lino, _OVER);
×
1959
  }
1960

1961
  pRsp = rpcMallocCont(len);
1✔
1962
  if (!pRsp) {
1!
1963
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
1964
  }
1965
  len = tSerializeSUpdateIpWhite(pRsp, len, &ipWhite);
1✔
1966
  if (len < 0) {
1!
1967
    TAOS_CHECK_GOTO(len, &lino, _OVER);
×
1968
  }
1969

1970
_OVER:
1✔
1971
  if (code < 0) {
1!
1972
    mError("failed to process retrieve ip white request at line %d since %s", lino, tstrerror(code));
×
1973
    rpcFreeCont(pRsp);
×
1974
    pRsp = NULL;
×
1975
    len = 0;
×
1976
  }
1977
  pReq->code = code;
1✔
1978
  pReq->info.rsp = pRsp;
1✔
1979
  pReq->info.rspLen = len;
1✔
1980

1981
  tFreeSUpdateIpWhiteReq(&ipWhite);
1✔
1982
  TAOS_RETURN(code);
1✔
1983
}
1984

1985
static int32_t mndAlterUser(SMnode *pMnode, SUserObj *pOld, SUserObj *pNew, SRpcMsg *pReq) {
1,144✔
1986
  int32_t code = 0;
1,144✔
1987
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pReq, "alter-user");
1,144✔
1988
  if (pTrans == NULL) {
1,144!
1989
    mError("user:%s, failed to alter since %s", pOld->user, terrstr());
×
1990
    TAOS_RETURN(terrno);
×
1991
  }
1992
  mInfo("trans:%d, used to alter user:%s", pTrans->id, pOld->user);
1,144!
1993

1994
  SSdbRaw *pCommitRaw = mndUserActionEncode(pNew);
1,144✔
1995
  if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
1,144!
1996
    mError("trans:%d, failed to append commit log since %s", pTrans->id, terrstr());
×
1997
    mndTransDrop(pTrans);
×
1998
    TAOS_RETURN(terrno);
×
1999
  }
2000
  code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY);
1,144✔
2001
  if (code < 0) {
1,144!
2002
    mndTransDrop(pTrans);
×
2003
    TAOS_RETURN(code);
×
2004
  }
2005

2006
  if (mndTransPrepare(pMnode, pTrans) != 0) {
1,144✔
2007
    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
1!
2008
    mndTransDrop(pTrans);
1✔
2009
    TAOS_RETURN(terrno);
1✔
2010
  }
2011
  if ((code = ipWhiteMgtUpdate(pMnode, pNew->user, pNew->pIpWhiteList)) != 0) {
1,143!
2012
    mndTransDrop(pTrans);
×
2013
    TAOS_RETURN(code);
×
2014
  }
2015
  mndTransDrop(pTrans);
1,143✔
2016
  return 0;
1,143✔
2017
}
2018

2019
static int32_t mndDupObjHash(SHashObj *pOld, int32_t dataLen, SHashObj **ppNew) {
827,143✔
2020
  int32_t code = 0;
827,143✔
2021

2022
  *ppNew =
827,144✔
2023
      taosHashInit(taosHashGetSize(pOld), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK);
827,143✔
2024
  if (*ppNew == NULL) {
827,144!
2025
    code = terrno ? terrno : TSDB_CODE_OUT_OF_MEMORY;
×
2026
    TAOS_RETURN(code);
×
2027
  }
2028

2029
  char *db = taosHashIterate(pOld, NULL);
827,144✔
2030
  while (db != NULL) {
827,747✔
2031
    int32_t len = strlen(db) + 1;
605✔
2032
    if ((code = taosHashPut(*ppNew, db, len, db, dataLen)) != 0) {
605!
2033
      taosHashCancelIterate(pOld, db);
×
2034
      taosHashCleanup(*ppNew);
×
2035
      TAOS_RETURN(code);
×
2036
    }
2037
    db = taosHashIterate(pOld, db);
605✔
2038
  }
2039

2040
  TAOS_RETURN(code);
827,142✔
2041
}
2042

2043
int32_t mndDupDbHash(SHashObj *pOld, SHashObj **ppNew) { return mndDupObjHash(pOld, TSDB_DB_FNAME_LEN, ppNew); }
821,434✔
2044

2045
int32_t mndDupTopicHash(SHashObj *pOld, SHashObj **ppNew) { return mndDupObjHash(pOld, TSDB_TOPIC_FNAME_LEN, ppNew); }
5,709✔
2046

2047
static int32_t mndTablePriviledge(SMnode *pMnode, SHashObj *hash, SHashObj *useDbHash, SAlterUserReq *alterReq,
899✔
2048
                                  SSdb *pSdb) {
2049
  void *pIter = NULL;
899✔
2050
  char  tbFName[TSDB_TABLE_FNAME_LEN] = {0};
899✔
2051

2052
  (void)snprintf(tbFName, sizeof(tbFName), "%s.%s", alterReq->objname, alterReq->tabName);
899✔
2053
  int32_t len = strlen(tbFName) + 1;
899✔
2054

2055
  if (alterReq->tagCond != NULL && alterReq->tagCondLen != 0) {
932!
2056
    char *value = taosHashGet(hash, tbFName, len);
33✔
2057
    if (value != NULL) {
33!
2058
      TAOS_RETURN(TSDB_CODE_MND_PRIVILEDGE_EXIST);
×
2059
    }
2060

2061
    int32_t condLen = alterReq->tagCondLen;
33✔
2062
    TAOS_CHECK_RETURN(taosHashPut(hash, tbFName, len, alterReq->tagCond, condLen));
33!
2063
  } else {
2064
    TAOS_CHECK_RETURN(taosHashPut(hash, tbFName, len, alterReq->isView ? "v" : "t", 2));
866!
2065
  }
2066

2067
  int32_t  dbKeyLen = strlen(alterReq->objname) + 1;
899✔
2068
  int32_t  ref = 1;
899✔
2069
  int32_t *currRef = taosHashGet(useDbHash, alterReq->objname, dbKeyLen);
899✔
2070
  if (NULL != currRef) {
899✔
2071
    ref = (*currRef) + 1;
828✔
2072
  }
2073
  TAOS_CHECK_RETURN(taosHashPut(useDbHash, alterReq->objname, dbKeyLen, &ref, sizeof(ref)));
899!
2074

2075
  TAOS_RETURN(0);
899✔
2076
}
2077

2078
static int32_t mndRemoveTablePriviledge(SMnode *pMnode, SHashObj *hash, SHashObj *useDbHash, SAlterUserReq *alterReq,
36✔
2079
                                        SSdb *pSdb) {
2080
  void *pIter = NULL;
36✔
2081
  char  tbFName[TSDB_TABLE_FNAME_LEN] = {0};
36✔
2082
  (void)snprintf(tbFName, sizeof(tbFName), "%s.%s", alterReq->objname, alterReq->tabName);
36✔
2083
  int32_t len = strlen(tbFName) + 1;
36✔
2084

2085
  if (taosHashRemove(hash, tbFName, len) != 0) {
36✔
2086
    TAOS_RETURN(0);  // not found
4✔
2087
  }
2088

2089
  int32_t  dbKeyLen = strlen(alterReq->objname) + 1;
32✔
2090
  int32_t *currRef = taosHashGet(useDbHash, alterReq->objname, dbKeyLen);
32✔
2091
  if (NULL == currRef) {
32!
2092
    return 0;
×
2093
  }
2094

2095
  if (1 == *currRef) {
32✔
2096
    if (taosHashRemove(useDbHash, alterReq->objname, dbKeyLen) != 0) {
25!
2097
      TAOS_RETURN(0);  // not found
×
2098
    }
2099
    return 0;
25✔
2100
  }
2101
  int32_t ref = (*currRef) - 1;
7✔
2102
  TAOS_CHECK_RETURN(taosHashPut(useDbHash, alterReq->objname, dbKeyLen, &ref, sizeof(ref)));
7!
2103

2104
  return 0;
7✔
2105
}
2106

2107
static char *mndUserAuditTypeStr(int32_t type) {
35✔
2108
  if (type == TSDB_ALTER_USER_PASSWD) {
35!
2109
    return "changePassword";
35✔
2110
  }
2111
  if (type == TSDB_ALTER_USER_SUPERUSER) {
×
2112
    return "changeSuperUser";
×
2113
  }
2114
  if (type == TSDB_ALTER_USER_ENABLE) {
×
2115
    return "enableUser";
×
2116
  }
2117
  if (type == TSDB_ALTER_USER_SYSINFO) {
×
2118
    return "userSysInfo";
×
2119
  }
2120
  if (type == TSDB_ALTER_USER_CREATEDB) {
×
2121
    return "userCreateDB";
×
2122
  }
2123
  return "error";
×
2124
}
2125

2126
static int32_t mndProcessAlterUserPrivilegesReq(SAlterUserReq *pAlterReq, SMnode *pMnode, SUserObj *pNewUser) {
1,079✔
2127
  SSdb   *pSdb = pMnode->pSdb;
1,079✔
2128
  void   *pIter = NULL;
1,079✔
2129
  int32_t code = 0;
1,079✔
2130
  int32_t lino = 0;
1,079✔
2131

2132
  if (ALTER_USER_ADD_READ_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
1,079✔
2133
      ALTER_USER_ADD_ALL_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,017!
2134
    if (strcmp(pAlterReq->objname, "1.*") != 0) {
62✔
2135
      int32_t len = strlen(pAlterReq->objname) + 1;
52✔
2136
      SDbObj *pDb = mndAcquireDb(pMnode, pAlterReq->objname);
52✔
2137
      if (pDb == NULL) {
52✔
2138
        mndReleaseDb(pMnode, pDb);
6✔
2139
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);  // TODO: refactor the terrno to code
6!
2140
      }
2141
      if ((code = taosHashPut(pNewUser->readDbs, pAlterReq->objname, len, pAlterReq->objname, TSDB_DB_FNAME_LEN)) !=
46!
2142
          0) {
2143
        mndReleaseDb(pMnode, pDb);
×
2144
        TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2145
      }
2146
      mndReleaseDb(pMnode, pDb);
46✔
2147
    } else {
2148
      while (1) {
16✔
2149
        SDbObj *pDb = NULL;
26✔
2150
        pIter = sdbFetch(pSdb, SDB_DB, pIter, (void **)&pDb);
26✔
2151
        if (pIter == NULL) break;
26✔
2152
        int32_t len = strlen(pDb->name) + 1;
16✔
2153
        if ((code = taosHashPut(pNewUser->readDbs, pDb->name, len, pDb->name, TSDB_DB_FNAME_LEN)) != 0) {
16!
2154
          sdbRelease(pSdb, pDb);
×
2155
          sdbCancelFetch(pSdb, pIter);
×
2156
          TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2157
        }
2158
        sdbRelease(pSdb, pDb);
16✔
2159
      }
2160
    }
2161
  }
2162

2163
  if (ALTER_USER_ADD_WRITE_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
1,073✔
2164
      ALTER_USER_ADD_ALL_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,020!
2165
    if (strcmp(pAlterReq->objname, "1.*") != 0) {
53✔
2166
      int32_t len = strlen(pAlterReq->objname) + 1;
44✔
2167
      SDbObj *pDb = mndAcquireDb(pMnode, pAlterReq->objname);
44✔
2168
      if (pDb == NULL) {
44✔
2169
        mndReleaseDb(pMnode, pDb);
1✔
2170
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);  // TODO: refactor the terrno to code
1!
2171
      }
2172
      if ((code = taosHashPut(pNewUser->writeDbs, pAlterReq->objname, len, pAlterReq->objname, TSDB_DB_FNAME_LEN)) !=
43!
2173
          0) {
2174
        mndReleaseDb(pMnode, pDb);
×
2175
        TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2176
      }
2177
      mndReleaseDb(pMnode, pDb);
43✔
2178
    } else {
2179
      while (1) {
15✔
2180
        SDbObj *pDb = NULL;
24✔
2181
        pIter = sdbFetch(pSdb, SDB_DB, pIter, (void **)&pDb);
24✔
2182
        if (pIter == NULL) break;
24✔
2183
        int32_t len = strlen(pDb->name) + 1;
15✔
2184
        if ((code = taosHashPut(pNewUser->writeDbs, pDb->name, len, pDb->name, TSDB_DB_FNAME_LEN)) != 0) {
15!
2185
          sdbRelease(pSdb, pDb);
×
2186
          sdbCancelFetch(pSdb, pIter);
×
2187
          TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2188
        }
2189
        sdbRelease(pSdb, pDb);
15✔
2190
      }
2191
    }
2192
  }
2193

2194
  if (ALTER_USER_DEL_READ_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
1,072✔
2195
      ALTER_USER_DEL_ALL_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,031!
2196
    if (strcmp(pAlterReq->objname, "1.*") != 0) {
41✔
2197
      int32_t len = strlen(pAlterReq->objname) + 1;
31✔
2198
      SDbObj *pDb = mndAcquireDb(pMnode, pAlterReq->objname);
31✔
2199
      if (pDb == NULL) {
31✔
2200
        mndReleaseDb(pMnode, pDb);
1✔
2201
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);  // TODO: refactor the terrno to code
1!
2202
      }
2203
      code = taosHashRemove(pNewUser->readDbs, pAlterReq->objname, len);
30✔
2204
      if (code < 0) {
30!
2205
        mError("read db:%s, failed to remove db:%s since %s", pNewUser->user, pAlterReq->objname, terrstr());
×
2206
      }
2207
      mndReleaseDb(pMnode, pDb);
30✔
2208
    } else {
2209
      taosHashClear(pNewUser->readDbs);
10✔
2210
    }
2211
  }
2212

2213
  if (ALTER_USER_DEL_WRITE_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
1,071✔
2214
      ALTER_USER_DEL_ALL_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,034!
2215
    if (strcmp(pAlterReq->objname, "1.*") != 0) {
37✔
2216
      int32_t len = strlen(pAlterReq->objname) + 1;
26✔
2217
      SDbObj *pDb = mndAcquireDb(pMnode, pAlterReq->objname);
26✔
2218
      if (pDb == NULL) {
26!
2219
        mndReleaseDb(pMnode, pDb);
×
2220
        TAOS_CHECK_GOTO(terrno, &lino, _OVER);  // TODO: refactor the terrno to code
×
2221
      }
2222
      code = taosHashRemove(pNewUser->writeDbs, pAlterReq->objname, len);
26✔
2223
      if (code < 0) {
26!
2224
        mError("user:%s, failed to remove db:%s since %s", pNewUser->user, pAlterReq->objname, terrstr());
×
2225
      }
2226
      mndReleaseDb(pMnode, pDb);
26✔
2227
    } else {
2228
      taosHashClear(pNewUser->writeDbs);
11✔
2229
    }
2230
  }
2231

2232
  SHashObj *pReadTbs = pNewUser->readTbs;
1,071✔
2233
  SHashObj *pWriteTbs = pNewUser->writeTbs;
1,071✔
2234
  SHashObj *pAlterTbs = pNewUser->alterTbs;
1,071✔
2235

2236
#ifdef TD_ENTERPRISE
2237
  if (pAlterReq->isView) {
1,071✔
2238
    pReadTbs = pNewUser->readViews;
19✔
2239
    pWriteTbs = pNewUser->writeViews;
19✔
2240
    pAlterTbs = pNewUser->alterViews;
19✔
2241
  }
2242
#endif
2243

2244
  if (ALTER_USER_ADD_READ_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
1,071✔
2245
      ALTER_USER_ADD_ALL_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
628!
2246
    TAOS_CHECK_GOTO(mndTablePriviledge(pMnode, pReadTbs, pNewUser->useDbs, pAlterReq, pSdb), &lino, _OVER);
443!
2247
  }
2248

2249
  if (ALTER_USER_ADD_WRITE_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
1,071✔
2250
      ALTER_USER_ADD_ALL_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
631!
2251
    TAOS_CHECK_GOTO(mndTablePriviledge(pMnode, pWriteTbs, pNewUser->useDbs, pAlterReq, pSdb), &lino, _OVER);
440!
2252
  }
2253

2254
  if (ALTER_USER_ADD_ALTER_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
1,071✔
2255
      ALTER_USER_ADD_ALL_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,055!
2256
    TAOS_CHECK_GOTO(mndTablePriviledge(pMnode, pAlterTbs, pNewUser->useDbs, pAlterReq, pSdb), &lino, _OVER);
16!
2257
  }
2258

2259
  if (ALTER_USER_DEL_READ_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
1,071✔
2260
      ALTER_USER_DEL_ALL_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,052!
2261
    TAOS_CHECK_GOTO(mndRemoveTablePriviledge(pMnode, pReadTbs, pNewUser->useDbs, pAlterReq, pSdb), &lino, _OVER);
19!
2262
  }
2263

2264
  if (ALTER_USER_DEL_WRITE_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
1,071✔
2265
      ALTER_USER_DEL_ALL_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,058!
2266
    TAOS_CHECK_GOTO(mndRemoveTablePriviledge(pMnode, pWriteTbs, pNewUser->useDbs, pAlterReq, pSdb), &lino, _OVER);
13!
2267
  }
2268

2269
  if (ALTER_USER_DEL_ALTER_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
1,071!
2270
      ALTER_USER_DEL_ALL_TB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
1,067!
2271
    TAOS_CHECK_GOTO(mndRemoveTablePriviledge(pMnode, pAlterTbs, pNewUser->useDbs, pAlterReq, pSdb), &lino, _OVER);
4!
2272
  }
2273

2274
  if (ALTER_USER_ADD_SUBSCRIBE_TOPIC_PRIV(pAlterReq->alterType, pAlterReq->privileges)) {
1,071✔
2275
    int32_t      len = strlen(pAlterReq->objname) + 1;
17✔
2276
    SMqTopicObj *pTopic = NULL;
17✔
2277
    if ((code = mndAcquireTopic(pMnode, pAlterReq->objname, &pTopic)) != 0) {
17!
2278
      mndReleaseTopic(pMnode, pTopic);
×
2279
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2280
    }
2281
    if ((code = taosHashPut(pNewUser->topics, pTopic->name, len, pTopic->name, TSDB_TOPIC_FNAME_LEN)) != 0) {
17!
2282
      mndReleaseTopic(pMnode, pTopic);
×
2283
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2284
    }
2285
    mndReleaseTopic(pMnode, pTopic);
17✔
2286
  }
2287

2288
  if (ALTER_USER_DEL_SUBSCRIBE_TOPIC_PRIV(pAlterReq->alterType, pAlterReq->privileges)) {
1,071✔
2289
    int32_t      len = strlen(pAlterReq->objname) + 1;
12✔
2290
    SMqTopicObj *pTopic = NULL;
12✔
2291
    if ((code = mndAcquireTopic(pMnode, pAlterReq->objname, &pTopic)) != 0) {
12✔
2292
      mndReleaseTopic(pMnode, pTopic);
1✔
2293
      TAOS_CHECK_GOTO(code, &lino, _OVER);
1!
2294
    }
2295
    code = taosHashRemove(pNewUser->topics, pAlterReq->objname, len);
11✔
2296
    if (code < 0) {
11!
2297
      mError("user:%s, failed to remove topic:%s since %s", pNewUser->user, pAlterReq->objname, tstrerror(code));
×
2298
    }
2299
    mndReleaseTopic(pMnode, pTopic);
11✔
2300
  }
2301

2302
_OVER:
1,059✔
2303
  if (code < 0) {
1,079✔
2304
    mError("user:%s, failed to alter user privileges at line %d since %s", pAlterReq->user, lino, tstrerror(code));
9!
2305
  }
2306
  TAOS_RETURN(code);
1,079✔
2307
}
2308

2309
static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) {
1,225✔
2310
  SMnode       *pMnode = pReq->info.node;
1,225✔
2311
  SSdb         *pSdb = pMnode->pSdb;
1,225✔
2312
  void         *pIter = NULL;
1,225✔
2313
  int32_t       code = 0;
1,225✔
2314
  int32_t       lino = 0;
1,225✔
2315
  SUserObj     *pUser = NULL;
1,225✔
2316
  SUserObj     *pOperUser = NULL;
1,225✔
2317
  SUserObj      newUser = {0};
1,225✔
2318
  SAlterUserReq alterReq = {0};
1,225✔
2319

2320
  TAOS_CHECK_GOTO(tDeserializeSAlterUserReq(pReq->pCont, pReq->contLen, &alterReq), &lino, _OVER);
1,225!
2321

2322
  mInfo("user:%s, start to alter", alterReq.user);
1,225!
2323

2324
  if (alterReq.user[0] == 0) {
1,225!
2325
    TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_USER_FORMAT, &lino, _OVER);
×
2326
  }
2327

2328
  if (TSDB_ALTER_USER_PASSWD == alterReq.alterType &&
1,225✔
2329
      (alterReq.pass[0] == 0 || strlen(alterReq.pass) >= TSDB_PASSWORD_LEN)) {
42!
2330
    TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_PASS_FORMAT, &lino, _OVER);
×
2331
  }
2332

2333
  TAOS_CHECK_GOTO(mndAcquireUser(pMnode, alterReq.user, &pUser), &lino, _OVER);
1,225✔
2334

2335
  (void)mndAcquireUser(pMnode, pReq->info.conn.user, &pOperUser);
1,203✔
2336
  if (pOperUser == NULL) {
1,203!
2337
    TAOS_CHECK_GOTO(TSDB_CODE_MND_NO_USER_FROM_CONN, &lino, _OVER);
×
2338
  }
2339

2340
  TAOS_CHECK_GOTO(mndCheckAlterUserPrivilege(pOperUser, pUser, &alterReq), &lino, _OVER);
1,203✔
2341

2342
  TAOS_CHECK_GOTO(mndUserDupObj(pUser, &newUser), &lino, _OVER);
1,154!
2343

2344
  if (alterReq.alterType == TSDB_ALTER_USER_PASSWD) {
1,154✔
2345
    char pass[TSDB_PASSWORD_LEN + 1] = {0};
35✔
2346
    taosEncryptPass_c((uint8_t *)alterReq.pass, strlen(alterReq.pass), pass);
35✔
2347
    (void)memcpy(newUser.pass, pass, TSDB_PASSWORD_LEN);
35✔
2348
    if (0 != strncmp(pUser->pass, pass, TSDB_PASSWORD_LEN)) {
35✔
2349
      ++newUser.passVersion;
31✔
2350
    }
2351
  }
2352

2353
  if (alterReq.alterType == TSDB_ALTER_USER_SUPERUSER) {
1,154!
2354
    newUser.superUser = alterReq.superUser;
×
2355
  }
2356

2357
  if (alterReq.alterType == TSDB_ALTER_USER_ENABLE) {
1,154✔
2358
    newUser.enable = alterReq.enable;
6✔
2359
  }
2360

2361
  if (alterReq.alterType == TSDB_ALTER_USER_SYSINFO) {
1,154✔
2362
    newUser.sysInfo = alterReq.sysInfo;
15✔
2363
  }
2364

2365
  if (alterReq.alterType == TSDB_ALTER_USER_CREATEDB) {
1,154✔
2366
    newUser.createdb = alterReq.createdb;
17✔
2367
  }
2368

2369
  if (ALTER_USER_ADD_PRIVS(alterReq.alterType) || ALTER_USER_DEL_PRIVS(alterReq.alterType)) {
1,154✔
2370
    TAOS_CHECK_GOTO(mndProcessAlterUserPrivilegesReq(&alterReq, pMnode, &newUser), &lino, _OVER);
1,079✔
2371
  }
2372

2373
  if (alterReq.alterType == TSDB_ALTER_USER_ADD_WHITE_LIST) {
1,145✔
2374
    taosMemoryFreeClear(newUser.pIpWhiteList);
1!
2375

2376
    int32_t       num = pUser->pIpWhiteList->num + alterReq.numIpRanges;
1✔
2377
    int32_t       idx = pUser->pIpWhiteList->num;
1✔
2378
    SIpWhiteList *pNew = taosMemoryCalloc(1, sizeof(SIpWhiteList) + sizeof(SIpV4Range) * num);
1✔
2379

2380
    if (pNew == NULL) {
1!
2381
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
2382
    }
2383

2384
    bool exist = false;
1✔
2385
    (void)memcpy(pNew->pIpRange, pUser->pIpWhiteList->pIpRange, sizeof(SIpV4Range) * idx);
1✔
2386
    for (int i = 0; i < alterReq.numIpRanges; i++) {
2✔
2387
      SIpV4Range *range = &(alterReq.pIpRanges[i]);
1✔
2388
      if (!isRangeInIpWhiteList(pUser->pIpWhiteList, range)) {
1!
2389
        // already exist, just ignore;
2390
        (void)memcpy(&pNew->pIpRange[idx], range, sizeof(SIpV4Range));
1✔
2391
        idx++;
1✔
2392
        continue;
1✔
2393
      } else {
2394
        exist = true;
×
2395
      }
2396
    }
2397
    if (exist) {
1!
2398
      taosMemoryFree(pNew);
×
2399
      TAOS_CHECK_GOTO(TSDB_CODE_MND_USER_HOST_EXIST, &lino, _OVER);
×
2400
    }
2401
    pNew->num = idx;
1✔
2402
    newUser.pIpWhiteList = pNew;
1✔
2403
    newUser.ipWhiteListVer = pUser->ipWhiteListVer + 1;
1✔
2404

2405
    if (pNew->num > MND_MAX_USE_HOST) {
1!
2406
      TAOS_CHECK_GOTO(TSDB_CODE_MND_TOO_MANY_USER_HOST, &lino, _OVER);
×
2407
    }
2408
  }
2409
  if (alterReq.alterType == TSDB_ALTER_USER_DROP_WHITE_LIST) {
1,145✔
2410
    taosMemoryFreeClear(newUser.pIpWhiteList);
1!
2411

2412
    int32_t       num = pUser->pIpWhiteList->num;
1✔
2413
    bool          noexist = true;
1✔
2414
    bool          localHost = false;
1✔
2415
    SIpWhiteList *pNew = taosMemoryCalloc(1, sizeof(SIpWhiteList) + sizeof(SIpV4Range) * num);
1✔
2416

2417
    if (pNew == NULL) {
1!
2418
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
2419
    }
2420

2421
    if (pUser->pIpWhiteList->num > 0) {
1!
2422
      int idx = 0;
1✔
2423
      for (int i = 0; i < pUser->pIpWhiteList->num; i++) {
3✔
2424
        SIpV4Range *oldRange = &pUser->pIpWhiteList->pIpRange[i];
2✔
2425
        bool        found = false;
2✔
2426
        for (int j = 0; j < alterReq.numIpRanges; j++) {
4✔
2427
          SIpV4Range *range = &alterReq.pIpRanges[j];
2✔
2428
          if (isDefaultRange(range)) {
2!
2429
            localHost = true;
×
2430
            break;
×
2431
          }
2432
          if (isIpRangeEqual(oldRange, range)) {
2!
2433
            found = true;
×
2434
            break;
×
2435
          }
2436
        }
2437
        if (localHost) break;
2!
2438

2439
        if (found == false) {
2!
2440
          (void)memcpy(&pNew->pIpRange[idx], oldRange, sizeof(SIpV4Range));
2✔
2441
          idx++;
2✔
2442
        } else {
2443
          noexist = false;
×
2444
        }
2445
      }
2446
      pNew->num = idx;
1✔
2447
      newUser.pIpWhiteList = pNew;
1✔
2448
      newUser.ipWhiteListVer = pUser->ipWhiteListVer + 1;
1✔
2449

2450
    } else {
2451
      pNew->num = 0;
×
2452
      newUser.pIpWhiteList = pNew;
×
2453
      newUser.ipWhiteListVer = pUser->ipWhiteListVer + 1;
×
2454
    }
2455

2456
    if (localHost) {
1!
2457
      TAOS_CHECK_GOTO(TSDB_CODE_MND_USER_LOCAL_HOST_NOT_DROP, &lino, _OVER);
×
2458
    }
2459
    if (noexist) {
1!
2460
      TAOS_CHECK_GOTO(TSDB_CODE_MND_USER_HOST_NOT_EXIST, &lino, _OVER);
1!
2461
    }
2462
  }
2463

2464
  code = mndAlterUser(pMnode, pUser, &newUser, pReq);
1,144✔
2465
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
1,144✔
2466

2467
  if (alterReq.alterType == TSDB_ALTER_USER_PASSWD) {
1,144✔
2468
    char detail[1000] = {0};
35✔
2469
    (void)sprintf(detail, "alterType:%s, enable:%d, superUser:%d, sysInfo:%d, createdb:%d, tabName:%s, password:xxx",
70✔
2470
                  mndUserAuditTypeStr(alterReq.alterType), alterReq.enable, alterReq.superUser, alterReq.sysInfo,
35✔
2471
                  alterReq.createdb ? 1 : 0, alterReq.tabName);
35✔
2472
    auditRecord(pReq, pMnode->clusterId, "alterUser", "", alterReq.user, detail, strlen(detail));
35✔
2473
  } else if (alterReq.alterType == TSDB_ALTER_USER_SUPERUSER || alterReq.alterType == TSDB_ALTER_USER_ENABLE ||
1,109!
2474
             alterReq.alterType == TSDB_ALTER_USER_SYSINFO || alterReq.alterType == TSDB_ALTER_USER_CREATEDB) {
1,103✔
2475
    auditRecord(pReq, pMnode->clusterId, "alterUser", "", alterReq.user, alterReq.sql, alterReq.sqlLen);
38✔
2476
  } else if (ALTER_USER_ADD_READ_DB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
1,071✔
2477
             ALTER_USER_ADD_WRITE_DB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
1,015✔
2478
             ALTER_USER_ADD_ALL_DB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
988!
2479
             ALTER_USER_ADD_READ_TB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
988!
2480
             ALTER_USER_ADD_WRITE_TB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
545!
2481
             ALTER_USER_ADD_ALL_TB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName)) {
117!
2482
    if (strcmp(alterReq.objname, "1.*") != 0) {
954✔
2483
      SName name = {0};
940✔
2484
      TAOS_CHECK_GOTO(tNameFromString(&name, alterReq.objname, T_NAME_ACCT | T_NAME_DB), &lino, _OVER);
940!
2485
      auditRecord(pReq, pMnode->clusterId, "GrantPrivileges", name.dbname, alterReq.user, alterReq.sql,
940✔
2486
                  alterReq.sqlLen);
2487
    } else {
2488
      auditRecord(pReq, pMnode->clusterId, "GrantPrivileges", "", alterReq.user, alterReq.sql, alterReq.sqlLen);
14✔
2489
    }
2490
  } else if (ALTER_USER_ADD_SUBSCRIBE_TOPIC_PRIV(alterReq.alterType, alterReq.privileges)) {
117✔
2491
    auditRecord(pReq, pMnode->clusterId, "GrantPrivileges", alterReq.objname, alterReq.user, alterReq.sql,
17✔
2492
                alterReq.sqlLen);
2493
  } else if (ALTER_USER_DEL_SUBSCRIBE_TOPIC_PRIV(alterReq.alterType, alterReq.privileges)) {
100✔
2494
    auditRecord(pReq, pMnode->clusterId, "RevokePrivileges", alterReq.objname, alterReq.user, alterReq.sql,
11✔
2495
                alterReq.sqlLen);
2496
  } else {
2497
    if (strcmp(alterReq.objname, "1.*") != 0) {
89✔
2498
      SName name = {0};
73✔
2499
      TAOS_CHECK_GOTO(tNameFromString(&name, alterReq.objname, T_NAME_ACCT | T_NAME_DB), &lino, _OVER);
73✔
2500
      auditRecord(pReq, pMnode->clusterId, "RevokePrivileges", name.dbname, alterReq.user, alterReq.sql,
72✔
2501
                  alterReq.sqlLen);
2502
    } else {
2503
      auditRecord(pReq, pMnode->clusterId, "RevokePrivileges", "", alterReq.user, alterReq.sql, alterReq.sqlLen);
16✔
2504
    }
2505
  }
2506

2507
_OVER:
1,225✔
2508
  if (code < 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
1,225✔
2509
    mError("user:%s, failed to alter at line %d since %s", alterReq.user, lino, tstrerror(code));
83!
2510
  }
2511

2512
  tFreeSAlterUserReq(&alterReq);
1,225✔
2513
  mndReleaseUser(pMnode, pOperUser);
1,225✔
2514
  mndReleaseUser(pMnode, pUser);
1,225✔
2515
  mndUserFreeObj(&newUser);
1,225✔
2516

2517
  TAOS_RETURN(code);
1,225✔
2518
}
2519

2520
static int32_t mndDropUser(SMnode *pMnode, SRpcMsg *pReq, SUserObj *pUser) {
53✔
2521
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pReq, "drop-user");
53✔
2522
  if (pTrans == NULL) {
53!
2523
    mError("user:%s, failed to drop since %s", pUser->user, terrstr());
×
2524
    TAOS_RETURN(terrno);
×
2525
  }
2526
  mInfo("trans:%d, used to drop user:%s", pTrans->id, pUser->user);
53!
2527

2528
  SSdbRaw *pCommitRaw = mndUserActionEncode(pUser);
53✔
2529
  if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
53!
2530
    mError("trans:%d, failed to append commit log since %s", pTrans->id, terrstr());
×
2531
    mndTransDrop(pTrans);
×
2532
    TAOS_RETURN(terrno);
×
2533
  }
2534
  if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED) < 0) {
53!
2535
    mndTransDrop(pTrans);
×
2536
    TAOS_RETURN(terrno);
×
2537
  }
2538

2539
  if (mndTransPrepare(pMnode, pTrans) != 0) {
53!
2540
    mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
×
2541
    mndTransDrop(pTrans);
×
2542
    TAOS_RETURN(terrno);
×
2543
  }
2544
  (void)ipWhiteMgtRemove(pUser->user);
53✔
2545

2546
  mndTransDrop(pTrans);
53✔
2547
  TAOS_RETURN(0);
53✔
2548
}
2549

2550
static int32_t mndProcessDropUserReq(SRpcMsg *pReq) {
54✔
2551
  SMnode      *pMnode = pReq->info.node;
54✔
2552
  int32_t      code = 0;
54✔
2553
  int32_t      lino = 0;
54✔
2554
  SUserObj    *pUser = NULL;
54✔
2555
  SDropUserReq dropReq = {0};
54✔
2556

2557
  TAOS_CHECK_GOTO(tDeserializeSDropUserReq(pReq->pCont, pReq->contLen, &dropReq), &lino, _OVER);
54!
2558

2559
  mInfo("user:%s, start to drop", dropReq.user);
54!
2560
  TAOS_CHECK_GOTO(mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_USER), &lino, _OVER);
54!
2561

2562
  if (dropReq.user[0] == 0) {
54!
2563
    TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_USER_FORMAT, &lino, _OVER);
×
2564
  }
2565

2566
  TAOS_CHECK_GOTO(mndAcquireUser(pMnode, dropReq.user, &pUser), &lino, _OVER);
54✔
2567

2568
  TAOS_CHECK_GOTO(mndDropUser(pMnode, pReq, pUser), &lino, _OVER);
53!
2569
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
53!
2570

2571
  auditRecord(pReq, pMnode->clusterId, "dropUser", "", dropReq.user, dropReq.sql, dropReq.sqlLen);
53✔
2572

2573
_OVER:
54✔
2574
  if (code < 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
54!
2575
    mError("user:%s, failed to drop at line %d since %s", dropReq.user, lino, tstrerror(code));
1!
2576
  }
2577

2578
  mndReleaseUser(pMnode, pUser);
54✔
2579
  tFreeSDropUserReq(&dropReq);
54✔
2580
  TAOS_RETURN(code);
54✔
2581
}
2582

2583
static int32_t mndProcessGetUserAuthReq(SRpcMsg *pReq) {
388,697✔
2584
  SMnode         *pMnode = pReq->info.node;
388,697✔
2585
  int32_t         code = 0;
388,697✔
2586
  int32_t         lino = 0;
388,697✔
2587
  int32_t         contLen = 0;
388,697✔
2588
  void           *pRsp = NULL;
388,697✔
2589
  SUserObj       *pUser = NULL;
388,697✔
2590
  SGetUserAuthReq authReq = {0};
388,697✔
2591
  SGetUserAuthRsp authRsp = {0};
388,697✔
2592

2593
  TAOS_CHECK_EXIT(tDeserializeSGetUserAuthReq(pReq->pCont, pReq->contLen, &authReq));
388,697!
2594
  mTrace("user:%s, start to get auth", authReq.user);
388,697✔
2595

2596
  TAOS_CHECK_EXIT(mndAcquireUser(pMnode, authReq.user, &pUser));
388,697✔
2597

2598
  TAOS_CHECK_EXIT(mndSetUserAuthRsp(pMnode, pUser, &authRsp));
388,693!
2599

2600
  contLen = tSerializeSGetUserAuthRsp(NULL, 0, &authRsp);
388,695✔
2601
  if (contLen < 0) {
388,687!
2602
    TAOS_CHECK_EXIT(contLen);
×
2603
  }
2604
  pRsp = rpcMallocCont(contLen);
388,687✔
2605
  if (pRsp == NULL) {
388,688!
2606
    TAOS_CHECK_EXIT(terrno);
×
2607
  }
2608

2609
  contLen = tSerializeSGetUserAuthRsp(pRsp, contLen, &authRsp);
388,688✔
2610
  if (contLen < 0) {
388,694!
2611
    TAOS_CHECK_EXIT(contLen);
×
2612
  }
2613

2614
_exit:
388,694✔
2615
  mndReleaseUser(pMnode, pUser);
388,696✔
2616
  tFreeSGetUserAuthRsp(&authRsp);
388,697✔
2617
  if (code < 0) {
388,690✔
2618
    mError("user:%s, failed to get auth at line %d since %s", authReq.user, lino, tstrerror(code));
2!
2619
    rpcFreeCont(pRsp);
2✔
2620
    pRsp = NULL;
2✔
2621
    contLen = 0;
2✔
2622
  }
2623
  pReq->info.rsp = pRsp;
388,690✔
2624
  pReq->info.rspLen = contLen;
388,690✔
2625
  pReq->code = code;
388,690✔
2626

2627
  TAOS_RETURN(code);
388,690✔
2628
}
2629

2630
static int32_t mndRetrieveUsers(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
5,077✔
2631
  SMnode   *pMnode = pReq->info.node;
5,077✔
2632
  SSdb     *pSdb = pMnode->pSdb;
5,077✔
2633
  int32_t   code = 0;
5,077✔
2634
  int32_t   lino = 0;
5,077✔
2635
  int32_t   numOfRows = 0;
5,077✔
2636
  SUserObj *pUser = NULL;
5,077✔
2637
  int32_t   cols = 0;
5,077✔
2638
  int8_t    flag = 0;
5,077✔
2639
  char     *pWrite = NULL;
5,077✔
2640
  char     *buf = NULL;
5,077✔
2641
  char     *varstr = NULL;
5,077✔
2642

2643
  while (numOfRows < rows) {
10,235!
2644
    pShow->pIter = sdbFetch(pSdb, SDB_USER, pShow->pIter, (void **)&pUser);
10,237✔
2645
    if (pShow->pIter == NULL) break;
10,240✔
2646

2647
    cols = 0;
5,157✔
2648
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
5,157✔
2649
    char             name[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
5,157✔
2650
    STR_WITH_MAXSIZE_TO_VARSTR(name, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
5,157✔
2651
    COL_DATA_SET_VAL_GOTO((const char *)name, false, pUser, _exit);
5,157!
2652

2653
    cols++;
5,156✔
2654
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
5,156✔
2655
    COL_DATA_SET_VAL_GOTO((const char *)&pUser->superUser, false, pUser, _exit);
5,156!
2656

2657
    cols++;
5,152✔
2658
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
5,152✔
2659
    COL_DATA_SET_VAL_GOTO((const char *)&pUser->enable, false, pUser, _exit);
5,152!
2660

2661
    cols++;
5,154✔
2662
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
5,154✔
2663
    COL_DATA_SET_VAL_GOTO((const char *)&pUser->sysInfo, false, pUser, _exit);
5,151!
2664

2665
    cols++;
5,153✔
2666
    flag = pUser->createdb ? 1 : 0;
5,153✔
2667
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
5,153✔
2668
    COL_DATA_SET_VAL_GOTO((const char *)&flag, false, pUser, _exit);
5,152!
2669

2670
    cols++;
5,150✔
2671
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
5,150✔
2672
    COL_DATA_SET_VAL_GOTO((const char *)&pUser->createdTime, false, pUser, _exit);
5,149!
2673

2674
    cols++;
5,154✔
2675

2676
    int32_t tlen = convertIpWhiteListToStr(pUser->pIpWhiteList, &buf);
5,154✔
2677
    // int32_t tlen = mndFetchIpWhiteList(pUser->pIpWhiteList, &buf);
2678
    if (tlen != 0) {
5,149!
2679
      TAOS_MEMORY_REALLOC(varstr, VARSTR_HEADER_SIZE + tlen);
5,149!
2680
      if (varstr == NULL) {
5,157!
2681
        sdbRelease(pSdb, pUser);
×
2682
        TAOS_CHECK_GOTO(terrno, &lino, _exit);
×
2683
      }
2684
      varDataSetLen(varstr, tlen);
5,157✔
2685
      (void)memcpy(varDataVal(varstr), buf, tlen);
5,157✔
2686

2687
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
5,157✔
2688
      COL_DATA_SET_VAL_GOTO((const char *)varstr, false, pUser, _exit);
5,154!
2689

2690
      taosMemoryFreeClear(buf);
5,157✔
2691
    } else {
2692
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2693
      COL_DATA_SET_VAL_GOTO((const char *)NULL, true, pUser, _exit);
×
2694
    }
2695

2696
    numOfRows++;
5,158✔
2697
    sdbRelease(pSdb, pUser);
5,158✔
2698
  }
2699

2700
  pShow->numOfRows += numOfRows;
5,081✔
2701
_exit:
5,081✔
2702
  taosMemoryFreeClear(buf);
5,081!
2703
  taosMemoryFreeClear(varstr);
5,081!
2704
  if (code < 0) {
5,081!
2705
    uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2706
    TAOS_RETURN(code);
×
2707
  }
2708
  return numOfRows;
5,081✔
2709
}
2710

2711
static int32_t mndRetrieveUsersFull(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
×
2712
  int32_t numOfRows = 0;
×
2713
#ifdef TD_ENTERPRISE
2714
  SMnode   *pMnode = pReq->info.node;
×
2715
  SSdb     *pSdb = pMnode->pSdb;
×
2716
  SUserObj *pUser = NULL;
×
2717
  int32_t   code = 0;
×
2718
  int32_t   lino = 0;
×
2719
  int32_t   cols = 0;
×
2720
  int8_t    flag = 0;
×
2721
  char     *pWrite = NULL;
×
2722
  char     *buf = NULL;
×
2723
  char     *varstr = NULL;
×
2724

2725
  while (numOfRows < rows) {
×
2726
    pShow->pIter = sdbFetch(pSdb, SDB_USER, pShow->pIter, (void **)&pUser);
×
2727
    if (pShow->pIter == NULL) break;
×
2728

2729
    cols = 0;
×
2730
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2731
    char             name[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
×
2732
    STR_WITH_MAXSIZE_TO_VARSTR(name, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
×
2733
    COL_DATA_SET_VAL_GOTO((const char *)name, false, pUser, _exit);
×
2734

2735
    cols++;
×
2736
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2737
    COL_DATA_SET_VAL_GOTO((const char *)&pUser->superUser, false, pUser, _exit);
×
2738

2739
    cols++;
×
2740
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2741
    COL_DATA_SET_VAL_GOTO((const char *)&pUser->enable, false, pUser, _exit);
×
2742

2743
    cols++;
×
2744
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2745
    COL_DATA_SET_VAL_GOTO((const char *)&pUser->sysInfo, false, pUser, _exit);
×
2746

2747
    cols++;
×
2748
    flag = pUser->createdb ? 1 : 0;
×
2749
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2750
    COL_DATA_SET_VAL_GOTO((const char *)&flag, false, pUser, _exit);
×
2751

2752
    // mInfo("pUser->pass:%s", pUser->pass);
2753
    cols++;
×
2754
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2755
    char pass[TSDB_PASSWORD_LEN + VARSTR_HEADER_SIZE] = {0};
×
2756
    STR_WITH_MAXSIZE_TO_VARSTR(pass, pUser->pass, pShow->pMeta->pSchemas[cols].bytes);
×
2757
    COL_DATA_SET_VAL_GOTO((const char *)pass, false, pUser, _exit);
×
2758

2759
    cols++;
×
2760

2761
    int32_t tlen = convertIpWhiteListToStr(pUser->pIpWhiteList, &buf);
×
2762
    // int32_t tlen = mndFetchIpWhiteList(pUser->pIpWhiteList, &buf);
2763
    if (tlen != 0) {
×
2764
      TAOS_MEMORY_REALLOC(varstr, VARSTR_HEADER_SIZE + tlen);
×
2765
      if (varstr == NULL) {
×
2766
        sdbRelease(pSdb, pUser);
×
2767
        TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _exit);
×
2768
      }
2769
      varDataSetLen(varstr, tlen);
×
2770
      (void)memcpy(varDataVal(varstr), buf, tlen);
×
2771

2772
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2773
      COL_DATA_SET_VAL_GOTO((const char *)varstr, false, pUser, _exit);
×
2774

2775
      taosMemoryFreeClear(buf);
×
2776
    } else {
2777
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols);
×
2778
      COL_DATA_SET_VAL_GOTO((const char *)NULL, true, pUser, _exit);
×
2779
    }
2780

2781
    numOfRows++;
×
2782
    sdbRelease(pSdb, pUser);
×
2783
  }
2784

2785
  pShow->numOfRows += numOfRows;
×
2786
_exit:
×
2787
  taosMemoryFreeClear(buf);
×
2788
  taosMemoryFreeClear(varstr);
×
2789
  if (code < 0) {
×
2790
    uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2791
    TAOS_RETURN(code);
×
2792
  }
2793
#endif
2794
  return numOfRows;
×
2795
}
2796

2797
static void mndCancelGetNextUser(SMnode *pMnode, void *pIter) {
×
2798
  SSdb *pSdb = pMnode->pSdb;
×
2799
  sdbCancelFetchByType(pSdb, pIter, SDB_USER);
×
2800
}
×
2801

2802
static int32_t mndLoopHash(SHashObj *hash, char *priType, SSDataBlock *pBlock, int32_t *pNumOfRows, SSdb *pSdb,
26,658✔
2803
                           SUserObj *pUser, SShowObj *pShow, char **condition, char **sql) {
2804
  char   *value = taosHashIterate(hash, NULL);
26,658✔
2805
  char   *user = pUser->user;
26,671✔
2806
  int32_t code = 0;
26,671✔
2807
  int32_t lino = 0;
26,671✔
2808
  int32_t cols = 0;
26,671✔
2809
  int32_t numOfRows = *pNumOfRows;
26,671✔
2810

2811
  while (value != NULL) {
26,701✔
2812
    cols = 0;
30✔
2813
    char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
30✔
2814
    STR_WITH_MAXSIZE_TO_VARSTR(userName, user, pShow->pMeta->pSchemas[cols].bytes);
30✔
2815
    SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
30✔
2816
    COL_DATA_SET_VAL_GOTO((const char *)userName, false, NULL, _exit);
30!
2817

2818
    char privilege[20] = {0};
30✔
2819
    STR_WITH_MAXSIZE_TO_VARSTR(privilege, priType, pShow->pMeta->pSchemas[cols].bytes);
30✔
2820
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
30✔
2821
    COL_DATA_SET_VAL_GOTO((const char *)privilege, false, NULL, _exit);
30!
2822

2823
    size_t keyLen = 0;
30✔
2824
    void  *key = taosHashGetKey(value, &keyLen);
30✔
2825

2826
    char dbName[TSDB_DB_NAME_LEN] = {0};
30✔
2827
    (void)mndExtractShortDbNameFromStbFullName(key, dbName);
30✔
2828
    char dbNameContent[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
30✔
2829
    STR_WITH_MAXSIZE_TO_VARSTR(dbNameContent, dbName, pShow->pMeta->pSchemas[cols].bytes);
30✔
2830
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
30✔
2831
    COL_DATA_SET_VAL_GOTO((const char *)dbNameContent, false, NULL, _exit);
30!
2832

2833
    char tableName[TSDB_TABLE_NAME_LEN] = {0};
30✔
2834
    mndExtractTbNameFromStbFullName(key, tableName, TSDB_TABLE_NAME_LEN);
30✔
2835
    char tableNameContent[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
30✔
2836
    STR_WITH_MAXSIZE_TO_VARSTR(tableNameContent, tableName, pShow->pMeta->pSchemas[cols].bytes);
30✔
2837
    pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
30✔
2838
    COL_DATA_SET_VAL_GOTO((const char *)tableNameContent, false, NULL, _exit);
30!
2839

2840
    if (strcmp("t", value) != 0 && strcmp("v", value) != 0) {
38✔
2841
      SNode  *pAst = NULL;
8✔
2842
      int32_t sqlLen = 0;
8✔
2843
      size_t  bufSz = strlen(value) + 1;
8✔
2844
      if (bufSz < 5) bufSz = 5;
8!
2845
      TAOS_MEMORY_REALLOC(*sql, bufSz + 1);
8!
2846
      if (*sql == NULL) {
8!
2847
        code = terrno;
×
2848
        goto _exit;
×
2849
      }
2850
      TAOS_MEMORY_REALLOC(*condition, TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE);
8!
2851
      if ((*condition) == NULL) {
8!
2852
        code = terrno;
×
2853
        goto _exit;
×
2854
      }
2855

2856
      if (nodesStringToNode(value, &pAst) == 0) {
8!
2857
        if (nodesNodeToSQL(pAst, *sql, bufSz, &sqlLen) != 0) {
8!
2858
          sqlLen = 5;
×
2859
          (void)sprintf(*sql, "error");
×
2860
        }
2861
        nodesDestroyNode(pAst);
8✔
2862
      } else {
2863
        sqlLen = 5;
×
2864
        (void)sprintf(*sql, "error");
×
2865
      }
2866

2867
      STR_WITH_MAXSIZE_TO_VARSTR((*condition), (*sql), pShow->pMeta->pSchemas[cols].bytes);
8✔
2868

2869
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
8✔
2870
      COL_DATA_SET_VAL_GOTO((const char *)(*condition), false, NULL, _exit);
8!
2871

2872
      char notes[2] = {0};
8✔
2873
      STR_WITH_MAXSIZE_TO_VARSTR(notes, "", sizeof(notes));
8✔
2874
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
8✔
2875
      COL_DATA_SET_VAL_GOTO((const char *)notes, false, NULL, _exit);
8!
2876
    } else {
2877
      TAOS_MEMORY_REALLOC(*condition, TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE);
22!
2878
      if ((*condition) == NULL) {
22!
2879
        code = terrno;
×
2880
        goto _exit;
×
2881
      }
2882
      STR_WITH_MAXSIZE_TO_VARSTR((*condition), "", pShow->pMeta->pSchemas[cols].bytes);
22✔
2883
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
22✔
2884
      COL_DATA_SET_VAL_GOTO((const char *)(*condition), false, NULL, _exit);
22!
2885

2886
      char notes[64 + VARSTR_HEADER_SIZE] = {0};
22✔
2887
      STR_WITH_MAXSIZE_TO_VARSTR(notes, value[0] == 'v' ? "view" : "", sizeof(notes));
22✔
2888
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
22✔
2889
      COL_DATA_SET_VAL_GOTO((const char *)notes, false, NULL, _exit);
22!
2890
    }
2891

2892
    numOfRows++;
30✔
2893
    value = taosHashIterate(hash, value);
30✔
2894
  }
2895
  *pNumOfRows = numOfRows;
26,671✔
2896
_exit:
26,671✔
2897
  if (code < 0) {
26,671!
2898
    uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2899
    sdbRelease(pSdb, pUser);
×
2900
  }
2901
  TAOS_RETURN(code);
26,671✔
2902
}
2903

2904
static int32_t mndRetrievePrivileges(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
4,363✔
2905
  int32_t   code = 0;
4,363✔
2906
  int32_t   lino = 0;
4,363✔
2907
  SMnode   *pMnode = pReq->info.node;
4,363✔
2908
  SSdb     *pSdb = pMnode->pSdb;
4,363✔
2909
  int32_t   numOfRows = 0;
4,363✔
2910
  SUserObj *pUser = NULL;
4,363✔
2911
  int32_t   cols = 0;
4,363✔
2912
  char     *pWrite = NULL;
4,363✔
2913
  char     *condition = NULL;
4,363✔
2914
  char     *sql = NULL;
4,363✔
2915

2916
  bool fetchNextUser = pShow->restore ? false : true;
4,363✔
2917
  pShow->restore = false;
4,363✔
2918

2919
  while (numOfRows < rows) {
8,811!
2920
    if (fetchNextUser) {
8,812!
2921
      pShow->pIter = sdbFetch(pSdb, SDB_USER, pShow->pIter, (void **)&pUser);
8,812✔
2922
      if (pShow->pIter == NULL) break;
8,816✔
2923
    } else {
2924
      fetchNextUser = true;
×
2925
      void *pKey = taosHashGetKey(pShow->pIter, NULL);
×
2926
      pUser = sdbAcquire(pSdb, SDB_USER, pKey);
×
2927
      if (!pUser) {
×
2928
        continue;
×
2929
      }
2930
    }
2931

2932
    int32_t numOfReadDbs = taosHashGetSize(pUser->readDbs);
4,451✔
2933
    int32_t numOfWriteDbs = taosHashGetSize(pUser->writeDbs);
4,449✔
2934
    int32_t numOfTopics = taosHashGetSize(pUser->topics);
4,448✔
2935
    int32_t numOfReadTbs = taosHashGetSize(pUser->readTbs);
4,448✔
2936
    int32_t numOfWriteTbs = taosHashGetSize(pUser->writeTbs);
4,448✔
2937
    int32_t numOfAlterTbs = taosHashGetSize(pUser->alterTbs);
4,449✔
2938
    int32_t numOfReadViews = taosHashGetSize(pUser->readViews);
4,450✔
2939
    int32_t numOfWriteViews = taosHashGetSize(pUser->writeViews);
4,449✔
2940
    int32_t numOfAlterViews = taosHashGetSize(pUser->alterViews);
4,447✔
2941
    if (numOfRows + numOfReadDbs + numOfWriteDbs + numOfTopics + numOfReadTbs + numOfWriteTbs + numOfAlterTbs +
4,446✔
2942
            numOfReadViews + numOfWriteViews + numOfAlterViews >=
4,446!
2943
        rows) {
2944
      mInfo(
×
2945
          "will restore. current num of rows: %d, read dbs %d, write dbs %d, topics %d, read tables %d, write tables "
2946
          "%d, alter tables %d, read views %d, write views %d, alter views %d",
2947
          numOfRows, numOfReadDbs, numOfWriteDbs, numOfTopics, numOfReadTbs, numOfWriteTbs, numOfAlterTbs,
2948
          numOfReadViews, numOfWriteViews, numOfAlterViews);
2949
      pShow->restore = true;
×
2950
      sdbRelease(pSdb, pUser);
×
2951
      break;
×
2952
    }
2953

2954
    if (pUser->superUser) {
4,446✔
2955
      cols = 0;
4,360✔
2956
      char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
4,360✔
2957
      STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
4,360✔
2958
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
4,360✔
2959
      COL_DATA_SET_VAL_GOTO((const char *)userName, false, pUser, _exit);
4,356!
2960

2961
      char privilege[20] = {0};
4,363✔
2962
      STR_WITH_MAXSIZE_TO_VARSTR(privilege, "all", pShow->pMeta->pSchemas[cols].bytes);
4,363✔
2963
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
4,363✔
2964
      COL_DATA_SET_VAL_GOTO((const char *)privilege, false, pUser, _exit);
4,361!
2965

2966
      char objName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
4,362✔
2967
      STR_WITH_MAXSIZE_TO_VARSTR(objName, "all", pShow->pMeta->pSchemas[cols].bytes);
4,362✔
2968
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
4,362✔
2969
      COL_DATA_SET_VAL_GOTO((const char *)objName, false, pUser, _exit);
4,363!
2970

2971
      char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
4,361✔
2972
      STR_WITH_MAXSIZE_TO_VARSTR(tableName, "", pShow->pMeta->pSchemas[cols].bytes);
4,361✔
2973
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
4,361✔
2974
      COL_DATA_SET_VAL_GOTO((const char *)tableName, false, pUser, _exit);
4,361!
2975

2976
      TAOS_MEMORY_REALLOC(condition, TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE);
4,357!
2977
      if (condition == NULL) {
4,364!
2978
        sdbRelease(pSdb, pUser);
×
2979
        TAOS_CHECK_GOTO(terrno, &lino, _exit);
×
2980
      }
2981
      STR_WITH_MAXSIZE_TO_VARSTR(condition, "", pShow->pMeta->pSchemas[cols].bytes);
4,364✔
2982
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
4,364✔
2983
      COL_DATA_SET_VAL_GOTO((const char *)condition, false, pUser, _exit);
4,364!
2984

2985
      char notes[2] = {0};
4,363✔
2986
      STR_WITH_MAXSIZE_TO_VARSTR(notes, "", sizeof(notes));
4,363✔
2987
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
4,363✔
2988
      COL_DATA_SET_VAL_GOTO((const char *)notes, false, pUser, _exit);
4,363!
2989

2990
      numOfRows++;
4,364✔
2991
    }
2992

2993
    char *db = taosHashIterate(pUser->readDbs, NULL);
4,450✔
2994
    while (db != NULL) {
4,477✔
2995
      cols = 0;
28✔
2996
      char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
28✔
2997
      STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
28✔
2998
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
28✔
2999
      COL_DATA_SET_VAL_GOTO((const char *)userName, false, pUser, _exit);
28!
3000

3001
      char privilege[20] = {0};
28✔
3002
      STR_WITH_MAXSIZE_TO_VARSTR(privilege, "read", pShow->pMeta->pSchemas[cols].bytes);
28✔
3003
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
28✔
3004
      COL_DATA_SET_VAL_GOTO((const char *)privilege, false, pUser, _exit);
28!
3005

3006
      SName name = {0};
28✔
3007
      char  objName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
28✔
3008
      code = tNameFromString(&name, db, T_NAME_ACCT | T_NAME_DB);
28✔
3009
      if (code < 0) {
28!
3010
        sdbRelease(pSdb, pUser);
×
3011
        TAOS_CHECK_GOTO(code, &lino, _exit);
×
3012
      }
3013
      (void)tNameGetDbName(&name, varDataVal(objName));
28✔
3014
      varDataSetLen(objName, strlen(varDataVal(objName)));
28✔
3015
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
28✔
3016
      COL_DATA_SET_VAL_GOTO((const char *)objName, false, pUser, _exit);
28!
3017

3018
      char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
28✔
3019
      STR_WITH_MAXSIZE_TO_VARSTR(tableName, "", pShow->pMeta->pSchemas[cols].bytes);
28✔
3020
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
28✔
3021
      COL_DATA_SET_VAL_GOTO((const char *)tableName, false, pUser, _exit);
28!
3022

3023
      TAOS_MEMORY_REALLOC(condition, TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE);
28!
3024
      if (condition == NULL) {
28!
3025
        sdbRelease(pSdb, pUser);
×
3026
        TAOS_CHECK_GOTO(terrno, &lino, _exit);
×
3027
      }
3028
      STR_WITH_MAXSIZE_TO_VARSTR(condition, "", pShow->pMeta->pSchemas[cols].bytes);
28✔
3029
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
28✔
3030
      COL_DATA_SET_VAL_GOTO((const char *)condition, false, pUser, _exit);
28!
3031

3032
      char notes[2] = {0};
28✔
3033
      STR_WITH_MAXSIZE_TO_VARSTR(notes, "", sizeof(notes));
28✔
3034
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
28✔
3035
      COL_DATA_SET_VAL_GOTO((const char *)notes, false, pUser, _exit);
28!
3036

3037
      numOfRows++;
28✔
3038
      db = taosHashIterate(pUser->readDbs, db);
28✔
3039
    }
3040

3041
    db = taosHashIterate(pUser->writeDbs, NULL);
4,449✔
3042
    while (db != NULL) {
4,476✔
3043
      cols = 0;
28✔
3044
      char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
28✔
3045
      STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
28✔
3046
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
28✔
3047
      COL_DATA_SET_VAL_GOTO((const char *)userName, false, pUser, _exit);
28!
3048

3049
      char privilege[20] = {0};
28✔
3050
      STR_WITH_MAXSIZE_TO_VARSTR(privilege, "write", pShow->pMeta->pSchemas[cols].bytes);
28✔
3051
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
28✔
3052
      COL_DATA_SET_VAL_GOTO((const char *)privilege, false, pUser, _exit);
28!
3053

3054
      SName name = {0};
28✔
3055
      char  objName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
28✔
3056
      code = tNameFromString(&name, db, T_NAME_ACCT | T_NAME_DB);
28✔
3057
      if (code < 0) {
28!
3058
        sdbRelease(pSdb, pUser);
×
3059
        TAOS_CHECK_GOTO(code, &lino, _exit);
×
3060
      }
3061
      (void)tNameGetDbName(&name, varDataVal(objName));
28✔
3062
      varDataSetLen(objName, strlen(varDataVal(objName)));
28✔
3063
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
28✔
3064
      COL_DATA_SET_VAL_GOTO((const char *)objName, false, pUser, _exit);
28!
3065

3066
      char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
28✔
3067
      STR_WITH_MAXSIZE_TO_VARSTR(tableName, "", pShow->pMeta->pSchemas[cols].bytes);
28✔
3068
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
28✔
3069
      COL_DATA_SET_VAL_GOTO((const char *)tableName, false, pUser, _exit);
28!
3070

3071
      TAOS_MEMORY_REALLOC(condition, TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE);
28!
3072
      if (condition == NULL) {
28!
3073
        sdbRelease(pSdb, pUser);
×
3074
        TAOS_CHECK_GOTO(terrno, &lino, _exit);
×
3075
      }
3076
      STR_WITH_MAXSIZE_TO_VARSTR(condition, "", pShow->pMeta->pSchemas[cols].bytes);
28✔
3077
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
28✔
3078
      COL_DATA_SET_VAL_GOTO((const char *)condition, false, pUser, _exit);
28!
3079

3080
      char notes[2] = {0};
28✔
3081
      STR_WITH_MAXSIZE_TO_VARSTR(notes, "", sizeof(notes));
28✔
3082
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
28✔
3083
      COL_DATA_SET_VAL_GOTO((const char *)notes, false, pUser, _exit);
28!
3084

3085
      numOfRows++;
28✔
3086
      db = taosHashIterate(pUser->writeDbs, db);
28✔
3087
    }
3088

3089
    TAOS_CHECK_EXIT(mndLoopHash(pUser->readTbs, "read", pBlock, &numOfRows, pSdb, pUser, pShow, &condition, &sql));
4,448!
3090

3091
    TAOS_CHECK_EXIT(mndLoopHash(pUser->writeTbs, "write", pBlock, &numOfRows, pSdb, pUser, pShow, &condition, &sql));
4,447!
3092

3093
    TAOS_CHECK_EXIT(mndLoopHash(pUser->alterTbs, "alter", pBlock, &numOfRows, pSdb, pUser, pShow, &condition, &sql));
4,448!
3094

3095
    TAOS_CHECK_EXIT(mndLoopHash(pUser->readViews, "read", pBlock, &numOfRows, pSdb, pUser, pShow, &condition, &sql));
4,448!
3096

3097
    TAOS_CHECK_EXIT(mndLoopHash(pUser->writeViews, "write", pBlock, &numOfRows, pSdb, pUser, pShow, &condition, &sql));
4,450!
3098

3099
    TAOS_CHECK_EXIT(mndLoopHash(pUser->alterViews, "alter", pBlock, &numOfRows, pSdb, pUser, pShow, &condition, &sql));
4,450!
3100

3101
    char *topic = taosHashIterate(pUser->topics, NULL);
4,450✔
3102
    while (topic != NULL) {
4,457✔
3103
      cols = 0;
9✔
3104
      char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
9✔
3105
      STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
9✔
3106
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9✔
3107
      COL_DATA_SET_VAL_GOTO((const char *)userName, false, pUser, _exit);
9!
3108

3109
      char privilege[20] = {0};
9✔
3110
      STR_WITH_MAXSIZE_TO_VARSTR(privilege, "subscribe", pShow->pMeta->pSchemas[cols].bytes);
9✔
3111
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9✔
3112
      COL_DATA_SET_VAL_GOTO((const char *)privilege, false, pUser, _exit);
9!
3113

3114
      char topicName[TSDB_TOPIC_NAME_LEN + VARSTR_HEADER_SIZE + 5] = {0};
9✔
3115
      tstrncpy(varDataVal(topicName), mndGetDbStr(topic), TSDB_TOPIC_NAME_LEN - 2);
9✔
3116
      varDataSetLen(topicName, strlen(varDataVal(topicName)));
9✔
3117
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9✔
3118
      COL_DATA_SET_VAL_GOTO((const char *)topicName, false, pUser, _exit);
9!
3119

3120
      char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
9✔
3121
      STR_WITH_MAXSIZE_TO_VARSTR(tableName, "", pShow->pMeta->pSchemas[cols].bytes);
9✔
3122
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9✔
3123
      COL_DATA_SET_VAL_GOTO((const char *)tableName, false, pUser, _exit);
9!
3124

3125
      TAOS_MEMORY_REALLOC(condition, TSDB_PRIVILEDGE_CONDITION_LEN + VARSTR_HEADER_SIZE);
9!
3126
      if (condition == NULL) {
9!
3127
        sdbRelease(pSdb, pUser);
×
3128
        TAOS_CHECK_GOTO(terrno, &lino, _exit);
×
3129
      }
3130
      STR_WITH_MAXSIZE_TO_VARSTR(condition, "", pShow->pMeta->pSchemas[cols].bytes);
9✔
3131
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9✔
3132
      COL_DATA_SET_VAL_GOTO((const char *)condition, false, pUser, _exit);
9!
3133

3134
      char notes[2] = {0};
9✔
3135
      STR_WITH_MAXSIZE_TO_VARSTR(notes, "", sizeof(notes));
9✔
3136
      pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
9✔
3137
      COL_DATA_SET_VAL_GOTO((const char *)notes, false, pUser, _exit);
9!
3138

3139
      numOfRows++;
9✔
3140
      topic = taosHashIterate(pUser->topics, topic);
9✔
3141
    }
3142

3143
    sdbRelease(pSdb, pUser);
4,448✔
3144
  }
3145

3146
  pShow->numOfRows += numOfRows;
4,364✔
3147
_exit:
4,364✔
3148
  taosMemoryFreeClear(condition);
4,364!
3149
  taosMemoryFreeClear(sql);
4,362✔
3150
  if (code < 0) {
4,362!
3151
    uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3152
    TAOS_RETURN(code);
×
3153
  }
3154
  return numOfRows;
4,362✔
3155
}
3156

3157
static void mndCancelGetNextPrivileges(SMnode *pMnode, void *pIter) {
×
3158
  SSdb *pSdb = pMnode->pSdb;
×
3159
  sdbCancelFetchByType(pSdb, pIter, SDB_USER);
×
3160
}
×
3161

3162
int32_t mndValidateUserAuthInfo(SMnode *pMnode, SUserAuthVersion *pUsers, int32_t numOfUses, void **ppRsp,
223,574✔
3163
                                int32_t *pRspLen, int64_t ipWhiteListVer) {
3164
  int32_t           code = 0;
223,574✔
3165
  int32_t           lino = 0;
223,574✔
3166
  int32_t           rspLen = 0;
223,574✔
3167
  void             *pRsp = NULL;
223,574✔
3168
  SUserAuthBatchRsp batchRsp = {0};
223,574✔
3169

3170
  batchRsp.pArray = taosArrayInit(numOfUses, sizeof(SGetUserAuthRsp));
223,574✔
3171
  if (batchRsp.pArray == NULL) {
223,569!
UNCOV
3172
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
3173
  }
3174

3175
  for (int32_t i = 0; i < numOfUses; ++i) {
448,062✔
3176
    SUserObj *pUser = NULL;
224,482✔
3177
    code = mndAcquireUser(pMnode, pUsers[i].user, &pUser);
224,482✔
3178
    if (pUser == NULL) {
224,484✔
3179
      if (TSDB_CODE_MND_USER_NOT_EXIST == code) {
14!
3180
        SGetUserAuthRsp rsp = {.dropped = 1};
14✔
3181
        (void)memcpy(rsp.user, pUsers[i].user, TSDB_USER_LEN);
14✔
3182
        TSDB_CHECK_NULL(taosArrayPush(batchRsp.pArray, &rsp), code, lino, _OVER, TSDB_CODE_OUT_OF_MEMORY);
28!
3183
      }
3184
      mError("user:%s, failed to auth user since %s", pUsers[i].user, tstrerror(code));
14!
3185
      code = 0;
14✔
3186
      continue;
208,178✔
3187
    }
3188

3189
    pUsers[i].version = ntohl(pUsers[i].version);
224,470✔
3190
    if (pUser->authVersion <= pUsers[i].version && ipWhiteListVer == pMnode->ipWhiteVer) {
224,470✔
3191
      mndReleaseUser(pMnode, pUser);
208,164✔
3192
      continue;
208,164✔
3193
    }
3194

3195
    SGetUserAuthRsp rsp = {0};
16,306✔
3196
    code = mndSetUserAuthRsp(pMnode, pUser, &rsp);
16,306✔
3197
    if (code) {
16,314!
3198
      mndReleaseUser(pMnode, pUser);
×
3199
      tFreeSGetUserAuthRsp(&rsp);
×
3200
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
3201
    }
3202

3203
    if (!(taosArrayPush(batchRsp.pArray, &rsp))) {
32,628!
3204
      code = terrno;
×
3205
      mndReleaseUser(pMnode, pUser);
×
3206
      tFreeSGetUserAuthRsp(&rsp);
×
3207
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
3208
    }
3209
    mndReleaseUser(pMnode, pUser);
16,314✔
3210
  }
3211

3212
  if (taosArrayGetSize(batchRsp.pArray) <= 0) {
223,580✔
3213
    *ppRsp = NULL;
207,406✔
3214
    *pRspLen = 0;
207,406✔
3215

3216
    tFreeSUserAuthBatchRsp(&batchRsp);
207,406✔
3217
    return 0;
207,406✔
3218
  }
3219

3220
  rspLen = tSerializeSUserAuthBatchRsp(NULL, 0, &batchRsp);
16,178✔
3221
  if (rspLen < 0) {
16,178!
3222
    TAOS_CHECK_GOTO(rspLen, &lino, _OVER);
×
3223
  }
3224
  pRsp = taosMemoryMalloc(rspLen);
16,178✔
3225
  if (pRsp == NULL) {
16,178!
3226
    TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
3227
  }
3228
  rspLen = tSerializeSUserAuthBatchRsp(pRsp, rspLen, &batchRsp);
16,178✔
3229
  if (rspLen < 0) {
16,178!
3230
    TAOS_CHECK_GOTO(rspLen, &lino, _OVER);
×
3231
  }
3232
_OVER:
16,178✔
3233
  tFreeSUserAuthBatchRsp(&batchRsp);
16,178✔
3234
  if (code < 0) {
16,178!
3235
    uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3236
    taosMemoryFreeClear(pRsp);
×
3237
    rspLen = 0;
×
3238
  }
3239
  *ppRsp = pRsp;
16,178✔
3240
  *pRspLen = rspLen;
16,178✔
3241

3242
  TAOS_RETURN(code);
16,178✔
3243
}
3244

3245
int32_t mndUserRemoveDb(SMnode *pMnode, STrans *pTrans, char *db) {
2,344✔
3246
  int32_t   code = 0;
2,344✔
3247
  int32_t   lino = 0;
2,344✔
3248
  SSdb     *pSdb = pMnode->pSdb;
2,344✔
3249
  int32_t   len = strlen(db) + 1;
2,344✔
3250
  void     *pIter = NULL;
2,344✔
3251
  SUserObj *pUser = NULL;
2,344✔
3252
  SUserObj  newUser = {0};
2,344✔
3253

3254
  while (1) {
2,551✔
3255
    pIter = sdbFetch(pSdb, SDB_USER, pIter, (void **)&pUser);
4,895✔
3256
    if (pIter == NULL) break;
4,895✔
3257

3258
    if ((code = mndUserDupObj(pUser, &newUser)) != 0) {
2,551!
3259
      break;
×
3260
    }
3261

3262
    bool inRead = (taosHashGet(newUser.readDbs, db, len) != NULL);
2,551✔
3263
    bool inWrite = (taosHashGet(newUser.writeDbs, db, len) != NULL);
2,551✔
3264
    if (inRead || inWrite) {
2,551!
3265
      code = taosHashRemove(newUser.readDbs, db, len);
3✔
3266
      if (code < 0) {
3!
3267
        mError("failed to remove readDbs:%s from user:%s", db, pUser->user);
×
3268
      }
3269
      code = taosHashRemove(newUser.writeDbs, db, len);
3✔
3270
      if (code < 0) {
3!
3271
        mError("failed to remove writeDbs:%s from user:%s", db, pUser->user);
×
3272
      }
3273

3274
      SSdbRaw *pCommitRaw = mndUserActionEncode(&newUser);
3✔
3275
      if (pCommitRaw == NULL || (code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
3!
3276
        code = TSDB_CODE_OUT_OF_MEMORY;
×
3277
        break;
×
3278
      }
3279
      TAOS_CHECK_GOTO(sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY), &lino, _OVER);
3!
3280
    }
3281

3282
    mndUserFreeObj(&newUser);
2,551✔
3283
    sdbRelease(pSdb, pUser);
2,551✔
3284
  }
3285

3286
_OVER:
2,344✔
3287
  if (pUser != NULL) sdbRelease(pSdb, pUser);
2,344!
3288
  if (pIter != NULL) sdbCancelFetch(pSdb, pIter);
2,344!
3289
  mndUserFreeObj(&newUser);
2,344✔
3290
  TAOS_RETURN(code);
2,344✔
3291
}
3292

3293
int32_t mndUserRemoveStb(SMnode *pMnode, STrans *pTrans, char *stb) {
1,475✔
3294
  int32_t   code = 0;
1,475✔
3295
  SSdb     *pSdb = pMnode->pSdb;
1,475✔
3296
  int32_t   len = strlen(stb) + 1;
1,475✔
3297
  void     *pIter = NULL;
1,475✔
3298
  SUserObj *pUser = NULL;
1,475✔
3299
  SUserObj  newUser = {0};
1,475✔
3300

3301
  while (1) {
1,475✔
3302
    pIter = sdbFetch(pSdb, SDB_USER, pIter, (void **)&pUser);
2,950✔
3303
    if (pIter == NULL) break;
2,950✔
3304

3305
    if ((code = mndUserDupObj(pUser, &newUser)) != 0) {
1,475!
3306
      break;
×
3307
    }
3308

3309
    bool inRead = (taosHashGet(newUser.readTbs, stb, len) != NULL);
1,475✔
3310
    bool inWrite = (taosHashGet(newUser.writeTbs, stb, len) != NULL);
1,475✔
3311
    bool inAlter = (taosHashGet(newUser.alterTbs, stb, len) != NULL);
1,475✔
3312
    if (inRead || inWrite || inAlter) {
1,475!
3313
      code = taosHashRemove(newUser.readTbs, stb, len);
×
3314
      if (code < 0) {
×
3315
        mError("failed to remove readTbs:%s from user:%s", stb, pUser->user);
×
3316
      }
3317
      code = taosHashRemove(newUser.writeTbs, stb, len);
×
3318
      if (code < 0) {
×
3319
        mError("failed to remove writeTbs:%s from user:%s", stb, pUser->user);
×
3320
      }
3321
      code = taosHashRemove(newUser.alterTbs, stb, len);
×
3322
      if (code < 0) {
×
3323
        mError("failed to remove alterTbs:%s from user:%s", stb, pUser->user);
×
3324
      }
3325

3326
      SSdbRaw *pCommitRaw = mndUserActionEncode(&newUser);
×
3327
      if (pCommitRaw == NULL || (code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
×
3328
        code = TSDB_CODE_OUT_OF_MEMORY;
×
3329
        break;
×
3330
      }
3331
      code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY);
×
3332
      if (code != 0) {
×
3333
        mndUserFreeObj(&newUser);
×
3334
        sdbRelease(pSdb, pUser);
×
3335
        TAOS_RETURN(code);
×
3336
      }
3337
    }
3338

3339
    mndUserFreeObj(&newUser);
1,475✔
3340
    sdbRelease(pSdb, pUser);
1,475✔
3341
  }
3342

3343
  if (pUser != NULL) sdbRelease(pSdb, pUser);
1,475!
3344
  if (pIter != NULL) sdbCancelFetch(pSdb, pIter);
1,475!
3345
  mndUserFreeObj(&newUser);
1,475✔
3346
  TAOS_RETURN(code);
1,475✔
3347
}
3348

3349
int32_t mndUserRemoveView(SMnode *pMnode, STrans *pTrans, char *view) {
129✔
3350
  int32_t   code = 0;
129✔
3351
  SSdb     *pSdb = pMnode->pSdb;
129✔
3352
  int32_t   len = strlen(view) + 1;
129✔
3353
  void     *pIter = NULL;
129✔
3354
  SUserObj *pUser = NULL;
129✔
3355
  SUserObj  newUser = {0};
129✔
3356

3357
  while (1) {
142✔
3358
    pIter = sdbFetch(pSdb, SDB_USER, pIter, (void **)&pUser);
271✔
3359
    if (pIter == NULL) break;
271✔
3360

3361
    if ((code = mndUserDupObj(pUser, &newUser)) != 0) {
142!
3362
      break;
×
3363
    }
3364

3365
    bool inRead = (taosHashGet(newUser.readViews, view, len) != NULL);
142✔
3366
    bool inWrite = (taosHashGet(newUser.writeViews, view, len) != NULL);
142✔
3367
    bool inAlter = (taosHashGet(newUser.alterViews, view, len) != NULL);
142✔
3368
    if (inRead || inWrite || inAlter) {
142!
3369
      code = taosHashRemove(newUser.readViews, view, len);
9✔
3370
      if (code < 0) {
9✔
3371
        mError("failed to remove readViews:%s from user:%s", view, pUser->user);
2!
3372
      }
3373
      code = taosHashRemove(newUser.writeViews, view, len);
9✔
3374
      if (code < 0) {
9✔
3375
        mError("failed to remove writeViews:%s from user:%s", view, pUser->user);
4!
3376
      }
3377
      code = taosHashRemove(newUser.alterViews, view, len);
9✔
3378
      if (code < 0) {
9✔
3379
        mError("failed to remove alterViews:%s from user:%s", view, pUser->user);
2!
3380
      }
3381

3382
      SSdbRaw *pCommitRaw = mndUserActionEncode(&newUser);
9✔
3383
      if (pCommitRaw == NULL || (code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
9!
3384
        code = TSDB_CODE_OUT_OF_MEMORY;
×
3385
        break;
×
3386
      }
3387
      code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY);
9✔
3388
      if (code < 0) {
9!
3389
        mndUserFreeObj(&newUser);
×
3390
        sdbRelease(pSdb, pUser);
×
3391
        TAOS_RETURN(code);
×
3392
      }
3393
    }
3394

3395
    mndUserFreeObj(&newUser);
142✔
3396
    sdbRelease(pSdb, pUser);
142✔
3397
  }
3398

3399
  if (pUser != NULL) sdbRelease(pSdb, pUser);
129!
3400
  if (pIter != NULL) sdbCancelFetch(pSdb, pIter);
129!
3401
  mndUserFreeObj(&newUser);
129✔
3402
  TAOS_RETURN(code);
129✔
3403
}
3404

3405
int32_t mndUserRemoveTopic(SMnode *pMnode, STrans *pTrans, char *topic) {
331✔
3406
  int32_t   code = 0;
331✔
3407
  SSdb     *pSdb = pMnode->pSdb;
331✔
3408
  int32_t   len = strlen(topic) + 1;
331✔
3409
  void     *pIter = NULL;
331✔
3410
  SUserObj *pUser = NULL;
331✔
3411
  SUserObj  newUser = {0};
331✔
3412

3413
  while (1) {
366✔
3414
    pIter = sdbFetch(pSdb, SDB_USER, pIter, (void **)&pUser);
697✔
3415
    if (pIter == NULL) {
697✔
3416
      break;
331✔
3417
    }
3418

3419
    if ((code = mndUserDupObj(pUser, &newUser)) != 0) {
366!
3420
      break;
×
3421
    }
3422

3423
    bool inTopic = (taosHashGet(newUser.topics, topic, len) != NULL);
366✔
3424
    if (inTopic) {
366!
3425
      code = taosHashRemove(newUser.topics, topic, len);
×
3426
      if (code < 0) {
×
3427
        mError("failed to remove topic:%s from user:%s", topic, pUser->user);
×
3428
      }
3429
      SSdbRaw *pCommitRaw = mndUserActionEncode(&newUser);
×
3430
      if (pCommitRaw == NULL || (code = mndTransAppendCommitlog(pTrans, pCommitRaw)) != 0) {
×
3431
        code = TSDB_CODE_OUT_OF_MEMORY;
×
3432
        break;
×
3433
      }
3434
      code = sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY);
×
3435
      if (code < 0) {
×
3436
        mndUserFreeObj(&newUser);
×
3437
        sdbRelease(pSdb, pUser);
×
3438
        TAOS_RETURN(code);
×
3439
      }
3440
    }
3441

3442
    mndUserFreeObj(&newUser);
366✔
3443
    sdbRelease(pSdb, pUser);
366✔
3444
  }
3445

3446
  if (pUser != NULL) sdbRelease(pSdb, pUser);
331!
3447
  if (pIter != NULL) sdbCancelFetch(pSdb, pIter);
331!
3448
  mndUserFreeObj(&newUser);
331✔
3449
  TAOS_RETURN(code);
331✔
3450
}
3451

3452
int64_t mndGetUserIpWhiteListVer(SMnode *pMnode, SUserObj *pUser) {
×
3453
  // ver = 0, disable ip white list
3454
  // ver > 0, enable ip white list
3455
  return tsEnableWhiteList ? pUser->ipWhiteListVer : 0;
×
3456
}
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

© 2025 Coveralls, Inc