mirror of
https://github.com/djdevin/recnet-plugin.git
synced 2026-09-08 14:41:30 -07:00
447 lines
6.8 KiB
C
447 lines
6.8 KiB
C
#include "common.h"
|
|
|
|
#include "config.h"
|
|
#include "logger.h"
|
|
|
|
|
|
char redirect_ip[16] = DEFAULT_IP;
|
|
|
|
int redirect_port = DEFAULT_PORT;
|
|
|
|
|
|
char *redirect_domains[MAX_REDIRECTS];
|
|
|
|
int redirect_count_config = 0;
|
|
|
|
|
|
char *rewrite_from[MAX_REWRITES];
|
|
char *rewrite_to[MAX_REWRITES];
|
|
|
|
int rewrite_count = 0;
|
|
|
|
|
|
|
|
void LoadConfig()
|
|
{
|
|
HANDLE hFile =
|
|
CreateFileA(
|
|
CONFIG_FILE,
|
|
GENERIC_READ,
|
|
FILE_SHARE_READ,
|
|
NULL,
|
|
OPEN_EXISTING,
|
|
FILE_ATTRIBUTE_NORMAL,
|
|
NULL
|
|
);
|
|
|
|
|
|
if(hFile == INVALID_HANDLE_VALUE)
|
|
{
|
|
Log(
|
|
"[CONFIG] No config found, using defaults %s:%d",
|
|
redirect_ip,
|
|
redirect_port
|
|
);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
DWORD size =
|
|
GetFileSize(
|
|
hFile,
|
|
NULL
|
|
);
|
|
|
|
|
|
if(size == INVALID_FILE_SIZE)
|
|
{
|
|
CloseHandle(hFile);
|
|
|
|
Log(
|
|
"[CONFIG] Failed reading file size"
|
|
);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
char *buffer =
|
|
calloc(
|
|
1,
|
|
size + 1
|
|
);
|
|
|
|
|
|
if(!buffer)
|
|
{
|
|
CloseHandle(hFile);
|
|
|
|
Log(
|
|
"[CONFIG] Memory allocation failed"
|
|
);
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
DWORD read = 0;
|
|
|
|
|
|
ReadFile(
|
|
hFile,
|
|
buffer,
|
|
size,
|
|
&read,
|
|
NULL
|
|
);
|
|
|
|
|
|
CloseHandle(hFile);
|
|
|
|
|
|
|
|
//
|
|
// IP
|
|
//
|
|
|
|
char *ip =
|
|
strstr(
|
|
buffer,
|
|
"\"ip\""
|
|
);
|
|
|
|
|
|
if(ip)
|
|
{
|
|
char *colon =
|
|
strchr(
|
|
ip,
|
|
':'
|
|
);
|
|
|
|
|
|
if(colon)
|
|
{
|
|
char *start =
|
|
strchr(
|
|
colon,
|
|
'"'
|
|
);
|
|
|
|
|
|
if(start)
|
|
{
|
|
start++;
|
|
|
|
|
|
char *end =
|
|
strchr(
|
|
start,
|
|
'"'
|
|
);
|
|
|
|
|
|
if(end)
|
|
{
|
|
size_t len =
|
|
end - start;
|
|
|
|
|
|
if(len < sizeof(redirect_ip))
|
|
{
|
|
memcpy(
|
|
redirect_ip,
|
|
start,
|
|
len
|
|
);
|
|
|
|
|
|
redirect_ip[len] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Port
|
|
//
|
|
|
|
char *port =
|
|
strstr(
|
|
buffer,
|
|
"\"port\""
|
|
);
|
|
|
|
|
|
if(port)
|
|
{
|
|
char *colon =
|
|
strchr(
|
|
port,
|
|
':'
|
|
);
|
|
|
|
|
|
if(colon)
|
|
{
|
|
int p =
|
|
atoi(
|
|
colon + 1
|
|
);
|
|
|
|
|
|
if(
|
|
p > 0 &&
|
|
p < 65536
|
|
)
|
|
{
|
|
redirect_port = p;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
//
|
|
// Redirect domains
|
|
//
|
|
|
|
char *redirect =
|
|
strstr(
|
|
buffer,
|
|
"\"redirect\""
|
|
);
|
|
|
|
|
|
if(redirect)
|
|
{
|
|
char *array =
|
|
strchr(
|
|
redirect,
|
|
'['
|
|
);
|
|
|
|
|
|
if(array)
|
|
{
|
|
char *current =
|
|
array;
|
|
|
|
|
|
while(
|
|
redirect_count_config < MAX_REDIRECTS
|
|
)
|
|
{
|
|
char *q1 =
|
|
strchr(
|
|
current,
|
|
'"'
|
|
);
|
|
|
|
|
|
if(!q1)
|
|
break;
|
|
|
|
|
|
q1++;
|
|
|
|
|
|
char *q2 =
|
|
strchr(
|
|
q1,
|
|
'"'
|
|
);
|
|
|
|
|
|
if(!q2)
|
|
break;
|
|
|
|
|
|
|
|
size_t len =
|
|
q2 - q1;
|
|
|
|
|
|
|
|
redirect_domains[
|
|
redirect_count_config
|
|
] =
|
|
calloc(
|
|
1,
|
|
len + 1
|
|
);
|
|
|
|
|
|
if(
|
|
redirect_domains[
|
|
redirect_count_config
|
|
]
|
|
)
|
|
{
|
|
memcpy(
|
|
redirect_domains[
|
|
redirect_count_config
|
|
],
|
|
q1,
|
|
len
|
|
);
|
|
|
|
|
|
redirect_count_config++;
|
|
}
|
|
|
|
|
|
current =
|
|
q2 + 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Host rewrite pairs: "rewrite": [ { "from": "rec.net", "to": "recflare.net" }, ... ]
|
|
// Scanned sequentially -- within each object "from" precedes "to".
|
|
//
|
|
|
|
char *rw =
|
|
strstr(
|
|
buffer,
|
|
"\"rewrite\""
|
|
);
|
|
|
|
|
|
if(rw)
|
|
{
|
|
char *current = rw;
|
|
|
|
|
|
while(rewrite_count < MAX_REWRITES)
|
|
{
|
|
//
|
|
// "from" value
|
|
//
|
|
|
|
char *fk =
|
|
strstr(current, "\"from\"");
|
|
|
|
if(!fk)
|
|
break;
|
|
|
|
|
|
char *fv1 = strchr(fk + 6, '"');
|
|
if(!fv1) break;
|
|
fv1++;
|
|
|
|
char *fv2 = strchr(fv1, '"');
|
|
if(!fv2) break;
|
|
|
|
|
|
//
|
|
// "to" value (must follow this object's "from")
|
|
//
|
|
|
|
char *tk =
|
|
strstr(fv2, "\"to\"");
|
|
|
|
if(!tk)
|
|
break;
|
|
|
|
|
|
char *tv1 = strchr(tk + 4, '"');
|
|
if(!tv1) break;
|
|
tv1++;
|
|
|
|
char *tv2 = strchr(tv1, '"');
|
|
if(!tv2) break;
|
|
|
|
|
|
size_t flen = fv2 - fv1;
|
|
size_t tlen = tv2 - tv1;
|
|
|
|
|
|
char *fbuf = calloc(1, flen + 1);
|
|
char *tbuf = calloc(1, tlen + 1);
|
|
|
|
|
|
if(fbuf && tbuf)
|
|
{
|
|
memcpy(fbuf, fv1, flen);
|
|
memcpy(tbuf, tv1, tlen);
|
|
|
|
rewrite_from[rewrite_count] = fbuf;
|
|
rewrite_to[rewrite_count] = tbuf;
|
|
|
|
rewrite_count++;
|
|
}
|
|
else
|
|
{
|
|
free(fbuf);
|
|
free(tbuf);
|
|
}
|
|
|
|
|
|
current = tv2 + 1;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
free(buffer);
|
|
|
|
|
|
|
|
Log(
|
|
"[CONFIG] Loaded %d redirects",
|
|
redirect_count_config
|
|
);
|
|
|
|
|
|
Log(
|
|
"[CONFIG] Loaded %d host rewrites",
|
|
rewrite_count
|
|
);
|
|
|
|
|
|
for(
|
|
int i = 0;
|
|
i < rewrite_count;
|
|
i++
|
|
)
|
|
{
|
|
Log(
|
|
"[CONFIG] rewrite %s -> %s",
|
|
rewrite_from[i],
|
|
rewrite_to[i]
|
|
);
|
|
}
|
|
|
|
|
|
Log(
|
|
"[CONFIG] Redirect IP %s:%d",
|
|
redirect_ip,
|
|
redirect_port
|
|
);
|
|
|
|
|
|
|
|
for(
|
|
int i = 0;
|
|
i < redirect_count_config;
|
|
i++
|
|
)
|
|
{
|
|
Log(
|
|
"[CONFIG] %s",
|
|
redirect_domains[i]
|
|
);
|
|
}
|
|
} |