class Object

Public Instance Methods

apply_constraints(hash, size, nonalphanumeric) click to toggle source
# File lib/pwdhash/pwdhash.rb, line 28
def apply_constraints(hash, size, nonalphanumeric)
  startingSize = [size - 4, 0].max # Leave room for some extra characters
  result = hash[0, startingSize]
  extras = (hash[startingSize, hash.length] || "").split('')
  
  # Add the extra characters
  result += (contains(result, /[A-Z]/) ? next_extra_character(extras) : next_between('A', 26, extras))
  result += (contains(result, /[a-z]/) ? next_extra_character(extras) : next_between('a', 26, extras))
  result += (contains(result, /[0-9]/) ? next_extra_character(extras) : next_between('0', 10, extras))
  result += (contains(result, /\W/) && nonalphanumeric ? next_extra_character(extras) : '+')
  while (contains(result, /\W/) && !nonalphanumeric) do
    result = result.sub(/\W/, next_between('A', 26, extras))
  end
  
  
  # Rotate the result to make it harder to guess the inserted locations
  result = result.split('')
  rotate(result, next_extra(extras))
  return result.join('')
end
between(min, interval, offset) click to toggle source
# File lib/pwdhash/pwdhash.rb, line 15
def between(min, interval, offset)
  (min.ord + offset.ord % interval).chr
end
contains(result, regex) click to toggle source
# File lib/pwdhash/pwdhash.rb, line 24
def contains(result, regex)
  result.match(regex)
end
extract_domain(uri) click to toggle source
# File lib/pwdhash/extract_domain.rb, line 1
def extract_domain(uri)
    domains = %w(
        ab.ca
        ac.ac
        ac.at
        ac.be
        ac.cn
        ac.il
        ac.in
        ac.jp
        ac.kr
        ac.nz
        ac.th
        ac.uk
        ac.za
        adm.br
        adv.br
        agro.pl
        ah.cn
        aid.pl
        alt.za
        am.br
        arq.br
        art.br
        arts.ro
        asn.au
        asso.fr
        asso.mc
        atm.pl
        auto.pl
        bbs.tr
        bc.ca
        bio.br
        biz.pl
        bj.cn
        br.com
        cn.com
        cng.br
        cnt.br
        co.ac
        co.at
        co.il
        co.in
        co.jp
        co.kr
        co.nz
        co.th
        co.uk
        co.za
        com.au
        com.br
        com.cn
        com.ec
        com.fr
        com.hk
        com.mm
        com.mx
        com.pl
        com.ro
        com.ru
        com.sg
        com.tr
        com.tw
        cq.cn
        cri.nz
        de.com
        ecn.br
        edu.au
        edu.cn
        edu.hk
        edu.mm
        edu.mx
        edu.pl
        edu.tr
        edu.za
        eng.br
        ernet.in
        esp.br
        etc.br
        eti.br
        eu.com
        eu.lv
        fin.ec
        firm.ro
        fm.br
        fot.br
        fst.br
        g12.br
        gb.com
        gb.net
        gd.cn
        gen.nz
        gmina.pl
        go.jp
        go.kr
        go.th
        gob.mx
        gov.br
        gov.cn
        gov.ec
        gov.il
        gov.in
        gov.mm
        gov.mx
        gov.sg
        gov.tr
        gov.za
        govt.nz
        gs.cn
        gsm.pl
        gv.ac
        gv.at
        gx.cn
        gz.cn
        hb.cn
        he.cn
        hi.cn
        hk.cn
        hl.cn
        hn.cn
        hu.com
        idv.tw
        ind.br
        inf.br
        info.pl
        info.ro
        iwi.nz
        jl.cn
        jor.br
        jpn.com
        js.cn
        k12.il
        k12.tr
        lel.br
        ln.cn
        ltd.uk
        mail.pl
        maori.nz
        mb.ca
        me.uk
        med.br
        med.ec
        media.pl
        mi.th
        miasta.pl
        mil.br
        mil.ec
        mil.nz
        mil.pl
        mil.tr
        mil.za
        mo.cn
        muni.il
        nb.ca
        ne.jp
        ne.kr
        net.au
        net.br
        net.cn
        net.ec
        net.hk
        net.il
        net.in
        net.mm
        net.mx
        net.nz
        net.pl
        net.ru
        net.sg
        net.th
        net.tr
        net.tw
        net.za
        nf.ca
        ngo.za
        nm.cn
        nm.kr
        no.com
        nom.br
        nom.pl
        nom.ro
        nom.za
        ns.ca
        nt.ca
        nt.ro
        ntr.br
        nx.cn
        odo.br
        on.ca
        or.ac
        or.at
        or.jp
        or.kr
        or.th
        org.au
        org.br
        org.cn
        org.ec
        org.hk
        org.il
        org.mm
        org.mx
        org.nz
        org.pl
        org.ro
        org.ru
        org.sg
        org.tr
        org.tw
        org.uk
        org.za
        pc.pl
        pe.ca
        plc.uk
        ppg.br
        presse.fr
        priv.pl
        pro.br
        psc.br
        psi.br
        qc.ca
        qc.com
        qh.cn
        re.kr
        realestate.pl
        rec.br
        rec.ro
        rel.pl
        res.in
        ru.com
        sa.com
        sc.cn
        school.nz
        school.za
        se.com
        se.net
        sh.cn
        shop.pl
        sk.ca
        sklep.pl
        slg.br
        sn.cn
        sos.pl
        store.ro
        targi.pl
        tj.cn
        tm.fr
        tm.mc
        tm.pl
        tm.ro
        tm.za
        tmp.br
        tourism.pl
        travel.pl
        tur.br
        turystyka.pl
        tv.br
        tw.cn
        uk.co
        uk.com
        uk.net
        us.com
        uy.com
        vet.br
        web.za
        web.com
        www.ro
        xj.cn
        xz.cn
        yk.ca
        yn.cn
        za.com
    )

    host = uri.gsub(%r(https?://), '')
    host = host[%r(([^/]+))]
    host = host.split('.')

    if host[2]
        s = host[host.length - 2] + '.' + host[host.length - 1]
        s = host[host.length - 3] + '.' + s if domains.include?(s)
    else
        s = host * '.'
    end

    s
end
get_hashed_password(password, realm) click to toggle source
# File lib/pwdhash/pwdhash.rb, line 92
def get_hashed_password(password, realm)
  hash = PwdHash::Hash.new(realm, password)
  apply_constraints(hash.hash, hash.size, hash.contains_non_alphanumeric?)
end
get_hashed_password2(password, realm, salt, iterations) click to toggle source
# File lib/pwdhash/pwdhash.rb, line 97
def get_hashed_password2(password, realm, salt, iterations)
  hash = PwdHash::Hash2.new(realm, password, salt, iterations)
  apply_constraints(hash.hash, hash.size, hash.contains_non_alphanumeric?)
end
next_between(base, interval, extras) click to toggle source
# File lib/pwdhash/pwdhash.rb, line 19
def next_between(base, interval, extras)
  char_code = between(base[0], interval, next_extra(extras))
  char_code.chr
end
next_extra(extras) click to toggle source
# File lib/pwdhash/pwdhash.rb, line 7
def next_extra(extras)
  extras.empty? ? 0 : extras.shift[0]
end
next_extra_character(extras) click to toggle source
# File lib/pwdhash/pwdhash.rb, line 3
def next_extra_character(extras)
  next_extra(extras).chr
end
rotate(array, amount) click to toggle source
# File lib/pwdhash/pwdhash.rb, line 11
def rotate(array, amount)
  amount.ord.downto(1) { array.push(array.shift) }
end