import base64
import binascii
-from ganeti import utils
+from ganeti import compat
from ganeti import http
from cStringIO import StringIO
-try:
- from hashlib import md5
-except ImportError:
- from md5 import new as md5
-
-
# Digest types from RFC2617
HTTP_BASIC_AUTH = "Basic"
HTTP_DIGEST_AUTH = "Digest"
"""
# today we don't have per-request filtering, but we might want to
# add it in the future
- # pylint: disable-msg=W0613
+ # pylint: disable=W0613
return self.AUTH_REALM
def AuthenticationRequired(self, req):
@param req: HTTP request context
"""
+ # Unused argument, method could be a function
+ # pylint: disable=W0613,R0201
return False
def PreHandleRequest(self, req):
"""
try:
- creds = base64.b64decode(in_data.encode('ascii')).decode('ascii')
+ creds = base64.b64decode(in_data.encode("ascii")).decode("ascii")
except (TypeError, binascii.Error, UnicodeError):
logging.exception("Error when decoding Basic authentication credentials")
return False
# There can not be a valid password for this case
raise AssertionError("No authentication realm")
- expha1 = md5()
+ expha1 = compat.md5_hash()
expha1.update("%s:%s:%s" % (username, realm, password))
return (expected_password.lower() == expha1.hexdigest().lower())
self.options = options
-def ReadPasswordFile(file_name):
- """Reads a password file.
+def ParsePasswordFile(contents):
+ """Parses the contents of a password file.
Lines in the password file are of the following format::
options are optional and separated by comma (','). Empty lines and comments
('#') are ignored.
- @type file_name: str
- @param file_name: Path to password file
+ @type contents: str
+ @param contents: Contents of password file
@rtype: dict
@return: Dictionary containing L{PasswordFileUser} instances
"""
users = {}
- for line in utils.ReadFile(file_name).splitlines():
+ for line in contents.splitlines():
line = line.strip()
# Ignore empty lines and comments