From de679b1514955aa27dfe739f9f45c182ebba1f6d Mon Sep 17 00:00:00 2001 From: Stuart Gathman <stuart@gathman.org> Date: Fri, 17 Jun 2011 19:41:23 +0000 Subject: [PATCH] Add parameterless class decorators for P_RCPT_REJ and P_HEAD_LEADSPC --- Milter/__init__.py | 58 +++++++++++++++++++++++++++++++++++----------- doc/milter.py | 5 +++- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/Milter/__init__.py b/Milter/__init__.py index 0e80797..8abffd6 100755 --- a/Milter/__init__.py +++ b/Milter/__init__.py @@ -19,6 +19,12 @@ from milter import * _seq_lock = thread.allocate_lock() _seq = 0 +## @fn set_flags(flags) +# @brief Enable optional %milter actions. +# Certain %milter actions need to be enabled before calling milter.runmilter() +# or they throw an exception. +# @param flags Bit ored mask of optional actions to enable + def uniqueID(): """Return a unique sequence number (incremented on each call). """ @@ -49,13 +55,6 @@ def decode_mask(bits,names): if bits: nms += hex(bits) return nms -## @fn set_flags(flags) -# @brief Enable optional %milter actions. -# Certain %milter actions need to be enabled before calling milter.runmilter() -# or they throw an exception. -# @param flags Bit ored mask of optional actions to enable - - ## Class decorator to enable optional protocol steps. # P_SKIP is enabled by default when supported, but # applications may wish to enable P_HDR_LEADSPC @@ -77,13 +76,6 @@ def decode_mask(bits,names): # return Milter.CONTINUE # myMilter = Milter.enable_protocols(myMilter,Milter.P_RCPT_REJ) # </pre> -# or with python-2.6 and later: -# <pre> -# @@Milter.enable_protocols(Milter.P_RCPT_REJ) -# class myMilter(Milter.Base): -# def envrcpt(self,to,*params): -# return Milter.CONTINUE -# </pre> # @since 0.9.3 # @param klass the %milter application class to modify # @param mask a bitmask of protocol steps to enable @@ -92,6 +84,44 @@ def enable_protocols(klass,mask): klass._protocol_mask = klass.protocol_mask() & ~mask return klass +## Milter rejected recipients. A class decorator that calls +# enable_protocols() with the P_RCPT_REJ flag. By default, the MTA +# does not pass recipients that it knows are invalid on to the milter. +# This decorator enables a %milter app to see all recipients if supported +# by the MTA. Use like this with python-2.6 and later: +# <pre> +# @@Milter.rejected_recipients +# class myMilter(Milter.Base): +# def envrcpt(self,to,*params): +# return Milter.CONTINUE +# </pre> +# @since 0.9.5 +# @param klass the %milter application class to modify +# @return the modified %milter class +def rejected_recipients(klass): + return enable_protocols(klass,P_RCPT_REJ) + +## Milter leading space on headers. A class decorator that calls +# enable_protocols() with the P_HEAD_LEADSPC flag. By default, +# header continuation lines are collected and joined before getting +# sent to a milter. Headers modified or added by the milter are +# folded by the MTA as necessary according to its own standards. +# With this flag, header continuation lines are preserved +# with their newlines and leading space. In addition, header folding +# done by the milter is preserved as well. +# Use like this with python-2.6 and later: +# <pre> +# @@Milter.header_leading_space +# class myMilter(Milter.Base): +# def header(self,hname,value): +# return Milter.CONTINUE +# </pre> +# @since 0.9.5 +# @param klass the %milter application class to modify +# @return the modified %milter class +def header_leading_space(klass): + return enable_protocols(klass,P_HEAD_LEADSPC) + ## Function decorator to disable callback methods. # If the MTA supports it, tells the MTA not to invoke this callback, # increasing efficiency. All the callbacks (except negotiate) diff --git a/doc/milter.py b/doc/milter.py index 34822e9..c35d991 100644 --- a/doc/milter.py +++ b/doc/milter.py @@ -22,7 +22,10 @@ class milterContext(object): ## Calls <a href="https://www.milter.org/developers/api/smfi_getsymval">smfi_getsymval</a>. def getsymval(self,sym): pass - ## Calls <a href="https://www.milter.org/developers/api/smfi_setreply">smfi_setreply</a>. + ## Calls <a href="https://www.milter.org/developers/api/smfi_setreply"> + # smfi_setreply</a> or + # <a href="https://www.milter.org/developers/api/smfi_setmlreply"> + # smfi_setmlreply</a>. # @param rcode SMTP response code # @param xcode extended SMTP response code # @param msg one or more message lines. If the MTA does not support -- GitLab