class ASF::Mail

Public Class Methods

_load_lists() click to toggle source

Parse the .archives file to get the list names

# File lib/whimsy/asf/mail.rb, line 44
def self._load_lists
  apmail_bin = ASF::SVN['apmail_bin']
  file = File.join(apmail_bin, '.archives')
  if not @lists or File.mtime(file) != @list_mtime
    lists = Hash[File.read(file).scan(
      /^\s+"(\w[-\w]+)", "\/home\/apmail\/(public|private)-arch\//
    )]
    # Drop the infra test lists
    lists.delete_if {|list| list =~ /-infra-[a-z]$/ or list == 'incubator-infra-dev' }
    @lists = lists
    @list_mtime = File.mtime(file)
  end
end
archivelistid(dom,list) click to toggle source

Convert list name to form used in bin/.archives

# File lib/whimsy/asf/mail.rb, line 181
def self.archivelistid(dom,list)
  return "apachecon-#{list}" if dom == 'apachecon.com'
  return list if dom == 'apache.org'
  dom.sub(".apache.org",'-') + list
end
cannot_sub() click to toggle source
# File lib/whimsy/asf/mail.rb, line 78
def self.cannot_sub
  self._load_auto()
  @auto[:disallowed]
end
cansub(member, pmc_chair, ldap_pmcs, lidonly = true) click to toggle source

which lists are available for subscription via Whimsy? member: true if member pmc_chair: true if pmc_chair ldap_pmcs: list of (P)PMC mail_list names lid_only: return lid instead of [dom,list,lid] output is and array of entries: lid or [dom,list,lid]

# File lib/whimsy/asf/mail.rb, line 104
def self.cansub(member, pmc_chair, ldap_pmcs, lidonly = true)
  allowed = []
  parse_flags do |dom,list,f|
    lid = archivelistid(dom,list)
    next if self.cannot_sub.include? lid # probably unnecessary
    cansub = false
    modsub = isModSub?(f)
    if not modsub # subs not moderated; allow all
      cansub = true
    elsif self.committers_allowed().include?(lid) # always allowed
      cansub = true
    else # subs are moderated
      if member
        if list == 'private' or self.members_allowed.include?(lid)
          cansub = true
        end
      else
        if ldap_pmcs
          cansub = true if list == 'private' and ldap_pmcs.include? dom.sub('.apache.org','')
        end
      end
      if pmc_chair and self.chairs_allowed.include? lid
        cansub = true
      end
    end
    if cansub
      if lidonly
        allowed << lid
      else
        allowed << [dom,list,lid] 
      end
    end
  end
  allowed
end
chairs_allowed() click to toggle source
# File lib/whimsy/asf/mail.rb, line 88
def self.chairs_allowed
  self._load_auto()
  @auto[:chairs]
end
committers_allowed() click to toggle source
# File lib/whimsy/asf/mail.rb, line 83
def self.committers_allowed
  self._load_auto()
  @auto[:committers]
end
configure() click to toggle source

common configuration for sending mail; loads :sendmail configuration from ~/.whimsy if available; otherwise default to disable openssl verification as that is what it required in order to work on the infrastructure provided whimsy-vm.

# File lib/whimsy/asf/mail.rb, line 145
def self.configure
  # fetch overrides
  sendmail = ASF::Config.get(:sendmail)

  if sendmail
    # convert string keys to symbols
    options = Hash[sendmail.map {|key, value| [key.to_sym, value.untaint]}]

    # extract delivery method
    method = options.delete(:delivery_method).to_sym
  else
    # provide defaults that work on whimsy-vm* infrastructure.  Since
    # procmail is configured with a self-signed certificate, verification
    # isn't a possibility
    method = :smtp
    options = {openssl_verify_mode: 'none'}
  end

  ::Mail.defaults do
    delivery_method method, options
  end
end
deprecated() click to toggle source

list of mailing lists that aren't actively seeking new subscribers

# File lib/whimsy/asf/mail.rb, line 73
def self.deprecated
  apmail_bin = ASF::SVN['apmail_bin']
  YAML.load_file(File.join(apmail_bin, 'deprecated_mailing_lists.yml'))
end
list() click to toggle source

return a Hash containing complete list of all known emails, and the ASF::Person that is associated with that email.

# File lib/whimsy/asf/mail.rb, line 8
def self.list
  begin
    return Hash[@list.to_a] if @list
  rescue NoMethodError, WeakRef::RefError
  end

  list = Hash.new

  # load info from LDAP
  people = ASF::Person.preload(['mail', 'asf-altEmail'])
  people.each do |person|
    (person.mail+person.alt_email).each do |mail|
      list[mail.downcase] = person
    end
  end

  # load all member emails in one pass
  ASF::Member.each do |id, text|
    Member.emails(text).each do |mail| 
      list[mail.downcase] ||= Person.find(id)
    end
  end

  # load all ICLA emails in one pass
  ASF::ICLA.each do |icla|
    person = Person.find(icla.id)
    list[icla.email.downcase] ||= person
    next if icla.id == 'notinavail'
    list["#{icla.id.downcase}@apache.org"] ||= person
  end

  @list = WeakRef.new(list)
  list
end
list_mtime() click to toggle source
# File lib/whimsy/asf/mail.rb, line 67
def self.list_mtime
  Mail._load_lists
  @list_mtime
end
lists(public_private=false) click to toggle source

get a list of all mailing lists. If public_private is false this will be a simple list. If public_private is true, return a Hash where the values are either public or private.

# File lib/whimsy/asf/mail.rb, line 62
def self.lists(public_private=false)
  Mail._load_lists
  public_private ? @lists : @lists.keys
end
members_allowed() click to toggle source
# File lib/whimsy/asf/mail.rb, line 93
def self.members_allowed
  self._load_auto()
  @auto[:members]+@auto[:chairs]
end
qmail_ids() click to toggle source

List of .qmail files that could clash with user ids (See: INFRA-14566)

# File lib/whimsy/asf/mail.rb, line 169
def self.qmail_ids
  return [] unless File.exist? '/srv/subscriptions/qmail.ids'
  File.read('/srv/subscriptions/qmail.ids').split
end
taken?(id) click to toggle source

Is the id used by qmail? See also ASF::ICLA.taken?

# File lib/whimsy/asf/mail.rb, line 176
def self.taken?(id)
  self.qmail_ids.include? id
end
to_canonical(email) click to toggle source

Canonicalise an email address, removing aliases and ignored punctuation and downcasing the name if safe to do so

Currently only handles aliases for @gmail.com and @googlemail.com

All domains are converted to lower-case

The case of the name part is preserved since some providers may be case-sensitive Almost all providers ignore case in names, however that is not guaranteed

# File lib/whimsy/asf/mail.rb, line 196
def self.to_canonical(email)
  parts = email.split('@')
  if parts.length == 2
    name, dom = parts
    return email if name.length == 0 || dom.length == 0
    dom.downcase!
    dom = 'gmail.com' if dom == 'googlemail.com' # same mailbox
    if dom == 'gmail.com'
      return name.sub(/\+.*/,'').gsub('.','').downcase + '@' + dom
    else
      # Effectively the same:
      dom = 'apache.org' if dom == 'minotaur.apache.org'
      # only downcase the domain (done above)
      return name + '@' + dom
    end
  end
  # Invalid; return input rather than failing
  return email
end