Module: LastKeeDiff

Defined in:
lib/last_kee_diff.rb,
lib/last_kee_diff/entry.rb,
lib/last_kee_diff/version.rb

Defined Under Namespace

Classes: Entry

Constant Summary collapse

VERSION =
"0.1.1"

Class Method Summary collapse

Class Method Details

.add_if_not_duplicated(entries, entry) ⇒ Object



118
119
120
121
122
123
124
# File 'lib/last_kee_diff.rb', line 118

def self.add_if_not_duplicated(entries, entry)
  if entries[entry.key]
    puts "Duplicated key: #{entry.key}"
  else
    entries[entry.key] = entry
  end
end

.diff(csv_file, xml_file) ⇒ Object



9
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
41
42
# File 'lib/last_kee_diff.rb', line 9

def self.diff(csv_file, xml_file)
  csv_entries = self.read_csv csv_file
  xml_entries = self.read_xml xml_file

  #... extra csv entries
  puts '>> Entries only present in LastPass:'
  (csv_entries.keys - xml_entries.keys).each do |key|
    puts csv_entries[key]
  end

  #... common entries
  puts '>> Common entries (LastPass <-> KeePass):'
  (csv_entries.keys & xml_entries.keys).each do |key|
    io = StringIO.new

    csv_entries[key].instance_variables.each do |att|
      att = att.to_s[1..-1]
      if csv_entries[key].send(att).to_s.sub(/^http:\/\//, '') != xml_entries[key].send(att).to_s.sub(/^http:\/\//, '')
        io.puts "\t#{att.capitalize} changed: ''#{csv_entries[key].send(att)}'' <-> ''#{xml_entries[key].send(att)}''"
      end
    end

    if io.size > 0
      puts key
      puts io.string
    end
  end

  #... extra xml entries
  puts '>> Entries only present in KeePass:'
  (xml_entries.keys - csv_entries.keys).each do |key|
    puts xml_entries[key]
  end
end

.read_csv(file_name) ⇒ Object

CSV format: 0: url 1: username 2: password 3: extra 4: name 5: grouping 6: fav



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/last_kee_diff.rb', line 52

def self.read_csv(file_name)
  puts "Reading CSV..."

  entries = {}

  CSV.foreach file_name, headers: true do |row|
    entry = Entry.new ::CGI.unescape_html(row[5].to_s.gsub(/\\/, '/')),
                      ::CGI.unescape_html(row[4].to_s),
                      ::CGI.unescape_html(row[1].to_s),
                      ::CGI.unescape_html(row[2].to_s),
                      ::CGI.unescape_html(row[0].to_s)
    self.add_if_not_duplicated entries, entry
  end

  entries
end

.read_xml(file_name) ⇒ Object

XML format: <database>

<group>
  <title></title>
  <entry>
    <title></title>
    <username></username>
    <password></password>
    <url></url>
  </entry>
  <!-- multiples entries or groups -->
</group>
<!-- multiples groups -->

</database>



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/last_kee_diff.rb', line 83

def self.read_xml(file_name)
  puts "Reading XML..."

  entries = {}

  File.open file_name do |f|
    doc = Nokogiri::XML f

    doc.xpath('//group').each do |group|
      # skip backups
      next if group.at_css('title').text == 'Backup' && group.parent && group.parent.name != 'group'

      group_name = group.at_css('title').text.tap do |text|
        parent = group.parent
        while parent && parent.name == 'group'
          text.prepend "#{parent.at_css('title').text}/"
          parent = parent.parent
        end
      end

      group.xpath('./entry').each do |entry|
        entry = Entry.new group_name,
                          entry.at_css('title').text,
                          entry.at_css('username').text,
                          entry.at_css('password').text,
                          entry.at_css('url').text

        self.add_if_not_duplicated entries, entry
      end
    end
  end

  entries
end