class HelpdeskController < ApplicationController unloadable before_filter :find_project, :authorize, :except => [:email_note, :update_customer_email] accept_api_auth :email_note, :create_ticket def save_settings if request.put? set_settings flash[:notice] = l(:notice_successful_update) end redirect_to :controller => 'projects', :action => 'settings', :tab => params[:tab] || 'helpdesk', :id => @project end def show_original @attachment = Attachment.find(params[:id]) email = Mail.read(@attachment.diskfile) part = email.text_part || email.html_part || email body_charset = Mail::RubyVer.pick_encoding(part.charset).to_s rescue part.charset plain_text_body = Redmine::CodesetUtil.to_utf8(part.body.decoded, body_charset) headers = email.header.fields.map{|f| "#{f.name}: #{Mail::Encodings.unquote_and_convert_to(f.value, 'utf-8')}"}.join("\n") @content = headers + "\n\n" + plain_text_body render "attachments/file" end def delete_spam if User.current.allowed_to?(:delete_issues, @project) && User.current.allowed_to?(:delete_contacts, @project) begin @issue = Issue.find(params[:issue_id]) @customer = @issue.customer rescue ActiveRecord::RecordNotFound render_404 end ActiveRecord::Base.transaction do ContactsSetting["helpdesk_blacklist", @project.id] = (ContactsSetting["helpdesk_blacklist", @project.id].split("\n") | [@issue.customer.primary_email.strip]).join("\n") @customer.tickets.map(&:destroy) @customer.destroy end respond_to do |format| format.html { redirect_back_or_default(:controller => 'issues', :action => 'index', :project_id => @project) } format.api { render_api_ok } end else deny_access end end def email_note raise Exception, "Param 'message' should be set" unless params[:message] @issue = Issue.find(params[:message][:issue_id]) raise Exception, "Issue with ID: #{params[:message][:issue_id].to_i} should be present and relate to customer" if @issue.nil? || @issue.customer.nil? @journal = @issue.init_journal(User.current) @issue.status_id = params[:message][:status_id] if params[:message][:status_id].blank? && IssueStatus.find_by_id(params[:message][:status_id]) @journal.notes = params[:message][:content] @issue.save! contact = @issue.customer HelpdeskMailer.with_activated_perform_deliveries do if HelpdeskMailer.issue_response(contact, @journal, params).deliver @journal_message = JournalMessage.create(:from_address => "", :to_address => contact.primary_email.downcase, :is_incoming => false, :message_date => Time.now, :contact => contact, :journal => @journal) end end respond_to do |format| format.api { render :action => 'show', :status => :created } end rescue Exception => e respond_to do |format| format.api do @error_messages = [e.message] render :template => 'common/error_messages.api', :status => :unprocessable_entity, :layout => nil end end end def create_ticket raise Exception, "Param 'ticket' should be set" if params[:ticket].blank? @issue = Issue.new @issue.project = @project @issue.author ||= User.current @issue.safe_attributes = params[:ticket][:issue] raise Exception, "Contact should have email address" unless params[:ticket][:contact] || params[:ticket][:contact][:email] @contact = Contact.find_by_emails([params[:ticket][:contact][:email]]).first @contact ||= Contact.new(params[:ticket][:contact]) @contact.projects << @project helpdesk_ticket = HelpdeskTicket.new(:from_address => @contact.primary_email, :to_address => '', :ticket_date => Time.now, :customer => @contact, :is_incoming => true, :issue => @issue, :source => HelpdeskTicket::HELPDESK_WEB_SOURCE) @issue.helpdesk_ticket = helpdesk_ticket @issue.assigned_to = @contact.find_assigned_user(@project, @issue.assigned_to) @issue.save_attachments(params[:attachments] || (params[:ticket][:issue] && params[:ticket][:issue][:uploads])) if @issue.save HelpdeskMailer.auto_answer(@contact, @issue).deliver if HelpdeskSettings["helpdesk_send_notification", @project].to_i > 0 respond_to do |format| format.api { redirect_on_create(params) } end else raise Exception, "Can't create issue: #{@issue.errors.full_messages}" end rescue Exception => e respond_to do |format| format.api do @error_messages = [e.message] HelpdeskLogger.error "API Create Ticket Error: #{e.message}" if HelpdeskLogger render :template => 'common/error_messages.api', :status => :unprocessable_entity, :layout => nil end end end def get_mail set_settings msg_count = HelpdeskMailer.check_project(@project.id) respond_to do |format| format.js do @message = "
#{l(:label_helpdesk_get_mail_success, :count => msg_count)}
" flash.discard end format.html {redirect_to :back} end rescue Exception => e respond_to do |format| format.js do @message = "
Error: #{e.message}
" Rails.logger.error "Helpdesk MailHandler Error: #{e.message}" if Rails.logger && Rails.logger.error flash.discard end format.html {redirect_to :back} end end def update_customer_email @journal = Journal.find(params[:journal_id]) @issue = @journal.journalized @project = @issue.project @display = HelpdeskSettings[:send_note_by_default, @project] ? 'inline' : 'none' if @journal.is_incoming? @contact = @journal.contact @email = @journal.journal_message.from_address from_address = HelpdeskSettings['helpdesk_answer_from', @issue.project].blank? ? Setting.mail_from : HelpdeskSettings['helpdesk_answer_from', @issue.project] @cc_emails = (@issue.helpdesk_ticket.cc_addresses + @journal.journal_message.cc_address.split(',') - [@email, from_address]).uniq else @contact = @issue.helpdesk_ticket.last_reply_customer @email = @issue.helpdesk_ticket.default_to_address @cc_emails = @issue.helpdesk_ticket.cc_addresses - [@email] end end private def find_project project_id = params[:project_id] || (params[:ticket] && params[:ticket][:issue] && params[:ticket][:issue][:project_id]) @project = Project.find(project_id) rescue ActiveRecord::RecordNotFound render_404 end def set_settings set_settings_param("helpdesk_answer_from") set_settings_param("helpdesk_send_notification") set_settings_param("helpdesk_is_not_create_contacts") set_settings_param("helpdesk_created_contact_tag") set_settings_param("helpdesk_blacklist") set_settings_param("helpdesk_emails_header") set_settings_param("helpdesk_answer_subject") set_settings_param("helpdesk_first_answer_subject") set_settings_param("helpdesk_first_answer_template") set_settings_param("helpdesk_emails_footer") set_settings_param("helpdesk_answered_status") set_settings_param("helpdesk_reopen_status") set_settings_param("helpdesk_tracker") set_settings_param("helpdesk_assigned_to") set_settings_param("helpdesk_lifetime") set_settings_param(:helpdesk_protocol) set_settings_param(:helpdesk_host) set_settings_param(:helpdesk_port) set_settings_param(:helpdesk_password) set_settings_param(:helpdesk_username) set_settings_param(:helpdesk_use_ssl) set_settings_param(:helpdesk_imap_folder) set_settings_param(:helpdesk_move_on_success) set_settings_param(:helpdesk_move_on_failure) set_settings_param(:helpdesk_apop) set_settings_param(:helpdesk_delete_unprocessed) set_settings_param(:helpdesk_smtp_use_default_settings) set_settings_param(:helpdesk_smtp_server) set_settings_param(:helpdesk_smtp_domain) set_settings_param(:helpdesk_smtp_port) set_settings_param(:helpdesk_smtp_authentication) set_settings_param(:helpdesk_smtp_username) set_settings_param(:helpdesk_smtp_password) set_settings_param(:helpdesk_smtp_tls) set_settings_param(:helpdesk_smtp_ssl) end def set_settings_param(param) if param == :helpdesk_password || param == :helpdesk_smtp_password ContactsSetting[param, @project.id] = params[param] if params[param] && !params[param].blank? else ContactsSetting[param, @project.id] = params[param] if params[param] end end def redirect_on_create(options) if options[:redirect_on_success].to_s.match('^(http|https):\/\/') redirect_to options[:redirect_on_success].to_s else render :text => "Issue #{@issue.id} created", :status => :created, :location => issue_url(@issue) end end end