class Kiji::Zipper

Attributes

cert[RW]
private_key[RW]

Public Class Methods

new() { |self| ... } click to toggle source
# File lib/kiji/zipper.rb, line 5
def initialize
  yield(self) if block_given?
end

Public Instance Methods

sign(kousei_base_file_path_or_content, app_file_paths) click to toggle source

構成管理ファイル(kouse.xml)に署名を施す

# File lib/kiji/zipper.rb, line 10
def sign(kousei_base_file_path_or_content, app_file_paths)
  fail 'Please specify cert & private_key' if @cert.nil? || @private_key.nil?

  content = begin
              File.read(kousei_base_file_path_or_content)
            rescue Errno::ENOENT, Errno::ENAMETOOLONG
              kousei_base_file_path_or_content
            end

  kousei_data = Nokogiri::XML(content)
  kousei_doc = kousei_data.to_xml(save_with:  0)

  signer = Signer.new(kousei_doc) do |s|
    s.cert                       = @cert
    s.private_key                = @private_key
    s.digest_algorithm           = :sha256
    s.signature_digest_algorithm = :sha256
  end

  # 構成情報のハッシュ値を求める
  signer.security_node = signer.document.root
  node = signer.document.at_xpath('//構成情報')
  signer.digest!(node, id: '#構成情報')

  # 申請書のハッシュ値を求める
  app_file_paths.each do |app_file_path|
    app_doc = File.read(app_file_path)
    app_file_name = File.basename(app_file_path)
    signer.digest_file!(app_doc, id: app_file_name)
  end

  # 署名の付与
  signer.sign!(issuer_serial: true)
  signer.document.xpath('//ns:Signature', ns: 'http://www.w3.org/2000/09/xmldsig#').wrap('<署名情報></署名情報>')

  # 構成情報 - 署名情報 - その他という順序
  kousei_node = signer.document.at_xpath('//構成情報')
  signature_node = signer.document.at_xpath('//署名情報')
  kousei_node.add_next_sibling(signature_node)

  signer
end
write_zip(input_dir, output_file) click to toggle source
# File lib/kiji/zipper.rb, line 53
def write_zip(input_dir, output_file)
  @input_dir = input_dir
  @output_file = output_file

  entries = Dir.entries(@input_dir) - %w(. .. .DS_Store)
  Zip.sort_entries = true
  Zip::File.open(output_file, Zip::File::CREATE) do |io|
    write_entries(entries, '', io)
  end
end

Private Instance Methods

put_into_archive(disk_file_path, io, zip_file_path) click to toggle source
# File lib/kiji/zipper.rb, line 85
def put_into_archive(disk_file_path, io, zip_file_path)
  io.get_output_stream(zip_file_path) do |f|
    f.write(File.open(disk_file_path, 'rb').read)
  end
end
recursively_deflate_directory(disk_file_path, io, zip_file_path) click to toggle source
# File lib/kiji/zipper.rb, line 79
def recursively_deflate_directory(disk_file_path, io, zip_file_path)
  # io.mkdir(zip_file_path)
  subdir = Dir.entries(disk_file_path) - %w(. .. .DS_Store)
  write_entries(subdir, zip_file_path, io)
end
write_entries(entries, path, io) click to toggle source
# File lib/kiji/zipper.rb, line 66
def write_entries(entries, path, io)
  entries.each do |e|
    zip_file_path = path == '' ? e : File.join(path, e)
    disk_file_path = File.join(@input_dir, zip_file_path)
    # puts 'Deflating ' + disk_file_path
    if File.directory? disk_file_path
      recursively_deflate_directory(disk_file_path, io, zip_file_path)
    else
      put_into_archive(disk_file_path, io, zip_file_path)
    end
  end
end