module MournfulSettings::SettingMethods

Constants

VALUE_TYPES

Public Class Methods

included(base) click to toggle source
# File lib/mournful_settings/setting_methods.rb, line 8
def self.included(base)
  base.before_save :set_encrypted_true_unless_false
  base.before_save :encrypt_value

  base.validates :value_type, :presence => true, :inclusion => {:in => VALUE_TYPES}
  base.validates :value, :presence => true
  base.validates :name, :uniqueness => true, :presence => true
end

Public Instance Methods

value() click to toggle source
Calls superclass method
# File lib/mournful_settings/setting_methods.rb, line 39
def value
  if value_type.present? 
    parent_value = encrypted? ? decrypt(super) : super
    
    case value_type.to_s
      when 'number'
        parent_value.to_f
      when 'decimal'
        BigDecimal.new(parent_value.to_s)
      else
        parent_value
    end
  end
end

Private Instance Methods

add_separators(text) click to toggle source
# File lib/mournful_settings/setting_methods.rb, line 97
def add_separators(text)
  [separator, text, separator].join
end
decrypt(text) click to toggle source
# File lib/mournful_settings/setting_methods.rb, line 59
def decrypt(text)
  if is_encrypted?(text)
    Cipher.decrypt Base64.decode64 remove_separators text
  else
    text
  end
end
encrypt(text) click to toggle source
# File lib/mournful_settings/setting_methods.rb, line 55
def encrypt(text)
  add_separators Base64.encode64 Cipher.encrypt text.to_s
end
encrypt_value() click to toggle source
# File lib/mournful_settings/setting_methods.rb, line 89
def encrypt_value  
  if encrypted?
    self.value = encrypt(self.value)
  else
    self.value = decrypt(self.value)
  end
end
inside_separators_and_is_base64_encoded?(text) click to toggle source
# File lib/mournful_settings/setting_methods.rb, line 71
def inside_separators_and_is_base64_encoded?(text)
  return unless text.kind_of? String
  bytes = text.bytes.to_a
  return unless bytes[0] == separator_byte
  return unless bytes[-1] == separator_byte
  return unless bytes[-2] == last_byte_of_base_64_encoded_text
  non_white_space_with_equal_sign_packing =~ text[1..-3]
end
is_encrypted?(text) click to toggle source
# File lib/mournful_settings/setting_methods.rb, line 67
def is_encrypted?(text)
  inside_separators_and_is_base64_encoded?(text)
end
last_byte_of_base_64_encoded_text() click to toggle source
# File lib/mournful_settings/setting_methods.rb, line 115
def last_byte_of_base_64_encoded_text
  line_feed_byte
end
line_feed_byte() click to toggle source
# File lib/mournful_settings/setting_methods.rb, line 119
def line_feed_byte
  10
end
non_white_space_with_equal_sign_packing() click to toggle source
# File lib/mournful_settings/setting_methods.rb, line 80
def non_white_space_with_equal_sign_packing 
  /\S+=*/
end
remove_separators(text) click to toggle source
# File lib/mournful_settings/setting_methods.rb, line 101
def remove_separators(text)
  text.gsub(separator, "")
end
separator() click to toggle source

Used to delimit encrypted values to make identification more reliable

# File lib/mournful_settings/setting_methods.rb, line 106
def separator
  separator_byte.chr 
end
separator_byte() click to toggle source
# File lib/mournful_settings/setting_methods.rb, line 111
def separator_byte
  31 # ASCII unit separator
end
set_encrypted_true_unless_false() click to toggle source
# File lib/mournful_settings/setting_methods.rb, line 84
def set_encrypted_true_unless_false
  self.encrypted = true unless self.encrypted == false
end