Hello Antoine, Antoine Beaupré dijo [Tue, Nov 08, 2022 at 09:13:01AM -0500]: > > dmarc-cat insists AFAICT to work on existing files. I tried to get it > > to process the reports I found attached to received mails; for this, I > > would love to be able to ask my MTA to pipe the attachment to > > dmarc-cat. However, I could not get it to work, either with the > > convention of using '-' or even with capturing via <( ... ) > > > > So, please, could you add an option for dmarc-cat to work on reports > > from STDIN? > > It *looks* like this is fixed upstream, according to: > > https://github.com/keltia/dmarc-cat/issues/14 > > I'm going to upload 0.15 soon-ish, maybe you can confirm it's fixed > there? In any case, I'll marked this as fixed there because it looks > like upstream assumes it's fixed, so it must have happened after 0.14...
Thanks for following up on this. I see it does now _say to_ accept files via STDIN, but... $ dmarc-cat -h Usage of dmarc-cat: -D Debug mode -N Do not resolve IPs -S string Sort results (default "\"Count\" \"dsc\"") -j int Parallel jobs (default 8) -t string File type for stdin mode -v Verbose mode -version Display version $ dmarc-cat 2022/11/09 12:27:08 Error: realmain: You must specify at least one file. $ dmarc-cat - 2022/11/09 12:27:10 Error: SelectInput: Wrong file type, use -t It really lacks documentation! :-( I don't know where to get the filetype from. Took a quick dive in dmarc-cat's source, and found only two probable strings as file types: ".zip" and ".xml". It was not a very scientific test, but: $ grep -ri ftype . ./file.go: debug("%d %s", typ, fType) ./main.go: fType string ./main.go: flag.StringVar(&fType, "t", "", "File type for stdin mode") ./main.go: if fType == "" { ./main.go: var fType = filepath.Ext(file) ./main.go: if strings.ToLower(fType) == ".zip" { ./main.go: typ := archive.Ext2Type(fType) ./main_test.go: fType = ".xml" ./main_test.go: fType = "" $ But handling it as .zip does not seem to work: $ cat report.zip | dmarc-cat -t .zip - 2022/11/09 12:34:38 Error: file -:: unmarshall: XML syntax error on line 2: illegal character code U+0003 However, it does work when I give it the uncompressed XML: $ unzip -p file.zip | dmarc-cat -t .zip - dmarc-cat 0.15.0,parallel/j8 by Ollivier Robert Reporting by: google.com — noreply-dmarc-supp...@google.com From 2022-03-28 18:00:00 -0600 CST to 2022-03-29 17:59:59 -0600 CST Domain: gwolf.org Policy: p=none; dkim=r; spf=r Reports(1): IP Count From RFrom RDKIM RSPF mail.iiec.unam.mx. 2 gwolf.org gwolf.org pass pass Given that file.go has the needed bits to handle a .zip file, I'd still consider a bug to be present (albeit a different one). I was able to find two spots in the code where this was not correctly handled. First, in main.go, fType is clobbered even if specificed; it should only be replaced if not specified: diff --git a/main.go b/main.go index 736a8e7..e6d4e98 100644 --- a/main.go +++ b/main.go @@ -115,7 +115,9 @@ func realmain(args []string) error { verbose("Analyzing %s", file) - var fType = filepath.Ext(file) + if fType == "" { + fType = filepath.Ext(file) + } if strings.ToLower(fType) == ".zip" { txt, err = HandleZipFile(ctx, file) The other point is in file.go. It seems trivial to fix, but I've never worked with Go before; function HandleZipFile is failing to open a file named "-"; it should just read it if so speficied. I tried to copy the differing logic from HandleSingleFile, but failed and decided to throw the ball back at you ;-) Anyway, besides getting dmarc-cat to work with piped zip files, it should at least be minimally documented! Thanks, - Gunnar.