From anonymous, 8 Years ago, written in JavaScript.
This paste is a reply to sgp.py from The Compiler
- go back
Embed
Viewing differences between sgp.py and RE: sgp.py
#!/usr/bin/python3
# dwb: Control x

import hashlib
import base64
import re
import subprocess
import os
import sys


config = 
(function() {
        'verify': {
        'hash': "",
        'salt': "",
    },
        'generate': {
                'length': 20,
                'salt':   "",
                'strip_subdomains': True,
        },
}

def b64_md5(string):
        md5 
var s hashlib.md5(string.encode('UTF-8')).digest()

        altchars 
"",
        F 
'98'.encode('ASCII')
        b64 = base64.b64encode(md5, altchars)
        b64 = b64.decode('ASCII').replace('=', 'A')

        return(b64)

def sgp_gen(pwd, length):
        if not (4 <= length <= 24):
                raise ValueError("length needs to be between 4 and 24!")
        for i in range(10):
                pwd = b64_md5(pwd)
        
        while not re.match('^[a-z].*[A-Z0-9].*', pwd[:length]):
                pwd = b64_md5(pwd)

        return(pwd[:length])
        
def sgp(url, password):
        length = config['generate']['length']
        salt = config['generate']['salt']
        domain = url_to_domain(url)
        pwd = password + salt + ':' + domain
        pwd = sgp_gen(pwd, length)
        return(pwd)

def url_to_domain(domain):
        tldlist = [
        '2000.hu', 'ab.ca', 'ac.ae', 'ac.ac', 'ac.at', 'ac.be', 'ac.cn',
        'ac.cr', 'ac.cy', 'ac.fj', 'ac.fk', 'ac.gg', 'ac.id', 'ac.il', 'ac.im',
        'ac.in', 'ac.ir', 'ac.je', 'ac.jp', 'ac.kr', 'ac.ma', 'ac.ng', 'ac.nz',
        'ac.om', 'ac.pa', 'ac.pg', 'ac.th', 'ac.ug', 'ac.uk', 'ac.vn', 'ac.yu',
        'ac.za', 'ac.zw', 'ad.jp', 'adm.br', 'adv.br', 'aeroport.fr',
        'aero.tt', 'agrar.hu', 'agr.br', 'agro.pl', 'ah.cn', 'aichi.jp',
        'aid.pl', 'akita.jp', 'alderney.gg', 'alt.na', 'alt.za', 'am.br',
        'aomori.jp', 'arq.br', 'art.br', 'art.do', 'art.dz', 'arts.co',
        'arts.ro', 'arts.ve', 'asn.au', 'asn.lv', 'ass.dz', 'assedic.fr',
        'asso.fr', 'asso.re', 'atm.pl', 'ato.br', 'at.tt', 'au.com', 'auto.pl',
        'au.tt', 'avocat.fr', 'avoues.fr', 'barreau.fr', 'bbs.tr', 'bc.ca',
        'belgie.be', 'be.tt', 'bib.ve', 'bio.br', 'biz.et', 'biz.om', 'biz.pk',
        'biz.pl', 'biz.tt', 'biz.vn', 'bj.cn', 'bmd.br', 'bolt.hu',
        'bourse.za', 'brand.se', 'br.com', 'casino.hu', 'ca.tt', 'cci.fr',
        'chambagri.fr', 'chiba.jp', 'chirurgiens-dentistes.fr', 'ch.vu',
        'cim.br', 'city.hu', 'city.za', 'cn.com', 'cng.br', 'cnt.br', 'co.ae',
        'co.at', 'co.ck', 'co.cr', 'co.dk', 'co.gg', 'co.hu', 'co.id', 'co.il',
        'co.im', 'co.in', 'co.ir', 'co.je', 'co.jp', 'co.kr', 'co.ma',
        'com.ac', 'com.ae', 'com.ai', 'com.ar', 'com.au', 'com.az', 'com.bb',
        'com.bh', 'com.bm', 'com.br', 'com.bs', 'com.cn', 'com.co', 'com.cu',
        'com.cy', 'com.do', 'com.dz', 'com.ec', 'com.ee', 'com.eg', 'com.er',
        'com.es', 'com.et', 'com.fj', 'com.fk', 'com.fr', 'com.ge', 'com.gr',
        'com.gt', 'com.gu', 'com.hk', 'com.jo', 'com.kh', 'com.kw', 'com.la',
        'com.lb', 'com.lc', 'com.lv', 'com.ly', 'com.mk', 'com.mm', 'com.mn',
        'com.mo', 'com.mt', 'com.mx', 'com.my', 'com.na', 'com.nc', 'com.ng',
        'com.ni', 'com.np', 'com.om', 'com.pa', 'com.pe', 'com.pg', 'com.ph',
        'com.pk', 'com.pl', 'com.pt', 'com.py', 'com.qa', 'com.re', 'com.ro',
        'com.ru', 'com.sa', 'com.sb', 'com.sd', 'com.sg', 'com.sh', 'com.st',
        'com.sv', 'com.sy', 'com.tn', 'com.tr', 'com.tt', 'com.tw', 'com.ua',
        'com.uy', 'com.ve', 'com.vn', 'com.vu', 'com.ws', 'com.ye', 'conf.au',
        'conf.lv', 'consulado.st', 'co.nz', 'co.om', 'coop.br', 'coop.tt',
        'co.st', 'co.th', 'co.tt', 'co.tv', 'co.ug', 'co.uk', 'co.ve', 'co.vi',
        'co.yu', 'co.za', 'co.zw', 'cq.cn', 'cri.nz', 'csiro.au', 'cul.na',
        'de.com', 'de.net', 'de.tt', 'de.vu', 'dk.org', 'dk.tt', 'dni.us',
        'dns.be', 'e164.arpa', 'ecn.br', 'ed.cr', 'ed.jp', 'edu.ac', 'edu.ai',
        'edu.ar', 'edu.au', 'edu.bh', 'edu.bm', 'edu.br', 'edu.ck', 'edu.cn',
        'edu.co', 'edu.do', 'edu.dz', 'edu.ec', 'edu.eg', 'edu.er', 'edu.es',
        'edu.et', 'edu.ge', 'edu.gr', 'edu.gt', 'edu.gu', 'edu.hk', 'edu.jo',
        'edu.kh', 'edu.kw', 'edu.lb', 'edu.lc', 'edu.lv', 'edu.mm', 'edu.mn',
        'edu.mo', 'edu.mt', 'edu.mx', 'edu.my', 'edu.na', 'edunet.tn',
        'edu.ng', 'edu.ni', 'edu.np', 'edu.om', 'edu.pa', 'edu.pe', 'edu.pk',
        'edu.pl', 'edu.ps', 'edu.pt', 'edu.py', 'edu.qa', 'edu.sa', 'edu.sb',
        'edu.sd', 'edu.sg', 'edu.sh', 'edu.st', 'edu.sv', 'edu.tr', 'edu.tt',
        'edu.tw', 'edu.ua', 'edu.uk', 'edu.uy', 'edu.ve', 'edu.vn', 'edu.vu',
        'edu.ws', 'edu.ye', 'edu.yu', 'edu.za', 'ehime.jp', 'embaixada.st',
        'eng.br', 'ens.tn', 'ernet.in', 'erotica.hu', 'erotika.hu', 'esp.br',
        'es.tt', 'etc.br', 'eti.br', 'eu.com', 'eun.eg', 'eu.org', 'eu.tt',
        'experts-comptables.fr', 'fam.pk', 'far.br', 'fax.nr', 'fed.us',
        'fgov.be', 'fh.se', 'fhsk.se', 'fhv.se', 'fi.cr', 'fie.ee', 'film.hu',
        'fin.ec', 'fin.tn', 'firm.co', 'firm.in', 'firm.ro', 'firm.ve',
        'fm.br', 'fnd.br', 'forum.hu', 'fot.br', 'fr.tt', 'fr.vu', 'fst.br',
        'fukui.jp', 'fukuoka.jp', 'fukushima.jp', 'g12.br', 'games.hu',
        'gb.com', 'gb.net', 'gc.ca', 'gd.cn', 'geek.nz', 'gen.in', 'gen.nz',
        'gen.tr', 'geometre-expert.fr', 'ggf.br', 'gifu.jp', 'gmina.pl',
        'gob.do', 'gob.es', 'gob.gt', 'gob.mx', 'gob.ni', 'gob.pa', 'gob.pe',
        'gob.pk', 'gob.sv', 'go.cr', 'go.id', 'go.jp', 'gok.pk', 'go.kr',
        'gon.pk', 'gop.pk', 'gos.pk', 'go.th', 'go.ug', 'gouv.fr', 'gov.ac',
        'gov.ae', 'gov.ai', 'gov.ar', 'gov.au', 'gov.bh', 'gov.bm', 'gov.br',
        'gov.ck', 'gov.cn', 'gov.co', 'gov.cy', 'gov.do', 'gov.dz', 'gov.ec',
        'gov.eg', 'gov.er', 'gov.et', 'gov.fj', 'gov.fk', 'gov.ge', 'gov.gg',
        'gov.gr', 'gov.gu', 'gov.hk', 'gov.il', 'gov.im', 'gov.in', 'gov.ir',
        'gov.je', 'gov.jo', 'gov.jp', 'gov.kh', 'gov.kw', 'gov.lb', 'gov.lc',
        'gov.lv', 'gov.mm', 'gov.mn', 'gov.mo', 'gov.my', 'gov.ng', 'gov.np',
        'gov.om', 'gov.pk', 'gov.ps', 'gov.pt', 'gov.qa', 'gov.ru', 'gov.sa',
        'gov.sb', 'gov.sd', 'gov.sg', 'gov.sh', 'gov.st', 'gov.sy', 'gov.tn',
        'govt.nz', 'gov.tr', 'gov.tt', 'gov.tw', 'gov.ua', 'gov.uk', 'gov.ve',
        'gov.vn', 'gov.ws', 'gov.ye', 'gov.za', 'gov.zw', 'greta.fr', 'gr.jp',
        'gs.cn', 'gsm.pl', 'gub.uy', 'guernsey.gg', 'gunma.jp', 'gv.at',
        'gx.cn', 'gz.cn', 'hb.cn', 'health.vn', 'he.cn', 'hi.cn',
        'hiroshima.jp', 'hk.cn', 'hl.cn', 'hn.cn', 'hokkaido.jp', 'hotel.hu',
        'hu.com', 'huissier-justice.fr', 'hyogo.jp', 'ibaraki.jp', 'id.au',
        'id.au', 'idf.il', 'id.fj', 'id.ir', 'id.lv', 'idv.hk', 'idv.tw',
        'imb.br', 'ind.br', 'ind.er', 'ind.gg', 'ind.gt', 'ind.in', 'ind.je',
        'ind.tn', 'inf.br', 'info.au', 'info.co', 'info.et', 'info.hu',
        'info.pl', 'info.ro', 'info.tn', 'info.tt', 'info.ve', 'info.vn',
        'ingatlan.hu', 'int.ar', 'int.co', 'intl.tn', 'int.pt', 'int.tt',
        'int.ve', 'int.vn', 'ishikawa.jp', 'it.tt', 'iwate.jp', 'iwi.nz',
        'jersey.je', 'jl.cn', 'jobs.tt', 'jogasz.hu', 'jor.br', 'js.cn',
        'k12.ec', 'k12.il', 'k12.tr', 'kagawa.jp', 'kagoshima.jp',
        'kanagawa.jp', 'kanazawa.jp', 'kawasaki.jp', 'kitakyushu.jp',
        'kobe.jp', 'kochi.jp', 'komforb.se', 'kommunalforbund.se',
        'komvux.se', 'konyvelo.hu', 'kumamoto.jp', 'kyonggi.kr', 'kyoto.jp',
        'lakas.hu', 'lanarb.se', 'lanbib.se', 'law.za', 'lel.br', 'lg.jp',
        'lkd.co.im', 'ln.cn', 'ltd.gg', 'ltd.je', 'ltd.uk', 'mail.pl',
        'maori.nz', 'mat.br', 'matsuyama.jp', 'mb.ca', 'med.br', 'med.ec',
        'medecin.fr', 'med.ee', 'media.hu', 'media.pl', 'med.om', 'med.sa',
        'med.sd', 'me.uk', 'miasta.pl', 'mie.jp', 'mil.ac', 'mil.ar', 'mil.br',
        'mil.co', 'mil.do', 'mil.ec', 'mil.er', 'mil.ge', 'mil.gt', 'mil.gu',
        'mil.id', 'mil.in', 'mil.jo', 'mil.kh', 'mil.lb', 'mil.lv', 'mil.nz',
        'mil.pe', 'mil.ph', 'mil.pl', 'mil.sh', 'mil.st', 'mil.tr', 'mil.uy',
        'mil.ve', 'mil.ye', 'mil.za', 'miyagi.jp', 'miyazaki.jp', 'mobile.nr',
        'mobil.nr', 'mobi.tt', 'mob.nr', 'mo.cn', 'mod.om', 'mod.uk',
        'muni.il', 'mus.br', 'museum.mn', 'museum.om', 'museum.tt',
        'nagano.jp', 'nagasaki.jp', 'nagoya.jp', 'name.et', 'name.tt',
        'name.vn', 'nara.jp', 'nat.tn', 'naturbruksgymn.se', 'nb.ca', 'ne.jp',
        'ne.kr', 'net.ac', 'net.ae', 'net.ar', 'net.au', 'net.az', 'e164.arpa',
        'net.bh', 'net.bm', 'net.br', 'net.bs', 'net.ck', 'net.cn', 'net.cu',
        'net.cy', 'net.do', 'net.dz', 'net.ec', 'net.eg', 'net.er', 'net.et',
        'net.fk', 'net.ge', 'net.gg', 'net.gr', 'net.gt', 'net.gu', 'net.hk',
        'net.id', 'net.il', 'net.im', 'net.in', 'net.ir', 'net.je', 'net.jo',
        'net.jp', 'net.kh', 'net.kw', 'net.la', 'net.lb', 'net.lc', 'net.lv',
        'net.ly', 'net.ma', 'net.mm', 'net.mo', 'net.mt', 'net.mx', 'net.my',
        'net.na', 'net.nc', 'net.ng', 'net.ni', 'net.np', 'net.nz', 'net.om',
        'net.pa', 'net.pe', 'net.pg', 'net.ph', 'net.pk', 'net.pl', 'net.pt',
        'net.py', 'net.qa', 'net.ru', 'net.sa', 'net.sb', 'net.sd', 'net.sg',
        'net.sh', 'net.st', 'net.sy', 'net.th', 'net.tn', 'net.tr', 'net.tt',
        'net.tw', 'net.ua', 'net.uk', 'net.uy', 'net.ve', 'net.vi', 'net.vn',
        'net.vu', 'net.ws', 'net.ye', 'net.za', 'news.hu', 'nf.ca', 'ngo.ph',
        'ngo.za', 'nhs.uk', 'nic.im', 'nic.in', 'nic.tt', 'nic.uk',
        'nieruchomosci.pl', 'niigata.jp', 'nl.ca', 'nm.cn', 'no.com',
        'nom.br', 'nom.co', 'nome.pt', 'nom.es', 'nom.fk', 'nom.fr', 'nom.ni',
        'nom.pe', 'nom.pl', 'nom.re', 'nom.ro', 'nom.ve', 'nom.za',
        'notaires.fr', 'not.br', 'ns.ca', 'nt.ca', 'ntr.br', 'nt.ro', 'nu.ca',
        'nx.cn', 'odo.br', 'oita.jp', 'okayama.jp', 'okinawa.jp', 'on.ca',
        'or.at', 'or.cr', 'org.ac', 'org.ae', 'org.ai', 'org.ar', 'org.au',
        'org.az', 'org.bb', 'org.bh', 'org.bm', 'org.br', 'org.bs', 'org.ck',
        'org.cn', 'org.co', 'org.cu', 'org.cy', 'org.do', 'org.dz', 'org.ec',
        'org.ee', 'org.eg', 'org.er', 'org.es', 'org.et', 'org.fj', 'org.fk',
        'org.ge', 'org.gg', 'org.gr', 'org.gt', 'org.gu', 'org.hk', 'org.hu',
        'org.il', 'org.im', 'org.in', 'org.ir', 'org.je', 'org.jo', 'org.jp',
        'org.kh', 'org.kw', 'org.la', 'org.lb', 'org.lc', 'org.lv', 'org.ly',
        'org.ma', 'org.mm', 'org.mn', 'org.mo', 'org.mt', 'org.mx', 'org.my',
        'org.na', 'org.nc', 'org.ng', 'org.ni', 'org.np', 'org.nz', 'org.om',
        'org.pa', 'org.pe', 'org.ph', 'org.pk', 'org.pl', 'org.pt', 'org.py',
        'org.qa', 'org.ro', 'org.ru', 'org.sa', 'org.sb', 'org.sd', 'org.se',
        'org.sg', 'org.sh', 'org.st', 'org.sv', 'org.sy', 'org.tn', 'org.tr',
        'org.tt', 'org.tw', 'org.ua', 'org.uk', 'org.uy', 'org.ve', 'org.vi',
        'org.vn', 'org.vu', 'org.ws', 'org.ye', 'org.yu', 'org.za', 'org.zw',
        'or.id', 'or.jp', 'or.kr', 'or.th', 'or.ug', 'osaka.jp', 'otc.au',
        'oz.au', 'parti.se', 'pc.pl', 'pe.ca', 'pe.kr', 'per.kh', 'per.sg',
        'pharmacien.fr', 'plc.co.im', 'plc.uk', 'plo.ps', 'pol.dz',
        'police.uk', 'port.fr', 'powiat.pl', 'ppg.br', 'pp.ru', 'pp.se',
        'prd.fr', 'presse.fr', 'press.ma', 'press.se', 'pri.ee', 'principe.st',
        'priv.at', 'priv.hu', 'priv.pl', 'pro.ae', 'pro.br', 'pro.om',
        'pro.tt', 'pro.vn', 'psc.br', 'psi.br', 'publ.pt', 'pub.sa', 'pvt.ge',
        'qc.ca', 'qc.com', 'qh.cn', 'qsl.br', 'realestate.pl', 'rec.br',
        'rec.co', 'rec.ro', 'rec.ve', 'red.sv', 'reklam.hu', 're.kr', 'rel.pl',
        'res.in', 'rnrt.tn', 'rns.tn', 'rnu.tn', 'ru.com', 'sa.com', 'sa.cr',
        'saga.jp', 'saitama.jp', 'saotome.st', 'sapporo.jp', 'sark.gg',
        'sc.cn', 'sch.ae', 'sch.gg', 'sch.ir', 'sch.je', 'sch.ng', 'school.fj',
        'school.nz', 'school.za', 'sch.sa', 'sch.sd', 'sch.uk', 'sci.eg',
        'se.com', 'sec.ps', 'sendai.jp', 'seoul.kr', 'se.tt', 'sex.hu',
        'sex.pl', 'sh.cn', 'shiga.jp', 'shimane.jp', 'shizuoka.jp', 'shop.hu',
        'shop.pl', 'sk.ca', 'sklep.pl', 'sld.do', 'sld.pa', 'slg.br', 'sn.cn',
        'sos.pl', 'sport.hu', 'srv.br', 'sshn.se', 'store.co', 'store.ro',
        'store.st', 'store.ve', 'suli.hu', 'sx.cn', 'szex.hu', 'szkola.pl',
        'takamatsu.jp', 'targi.pl', 'tec.ve', 'telecom.na', 'telememo.au',
        'tel.no', 'tel.nr', 'tj.cn', 'tlf.nr', 'tm.fr', 'tm.hu', 'tm.mt',
        'tmp.br', 'tm.pl', 'tm.ro', 'tm.se', 'tm.za', 'tochigi.jp',
        'tokushima.jp', 'tokyo.jp', 'tottori.jp', 'tourism.pl', 'tourism.tn',
        'toyama.jp', 'tozsde.hu', 'travel.pl', 'travel.tt', 'trd.br', 'tur.br',
        'turystyka.pl', 'tv.br', 'tw.cn', 'uk.com', 'uk.net', 'uk.tt',
        'unam.na', 'us.com', 'us.tt', 'utazas.hu', 'utsunomiya.jp', 'uu.mt',
        'uy.com', 'vet.br', 'veterinaire.fr', 'video.hu', 'wakayama.jp',
        'web.co', 'web.do', 'web.pk', 'web.ve', 'web.za', 'www.ro', 'xj.cn',
        'xz.cn', 'yamagata.jp', 'yamaguci.jp', 'yamanashi.jp', 'yk.ca',
        'yn.cn', 'yokohama.jp', 'za.com', 'zj.cn', 'zlg.br'
        ]

        protos = ['http', 'https', 'ftp', 'ftps', 'webdav', 'gopher', 'rtsp',
                  'irc' , 'nntp' , 'pop', 'imap', 'smtp']

        # Remove whitspace and convert to lowercase
        hostname = domain.strip().lower()
        
        # Remove protocol
        for e in protos:
                hostname = hostname.replace(e + '://', "")
        
        # Remove everything after an : or /
        hostname = re.match('([^/:]+)', hostname).group()

        # Split on dots (subdomains)
        hostname = hostname.split('.')

        # If the domain has >3 parts and it's a common second-level domain,
        # take the last three parts
        if domain in tldlist and len(hostname) >= 3:
                domain = hostname[-3:]
        # If it isn't a common second-level domain or has 2 parts, take
        # the last two parts
        elif len(hostname) >= 2:
                domain = hostname[-2:]
        # If it has only one part, take it.
        else:
                domain = hostname

        # Add the dots again
        domain = '.'.join(domain)

        return(domain)

def minify_javascript(password):
#        js = """
#        
document.activeElement.forms,
        j, f, i;
        for (j = 0; j < F.length; ++j) {
                f = F[j];
                for (i = 0; i < f.length; ++i) {
                        if (f[i].type.toLowerCase() == "password") f[i].
value = {0}
#        """.format(password).strip()

        js 
"{0}";
                }
        }
})();


// one-liner:

(function() { var s 
"""
        
"", F = document.activeElement.forms, j, f, i; for (j = 0; j < F.length; ++j) { f = F[j]; for (i = 0; i < f.length; ++i) { if (f[i].type.toLowerCase() == "password") f[i].value = '{0}'
        """.format(password).strip()
        return(js)

def sha256hash(masterpassword):
        verify_hash = hashlib.sha256(masterpassword.encode('UTF-8')).hexdigest()
        return(verify_hash)

def verify_masterpassword(masterpassword):
        salt = config['verify']['salt']
        hash_config = config['verify']['hash']
        hash_given = sha256hash(salt + masterpassword)

        if hash_config == "":
                return(None)

        if hash_config == hash_given:
                return(True)
        else:
                return(False)

def call_zenity(*args):
        args = [ '--' + arg for arg in args ]

        try:
                out = subprocess.check_output(['zenity', '--title=superpassgen'] +
                                              args)
        except subprocess.CalledProcessError:
                sys.exit(0)

        out = out.decode('UTF-8').rstrip('\n')
        return(out)

def output_dwb(masterpassword):
        url = os.environ['DWB_URI']
        password = sgp(url, masterpassword)
        out = "js " + minify_javascript(password)

        if 'DWB_FIFO' in os.environ:
                print("Writing {0} to {1}".format(out, os.environ['DWB_FIFO']))
                out += '\n'
                with open(os.environ['DWB_FIFO'], 'w') as outfile:
                        outfile.write(out)

        else:
                print(out)

def output_console(masterpassword):
        verify_salt = base64.b64encode(os.urandom(48)).decode('UTF-8')
        masterpassword = verify_salt + masterpassword
        verify_hash = sha256hash(masterpassword)

        print("To turn on password verification, change the config at the top "
          "of the script to the following:")
        print()
        print("config = {")
        print("    'verify': {")
        print("        'hash': " + '"' + verify_hash + '",')
        print("        'salt': " + '"' + verify_salt + '",')
        print("    },")
        print("    ...")
        print("}")

def main():
        if 'DISPLAY' not in os.environ:
                raise OSError("DISPLAY is not set!")

        masterpassword = call_zenity('password')
        verification = verify_masterpassword(masterpassword)
        if verification == False:
                call_zenity('error', 'text=Wrong password!')
        # Calling this from DWB
        if 'DWB_URI' in os.environ: 
                print("Calling output_dwb")
                output_dwb(masterpassword)
        # Calling from the console
        else:
                output_console(masterpassword)

if __name__ == '__main__':
        main()
"{0}"; } } })();