zeek/src/analyzer/protocol/finger/finger.spicy
2025-01-09 08:38:45 -05:00

56 lines
1.2 KiB
Text

# See the file "COPYING" in the main distribution directory for copyright.
#
# Giving the rare number of instances of this protocol these days, we err on the side of
# rejecting sessions if they don't parse well.
module Finger;
import spicy;
const OptionalWhiteSpace = /[ \t]*/;
const NewLine = /\r?\n/;
public type Request = unit {
: OptionalWhiteSpace;
switch {
-> : /\/W/ {
self.whois = True;
}
-> : void;
};
: OptionalWhiteSpace;
arg: /[^\r\n]*/ &convert=$$.strip().split1(b"@") {
# We require valid UTF-8 to weed out binary data.
self.user = self.arg[0].decode();
if (|self.arg[1]| > 0)
self.host = self.arg[1].decode();
}
on %done {
if (|self.arg[0]| > 0 || self.whois)
spicy::accept_input();
}
var user: string;
var host: string;
var whois: bool = False;
};
type ReplyLine = unit {
data: /[^\r\n]*/ &convert=$$.decode(); # Require valid UTF-8 here as well.
: NewLine;
on %done {
if (|self.data| > 10)
# Require some non-trivial output to accept.
spicy::accept_input();
}
};
public type Reply = unit {
: ReplyLine[];
};