SnertSoft: We Serve Your Server

milter-link/2.0
«Find the myth in link!»


Description & Usage ° Installation & Notes ° License & Support

WARNING

THIS IS MAIL FILTERING SOFTWARE AND WILL BLOCK MAIL THAT FAILS TO PASS A GIVEN SET OF TESTS. SNERTSOFT AND THE AUTHOR DO NOT ACCEPT ANY RESPONSIBLITY FOR MAIL REJECTED OR POSSIBLE LOSS OF BUSINESSS THROUGH THE USE OF THIS SOFTWARE. BY INSTALLING THIS SOFTWARE THE CLIENT UNDERSTANDS AND ACCEPTS THE RISKS INVOLVED.

Description

This Sendmail mail filter extracts URIs, such http: and mailto: links, from within text, HTML, and/or MIME encoded messages, can verify if web page links do not work, and consult with one or more DNS based black lists, such as SURBL, URIBL, and/or SpamHaus DBL as to whether the domains have appeared in previous instances of spam.

Usage

milter-link [options ...][arguments ...]

Options can be expressed in four different ways. Boolean options are expressed as +option or -option to turn the option on or off respectively. Numeric, string, and list options are expressed as option=value to set the option or option+=value to append to a list. Note that the +option and -option syntax are equivalent to option=1 and option=0 respectively. String values containing white space must be quoted using single (') or double (") quotes. Option names are case insensitive.

Some options, like +help or -help, are treated as immediate actions or commands. Unknown options are ignored and not reported. The first command-line argument is that which does not adhere to the above option syntax. The special command-line argument -- can be used to explicitly signal an end to the list of options.

The default options, as shown below, can be altered by specifying them on the command-line or within an option file, which simply contains command-line options one or more per line and/or on multiple lines. Comments are allowed and are denoted by a line starting with a hash (#) character. If the file option is defined and not empty, then it is parsed first, followed by the command line options.

Note that there may be additional options that are listed in the option summary given by +help or -help that are not described here.

Suffix Lists

The DNS list options, such as domain-bl, mail-bl, and uri-bl, take a suffix list argument, which is semi-colon separated string of DNS list suffixes with optional /mask or :ip return codes to select subsets. In place of a single extremely long string, the option+=value syntax above can be used to build the list incrementally.

Aggregate lists, like URIBL or SURBL, return a single A record, where the IP address is a bit-vector and the /mask selects which bits to act on. The /mask is an unsigned 32-bit number in decimal, octal, or hexadecimal form.

Return code lists, like SpamHaus, return multiple A records, where each IP is a return code. A suffix can be followed by colon (:) and a comma separated list of IP4 return codes. For example, to select only members of the DBL spam and phish lists (see DBL return codes):

domain-bl=dbl.spamhaus.org:127.0.1.2,127.0.1.3

Options

-access-check-body
When enabled, this option will perform supplemental milter-link-body combo tag lookups for each URI, IP, domain, or mail address found in the message body. This allows special B/W list configurations.
-access-check-headers
When enabled, this option will perform extra access-db lookups with the Sender, From, To, and Cc headers using milter-link-from:, milter-link-to:, and combo tags, as described by access-db option. This allows special B/W list configurations.
access-db=/etc/mail/access.db
The type and location of the read-only access key-value map. It provides a centralised means to black and white list hosts, domains, mail addresses, etc. The following methods are supported:
text!/path/map.txtR/O text file, memory hash
/path/map.dbBerkeley DB hash format
db!/path/map.dbBerkeley DB hash format
db!btree!/path/map.dbBerkeley DB btree format
sql!/path/databaseAn SQLite3 database
socketmap!host:portSendmail style socket-map
socketmap!/path/local/socketSendmail style socket-map
socketmap!123.45.67.89:portSendmail style socket-map
socketmap![2001:0DB8::1234]:portSendmail style socket-map

If :port is omitted, the default is 7953.

The access-db contains key-value pairs. Lookups are performed from most to least specific, stopping on the first entry found. Keys are case-insensitive.

There are essentially three types of keys used in the access-db. Many of the tags available will use one or more of these lookup sequences.

IP Address Lookups
An IP address lookup is typically applied to the connected SMTP client. It will start with a complete IPv4 or IPv6 address and break it down on delimiter boundaries from right to left.

 IPv6 LookupIPv4 Lookup
tag:2001:0DB8:0:0:0:0:1234:5678tag:192.0.2.9
tag:2001:0DB8:0:0:0:0:1234tag:192.0.2
tag:2001:0DB8:0:0:0:0tag:192.0
tag:2001:0DB8:0:0:0tag:192
tag:2001:0DB8:0:0 
tag:2001:0DB8:0
tag:2001:0DB8
tag:2001

Note that the compact form of an IPv6 address, "2001:0DB8::1234:5678", cannot be used. Only the full IPv6 address format, with all intervening zeros, is currently supported.

Domain Name Lookups
A domain lookup may be applied to either the connected SMTP client, where the client's host name found through a DNS PTR record is searched for, or using the domain portion of an mail address (see below). A domain lookup will try the IP-domain literal if applicable, then continue with the FQDN, breaking it down one label at a time from left to right.

 tag:[ipv6:2001:0DB8::1234:5678]
tag:[192.0.2.9]
tag:sub.domain.tld
tag:domain.tld
tag:tld
tag:

Note that the bare tag is often used to specify system wide defaults.

Mail Address Lookups
A mail address lookup is similar to a domain lookup, but the search first starts with a complete mail address, before trying the address's domain, and finally only the local part of the address.

 tag:account@sub.domain.tld
tag:sub.domain.tld
tag:domain.tld
tag:tld
tag:account@
tag:

Note that the bare tag is often used to specify system wide defaults.

Tags

The following list outlines the available tags and their supported key lookups:

milter-link-Auth:auth_authen
milter-link-Auth:
Used to black or white list by authenticated user (SMTP AUTH) as given by the macro {auth_authen}. The string searched by the pattern list will be the sender's mail address. The empty form of milter-link-Auth: allows for a milter specific default only when {auth_authen} is defined.
milter-link-Body:ip:From:mail
milter-link-Body:domain:From:mail
milter-link-Body:mail:From:mail
milter-link-Body:ip:To:mail
milter-link-Body:domain:To:mail
milter-link-Body:mail:To:mail
The above are only applied when access-check-body is enabled, followed by the simple milter-link-Body: tags. Used to black (REJECT) or ignore (OK) domains that make up mail addresses or URIs found within the header or body content of a message in combination with a sender or recipient.
milter-link-Body:ip
milter-link-Body:domain
milter-link-Body:mail
Used to black (REJECT) or ignore (OK) domains that make up mail addresses or URIs found within the header or body content of a message.

This can be used to white list domains that are know to be good and so avoid redundant lookups. Consider listing your own web site that might appear in your signatures, common and popular sites like hotmail.com or yahoo.com, etc. If black listed, the message will be rejected when found in the message body. See domain-bl, uri-bl, uri-a-bl, uri-ns-bl, and uri-ns-a-bl options.

milter-link-Connect:ip:From:mail
milter-link-Connect:domain:From:mail
This set of combination tags are used to black or white list sender addresses when sent from a given SMTP client. The sender address can be easily forged and using the From: tag by itself could allow spam with a forged address. By adding the sender's SMTP client as an extra constraint, it is possible to limit such abuse. Note that the lookup variants with blank IP, domain, or mail are not supported.
milter-link-Connect:ip
milter-link-Connect:domain
Connect:ip
Connect:domain
Used to black or white list an SMTP client. Note that Sendmail also has special semantics for Connect:.
milter-link-Connect:ip:To:mail
milter-link-Connect:domain:To:mail
This set of combination tags are used to black or white list recipient addresses that a given SMTP client may contact. This allows for finer granularity of control in place of the To: tag. Note that the lookup variants with blank IP, domain, or mail are not supported.
milter-link-From:mail:To:mail
This set of combination tags are used to black or white list a pair of sender and recipient addresses. This allows for finer granularity of control in place of the To: tag. Note that the lookup variants with blank mail elements are not supported.
milter-link-From:mail
From:mail
Used to black or white list a sender's mail address. Black listing using this tag is fine, but white listing is not recommended as it is too easy for someone to fake the sender address or domain. In the case of a +detailed mail address, the left hand side of the +detail is used for the sender@ lookup. Note that Sendmail also has special semantics for From:.
milter-link-Helo:domain
Used to black or white list an SMTP client based on the HELO / EHLO argument. This tag is not recommended for white listing as the HELO argument can be too easily falsified.
milter-link-To:mail
Spam:mail
To:mail
Used to black or white list a recipient's mail address. In the case of a +detailed mail address, the left hand side of the +detail is used for the sender@ lookup. Note that Sendmail also has special semantics for To: and Spam:.

Action

When a key lookup matches, then the value returned is a pattern list, which in its simplest and most common form is either an action word like OK, REJECT, etc.; a numerical value; or some arbitrary string depending on the tag involved. For example:

Connect:192.168.0OK
Rate-Connect:fsl.com17
Msg-Limit-From:hotmail.com150/30m

The action words supported by milter-link are:

OKWhite list, by-pass one or more tests.
REJECTBlack list, reject connection, sender, recipient, etc.
SKIPStop lookup and return no result ie. continue testing.
DUNNOSame as SKIP, commonly used by postfix.

Pattern Lists

In most instances, the above forms of key lookup and values are sufficient. However, there may be times when finer granularity of control is required, in which case pattern lists can be used. A pattern list is a white space separated list of pattern-action pairs followed by an optional default action. The supported types are:

[network/cidr]actionClassless Inter-Domain Routing
(only with IP address lookups)
!pattern!actionSimple fast text matching.
/regex/actionPOSIX Extended Regular Expressions.

The simple pattern matching, !pattern!, uses an asterisk (*) for a wildcard, scanning over zero or more characters; a question-mark (?) matches any single character; a backslash followed by any character treats that character as a literal. This method always tries to match the beginning and end of string. For example:

!abc!exact match for 'abc'
!abc*!match 'abc' at start of string
!*abc!match 'abc' at the end of string
!abc*def!match 'abc' at the start and match 'def' at the end, maybe with stuff in between.
!*abc*def*!find 'abc', then find 'def'

The following is an example using a simple pattern to reject client connections that originate from a range of IP addresses of an ISP assigned to ADSL customers. Using a pattern like this allows you to drop connects from the ISP's ADSL, while still accepting connections from mail and web servers.

Connect:hananet.net	!adsl-*-*.usr.hananet.net!REJECT

If you know that an ISP's mail and web servers follow a standard naming convention, you might prefer to only accept mail from those instead. We include web servers here to handle the case where a web server might have to send a mail response based on a form being filled in.

Connect:hananet.net	!smtp*.hananet.net!OK !www*.hananet.net!OK REJECT

Note that SPF was designed to help mail servers identify originators of mail, so creating patterns as shown in the above two examples is not normally required. However, SPF is still considered experimental and not as widely deployed as one might hope.

The next example, /regex/, uses Extended Regular Expressions to validate the format of the local-part of an AOL address, which must be between 3 and 16 characters long, can contain dots and RFC 2822 ``atext'' characters except % and /. The SKIP word allows the one regular expression to validate the format of the address and continue if the pattern matches; otherwise if the regular expression failed to match, REJECT the suspect aol.com address.

From:grandma@aol.com OK
From:aol.com /^[a-zA-Z0-9!#$&'*+=?^_`{|}~.-]{3,16}@aol.com$/SKIP REJECT

The discussion of Extended Regular Expressions is vast and complex, well beyond the scope of this document. There are many on-line tutorials and references available and the book Mastering Regular Expressions, 3e from O'Reilly covers the topic in depth.

If you need to use a pattern list, then try and follow these suggestions:

  • A pattern cannot be used as the key in an access-db lookup. Key-value tables work with constants for the keys using a predefined lookup order as outlined above.
  • Use the key lookup as a selector to find a pattern list.
  • Use simple !pattern! matching where possible, as it will be faster than Extended Regular Expressions, /regex/.
  • Avoid using pattern lists with bare tag variants that specify a global default. It will more often than not cause a lot of unnecessary attempts to match a pattern.
  • Keep your pattern lists short & simple.

The milter-link-Connect:, milter-link-From:, and milter-link-To: tags provide a milter specific means to override the Sendmail and Postfix variants. For example, you normally white list your local network through any and all milters, but on the odd occasion you might want to actually scan mail from inside going out, without removing the Connect: tag that allows Sendmail or Postfix to relay for your network or white listing for other milters. So for example if you have tags like:

To:mx.example.comRELAY

You might have to add milter specific overrides in order to make sure the mail still gets filtered:

To:mx.example.comRELAY
milter-link-To:mx.example.comSKIP

Some additional examples:

milter-link-Connect:80.94 [80.94.96.0/20]OK  REJECT

Accept connections from the netblock 80.94.96.0/20 (80.94.96.0 through to 80.94.111.255) and rejecting anything else in 80.94.0.0/16.

milter-link-Connect:192.0.2 /^192\.0\.2\.8[0-9]/OK  REJECT

Accept connections from 192.0.2.80 through to 192.0.2.89, reject everything else in 192.0.2.0/24.

milter-link-From:example.com /^john@.+/OK  /^fred\+.*@.*/OK  REJECT

Accept mail from <john@example.com> and <fred@example.com> when fred's address contains a plus-detail in the address. Reject everything else from example.com.

milter-link-To:example.net !*+*@*!REJECT  !*.smith@*!REJECT  /^[0-9].*/REJECT

Reject mail to example.net using a plus-detail address or to any user who's last name is "smith" or addresses starting with a digit. No default given, so it is assumed to be SKIP.

+daemon
Start as a background daemon or foreground application.
date-policy=reject
If the date-required check fails, then apply one of the following policies:
 none Do nothing.
 tag Tag the message subject. See subject-tag.
 quarantine Quarantine the message. See sendmail's queue management options -qQ and -Q.
 reject Reject the message.
 discard Discard the message.
date-required=0
Set to one (1) to require a Date header; two (2) requires the header and that it conform to the RFC 5322 date-time format. Zero (0) disables the requirement (default).
dns-list-log-file=
File name used to log DNS list lookup results separate from syslog. Intended for debugging only.
dns-list-log-what=
What DNS list lookup results to log. 1 for successful lookups, 2 for unsuccessful lookups, 3 for both.
dns-max-timeout=45
Maximum timeout in seconds for a DNS query.
-dns-round-robin
Set true to query NS servers in round robin order. Set false to query all the NS servers in parallel.
domain-bl=.dbl.spamhaus.org
Specify a suffix list. The host or domain name found in a URI is checked against these DNS black lists. These black lists are assumed to use wildcards entries, so only a single lookup is done. IP-as-domain in a URI are ignored. See also uri-bl-policy.
file=/etc/mail/milter-link.cf
Read the option file before command line options. This option is set by default. To disable the use of an option file, simply say file=''
±help
Write the option summary to standard output and exit. The output is suitable for use as an option file. Note that this option may list additional undocumented options.
±info
Write the configuration and compile time options to standard output and exit.
mail-bl=
Specify a suffix list with mail address black list suffixes to consult. The MAIL FROM: address and mail addresses found in select headers and the message are MD5 hashed, which are then checked against these black lists.
mail-bl-domains=gmail.*
mail-bl-domains+=googlemail.*
mail-bl-domains+=hotmail.*
mail-bl-domains+=yahoo.*
mail-bl-domains+=aol.*
mail-bl-domains+=aim.*
mail-bl-domains+=live.*
mail-bl-domains+=ymail.com
mail-bl-domains+=rocketmail.com
mail-bl-domains+=centrum.cz
mail-bl-domains+=centrum.sk
mail-bl-domains+=inmail24.com
mail-bl-domains+=libero.it
mail-bl-domains+=mail2world.com
mail-bl-domains+=msn.com
mail-bl-domains+=she.com
mail-bl-domains+=shuf.com
mail-bl-domains+=sify.com
mail-bl-domains+=terra.com
mail-bl-domains+=tiscali.it
mail-bl-domains+=virgilio.it
mail-bl-domains+=voila.fr
mail-bl-domains+=walla.com
mail-bl-domains+=y7mail.com
mail-bl-domains+=yeah.net
A list of domain glob-like patterns for which to test against mail-bl, typically free mail services. This reduces the load on public BLs. Specify * to test all domains, empty list to disable.
mail-bl-headers=From;Reply-To
A list of mail headers to parse for mail addresses and check against one or more MAIL BL. Specify the empty list to disable.
mail-bl-max=10
Maximum number of unique mail addresses to check. Specify zero for unlimited.
mail-bl-policy=reject
If the message contains a black listed mail address found by mail-bl, then apply one of the following policies:
 none Do nothing.
 tag Tag the message subject. See subject-tag.
 quarantine Quarantine the message. See sendmail's queue management options -qQ and -Q.
 reject Reject the message.
 discard Discard the message.
milter-socket=unix:/var/run/milter/milter-link.socket
A socket specifier used to communicate between Sendmail and milter-link. Typically a unix named socket or a host:port. This value must match the value specified for the INPUT_MAIL_FILTER() macro in the sendmail.mc file. The accepted syntax is:
{unix|local}:/path/to/file
A named pipe. (default)
inet:port@{hostname|ip-address}
An IPV4 socket.
inet6:port@{hostname|ip-address}
An IPV6 socket.
milter-timeout=7210
The sendmail/milter I/O timeout in seconds.
links-policy=tag
If +links-test finds a broken URL, then apply one of the following policies:
 none Do nothing.
 tag Tag the message subject. See subject-tag.
 quarantine Quarantine the message. See sendmail's queue management options -qQ and -Q.
 reject Reject the message.
 discard Discard the message.
-links-test
Verify each HTTP link in the message body is valid (not broken) and find their corresponding origin server by following all redirections (not circular). If any link is invalid for any reason then apply the policy given by links-policy.
links-timeout=60
Socket timeout used when testing HTTP links, see +links-test.
pid-file=/var/run/milter/milter-link.pid
The file path of where to save the process-id.
port-list=
A list of port numbers corresponding to protocols to test. Some sites prefer to focus on web and/or email related URI. This option provides a means to restrict the scope of testing to a specific subset of URI by port number. An empty list means all URI are tested.
±quit or +quit
Quit an already running instance of the milter and exit. This is equivalent to: kill -QUIT `cat /var/run/milter/milter-link.pid`
±restart or +restart
Terminate an already running instance of the milter before starting.
run-group=milter
The process runtime group name to be used when started by root.
run-user=milter
The process runtime user name to be used when started by root.
-smtp-auth-ok
Allow SMTP authenticated senders to send unscanned mail. See also the milter-link-auth: tag (access-db=) for finer granularity of control.
subject-tag=[SPAM]
Subject tag prefix for invalid messages. To disable the subject tag specify: subject-tag=''. See also uri-bl-policy and links-policy.
uri-a-bl=
Specify a suffix list of IP black list suffixes to consult, like .zen.spamhaus.org The host or domain name found in a URI is used to find its DNS A record and IP address, which is then checked against these IP DNS black lists.
uri-bl=.multi.surbl.org
uri-bl+=.black.uribl.com
Specify a suffix list of domain name black list suffixes to consult, like .multi.surbl.org. The domain name found in a URI is checked against these DNS black lists.
uri-bl-headers=X-Originating-IP
A list of mail headers to parse for URI and check using the domain-bl, uri-bl, uri-a-bl, uri-ns-bl, and uri-ns-a-bl options. Specify the empty list to disable.
-uri-bl-helo
Test the HELO/EHLO argument using the domain-bl, uri-bl, uri-a-bl, uri-ns-bl, and uri-ns-a-bl options. Reject the command if black listed.
uri-bl-policy=reject
Policy to apply if message contains a black listed URI found by domain-bl, uri-bl, uri-a-bl, uri-ns-bl, and uri-ns-a-bl, then apply one of the following policies:
 none Do nothing.
 tag Tag the message subject. See subject-tag.
 quarantine Quarantine the message. See sendmail's queue management options -qQ and -Q.
 reject Reject the message.
 discard Discard the message.
-uri-bl-sub-domains
When querying against name based black lists, like .multi.surbl.org or .black.uribl.com, first test the registered domain, then any sub-domains from right-to-left. Typically sub-domains are not listed.
uri-max-test=0
Maximum number of unique URI to check. Specify zero for unlimited.
uri-ns-bl=
Specify a suffix list of host name and/or domain name black list suffixes to consult. The domain name found in a URI is used to find its DNS NS records; the NS host names are checked against these host name and/or domain name DNS black lists.
uri-ns-a-bl=
Specify a suffix list of IP black list suffixes to consult. The host or domain name found in a URI is used to find its DNS NS records and IP address, which are then checked against these IP black lists.
verbose=info
A comma separated list of how much detail to write to the mail log. Those mark with § have meaning for this milter.
§ info General info messages. (default)
§ trace Trace progress through the milter.
§ parse Details from parsing addresses or special strings.
§ debug Lots of debug messages.
§ dialog I/O from communications dialog
  state State transitions of message body scanner.
§ dns Trace & debug of DNS operations
  cache Cache get/put/gc operations.
§ database Sendmail database lookups.
§ socket-fd Socket open & close calls
§ socket-all All socket operations & I/O
§ libmilter libmilter engine diagnostics
work-dir=/var/tmp
The working directory of the process. Normally serves no purpose unless the kernel option that permits daemon process core dumps is set.
±version
Show version and copyright.

SMTP Responses

This is the list of possible SMTP responses.

553 5.1.0 imbalanced angle brackets in path
The path given for a MAIL or RCPT command is missing a closing angle bracket
553 5.1.0 address does not conform to RFC 2821 syntax
The address is missing the angle brackets, < and >, as required by the RFC grammar.
553 5.1.0 local-part too long
The stuff before the @ is too long.
553 5.1.[37] invalid local part
The stuff before the @ sign contains unacceptable characters.
553 5.1.0 domain name too long
The stuff after the @ is too long.
553 5.1.7 address incomplete
Expecting a domain.tld after the @ sign and found none.
553 5.1.[37] invalid domain name
The domain after the @ sign contains unacceptable characters.
550 5.7.1 connection .+ [.+] blocked
The connection is blacklisted in the sendmail access.db.
550 5.7.1 sender blocked
The sender is blacklisted in the sendmail access.db.
550 5.7.1 recipient blocked
The recipient is blacklisted in the sendmail access.db.
550 5.7.1 broken URL ".+": .+
A URL found in the message fails to connect, return a valid document, or causes a redirection loop.
550 5.7.1 black listed URL host .+ by .+
A URL found in the message is black listed by the stated DNSBL service.
550 5.7.1 rejected URL host .+
A URL found in the message is locally black listed in the access.db using a milter-link-body: tag.

Installation

  1. Download:

    milter-link/2.0 md5sum Change Log
    LibSnert md5sum Change Log
    Sendmail 8.14   http://www.sendmail.org/
    Berkeley DB   http://www.sleepycat.com/
  2. If you have never built a milter for Sendmail, then please make sure that you build and install libmilter, which is not built by default when you build Sendmail. Please read the libmilter documentation. Briefly, it should be something like this:

    cd (path to)/sendmail-8.14.0/libmilter
    sh Build -c install
    
  3. The build process for libsnert and milter-link is pretty straight forward once you have libmilter installed:

    cd (path to)/com/snert/src/lib
    ./configure --without-sqlite3
    make build
    cd ../milter-link
    ./configure
    make build
    make install
    

    SQLite support is not required in SnertSoft milters that do not use a cache. If you have compiled LibSnert for a mix of SnertSoft milters, some that require a cache, then you can build them all with the SQLite support. Will not hurt, just produce larger binaries in those that do not need it.

    Both configuration scripts have some options that allow you to override defaults. Those options are listed with:

    ./configure --help
    
  4. An example /usr/local/share/examples/milter-link/milter-link.mc is supplied. This file should be reviewed and the necessary elements inserted into your Sendmail .mc file and sendmail.cf rebuilt. Please note the comments on the general milter flags.

    
    
  5. Once installed and configured, start milter-link and then restart Sendmail. An example startup script is provided in /usr/local/share/examples/milter-link/milter-link.sh. The default options can be altered by specifying them on the command-line or within a /etc/mail/milter-link.cf. The milter-link.cf is parsed first followed by the command-line options.

Notes

  • Currently tested platforms:

    Cobalt Qube 1 with Linux RH 5.1 (mips 2.0.34 kernel); Linux RH 5.1 (Intel x386 2.2.25 kernel); FreeBSD 4.8, 4.9 (Intel x386); OpenBSD 3.6 (Intel x386)
  • The minimum desired file ownership and permissions are as follows for a typical Linux system. For FreeBSD, NetBSD, and OpenBSD the binary and cache locations may differ, but have the same permissions.

    Process user ``milter'' is primary member of group ``milter'' and secondary member of group ``smmsp''. Note that the milter should be started as root, so that it can create a .pid file and .socket file in /var/run; after which it will switch process ownership to milter:milter before starting the accept socket thread.

    /etc/mail/root:smmsp0750 drwxr-x---
    /etc/mail/access.dbroot:smmsp0640 -rw-r-----
    /etc/mail/sendmail.cfroot:smmsp0640 -rw-r-----
    /etc/mail/milter-link.cfroot:root0644 -rw-r--r--
    /var/run/milter/milter-link.pidmilter:milter0644 -rw-r--r--
    /var/run/milter/milter-link.socketmilter:milter0644 srw-r--r--
    /var/db/milter-linkmilter:milter0644 -rw-r--r-- (*BSD)
    /var/cache/milter-linkmilter:milter0644 -rw-r--r-- (linux)
    /usr/local/libexec/milter-linkroot:milter0550 -r-xr-x---

License Agreement 1.9

SNERTSOFT & CO. ARE WILLING TO LICENSE THE SOFTWARE IDENTIFIED ABOVE TO YOU ONLY UPON THE CONDITION THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THIS LICENSE AGREEMENT. PLEASE READ THE AGREEMENT CAREFULLY. BY DOWNLOADING OR INSTALLING THIS SOFTWARE, YOU ACCEPT THE TERMS OF THE AGREEMENT.

  1. Definitions

    1. ``Package'' means the identified above in source and/or binary form, any other machine readable materials provided (including, but not limited to documentation, sample files, data files), any updates or error corrections, and its derivative works.

    2. ``Organisation'' means a legal entity or an individual.

    3. ``You'' (or ``Your'') means an Organisation exercising rights under, and complying with all of the terms of, this License or a future version of this License issued under Section 6.1. For legal entities, ``You'' includes any entity which controls, is controlled by, or is under common control with You. For purposes of this definition,``control'' means (a) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (b) ownership of more than fifty percent (50%) of the outstanding shares or beneficial ownership of such entity.

    4. ``SnertSoft'' means Anthony C. Howe situated in Montreal, Canada.

    5. ``SnertSoft & Co.'' means SnertSoft and all authorised & licensed partners, such as value-added resellers or appliance manufacturers.

  2. Statement of Original Work

    1. The Package is an original work written by SnertSoft, with exception of following third party code:

      1. MD5 routines written by L. Peter Deutsch, based on RFC 1321;

      2. SQLite3 package is written by D. Richard Hipp of Hwaci and is in the public domain.

      3. strnatcmp.c is written by Martin Pool of sourcefrog.net and has a BSD style license.

      4. Protothreads headers originally written by Adam Dunkels and has a BSD style license.

  3. License To Use

    1. You may install and use this Package, without modifications, exclusively on machines for which You have purchased a license, provided You retain this notice, SnertSoft's copyright notice, any and all license control methods (see below), and any links within the Package back to the most current online versions of this License and Disclaimer.

    2. You may copy, share, distribute, modify, and create derivative works from the user manuals and any related documentation solely for Your internal business purposes, such as in-house documentation, training manuals, or reference material.

  4. Restrictions

    1. Redistribution, including but not limited to books, CDROMS, download mirrors, floppy diskettes, hard disks, hardcopy print outs, online archives, solid state disks, streaming tapes, or other current or future forms of storage or communication media of the Package, with or without modifications, including any and all derivative works such as source patches, binaries, binary patches, or similar is expressly forbidden without prior written permission in hardcopy (ie. letter or fax) signed and dated by SnertSoft.

    2. It is expressly forbidden for You to use the Package, in whole or in part, in any other software or appliance without prior written permission in hardcopy (ie. letter or fax) signed and dated by SnertSoft.

    3. It is expressly forbidden for You to use the Package to develop any software or other technology having the same primary function as the Package, including but not limited to using the Package in any development or test procedure that seeks to develop like software or other technology, or determine if such software or other technology performs in a similar manner as the Package.

    4. You may not sell, rent, lease, or transfer the Package to third parties without prior written permission in hardcopy (ie. letter or fax) signed and dated by SnertSoft.

  5. Termination

    1. This Agreement is effective until terminated. You may terminate this Agreement at any time by destroying all copies of the Package.

    2. This Agreement will terminate immediately without notice from SnertSoft if You fail to comply with any provision of this Agreement.

    3. Either party may terminate this Agreement immediately should any portion of the Package become, or in either party's opinion be likely to become, the subject of a claim of infringement of any intellectual property right. Upon Termination, You must destroy all copies of the Package.

  6. Versions Of The License

    1. New Versions. SnertSoft may publish revised and/or new versions of the License from time to time. Each version will be given a distinguishing version number.

    2. Effect of New Versions. Once a version of the Package has been published under a particular version of the License, You may always continue to use it under the terms of that License version. You may also choose to use such Package under the terms of the most current version of the License published by SnertSoft.

    3. No one other than SnertSoft has the right to modify the terms applicable to the Package created under this License.

Disclaimer

THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO WAY SHALL SNERTSOFT OR LICENSEE BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

License Control

The Package may use one or more license control methods including, but not limited to, license key activation, periodic reporting of Package details and IP address of installation to SnertSoft & Co., or remote license verification by SnertSoft & Co.. Any information reported to or gathered by SnertSoft & Co. shall remain strictly confidential and the private property of SnertSoft & Co.. Under no circumstances will SnertSoft & Co. resell or release this information to third parties, unless demanded by court order.

Support

Support is provided for one year from date of purchase and only for SnertSoft's original Package that was purchased directly from SnertSoft. Additional support beyond the first year can be obtained from SnertSoft on time & materials basis or from one of SnertSoft's authorised partners.

Support for the Package obtained from authorised partners, such as value-added resllers or appliance manufacturers, will be supplied by those partners. SnertSoft will not support the Package without proof of purchase from SnertSoft, such as an Order N° or Invoice N°.

Package enhancements requests and product suggestions are always welcome. A community mailing list is available; please refer to SnertSoft web site Support area for details.

Gifts

Gifts from the author's Amazon US or Amazon UK wishlist (search by mail address <achowe at snert dot com>) are welcomed for the continued encouragement, moral support, and ego pumping needed to work in foreign non-english speaking lands.

tea leaves since 10 April 2006