# $Id$ # Template for perl hook # # API functions: # # w_log([level, ]str); # outputs a string to hpt log # no printf() format, use sprintf()! # # crc32(str) # returns CRC-32 of string # # alike(s1, s2) # return Levenstein distance between parameters (smaller -> more alike) # # putMsgInArea(area, fromname, toname, fromaddr, toaddr, # subject, date, attr, text, addkludges); # post to first netmail area if area eq ""; # set current date if date eq ""; # set fromaddr to ouraka if fromaddr eq ""; # attr -- binary or text string (i.e. "pvt loc k/s") (text form DEPRECATED!); # date -- unixtime, as in time() # addkludges can be: # 0 not to add any kludges # 1 to add required kludges (will add duplicates if they exist) # 2 to add missing kludges (will never modify existing ones) # 3 to update or add required kludges corresponding to addresses and flags # required kludges are: (netmail) INTL, TOPT, FMPT; (all) FLAGS, MSGID # # myaddr() # returns array of our addresses # DEPRECATED! use @{$config{addr}} instead # # nodelistDir() # returns nodelistDir from config # DEPRECATED! use $config{nodelistDir} instead # # str2attr(att) # converts attribute string to binary message attributes # # attr2str(attr) # converts binary flags to string representation (Pvt Loc K/s) # # flv2str(flavour) # converts binary flag, corresponding to flavour, to string (direct, crash) # # date2fts(time) # converts unixtime to fts-1 format string ("dd mmm yy hh:mm:ss") # # fts2date(fts1) # converts date in fts-1 format string to unixtime # # mktime(sec, min, hour, wday, mon, year[, wday, yday[, dst]]) # makes unixtime like POSIX mktime, but year: # year 0..69 -> 2000..2069, 70..1900 -> 1970..3800, other -> as-is # month'es: 0 - January, 1 - February, ..., 11 - December (as in POSIX) # dst - daylight saving time flag (1 or 0) # WARNING: dst can result in +/-1 hour mismatch; use mktime(localtime) for # correct unixtime # # strftime(format, unixtime) # strftime(format, sec, min, hour, wday, mon, year[, wday, yday[, dst]]) # converts unixtime or a time structure to string according to format # man strftime() for details # # gmtoff([unixtime]) # returns difference between local time and UTC in hours (e.g., can be +4.5) # if unixtime is omitted, current time used # # WARNING: Don't redefine already predefined variable via my() or local(). # otherwise their values will not be put back into hpt. # #use strict; #== GLOBAL CONFIGURATION PARAMETERS - DO NOT CHANGE ==# #http://ftsc.org/docs/fsc-0036.001 $DEBUG_MODE = 1; $MSG_PRIVATE = 0x0001; #/ Private Message $MSG_CRASH = 0x0002; #/ Crash Priority Message $MSG_READ = 0x0004; #/ Read by addressee $MSG_SENT = 0x0008; #/ Sent Okay $MSG_FILE = 0x0010; #/ File Attached $MSG_FWD = 0x0020; #/ Being forwarded $MSG_ORPHAN = 0x0040; #/ Unknown destination $MSG_KILL = 0x0080; #/ Kill after mailing $MSG_LOCAL = 0x0100; #/ Message originated here $MSG_HOLD = 0x0200; #/ Hold for pickup $MSG_X2 = 0x0400; #/ Reserved - Sent $MSG_FREQ = 0x0800; #/ Requesting a file $MSG_RREQ = 0x1000; #/ Return RCPT requested $MSG_RRCT = 0x2000; #/ Return RCPT $MSG_RAUD = 0x4000; #/ Request Audit Trail $MSG_UREQ = 0x8000; #/ Request File Update #== LOCAL CONFIGURATION ==# # Message area to post route messages. $ROUTE_NOTICE = 'PVT_TEST'; $FILTER_ORIGIN = 'Alterant MailHUB at your service'; # Text to add to tearline $FILTER_TEARLINE = 'HPT-perl hook'; $FILTER_FROM = 'Hub Robot'; $SEMAFORE_DIR = '/fido/semafore'; @MY_POINTS = ( '10:1/1.1' ); sub bounce { my($fromname,$fromaddr,$toname,$toaddr,$date,$subject,$text,$reason,$myaddr) = @_; my($bouncetext); if ($DEBUG_MODE==1) { w_log('1',"filter-hub.pl: bounce: Bouncing message back to [$fromaddr]"); } $text =~ tr/\r/\n/; $text =~ s/\n\x01/\n\@/gs; $text =~ s/^\x01/\@/s; $bouncetext = < $reason.\r\r".$text),0); $newecho = 1; } $newnet = 1; return $reason; } sub testmsg_config { if ($DEBUG_MODE==1) { w_log('1','filter-hub.pl: testmsg_config'); } # Work out origin address to use. # testarea list, value "1" for ordinary areas, value "2" for passthrough areas. if ($pktfrom =~ /^10:/) { $myaddr = '10:1/1'; # Robot address $testarea{'PVT_TEST'} = 1; # Echobase is exists if ($DEBUG_MODE) { w_log('1',"filter.pl: testmail_config: PRIVATE NET source using [$myaddr]"); } } else { w_log('1',"filter.pl: testmail_config: DEFAULT packet source ($pktfrom) using default [$config{addr}[0]]"); $myaddr=$config{addr}[0]; } } sub route_config { if ($DEBUG_MODE==1) { w_log('1',"filter-hub.pl: route_config for [$toaddr]"); } if ($toaddr =~ /^10:/) { $check_exists = 1; $myaddr = '10:1/1'; } else { w_log('1',"filter.pl: route_config: DEFAULT packet toddr ($toaddr) using default [$config{addr}[0]]"); $check_exists = 0; $myaddr=$config{addr}[0]; } } # == LOCAL FUNCTIONS == sub add_tz { my ($msg) = @_; $TZ = strftime("%z",localtime()); $TZ =~ s/^\+//; # Add a TZ kludge return "\x01TZUTC: $TZ\r".$msg; } BEGIN{ require "/usr/local/bin/filter-testmsg.pl"; require "/usr/local/bin/filter-hub.pl"; require "/usr/local/bin/filter-route.pl"; } sub filter { # predefined variables: # $fromname, $fromaddr, $toname, # $toaddr (for netmail), # $area (for echomail), # $subject, $text, $pktfrom, $date, $attr # $secure (defined if message from secure link) # return "" or reason for moving to badArea # set $kill for kill the message (not move to badarea) # set $change to update $text, $subject, $fromaddr, $toaddr, # $fromname, $toname, $attr, $date if ($DEBUG_MODE==1) { w_log('1','filter.pl: filter'); } testmsg(); my $r=filter_hub(); w_log('1',"filter.pl: filter_hub [$r]."); return $r if (length($r)>0); my $r=validate_route(); w_log('1',"filter.pl: validate_route [$r]."); return $r if (length($r)>0); # If we get here, and a netmail, we'll trigger a pack if (! $area && $toaddr) { $newnet = 1; } return ''; } sub put_msg { # predefined variables: # $fromname, $fromaddr, $toname, $toaddr, # $area (areatag in config), # $subject, $text, $date, $attr # return: # 0 not to put message in base # 1 to put message as usual # 2 to put message without recoding # set $change to update $text, $subject, $fromaddr, $toaddr, # $fromname, $toname, $attr, $date if ($DEBUG_MODE==1) { w_log('1','filter.pl: put_msg'); } return 1; } sub scan { # predefined variables: # $area, $fromname, $fromaddr, $toname, # $toaddr (for netmail), # $subject, $text, $date, $attr # return "" or reason for dont packing to downlinks # set $change to update $text, $subject, $fromaddr, $toaddr, # $fromname, $toname, $attr, $date # set $kill to 1 to delete message after processing (even if it's not sent) # set $addvia to 0 not to add via string when packing if ($DEBUG_MODE==1) { w_log('1','filter.pl: scan'); } return ''; } sub export { # predefined variables: # $area, $fromname, $toname, $subject, $text, $date, $attr, # $toaddr (address of link to export this message to), # return "" or reason for dont exporting message to this link # set $change to update $text, $subject, $fromname, $toname, $attr, $date if ($DEBUG_MODE==1) { w_log('1','filter.pl: export'); } return ''; } sub route { # $addr = dest addr # $from = orig addr # $fromname = from user name # $toname = to user name # $date = message date and time # $subj = subject line # $text = message text # $attr = message attributes # $route = default route address (by config rules) # $flavour = default route flavour (by config rules) # set $change to update $text, $subject, $fromaddr, $toaddr, # $fromname, $toname, $attr # set $flavour to flag, corresponding to flavour, # or string hold|normal|crash|direct|immediate # set $addvia to 0 not to add via string when packing # return route addr or "" for default routing return ''; } sub tossbad { # $fromname, $fromaddr, $toname, # $toaddr (for netmail), # $area (for echomail), # $subject, $text, $pktfrom, $date, $attr # $reason # return non-empty string for kill the message # set $change to update $text, $subject, $fromaddr, $toaddr, # $fromname, $toname, $attr return ''; } sub hpt_start { if ($DEBUG_MODE==1) { w_log('1','filter.pl: hpt_start'); } } sub hpt_exit { if ($DEBUG_MODE==1) { w_log('1','filter.pl: hpt_end'); } local(*F); untie %nodelist if $nltied; untie %msg if $msgtied; $nltied = $msgtied = 0; close(F) if $newnet && open(F,">$SEMAFORE_DIR/newnet.now"); close(F) if $newecho && open(F,">$SEMAFORE_DIR/newecho.now"); close(F) if $newhtick && open(F,">$SEMAFORE_DIR/newhtick.now"); } sub process_pkt { # $pktname - name of pkt # $secure - defined for secure pkt # return non-empty string for rejecting pkt (don't process, rename to *.flt) if ($DEBUG_MODE==1) { w_log('1','filter.pl: process_pkt'); } return ''; } sub pkt_done { # $pktname - name of pkt # $rc - exit code (0 - OK) # $res - reason (text line) # 0 - OK ($res undefined) # 1 - Security violation # 2 - Can't open pkt # 3 - Bad pkt format # 4 - Not to us # 5 - Msg tossing problem if ($DEBUG_MODE==1) { w_log('1','filter.pl: pkt_done'); } } sub after_unpack { if ($DEBUG_MODE==1) { w_log('1','filter.pl: after_unpack'); } } sub before_pack { if ($DEBUG_MODE==1) { w_log('1','filter.pl: before_pack'); } } sub on_echolist { # $_[0] - type (0: %list, 1: %query, 2: %unlinked) # $_[1] - reference to array of echotags # $_[2] - link aka # $_[3] - max tag length in @{$_[1]} # return: # 0 to generate hpt-standard list # 1 to return $report value as result # 2 to use $report value as list and append hpt standard footer if ($DEBUG_MODE==1) { w_log('1','filter.pl: on_echolist'); } return 0; } sub on_afixcmd { # $_[0] - command code (see #define's in areafix.h) # $_[1] - link aka # $_[2] - request line # return: # 0 to process command by hpt logic # 1 to skip hpt logic and return $report value as result if ($DEBUG_MODE==1) { w_log('1','filter.pl: on_afixcmd'); } return 0; } sub on_afixreq { # predefined variables: # $fromname, $fromaddr, $toname, $toaddr. $subject, $text, $pktfrom # return: # 0 to ignore any changes # 1 to update request parameters from above-mentioned variables # (note: only $fromaddr and $text are meaningful for processing) if ($DEBUG_MODE==1) { w_log('1','filter.pl: on_afixreq'); } return 0; } sub on_robotmsg { # process messages generated by robots # predefined variables: # $type, $fromname, $fromaddr, $toname, $toaddr. $subject, $text # # $type is one of the following: "afix", "ffix", "tosysop", or undef # for messages from areafix, filefix, messages generated to sysop # and of unknown origin, respectively. # # return: # 0 to ignore any changes # 1 to update message fields if ($DEBUG_MODE==1) { w_log('1',"filter.pl: on_robotmsg [$type]"); } if ($type eq "areafix") { $newnet = 1; } elsif ($type eq "filefix") { $newhtick = 1; } return 0; }