module Buryspam::Procmail

Module to extract the locations of various files from the .procmailrc file. Currently the spam file and the procmail log file are extracted.

Constants

FileRegex

The FileRegex structure is passed to the extract method to pull a file name from the .procmailrc file.

  • :filetype field contains a human-readable name of the file to extract from the .procmailrc file.

  • :regex stores the regular expression to apply to the contents of the .procmailrc file to extract the desired filename.

  • :filename stores the full pathname of the file once it has been extracted.

LOGFILE
MAILDIR
RCFILE
SPAMFILE

Public Class Methods

logfile() click to toggle source

Extract the name of the logfile from .procmailrc

# File buryspam.rb, line 3491
def logfile
  extract(LOGFILE)
end
spam_file() click to toggle source

Extract the name of the spamfile from .procmailrc

# File buryspam.rb, line 3486
def spam_file
  extract(SPAMFILE)
end

Private Class Methods

extract(filereg) click to toggle source

Extract a filename from the .procmailrc file. Accepts a FileRegex parameter.

# File buryspam.rb, line 3499
def extract(filereg)
  # If the filename was extracted from a previous call,
  # then return it now.
  unless filereg.filename.nil?
    Logger.debug("Already extracted '#{filereg.filename}' from '#{RCFILE}'")
    return filereg.filename
  end

  procmailrc_contents = IO.binread(RCFILE)
  file = procmailrc_contents[filereg.regex, 1]
  if file.nil?
    raise "Cannot determine #{filereg.filetype} from '#{RCFILE}'"
  end
  file = file.strip.gsub(/^\$HOME/, "~")
  if [~~, //].include?(file[0])
    file = File.expand_path(file)
  else
    # Assume file is relative to MAILDIR if its not absolute.
    file.gsub!(%r{^\$MAILDIR/}, "")
    maildir = procmailrc_contents[MAILDIR, 1]
    if maildir.nil?
      raise "Cannot determine mail directory from '#{RCFILE}'"
    end
    maildir = maildir.strip.gsub(/^\$HOME/, "~")
    file = File.expand_path(file, maildir)
  end
  Logger.debug("Extracted #{filereg.filetype} '#{file}' from '#{RCFILE}'")
  # Save the filename so we won't have to re-extract it if called again.
  filereg.filename = file
  file
end