$DUH: README,v 1.21 2003/01/22 22:18:23 tv Exp $

**

PMilter requires Perl 5.6.0 or higher.  It has not been tested (nor adapted)
for 5.005 or earlier.  This is not (yet) reflected in the "use" statements
for the .pm modules, but will be added in the near future.

The documentation is still sparse, so bear with me.  You can get the useful
docs out by cd'ing to the top level of the source tree and doing a "perldoc
PMilter".  That doc page contains cross references to the rest of the
available documentation (most of it Perl POD docs).

PMilter's home page can be found at:  http://www.duh.org/pmilter

The author can be contacted at:  tv@pobox.com / tv@duh.org

**

RELEASE 0.4.0 (22-Jan-2003) (includes changes applied to 0.3.1)

* API CHANGE: Module 'connect_break' has gone away and is now
  replaced by a special case of 'connect_regex' (with ERRMSG set to
  'BREAK').

* Added pluggable logging foundation to PMilter::Server.

* Added $ctx->qlog() method for logging a "standard" log message at
  level LOG_NOTICE, including several predefined values.

* Added $ctx->reject() method as a one-stop shop for setting the
  reply message, logging it, and returning the proper SMFIS_ code.

* All prefabricated modules that accept patterns now all accept a
  regular expression or an arrayref of regular expressions.  As a
  result, "helo_blacklist" is now "helo_regex".

* A new package, PMilter::Modules, contains several helper
  subroutines useful for implementing modules, and for supplying
  arguments to modules.

* A new package/object, PMilter::Match::CIDR, provides rapid matching of
  IPv4 addresses against a list of CIDR patterns.

* A new module (received_dnsbl_ip) scans Received: headers to gather
  IPv4 addresses, then runs them through a DNSBL.

**

RELEASE 0.3.1 (15-Dec-2002)

* Bug: PMilter/modules/header_nofrom was returning a 451 and should have
  returned 554.

* Bug: PMilter/Callbacks.pm had erroneous logic about detecting the last
  callback for a given element object; it caused SMFIS_ACCEPT to be
  returned to the next higher level in some situations.

* Actually implemented the MAXCHILDREN arg to PMilter::Server::main(), which
  should have been implemented before (since it was documented).

* Removed dangling references to PMilter::Callbacks::SkipConnect.  This
  behavior is now handled by the 'connect_break' module.

* Added a SIGINFO handler, which will simply print the number of active
  child process to STDERR.

**

RELEASE 0.3.0 - Documentation, stability freeze.

-> The protocol engine is now in a significantly stable state and this
-> is a usable release in the author's opinion.  0.3.x has been put on
-> its own CVS branch for maintenance purposes, as needed by users
-> (tag pmilter-0_3).
->
-> Further development will be on the 0.4.0 release, which will include
-> major feature improvements.

* Consolidated and fixed up PMilter::Callbacks.  Now an immutable container
  (constructed on new() and not changeable).

* Made $ctx->getsymval() actually work and keep the right values at the
  right times.

* Added PMilter::DNSBL classes for DNSBL lookups.

* Added @INC/PMilter/modules search path for modules included by name.

* Added extension methods getglobal() and setglobal() to the context
  object, allowing communication between different objects in a Callbacks
  tree.

* Removed the select() based timeouts entirely based on several suggestions.
  Instead, we rely on the MTA to do connection handling; if the MTA is not
  properly functioning, there's a problem much bigger than milters.

* Added docs throughout, including bundled modules at top.

**

RELEASE 0.2.2 - More enhancements and fixes.

* Moved auto_getconn() and auto_setconn() into only the Sendmail::Milter
  compatibility interface.  These are specific to the Sendmail MTA, and
  don't belong in the generic PMilter interface.

* Added Sendmail::Milter::sendmail_class() for looking up the contents of
  a Sendmail class.  Good for looking up the contents of class 'w', if
  desiring a check against "known localhost aliases".

* Added PMilter::Session::gethost() and getaddress() to allow retrieval
  of the connected client's hostname and address outside of the connect
  callback (without creating several "setpriv" copies).

* Now allows insertion of a milter object into a PMilter::Callbacks chain
  via a scalar (filename of module, no args), or arrayref (first element
  is name of module, the rest are args to the module).

* Added several prefab modules into PMilter/modules/ that make use of the
  above change to PMilter::Callbacks.

* Added new return code, SMFIS_BREAK, which means "global SMFIS_ACCEPT",
  i.e. propagate all the way up the tree to the root.  To stop the
  propagation, PMilter::Callbacks::Leaf transforms it back to SMFIS_ACCEPT.

* Added examples/duh.org.pl, the real configuration being used at duh.org,
  as a working-config example.

* Some code path reliability fixes.

**

RELEASE 0.2.1 - Major bug fix, license change, and other minor changes.

* The unpacking of the connect info string has always been wonky, because of
  issues with Perl's handling of \0 in RE matching.  Worked around in
  PMilter::Session.  I haven't seen any 'invalid connect info' errors since.

* Now under BSD-style license.  I promised man people that I'd change the
  PMilter license as soon as I started using PMilter myself on a production
  mail server.  Since the requirement is now fulfilled, the license is
  changed to something less restrictive.

* Allow up to 30m (not 30s) for commands being issued from within message
  context.  Since it could take quite a while for commands to arrive after
  the first RCPT TO: (while the message body is in transit), we don't want
  to time out so quickly.  This will be more flexible/configurable in the
  future.

* Accept arguments in PMilter::Callbacks->new(); simply a list of milter
  objects that should be register()ed after the container is created.  
  Allows for chaining syntax when constructing the milter object tree.  
  (Needs doc)

* Let subclasses of PMilter::Callbacks specify callbacks that should always
  be called on the container, even if contained milter objects don't use
  them.  This allows for the following:

* Added first subclass of PMilter::Callbacks, ...::SkipConnect.  This
  variation on a theme accepts a regex as its first argument to new(), which
  (if it matches the rDNS-validated hostname or the [square-bracketed] IP
  address of the host) causes the container to return SMFIS_ACCEPT without
  calling its contained milter objects.

**

RELEASE 0.2.0 - Feature enhancements and bug fixes.

* In 0.1.0, it was possible to register more than one callback via
  Sendmail::Milter::register().  This has been reverted back to a single
  top-level instance, and milter chaining is now implemented by the class
  PMilter::Callbacks.  This will pave the way for future boolean-like
  chaining logic.  Technically, PMilter::Callbacks is compatible
  with the "real" implementation of Sendmail::Milter.

* Several fixes related to the differences between message and connection
  context; in particular, RCPT TO: can be called multiple times with
  rejection responses (to reject single recipients of a mail that may still
  be accepted for some recipients).

* Refactoring of where some of the user-visible goo is located.

* Some usable pod docs added.

**

RELEASE 0.1.0 - First public release.

* Mostly implements the Sendmail::Milter 0.18 interface, but somewhat buggy.

* Threw most of the original design in the CVS Attic; will look at that
  again later.

**

EOF
