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

Reply via email to