From dbc75feac39af1cf199071c7d7481694734d66a6 Mon Sep 17 00:00:00 2001 From: cademfly Date: Thu, 30 Mar 2023 15:56:08 +0800 Subject: [PATCH] normal table --- include/util/taoserror.h | 1 + source/dnode/mnode/impl/src/mndUser.c | 144 +++++++++++--------------- source/util/src/terror.c | 1 + 3 files changed, 61 insertions(+), 85 deletions(-) diff --git a/include/util/taoserror.h b/include/util/taoserror.h index 6489304bda..5629054720 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -241,6 +241,7 @@ int32_t* taosGetErrno(); #define TSDB_CODE_MND_INVALID_ALTER_OPER TAOS_DEF_ERROR_CODE(0, 0x0356) #define TSDB_CODE_MND_AUTH_FAILURE TAOS_DEF_ERROR_CODE(0, 0x0357) #define TSDB_CODE_MND_USER_NOT_AVAILABLE TAOS_DEF_ERROR_CODE(0, 0x0358) +#define TSDB_CODE_MND_PRIVILEDGE_EXIST TAOS_DEF_ERROR_CODE(0, 0x0359) // mnode-stable-part1 #define TSDB_CODE_MND_STB_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0360) diff --git a/source/dnode/mnode/impl/src/mndUser.c b/source/dnode/mnode/impl/src/mndUser.c index 9be18a7c70..c1ce147444 100644 --- a/source/dnode/mnode/impl/src/mndUser.c +++ b/source/dnode/mnode/impl/src/mndUser.c @@ -647,6 +647,61 @@ SHashObj *mndDupDbHash(SHashObj *pOld) { return mndDupObjHash(pOld, TSDB_DB_FNAM SHashObj *mndDupTopicHash(SHashObj *pOld) { return mndDupObjHash(pOld, TSDB_TOPIC_FNAME_LEN); } +static int32_t mndTagPriviledge(SMnode *pMnode, SHashObj *hash, SAlterUserReq *alterReq){ + char tbFName[TSDB_TABLE_FNAME_LEN] = {0}; + snprintf(tbFName, TSDB_TABLE_FNAME_LEN, "%s.%s", alterReq->objname, alterReq->tabName); + int32_t len = strlen(tbFName) + 1; + + SStbObj *pStb = mndAcquireStb(pMnode, tbFName); + if (pStb == NULL) { + mndReleaseStb(pMnode, pStb); + return -1; + } + if(alterReq->tagCond == NULL){ + mndReleaseStb(pMnode, pStb); + return -1; + } + + char *value = taosHashGet(hash, tbFName, len); + if(value != NULL){ + mndReleaseStb(pMnode, pStb); + terrno = TSDB_CODE_MND_PRIVILEDGE_EXIST; + return -1; + } + + int32_t condLen = alterReq->tagCondLen + 1; + if (taosHashPut(hash, tbFName, len, alterReq->tagCond, condLen) != 0) { + mndReleaseStb(pMnode, pStb); + return -1; + } + mndReleaseStb(pMnode, pStb); + return 0; +} + +static int32_t mndTablePriviledge(SMnode *pMnode, SHashObj *hash, SAlterUserReq *alterReq, SSdb *pSdb){ + void *pIter = NULL; + + if (strcmp(alterReq->tabName, "1.*") != 0) { + char tbFName[TSDB_TABLE_FNAME_LEN] = {0}; + snprintf(tbFName, sizeof(tbFName), "%s.%s", alterReq->objname, alterReq->tabName); + int32_t len = strlen(tbFName) + 1; + + if (taosHashPut(hash, tbFName, len, tbFName, len) != 0) { + return -1; + } + } else { + while (1) { + SStbObj *pStb = NULL; + pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb); + if (pIter == NULL) break; + int32_t len = strlen(pStb->name) + 1; + taosHashPut(hash, pStb->name, len, pStb->name, len); + sdbRelease(pSdb, pStb); + } + } + return 0; +} + static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) { SMnode *pMnode = pReq->info.node; SSdb *pSdb = pMnode->pSdb; @@ -787,57 +842,11 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) { } if (alterReq.alterType == TSDB_ALTER_USER_ADD_READ_TABLE || alterReq.alterType == TSDB_ALTER_USER_ADD_ALL_TABLE) { - if (strcmp(alterReq.tabName, "1.*") != 0) { - char tbFName[TSDB_TABLE_FNAME_LEN] = {0}; - snprintf(tbFName, sizeof(tbFName), "%s.%s", alterReq.objname, alterReq.tabName); - - int32_t len = strlen(tbFName) + 1; - SStbObj *pStb = mndAcquireStb(pMnode, tbFName); - if (pStb == NULL) { - mndReleaseStb(pMnode, pStb); - goto _OVER; - } - if (taosHashPut(newUser.readTbs, tbFName, len, tbFName, len) != 0) { - mndReleaseStb(pMnode, pStb); - goto _OVER; - } - } else { - while (1) { - SStbObj *pStb = NULL; - pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb); - if (pIter == NULL) break; - int32_t len = strlen(pStb->name) + 1; - taosHashPut(newUser.readTbs, pStb->name, len, pStb->name, len); - sdbRelease(pSdb, pStb); - } - } + if(mndTablePriviledge(pMnode, newUser.readTbs, &alterReq, pSdb) != 0) goto _OVER; } if (alterReq.alterType == TSDB_ALTER_USER_ADD_WRITE_TABLE || alterReq.alterType == TSDB_ALTER_USER_ADD_ALL_TABLE) { - if (strcmp(alterReq.tabName, "1.*") != 0) { - char tbFName[TSDB_TABLE_FNAME_LEN] = {0}; - snprintf(tbFName, sizeof(tbFName), "%s.%s", alterReq.objname, alterReq.tabName); - - int32_t len = strlen(tbFName) + 1; - SStbObj *pStb = mndAcquireStb(pMnode, tbFName); - if (pStb == NULL) { - mndReleaseStb(pMnode, pStb); - goto _OVER; - } - if (taosHashPut(newUser.writeTbs, tbFName, len, tbFName, len) != 0) { - mndReleaseStb(pMnode, pStb); - goto _OVER; - } - } else { - while (1) { - SStbObj *pStb = NULL; - pIter = sdbFetch(pSdb, SDB_STB, pIter, (void **)&pStb); - if (pIter == NULL) break; - int32_t len = strlen(pStb->name) + 1; - taosHashPut(newUser.writeTbs, pStb->name, len, pStb->name, TSDB_DB_FNAME_LEN); - sdbRelease(pSdb, pStb); - } - } + if(mndTablePriviledge(pMnode, newUser.writeTbs, &alterReq, pSdb) != 0) goto _OVER; } if (alterReq.alterType == TSDB_ALTER_USER_REMOVE_READ_TABLE || @@ -925,46 +934,11 @@ static int32_t mndProcessAlterUserReq(SRpcMsg *pReq) { } if (alterReq.alterType == TSDB_ALTER_USER_ADD_READ_TAG) { - char tbFName[TSDB_TABLE_FNAME_LEN] = {0}; - snprintf(tbFName, TSDB_TABLE_FNAME_LEN, "%s.%s", alterReq.objname, alterReq.tabName); - int32_t len = strlen(tbFName) + 1; - - SStbObj *pStb = mndAcquireStb(pMnode, tbFName); - if (pStb == NULL) { - mndReleaseStb(pMnode, pStb); - goto _OVER; - } - if(alterReq.tagCond == NULL){ - mndReleaseStb(pMnode, pStb); - goto _OVER; - } - - int32_t condLen = alterReq.tagCondLen + 1; - if (taosHashPut(newUser.readTbs, tbFName, len, alterReq.tagCond, condLen) != 0) { - mndReleaseStb(pMnode, pStb); - goto _OVER; - } + if(mndTagPriviledge(pMnode, newUser.readTbs, &alterReq) != 0) goto _OVER; } if (alterReq.alterType == TSDB_ALTER_USER_ADD_WRITE_TAG) { - char tbFName[TSDB_TABLE_FNAME_LEN] = {0}; - snprintf(tbFName, sizeof(tbFName), "%s.%s", alterReq.objname, alterReq.tabName); - int32_t len = strlen(tbFName) + 1; - - SStbObj *pStb = mndAcquireStb(pMnode, tbFName); - if (pStb == NULL) { - mndReleaseStb(pMnode, pStb); - goto _OVER; - } - if(alterReq.tagCond == NULL){ - mndReleaseStb(pMnode, pStb); - goto _OVER; - } - int32_t condLen = alterReq.tagCondLen + 1; - if (taosHashPut(newUser.writeTbs, tbFName, len, alterReq.tagCond, condLen) != 0) { - mndReleaseStb(pMnode, pStb); - goto _OVER; - } + if(mndTagPriviledge(pMnode, newUser.writeTbs, &alterReq) != 0) goto _OVER; } if (alterReq.alterType == TSDB_ALTER_USER_REMOVE_SUBSCRIBE_TOPIC) { diff --git a/source/util/src/terror.c b/source/util/src/terror.c index b84d58bfe8..c7ef5d8291 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -190,6 +190,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_NO_USER_FROM_CONN, "Can not get user from TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_MANY_USERS, "Too many users") TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_ALTER_OPER, "Invalid alter operation") TAOS_DEFINE_ERROR(TSDB_CODE_MND_AUTH_FAILURE, "Authentication failure") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_PRIVILEDGE_EXIST, "User already have this priviledge") //mnode-stable-part1 TAOS_DEFINE_ERROR(TSDB_CODE_MND_STB_ALREADY_EXIST, "STable already exists")