-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy path1pass2keepass.rb
executable file
·90 lines (75 loc) · 2.32 KB
/
1pass2keepass.rb
1
2
3
4
5
6
7
8
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/ruby
=begin
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
=end
require "rexml/document"
include REXML
require 'csv'
def usage (message = nil)
if message
puts "ERROR: #{message}"
end
puts """Usage: 1pass2keepass.rb 1pass.csv
Takes a _TAB_ delimeted csv file from 1password and prints XML suitable for import into keepassX
"""
exit
end
input_file = ARGV[0]
unless ARGV[0]
usage
end
unless File.exists?(input_file)
usage "File '#{input_file}' does not exist"
end
begin
csv_data = CSV.open(input_file, 'rb', "\t")
headers = csv_data.shift.map {|i| i.to_s }
string_data = csv_data.map {|row| row.map {|cell| cell.to_s } }
array_of_hashes = string_data.map {|row| Hash[*headers.zip(row).flatten] }
rescue
usage $!
end
def usage (message = '')
if message
puts "ERROR: #{message}"
end
puts """
Usage: 1pass2keepass.rb 1pass.csv
Takes a _TAB_ delimeted csv file from 1password and prints XML suitable for import into keepassX
"""
exit
end
doc = Document.new
database = doc.add_element 'database'
group = database.add_element 'group'
group.add_element('title').text = 'Internet'
group.add_element('icon').text = '1'
def usage (message = '')
if message
puts "ERROR: #{message}"
end
puts """
Usage: 1pass2keepass.rb 1pass.csv
Takes a _TAB_ delimeted csv file from 1password and prints XML suitable for import into keepassX
"""
exit
end
array_of_hashes.each do |row|
entryNode = group.add_element 'entry'
entryNode.add_element('username').text = row['username']
entryNode.add_element('password').text = row['password']
entryNode.add_element('title').text = row['title']
entryNode.add_element('url').text = row['URL/Location']
entryNode.add_element('comment').text = row['notes']
end
doc << XMLDecl.new
doc.write($stdout,2)