summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2012-05-08 18:22:43 +0200
committerFlorian Bruhin <me@the-compiler.org>2012-05-08 18:22:43 +0200
commitbc45c241a6f6b199991b1e94642e0146edc95f77 (patch)
treebc2e55ae00add6c5fc41d21d1ee0122087f6706b
downloadsupergenpass-dwb-bc45c241a6f6b199991b1e94642e0146edc95f77.tar.gz
supergenpass-dwb-bc45c241a6f6b199991b1e94642e0146edc95f77.zip
Initial commit
-rwxr-xr-xsgp.py343
1 files changed, 343 insertions, 0 deletions
diff --git a/sgp.py b/sgp.py
new file mode 100755
index 0000000..6f5fa88
--- /dev/null
+++ b/sgp.py
@@ -0,0 +1,343 @@
+#!/usr/bin/python3
+# dwb: Control x
+
+import hashlib
+import base64
+import re
+import subprocess
+import os
+import sys
+
+
+config = {
+ 'verify': {
+ 'hash': "",
+ 'salt': "",
+ },
+ 'generate': {
+ 'length': 10,
+ '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 = ('''
+ (function() {
+ var s = "",
+ F = document.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 = "''' +
+ password + '''";
+ }
+ }
+ })();
+ ''')
+
+ js = "document.activeElement.value = '" + password + "'"
+
+ js = js.strip().replace('\n', ' ')
+
+ 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:
+ 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()