www/secretary/workbench/views/actions/icla.json.rb (150 lines of code) (raw):

# # 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) # 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) if file _warn [["documents/iclas/#{file} already exists", ASF::SVN.svnpath!('iclas', file)]] else _icla = ASF::ICLA.find_by_email(@email.strip) if _icla _warn ["Email #{@email.strip} found in iclas.txt file:", _icla.as_line] else _icla = ASF::ICLA.find_matches(@realname.strip) if _icla.size > 0 lines = [] lines << 'Found possible duplicate ICLAs:' _icla.each do |i| file = ASF::ICLAFiles.match_claRef(i.claRef) lines << [i.legal_name, ASF::SVN.svnpath!('iclas', file)] end _warn lines end 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 available @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 # N.B. it appears that @from is not defined outside the task block _warn "Invalid From address '#{@from}'" unless @from =~ /\A("?[\s\w]+"?\s+<)?[-\w]+@apache\.org>?\z/ mail = message.reply( subject: @document, from: @from, to: "#{@pubname.inspect} <#{@email}>", cc: [ ('secretary@apache.org' unless use_Bcc), (@pmc.private_mail_list 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'] = @pmc.private_mail_list 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 |tmpdir, contents| contents + @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 (already includes TO: root) mail = Mail.new(template('acreq.erb')) # adjust copy lists cc = ["#{@pubname.inspect} <#{@email}>"] cc << @pmc.private_mail_list if @pmc # copy pmc cc << @podling.private_mail_list if @podling # copy podling mail.cc = cc.uniq.map {|email| email} mail.from = @from # echo email form do _message mail.to_s end # deliver mail complete do mail.deliver! end end end