Module: Keepassx::Field

Included in:
EntryField, GroupField
Defined in:
lib/keepassx/field.rb

Constant Summary collapse

TYPE_CODE_FIELD_SIZE =

FIELD_TERMINATOR = 0xFFFF # FIXME: Use it or remove it

2
DATA_LENGTH_FIELD_SIZE =

unsigned short integer

4

Instance Method Summary collapse

Instance Method Details

#dataObject



80
81
82
# File 'lib/keepassx/field.rb', line 80

def data
    self.send @export_method
end

#data=(value) ⇒ Object



85
86
87
# File 'lib/keepassx/field.rb', line 85

def data= value
    self.send @import_method, value
end

#encodeObject



43
44
45
46
47
48
# File 'lib/keepassx/field.rb', line 43

def encode
  buffer = [@type_code, size].pack 'SI'
  buffer << @data unless @data.nil? # Writing raw data
  # [buffer].pack "a#{size}"
  buffer
end

#initialize(payload) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/keepassx/field.rb', line 10

def initialize(payload)

  if payload.is_a? StringIO

    @type_code, data_length = payload.read(
        TYPE_CODE_FIELD_SIZE + DATA_LENGTH_FIELD_SIZE).unpack('SI')
    @name, @data_type = parse_type_code
    fail "Failed to determine field name from '#{payload.inspect}'" if
        @name.nil?
    fail "Failed to determine field typefrom '#{payload.inspect}'" if
        @data_type.nil?
    # Not using setter because it should be raw data here
    @data = payload.read(data_length) unless terminator?
    set_export_import_methods

  elsif payload.is_a? Hash
    @name = payload[:name].to_s
    type_set = self.class::FIELD_TYPES.detect do |_, name, _|
      name.eql? @name.to_s
    end
    @type_code, _, @data_type = type_set

    set_export_import_methods
    self.data = payload[:data]
  end

rescue NoMethodError => e
  raise Keepassx::MalformedDataError.
      new "Read error at #{payload.lineno}" if e.name.eql? :unpack
  # fail
end

#lengthInteger

Get raw data length

Returns:

  • (Integer)


59
60
61
# File 'lib/keepassx/field.rb', line 59

def length
  TYPE_CODE_FIELD_SIZE + DATA_LENGTH_FIELD_SIZE + size
end

#rawObject



90
91
92
# File 'lib/keepassx/field.rb', line 90

def raw
  @data
end

#sizeObject



64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/keepassx/field.rb', line 64

def size
  case @data_type
    when :null
      0
    when :int
      4
    when :date
      5
    when :uuid
      16
    else
      (@data.nil?) && 0 || @data.length
  end
end

#terminator?Boolean

Returns:

  • (Boolean)


51
52
53
# File 'lib/keepassx/field.rb', line 51

def terminator?
  @name.eql? 'terminator'
end