12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
- module ApplicationModel::ChecksAttributeValuesAndLength
- extend ActiveSupport::Concern
- included do
- before_create :check_attribute_values_and_length
- before_update :check_attribute_values_and_length
- end
- =begin
- 1) check string/varchar size and cut them if needed
- 2) check string for null byte \u0000 and remove it
- =end
- def check_attribute_values_and_length
- columns = self.class.columns_hash
- attributes.each do |name, value|
- next if !value.instance_of?(String)
- column = columns[name]
- next if !column
- if column.type == :binary
- self[name].force_encoding('BINARY')
- end
- next if value.blank?
- # strip null byte chars (postgresql will complain about it)
- if column.type == :text && Rails.application.config.db_null_byte == false
- self[name].delete!("\u0000")
- end
- # for varchar check length and replace null bytes
- limit = column.limit
- if limit
- current_length = value.length
- if limit < current_length
- logger.warn "WARNING: cut string because of database length #{self.class}.#{name}(#{limit} but is #{current_length}:#{value})"
- self[name] = value[0, limit]
- end
- # strip null byte chars (postgresql will complain about it)
- if Rails.application.config.db_null_byte == false
- self[name].delete!("\u0000")
- end
- end
- # strip 4 bytes utf8 chars if needed (mysql/mariadb will complain it)
- next if self[name].blank?
- next if column.type == :binary
- self[name] = self[name].utf8_to_3bytesutf8
- end
- true
- end
- end
|