mndAuth.c 4.8 KB
Newer Older
H
refact  
Hongze Cheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/*
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 *
 * This program is free software: you can use, redistribute, and/or modify
 * it under the terms of the GNU Affero General Public License, version 3
 * or later ("AGPL"), as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

S
Shengliang Guan 已提交
16
#define _DEFAULT_SOURCE
S
Shengliang Guan 已提交
17
#include "mndAuth.h"
S
Shengliang Guan 已提交
18
#include "mndUser.h"
S
Shengliang Guan 已提交
19

S
Shengliang Guan 已提交
20
static int32_t mndProcessAuthReq(SNodeMsg *pReq);
S
Shengliang Guan 已提交
21

22 23 24 25 26 27 28
int32_t mndInitAuth(SMnode *pMnode) {
  mndSetMsgHandle(pMnode, TDMT_MND_AUTH, mndProcessAuthReq);
  return 0;
}

void mndCleanupAuth(SMnode *pMnode) {}

29 30
static int32_t mndRetriveAuth(SMnode *pMnode, SAuthRsp *pRsp) {
  SUserObj *pUser = mndAcquireUser(pMnode, pRsp->user);
S
Shengliang Guan 已提交
31
  if (pUser == NULL) {
32 33
    *pRsp->secret = 0;
    mError("user:%s, failed to auth user since %s", pRsp->user, terrstr());
S
Shengliang Guan 已提交
34 35 36
    return -1;
  }

37 38 39
  pRsp->spi = 1;
  pRsp->encrypt = 0;
  *pRsp->ckey = 0;
S
Shengliang Guan 已提交
40

41
  memcpy(pRsp->secret, pUser->pass, TSDB_PASSWORD_LEN);
S
Shengliang Guan 已提交
42 43
  mndReleaseUser(pMnode, pUser);

44
  mDebug("user:%s, auth info is returned", pRsp->user);
S
Shengliang Guan 已提交
45 46
  return 0;
}
47

S
Shengliang Guan 已提交
48
static int32_t mndProcessAuthReq(SNodeMsg *pReq) {
S
Shengliang Guan 已提交
49
  SAuthReq authReq = {0};
S
Shengliang Guan 已提交
50
  if (tDeserializeSAuthReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &authReq) != 0) {
S
Shengliang Guan 已提交
51 52 53 54 55 56
    terrno = TSDB_CODE_INVALID_MSG;
    return -1;
  }

  SAuthReq authRsp = {0};
  memcpy(authRsp.user, authReq.user, TSDB_USER_LEN);
S
Shengliang 已提交
57

58
  int32_t code = mndRetriveAuth(pReq->pNode, &authRsp);
S
Shengliang Guan 已提交
59 60 61 62 63
  mTrace("user:%s, auth req received, spi:%d encrypt:%d ruser:%s", pReq->user, authRsp.spi, authRsp.encrypt,
         authRsp.user);

  int32_t contLen = tSerializeSAuthReq(NULL, 0, &authRsp);
  void   *pRsp = rpcMallocCont(contLen);
64 65 66 67 68
  if (pRsp == NULL) {
    terrno = TSDB_CODE_OUT_OF_MEMORY;
    return -1;
  }

S
Shengliang Guan 已提交
69
  tSerializeSAuthReq(pRsp, contLen, &authRsp);
70

S
Shengliang Guan 已提交
71 72
  pReq->pRsp = pRsp;
  pReq->rspLen = contLen;
S
Shengliang 已提交
73
  return code;
S
Shengliang Guan 已提交
74 75 76
}

int32_t mndCheckCreateUserAuth(SUserObj *pOperUser) {
S
Shengliang Guan 已提交
77
  if (pOperUser->superUser) return 0;
S
Shengliang Guan 已提交
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
  terrno = TSDB_CODE_MND_NO_RIGHTS;
  return -1;
}

int32_t mndCheckAlterUserAuth(SUserObj *pOperUser, SUserObj *pUser, SDbObj *pDb, SAlterUserReq *pAlter) {
  if (pAlter->alterType == TSDB_ALTER_USER_PASSWD) {
    if (pOperUser->superUser || strcmp(pUser->user, pOperUser->user) == 0) {
      return 0;
    }
  }

  if (pAlter->alterType == TSDB_ALTER_USER_SUPERUSER) {
    if (strcmp(pUser->user, TSDB_DEFAULT_USER) == 0) {
      terrno = TSDB_CODE_MND_NO_RIGHTS;
      return -1;
    }

    if (pOperUser->superUser) {
      return 0;
    }
  }

100 101 102
  if (pAlter->alterType == TSDB_ALTER_USER_CLEAR_WRITE_DB || pAlter->alterType == TSDB_ALTER_USER_CLEAR_READ_DB) {
    if (pOperUser->superUser) {
      return 0;
S
Shengliang Guan 已提交
103
    }
104
  }
S
Shengliang Guan 已提交
105 106 107 108 109 110 111 112 113 114 115 116 117

  if (pAlter->alterType == TSDB_ALTER_USER_ADD_READ_DB || pAlter->alterType == TSDB_ALTER_USER_REMOVE_READ_DB ||
      pAlter->alterType == TSDB_ALTER_USER_ADD_WRITE_DB || pAlter->alterType == TSDB_ALTER_USER_REMOVE_WRITE_DB) {
    if (pOperUser->superUser || strcmp(pUser->user, pDb->createUser) == 0) {
      return 0;
    }
  }

  terrno = TSDB_CODE_MND_NO_RIGHTS;
  return -1;
}

int32_t mndCheckDropUserAuth(SUserObj *pOperUser) {
S
Shengliang Guan 已提交
118
  if (pOperUser->superUser) return 0;
S
Shengliang Guan 已提交
119 120
  terrno = TSDB_CODE_MND_NO_RIGHTS;
  return -1;
S
Shengliang Guan 已提交
121 122
}

S
Shengliang Guan 已提交
123
int32_t mndCheckNodeAuth(SUserObj *pOperUser) {
S
Shengliang Guan 已提交
124
  if (pOperUser->superUser) return 0;
S
Shengliang Guan 已提交
125 126 127 128
  terrno = TSDB_CODE_MND_NO_RIGHTS;
  return -1;
}

S
Shengliang Guan 已提交
129
int32_t mndCheckFuncAuth(SUserObj *pOperUser) {
S
Shengliang Guan 已提交
130 131 132 133
  if (pOperUser->superUser) return 0;
  terrno = TSDB_CODE_MND_NO_RIGHTS;
  return -1;
}
S
Shengliang Guan 已提交
134

S
Shengliang Guan 已提交
135 136
int32_t mndCheckTransAuth(SUserObj *pOperUser) {
  if (pOperUser->superUser) return 0;
S
Shengliang Guan 已提交
137 138 139
  terrno = TSDB_CODE_MND_NO_RIGHTS;
  return -1;
}
S
Shengliang Guan 已提交
140 141 142

int32_t mndCheckCreateDbAuth(SUserObj *pOperUser) { return 0; }

S
Shengliang Guan 已提交
143
int32_t mndCheckAlterDropCompactDbAuth(SUserObj *pOperUser, SDbObj *pDb) {
S
Shengliang Guan 已提交
144 145 146 147 148 149 150 151 152
  if (pOperUser->superUser || strcmp(pOperUser->user, pDb->createUser) == 0) {
    return 0;
  }

  terrno = TSDB_CODE_MND_NO_RIGHTS;
  return -1;
}

int32_t mndCheckUseDbAuth(SUserObj *pOperUser, SDbObj *pDb) { return 0; }
S
Shengliang Guan 已提交
153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177

int32_t mndCheckWriteAuth(SUserObj *pOperUser, SDbObj *pDb) {
  if (pOperUser->superUser || strcmp(pOperUser->user, pDb->createUser) == 0) {
    return 0;
  }

  if (taosHashGet(pOperUser->writeDbs, pDb->name, strlen(pDb->name) + 1) != NULL) {
    return 0;
  }

  terrno = TSDB_CODE_MND_NO_RIGHTS;
  return -1;
}

int32_t mndCheckReadAuth(SUserObj *pOperUser, SDbObj *pDb) {
  if (pOperUser->superUser || strcmp(pOperUser->user, pDb->createUser) == 0) {
    return 0;
  }

  if (taosHashGet(pOperUser->readDbs, pDb->name, strlen(pDb->name) + 1) != NULL) {
    return 0;
  }

  terrno = TSDB_CODE_MND_NO_RIGHTS;
  return -1;
178
}