1.DOH 协议解析 2.DOH 协议还原 3.DOH POST请求 early response 4.DOH 策略扫描 5.tfe plugin 支持多个 bussiness 插件调用 6.Maat_feather 的创建从 pangu 剥离(涉及pangu/doh/ssl-policy) 7.增加 kafka 日志 8.增加测试用例
230 lines
5.6 KiB
C++
230 lines
5.6 KiB
C++
|
|
#include <MESA/MESA_htable.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <tfe_utils.h>
|
|
#include <time.h>
|
|
#include <assert.h>
|
|
|
|
int addr_sock_to_layer(struct sockaddr * sock_addr, int sockaddrlen, struct layer_addr * layer_addr)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int addr_layer_to_sock(struct layer_addr * layer_addr, struct sockaddr * sock_addr)
|
|
{
|
|
int sockaddrlen=-1;
|
|
return sockaddrlen;
|
|
}
|
|
|
|
//functioned as strdup, for dictator compatible.
|
|
char* tfe_strdup(const char* s)
|
|
{
|
|
char*d=NULL;
|
|
if(s==NULL)
|
|
{
|
|
return NULL;
|
|
}
|
|
|
|
d=(char*)malloc(strlen(s)+1);
|
|
memcpy(d,s,strlen(s)+1);
|
|
return d;
|
|
}
|
|
char *tfe_thread_safe_ctime(const time_t *tp, char *buf, int len)
|
|
{
|
|
struct tm local_time;
|
|
time_t now;
|
|
static unsigned char weekday_str[7][4] =
|
|
{"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
|
|
static unsigned char month_str[12][4] = {"Jan", "Feb", "Mar", "Apr",
|
|
"May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
|
};
|
|
time(&now);
|
|
if(NULL == (localtime_r(&now, &local_time)))
|
|
return NULL;
|
|
len = snprintf(buf, len, "%s %s %d %02d:%02d:%02d %d", weekday_str[local_time.tm_wday],
|
|
month_str[local_time.tm_mon], local_time.tm_mday, local_time.tm_hour, local_time.tm_min, local_time.tm_sec, local_time.tm_year+1900);
|
|
return buf;
|
|
}
|
|
//replacement of glibc scandir, to adapt dictator malloc wrap
|
|
int tfe_scandir(const char *dir, struct dirent ***namelist,
|
|
int(*filter)(const struct dirent *),
|
|
int(*compar)(const void *, const void *))
|
|
{
|
|
DIR * od;
|
|
int n = 0;
|
|
int ENLARGE_STEP=1024;
|
|
int DIR_ENT_SIZE=ENLARGE_STEP;
|
|
struct dirent ** list = NULL;
|
|
struct dirent * p;
|
|
struct dirent entry,*result;
|
|
|
|
if((dir == NULL) || (namelist == NULL))
|
|
return -1;
|
|
|
|
od = opendir(dir);
|
|
if(od == NULL)
|
|
return -1;
|
|
|
|
list = (struct dirent **)malloc(DIR_ENT_SIZE*sizeof(struct dirent *));
|
|
|
|
|
|
while(0==readdir_r(od,&entry,&result))
|
|
{
|
|
if(result==NULL)
|
|
{
|
|
break;
|
|
}
|
|
if( filter && !filter(&entry))
|
|
continue;
|
|
|
|
p = (struct dirent *)malloc(sizeof(struct dirent));
|
|
memcpy((void *)p,(void *)(&entry),sizeof(struct dirent));
|
|
list[n] = p;
|
|
|
|
n++;
|
|
if(n >= DIR_ENT_SIZE)
|
|
{
|
|
DIR_ENT_SIZE+=ENLARGE_STEP;
|
|
list=(struct dirent **)realloc((void*)list,DIR_ENT_SIZE*sizeof(struct dirent *));
|
|
|
|
}
|
|
}
|
|
|
|
closedir(od);
|
|
|
|
*namelist = list;
|
|
|
|
if(compar)
|
|
qsort((void *)*namelist,n,sizeof(struct dirent *),compar);
|
|
|
|
return n;
|
|
|
|
}
|
|
|
|
char *tfe_read_file(const char *filename, size_t *filelen)
|
|
{
|
|
FILE *file = NULL;
|
|
long length = 0;
|
|
char *content = NULL;
|
|
size_t read_chars = 0;
|
|
|
|
file = fopen(filename, "rb");
|
|
if (file == NULL)
|
|
{
|
|
goto cleanup;
|
|
}
|
|
if (fseek(file, 0, SEEK_END) != 0)
|
|
{
|
|
goto cleanup;
|
|
}
|
|
length = ftell(file);
|
|
if (length < 0)
|
|
{
|
|
goto cleanup;
|
|
}
|
|
if (fseek(file, 0, SEEK_SET) != 0)
|
|
{
|
|
goto cleanup;
|
|
}
|
|
|
|
/* allocate content buffer */
|
|
content = (char*)malloc((size_t)length + sizeof(""));
|
|
if (content == NULL)
|
|
{
|
|
goto cleanup;
|
|
}
|
|
|
|
/* read the file into memory */
|
|
read_chars = fread(content, sizeof(char), (size_t)length, file);
|
|
if ((long)read_chars != length)
|
|
{
|
|
free(content);
|
|
content = NULL;
|
|
goto cleanup;
|
|
}
|
|
*filelen = read_chars;
|
|
content[read_chars] = '\0';
|
|
cleanup:
|
|
if (file != NULL)
|
|
{
|
|
fclose(file);
|
|
}
|
|
return content;
|
|
}
|
|
|
|
static int tfe_decode_base64_internal(u_char *dst, u_char *src, const u_char *basis)
|
|
{
|
|
size_t len;
|
|
u_char *d, *s;
|
|
|
|
for (len = 0; len < strlen((char *)src); len++)
|
|
{
|
|
if (src[len] == '=')
|
|
{
|
|
break;
|
|
}
|
|
|
|
if (basis[src[len]] == 77)
|
|
{
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
if (len % 4 == 1)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
s = src;
|
|
d = dst;
|
|
|
|
while (len > 3)
|
|
{
|
|
*d++ = (u_char) (basis[s[0]] << 2 | basis[s[1]] >> 4);
|
|
*d++ = (u_char) (basis[s[1]] << 4 | basis[s[2]] >> 2);
|
|
*d++ = (u_char) (basis[s[2]] << 6 | basis[s[3]]);
|
|
|
|
s += 4;
|
|
len -= 4;
|
|
}
|
|
|
|
if (len > 1)
|
|
{
|
|
*d++ = (u_char) (basis[s[0]] << 2 | basis[s[1]] >> 4);
|
|
}
|
|
|
|
if (len > 2)
|
|
{
|
|
*d++ = (u_char) (basis[s[1]] << 4 | basis[s[2]] >> 2);
|
|
}
|
|
|
|
return d - dst;
|
|
}
|
|
|
|
int tfe_decode_base64url(u_char *dst, u_char *src)
|
|
{
|
|
static u_char basis64[] = {
|
|
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
|
|
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
|
|
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 62, 77, 77,
|
|
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 77, 77, 77, 77, 77, 77,
|
|
77, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
|
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 77, 77, 77, 77, 63,
|
|
77, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
|
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 77, 77, 77, 77, 77,
|
|
|
|
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
|
|
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
|
|
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
|
|
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
|
|
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
|
|
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
|
|
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
|
|
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77
|
|
};
|
|
|
|
return tfe_decode_base64_internal(dst, src, basis64);
|
|
}
|