class CocoaPodsKeys::KeyMaster

Attributes

implementation[RW]
interface[RW]
name[RW]

Public Class Methods

new(keyring, time = Time.now) click to toggle source
# File lib/key_master.rb, line 10
def initialize(keyring, time = Time.now)
  @time = time
  @keys = keyring.camel_cased_keys
  @name = keyring.code_name + 'Keys'
  if /^\d/ =~ @name
    @name = '_' + @name
  end

  @used_indexes = Set.new
  @indexed_keys = {}
  @data = generate_data
  @interface = generate_interface
  @implementation = generate_implementation
end

Public Instance Methods

generate_data() click to toggle source
# File lib/key_master.rb, line 25
def generate_data
  # guard method; raises error if something in application keychain
  # is nil. provides for better error message.
  verify_keychain_integrity

  # Generate a base64 hash string that is ~25 times the length of all keys
  @data_length = @keys.values.map(&:length).reduce(0, :+) * (20 + rand(10))
  data = SecureRandom.base64(@data_length)
  data += '\\"'
  @data_length = data.length

  # Swap the characters within the hashed string with the characters from
  # the keyring values. Then store that index in a index-ed copy of the values.

  @keys.each do |key, value|
    @indexed_keys[key] = []

    value.chars.each_with_index do |char, char_index|
      loop do
        if char == '"'
          index = data.delete('\\').length - 1
          @indexed_keys[key][char_index] = index
          break
        else
          index = SecureRandom.random_number data.length
          unless @used_indexes.include?(index)
            data[index] = char

            @used_indexes << index
            @indexed_keys[key][char_index] = index
            break
          end
        end
      end
    end
  end

  data
end
generate_implementation() click to toggle source
# File lib/key_master.rb, line 69
def generate_implementation
  render_erb('Keys.m.erb')
end
generate_interface() click to toggle source
# File lib/key_master.rb, line 65
def generate_interface
  render_erb('Keys.h.erb')
end
verify_keychain_integrity() click to toggle source
# File lib/key_master.rb, line 73
def verify_keychain_integrity
  if @keys.any? { |k, v| k.nil? || v.nil? }
    raise 'A key/value pair in the application keychain is nil.'
  end
end

Private Instance Methods

key_data_arrays() click to toggle source
# File lib/key_master.rb, line 86
def key_data_arrays
  Hash[@indexed_keys.map { |key, value| [key, value.map { |i| '[' + name + "Data characterAtIndex:#{i}]" }.join(', ')] }]
end
render_erb(erb_template) click to toggle source
# File lib/key_master.rb, line 81
def render_erb(erb_template)
  erb = (Pathname(__dir__).parent + 'templates' + erb_template).read
  ERB.new(erb, trim_mode: '-').result(binding)
end