31 lines
1 KiB
Python
31 lines
1 KiB
Python
# Copyright The IETF Trust 2016-2020, All Rights Reserved
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
import io
|
|
import subprocess, hashlib
|
|
from django.utils.encoding import force_bytes
|
|
|
|
from django.conf import settings
|
|
|
|
def update_htpasswd_file(username, password):
|
|
if getattr(settings, 'USE_PYTHON_HTDIGEST', None):
|
|
pass_file = settings.HTPASSWD_FILE
|
|
realm = settings.HTDIGEST_REALM
|
|
prefix = force_bytes('%s:%s:' % (username, realm))
|
|
key = force_bytes(hashlib.md5(prefix + force_bytes(password)).hexdigest())
|
|
f = io.open(pass_file, 'r+b')
|
|
pos = f.tell()
|
|
line = f.readline()
|
|
while line:
|
|
if line.startswith(prefix):
|
|
break
|
|
pos=f.tell()
|
|
line = f.readline()
|
|
f.seek(pos)
|
|
f.write(b'%s%s\n' % (prefix, key))
|
|
f.close()
|
|
else:
|
|
p = subprocess.Popen([settings.HTPASSWD_COMMAND, "-b", settings.HTPASSWD_FILE, username, password], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
|
|
stdout, stderr = p.communicate()
|