whew, mumble user cert hashing done.
This commit is contained in:
parent
b3a3427a9a
commit
ce317bf3f7
89
mumble/gencerthash.py
Executable file
89
mumble/gencerthash.py
Executable file
@ -0,0 +1,89 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import getpass
|
||||||
|
import hashlib
|
||||||
|
try:
|
||||||
|
import OpenSSL # "python-pyopenssl" package on Arch
|
||||||
|
except ImportError:
|
||||||
|
exit('You need to install PyOpenSSL ("pip3 install --user PyOpenSSL" if pip3 is installed)')
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
|
||||||
|
class Hasher(object):
|
||||||
|
def __init__(self, args):
|
||||||
|
self.args = args
|
||||||
|
self.certChk()
|
||||||
|
self.getPass()
|
||||||
|
|
||||||
|
def certChk(self):
|
||||||
|
self.args['cert'] = os.path.abspath(os.path.expanduser(self.args['cert']))
|
||||||
|
if not os.path.lexists(self.args['cert']):
|
||||||
|
raise FileNotFoundError('{0} does not exist!'.format(self.args['cert']))
|
||||||
|
return()
|
||||||
|
|
||||||
|
def getPass(self):
|
||||||
|
# Do we need to get the passphrase?
|
||||||
|
if self.args['passphrase']:
|
||||||
|
if self.args['passphrase'] == 'stdin':
|
||||||
|
self.args['passphrase'] = sys.stdin.read().replace('\n', '')
|
||||||
|
elif self.args['passphrase'] == 'prompt':
|
||||||
|
_repeat = True
|
||||||
|
while _repeat == True:
|
||||||
|
_pass_in = getpass.getpass(('\n\033[1mWhat is the encryption password ' +
|
||||||
|
'for \033[91m{0}\033[0m\033[1m ?\033[0m ').format(self.args['cert']))
|
||||||
|
if not _pass_in or _pass_in == '':
|
||||||
|
print(('\n\033[1mInvalid passphrase for \033[91m{0}\033[0m\033[1m ; ' +
|
||||||
|
'please enter a valid passphrase!\033[0m ').format(self.args['cert']))
|
||||||
|
else:
|
||||||
|
_repeat = False
|
||||||
|
self.args['passphrase'] = _pass_in.replace('\n', '')
|
||||||
|
print()
|
||||||
|
else:
|
||||||
|
self.args['passphrase'] = None
|
||||||
|
return()
|
||||||
|
|
||||||
|
def importCert(self):
|
||||||
|
# Try loading the certificate
|
||||||
|
try:
|
||||||
|
with open(self.args['cert'], 'rb') as f:
|
||||||
|
self.pkcs = OpenSSL.crypto.load_pkcs12(f.read(), self.args['passphrase'])
|
||||||
|
except OpenSSL.crypto.Error:
|
||||||
|
exit('Could not load certificate! (Wrong passphrase?)')
|
||||||
|
return()
|
||||||
|
|
||||||
|
def hashCert(self):
|
||||||
|
self.crt = self.pkcs.get_certificate()
|
||||||
|
self.der = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_ASN1,
|
||||||
|
self.crt)
|
||||||
|
self.hash = hashlib.sha1(self.der).hexdigest().lower()
|
||||||
|
return(self.hash)
|
||||||
|
|
||||||
|
|
||||||
|
def parseArgs():
|
||||||
|
args = argparse.ArgumentParser()
|
||||||
|
args.add_argument('-p',
|
||||||
|
'--passphrase',
|
||||||
|
choices = ['stdin', 'prompt'],
|
||||||
|
dest = 'passphrase',
|
||||||
|
default = None,
|
||||||
|
help = ('The default is to behave as if your certificate does not have ' +
|
||||||
|
'a passphrase attached (as this is Mumble\'s default); however, ' +
|
||||||
|
'if you specify \'stdin\' we will expect the passphrase to be given as a stdin pipe, ' +
|
||||||
|
'if you specify \'prompt\', we will prompt you for a passphrase (it will not be echoed back' +
|
||||||
|
'to the console)'))
|
||||||
|
args.add_argument(dest = 'cert',
|
||||||
|
metavar = 'path/to/mumblecert.p12',
|
||||||
|
help = 'The path to your exported Mumble certificate.')
|
||||||
|
return(args)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
args = vars(parseArgs().parse_args())
|
||||||
|
cert = Hasher(args)
|
||||||
|
cert.importCert()
|
||||||
|
h = cert.hashCert()
|
||||||
|
print('\n\t\033[1mYour certificate\'s public hash is: \033[94m{0}\033[0m'.format(h))
|
||||||
|
print('\n\t\033[1mPlease provide this to the Mumble server administrator that has requested it.\033[0m')
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
@ -67,6 +67,7 @@ class Manager(object):
|
|||||||
if not _pass_in or _pass_in == '':
|
if not _pass_in or _pass_in == '':
|
||||||
print('Invalid password. Please re-enter: ')
|
print('Invalid password. Please re-enter: ')
|
||||||
else:
|
else:
|
||||||
|
_repeat = False
|
||||||
self.args['password'] = hashlib.sha1(_pass_in.replace('\n', '').encode('utf-8')).hexdigest().lower()
|
self.args['password'] = hashlib.sha1(_pass_in.replace('\n', '').encode('utf-8')).hexdigest().lower()
|
||||||
# Insert into the "users" table
|
# Insert into the "users" table
|
||||||
# I spit on the Mumble developers for not using https://sqlite.org/autoinc.html.
|
# I spit on the Mumble developers for not using https://sqlite.org/autoinc.html.
|
||||||
|
Loading…
Reference in New Issue
Block a user