This patch optionally includes all secureContents fields in the
1Password entry.
--
John Franklin
[email protected]
diff --git a/contrib/importers/1password2pass.rb b/contrib/importers/1password2pass.rb
index e0ca39b..562c59c 100755
--- a/contrib/importers/1password2pass.rb
+++ b/contrib/importers/1password2pass.rb
@@ -25,6 +25,7 @@ options.force = false
options.name = :title
options.notes = true
options.meta = true
+options.fields = true
optparse = OptionParser.new do |opts|
opts.banner = "Usage: #{opts.program_name}.rb [options] filename"
@@ -35,6 +36,9 @@ optparse = OptionParser.new do |opts|
opts.on("-d", "--default [FOLDER]", "Place passwords into FOLDER") do |group|
options.group = group
end
+ opts.on("-F", "--[no-]fields" "Import all fields") do |fields|
+ options.fields = fields
+ end
opts.on("-n", "--name [PASS-NAME]", [:title, :url],
"Select field to use as pass-name: title (default) or URL") do |name|
options.name = name
@@ -111,19 +115,41 @@ elsif File.extname(filename) =~ /.1pif/i
pass[:name] = "#{(options.group + "/") if options.group}#{entry[options.name]}"
pass[:title] = entry[:title]
-
- pass[:password] = entry[:secureContents][:fields].detect do |field|
- field[:designation] == "password"
- end[:value]
-
- username = entry[:secureContents][:fields].detect do |field|
- field[:designation] == "username"
+ pass[:password] = entry[:secureContents][:password]
+
+ if entry[:secureContents][:fields]
+ pass[:password] = entry[:secureContents][:fields].detect do |field|
+ field[:designation] == "password"
+ end[:value]
+
+ username = entry[:secureContents][:fields].detect do |field|
+ field[:designation] == "username"
+ end
+ # might be nil
+ pass[:login] = username[:value] if username
+
+ if options.fields
+ print " with #{entry[:secureContents][:fields].length} fields"
+ entry[:secureContents][:fields].each do |field|
+ next if ["username", "password"].include? field[:designation]
+ next if ["I", "B", "P"].include? field[:type]
+ next if ["username", "password"].include? field[:name].downcase
+ if field[:name].to_s.empty?
+ puts " no name for #{field[:value]}" if options.debug
+ next
+ end
+ pass[field[:name].to_sym] = field[:value]
+ end
+ end
end
# might be nil
- pass[:login] = username[:value] if username
pass[:url] = entry[:location]
pass[:notes] = entry[:secureContents][:notesPlain]
+ pass[:created] = entry[:createdAt]
+ pass[:updated] = entry[:updatedAt]
+ pass[:uuid] = entry[:uuid]
+
passwords << pass
end
end
@@ -135,11 +161,17 @@ errors = []
passwords.each do |pass|
IO.popen("pass insert #{"-f " if options.force}-m \"#{pass[:name]}\" > /dev/null", "w") do |io|
io.puts pass[:password]
- if options.meta
+ if options.meta || options.fields
io.puts "login: #{pass[:login]}" unless pass[:login].to_s.empty?
io.puts "url: #{pass[:url]}" unless pass[:url].to_s.empty?
io.puts pass[:notes] unless pass[:notes].to_s.empty?
end
+ if options.fields
+ pass.each do |key, value|
+ next if [:password, :login, :url, :notes].include? key
+ io.puts "#{key.to_s}: #{value.to_s}"
+ end
+ end
end
if $? == 0
puts "Imported #{pass[:name]}"
_______________________________________________
Password-Store mailing list
[email protected]
https://lists.zx2c4.com/mailman/listinfo/password-store