blob: 843cbaedf4250ae55f4fd388c1bc22f180750820 [file]
#include "stralloc.h"
#include "byte.h"
#include "surf.h"
#include "uint32.h"
#include "makehash.h"
#include "die.h"
#include "idx.h"
#include "surfpcs.h"
void makehash(const char *indata,unsigned int inlen,char *hash)
/* makes hash[COOKIE=20] from stralloc *indata, ignoring case and */
/* SPACE/TAB */
{
unsigned char h[32];
surfpcs s;
uint32 seed[32];
int i;
for (i = 0;i < 32;++i) seed[i] = 0;
surfpcs_init(&s,seed);
surfpcs_addlc(&s,indata,inlen);
surfpcs_out(&s,h);
for (i = 0;i < 20;++i)
hash[i] = 'a' + (h[i] & 15);
}
static stralloc dummy = {0};
void mkauthhash(const char *s,unsigned int len,char *h)
/* This is a string that should be the same for all messages from a given */
/* author. Doesn't have to be the real rfc822 address. We look for a '@' */
/* and grab everything up to the next '>', ' ', or ';'. We go back the same */
/* way, then take everything up to the '@' or the first '-'. The latter */
/* avoids problems with posters that band their addresses. */
{
unsigned int i,j,k,l;
char ch;
j = k = l = 0;
i = byte_rchr(s,len,'@');
if (i < len) { /* if not then i=sa->len, j=k=l=0 */
j = i;
while (++j < len) { /* if not found, then j=sa->len */
ch = s[j];
if (ch == '>' || ch == ' ' || ch == ';') break;
}
k = i;
while (k > 0) { /* k <= i */
ch = s[--k];
if (ch == '<' || ch == ' ' || ch == ';') break;
}
l = k; /* k <= l <= i; */
while (l < i && s[l] != '-') ++l;
if (!stralloc_copyb(&dummy,s + k, l - k)) die_nomem();
if (!stralloc_catb(&dummy,s + i, j - i)) die_nomem();
makehash(dummy.s,dummy.len,h);
} else /* use entire line if no '@' found */
makehash(s,len,h);
}