Skip to content

Instantly share code, notes, and snippets.

@teddypickerfromul
Created March 17, 2013 18:01
Show Gist options
  • Save teddypickerfromul/5182811 to your computer and use it in GitHub Desktop.
Save teddypickerfromul/5182811 to your computer and use it in GitHub Desktop.
Ruby: Convert Google chrome passwords sqlite database to KeepassX xml format.
# -*- 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