Class: Omnizip::Metadata::MetadataValidator

Inherits:
Object
  • Object
show all
Defined in:
lib/omnizip/metadata/metadata_validator.rb

Overview

Validates metadata changes before applying

Instance Method Summary collapse

Instance Method Details

#validate_archive(metadata) ⇒ Object

Validate archive metadata

Parameters:

Raises:

  • (ArgumentError)

    If metadata is invalid



21
22
23
24
25
# File 'lib/omnizip/metadata/metadata_validator.rb', line 21

def validate_archive()
  validate_comment(.comment) if .comment

  true
end

#validate_comment(comment) ⇒ Object

Validate comment length

Parameters:

  • comment (String)

    Comment to validate

Raises:

  • (ArgumentError)

    If comment is too long



30
31
32
33
34
35
36
# File 'lib/omnizip/metadata/metadata_validator.rb', line 30

def validate_comment(comment)
  max_length = 65_535 # ZIP format limit
  return true if comment.bytesize <= max_length

  raise ArgumentError,
        "Comment too long: #{comment.bytesize} bytes (max: #{max_length})"
end

#validate_entry(metadata) ⇒ Object

Validate entry metadata

Parameters:

Raises:

  • (ArgumentError)

    If metadata is invalid



10
11
12
13
14
15
16
# File 'lib/omnizip/metadata/metadata_validator.rb', line 10

def validate_entry()
  validate_comment(.comment) if .comment
  validate_time(.mtime) if .respond_to?(:mtime)
  validate_permissions(.unix_permissions) if .unix_permissions

  true
end

#validate_filename(filename) ⇒ Object

Validate filename

Parameters:

  • filename (String)

    Filename to validate

Raises:

  • (ArgumentError)

    If filename is invalid



81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/omnizip/metadata/metadata_validator.rb', line 81

def validate_filename(filename)
  return true unless filename

  max_length = 65_535 # ZIP format limit
  if filename.bytesize > max_length
    raise ArgumentError,
          "Filename too long: #{filename.bytesize} bytes (max: #{max_length})"
  end

  # Check for invalid characters
  if filename.include?("\x00")
    raise ArgumentError, "Filename contains null character"
  end

  true
end

#validate_permissions(perms) ⇒ Object

Validate Unix permissions

Parameters:

  • perms (Integer)

    Permissions to validate

Raises:

  • (ArgumentError)

    If permissions are invalid



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/omnizip/metadata/metadata_validator.rb', line 62

def validate_permissions(perms)
  return true unless perms

  unless perms.is_a?(Integer)
    raise ArgumentError,
          "Permissions must be an integer, got #{perms.class}"
  end

  unless (0..0o777).cover?(perms)
    raise ArgumentError,
          "Permissions out of range: 0#{perms.to_s(8)} (max: 0777)"
  end

  true
end

#validate_time(time) ⇒ Object

Validate time value

Parameters:

  • time (Time)

    Time to validate

Raises:

  • (ArgumentError)

    If time is invalid



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/omnizip/metadata/metadata_validator.rb', line 41

def validate_time(time)
  return true unless time

  unless time.is_a?(Time)
    raise ArgumentError, "Time must be a Time object, got #{time.class}"
  end

  # DOS time range: 1980-01-01 to 2107-12-31
  min_time = Time.new(1980, 1, 1)
  max_time = Time.new(2107, 12, 31, 23, 59, 59)

  if time < min_time || time > max_time
    raise ArgumentError, "Time out of DOS range (1980-2107): #{time}"
  end

  true
end