Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
opendkim-lua(3) 	    Library Functions Manual		 opendkim-lua(3)

NAME
     opendkim-lua - Programming the OpenDKIM filter using Lua scripts

DESCRIPTION
     The  OpenDKIM filter has hooks to run user-provided scripts for making pol-
     icy decisions regarding signatures to add on outbound messages or verifica-
     tion and acceptance of messages inbound.  The hooks take the form of multi-
     ple Lua scripts which, if defined, are run at important points during  pro-
     cessing of a message.

     For  a full description of the Lua language, consult Lua programming refer-
     ences (see below for a starting point).  This man page only  describes  the
     use  of  Lua  in  the  context  of OpenDKIM, specifically the functions and
     global variables OpenDKIM provides for use in user-constructed scripts  be-
     yond what Lua provides by default.

     Unless  otherwise	noted, all functions described below return a single re-
     sult; on success they return the requested data, and on error  they  return
     the Lua constant "nil".

     Four scripting hooks are provided.  They are as follows:

     setup  The  setup script is run after all headers for the message have been
	    received but before any DKIM operations have started.  At this point
	    the user can examine the available header fields to  decide  whether
	    the  message should be signed or verified (or both) and, if signing,
	    which key(s) should be used to add signatures  and	which  signature
	    features are desired.

     screen
	    The  screen  script  is  run after the DKIM verification context has
	    been established.  The main purpose of this script is  to  give  the
	    user an opportunity to examine the message header fields compared to
	    the available DKIM signatures and determine which, if any, should be
	    ignored  during  verification.   For  example, the user might decide
	    only signatures added by domains exactly matching that in the  From:
	    domain are acceptable, and the rest should be ignored.

     statistics
	    The  statistics script is run after all of the DKIM verification and
	    signing work has been completed but before any  final  message  han-
	    dling  is done.  The main purpose of this script is to give the user
	    an opportunity to examine the message or its signatures and make ar-
	    bitrary additional statistical observations that should be	recorded
	    by	the  statistics  module.   (Experimental feature not enabled for
	    this installation.)

     final  The final script is run after all of the DKIM verification and sign-
	    ing work has been completed.  The user has an opportunity to examine
	    the results of all of the signature evaluations and make a	decision
	    about  whether or not the message should be accepted, rejected, dis-
	    carded, quarantined, etc.  If the message is  accepted,  any  signa-
	    tures  requested  earlier will be added to the messages before it is
	    released.

GLOBAL VARIABLES
     The following global variable(s) are provided for all user scripts:

     ctx    This is a generic context pointer referring to the context in  which
	    the  filtering operation is being performed.  It represents a single
	    message in progress, and the connection that accepted it.

SETUP SCRIPT FUNCTIONS
     These functions are made available to Lua for processing a message  through
     the setup script:

     odkim.check_popauth(ctx)
	    Returns 1 if the SMTP client represented by ctx is coming from an IP
	    address  found  in the POPAUTH database (if enabled and configured),
	    and 0 otherwise.  Returns the Lua  constant  "nil"	if  the  POPAUTH
	    database is not enabled or not configured.

     odkim.db_check(db, string)
	    Returns 1 if db refers to a valid database handle (see odkim.get_db-
	    handle()  below)  and string is found in that database, and 0 other-
	    wise.  If an error occurs, the Lua constant "nil" is returned.

     odkim.db_close(db)
	    Closes the specified data set.  Returns 1.	The current  implementa-
	    tion will conduct data set garbage collection when the script termi-
	    nates, so this is not strictly necessary, but is recommended.

     odkim.db_open(name[, icase])
	    Opens  the	data set specified by name.  If icase is provided and is
	    "true", then queries into the  database  will  be  case-insensitive.
	    See  the  opendkim(8)  man page for information on specifying a data
	    set.  On success, returns  a  handle  that	can  be  passed  to  od-
	    kim.db_check(); raises an exception on failure.

     odkim.export(ctx, name, value[, name2, value2[, ...]])
	    Exports variables named with their corresponding values so that they
	    will be available to later scripts.

     odkim.get_clienthost(ctx)
	    Returns the name of the host on the other end of the SMTP connection
	    sending  the current message.  This is usually a hostname, but might
	    be an IP address in square brackets if the SMTP client's IP  address
	    does not have a name associated with it.

     odkim.get_clientip(ctx)
	    Returns  the  IP  address of the client on the other end of the SMTP
	    connection sending the current message as a string.  Both  IPv4  and
	    IPv6 addresses are supported.

     odkim.get_dbhandle(ctx, db)
	    Returns  a	handle	for  the  requested database that can be used in
	    later queries.  The value of db should be one of  DB_MTAS  (database
	    of	MTA  names  whose mail should be signed), DB_MACROS (database of
	    MTA macro checks to be done when  determining  signing),  DB_DOMAINS
	    (database  of  domains  to	be signed), DB_SIGNINGTABLE (database of
	    signing table entries), DB_THIRDPARTY (database of third party  sig-
	    natures  to  be  trusted)  and DB_DONTSIGNTO (database of recipients
	    whose mail should not be signed).  If the requested database is  not
	    set in the current configuration file, a Lua "nil" is returned.

     odkim.get_envfrom(ctx)
	    Retrieves  the  SMTP  envelope sender address for the message repre-
	    sented by ctx.

     odkim.get_fromdomain(ctx)
	    Retrieves the domain name of the sender of the  message  represented
	    by ctx.

     odkim.get_header(ctx, name, n)
	    Retrieves  the  string  contained  in instance n of the header field
	    called name from the message represented by ctx, or the Lua constant
	    "nil" if there was no such header  field.	Header	field  numbering
	    starts at 0, so use 0 for the first instance, 1 for the second, etc.
	    For example:

	    fromaddr = odkim.get_header(ctx, "From", 0)

	    This  will return the value of the first (and hopefully only) "From"
	    header field.  Negative values of n count backwards from the end  of
	    the set of header fields, so:

	    rcvd = odkim.get_header(ctx, "Received", -2)

	    will retrieve the second-last Received: header field on the message.

     odkim.get_mtasymbol(ctx, name)
	    Retrieves  the  value of the symbol called name from the MTA connec-
	    tion represented by ctx, or the Lua constant "nil" if the  requested
	    symbol was not available at the time of the request.

     odkim.get_rcpt(ctx, n)
	    Returns  the  nth  envelope recipient for the message represented by
	    ctx.  Recipient numbering starts at 0, so for the  first  recipient,
	    use  0  for  n.  If n references an out-of-range value, the Lua con-
	    stant "nil" is returned.

     odkim.get_rcptarray(ctx)
	    Returns the envelope recipients for the message represented  by  ctx
	    in a single Lua array.

     odkim.internal_ip(ctx)
	    Returns  1 if the SMTP client is coming from an internal IP address,
	    and 0 otherwise.

     odkim.log(ctx, log)
	    Logs the string log if the current configuration requested	logging.
	    (Checking  current	configuration  is  why	the ctx parameter is re-
	    quired.)

     odkim.rcpt_count(ctx)
	    Returns the count of envelope recipients on the message.

     odkim.replace_header(ctx, name, n, newval)
	    Retrieves the value of in instance n of header  field  name  in  the
	    message referenced by ctx and replaces it with the string in newval.
	    See odkim.get_header() above for more information about possible pa-
	    rameter  values  for  n.  Note that this only changes the content of
	    the header field used when generating or  verifying  the  signature;
	    the  actual  delivered message is not modified.  This can be used to
	    anticipate how an intermediate mail transfer agent might  alter  the
	    message, thus correcting an avoidable signature invalidation.

     odkim.resign(ctx)
	    Arranges  that  the  arriving  message will be verified and then re-
	    signed in a single operation.  Returns 1 on success or the Lua  con-
	    stant "nil" on failure.

     odkim.set_result(ctx, result)
	    Arranges  to  have the MTA return a specific result code in response
	    to the message represented by ctx.	The value of result must be  one
	    of	SMFIS_TEMPFAIL	(temporary failure/rejection), SMFIS_ACCEPT (ac-
	    cept without further processing), SMFIS_DISCARD (accept but  discard
	    the  message)  and	SMFIS_REJECT (permanent failure/rejection).  Re-
	    turns 1 on success or the Lua constant "nil" on failure.  Note  that
	    returning  any of these codes indicates a final message disposition;
	    the MTA will be told immediately to take the specified  action,  and
	    no further filter processing will occur.

     odkim.sign(ctx[, keyname[, signer[, signlen]]])
	    Requests  that  the filter sign the message represented by ctx using
	    the specified keyname.  The key name will be translated into an  ac-
	    tual  domain,  selector  and private key via a query to the KeyTable
	    (see the opendkim.conf(5) page for details).   The	keyname  may  be
	    omitted  if  the KeyTable is not defined, meaning the single signing
	    domain, selector and key should be used to sign.  Returns 1 on  suc-
	    cess  and  0 on failure.  If a signer is specified, the string there
	    will be included in  the  generated  signature's  "i="  tag.   If  a
	    signlen  is  specified,  the signature will cover that many bytes of
	    the message body.  The order of these last two parameters is  inter-
	    changeable.

     odkim.signfor(ctx, address[, multi])
	    Applies  whatever signatures would be applied by default if the can-
	    didate message had the specified  address  in  the	message's  From:
	    field.   The multi parameter, if "true" (default is "false"), allows
	    the application of multiple signatures.  Returns the number of  sig-
	    natures applied, which may be zero.

     odkim.spam(ctx)
	    Tags the message as spam, for use in developing reputation about do-
	    mains that signed the message.  Returns nothing.  (Experimental fea-
	    ture not enabled for this installation.)

     odkim.use_ltag(ctx)
	    Requests that all signatures added to the message represented by ctx
	    include  "l="  (body  length) tags.  Always returns the Lua constant
	    "nil".

     odkim.verify(ctx)
	    Requests that the message represented by ctx be  subjected	to  DKIM
	    signature  verification.  Returns the Lua constant "nil" on success,
	    or an error string on failure.

     odkim.xtag(ctx, tag, value)
	    Requests that all signatures added to the message represented by ctx
	    include the named extension tag and value.	Returns  the  number  of
	    signatures	successfully modified, or -1 on error.	An error can oc-
	    cur if the named tag is one already explicitly supported by the DKIM
	    library, or if there is a syntax error in the tag or value.

SCREEN SCRIPT FUNCTIONS
     The screen script has the following functions available to  it,  whose  de-
     scriptions   can	be  found  above:  odkim.db_check,  odkim.db_close,  od-
     kim.db_open,  odkim.export,  odkim.get_dbhandle,	odkim.get_envfrom,   od-
     kim.get_fromdomain,  odkim.get_header, odkim.get_mtasymbol, odkim.get_rcpt,
     odkim.get_rcptarray, odkim.internal_ip,  odkim.log,  odkim.rcpt_count,  and
     odkim.spam.

     The following additional functions are provided for this script:

     odkim.get_sigarray(ctx)
	    Returns  the  complete set of signature handles found in the message
	    represented by ctx, as a Lua array, or the	Lua  constant  "nil"  in
	    case of an error.

     odkim.get_sigcount(ctx)
	    Returns the number of signatures found in the message represented by
	    ctx, or the Lua constant "nil" in case of an error.

     odkim.get_sighandle(ctx, n)
	    Returns  a handle representing an internal copy of the nth signature
	    found on the message represented by ctx.  n must be a number greater
	    than or equal to zero (representing the first  signature)  and  less
	    than  the  number  of signatures on the message, which can be deter-
	    mined using odkim.get_sigcount above.  The requested handle  is  re-
	    turned on success, or the Lua constant "nil" is returned on failure.

     odkim.parse_field(string)
	    Parses the contents of a header field, provided as string, into user
	    and domain parts, discarding whitespace and comment components.  Re-
	    turns  two	strings,  the  user part and the domain part, or the Lua
	    constant "nil" in case of a parsing error.

     odkim.sig_getdomain(sig)
	    Returns the name of the domain in the signature handle specified  by
	    sig,  previously  returned by a call to odkim.get_sighandle().  This
	    is taken from the signature's "d=" tag.

     odkim.sig_getidentity(sig)
	    Returns the identity of the agent adding the signature handle speci-
	    fied by sig, previously returned by a call to odkim.get_sighandle().
	    This is taken from the signature's "i=" tag.  This may be a  default
	    value and not one that was explicitly part of the signature.  If the
	    identity  could  not  be  determined,  the Lua constant "nil" is re-
	    turned.

     odkim.sig_ignore(sig)
	    Instructs the verification code to ignore completely  the  signature
	    specified by sig, previously returned by a call to odkim.get_sighan-
	    dle().   Any pending verification of the message will act as if that
	    signature was not present on the message.  Always  returns	the  Lua
	    constant "nil".

STATISTICS SCRIPT FUNCTIONS
     The  statistics  script  has the following functions available to it, whose
     descriptions can  be  found  above:  odkim.export,  odkim.get_envfrom,  od-
     kim.get_header,  odkim.get_mtasymbol,  odkim.get_rcpt, odkim.get_rcptarray,
     odkim.get_sigarray, odkim.get_sigcount,  odkim.get_sighandle,  odkim.inter-
     nal_ip,  odkim.log,  odkim.parse_field,  odkim.rcpt_count, odkim.sig_getdo-
     main, odkim.sig_getidentity, and odkim.spam.

     The following functions are also available, defined in  the  next	section:
     odkim.rbl_check,	    odkim.rcpt_count,	    odkim.sig_bhresult,      od-
     kim.sig_bodylength, odkim.sig_canonlength, and odkim.sig_result.

     The following additional function is provided for this script:

     odkim.stats(ctx, name, value)
	    Records the additional statistic called  name  with  its  associated
	    value for the message represented by ctx.

FINAL SCRIPT FUNCTIONS
     The  final  script  has  the following functions available to it, whose de-
     scriptions can be found  above:  odkim.get_clienthost,  odkim.get_clientip,
     odkim.get_envfrom,  odkim.get_fromdomain,	odkim.get_header, odkim.get_mta-
     symbol,  odkim.get_rcpt,	odkim.get_rcptarray,   odkim.get_sigarray,   od-
     kim.get_sigcount,	odkim.get_sighandle,  odkim.internal_ip,  odkim.log, od-
     kim.parse_field, odkim.rcpt_count,  odkim.set_result,  odkim.sig_getdomain,
     odkim.sig_getidentity, odkim.spam, and odkim.xtags.

     The following additional functions are provided for this script:

     odkim.add_header(ctx, name, value)
	    Adds  a new header field called name with the specified value to the
	    message represented by ctx.  Returns 1 on success, or the  Lua  con-
	    stant "nil" on failure.

     odkim.add_rcpt(ctx, addr)
	    Adds  addr	as  an	envelope recipient to the message represented by
	    ctx.  Returns 1 on success, or the Lua constant "nil" on failure.

     odkim.del_header(ctx, name, n)
	    Deletes the nth instance (starting	from  0)  of  the  header  field
	    called  name from the message represented by ctx.  Returns 1 on suc-
	    cess, or the Lua constant "nil" on failure.

     odkim.del_rcpt(ctx, addr)
	    Deletes addr from the list of envelope  recipients	on  the  message
	    represented  by  ctx,  and	adds  a new X-Original-Recipient: header
	    field containing the deleted address.  Returns 1 on success, or  the
	    Lua constant "nil" on failure.

     odkim.quarantine(ctx, reason)
	    Asks the MTA to quarantine the message represented by ctx using rea-
	    son as a text string indicating the reason for the request.  Returns
	    1 on success or the Lua constant "nil" on failure.

     odkim.rbl_check(ctx, query, qroot[, timeout])
	    Makes  an  RBL query.  The root of the RBL is assumed to be at qroot
	    and the subject of the query is query, so the query  performed  will
	    be query.qroot .  The context handle ctx must also be provided as it
	    contains  a  handle  to  the  established DNS service.  The optional
	    timeout parameter is the timeout to use, in seconds.  Returns  "nil"
	    on	error,	no values if the requested record was not present in the
	    RBL, or the four octets of the RBL entry if it was.  The octets  are
	    returned in big-endian order.  (Experimental feature not enabled for
	    this installation.)

     odkim.set_reply(ctx, rcode, xcode, message)
	    Instructs  the  MTA to return the specified SMTP reply to the client
	    sending the message represented by ctx.  rcode must be a three-digit
	    SMTP reply code starting with 4 or 5  (for	temporary  or  permanent
	    failures,  respectively);  xcode must be the empty string or a valid
	    extended reply code (see RFC2034) matching rcode; and  message  must
	    be the text portion of the SMTP reply to be sent.  Returns 1 on suc-
	    cess or the Lua constant "nil" on failure.

     odkim.sig_bhresult(sig)
	    Returns the result code corresponding to the body hash evaluation of
	    the  signature  handled  specified	by sig, previously returned by a
	    call to odkim.get_sighandle().  Valid values  are  the  DKIM_SIGBH_*
	    constants defined in the libopendkim header file dkim.h.

     odkim.sig_bodylength(sig)
	    Returns  the  total  length of the message signed by sig, previously
	    returned by a call to odkim.get_sighandle(),  or  the  Lua	constant
	    "nil" if this value could not be determined.

     odkim.sig_canonlength(sig)
	    Returns  the canonicalized length of the message signed by sig, pre-
	    viously returned by a call to odkim.get_sighandle(), or the Lua con-
	    stant "nil" if this value could not be determined.	Note  that  this
	    may be less than the value returned by odkim.get_bodylength() if the
	    signature only covered part of the message.

     odkim.sig_result(sig)
	    Returns the result code corresponding to the signature handled spec-
	    ified  by  sig,  previously  returned by a call to odkim.get_sighan-
	    dle().  Valid values are the constants with DKIM_SIGERROR_	prefixes
	    as defined in the libopendkim header file dkim.h.

VERSION
     This man page covers version 2.11.0 of OpenDKIM.

COPYRIGHT
     Copyright (c) 2009-2015, The Trusted Domain Project.  All rights reserved.

SEE ALSO
     opendkim(8), opendkim.conf(5)

     Lua -- http://www.lua.org

			   The Trusted Domain Project		 opendkim-lua(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=opendkim-lua&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help