www/treasurer/bill-upload.cgi (110 lines of code) (raw):

#!/usr/bin/env ruby PAGETITLE = "Apache Treasurer Bill Upload" # Wvisible:treasurer $LOAD_PATH.unshift '/srv/whimsy/lib' require 'wunderbar' require 'wunderbar/bootstrap' require 'wunderbar/jquery' require 'whimsy/asf' require 'tmpdir' require 'escape' user = ASF::Person.new($USER) unless user.asf_chair_or_member? print "Status: 401 Unauthorized\r\n" print "WWW-Authenticate: Basic realm=\"ASF Members and Officers\"\r\n\r\n" exit end _html do _style :system _style %{ pre._stdin, pre._stdout, pre._stderr {border: none; padding: 0} } _body? do _whimsy_body( title: PAGETITLE, subtitle: 'How To Upload Bills', related: { 'https://treasurer.apache.org/' => 'ASF Treasurer Process Documentation', }, helpblock: -> { _p %{ This form allows ASF Members and Officers to upload invoices or bills to be submitted for payment. } _p %{ Remember: only allowed approvers for a specific bill should put or move bills into the /approved directory. } } ) do # GET: display the data input form for upload _whimsy_panel('Upload A New Bill', style: 'panel-success') do _form.form_horizontal enctype: 'multipart/form-data', method: 'post' do _div.form_group do _label.control_label.col_sm_2 'Select file to upload', for: 'file' _div.col_sm_10 do _input.form_control type: 'file', id: 'file', name: 'file', required: true, autofocus: true end end _div.form_group do _label.control_label.col_sm_2 'Enter commit message', for: 'message' _div.col_sm_10 do _textarea.form_control name: 'message', id: 'message', cols: 80, required: true end end _div.form_group do _label.control_label.col_sm_2 'Funding source (optional)', for: 'source' _div.col_sm_10 do _textarea.form_control name: 'source', id: 'source', cols: 80 end end _div.form_group do _label.control_label.col_sm_2 'Select destination', for: "dest" _div.col_sm_10 do _select.form_control name: 'dest', id: 'dest' do _option 'Bills/received', type: 'radio', name: 'dest', value: 'received', checked: true _option 'Bills/approved', type: 'radio', name: 'dest', value: 'approved' end end end _div.form_group do _div.col_sm_offset_2.col_sm_10 do _input.btn.btn_default type: "submit", value: "Upload" end end end end # POST: process the upload by checking into svn if @file _div.well.well_lg do # destination directory bills = ASF::SVN.svnurl('Bills') # validate @file, @dest form parameters name = @file.original_filename.gsub(/[^-.\w]/, '_').sub(/^\.+/, '_') raise ArgumentError, "Unexpected directory name" unless @dest =~ /^\w+$/ if @file.respond_to? :empty? and @file.empty? _pre 'File is required', class: '_stderr' elsif not @message or @message.empty? _pre 'Message is required', class: '_stderr' elsif not @dest or @dest.empty? _pre 'Destination is required', class: '_stderr' else # append funding source to message, if present if @source and not @source.empty? @message += "\n\nFunding source: #{@source}" end _p 'Log of your upload/checkin follows:' Dir.mktmpdir do |tmpdir| ASF::SVN.svn_('checkout', [File.join(bills, @dest), tmpdir], _, {depth: 'empty', user: $USER, password: $PASSWORD}) Dir.chdir tmpdir do IO.binwrite(name, @file.read) ASF::SVN.svn_('add', name, _) ASF::SVN.svn_('commit', name, _, {msg: @message, user: $USER, password: $PASSWORD}) end end end end end end end end