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
- .add_if_not_duplicated(entries, entry) ⇒ Object
- .diff(csv_file, xml_file) ⇒ Object
-
.read_csv(file_name) ⇒ Object
CSV format: 0: url 1: username 2: password 3: extra 4: name 5: grouping 6: fav.
-
.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>.
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 |