Sha256: 3f9915dfcc603015e469891b263e0f3f238abdb94731a2a0c4a800b5966cb7ef

Contents?: true

Size: 1.02 KB

Versions: 6

Compression:

Stored size: 1.02 KB

Contents

require 'digest/md5'
require 'base64'

module Oplop

  LENGTH = 8

  #
  # Oplop.password(:master => 'p@ssw0rd', :label => 'github')
  #
  def self.password(args={})
    unless (args.keys.include?(:master) && args.keys.include?(:label))
      raise ArgumentError.new 'Master and label are required arguments.'
    end
    
    master_label = '%s%s' % [ args.delete(:master), args.delete(:label) ]
    
    raise ArgumentError.new "Unknown keys #{args.keys.join(',')}." if args.keys.any?
    

    password = urlsafe_b64encode(Digest::MD5.digest(master_label))
    
    if password.respond_to?(:encode)
      password = password.encode('UTF-8')
    end
    
    if m = password.match(/\d+/)
      password = '%s%s' % [ m[0], password ] if (m.begin(0) >= LENGTH)
    else
      password = '1%s' % password
    end
    
    password[0,LENGTH]
  end

  # See http://www.ietf.org/rfc/rfc4648.txt
  # Ruby 1.8.x does not have this as part of the Base64 lib
  def self.urlsafe_b64encode(string)
    Base64.encode64(string).tr('+/', '-_')
  end

end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
oplop-0.0.8 lib/oplop.rb
oplop-0.0.7 lib/oplop.rb
oplop-0.0.6 lib/oplop.rb
oplop-0.0.5 lib/oplop.rb
oplop-0.0.4 lib/oplop.rb
oplop-0.0.3 lib/oplop.rb