Sha256: 0474e8927cfe1a4eecc87d11ba5ea9e31c8d03c1d072eda2ef37234da0f710dc

Contents?: true

Size: 919 Bytes

Versions: 1

Compression:

Stored size: 919 Bytes

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(master_label).encode('UTF-8')
    
    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
  def self.urlsafe_b64encode(string)
    Base64.encode64(Digest::MD5.digest(string)).tr('+/', '-_').gsub("\n",'')
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
oplop-0.0.1 lib/oplop.rb