Sha256: beb91366c215c3dd7d331db0ee68e1f025da403d03c913056b78d220c1a1eeb2

Contents?: true

Size: 1.79 KB

Versions: 47

Compression:

Stored size: 1.79 KB

Contents

class Puppet::ModuleTool::Tar::Mini
  def unpack(sourcefile, destdir, _)
    Zlib::GzipReader.open(sourcefile) do |reader|
      Archive::Tar::Minitar.unpack(reader, destdir, find_valid_files(reader)) do |action, name, stats|
        case action
        when :file_done
          File.chmod(0444, "#{destdir}/#{name}")
        when :dir, :file_start
          validate_entry(destdir, name)
          Puppet.debug("Extracting: #{destdir}/#{name}")
        end
      end
    end
  end

  def pack(sourcedir, destfile)
    Zlib::GzipWriter.open(destfile) do |writer|
      Archive::Tar::Minitar.pack(sourcedir, writer)
    end
  end

  private

  # Find all the valid files in tarfile.
  #
  # This check was mainly added to ignore 'x' and 'g' flags from the PAX
  # standard but will also ignore any other non-standard tar flags.
  # tar format info: http://pic.dhe.ibm.com/infocenter/zos/v1r13/index.jsp?topic=%2Fcom.ibm.zos.r13.bpxa500%2Ftaf.htm
  # pax format info: http://pic.dhe.ibm.com/infocenter/zos/v1r13/index.jsp?topic=%2Fcom.ibm.zos.r13.bpxa500%2Fpxarchfm.htm
  def find_valid_files(tarfile)
    Archive::Tar::Minitar.open(tarfile).collect do |entry|
      flag = entry.typeflag
      if flag.nil? || flag =~ /[[:digit:]]/ && (0..7).include?(flag.to_i)
        entry.name
      else
        Puppet.debug "Invalid tar flag '#{flag}' will not be extracted: #{entry.name}"
        next
      end
    end
  end

  def validate_entry(destdir, path)
    if Pathname.new(path).absolute?
      raise Puppet::ModuleTool::Errors::InvalidPathInPackageError, :entry_path => path, :directory => destdir
    end

    path = File.expand_path File.join(destdir, path)

    if path !~ /\A#{Regexp.escape destdir}/
      raise Puppet::ModuleTool::Errors::InvalidPathInPackageError, :entry_path => path, :directory => destdir
    end
  end
end

Version data entries

47 entries across 47 versions & 2 rubygems

Version Path
puppet-retrospec-0.12.2 vendor/gems/puppet-3.7.3/lib/puppet/module_tool/tar/mini.rb
puppet-3.8.6 lib/puppet/module_tool/tar/mini.rb
puppet-3.8.6-x86-mingw32 lib/puppet/module_tool/tar/mini.rb
puppet-retrospec-0.12.1 vendor/gems/puppet-3.7.3/lib/puppet/module_tool/tar/mini.rb
puppet-3.8.6-x64-mingw32 lib/puppet/module_tool/tar/mini.rb
puppet-retrospec-0.12.0 vendor/gems/puppet-3.7.3/lib/puppet/module_tool/tar/mini.rb
puppet-3.8.5 lib/puppet/module_tool/tar/mini.rb
puppet-3.8.5-x86-mingw32 lib/puppet/module_tool/tar/mini.rb
puppet-3.8.5-x64-mingw32 lib/puppet/module_tool/tar/mini.rb
puppet-3.8.4 lib/puppet/module_tool/tar/mini.rb
puppet-3.8.4-x86-mingw32 lib/puppet/module_tool/tar/mini.rb
puppet-3.8.4-x64-mingw32 lib/puppet/module_tool/tar/mini.rb
puppet-retrospec-0.11.0 vendor/gems/puppet-3.7.3/lib/puppet/module_tool/tar/mini.rb
puppet-retrospec-0.10.0 vendor/gems/puppet-3.7.3/lib/puppet/module_tool/tar/mini.rb
puppet-retrospec-0.9.1 vendor/gems/puppet-3.7.3/lib/puppet/module_tool/tar/mini.rb
puppet-retrospec-0.9.0 vendor/gems/puppet-3.7.3/lib/puppet/module_tool/tar/mini.rb
puppet-retrospec-0.8.1 vendor/gems/puppet-3.7.3/lib/puppet/module_tool/tar/mini.rb
puppet-3.8.3 lib/puppet/module_tool/tar/mini.rb
puppet-3.8.3-x86-mingw32 lib/puppet/module_tool/tar/mini.rb
puppet-3.8.3-x64-mingw32 lib/puppet/module_tool/tar/mini.rb