class SendmailController < ApplicationController unloadable def deliver if has_required_fields meta = params[:meta] if recipients_valid(meta[:recipients]) template = view_for([params[:form], 'default'], 'sendmail', '.erb') Sendmail.deliver_form(sanatize_params(params), meta, template) # After deliver options (redirect, show flash message or render template) if meta[:redirect_to] flash[:notice] = meta[:message] if meta[:message] redirect_to meta[:redirect_to] and return end if meta[:message] flash[:notice] = meta[:message] redirect_to root_url end if meta[:show_page] render :template => File.join('pages', meta[:show_page]) + '.html.erb' and return end else render :text => 'Error: Recipient not in white list' end else render :text => 'Error: Required Field Missing' end end private def view_for(filenames, suffix = '', prefix = '.html.erb') filenames.each do | filename | next if filename.nil? self.view_paths.each do |path| target = (File.join(path.to_s, suffix, filename.to_s) + prefix).downcase logger.debug 'Looking: ' + target if File.file? target logger.debug 'Template CHOOSEN: ' + target return filename end end end logger.debug 'NO TEMPLATE FOUND!!' nil end # Anti SPAM detection def recipients_valid(recipients) recipients.split(',').each do |r| unless Settings.forms.recipients.include? r.strip logger.warn('Email Address not in white list: ' + r) return false end end end def has_required_fields required_fields = ['recipients', 'subject'] required_fields.each do |f| unless params[:meta][f] logger.debug 'Missing form field ' + f return false end end end def sanatize_params(params) black_list = ['meta', 'authenticity_token', 'id', 'controller', 'action', 'send', 'submit', 'form'] white_list = [] params.delete_if { |k,v| black_list.include? k.downcase } params.each do |k,v| params[k] = Sanitize.clean(v) unless white_list.include? k.downcase end params end end