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

taosdata / TDengine / #3523

06 Nov 2024 02:29AM UTC coverage: 55.861% (-2.4%) from 58.216%
#3523

push

travis-ci

web-flow
Merge pull request #28551 from taosdata/feat/TS-5215-2

test(blob): testing & fixes for blob

106075 of 245834 branches covered (43.15%)

Branch coverage included in aggregate %.

0 of 15 new or added lines in 2 files covered. (0.0%)

17003 existing lines in 254 files now uncovered.

181910 of 269703 relevant lines covered (67.45%)

1527639.59 hits per line

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

61.05
/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() {
716✔
140
  ipWhiteMgt.pIpWhiteTab = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), 1, HASH_ENTRY_LOCK);
716✔
141
  if (ipWhiteMgt.pIpWhiteTab == NULL) {
716!
142
    TAOS_RETURN(terrno);
×
143
  }
144
  ipWhiteMgt.ver = 0;
716✔
145
  (void)taosThreadRwlockInit(&ipWhiteMgt.rw, NULL);
716✔
146
  TAOS_RETURN(0);
716✔
147
}
148
void ipWhiteMgtCleanup() {
715✔
149
  destroyIpWhiteTab(ipWhiteMgt.pIpWhiteTab);
715✔
150
  (void)taosThreadRwlockDestroy(&ipWhiteMgt.rw);
715✔
151
}
715✔
152

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

161
  if (ppList == NULL || *ppList == NULL) {
228!
162
    SIpWhiteList *p = cloneIpWhiteList(pNew);
50✔
163
    if (p == NULL) {
50!
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) {
50!
168
      update = false;
×
169
      taosMemoryFree(p);
×
170
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
171
    }
172
  } else {
173
    SIpWhiteList *pOld = *ppList;
128✔
174
    if (isIpWhiteListEqual(pOld, pNew)) {
128✔
175
      update = false;
115✔
176
    } else {
177
      taosMemoryFree(pOld);
13✔
178
      SIpWhiteList *p = cloneIpWhiteList(pNew);
13✔
179
      if (p == NULL) {
13!
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) {
13!
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
178✔
192
  if (fqdns == NULL) {
178!
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++) {
486✔
198
    char *fqdn = taosArrayGetP(fqdns, i);
308✔
199
    bool  upd = false;
308✔
200
    TAOS_CHECK_GOTO(mndUpdateIpWhiteImpl(ipWhiteMgt.pIpWhiteTab, TSDB_DEFAULT_USER, fqdn, IP_WHITE_ADD, &upd), &lino,
308!
201
                    _OVER);
202
    update |= upd;
308✔
203
    TAOS_CHECK_GOTO(mndUpdateIpWhiteImpl(ipWhiteMgt.pIpWhiteTab, user, fqdn, IP_WHITE_ADD, &upd), &lino, _OVER);
308!
204
    update |= upd;
308✔
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++;
178✔
213

214
_OVER:
115✔
215
  (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
178✔
216
  taosArrayDestroyP(fqdns, (FDelete)taosMemoryFree);
178✔
217
  if (code < 0) {
178!
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);
178✔
221
}
222
int32_t ipWhiteMgtRemove(char *user) {
25✔
223
  bool    update = true;
25✔
224
  int32_t code = 0;
25✔
225
  (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
25✔
226
  SIpWhiteList **ppList = taosHashGet(ipWhiteMgt.pIpWhiteTab, user, strlen(user));
25✔
227
  if (ppList == NULL || *ppList == NULL) {
25!
228
    update = false;
×
229
  } else {
230
    taosMemoryFree(*ppList);
25✔
231
    code = taosHashRemove(ipWhiteMgt.pIpWhiteTab, user, strlen(user));
25✔
232
    if (code != 0) {
25!
233
      update = false;
×
234
    }
235
  }
236

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

242
bool isRangeInWhiteList(SIpWhiteList *pList, SIpV4Range *range) {
2,182✔
243
  for (int i = 0; i < pList->num; i++) {
2,794✔
244
    if (isIpRangeEqual(&pList->pIpRange[i], range)) {
2,682✔
245
      return true;
2,070✔
246
    }
247
  }
248
  return false;
112✔
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) {
733✔
298
  SHashObj *pNew = NULL;
733✔
299
  TAOS_CHECK_RETURN(mndFetchAllIpWhite(pMnode, &pNew));
733!
300

301
  SHashObj *pOld = ipWhiteMgt.pIpWhiteTab;
733✔
302

303
  ipWhiteMgt.pIpWhiteTab = pNew;
733✔
304
  ipWhiteMgt.ver++;
733✔
305

306
  destroyIpWhiteTab(pOld);
733✔
307
  TAOS_RETURN(0);
733✔
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) {
65,134✔
321
  int64_t ver = 0;
65,134✔
322
  int32_t code = 0;
65,134✔
323
  (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
65,134✔
324
  if (ipWhiteMgt.ver == 0) {
65,155!
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;
65,155✔
334
  (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
65,155✔
335

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

343
int32_t mndUpdateIpWhiteImpl(SHashObj *pIpWhiteTab, char *user, char *fqdn, int8_t type, bool *pUpdate) {
2,671✔
344
  int32_t    lino = 0;
2,671✔
345
  bool       update = false;
2,671✔
346
  SIpV4Range range = {.ip = 0, .mask = 32};
2,671✔
347
  int32_t    code = taosGetIpv4FromFqdn(fqdn, &range.ip);
2,671✔
348
  if (code) {
2,671!
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);
2,671✔
353
  SIpWhiteList **ppList = taosHashGet(pIpWhiteTab, user, strlen(user));
2,671✔
354
  SIpWhiteList  *pList = NULL;
2,671✔
355
  if (ppList != NULL && *ppList != NULL) {
2,671!
356
    pList = *ppList;
2,182✔
357
  }
358

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

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

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

386
        if ((code = taosHashPut(pIpWhiteTab, user, strlen(user), &pNewList, sizeof(void *))) != 0) {
112!
387
          taosMemoryFree(pNewList);
×
388
          TAOS_CHECK_GOTO(code, &lino, _OVER);
×
389
        }
390
        taosMemoryFree(pList);
112✔
391
        update = true;
112✔
392
      }
393
    }
394
  } else if (type == IP_WHITE_DROP) {
13!
395
    if (pList != NULL) {
13✔
396
      if (isRangeInWhiteList(pList, &range)) {
12!
397
        if (pList->num == 1) {
12!
398
          if (taosHashRemove(pIpWhiteTab, user, strlen(user)) < 0) {
12!
399
            mError("failed to remove ip-white-list for user: %s at line %d", user, lino);
×
400
          }
401
          taosMemoryFree(pList);
12✔
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;
12✔
425
      }
426
    }
427
  }
428
  if (update) {
2,671✔
429
    mDebug("ip-white-list update for user: %s, fqdn: %s", user, fqdn);
612✔
430
  }
431

432
_OVER:
2,079✔
433
  if (pUpdate) *pUpdate = update;
2,671✔
434
  if (code < 0) {
2,671!
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);
2,671✔
439
}
440

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

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

452
  TAOS_RETURN(code);
733✔
453
}
454

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

460
  if (lock) {
726!
461
    (void)taosThreadRwlockWrlock(&ipWhiteMgt.rw);
726✔
462
    if (ipWhiteMgt.ver == 0) {
726!
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);
726!
470

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

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

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

493
_OVER:
726✔
494
  if (update) ipWhiteMgt.ver++;
726✔
495
  if (lock) (void)taosThreadRwlockUnlock(&ipWhiteMgt.rw);
726!
496
  if (code < 0) {
726!
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);
726✔
502
}
503

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

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

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

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

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

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

548
  void *pIter = taosHashIterate(pIpWhiteTab, NULL);
1,448✔
549
  while (pIter) {
2,157✔
550
    SIpWhiteList *list = *(SIpWhiteList **)pIter;
709✔
551
    taosMemoryFree(list);
709✔
552
    pIter = taosHashIterate(pIpWhiteTab, pIter);
709✔
553
  }
554

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

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

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

580
    SIpWhiteList *pWhiteList = cloneIpWhiteList(pUser->pIpWhiteList);
208✔
581
    if (pWhiteList == NULL) {
208!
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) {
208!
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);
208✔
594
    if (name == NULL) {
208!
595
      sdbRelease(pSdb, pUser);
×
596
      sdbCancelFetch(pSdb, pIter);
×
597
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
598
    }
599
    if (taosArrayPush(pUserNames, &name) == NULL) {
208!
600
      taosMemoryFree(name);
×
601
      sdbRelease(pSdb, pUser);
×
602
      sdbCancelFetch(pSdb, pIter);
×
603
      TAOS_CHECK_GOTO(terrno, &lino, _OVER);
×
604
    }
605

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

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

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

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

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

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

646
  if (code < 0) {
733!
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;
733✔
652
  TAOS_RETURN(code);
733✔
653
}
654

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

658
  SSdbTable table = {
716✔
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);
716✔
670
  mndSetMsgHandle(pMnode, TDMT_MND_ALTER_USER, mndProcessAlterUserReq);
716✔
671
  mndSetMsgHandle(pMnode, TDMT_MND_DROP_USER, mndProcessDropUserReq);
716✔
672
  mndSetMsgHandle(pMnode, TDMT_MND_GET_USER_AUTH, mndProcessGetUserAuthReq);
716✔
673
  mndSetMsgHandle(pMnode, TDMT_MND_GET_USER_WHITELIST, mndProcessGetUserWhiteListReq);
716✔
674

675
  mndSetMsgHandle(pMnode, TDMT_MND_RETRIEVE_IP_WHITE, mndProcesSRetrieveIpWhiteReq);
716✔
676

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

686
void mndCleanupUser(SMnode *pMnode) { ipWhiteMgtCleanup(); }
715✔
687

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

692
  (void)uv_inet_ntop(AF_INET, &addr, buf, 32);
97✔
693
  if (range->mask != 32) {
97✔
694
    (void)sprintf(buf + strlen(buf), "/%d", range->mask);
6✔
695
  }
696
  return;
97✔
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) {
89✔
703
  int32_t len = 0;
89✔
704
  for (int i = 0; i < num; i++) {
186✔
705
    char        tbuf[36] = {0};
97✔
706
    SIpV4Range *pRange = &range[i];
97✔
707

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

715
static bool isIpRangeEqual(SIpV4Range *a, SIpV4Range *b) {
2,802✔
716
  // equal or not
717
  return a->ip == b->ip && a->mask == b->mask;
2,802!
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) {
128✔
726
  if (a->num != b->num) {
128✔
727
    return false;
13✔
728
  }
729
  for (int i = 0; i < a->num; i++) {
230✔
730
    if (!isIpRangeEqual(&a->pIpRange[i], &b->pIpRange[i])) {
115!
731
      return false;
×
732
    }
733
  }
734
  return true;
115✔
735
}
736
int32_t convertIpWhiteListToStr(SIpWhiteList *pList, char **buf) {
89✔
737
  if (pList->num == 0) {
89!
738
    *buf = NULL;
×
739
    return 0;
×
740
  }
741
  *buf = taosMemoryCalloc(1, pList->num * 36);
89✔
742
  if (*buf == NULL) {
89!
743
    return 0;
×
744
  }
745
  int32_t len = ipRangeListToStr(pList->pIpRange, pList->num, *buf);
89✔
746
  if (len == 0) {
89!
747
    taosMemoryFreeClear(*buf);
×
748
    return 0;
×
749
  }
750
  return strlen(*buf);
89✔
751
}
752
int32_t tSerializeIpWhiteList(void *buf, int32_t len, SIpWhiteList *pList, uint32_t *pLen) {
1,913✔
753
  int32_t  code = 0;
1,913✔
754
  int32_t  lino = 0;
1,913✔
755
  int32_t  tlen = 0;
1,913✔
756
  SEncoder encoder = {0};
1,913✔
757
  tEncoderInit(&encoder, buf, len);
1,913✔
758

759
  TAOS_CHECK_GOTO(tStartEncode(&encoder), &lino, _OVER);
1,913!
760
  TAOS_CHECK_GOTO(tEncodeI32(&encoder, pList->num), &lino, _OVER);
3,826!
761

762
  for (int i = 0; i < pList->num; i++) {
3,836✔
763
    SIpV4Range *pRange = &(pList->pIpRange[i]);
1,923✔
764
    TAOS_CHECK_GOTO(tEncodeU32(&encoder, pRange->ip), &lino, _OVER);
3,846!
765
    TAOS_CHECK_GOTO(tEncodeU32(&encoder, pRange->mask), &lino, _OVER);
3,846!
766
  }
767

768
  tEndEncode(&encoder);
1,913✔
769

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

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

786
  TAOS_CHECK_GOTO(tStartDecode(&decoder), &lino, _OVER);
1,003!
787
  TAOS_CHECK_GOTO(tDecodeI32(&decoder, &pList->num), &lino, _OVER);
2,006!
788

789
  for (int i = 0; i < pList->num; i++) {
2,012✔
790
    SIpV4Range *pRange = &(pList->pIpRange[i]);
1,009✔
791
    TAOS_CHECK_GOTO(tDecodeU32(&decoder, &pRange->ip), &lino, _OVER);
2,018!
792
    TAOS_CHECK_GOTO(tDecodeU32(&decoder, &pRange->mask), &lino, _OVER);
2,018!
793
  }
794

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

802
  TAOS_RETURN(code);
1,003✔
803
}
804

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

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

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

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

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

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

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

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

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

873
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_NOTHING, NULL, "create-user");
483✔
874
  if (pTrans == NULL) {
483!
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);
483!
880

881
  if (mndTransAppendCommitlog(pTrans, pRaw) != 0) {
483!
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);
483!
887

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

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

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

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

926
  char *stb = taosHashIterate(pUser->readTbs, NULL);
1,913✔
927
  while (stb != NULL) {
1,921✔
928
    size_t keyLen = 0;
8✔
929
    void  *key = taosHashGetKey(stb, &keyLen);
8✔
930
    size += sizeof(int32_t);
8✔
931
    size += keyLen;
8✔
932

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

940
  stb = taosHashIterate(pUser->writeTbs, NULL);
1,913✔
941
  while (stb != NULL) {
1,921✔
942
    size_t keyLen = 0;
8✔
943
    void  *key = taosHashGetKey(stb, &keyLen);
8✔
944
    size += sizeof(int32_t);
8✔
945
    size += keyLen;
8✔
946

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

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

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

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

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

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

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

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

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

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

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

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

1041
  char *db = taosHashIterate(pUser->readDbs, NULL);
1,913✔
1042
  while (db != NULL) {
1,984✔
1043
    SDB_SET_BINARY(pRaw, dataPos, db, TSDB_DB_FNAME_LEN, _OVER);
71!
1044
    db = taosHashIterate(pUser->readDbs, db);
71✔
1045
  }
1046

1047
  db = taosHashIterate(pUser->writeDbs, NULL);
1,913✔
1048
  while (db != NULL) {
1,982✔
1049
    SDB_SET_BINARY(pRaw, dataPos, db, TSDB_DB_FNAME_LEN, _OVER);
69!
1050
    db = taosHashIterate(pUser->writeDbs, db);
69✔
1051
  }
1052

1053
  char *topic = taosHashIterate(pUser->topics, NULL);
1,913✔
1054
  while (topic != NULL) {
1,950✔
1055
    SDB_SET_BINARY(pRaw, dataPos, topic, TSDB_TOPIC_FNAME_LEN, _OVER);
37!
1056
    topic = taosHashIterate(pUser->topics, topic);
37✔
1057
  }
1058

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

1067
  stb = taosHashIterate(pUser->readTbs, NULL);
1,913✔
1068
  while (stb != NULL) {
1,921✔
1069
    size_t keyLen = 0;
8✔
1070
    void  *key = taosHashGetKey(stb, &keyLen);
8✔
1071
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
8!
1072
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
8!
1073

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

1081
  stb = taosHashIterate(pUser->writeTbs, NULL);
1,913✔
1082
  while (stb != NULL) {
1,921✔
1083
    size_t keyLen = 0;
8✔
1084
    void  *key = taosHashGetKey(stb, &keyLen);
8✔
1085
    SDB_SET_INT32(pRaw, dataPos, keyLen, _OVER)
8!
1086
    SDB_SET_BINARY(pRaw, dataPos, key, keyLen, _OVER);
8!
1087

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

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

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

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

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

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

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

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

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

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

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

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

1171
  SDB_SET_INT32(pRaw, dataPos, len, _OVER);
1,913!
1172
  SDB_SET_BINARY(pRaw, dataPos, buf, len, _OVER);
1,913!
1173

1174
  SDB_SET_INT64(pRaw, dataPos, pUser->ipWhiteListVer, _OVER);
1,913!
1175

1176
  SDB_SET_RESERVE(pRaw, dataPos, USER_RESERVE_SIZE, _OVER)
1,913!
1177
  SDB_SET_DATALEN(pRaw, dataPos, _OVER)
1,913!
1178

1179
_OVER:
1,913✔
1180
  taosMemoryFree(buf);
1,913✔
1181
  if (code < 0) {
1,913!
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);
1,913✔
1190
  return pRaw;
1,913✔
1191
}
1192

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1317
    for (int32_t i = 0; i < numOfReadTbs; ++i) {
1,011✔
1318
      int32_t keyLen = 0;
8✔
1319
      SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
8!
1320

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

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

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

1340
    for (int32_t i = 0; i < numOfWriteTbs; ++i) {
1,011✔
1341
      int32_t keyLen = 0;
8✔
1342
      SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
8!
1343

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

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

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

1363
    if (sver >= 6) {
1,003!
1364
      for (int32_t i = 0; i < numOfAlterTbs; ++i) {
1,011✔
1365
        int32_t keyLen = 0;
8✔
1366
        SDB_GET_INT32(pRaw, dataPos, &keyLen, _OVER);
8!
1367

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1490
  if (pUser->pIpWhiteList == NULL) {
1,003!
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)
1,003!
1496
  taosInitRWLatch(&pUser->lock);
1,003✔
1497

1498
_OVER:
1,003✔
1499
  taosMemoryFree(key);
1,003✔
1500
  taosMemoryFree(value);
1,003✔
1501
  if (code < 0) {
1,003!
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);
1,003✔
1523
  return pRow;
1,003✔
1524
}
1525

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

1529
  SAcctObj *pAcct = sdbAcquire(pSdb, SDB_ACCT, pUser->acct);
798✔
1530
  if (pAcct == NULL) {
798!
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;
798✔
1536
  sdbRelease(pSdb, pAcct);
798✔
1537

1538
  return 0;
798✔
1539
}
1540

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

1549
  char *tb = taosHashIterate(pOld, NULL);
64,454✔
1550
  while (tb != NULL) {
64,734✔
1551
    size_t keyLen = 0;
280✔
1552
    char  *key = taosHashGetKey(tb, &keyLen);
280✔
1553

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

1563
  TAOS_RETURN(code);
64,454✔
1564
}
1565

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

1574
  int32_t *db = taosHashIterate(pOld, NULL);
1,332✔
1575
  while (db != NULL) {
1,362✔
1576
    size_t keyLen = 0;
30✔
1577
    char  *key = taosHashGetKey(db, &keyLen);
30✔
1578

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

1587
  TAOS_RETURN(code);
1,332✔
1588
}
1589

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

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

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

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

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

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

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

1677
  taosWUnLockLatch(&pOld->lock);
160✔
1678

1679
  return 0;
160✔
1680
}
1681

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

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

1697
void mndReleaseUser(SMnode *pMnode, SUserObj *pUser) {
192,642✔
1698
  SSdb *pSdb = pMnode->pSdb;
192,642✔
1699
  sdbRelease(pSdb, pUser);
192,642✔
1700
}
192,645✔
1701

1702
static int32_t mndCreateUser(SMnode *pMnode, char *acct, SCreateUserReq *pCreate, SRpcMsg *pReq) {
50✔
1703
  int32_t  code = 0;
50✔
1704
  int32_t  lino = 0;
50✔
1705
  SUserObj userObj = {0};
50✔
1706
  if (pCreate->isImport != 1) {
50!
1707
    taosEncryptPass_c((uint8_t *)pCreate->pass, strlen(pCreate->pass), userObj.pass);
50✔
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);
50✔
1713
  tstrncpy(userObj.acct, acct, TSDB_USER_LEN);
50✔
1714
  userObj.createdTime = taosGetTimestampMs();
50✔
1715
  userObj.updateTime = userObj.createdTime;
50✔
1716
  userObj.superUser = 0;  // pCreate->superUser;
50✔
1717
  userObj.sysInfo = pCreate->sysInfo;
50✔
1718
  userObj.enable = pCreate->enable;
50✔
1719
  userObj.createdb = pCreate->createDb;
50✔
1720

1721
  if (pCreate->numIpRanges == 0) {
50✔
1722
    TAOS_CHECK_RETURN(createDefaultIpWhiteList(&userObj.pIpWhiteList));
48!
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();
50✔
1770

1771
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pReq, "create-user");
50✔
1772
  if (pTrans == NULL) {
50!
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);
50!
1778

1779
  SSdbRaw *pCommitRaw = mndUserActionEncode(&userObj);
50✔
1780
  if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
50!
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);
50!
1786

1787
  if (mndTransPrepare(pMnode, pTrans) != 0) {
50!
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) {
50!
1793
    mndTransDrop(pTrans);
×
1794
    TAOS_CHECK_GOTO(code, &lino, _OVER);
×
1795
  }
1796

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

1803
  TAOS_RETURN(code);
×
1804
}
1805

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

1814
  if (tDeserializeSCreateUserReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
55!
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);
55!
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) {
55!
1827
    TAOS_CHECK_GOTO(mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CREATE_USER), &lino, _OVER);
55✔
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) {
50!
1836
    TAOS_CHECK_GOTO(TSDB_CODE_MND_INVALID_USER_FORMAT, &lino, _OVER);
×
1837
  }
1838

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

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

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

1854
  code = mndAcquireUser(pMnode, pReq->info.conn.user, &pOperUser);
50✔
1855
  if (pOperUser == NULL) {
50!
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);
50!
1860

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

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

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

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

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

1885
  TAOS_RETURN(code);
55✔
1886
}
1887

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

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

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

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

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

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

1924
_OVER:
4✔
1925
  mndReleaseUser(pMnode, pUser);
4✔
1926
  tFreeSGetUserWhiteListRsp(&wlRsp);
4✔
1927
  if (code < 0) {
4!
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;
4✔
1934
  pReq->info.rsp = pRsp;
4✔
1935
  pReq->info.rspLen = contLen;
4✔
1936

1937
  TAOS_RETURN(code);
4✔
1938
}
1939

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

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

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

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

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

1970
_OVER:
×
1971
  if (code < 0) {
×
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;
×
1978
  pReq->info.rsp = pRsp;
×
1979
  pReq->info.rspLen = len;
×
1980

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

1985
static int32_t mndAlterUser(SMnode *pMnode, SUserObj *pOld, SUserObj *pNew, SRpcMsg *pReq) {
128✔
1986
  int32_t code = 0;
128✔
1987
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pReq, "alter-user");
128✔
1988
  if (pTrans == NULL) {
128!
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);
128!
1993

1994
  SSdbRaw *pCommitRaw = mndUserActionEncode(pNew);
128✔
1995
  if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
128!
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);
128✔
2001
  if (code < 0) {
128!
2002
    mndTransDrop(pTrans);
×
2003
    TAOS_RETURN(code);
×
2004
  }
2005

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

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

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

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

2040
  TAOS_RETURN(code);
20,128✔
2041
}
2042

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

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

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

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

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

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

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

2075
  TAOS_RETURN(0);
30✔
2076
}
2077

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

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

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

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

2104
  return 0;
×
2105
}
2106

2107
static char *mndUserAuditTypeStr(int32_t type) {
18✔
2108
  if (type == TSDB_ALTER_USER_PASSWD) {
18!
2109
    return "changePassword";
18✔
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) {
97✔
2127
  SSdb   *pSdb = pMnode->pSdb;
97✔
2128
  void   *pIter = NULL;
97✔
2129
  int32_t code = 0;
97✔
2130
  int32_t lino = 0;
97✔
2131

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

2163
  if (ALTER_USER_ADD_WRITE_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
92✔
2164
      ALTER_USER_ADD_ALL_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
66!
2165
    if (strcmp(pAlterReq->objname, "1.*") != 0) {
26✔
2166
      int32_t len = strlen(pAlterReq->objname) + 1;
23✔
2167
      SDbObj *pDb = mndAcquireDb(pMnode, pAlterReq->objname);
23✔
2168
      if (pDb == NULL) {
23✔
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)) !=
22!
2173
          0) {
2174
        mndReleaseDb(pMnode, pDb);
×
2175
        TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2176
      }
2177
      mndReleaseDb(pMnode, pDb);
22✔
2178
    } else {
2179
      while (1) {
9✔
2180
        SDbObj *pDb = NULL;
12✔
2181
        pIter = sdbFetch(pSdb, SDB_DB, pIter, (void **)&pDb);
12✔
2182
        if (pIter == NULL) break;
12✔
2183
        int32_t len = strlen(pDb->name) + 1;
9✔
2184
        if ((code = taosHashPut(pNewUser->writeDbs, pDb->name, len, pDb->name, TSDB_DB_FNAME_LEN)) != 0) {
9!
2185
          sdbRelease(pSdb, pDb);
×
2186
          sdbCancelFetch(pSdb, pIter);
×
2187
          TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2188
        }
2189
        sdbRelease(pSdb, pDb);
9✔
2190
      }
2191
    }
2192
  }
2193

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

2213
  if (ALTER_USER_DEL_WRITE_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName) ||
91!
2214
      ALTER_USER_DEL_ALL_DB_PRIV(pAlterReq->alterType, pAlterReq->privileges, pAlterReq->tabName)) {
74!
2215
    if (strcmp(pAlterReq->objname, "1.*") != 0) {
17✔
2216
      int32_t len = strlen(pAlterReq->objname) + 1;
14✔
2217
      SDbObj *pDb = mndAcquireDb(pMnode, pAlterReq->objname);
14✔
2218
      if (pDb == NULL) {
14!
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);
14✔
2223
      if (code < 0) {
14!
2224
        mError("user:%s, failed to remove db:%s since %s", pNewUser->user, pAlterReq->objname, terrstr());
×
2225
      }
2226
      mndReleaseDb(pMnode, pDb);
14✔
2227
    } else {
2228
      taosHashClear(pNewUser->writeDbs);
3✔
2229
    }
2230
  }
2231

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

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

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

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

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

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

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

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

2274
  if (ALTER_USER_ADD_SUBSCRIBE_TOPIC_PRIV(pAlterReq->alterType, pAlterReq->privileges)) {
91✔
2275
    int32_t      len = strlen(pAlterReq->objname) + 1;
15✔
2276
    SMqTopicObj *pTopic = NULL;
15✔
2277
    if ((code = mndAcquireTopic(pMnode, pAlterReq->objname, &pTopic)) != 0) {
15!
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) {
15!
2282
      mndReleaseTopic(pMnode, pTopic);
×
2283
      TAOS_CHECK_GOTO(code, &lino, _OVER);
×
2284
    }
2285
    mndReleaseTopic(pMnode, pTopic);
15✔
2286
  }
2287

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

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

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

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

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

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

2328
  if (TSDB_ALTER_USER_PASSWD == alterReq.alterType &&
201✔
2329
      (alterReq.pass[0] == 0 || strlen(alterReq.pass) >= TSDB_PASSWORD_LEN)) {
22!
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);
201✔
2334

2335
  (void)mndAcquireUser(pMnode, pReq->info.conn.user, &pOperUser);
180✔
2336
  if (pOperUser == NULL) {
180!
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);
180✔
2341

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

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

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

2357
  if (alterReq.alterType == TSDB_ALTER_USER_ENABLE) {
136✔
2358
    newUser.enable = alterReq.enable;
4✔
2359
  }
2360

2361
  if (alterReq.alterType == TSDB_ALTER_USER_SYSINFO) {
136✔
2362
    newUser.sysInfo = alterReq.sysInfo;
13✔
2363
  }
2364

2365
  if (alterReq.alterType == TSDB_ALTER_USER_CREATEDB) {
136✔
2366
    newUser.createdb = alterReq.createdb;
2✔
2367
  }
2368

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

2373
  if (alterReq.alterType == TSDB_ALTER_USER_ADD_WHITE_LIST) {
129✔
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) {
129✔
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);
128✔
2465
  if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
128!
2466

2467
  if (alterReq.alterType == TSDB_ALTER_USER_PASSWD) {
128✔
2468
    char detail[1000] = {0};
18✔
2469
    (void)sprintf(detail, "alterType:%s, enable:%d, superUser:%d, sysInfo:%d, createdb:%d, tabName:%s, password:xxx",
36✔
2470
                  mndUserAuditTypeStr(alterReq.alterType), alterReq.enable, alterReq.superUser, alterReq.sysInfo,
18✔
2471
                  alterReq.createdb ? 1 : 0, alterReq.tabName);
18✔
2472
    auditRecord(pReq, pMnode->clusterId, "alterUser", "", alterReq.user, detail, strlen(detail));
18✔
2473
  } else if (alterReq.alterType == TSDB_ALTER_USER_SUPERUSER || alterReq.alterType == TSDB_ALTER_USER_ENABLE ||
110!
2474
             alterReq.alterType == TSDB_ALTER_USER_SYSINFO || alterReq.alterType == TSDB_ALTER_USER_CREATEDB) {
106✔
2475
    auditRecord(pReq, pMnode->clusterId, "alterUser", "", alterReq.user, alterReq.sql, alterReq.sqlLen);
19✔
2476
  } else if (ALTER_USER_ADD_READ_DB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
91✔
2477
             ALTER_USER_ADD_WRITE_DB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
66✔
2478
             ALTER_USER_ADD_ALL_DB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
60!
2479
             ALTER_USER_ADD_READ_TB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
60!
2480
             ALTER_USER_ADD_WRITE_TB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName) ||
48!
2481
             ALTER_USER_ADD_ALL_TB_PRIV(alterReq.alterType, alterReq.privileges, alterReq.tabName)) {
48!
2482
    if (strcmp(alterReq.objname, "1.*") != 0) {
43✔
2483
      SName name = {0};
39✔
2484
      TAOS_CHECK_GOTO(tNameFromString(&name, alterReq.objname, T_NAME_ACCT | T_NAME_DB), &lino, _OVER);
39!
2485
      auditRecord(pReq, pMnode->clusterId, "GrantPrivileges", name.dbname, alterReq.user, alterReq.sql,
39✔
2486
                  alterReq.sqlLen);
2487
    } else {
2488
      auditRecord(pReq, pMnode->clusterId, "GrantPrivileges", "", alterReq.user, alterReq.sql, alterReq.sqlLen);
4✔
2489
    }
2490
  } else if (ALTER_USER_ADD_SUBSCRIBE_TOPIC_PRIV(alterReq.alterType, alterReq.privileges)) {
48✔
2491
    auditRecord(pReq, pMnode->clusterId, "GrantPrivileges", alterReq.objname, alterReq.user, alterReq.sql,
15✔
2492
                alterReq.sqlLen);
2493
  } else if (ALTER_USER_DEL_SUBSCRIBE_TOPIC_PRIV(alterReq.alterType, alterReq.privileges)) {
33✔
2494
    auditRecord(pReq, pMnode->clusterId, "RevokePrivileges", alterReq.objname, alterReq.user, alterReq.sql,
10✔
2495
                alterReq.sqlLen);
2496
  } else {
2497
    if (strcmp(alterReq.objname, "1.*") != 0) {
23✔
2498
      SName name = {0};
19✔
2499
      TAOS_CHECK_GOTO(tNameFromString(&name, alterReq.objname, T_NAME_ACCT | T_NAME_DB), &lino, _OVER);
19✔
2500
      auditRecord(pReq, pMnode->clusterId, "RevokePrivileges", name.dbname, alterReq.user, alterReq.sql,
18✔
2501
                  alterReq.sqlLen);
2502
    } else {
2503
      auditRecord(pReq, pMnode->clusterId, "RevokePrivileges", "", alterReq.user, alterReq.sql, alterReq.sqlLen);
4✔
2504
    }
2505
  }
2506

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

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

2517
  TAOS_RETURN(code);
201✔
2518
}
2519

2520
static int32_t mndDropUser(SMnode *pMnode, SRpcMsg *pReq, SUserObj *pUser) {
25✔
2521
  STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pReq, "drop-user");
25✔
2522
  if (pTrans == NULL) {
25!
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);
25!
2527

2528
  SSdbRaw *pCommitRaw = mndUserActionEncode(pUser);
25✔
2529
  if (pCommitRaw == NULL || mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
25!
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) {
25!
2535
    mndTransDrop(pTrans);
×
2536
    TAOS_RETURN(terrno);
×
2537
  }
2538

2539
  if (mndTransPrepare(pMnode, pTrans) != 0) {
25!
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);
25✔
2545

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

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

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

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

2562
  if (dropReq.user[0] == 0) {
25!
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);
25!
2567

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

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

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

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

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

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

2596
  TAOS_CHECK_EXIT(mndAcquireUser(pMnode, authReq.user, &pUser));
6,907✔
2597

2598
  TAOS_CHECK_EXIT(mndSetUserAuthRsp(pMnode, pUser, &authRsp));
6,905!
2599

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

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

2614
_exit:
6,905✔
2615
  mndReleaseUser(pMnode, pUser);
6,907✔
2616
  tFreeSGetUserAuthRsp(&authRsp);
6,907✔
2617
  if (code < 0) {
6,907✔
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;
6,907✔
2624
  pReq->info.rspLen = contLen;
6,907✔
2625
  pReq->code = code;
6,907✔
2626

2627
  TAOS_RETURN(code);
6,907✔
2628
}
2629

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

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

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

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

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

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

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

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

2674
    cols++;
89✔
2675

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

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

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

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

2700
  pShow->numOfRows += numOfRows;
34✔
2701
_exit:
34✔
2702
  taosMemoryFreeClear(buf);
34!
2703
  taosMemoryFreeClear(varstr);
34!
2704
  if (code < 0) {
34!
2705
    uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
2706
    TAOS_RETURN(code);
×
2707
  }
2708
  return numOfRows;
34✔
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,
420✔
2803
                           SUserObj *pUser, SShowObj *pShow, char **condition, char **sql) {
2804
  char   *value = taosHashIterate(hash, NULL);
420✔
2805
  char   *user = pUser->user;
420✔
2806
  int32_t code = 0;
420✔
2807
  int32_t lino = 0;
420✔
2808
  int32_t cols = 0;
420✔
2809
  int32_t numOfRows = *pNumOfRows;
420✔
2810

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

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

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

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

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

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

2856
      if (nodesStringToNode(value, &pAst) == 0) {
×
2857
        if (nodesNodeToSQL(pAst, *sql, bufSz, &sqlLen) != 0) {
×
2858
          sqlLen = 5;
×
2859
          (void)sprintf(*sql, "error");
×
2860
        }
2861
        nodesDestroyNode(pAst);
×
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);
×
2868

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

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

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

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

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

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

2919
  while (numOfRows < rows) {
86!
2920
    if (fetchNextUser) {
86!
2921
      pShow->pIter = sdbFetch(pSdb, SDB_USER, pShow->pIter, (void **)&pUser);
86✔
2922
      if (pShow->pIter == NULL) break;
86✔
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);
70✔
2933
    int32_t numOfWriteDbs = taosHashGetSize(pUser->writeDbs);
70✔
2934
    int32_t numOfTopics = taosHashGetSize(pUser->topics);
70✔
2935
    int32_t numOfReadTbs = taosHashGetSize(pUser->readTbs);
70✔
2936
    int32_t numOfWriteTbs = taosHashGetSize(pUser->writeTbs);
70✔
2937
    int32_t numOfAlterTbs = taosHashGetSize(pUser->alterTbs);
70✔
2938
    int32_t numOfReadViews = taosHashGetSize(pUser->readViews);
70✔
2939
    int32_t numOfWriteViews = taosHashGetSize(pUser->writeViews);
70✔
2940
    int32_t numOfAlterViews = taosHashGetSize(pUser->alterViews);
70✔
2941
    if (numOfRows + numOfReadDbs + numOfWriteDbs + numOfTopics + numOfReadTbs + numOfWriteTbs + numOfAlterTbs +
70✔
2942
            numOfReadViews + numOfWriteViews + numOfAlterViews >=
70!
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) {
70✔
2955
      cols = 0;
16✔
2956
      char userName[TSDB_USER_LEN + VARSTR_HEADER_SIZE] = {0};
16✔
2957
      STR_WITH_MAXSIZE_TO_VARSTR(userName, pUser->user, pShow->pMeta->pSchemas[cols].bytes);
16✔
2958
      SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
16✔
2959
      COL_DATA_SET_VAL_GOTO((const char *)userName, false, pUser, _exit);
16!
2960

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

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

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

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

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

2990
      numOfRows++;
16✔
2991
    }
2992

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3146
  pShow->numOfRows += numOfRows;
16✔
3147
_exit:
16✔
3148
  taosMemoryFreeClear(condition);
16!
3149
  taosMemoryFreeClear(sql);
16!
3150
  if (code < 0) {
16!
3151
    uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
×
3152
    TAOS_RETURN(code);
×
3153
  }
3154
  return numOfRows;
16✔
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,
89,181✔
3163
                                int32_t *pRspLen, int64_t ipWhiteListVer) {
3164
  int32_t           code = 0;
89,181✔
3165
  int32_t           lino = 0;
89,181✔
3166
  int32_t           rspLen = 0;
89,181✔
3167
  void             *pRsp = NULL;
89,181✔
3168
  SUserAuthBatchRsp batchRsp = {0};
89,181✔
3169

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

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

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

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

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

3212
  if (taosArrayGetSize(batchRsp.pArray) <= 0) {
89,181✔
3213
    *ppRsp = NULL;
88,020✔
3214
    *pRspLen = 0;
88,020✔
3215

3216
    tFreeSUserAuthBatchRsp(&batchRsp);
88,020✔
3217
    return 0;
88,020✔
3218
  }
3219

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

3242
  TAOS_RETURN(code);
1,161✔
3243
}
3244

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

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

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

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

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

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

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

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

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

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

3309
    bool inRead = (taosHashGet(newUser.readTbs, stb, len) != NULL);
433✔
3310
    bool inWrite = (taosHashGet(newUser.writeTbs, stb, len) != NULL);
433✔
3311
    bool inAlter = (taosHashGet(newUser.alterTbs, stb, len) != NULL);
433✔
3312
    if (inRead || inWrite || inAlter) {
433!
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);
433✔
3340
    sdbRelease(pSdb, pUser);
433✔
3341
  }
3342

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

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

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

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

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

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

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

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

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

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

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

3423
    bool inTopic = (taosHashGet(newUser.topics, topic, len) != NULL);
12✔
3424
    if (inTopic) {
12!
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);
12✔
3443
    sdbRelease(pSdb, pUser);
12✔
3444
  }
3445

3446
  if (pUser != NULL) sdbRelease(pSdb, pUser);
9!
3447
  if (pIter != NULL) sdbCancelFetch(pSdb, pIter);
9!
3448
  mndUserFreeObj(&newUser);
9✔
3449
  TAOS_RETURN(code);
9✔
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

© 2026 Coveralls, Inc