blob: c2a405703469fa7ecedd5967a1d2dde19bd5ed1b [file] [log] [blame]
#
# File an ICLA:
# - add files to documents/iclas
# - add entry to officers/iclas.txt
# - respond to original email
# - [optional] add entry to new-account-reqs.txt
# - [optional] send email to root@
#
# extract message
message = Mailbox.find(@message)
@from.untaint if @from =~ /\A("?[\s\w]+"?\s+<)?\w+@apache\.org>?\z/
# extract file extension
fileext = File.extname(@selected).downcase
# verify that an ICLA under that name doesn't already exist
if "#@filename#{fileext}" =~ /\A\w[-\w]*\.?\w*\z/
# Is there a matching ICLA? (returns first match, if any)
file = ASF::ICLAFiles.match_claRef(@filename.untaint)
if file
_warn "documents/iclas/#{file} already exists"
else
_icla = ASF::ICLA.find_by_email(@email.strip)
if _icla
_warn "Email #{@email.strip} found in iclas.txt file - #{_icla.as_line}"
end
end
else
_warn "#@filename#{fileext} does not appear to be a valid filename"
end
if @email.strip.end_with? '@apache.org'
_warn "Cannot redirect email to an @apache.org address: #{@email.strip}"
end
# extract/verify project
_extract_project
# obtain per-user information
_personalize_email(env.user)
# determine if the user id requested is valid and avaliable
@valid_user = (@user =~ /^[a-z][a-z0-9]{2,}$/)
@valid_user &&= !(ASF::ICLA.taken?(@user) or ASF::Mail.taken?(@user))
# initialize commit message
@document = "ICLA for #{@pubname}"
########################################################################
# document/iclas #
# officers/iclas.txt #
########################################################################
# write attachment (+ signature, if present) to the documents/iclas directory
task "svn commit documents/iclas/#@filename#{fileext} and iclas.txt" do
# construct line to be inserted in iclas.txt
@iclaline ||= [
'notinavail',
@realname.strip,
@pubname.strip,
@email.strip,
"Signed CLA;#{@filename}"
].join(':')
form do
_input value: @selected, name: 'selected'
if @signature and not @signature.empty?
_input value: @signature, name: 'signature'
end
_input value: @iclaline, name: 'iclaline'
_input value: @filename
end
complete do |dir|
svn_multi('officers', 'iclas.txt', 'iclas', @selected, @signature, @filename, fileext, message, @document) do |input|
# append entry to iclas.txt
ASF::ICLA.sort(input + @iclaline + "\n")
end
end
end
########################################################################
# email submitter #
########################################################################
# send confirmation email
task "email #@email" do
# set up notify for body of message
if @pmc
@notify = "the #{@pmc.display_name} PMC has"
if @podling # it looks like podlings also have PMC=Incubator
@notify.sub! /has$/, "and the #{@podling.display_name} podling have"
end
end
# choose reply message based on whether or not the project/userid info was provided
use_Bcc = false # should we use Bcc for the secretary?
if @user and not @user.empty?
if @valid_user
# pmc vote verified and id is valid
reply = 'icla-account-requested.erb'
use_Bcc = true # it's now up to the (P)PMC
else
# pmc vote verified but id is invalid
reply = 'icla-invalid-id.erb'
use_Bcc = true # it's now up to the (P)PMC
end
elsif @pmc
# no pmc vote but pmc was requested to be notified or user is active on project
reply = 'icla-pmc-notified.erb'
use_Bcc = true # it's now up to the (P)PMC
else
# no evidence of project activity by the submitter
reply = 'icla.erb'
end
@cttee = '(P)PMC'
@cttee = "Apache #{@pmc.display_name} PMC" if @pmc
# Process podling after PMC otherwise podling applicants are directed to IPMC
@cttee = "Apache #{@podling.display_name} podling" if @podling
# build mail from template
mail = message.reply(
subject: @document,
from: @from,
to: "#{@pubname.inspect} <#{@email}>",
cc: [
('secretary@apache.org' unless use_Bcc),
("private@#{@pmc.mail_list}.apache.org" if @pmc), # copy pmc
(@podling.private_mail_list if @podling) # copy podling
],
bcc: [ ('secretary@apache.org' if use_Bcc)],
body: template(reply)
)
# set Reply-To header to podling or pmc private mailing list
if @podling
mail.header['Reply-To'] = @podling.private_mail_list
elsif @pmc
mail.header['Reply-To'] = "private@#{@pmc.mail_list}.apache.org"
end
# echo email
form do
if use_Bcc # Show Bcc
_message "Bcc: #{mail[:bcc].decoded}\r\n#{mail.to_s}"
else
_message mail.to_s
end
end
# deliver mail
complete do
mail.deliver!
end
end
if @valid_user and @pmc and not @votelink.empty?
######################################################################
# acreq/new-account-reqs.txt #
######################################################################
task "svn commit infra/acreq/new-account-reqs.txt" do
# construct account request line
@acreq ||= [
@user,
@pubname,
@email,
@pmc.name,
@pmc.name,
Date.today.strftime('%m-%d-%Y'),
'yes',
'yes',
'no'
].join(';')
form do
_input value: @acreq, name: 'acreq'
end
complete do |dir|
rc = ASF::SVN.update(ASF::SVN.svnpath!('acreq', 'new-account-reqs.txt'),
"#{@user} account request by #{env.user} for #{@pmc.name}",
env, _, {diff: true}) do |input|
input + + @acreq + "\n"
end
raise RuntimeError.new("exit code: #{rc}") if rc != 0
end
end
######################################################################
# email root@ #
######################################################################
task "email root@apache.org" do
# build mail from template
mail = Mail.new(template('acreq.erb'))
# adjust copy lists
cc = ["#{@pubname.inspect} <#{@email}>"]
cc << "private@#{@pmc.mail_list}.apache.org" if @pmc # copy pmc
cc << @podling.private_mail_list if @podling # copy podling
mail.cc = cc.uniq.map {|email| email.dup.untaint}
# untaint from and to email addresses
mail.to = mail.to.map {|email| email.dup.untaint}
mail.from = @from.untaint
# echo email
form do
_message mail.to_s
end
# deliver mail
complete do
mail.deliver!
end
end
end