smtp_server_extensions.anubis 2.15 KB
/*
 * 
 * User: David RENE
 * Date: 30/05/2008
 * Time: 01:18
 * (c) Calexium
 *
 */
 
read tools/basis.anubis
read system/string.anubis

public type SMTP_Extension_verb:
  smtp_extension_verb
  (
    String verb
  ).
  
public define SMTP_Extension_verb enhanced_status_codes = smtp_extension_verb("ENHANCEDSTATUSCODES").
public define SMTP_Extension_verb size                  = smtp_extension_verb("SIZE").

define Bool
  has_smtp_extension
  (
    List(String)  lines,    //left lines given in ehlo stage
    Int           length,
    String        search_ext
  )=
  if lines is
  {
    []    then false,
    [h . t] then
      if sub_string(h, 4, length) is
      {
        failure     then has_smtp_extension(t, length, search_ext),
        success(s)  then 
          if insensitive_equal(s, search_ext) then
            true
          else
            has_smtp_extension(t, length, search_ext),
      }
  }.

public define Bool
  has_smtp_extension
  (
    List(String)        lines,    //left lines given in ehlo stage
    SMTP_Extension_verb search_ext
  )=
  has_smtp_extension(lines, length(search_ext.verb), search_ext.verb).

define Maybe(String)
  get_smtp_extension_value
  (
    List(String)  lines,    //left lines given in ehlo stage
    Int           len,
    String        search_ext
  )=
  if lines is
  {
    []      then failure,
    [h . t] then
      if sub_string(h, 4, len) is
      {
        failure     then get_smtp_extension_value(t, len, search_ext),
        success(s)  then 
          if insensitive_equal(s, search_ext) then
            sub_string(h, 5+len, length(h)-(5+len))
          else
            get_smtp_extension_value(t, len, search_ext),
      }
  }.

 /** 
  * return the value of wanted smtp extension name
  * for "SIZE 10000" it return 10000.
  * if the smtp verb doesn't exist, it return failure
  */
  
public define Maybe(String)
  get_smtp_extension_value
  (
    List(String)        lines,    //left lines given in ehlo stage
    SMTP_Extension_verb search_ext
  )=
  if has_smtp_extension(lines, length(search_ext.verb), search_ext.verb) then
    get_smtp_extension_value(lines, length(search_ext.verb), search_ext.verb)
  else
    failure.