Browse Source

Maintenance: Added Zammad/NoToSymOnString cop to prevent .to_sym on Strings.

Thorsten Eckel 4 years ago
parent
commit
de22f60826

+ 40 - 0
.rubocop/cop/zammad/no_to_sym_on_string.rb

@@ -0,0 +1,40 @@
+module RuboCop
+  module Cop
+    module Zammad
+      # This cop is used to identify usages of `.to_sym` on Strings and
+      # changes them to use the `:` prefix instead.
+      #
+      # @example
+      #   # bad
+      #   "a-Symbol".to_sym
+      #   'a-Symbol'.to_sym
+      #   "a-#{'Symbol'}".to_sym
+      #
+      #   # good
+      #   :"a-Symbol"
+      #   :'a-Symbol'
+      #   :"a-#{'Symbol'}"
+      class NoToSymOnString < Base
+        extend AutoCorrector
+
+        def_node_matcher :to_sym?, <<-PATTERN
+          {
+            $(send (str ...) :to_sym ...)
+            $(send (dstr ...) :to_sym ...)
+          }
+        PATTERN
+
+        MSG = "Don't use `.to_sym` on String. Prefer `:` prefix instead.".freeze
+
+        def on_send(node)
+          result = *to_sym?(node)
+          return if result.empty?
+
+          add_offense(node, message: MSG) do |corrector|
+            corrector.replace(node, ":#{result.first.source}")
+          end
+        end
+      end
+    end
+  end
+end

+ 1 - 0
.rubocop/rubocop_zammad.rb

@@ -1,2 +1,3 @@
 require_relative 'cop/zammad/exists_condition'
+require_relative 'cop/zammad/no_to_sym_on_string'
 require_relative 'cop/zammad/prefer_negated_if_over_unless'

+ 10 - 10
app/models/channel/email_parser.rb

@@ -158,7 +158,7 @@ returns
     end
 
     # check ignore header
-    if mail['x-zammad-ignore'.to_sym] == 'true' || mail['x-zammad-ignore'.to_sym] == true
+    if mail[:'x-zammad-ignore'] == 'true' || mail[:'x-zammad-ignore'] == true
       Rails.logger.info "ignored email with msgid '#{mail[:message_id]}' from '#{mail[:from]}' because of x-zammad-ignore header"
       return
     end
@@ -174,7 +174,7 @@ returns
     Transaction.execute(interface_handle: "#{original_interface_handle}.postmaster") do
 
       # get sender user
-      session_user_id = mail['x-zammad-session-user-id'.to_sym]
+      session_user_id = mail[:'x-zammad-session-user-id']
       if !session_user_id
         raise 'No x-zammad-session-user-id, no sender set!'
       end
@@ -188,11 +188,11 @@ returns
       UserInfo.current_user_id = session_user.id
 
       # get ticket# based on email headers
-      if mail['x-zammad-ticket-id'.to_sym]
-        ticket = Ticket.find_by(id: mail['x-zammad-ticket-id'.to_sym])
+      if mail[:'x-zammad-ticket-id']
+        ticket = Ticket.find_by(id: mail[:'x-zammad-ticket-id'])
       end
-      if mail['x-zammad-ticket-number'.to_sym]
-        ticket = Ticket.find_by(number: mail['x-zammad-ticket-number'.to_sym])
+      if mail[:'x-zammad-ticket-number']
+        ticket = Ticket.find_by(number: mail[:'x-zammad-ticket-number'])
       end
 
       # set ticket state to open if not new
@@ -203,9 +203,9 @@ returns
         ticket.save! if ticket.has_changes_to_save?
 
         # set ticket to open again or keep create state
-        if !mail['x-zammad-ticket-followup-state'.to_sym] && !mail['x-zammad-ticket-followup-state_id'.to_sym]
+        if !mail[:'x-zammad-ticket-followup-state'] && !mail[:'x-zammad-ticket-followup-state_id']
           new_state = Ticket::State.find_by(default_create: true)
-          if ticket.state_id != new_state.id && !mail['x-zammad-out-of-office'.to_sym]
+          if ticket.state_id != new_state.id && !mail[:'x-zammad-out-of-office']
             ticket.state = Ticket::State.find_by(default_follow_up: true)
             ticket.save!
           end
@@ -250,8 +250,8 @@ returns
       end
 
       # apply tags to ticket
-      if mail['x-zammad-ticket-tags'.to_sym].present?
-        mail['x-zammad-ticket-tags'.to_sym].each do |tag|
+      if mail[:'x-zammad-ticket-tags'].present?
+        mail[:'x-zammad-ticket-tags'].each do |tag|
           ticket.tag_add(tag)
         end
       end

+ 16 - 16
app/models/channel/filter/auto_response_check.rb

@@ -5,34 +5,34 @@ module Channel::Filter::AutoResponseCheck
   def self.run(_channel, mail)
 
     # if header is available, do not generate auto response
-    mail[ 'x-zammad-send-auto-response'.to_sym ] = false
-    mail[ 'x-zammad-is-auto-response'.to_sym ] = true
+    mail[ :'x-zammad-send-auto-response' ] = false
+    mail[ :'x-zammad-is-auto-response' ] = true
 
-    if !mail[ 'x-zammad-article-preferences'.to_sym ]
-      mail[ 'x-zammad-article-preferences'.to_sym ] = {}
+    if !mail[ :'x-zammad-article-preferences' ]
+      mail[ :'x-zammad-article-preferences' ] = {}
     end
-    mail[ 'x-zammad-article-preferences'.to_sym ]['send-auto-response'] = false
-    mail[ 'x-zammad-article-preferences'.to_sym ]['is-auto-response'] = true
+    mail[ :'x-zammad-article-preferences' ]['send-auto-response'] = false
+    mail[ :'x-zammad-article-preferences' ]['is-auto-response'] = true
 
     # do not send an auto response if one of the following headers exists
-    return if mail[ 'list-unsubscribe'.to_sym ] && mail[ 'list-unsubscribe'.to_sym ] =~ /.../
-    return if mail[ 'x-loop'.to_sym ] && mail[ 'x-loop'.to_sym ] =~ /(yes|true)/i
-    return if mail[ 'precedence'.to_sym ] && mail[ 'precedence'.to_sym ] =~ /(bulk|list|junk)/i
-    return if mail[ 'auto-submitted'.to_sym ] && mail[ 'auto-submitted'.to_sym ] =~ /auto-(generated|replied)/i
-    return if mail[ 'x-auto-response-suppress'.to_sym ] && mail[ 'x-auto-response-suppress'.to_sym ] =~ /all/i
+    return if mail[ :'list-unsubscribe' ] && mail[ :'list-unsubscribe' ] =~ /.../
+    return if mail[ :'x-loop' ] && mail[ :'x-loop' ] =~ /(yes|true)/i
+    return if mail[ :precedence ] && mail[ :precedence ] =~ /(bulk|list|junk)/i
+    return if mail[ :'auto-submitted' ] && mail[ :'auto-submitted' ] =~ /auto-(generated|replied)/i
+    return if mail[ :'x-auto-response-suppress' ] && mail[ :'x-auto-response-suppress' ] =~ /all/i
 
     # do not send an auto response if sender is system itself
-    message_id = mail[ 'message_id'.to_sym ]
+    message_id = mail[ :message_id ]
     if message_id
       fqdn = Setting.get('fqdn')
       return if message_id.match?(/@#{Regexp.quote(fqdn)}/i)
     end
 
-    mail[ 'x-zammad-send-auto-response'.to_sym ] = true
-    mail[ 'x-zammad-is-auto-response'.to_sym ] = false
+    mail[ :'x-zammad-send-auto-response' ] = true
+    mail[ :'x-zammad-is-auto-response' ] = false
 
-    mail[ 'x-zammad-article-preferences'.to_sym ]['send-auto-response'] = true
-    mail[ 'x-zammad-article-preferences'.to_sym ]['is-auto-response'] = false
+    mail[ :'x-zammad-article-preferences' ]['send-auto-response'] = true
+    mail[ :'x-zammad-article-preferences' ]['is-auto-response'] = false
 
   end
 end

+ 1 - 1
app/models/channel/filter/bounce_delivery_temporary_failed.rb

@@ -10,7 +10,7 @@ module Channel::Filter::BounceDeliveryTemporaryFailed
     return if mail[:mail_instance].error_status != '4.4.1'
 
     # if header is available, do change current ticket state
-    mail['x-zammad-out-of-office'.to_sym] = true
+    mail[:'x-zammad-out-of-office'] = true
 
     true
   end

+ 3 - 3
app/models/channel/filter/bounce_follow_up_check.rb

@@ -7,7 +7,7 @@ module Channel::Filter::BounceFollowUpCheck
     return if !mail[:mail_instance]
     return if !mail[:mail_instance].bounced?
     return if !mail[:attachments]
-    return if mail[ 'x-zammad-ticket-id'.to_sym ]
+    return if mail[ :'x-zammad-ticket-id' ]
 
     mail[:attachments].each do |attachment|
       next if !attachment[:preferences]
@@ -22,8 +22,8 @@ module Channel::Filter::BounceFollowUpCheck
       next if !article
 
       Rails.logger.debug { "Follow-up for '##{article.ticket.number}' in bounce email." }
-      mail[ 'x-zammad-ticket-id'.to_sym ] = article.ticket_id
-      mail[ 'x-zammad-is-auto-response'.to_sym ] = true
+      mail[ :'x-zammad-ticket-id' ] = article.ticket_id
+      mail[ :'x-zammad-is-auto-response' ] = true
 
       return true
     end

+ 11 - 11
app/models/channel/filter/follow_up_check.rb

@@ -4,13 +4,13 @@ module Channel::Filter::FollowUpCheck
 
   def self.run(_channel, mail)
 
-    return if mail['x-zammad-ticket-id'.to_sym]
+    return if mail[:'x-zammad-ticket-id']
 
     # get ticket# from subject
     ticket = Ticket::Number.check(mail[:subject])
     if ticket
       Rails.logger.debug { "Follow-up for '##{ticket.number}' in subject." }
-      mail['x-zammad-ticket-id'.to_sym] = ticket.id
+      mail[:'x-zammad-ticket-id'] = ticket.id
       return true
     end
 
@@ -21,7 +21,7 @@ module Channel::Filter::FollowUpCheck
       ticket = Ticket::Number.check(mail[:body].html2text)
       if ticket
         Rails.logger.debug { "Follow-up for '##{ticket.number}' in body." }
-        mail['x-zammad-ticket-id'.to_sym] = ticket.id
+        mail[:'x-zammad-ticket-id'] = ticket.id
         return true
       end
     end
@@ -49,24 +49,24 @@ module Channel::Filter::FollowUpCheck
         next if !ticket
 
         Rails.logger.debug { "Follow-up for '##{ticket.number}' in attachment." }
-        mail['x-zammad-ticket-id'.to_sym] = ticket.id
+        mail[:'x-zammad-ticket-id'] = ticket.id
         return true
       end
     end
 
     # get ticket# from references
-    if setting.include?('references') || (mail['x-zammad-is-auto-response'.to_sym] == true || Setting.get('ticket_hook_position') == 'none')
+    if setting.include?('references') || (mail[:'x-zammad-is-auto-response'] == true || Setting.get('ticket_hook_position') == 'none')
 
       # get all references 'References' + 'In-Reply-To'
       references = ''
       if mail[:references]
         references += mail[:references]
       end
-      if mail['in-reply-to'.to_sym]
+      if mail[:'in-reply-to']
         if references != ''
           references += ' '
         end
-        references += mail['in-reply-to'.to_sym]
+        references += mail[:'in-reply-to']
       end
       if references != ''
         message_ids = references.split(/\s+/)
@@ -76,7 +76,7 @@ module Channel::Filter::FollowUpCheck
           next if !article
 
           Rails.logger.debug { "Follow-up for '##{article.ticket.number}' in references." }
-          mail['x-zammad-ticket-id'.to_sym] = article.ticket_id
+          mail[:'x-zammad-ticket-id'] = article.ticket_id
           return true
         end
       end
@@ -90,11 +90,11 @@ module Channel::Filter::FollowUpCheck
       if mail[:references]
         references += mail[:references]
       end
-      if mail['in-reply-to'.to_sym]
+      if mail[:'in-reply-to']
         if references != ''
           references += ' '
         end
-        references += mail['in-reply-to'.to_sym]
+        references += mail[:'in-reply-to']
       end
       if references != ''
         message_ids = references.split(/\s+/)
@@ -117,7 +117,7 @@ module Channel::Filter::FollowUpCheck
           next if subject_to_check != article_first.subject
 
           Rails.logger.debug { "Follow-up for '##{article.ticket.number}' in references with same subject as inital article." }
-          mail['x-zammad-ticket-id'.to_sym] = article_first.ticket_id
+          mail[:'x-zammad-ticket-id'] = article_first.ticket_id
           return true
         end
       end

+ 4 - 4
app/models/channel/filter/follow_up_possible_check.rb

@@ -3,7 +3,7 @@
 module Channel::Filter::FollowUpPossibleCheck
 
   def self.run(_channel, mail)
-    ticket_id = mail['x-zammad-ticket-id'.to_sym]
+    ticket_id = mail[:'x-zammad-ticket-id']
     return true if !ticket_id
 
     ticket = Ticket.lookup(id: ticket_id)
@@ -13,9 +13,9 @@ module Channel::Filter::FollowUpPossibleCheck
     # in case of closed tickets, remove follow-up information
     case ticket.group.follow_up_possible
     when 'new_ticket'
-      mail[:subject]                        = ticket.subject_clean(mail[:subject])
-      mail['x-zammad-ticket-id'.to_sym]     = nil
-      mail['x-zammad-ticket-number'.to_sym] = nil
+      mail[:subject] = ticket.subject_clean(mail[:subject])
+      mail[:'x-zammad-ticket-id']     = nil
+      mail[:'x-zammad-ticket-number'] = nil
     end
 
     true

+ 14 - 14
app/models/channel/filter/identify_sender.rb

@@ -4,7 +4,7 @@ module Channel::Filter::IdentifySender
 
   def self.run(_channel, mail)
 
-    customer_user_id = mail[ 'x-zammad-ticket-customer_id'.to_sym ]
+    customer_user_id = mail[ :'x-zammad-ticket-customer_id' ]
     customer_user = nil
     if customer_user_id.present?
       customer_user = User.lookup(id: customer_user_id)
@@ -16,20 +16,20 @@ module Channel::Filter::IdentifySender
     end
 
     # check if sender exists in database
-    if !customer_user && mail[ 'x-zammad-customer-login'.to_sym ].present?
-      customer_user = User.find_by(login: mail[ 'x-zammad-customer-login'.to_sym ])
+    if !customer_user && mail[ :'x-zammad-customer-login' ].present?
+      customer_user = User.find_by(login: mail[ :'x-zammad-customer-login' ])
     end
-    if !customer_user && mail[ 'x-zammad-customer-email'.to_sym ].present?
-      customer_user = User.find_by(email: mail[ 'x-zammad-customer-email'.to_sym ])
+    if !customer_user && mail[ :'x-zammad-customer-email' ].present?
+      customer_user = User.find_by(email: mail[ :'x-zammad-customer-email' ])
     end
 
     # get correct customer
     if !customer_user && Setting.get('postmaster_sender_is_agent_search_for_customer') == true
-      if mail[ 'x-zammad-ticket-create-article-sender'.to_sym ] == 'Agent'
+      if mail[ :'x-zammad-ticket-create-article-sender' ] == 'Agent'
 
         # get first recipient and set customer
         begin
-          to = 'raw-to'.to_sym
+          to = :'raw-to'
           if mail[to]&.addrs
             items = mail[to].addrs
             items.each do |item|
@@ -54,18 +54,18 @@ module Channel::Filter::IdentifySender
     # take regular from as customer
     if !customer_user
       customer_user = user_create(
-        login:     mail[ 'x-zammad-customer-login'.to_sym ] || mail[ 'x-zammad-customer-email'.to_sym ] || mail[:from_email],
-        firstname: mail[ 'x-zammad-customer-firstname'.to_sym ] || mail[:from_display_name],
-        lastname:  mail[ 'x-zammad-customer-lastname'.to_sym ],
-        email:     mail[ 'x-zammad-customer-email'.to_sym ] || mail[:from_email],
+        login:     mail[ :'x-zammad-customer-login' ] || mail[ :'x-zammad-customer-email' ] || mail[:from_email],
+        firstname: mail[ :'x-zammad-customer-firstname' ] || mail[:from_display_name],
+        lastname:  mail[ :'x-zammad-customer-lastname' ],
+        email:     mail[ :'x-zammad-customer-email' ] || mail[:from_email],
       )
     end
 
     create_recipients(mail)
-    mail[ 'x-zammad-ticket-customer_id'.to_sym ] = customer_user.id
+    mail[ :'x-zammad-ticket-customer_id' ] = customer_user.id
 
     # find session user
-    session_user_id = mail[ 'x-zammad-session-user-id'.to_sym ]
+    session_user_id = mail[ :'x-zammad-session-user-id' ]
     session_user = nil
     if session_user_id.present?
       session_user = User.lookup(id: session_user_id)
@@ -84,7 +84,7 @@ module Channel::Filter::IdentifySender
       )
     end
     if session_user
-      mail[ 'x-zammad-session-user-id'.to_sym ] = session_user.id
+      mail[ :'x-zammad-session-user-id' ] = session_user.id
     end
 
     true

+ 9 - 9
app/models/channel/filter/monitoring_base.rb

@@ -24,7 +24,7 @@ class Channel::Filter::MonitoringBase
     return if mail[:from].blank?
     return if mail[:body].blank?
 
-    session_user_id = mail[ 'x-zammad-session-user-id'.to_sym ]
+    session_user_id = mail[ :'x-zammad-session-user-id' ]
     return if !session_user_id
 
     # check if sender is monitoring
@@ -94,40 +94,40 @@ class Channel::Filter::MonitoringBase
       next if ticket.preferences[integration]['service'] != result['service']
 
       # found open ticket for service+host
-      mail[ 'x-zammad-ticket-id'.to_sym ] = ticket.id
+      mail[ :'x-zammad-ticket-id' ] = ticket.id
 
       # check if service is recovered
       if auto_close && result['state'].present? && result['state'].match(/#{state_recovery_match}/i)
         Rails.logger.info "MonitoringBase.#{integration} set autoclose to state_id #{auto_close_state_id}"
         state = Ticket::State.lookup(id: auto_close_state_id)
         if state
-          mail[ 'x-zammad-ticket-followup-state'.to_sym ] = state.name
+          mail[ :'x-zammad-ticket-followup-state' ] = state.name
         end
       end
       return true
     end
 
     # new ticket, set meta data
-    if !mail[ 'x-zammad-ticket-id'.to_sym ]
-      if !mail[ 'x-zammad-ticket-preferences'.to_sym ]
-        mail[ 'x-zammad-ticket-preferences'.to_sym ] = {}
+    if !mail[ :'x-zammad-ticket-id' ]
+      if !mail[ :'x-zammad-ticket-preferences' ]
+        mail[ :'x-zammad-ticket-preferences' ] = {}
       end
       preferences = {}
       preferences[integration] = result
       preferences.each do |key, value|
-        mail[ 'x-zammad-ticket-preferences'.to_sym ][key] = value
+        mail[ :'x-zammad-ticket-preferences' ][key] = value
       end
     end
 
     # ignore states
     if state_ignore_match.present? && result['state'].present? && result['state'].match(/#{state_ignore_match}/i)
-      mail[ 'x-zammad-ignore'.to_sym ] = true
+      mail[ :'x-zammad-ignore' ] = true
       return true
     end
 
     # if now problem exists, just ignore the email
     if result['state'].present? && result['state'].match(/#{state_recovery_match}/i)
-      mail[ 'x-zammad-ignore'.to_sym ] = true
+      mail[ :'x-zammad-ignore' ] = true
       return true
     end
 

Some files were not shown because too many files changed in this diff