add rpc update interface
This commit is contained in:
parent
30e6a9fdc5
commit
f11763f6ab
|
@ -189,31 +189,116 @@ static void uvHandleActivityTimeout(uv_timer_t* handle) {
|
||||||
tDebug("%p timeout since no activity", conn);
|
tDebug("%p timeout since no activity", conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t netmask;
|
||||||
|
int32_t address;
|
||||||
|
int32_t network;
|
||||||
|
int32_t broadcast;
|
||||||
|
char info[32];
|
||||||
|
int8_t type;
|
||||||
|
} SubnetUtils;
|
||||||
|
|
||||||
static bool uvCheckIp(char* range, char* ip) {
|
int32_t subnetInit(SubnetUtils* pUtils, char* range) {
|
||||||
// impl later
|
strncpy(pUtils->info, range, strlen(range));
|
||||||
return strcmp(range, ip) == 0;
|
|
||||||
|
int16_t ip[5] = {0};
|
||||||
|
int k = 0;
|
||||||
|
char* start = pUtils->info;
|
||||||
|
char* end = start;
|
||||||
|
|
||||||
|
for (k = 0; *start != '\0'; start = end) {
|
||||||
|
for (end = start; *end != '.' && *end != '/' && *end != '\0'; end++) {
|
||||||
|
//
|
||||||
|
}
|
||||||
|
if (*end == '.' || *end == '/') {
|
||||||
|
*end = '\0';
|
||||||
|
end++;
|
||||||
|
}
|
||||||
|
ip[k++] = atoi(start);
|
||||||
|
}
|
||||||
|
if (k < 4) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 4; i++) {
|
||||||
|
pUtils->address |= (ip[i] << (8 * (4 - i - 1)));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < ip[4]; i++) {
|
||||||
|
pUtils->netmask |= (32 - i);
|
||||||
|
}
|
||||||
|
|
||||||
|
pUtils->network = pUtils->address & pUtils->netmask;
|
||||||
|
pUtils->broadcast = (pUtils->network) | (pUtils->netmask ^ 0xFFFFFFFF);
|
||||||
|
pUtils->type = (k == 4 ? 0 : 1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
static bool uvFilteByWhiteList(SWorkThrd* pThrd, char* user, uint32_t ip) {
|
int32_t subnetIsInRange(SubnetUtils* pUtils, uint32_t ip) {
|
||||||
|
// impl later
|
||||||
|
if (pUtils == NULL) return false;
|
||||||
|
if (pUtils->type == 0) {
|
||||||
|
return pUtils->address == ip;
|
||||||
|
} else {
|
||||||
|
return pUtils->network >= ip && pUtils->broadcast <= ip;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool uvCheckIp(char* range, int32_t ip) {
|
||||||
|
// impl later
|
||||||
|
SubnetUtils subnet = {0};
|
||||||
|
if (subnetInit(&subnet, range) != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return subnetIsInRange(&subnet, ip);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void uvWhiteListDestroy(SHashObj* pWhiteList) {
|
||||||
|
void* pIter = taosHashIterate(pWhiteList, NULL);
|
||||||
|
while (pIter) {
|
||||||
|
SArray* list = *(SArray**)pIter;
|
||||||
|
for (int i = 0; i < taosArrayGetSize(list); i++) {
|
||||||
|
char* range = taosArrayGetP(list, i);
|
||||||
|
taosMemoryFree(range);
|
||||||
|
}
|
||||||
|
taosArrayDestroy(list);
|
||||||
|
pIter = taosHashIterate(pWhiteList, pIter);
|
||||||
|
}
|
||||||
|
taosHashCleanup(pWhiteList);
|
||||||
|
}
|
||||||
|
static bool uvWhiteListAdd(SHashObj* pWhiteList, char* user, char* ip) {
|
||||||
|
SArray** pWhite = taosHashGet(pWhiteList, user, strlen(user));
|
||||||
|
if (pWhite == NULL || *pWhite == NULL) {
|
||||||
|
SArray* list = taosArrayInit(8, sizeof(void*));
|
||||||
|
taosArrayPush(list, &ip);
|
||||||
|
taosHashPut(pWhiteList, user, strlen(user), &list, sizeof(void*));
|
||||||
|
} else {
|
||||||
|
taosArrayPush(*pWhite, &ip);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool uvWhiteListFilte(SHashObj* pWhiteList, char* user, uint32_t ip) {
|
||||||
// impl check
|
// impl check
|
||||||
bool valid = false;
|
bool valid = false;
|
||||||
SArray** pWhite = taosHashGet(pThrd->pWhiteList, user, strlen(user));
|
SArray** pWhite = taosHashGet(pWhiteList, user, strlen(user));
|
||||||
if (pWhite == NULL || *pWhite == NULL) {
|
if (pWhite == NULL || *pWhite == NULL) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
char userIp[64] = {0};
|
// char userIp[64] = {0};
|
||||||
tinet_ntoa(userIp, ip);
|
// tinet_ntoa(userIp, ip);
|
||||||
|
|
||||||
for (int i = 0; i < taosArrayGetSize(*pWhite); i++) {
|
for (int i = 0; i < taosArrayGetSize(*pWhite); i++) {
|
||||||
char* range = taosArrayGetP(*pWhite, i);
|
char* range = taosArrayGetP(*pWhite, i);
|
||||||
if (uvCheckIp(range, userIp)) {
|
if (uvCheckIp(range, ip)) {
|
||||||
valid = true;
|
valid = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return valid;
|
return valid;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool uvHandleReq(SSvrConn* pConn) {
|
static bool uvHandleReq(SSvrConn* pConn) {
|
||||||
STrans* pTransInst = pConn->pTransInst;
|
STrans* pTransInst = pConn->pTransInst;
|
||||||
SWorkThrd* pThrd = pConn->hostThrd;
|
SWorkThrd* pThrd = pConn->hostThrd;
|
||||||
|
@ -225,7 +310,7 @@ static bool uvHandleReq(SSvrConn* pConn) {
|
||||||
tError("%s conn %p read invalid packet", transLabel(pTransInst), pConn);
|
tError("%s conn %p read invalid packet", transLabel(pTransInst), pConn);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (uvFilteByWhiteList(pThrd, pHead->user, pConn->clientIp) == false) {
|
if (uvWhiteListFilte(pThrd->pWhiteList, pHead->user, pConn->clientIp) == false) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue