Created
March 17, 2013 18:01
-
-
Save teddypickerfromul/5182811 to your computer and use it in GitHub Desktop.
Ruby: Convert Google chrome passwords sqlite database to KeepassX xml format.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- encoding : utf-8 -*- | |
#!/usr/bin/env | |
begin | |
require 'sqlite3' | |
require 'date' | |
require 'time' | |
require 'getopt/long' | |
rescue LoadError => e | |
puts "Ты забыл поставить гемы: " + e.message.split[-1] | |
exit | |
end | |
default_url_field = "action_url" | |
default_username_field = "username_value" | |
default_pass_field = "password_value" | |
default_url_origin_field = "origin_url" | |
default_username_type_field = "username_element" | |
default_dest_url = "signon_realm" | |
default_create_datetime = "date_created" | |
opt = Getopt::Long.getopts( | |
["--input", "-i", Getopt::REQUIRED], | |
["--output", "-o", Getopt::REQUIRED] | |
) | |
if opt["i"] and opt["o"] | |
dbfile = opt["i"] | |
keepassx_xml = opt["o"] | |
end | |
if !File.exist?(dbfile) | |
puts "Ну не могу открыть я файлик : " + dbfile | |
exit | |
end | |
db = SQLite3::Database.open(dbfile) | |
db.results_as_hash = true | |
begin | |
entries = db.execute(" select #{default_dest_url}, #{default_url_field}, #{default_url_origin_field}, #{default_username_type_field}, #{default_username_field}, #{default_pass_field}, #{default_create_datetime} from logins ") | |
rescue SQLite3::SQLException | |
puts "Проблемы с базой - чини" | |
exit | |
rescue SQLite3::BusyException | |
puts "Закрой хром или посмотри кто локнул базу и разберись" | |
exit | |
end | |
db.close | |
if not entries.empty? | |
File.open(keepassx_xml, 'w') do |f| | |
f.puts '<!DOCTYPE KEEPASSX_DATABASE>' | |
f.puts '<database>' | |
f.puts ' <group>' | |
f.puts ' <title>Импортировано из Хрома</title>' | |
f.puts ' <icon>1</icon>' | |
entries.each_with_index do |record, index| | |
f.puts " <entry>" | |
f.puts " <group>Из хрома</group>" | |
f.puts " <title>Запись из хрома под номером #{index}</title>" | |
if not record["#{default_username_field}"].empty? | |
f.puts " <username>#{record[default_username_field]}</username>" | |
else | |
f.puts " <username></username>" | |
end | |
if not record["#{default_pass_field}"].empty? | |
f.puts " <password>#{record["#{default_pass_field}"]}</password>" | |
else | |
f.puts " <password></password>" | |
end | |
if not record["#{default_dest_url}"].empty? | |
f.puts " <url>#{record["#{default_dest_url}"]}</url>" | |
elsif not record["#{default_url_field}"].empty? | |
f.puts " <url>#{record["#{default_url_field}"]}</url>" | |
elsif not record["#{default_url_origin_field}"].empty? | |
f.puts " <url>#{record["#{default_url_origin_field}"]}</url>" | |
else | |
f.puts " <url></url>" | |
end | |
if not record["#{default_create_datetime}"].to_s.empty? | |
datetime = Time.at(record["#{default_create_datetime}"].to_i).to_datetime.to_s | |
f.puts " <creationtime>#{datetime}</creationtime>" | |
end | |
f.puts " <comment>Из хрома.</comment>" | |
f.puts " </entry>" | |
end | |
f.puts ' </group>' | |
f.puts '</database>' | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment