class ConfConf::Project::Environment::Storage

Public Class Methods

load_project_environment(project, environment_name) click to toggle source
# File lib/conf_conf/project/environment/storage.rb, line 7
def self.load_project_environment(project, environment_name)
  current_developer = ConfConf::Project::Developer.current
  environment_config_file_path = File.join('config', 'conf_conf', 'environments', "#{environment_name}.json")

  if File.exists?(environment_config_file_path)
    environment_config       = MultiJson.load(File.read(environment_config_file_path))
    environment_schema       = environment_config['schema']
    author_public_key        = [environment_config['author_public_key']].unpack('H*')
    encrypted_environment_secret_key   = environment_config['encrypted_environment_secret_key'][current_developer.pretty_public_key]

    raise NotAuthorizedError if encrypted_environment_secret_key.nil?

    box = RbNaCl::SimpleBox.from_keypair(author_public_key, current_developer.private_key)
    environment_secret_key = box.decrypt(encrypted_environment_secret_key)

    box = RbNaCl::SimpleBox.from_secret_key(environment_secret_key)
    decrypted_environment_variables_json = box.decrypt(Base64.strict_decode64(environment_config["encrypted_environment"]))

    environment_variables = MultiJson.load(decrypted_environment_variables_json)
  else
    environment_variables = {}
    environment_schema = {}
  end

  Environment.new(project, environment_name, environment_variables, environment_schema)
end
save_project_environment(project, environment) click to toggle source
# File lib/conf_conf/project/environment/storage.rb, line 34
def self.save_project_environment(project, environment)
  author = ConfConf::Project::Developer.current

  environment_config = {}
  environment_config[:author_public_key] = author.pretty_public_key
  environment_config[:schema] = environment.schema

  environment_secret_key = RbNaCl::Random.random_bytes(RbNaCl::SecretBox.key_bytes)
  project.developers.add(author)

  environment_config[:encrypted_environment_secret_key] = project.developers.to_a.inject({}) do |keys,developer|
    box = RbNaCl::SimpleBox.from_keypair(developer.public_key, author.private_key)
    keys[developer.pretty_public_key] = box.encrypt(environment_secret_key); keys
  end

  box = RbNaCl::SimpleBox.from_secret_key(environment_secret_key)
  environment_config[:encrypted_environment] = Base64.strict_encode64(box.encrypt(MultiJson.dump(environment.variables)))

  environment_config_file_path = File.join('config', 'conf_conf', 'environments', "#{environment.name}.json")
  File.write(environment_config_file_path, MultiJson.dump(environment_config))
end