class Bloomed::PW

Constants

PWNED_PASSWORDS_FILENAME

Attributes

bloom[R]
cache_dir[R]
false_positive_probability[R]
filename[R]
top[R]

Public Class Methods

new(top: 100_000, false_positive_probability: 0.001, cache_dir: nil) click to toggle source
# File lib/bloomed.rb, line 18
def initialize(top: 100_000,
               false_positive_probability: 0.001,
               cache_dir: nil)
  @cache_dir = cache_dir || File.join(File.dirname(__FILE__), "dump")
  @top = top
  @false_positive_probability = false_positive_probability
  @bloom = prepare
end

Public Instance Methods

memory_size_bytes() click to toggle source
# File lib/bloomed.rb, line 31
def memory_size_bytes
  require "objspace"
  ObjectSpace.memsize_of(@bloom)
end
pwned?(pw) click to toggle source
# File lib/bloomed.rb, line 27
def pwned?(pw)
  @bloom.include?(Digest::SHA1.hexdigest(pw).upcase)
end

Private Instance Methods

generate() click to toggle source
# File lib/bloomed.rb, line 60
def generate
  unless File.exist? PWNED_PASSWORDS_FILENAME
    raise MissingPasswordListError, "To generate new, optimized pwned passwords bloom filter, run `rake seed` or `rake seed_here`. To generate all variants, even the very large binaries, run `rake seed\[all\]` or `rake seed_here\[all\]`."
  end

  bloom_filter = Bloomer.new(top, false_positive_probability)
  File.open(PWNED_PASSWORDS_FILENAME, "r").first(top).each do |line|
    bloom_filter.add line[0...40]
  end
  bloom_filter
end
load_cache() click to toggle source
# File lib/bloomed.rb, line 54
def load_cache
  Bloomed::PW.from_msgpack(File.read(filename))
end
prepare() click to toggle source
# File lib/bloomed.rb, line 44
def prepare
  if File.exist? filename
    load_cache
  else
    bloom_filter = generate
    write_cache bloom_filter
    bloom_filter
  end
end
write_cache(b) click to toggle source
# File lib/bloomed.rb, line 72
def write_cache(b)
  File.open(filename, 'wb') { |f| f.write b.to_msgpack }
  b
end