summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcontrib/importers/roboform2pass.rb162
1 files changed, 162 insertions, 0 deletions
diff --git a/contrib/importers/roboform2pass.rb b/contrib/importers/roboform2pass.rb
new file mode 100755
index 0000000..df0f266
--- /dev/null
+++ b/contrib/importers/roboform2pass.rb
@@ -0,0 +1,162 @@
+#!/usr/bin/env ruby
+
+# Copyright 2015 Sergey Makridenkov <sergey@makridenkov.com>.
+# Released under MIT License.
+#
+# Usage:
+# 1. Save roboform print lists (like File > Print lists > Logins) to ~/roboform_print_lists.
+# 2. Run import: ./roboform2pass.rb ~/roboform_print_lists
+
+
+require 'nokogiri'
+
+class Login
+ def initialize
+ self.fields = {}
+ self.raw = []
+ end
+
+ attr_accessor :key
+ attr_accessor :password
+ attr_accessor :url
+ attr_accessor :fields
+ attr_accessor :raw
+
+ def ask_required_info
+ ask!(:key) if blank?(key)
+ find_password!
+ if blank?(password)
+ ask!(:password)
+ puts ''
+ end
+ end
+
+ def save
+ if valid?
+ IO.popen("pass insert -m -f '#{path}' > /dev/null", "w") do |pass_io|
+ pass_io.puts password
+ pass_io.puts "Url: #{url}" if present?(url)
+ pass_io.puts "Fields: #{fields}" if fields.any?
+ pass_io.puts "Notes: #{raw}" if raw.any?
+ end
+
+ $? == 0
+ end
+ end
+
+ private
+
+ def path
+ key = self.key.downcase.gsub(/[^\w\.\/]/, '_').gsub(/_{2,}/, '_')
+ "roboform/#{key}"
+ end
+
+ def valid?
+ present?(key) && present?(password)
+ end
+
+ def find_password!
+ fields.each do |key, val|
+ key = key.downcase
+ if key.include?('password') || key.include?('pwd') || key.include?('pass')
+ self.password = val
+ end
+ end
+ end
+
+ def ask!(field)
+ puts Colorize.red("#{field.capitalize} is empty for login:")
+ print_self
+ print Colorize.green "Please type #{field}: "
+ self.send("#{field}=", gets.chomp)
+ end
+
+ def print_self
+ puts Colorize.yellow "\tKey:\t#{key}" if present?(key)
+ puts Colorize.yellow "\tPassword:\t#{password}" if present?(password)
+ puts Colorize.yellow "\tUrl:\t#{url}" if present?(url)
+ puts Colorize.yellow "\tFields:\t#{fields}" if fields.any?
+ puts Colorize.yellow "\tRaw:\t#{raw}" if raw.any?
+ end
+
+ def blank?(str)
+ !str || str.strip.empty?
+ end
+
+ def present?(str)
+ !blank?(str)
+ end
+end
+
+class Colorize
+ class << self
+ def red(mes)
+ colorize(31, mes)
+ end
+
+ def green(mes)
+ colorize(32, mes)
+ end
+
+ def yellow(mes)
+ colorize(33, mes)
+ end
+
+ def pink(mes)
+ colorize(35, mes)
+ end
+
+ private
+
+ def colorize(color_code, mes)
+ "\e[#{color_code}m#{mes}\e[0m"
+ end
+ end
+end
+
+
+print_list_dir = ARGV.pop
+unless print_list_dir
+ raise "No dir/to/roboform/print_lists"
+end
+print_list_dir = File.expand_path(print_list_dir)
+
+# parse logins
+logins_path = Dir.glob("#{print_list_dir}/RoboForm Logins*.html").first
+unless logins_path
+ raise 'Login HTML (RoboForm Logins*.html) not found'
+end
+
+html_logins = Nokogiri::HTML(File.open(logins_path))
+
+saved_logins = 0
+
+html_logins.css('table').each do |table|
+ login = Login.new
+
+ table.css('tr').each do |tr|
+ caption = tr.at_css('.caption')
+ subcaption = tr.at_css('.subcaption')
+ key = tr.at_css('.field')
+
+ if caption
+ login.key = caption.text()
+ elsif subcaption
+ login.url = subcaption.text()
+ elsif key
+ login.fields[key.text()] = tr.at_css('.wordbreakfield').text()
+ else
+ login.raw << tr.at_css('.wordbreakfield').text()
+ end
+ end
+
+ if login.fields.any?
+ login.ask_required_info
+ if login.save
+ saved_logins += 1
+ end
+ end
+end
+
+puts "Imported passwords: #{saved_logins}"
+
?id=11739be69a3f4368e63c469bc0a8f606bb2cbbec&follow=1'> r669@Devoty: necoro | 2008-01-18 22:49:33 +0100Necoro1-6/+6 Made it really work 2008-01-18 r664@Devoty: necoro | 2008-01-18 21:40:29 +0100Necoro5-26/+181 First support for 'delete on demand' r665@Devoty: necoro | 2008-01-18 22:18:05 +0100 Finished the 'on demand removal' 2008-01-18 r661@Devoty: necoro | 2008-01-18 14:16:59 +0100Necoro8-211/+293 First support for interactive emerges r662@Devoty: necoro | 2008-01-18 20:22:58 +0100 Now finished interactive emerges 2008-01-18 r655@Devoty: necoro | 2008-01-18 03:04:53 +0100Necoro1-1/+1 Small bugfix 2008-01-18 r651@Devoty: necoro | 2008-01-18 02:41:51 +0100Necoro3-393/+513 adjust changelog and translation 2008-01-18 r643@Devoty: necoro | 2008-01-16 18:55:49 +0100Necoro14-249/+525 Fixed small bug in PackageTable.cb_package_revert_clicked r646@Devoty: necoro | 2008-01-18 00:12:30 +0100 Make tabpositions being configurable by the user r647@Devoty: necoro | 2008-01-18 01:38:19 +0100 Renamed 'shm' to '_shm' to not hide the global one r648@Devoty: necoro | 2008-01-18 01:38:29 +0100 Renamed 'shm' to '_shm' to not hide the global one r649@Devoty: necoro | 2008-01-18 02:34:43 +0100 Added update queues; general UI improvement 2008-01-14 r634@Devoty: necoro | 2008-01-14 23:48:24 +0100Necoro3-1/+4 Removed the broken plugins until they get replaced 2008-01-14 r632@Devoty: necoro | 2008-01-14 23:44:52 +0100Necoro3-175/+181 small changes 2008-01-14(no commit message)Necoro10-758/+1014 2008-01-14 r621@Devoty: necoro | 2008-01-14 20:21:40 +0100Necoro2-21/+61 adjust changelog r622@Devoty: necoro | 2008-01-14 21:01:11 +0100 Some new views 2008-01-14 r618@Devoty: necoro | 2008-01-14 20:19:05 +0100Necoro2-35/+57 An ALL category 2008-01-14 r617@Devoty: necoro | 2008-01-14 19:12:59 +0100Necoro2-10/+10 Remove unnecessairy loads of the shm module 2008-01-14 r609@Devoty: necoro | 2008-01-14 17:04:38 +0100Necoro9-394/+477 Allowed '-' and '_' in key names. Also use group names instead of their number. r610@Devoty: necoro | 2008-01-14 17:05:42 +0100 Disabled saving of the queues r611@Devoty: necoro | 2008-01-14 17:08:53 +0100 Added the possibility to permanently en-/disable plugins r612@Devoty: necoro | 2008-01-14 17:14:09 +0100 adjust changelog and translations r613@Devoty: necoro | 2008-01-14 17:40:53 +0100 Dropdown should be localized too 2008-01-14 r605@Devoty: necoro | 2008-01-14 11:43:34 +0100Necoro2-26/+129 Updated shm module to version 1.1.4 2008-01-14 r603@Devoty: necoro | 2008-01-14 11:30:26 +0100Necoro4-26/+38 Improved 'update world'; really support new use defaults 2008-01-11 r598@Devoty: necoro | 2008-01-10 16:36:29 +0100Necoro4-10/+50 Handle the new useflag format correctly 2008-01-11 r597@Devoty: necoro | 2008-01-10 14:12:35 +0100Necoro1-3/+3 updated todo 2008-01-10 r595@Devoty: necoro | 2008-01-10 04:04:15 +0100Necoro1-52/+3 Re-Introduced etc-proposals 2008-01-09 r586@Devoty: necoro | 2008-01-09 14:54:18 +0100Necoro1-1/+1 Disabled catapult till it is really usable 2007-12-06 r577@Devoty: necoro | 2007-12-06 20:37:36 +0100Necoro1-1/+1 Fixed desktop file 2007-12-06 r572@Devoty: necoro | 2007-11-28 08:48:15 +0100Necoro1-0/+1 2007-11-27 r570@Devoty: necoro | 2007-11-27 02:08:21 +0100Necoro3-84/+108 Added scrollbars to update window