--- stats\README.orig Thu Aug 19 21:00:38 2010 +++ stats\README Wed Aug 25 14:33:31 2010 @@ -115,7 +115,7 @@ M identifies a message S identifies a signature -A message record is a comma-separated, ordered sequence of fields, as follows: +A message record is a tab-separated, ordered sequence of fields, as follows: MTA-provided job/envelope ID (string) reporter (string; defaults to hostname) @@ -136,9 +136,10 @@ A signature record implicitly references the preceding message record. There may be more than one signature record per message; there could also be -none. As above, a signature record is a comma-separated, ordered sequence of +none. As above, a signature record is a tab-separated, ordered sequence of fields, as follows: + MTA-provided job/envelope ID (string, optional) domain of the signature algorithm (0 = rsa-sha1, 1 = rsa-sha256) header canonicalization (0 = simple, 1 = relaxed) --- stats\opendkim-importstats.orig.c Fri Aug 20 15:44:26 2010 +++ stats\opendkim-importstats.c Wed Aug 25 14:33:28 2010 @@ -299,6 +299,7 @@ char **fields = NULL; odbx_t *db = NULL; char buf[MAXLINE + 1]; + char jobid[MAXLINE + 1]; char sql[MAXLINE + 1]; char safesql[MAXLINE * 2 + 1]; @@ -361,6 +362,7 @@ /* initialize stuff */ memset(buf, '\0', sizeof buf); memset(reporter, '\0', sizeof reporter); + memset(jobid, '\0', sizeof jobid); line = 0; repid = 0; msgid = 0; @@ -611,6 +613,9 @@ (void) odbx_finish(db); return EX_SOFTWARE; } + + /* save the corresponding jobid */ + strlcpy(jobid, fields[0], sizeof jobid); } /* processing section for signatures */ @@ -618,7 +623,7 @@ { int changed; - if (n != 23) + if (n != 24) { fprintf(stderr, "%s: unexpected field count at input line %d\n", @@ -632,6 +637,14 @@ progname, line); continue; } + else if (!(fields[0][0] == '-' && fields[0][1] == '\0' || + strncmp(fields[0], jobid, sizeof jobid) == 0)) + { + fprintf(stderr, + "%s: out of sequence signature record at input line %d\n", + progname, line); + continue; + } /* get, or create, the domain ID if needed */ (void) sanitize(db, fields[0], safesql, @@ -698,7 +711,8 @@ sanitize(db, fields[17], safesql, sizeof safesql) || sanitize(db, fields[18], safesql, sizeof safesql) || sanitize(db, fields[19], safesql, sizeof safesql) || - sanitize(db, fields[20], safesql, sizeof safesql)) + sanitize(db, fields[20], safesql, sizeof safesql) || + sanitize(db, fields[21], safesql, sizeof safesql)) { fprintf(stderr, "%s: unsafe data at input line %d\n", @@ -710,26 +724,26 @@ "INSERT INTO signatures (message, domain, algorithm, hdr_canon, body_canon, ignored, pass, fail_body, siglength, key_t, key_g, key_g_name, key_syntax, key_nx, key_dk_compat, key_revoked, syntax, sig_t, sig_t_future, sig_x, sig_z, dnssec) VALUES (%d, %d, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)", msgid, /* message */ domid, /* domain */ - fields[1], /* algorithm */ - fields[2], /* hdr_canon */ - fields[3], /* body_canon */ - fields[4], /* ignored */ - fields[5], /* pass */ - fields[6], /* fail_body */ - fields[7], /* siglength */ - fields[8], /* key_t */ - fields[9], /* key_g */ - fields[10], /* key_g_name */ - fields[11], /* key_syntax */ - fields[12], /* key_nx */ - fields[13], /* key_dk_compat */ - fields[14], /* key_revoked */ - fields[15], /* syntax */ - fields[16], /* sig_t */ - fields[17], /* sig_t_future */ - fields[18], /* sig_x */ - fields[19], /* sig_z */ - fields[20]); /* dnssec */ + fields[2], /* algorithm */ + fields[3], /* hdr_canon */ + fields[4], /* body_canon */ + fields[5], /* ignored */ + fields[6], /* pass */ + fields[7], /* fail_body */ + fields[8], /* siglength */ + fields[9], /* key_t */ + fields[10], /* key_g */ + fields[11], /* key_g_name */ + fields[12], /* key_syntax */ + fields[13], /* key_nx */ + fields[14], /* key_dk_compat */ + fields[15], /* key_revoked */ + fields[16], /* syntax */ + fields[17], /* sig_t */ + fields[18], /* sig_t_future */ + fields[19], /* sig_x */ + fields[20], /* sig_z */ + fields[21]); /* dnssec */ sigid = sql_do(db, sql); if (sigid == -1) --- opendkim\stats.orig.c Mon Aug 23 01:50:34 2010 +++ opendkim\stats.c Wed Aug 25 14:33:25 2010 @@ -336,7 +336,7 @@ for (c = 0; c < nsigs; c++) { - fprintf(out, "S"); + fprintf(out, "S-\t"); /* or repeat jobid to catch concurrency errors */ fprintf(out, "%s", dkim_sig_getdomain(sigs[c]));