#!/usr/bin/python3 # dwb: Control x import hashlib import base64 import re import subprocess import os import sys config = { 'verify': { 'hash': "", 'salt': "", }, 'generate': { 'length': 20, 'salt': "", 'strip_subdomains': True, }, } def b64_md5(string): md5 = hashlib.md5(string.encode('UTF-8')).digest() altchars = '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.value = {0} # """.format(password).strip() js = """ document.activeElement.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()
Title | Name | Language | UNIX | When |
---|---|---|---|---|
Re: sgp.py | anonymous | python | 1645238170 | 3 Months ago. |
Re: sgp.py | anonymous | python | 1645238089 | 3 Months ago. |
RE: sgp.py | anonymous | javascript | 1336246709 | 10 Years ago. |