summaryrefslogtreecommitdiffstats
path: root/plugins/mmanon/mmanon.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/mmanon/mmanon.c')
-rw-r--r--plugins/mmanon/mmanon.c94
1 files changed, 75 insertions, 19 deletions
diff --git a/plugins/mmanon/mmanon.c b/plugins/mmanon/mmanon.c
index f84cc8e9..c9add1a1 100644
--- a/plugins/mmanon/mmanon.c
+++ b/plugins/mmanon/mmanon.c
@@ -49,6 +49,11 @@ DEF_OMOD_STATIC_DATA
typedef struct _instanceData {
char replChar;
+ int8_t mode;
+# define SIMPLE_MODE 0 /* just overwrite */
+ struct {
+ int8_t bits;
+ } ipv4;
} instanceData;
struct modConfData_s {
@@ -61,7 +66,9 @@ static modConfData_t *runModConf = NULL;/* modConf ptr to use for the current ex
/* tables for interfacing with the v6 config system */
/* action (instance) parameters */
static struct cnfparamdescr actpdescr[] = {
+ { "mode", eCmdHdlrGetWord, 0 },
{ "replacementchar", eCmdHdlrGetChar, 0 },
+ { "ipv4.bits", eCmdHdlrInt, 0 },
};
static struct cnfparamblk actpblk =
{ CNFPARAMBLK_VERSION,
@@ -111,12 +118,15 @@ ENDfreeInstance
static inline void
setInstParamDefaults(instanceData *pData)
{
+ pData->mode = SIMPLE_MODE;
pData->replChar = 'x';
+ pData->ipv4.bits = 16;
}
BEGINnewActInst
struct cnfparamvals *pvals;
int i;
+ sbool bHadBitsErr;
CODESTARTnewActInst
DBGPRINTF("newActInst (mmanon)\n");
if((pvals = nvlstGetParams(lst, &actpblk, NULL)) == NULL) {
@@ -131,17 +141,50 @@ CODESTARTnewActInst
for(i = 0 ; i < actpblk.nParams ; ++i) {
if(!pvals[i].bUsed)
continue;
- if(!strcmp(actpblk.descr[i].name, "replacementchar")) {
+ if(!strcmp(actpblk.descr[i].name, "mode")) {
+ if(!es_strbufcmp(pvals[i].val.d.estr, (uchar*)"simple",
+ sizeof("simple")-1)) {
+ pData->mode = SIMPLE_MODE;
+ } else {
+ char *cstr = es_str2cstr(pvals[i].val.d.estr, NULL);
+ errmsg.LogError(0, RS_RET_INVLD_MODE,
+ "mmanon: invalid anonymization mode '%s' - ignored",
+ cstr);
+ free(cstr);
+ }
pData->replChar = es_getBufAddr(pvals[i].val.d.estr)[0];
- //pData->replChar = (uchar*)es_str2cstr(pvals[i].val.d.estr, NULL);
- //} else if(!strcmp(actpblk.descr[i].name, "serverport")) {
- // pData->port = (int) pvals[i].val.d.n;
+ } else if(!strcmp(actpblk.descr[i].name, "replacementchar")) {
+ pData->replChar = es_getBufAddr(pvals[i].val.d.estr)[0];
+ } else if(!strcmp(actpblk.descr[i].name, "ipv4.bits")) {
+ pData->ipv4.bits = (int8_t) pvals[i].val.d.n;
} else {
dbgprintf("mmanon: program error, non-handled "
"param '%s'\n", actpblk.descr[i].name);
}
}
+ if(pData->mode == SIMPLE_MODE) {
+ bHadBitsErr = 0;
+ if(pData->ipv4.bits < 8) {
+ pData->ipv4.bits = 8;
+ bHadBitsErr = 1;
+ } else if(pData->ipv4.bits < 16) {
+ pData->ipv4.bits = 16;
+ bHadBitsErr = 1;
+ } else if(pData->ipv4.bits < 24) {
+ pData->ipv4.bits = 24;
+ bHadBitsErr = 1;
+ } else if(pData->ipv4.bits != 32) {
+ pData->ipv4.bits = 32;
+ bHadBitsErr = 1;
+ }
+ if(bHadBitsErr)
+ errmsg.LogError(0, RS_RET_INVLD_ANON_BITS,
+ "mmanon: invalid number of ipv4 bits "
+ "in simple mode, corrected to %d",
+ pData->ipv4.bits);
+ }
+
CODE_STD_FINALIZERnewActInst
cnfparamvalsDestruct(pvals, &actpblk);
ENDnewActInst
@@ -180,8 +223,9 @@ void
anonip(instanceData *pData, uchar *msg, int lenMsg, int *idx)
{
int i = *idx;
- int octet;
- int ipstart;
+ int octet[4];
+ int ipstart[4];
+ int j;
dbgprintf("DDDD: in anonip: %s\n", msg+(*idx));
while(i < lenMsg && (msg[i] <= '0' || msg[i] >= '9')) {
@@ -191,24 +235,36 @@ dbgprintf("DDDD: in anonip: %s\n", msg+(*idx));
goto done;
/* got digit, let's see if ip */
- ipstart = i;
- octet = getnum(msg, lenMsg, &i);
- if(octet > 255 || msg[i] != '.') goto done;
+ ipstart[0] = i;
+ octet[0] = getnum(msg, lenMsg, &i);
+ if(octet[0] > 255 || msg[i] != '.') goto done;
++i;
- octet = getnum(msg, lenMsg, &i);
- if(octet > 255 || msg[i] != '.') goto done;
+ ipstart[1] = i;
+ octet[1] = getnum(msg, lenMsg, &i);
+ if(octet[1] > 255 || msg[i] != '.') goto done;
++i;
- octet = getnum(msg, lenMsg, &i);
- if(octet > 255 || msg[i] != '.') goto done;
+ ipstart[2] = i;
+ octet[2] = getnum(msg, lenMsg, &i);
+ if(octet[2] > 255 || msg[i] != '.') goto done;
++i;
- octet = getnum(msg, lenMsg, &i);
- if(octet > 255 || msg[i] != ' ') goto done;
+ ipstart[3] = i;
+ octet[3] = getnum(msg, lenMsg, &i);
+ if(octet[3] > 255 || !(msg[i] == ' ' || msg[i] == ':')) goto done;
/* OK, we now found an ip address */
- while(ipstart < i) {
- if(msg[ipstart] != '.')
- msg[ipstart] = pData->replChar;
- ++ipstart;
+ if(pData->ipv4.bits == 8)
+ j = ipstart[3];
+ else if(pData->ipv4.bits == 16)
+ j = ipstart[2];
+ else if(pData->ipv4.bits == 24)
+ j = ipstart[1];
+ else /* due to our checks, this *must* be 32 */
+ j = ipstart[0];
+dbgprintf("DDDD: ipstart is %d: %s\n", j, msg+j);
+ while(j < i) {
+ if(msg[j] != '.')
+ msg[j] = pData->replChar;
+ ++j;
}
done: *idx = i;