├── tests ├── __init__.py ├── database_files │ ├── empty.kdbx │ ├── empty_keyfile │ ├── empty_keyfile.kdbx │ ├── duplicate_entry.kdbx │ ├── recycle_bin_test.kdbx │ ├── generic_has_passwords.kdbx │ └── empty_password_is_test.kdbx ├── keepassxc.cli ├── common.py ├── test_pexpect.py ├── test_recycle_bin.py ├── test_user_input.py ├── test_utils.py ├── test_duplicate_entry.py ├── test_keepassxc_wrapper.py ├── test_password.py ├── test_auth.py ├── test_parser.py ├── test_generic_database.py └── vcr_cassettes │ ├── pwned_passwords_api_response.txt │ ├── test_user_password_fails.yaml │ ├── test_user_password_succeeds.yaml │ ├── check_password.yaml │ └── test_default.yaml ├── requirements.txt ├── requirements-dev.txt ├── keepassxc_pwned ├── __init__.py ├── __main__.py ├── utils.py ├── exceptions.py ├── cache.py ├── log.py ├── password.py ├── cli.py ├── keepass_wrapper.py └── parser.py ├── MANIFEST.in ├── .travis.yml ├── Makefile ├── LICENSE ├── setup.py ├── .gitignore └── README.md /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | requests>=2.22.0 2 | Click>=7.0 3 | -------------------------------------------------------------------------------- /tests/database_files/empty.kdbx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purarue/keepassxc-pwned/HEAD/tests/database_files/empty.kdbx -------------------------------------------------------------------------------- /tests/database_files/empty_keyfile: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purarue/keepassxc-pwned/HEAD/tests/database_files/empty_keyfile -------------------------------------------------------------------------------- /tests/keepassxc.cli: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # wrapper script to test changing the name of the keepassxc-cli bininary 3 | keepassxc-cli "$@" 4 | -------------------------------------------------------------------------------- /tests/database_files/empty_keyfile.kdbx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purarue/keepassxc-pwned/HEAD/tests/database_files/empty_keyfile.kdbx -------------------------------------------------------------------------------- /tests/database_files/duplicate_entry.kdbx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purarue/keepassxc-pwned/HEAD/tests/database_files/duplicate_entry.kdbx -------------------------------------------------------------------------------- /tests/database_files/recycle_bin_test.kdbx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purarue/keepassxc-pwned/HEAD/tests/database_files/recycle_bin_test.kdbx -------------------------------------------------------------------------------- /tests/database_files/generic_has_passwords.kdbx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purarue/keepassxc-pwned/HEAD/tests/database_files/generic_has_passwords.kdbx -------------------------------------------------------------------------------- /requirements-dev.txt: -------------------------------------------------------------------------------- 1 | codecov>=2.1.5 2 | mypy>=0.780 3 | pexpect>=4.8.0 4 | pytest>=5.4.3 5 | pytest-cov>=2.10.0 6 | responses>=0.10.15 7 | vcrpy>=4.0.2 8 | -------------------------------------------------------------------------------- /tests/database_files/empty_password_is_test.kdbx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/purarue/keepassxc-pwned/HEAD/tests/database_files/empty_password_is_test.kdbx -------------------------------------------------------------------------------- /keepassxc_pwned/__init__.py: -------------------------------------------------------------------------------- 1 | from .log import setup_logs 2 | 3 | # called when anything is imported from this package 4 | setup_logs() 5 | 6 | from .password import lookup_pwned as check_password 7 | from .exceptions import PwnedPasswordException 8 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE 2 | include README.md 3 | include requirements.txt 4 | 5 | exclude Makefile 6 | exclude .travis.yml 7 | exclude requirements-dev.txt 8 | 9 | recursive-exclude * __pycache__ 10 | recursive-exclude * *.py[co] 11 | recursive-exclude tests 12 | -------------------------------------------------------------------------------- /tests/common.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shlex 3 | import pathlib 4 | 5 | import pytest 6 | 7 | from keepassxc_pwned.parser import Database, Credential 8 | 9 | this_dir = os.path.abspath(os.path.dirname(__file__)) 10 | db_files = os.path.join(this_dir, "database_files") 11 | -------------------------------------------------------------------------------- /keepassxc_pwned/__main__.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | from getpass import getpass 4 | 5 | from . import check_password 6 | 7 | count: int = check_password(getpass("Password to check: ")) 8 | if count > 0: 9 | print("Found password {} times!".format(count)) 10 | sys.exit(1) 11 | else: 12 | print("Could not find that password in the dataset.") 13 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | dist: xenial 3 | python: 4 | - "3.6" 5 | - "3.7" 6 | - "3.8" 7 | before_install: 8 | - sudo add-apt-repository -y ppa:phoerious/keepassxc 9 | - sudo apt-get -q update 10 | - sudo apt-get -y install keepassxc 11 | - pip install -r requirements-dev.txt 12 | install: 13 | - python3 setup.py install 14 | addons: 15 | apt: 16 | update: true 17 | script: 18 | - mypy keepassxc_pwned 19 | - pytest --cov-report term --cov=keepassxc_pwned tests/ 20 | after_success: 21 | - codecov 22 | 23 | -------------------------------------------------------------------------------- /keepassxc_pwned/utils.py: -------------------------------------------------------------------------------- 1 | class AutoRepr: 2 | """ 3 | Automatically creates a repr for a class given a list of attributes 4 | """ 5 | 6 | # must have self.__class__.attrs set 7 | def __repr__(self) -> str: 8 | assert self.__class__.attrs is not None # type: ignore 9 | 10 | return "{}({})".format( 11 | self.__class__.__name__, 12 | ", ".join([ 13 | "{}={}".format(a, repr(getattr(self, a, None))) 14 | for a in self.__class__.attrs # type: ignore 15 | ]), 16 | ) 17 | 18 | def __str__(self) -> str: 19 | return self.__repr__() 20 | -------------------------------------------------------------------------------- /keepassxc_pwned/exceptions.py: -------------------------------------------------------------------------------- 1 | from typing import Mapping, Any 2 | 3 | from .utils import AutoRepr 4 | 5 | 6 | class PwnedPasswordException(AutoRepr, Exception): 7 | """ 8 | PwnedPassword API Client Errors (>=400, excluding 429) 9 | """ 10 | 11 | attrs = ["url", "status_code", "http_text"] 12 | 13 | def __init__(self, message: Mapping[str, Any]): 14 | self.url = message["url"] 15 | self.status_code = message["status_code"] 16 | self.http_text = message["http_text"] 17 | 18 | super(PwnedPasswordException, self).__init__(str(self)) 19 | 20 | def __str__(self) -> str: 21 | return "Error fetching {}\n{}: {}".format(self.url, self.status_code, 22 | self.http_text) 23 | -------------------------------------------------------------------------------- /keepassxc_pwned/cache.py: -------------------------------------------------------------------------------- 1 | from time import sleep 2 | 3 | from .password import lookup_pwned 4 | 5 | 6 | class PasswordCache(dict): 7 | """ 8 | If the password hash has not been requested before, requests it. 9 | If you have the same password for many entries, this would only request that once. 10 | """ 11 | def __missing__(self, key: str) -> int: 12 | """ 13 | Looks up the occurrence count for the sha1 value passed as key 14 | """ 15 | count: int = lookup_pwned(pw_hash=key) 16 | sleep(2) 17 | self[key] = count 18 | return count 19 | 20 | def __setitem__(self, key: str, value: int): 21 | """ 22 | sets sha1 -> occurence_count 23 | """ 24 | super(PasswordCache, self).__setitem__(key, value) 25 | -------------------------------------------------------------------------------- /keepassxc_pwned/log.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import logging 3 | 4 | logger: logging.Logger = logging.getLogger("keepassxc_pwned") 5 | 6 | 7 | def setup_logs(log_level: int = logging.INFO): 8 | """ 9 | Setup the global logger 10 | This does not setup logs more than once. 11 | """ 12 | global logger 13 | if logger.handlers: 14 | return # logs have already been set up 15 | logger = logging.getLogger("keepassxc_pwned") 16 | sh = logging.StreamHandler(sys.stdout) 17 | sh.setLevel(log_level) 18 | sh.setFormatter(logging.Formatter("%(msg)s")) 19 | logger.addHandler(sh) 20 | 21 | 22 | def set_level(log_level: int = logging.INFO): 23 | """ 24 | Sets the log level for the application 25 | """ 26 | global logger 27 | logger.setLevel(log_level) 28 | for handler in logger.handlers: 29 | handler.setLevel(log_level) 30 | -------------------------------------------------------------------------------- /tests/test_pexpect.py: -------------------------------------------------------------------------------- 1 | # test the command line interface 2 | 3 | from copy import deepcopy 4 | 5 | from .common import * 6 | 7 | import pexpect 8 | import shutil 9 | 10 | test_kdbx_db = os.path.join(db_files, "empty.kdbx") 11 | 12 | protected_keyfile = os.path.join(db_files, "empty_password_is_test.kdbx") 13 | 14 | 15 | def test_environment_auth(): 16 | keepassxc_binary_loc = shutil.which("keepassxc_pwned") 17 | p = shlex.split("{} {}".format(keepassxc_binary_loc, protected_keyfile)) 18 | environment = deepcopy(os.environ) 19 | environment["KEEPASSXC_PWNED_PASSWD"] = "test" 20 | child_proc = pexpect.spawn(" ".join(p), cwd=this_dir, env=environment) 21 | child_proc.wait() 22 | output = child_proc.read().decode("utf-8") 23 | last_line = output.splitlines()[-1] 24 | assert len(output.splitlines()) == 1 25 | assert last_line == "None of your passwords have been found breached." 26 | -------------------------------------------------------------------------------- /tests/test_recycle_bin.py: -------------------------------------------------------------------------------- 1 | # Make sure that entries in the recycle bin are ignored 2 | 3 | from keepassxc_pwned.parser import Database, Credential 4 | 5 | from .common import * 6 | 7 | 8 | @pytest.fixture 9 | def database(): 10 | db_file_loc = os.path.join(db_files, "recycle_bin_test.kdbx") 11 | db = Database(pathlib.Path(db_file_loc)) 12 | db._password = "recycle_bin_test" 13 | return db 14 | 15 | 16 | def test_count(database): 17 | """ 18 | There are 3 items in the test_recycle_bin.kdbx that exist 19 | but one is in the Recycle Bin, make sure that its ignored 20 | """ 21 | assert len(database.credentials) == 2 22 | 23 | 24 | def test_credentials(database): 25 | credentials = database.credentials 26 | assert type(credentials[0]) == Credential 27 | cred = credentials[0] 28 | assert cred.sha1 == "30274C47903BD1BAC7633BBF09743149EBAB805F" 29 | assert cred.password == "passwd" 30 | assert credentials[0] != credentials[1] 31 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .DEFAULT_GOAL := help 2 | 3 | 4 | define PRINT_HELP_PYSCRIPT 5 | import re, sys 6 | 7 | for line in sys.stdin: 8 | match = re.match(r'^([a-zA-Z_-]+):.*?## (.*)$$', line) 9 | if match: 10 | target, help = match.groups() 11 | print("%-20s %s" % (target, help)) 12 | endef 13 | export PRINT_HELP_PYSCRIPT 14 | 15 | BROWSER := python -c "$$BROWSER_PYSCRIPT" 16 | 17 | help: 18 | @python -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) 19 | 20 | clean: clean-build clean-pyc ## remove all build Python artifacts 21 | 22 | clean-build: ## remove build artifacts 23 | rm -fr build/ 24 | rm -fr dist/ 25 | rm -fr .eggs/ 26 | 27 | clean-pyc: ## remove Python file artifacts 28 | find . -name '*.pyc' -exec rm -f {} + 29 | find . -name '*.pyo' -exec rm -f {} + 30 | find . -name '*~' -exec rm -f {} + 31 | find . -name '__pycache__' -exec rm -fr {} + 32 | 33 | dist: clean ## builds source package 34 | python3 setup.py sdist 35 | #python3 setup.py bdist_wheel 36 | ls -l dist 37 | 38 | install: clean ## install the package to the active Python's site-packages 39 | python3 setup.py install 40 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019, purarue 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /tests/test_user_input.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import vcr 3 | 4 | from unittest.mock import patch 5 | from .common import * 6 | 7 | from getpass import getpass 8 | 9 | 10 | @vcr.use_cassette("tests/vcr_cassettes/test_user_password_fails.yaml") 11 | @patch("getpass.getpass") 12 | def test_user_input_password_found(getpass, capsys): 13 | getpass.return_value = "test" 14 | with pytest.raises(SystemExit): 15 | import keepassxc_pwned.__main__ 16 | captured = capsys.readouterr() 17 | captured_lines = captured.out.splitlines() 18 | assert len(captured_lines) == 1 19 | assert captured_lines[0] == "Found password 76479 times!" 20 | 21 | 22 | @vcr.use_cassette("tests/vcr_cassettes/test_user_password_succeeds.yaml") 23 | @patch("getpass.getpass") 24 | def test_user_input_password_not_found(getpass, capsys): 25 | getpass.return_value = "^lL2fY@B82C[UHbpd`B[0QO#Ky5Im-D+63F%nwe40iQ*Pt`Sqyn6Q0u254.2I?Vf4!+U83[lYl[=E6iU6v=hZ-9a5y3=o.^VO36=" 26 | import keepassxc_pwned.__main__ 27 | 28 | captured = capsys.readouterr() 29 | captured_lines = captured.out.splitlines() 30 | assert len(captured_lines) == 1 31 | assert captured_lines[0] == "Could not find that password in the dataset." 32 | del sys.modules['keepassxc_pwned.__main__'] 33 | -------------------------------------------------------------------------------- /tests/test_utils.py: -------------------------------------------------------------------------------- 1 | # test AutoRepr 2 | 3 | import logging 4 | 5 | from keepassxc_pwned.utils import AutoRepr 6 | from keepassxc_pwned.log import logger, setup_logs 7 | 8 | from .common import * 9 | 10 | 11 | class Entry(AutoRepr): 12 | 13 | attrs = ["one", "two"] 14 | 15 | def __init__(self, one, two): 16 | self.one = one 17 | self.two = two 18 | 19 | 20 | @pytest.fixture() 21 | def entry(): 22 | e = Entry(1, 2) 23 | return e 24 | 25 | 26 | def test_repr(entry): 27 | repr_entry = repr(entry) 28 | assert isinstance(repr_entry, str) 29 | assert repr_entry == "Entry(one=1, two=2)" 30 | 31 | 32 | def test_str(entry): 33 | str_entry = str(entry) 34 | assert isinstance(str_entry, str) 35 | assert str_entry == "Entry(one=1, two=2)" 36 | 37 | 38 | def test_logs(caplog): 39 | # call setup_logs again to make sure it exits early 40 | with caplog.at_level(logging.INFO, logger="keepassxc_pwned"): 41 | logger.info("message one") 42 | setup_logs() 43 | setup_logs() 44 | with caplog.at_level(logging.INFO, logger="keepassxc_pwned"): 45 | logger.info("message two") 46 | assert len(caplog.records) == 2 47 | assert "message one" == caplog.records[0].getMessage() 48 | assert "message two" == caplog.records[1].getMessage() 49 | -------------------------------------------------------------------------------- /tests/test_duplicate_entry.py: -------------------------------------------------------------------------------- 1 | import vcr 2 | 3 | from .common import * 4 | 5 | from keepassxc_pwned.cli import main_wrapper 6 | from keepassxc_pwned.parser import Database 7 | 8 | db_file_loc = os.path.join(db_files, "duplicate_entry.kdbx") 9 | db_pw = "duplicate_entry" 10 | 11 | 12 | @pytest.fixture() 13 | def database(): 14 | db: Database = Database(pathlib.Path(db_file_loc)) 15 | db._password = db_pw 16 | return db 17 | 18 | 19 | def test_entry_count(database): 20 | assert len(database.credentials) == 3 21 | 22 | 23 | # pass -q flag 24 | @vcr.use_cassette("tests/vcr_cassettes/test_default.yaml") 25 | def test_default(capsys, caplog): 26 | os.environ["KEEPASSXC_PWNED_PASSWD"] = "duplicate_entry" 27 | main_wrapper(False, None, False, True, db_file_loc, None) 28 | captured = capsys.readouterr() 29 | captured_lines = captured.out.splitlines() 30 | for output, expected in zip( 31 | captured_lines, 32 | [ 33 | "Found 3 previously breached passwords:", 34 | "entry:5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8:3730471", 35 | "entry:5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8:3730471", 36 | "5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8:5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8:3730471", 37 | ], 38 | ): 39 | assert output == expected 40 | assert len(captured_lines) == 4 41 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | import io 5 | from setuptools import setup, find_packages 6 | 7 | with io.open("requirements.txt", 'r', encoding='utf-8') as req_file: 8 | requirements = req_file.read().splitlines() 9 | 10 | with io.open("README.md", 'r', encoding='utf-8') as readme: 11 | readme_contents = readme.read() 12 | 13 | setup( 14 | author="purarue", 15 | classifiers=[ 16 | 'Development Status :: 3 - Alpha', 17 | 'Intended Audience :: End Users/Desktop', 18 | 'Natural Language :: English', 19 | 'Programming Language :: Python :: 3.6', 20 | 'Programming Language :: Python :: 3.7', 21 | 'Programming Language :: Python :: 3.8', 22 | 'Programming Language :: Python :: 3.9', 23 | ], 24 | install_requires=requirements, 25 | description="Check your keepassxc database against previously breached haveibeenpwned passwords", 26 | license="MIT", 27 | long_description=readme_contents, 28 | long_description_content_type="text/markdown", 29 | include_package_data=True, 30 | keywords='keepassxc password-strength password', 31 | name='keepassxc-pwned', 32 | packages=find_packages(include=['keepassxc_pwned']), 33 | entry_points = { 34 | 'console_scripts': [ 35 | "keepassxc_pwned = keepassxc_pwned.cli:main" 36 | ] 37 | }, 38 | url='https://github.com/purarue/keepassxc-pwned', 39 | version='0.3.1', 40 | zip_safe=True, 41 | ) 42 | -------------------------------------------------------------------------------- /tests/test_keepassxc_wrapper.py: -------------------------------------------------------------------------------- 1 | from distutils.version import StrictVersion 2 | from unittest.mock import patch 3 | 4 | from keepassxc_pwned.keepass_wrapper import KeepassWrapper 5 | 6 | from .common import * 7 | 8 | # use keepassxc.cli wrapper script to test changing location of keepassxc-cli 9 | keepass_different_binary = os.path.abspath( 10 | os.path.join(this_dir, "keepassxc.cli")) 11 | 12 | 13 | class OldKeepassWrapper(KeepassWrapper): 14 | def version(self) -> StrictVersion: 15 | return StrictVersion("2.4.9") 16 | 17 | 18 | class VersionError(KeepassWrapper): 19 | def version(self): 20 | return StrictVersion("2.5.a") # raises ValueError 21 | 22 | 23 | def test_is_strict_version(): 24 | assert isinstance(KeepassWrapper().version(), StrictVersion) 25 | 26 | 27 | def test_subcommand_old(): 28 | assert OldKeepassWrapper().backwards_compatible_export() == "extract" 29 | 30 | 31 | def test_subcommand_new(): 32 | assert KeepassWrapper().backwards_compatible_export() == "export" 33 | 34 | 35 | def test_issue_parsing_version_string(): 36 | # should return "export" by default (newer syntax) 37 | assert VersionError().backwards_compatible_export() == "export" 38 | 39 | 40 | @patch("shutil.which", return_value=None) 41 | def test_no_keepass_cli(mock_shutil_which, caplog): 42 | # with default keepassxc-cli as --keepassxc-cli flag (binary) 43 | with pytest.raises(SystemExit): 44 | assert KeepassWrapper().verify_binary_exists() 45 | assert ("Could not find a binary called keepassxc-cli on your $PATH." 46 | in caplog.text) 47 | 48 | 49 | def test_use_different_binary(): 50 | k = KeepassWrapper(keepass_different_binary) 51 | assert k.keepassxc_cli_location == keepass_different_binary 52 | assert k.backwards_compatible_export() == "export" 53 | -------------------------------------------------------------------------------- /tests/test_password.py: -------------------------------------------------------------------------------- 1 | import vcr 2 | import responses 3 | 4 | from keepassxc_pwned import check_password, PwnedPasswordException 5 | 6 | from .common import * 7 | 8 | vcr_dir = os.path.join(this_dir, "vcr_cassettes") 9 | 10 | 11 | @vcr.use_cassette("tests/vcr_cassettes/check_password.yaml") 12 | def test_check_password(): 13 | count = check_password(passwd="password") 14 | assert count == 3730471 15 | 16 | 17 | def test_lookup_pwned_user_error(): 18 | with pytest.raises(ValueError) as user_error: 19 | check_password(passwd=None, pw_hash=None) 20 | assert str( 21 | user_error.value) == "You must pass either 'passwd' or 'pw_hash'" 22 | 23 | 24 | @responses.activate 25 | def test_no_user_agent(): 26 | api_url = "https://api.pwnedpasswords.com/range/5BAA6" 27 | responses.add(responses.GET, 28 | api_url, 29 | json={"error": "no user agent"}, 30 | status=403) 31 | with pytest.raises(PwnedPasswordException) as no_user_agent: 32 | check_password("password") 33 | assert no_user_agent.value.status_code == 403 34 | assert no_user_agent.value.url == api_url 35 | assert len(responses.calls) == 1 36 | 37 | 38 | @responses.activate 39 | def test_hit_rate_limit(): 40 | api_url = "https://api.pwnedpasswords.com/range/5BAA6" 41 | successful_response = os.path.join(vcr_dir, 42 | "pwned_passwords_api_response.txt") 43 | with open(successful_response, "r") as success: 44 | success_text = success.read() 45 | responses.add(responses.GET, 46 | api_url, 47 | body="error: exceeded rate limit", 48 | status=429) 49 | responses.add(responses.GET, api_url, body=success_text, status=200) 50 | count = check_password("password") 51 | assert count == 3000000 52 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | tags* 2 | 3 | # Mac 4 | *.DS_Store 5 | 6 | # Emacs 7 | *~ 8 | .[#]*[#] 9 | [#]*[#] 10 | 11 | # Byte-compiled / optimized / DLL files 12 | __pycache__/ 13 | *.py[cod] 14 | *$py.class 15 | 16 | # C extensions 17 | *.so 18 | 19 | # Distribution / packaging 20 | .Python 21 | env/ 22 | build/ 23 | develop-eggs/ 24 | dist/ 25 | downloads/ 26 | eggs/ 27 | .eggs/ 28 | lib/ 29 | lib64/ 30 | parts/ 31 | sdist/ 32 | var/ 33 | wheels/ 34 | *.egg-info/ 35 | .installed.cfg 36 | *.egg 37 | 38 | # PyInstaller 39 | # Usually these files are written by a python script from a template 40 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 41 | *.manifest 42 | *.spec 43 | 44 | # Installer logs 45 | pip-log.txt 46 | pip-delete-this-directory.txt 47 | 48 | # Unit test / coverage reports 49 | htmlcov/ 50 | .tox/ 51 | .coverage 52 | .coverage.* 53 | .cache 54 | nosetests.xml 55 | coverage.xml 56 | *.cover 57 | .hypothesis/ 58 | .pytest_cache/ 59 | 60 | # Translations 61 | *.mo 62 | *.pot 63 | 64 | # Django stuff: 65 | *.log 66 | local_settings.py 67 | 68 | # Flask stuff: 69 | instance/ 70 | .webassets-cache 71 | 72 | # Scrapy stuff: 73 | .scrapy 74 | 75 | # Sphinx documentation 76 | docs/_build/ 77 | 78 | # PyBuilder 79 | target/ 80 | 81 | # Jupyter Notebook 82 | .ipynb_checkpoints 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # celery beat schedule file 88 | celerybeat-schedule 89 | 90 | # SageMath parsed files 91 | *.sage.py 92 | 93 | # dotenv 94 | .env 95 | 96 | # virtualenv 97 | .venv 98 | venv/ 99 | ENV/ 100 | Pipfile.lock 101 | 102 | # Spyder project settings 103 | .spyderproject 104 | .spyproject 105 | 106 | # Rope project settings 107 | .ropeproject 108 | 109 | # mkdocs documentation 110 | /site 111 | 112 | # mypy 113 | .mypy_cache/ 114 | -------------------------------------------------------------------------------- /tests/test_auth.py: -------------------------------------------------------------------------------- 1 | # Test non-interactive authentication methods 2 | 3 | from keepassxc_pwned.parser import Database 4 | from keepassxc_pwned.cli import main_wrapper 5 | 6 | from .common import * 7 | 8 | test_kdbx_db = os.path.join(db_files, "empty.kdbx") 9 | 10 | key_file = os.path.join(db_files, "empty_keyfile") 11 | key_protected_kdbx_db = os.path.join(db_files, "empty_keyfile.kdbx") 12 | 13 | kdbx_password = "password" 14 | 15 | 16 | @pytest.fixture() 17 | def empty_db(): 18 | db = Database(pathlib.Path(test_kdbx_db)) 19 | db._password = kdbx_password 20 | return db 21 | 22 | 23 | @pytest.fixture() 24 | def empty_db_keyfile(): 25 | db = Database(pathlib.Path(key_protected_kdbx_db), pathlib.Path(key_file)) 26 | db._password = kdbx_password 27 | return db 28 | 29 | 30 | @pytest.fixture() 31 | def empty_db_with_environment_var(): 32 | os.environ["KEEPASSXC_PWNED_PASSWD"] = kdbx_password 33 | db = Database(pathlib.Path(test_kdbx_db)) 34 | return db 35 | 36 | 37 | def test_empty_db(empty_db): 38 | assert len(empty_db.credentials) == 0 39 | 40 | 41 | def test_empty_db_raises_exit(empty_db): 42 | empty_db._password = "wrong password" 43 | with pytest.raises(SystemExit): 44 | empty_db._call_keepassxc_cli() 45 | assert empty_db._xml_tree is None 46 | 47 | 48 | def test_empty_db_keyfile(empty_db_keyfile): 49 | assert len(empty_db_keyfile.credentials) == 0 50 | 51 | 52 | def test_empty_db_with_environment_var(empty_db_with_environment_var): 53 | assert len(empty_db_with_environment_var.credentials) == 0 54 | 55 | 56 | def test_keyfile_with_main_wrapper(capsys): 57 | os.environ["KEEPASSXC_PWNED_PASSWD"] = kdbx_password 58 | main_wrapper(False, key_file, False, True, key_protected_kdbx_db, None) 59 | captured = capsys.readouterr() 60 | captured_lines = captured.out.splitlines() 61 | assert 1 == len(captured_lines) 62 | assert captured_lines[ 63 | 0] == "None of your passwords have been found breached." 64 | -------------------------------------------------------------------------------- /keepassxc_pwned/password.py: -------------------------------------------------------------------------------- 1 | import time 2 | import hashlib 3 | 4 | from typing import Optional 5 | 6 | import requests 7 | 8 | from .log import logger 9 | from .exceptions import PwnedPasswordException 10 | 11 | default_headers = {"User-Agent": "keepassxc-pwned"} 12 | 13 | 14 | def request_password_hash(hash_head: str) -> requests.Response: 15 | """ 16 | Requests the Response object for the corresponding hash head (5 chars) 17 | Raises PwnedPasswordException on unrecoverable errors 18 | """ 19 | url = "https://api.pwnedpasswords.com/range/" + hash_head 20 | logger.debug("Requesting {}".format(url)) 21 | res = requests.get(url, headers=default_headers) 22 | if res.status_code >= 400: 23 | # on occasion I've had random 409 cloudflare errors 24 | if res.status_code in [ 25 | 400, 403, 404 26 | ]: # https://haveibeenpwned.com/API/v2#ResponseCodes 27 | raise PwnedPasswordException({ 28 | "url": url, 29 | "status_code": res.status_code, 30 | "http_text": res.text 31 | }) 32 | else: 33 | logger.warning("Request failed, retrying...") 34 | time.sleep(10) 35 | return request_password_hash(hash_head) 36 | return res 37 | 38 | 39 | # Adapted from: https://github.com/mikepound/pwned-search/blob/8efd8ffedd398756e26d52ef51206ba6d8e28f57/pwned.py#L12 40 | def lookup_pwned(passwd: Optional[str] = None, 41 | pw_hash: Optional[str] = None) -> int: 42 | """ 43 | Returns number of times password was seen in pwned database 44 | Raises PwnedPasswordException on unrecoverable errors 45 | """ 46 | if pw_hash is None: 47 | if passwd is not None: 48 | pw_hash = hashlib.sha1(passwd.encode("utf-8")).hexdigest().upper() 49 | else: 50 | raise ValueError("You must pass either 'passwd' or 'pw_hash'") 51 | head, tail = pw_hash[:5], pw_hash[5:] 52 | res: requests.Response = request_password_hash(head) 53 | hashes = (line.split(":") for line in res.text.splitlines()) 54 | count = next((int(count) for t, count in hashes if t == tail), 0) 55 | return count 56 | -------------------------------------------------------------------------------- /tests/test_parser.py: -------------------------------------------------------------------------------- 1 | # test Credential/Database functions 2 | 3 | from unittest.mock import patch 4 | 5 | from keepassxc_pwned.parser import Database, Credential 6 | 7 | from .common import * 8 | 9 | db_file_loc = os.path.join(db_files, "duplicate_entry.kdbx") 10 | 11 | 12 | @pytest.fixture() 13 | def database(): 14 | db: Database = Database(pathlib.Path(db_file_loc)) 15 | db._password = "duplicate_entry" 16 | return db 17 | 18 | 19 | @pytest.fixture() 20 | def empty_credential(database): 21 | credentials = database.credentials 22 | cred0 = credentials[0] 23 | for attr in Credential.parsed_attrs: 24 | if hasattr(cred0, attr): 25 | delattr(cred0, attr) 26 | return cred0 27 | 28 | 29 | @pytest.fixture() 30 | def basic_credential(database): 31 | credentials = database.credentials 32 | cred0 = credentials[0] 33 | return cred0 34 | 35 | 36 | def test_matching_credentials(database): 37 | one, two, incomplete = database.credentials 38 | assert one == two 39 | assert one.password == two.password 40 | assert incomplete.password == two.password 41 | assert incomplete.username is None 42 | assert incomplete.title is None 43 | assert one._sha1 is None 44 | assert one.sha1 == "5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8" 45 | assert one._sha1 == "5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8" 46 | 47 | 48 | def test_database_cached_values(database): 49 | assert database._xml_tree is None 50 | database.xml_tree 51 | assert database._xml_tree is not None 52 | database.xml_tree 53 | assert database._credentials is None 54 | database.credentials 55 | assert database._credentials is not None 56 | database.credentials 57 | 58 | 59 | # @patch("getpass.getpass") 60 | # def test_database_password(patched_getpass): 61 | # patched_getpass.return_value = "" 62 | # database: Database = Database(pathlib.Path(db_file_loc)) 63 | # assert database._password is None 64 | # assert database._credentials is None 65 | # with pytest.raises(SystemExit): 66 | # database.credentials 67 | # assert database._credentials is None 68 | # 69 | 70 | 71 | def test_type_not_credential(basic_credential): 72 | assert "5" != basic_credential 73 | 74 | 75 | def test_no_attributes(empty_credential, basic_credential): 76 | setattr(empty_credential, "password", 77 | "doesnt_match") # causes attribute error else 78 | assert empty_credential == basic_credential 79 | 80 | 81 | def test_display_fails(empty_credential): 82 | assert empty_credential.display() is None 83 | -------------------------------------------------------------------------------- /keepassxc_pwned/cli.py: -------------------------------------------------------------------------------- 1 | import pathlib 2 | import logging 3 | 4 | from typing import Mapping, List 5 | 6 | import click 7 | 8 | from .log import logger, set_level 9 | from .exceptions import PwnedPasswordException 10 | 11 | 12 | @click.command() 13 | @click.option( 14 | "-p", 15 | "--plaintext", 16 | default=False, 17 | is_flag=True, 18 | help="Print breached passwords in plaintext; defaults to sha1 hashes.") 19 | @click.option("-k", 20 | "--key-file", 21 | required=False, 22 | type=click.Path(exists=True), 23 | help="Key file for the database") 24 | @click.option("-v", 25 | "--verbose", 26 | default=False, 27 | is_flag=True, 28 | help="Print debug messages") 29 | @click.option("-q", 30 | "--quiet", 31 | default=False, 32 | is_flag=True, 33 | help="Don't print status messages, just the summary") 34 | @click.option("--keepassxc-cli", 35 | type=click.Path(exists=True), 36 | help="Specify a different location for the keepassxc-cli binary") 37 | @click.argument("database", required=True, type=click.Path(exists=True)) 38 | def main(plaintext, key_file, verbose, quiet, database, keepassxc_cli): 39 | """Check a keepassxc database against previously cracked haveibeenpwned passwords""" 40 | main_wrapper(plaintext, key_file, verbose, quiet, database, keepassxc_cli) 41 | 42 | 43 | def main_wrapper(plaintext, key_file, verbose, quiet, database, 44 | keepassxc_cli_location): 45 | """Called from main click command""" 46 | 47 | # setup logs before other imports to ensure correct log level 48 | log_level: int = logging.INFO 49 | # cant run verbose and quiet simultaneously, choose higher value 50 | if verbose: 51 | log_level = logging.DEBUG 52 | elif quiet: 53 | log_level = logging.ERROR 54 | 55 | set_level(log_level) 56 | 57 | from .parser import Database, Credential 58 | from .cache import PasswordCache 59 | 60 | if keepassxc_cli_location is not None: 61 | keepassxc_cli_location = pathlib.Path(keepassxc_cli_location) 62 | if key_file is not None: 63 | key_file: pathlib.Path = pathlib.Path(key_file) 64 | db: Database = Database(pathlib.Path(database), key_file, 65 | keepassxc_cli_location) 66 | # maps sha1 hashes to credentials and their occurrence counts 67 | breached_passwords: List[Credential] = [] 68 | pw_cache: Mapping[str, int] = PasswordCache() 69 | for credential in db.credentials: 70 | logger.info("Checking password for {}...".format(credential.display())) 71 | # pw_cache __missing__ makes the http request to get the count 72 | try: 73 | occurrence_count = pw_cache[credential.sha1] 74 | if occurrence_count > 0: 75 | logger.info( 76 | "Found password for '{}' {} times in the dataset!".format( 77 | credential.display(), occurrence_count)) 78 | breached_passwords.append(credential) 79 | except PwnedPasswordException as http_err: 80 | logger.critical(str(http_err)) 81 | logger.critical("Ignoring previous entry due to HTTP error") 82 | breached_passwords_count = len(breached_passwords) 83 | if breached_passwords_count > 0: 84 | print("Found {} previously breached password{}:".format( 85 | breached_passwords_count, 86 | "s" if breached_passwords_count > 1 else "")) 87 | for credential in breached_passwords: 88 | display_pw: str = credential.password if plaintext else credential.sha1 89 | print("{}:{}:{}".format(credential.display(), display_pw, 90 | pw_cache[credential.sha1])) 91 | else: 92 | print("None of your passwords have been found breached.") 93 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # KeepassXC-Pwned 2 | 3 | ### Project Status 4 | 5 | The functionality to check passwords again the HIBP database has been built into keepassxc since version 2.6.0 (Database > Database Reports > HIBP). This project should still work on keepassxc versions `<2.6.0`, though fails due to what I assume is a change in the specification for the `keepassxc-cli` export post version 2.6.0. I don't plan to update this to work with keepassxc 2.6.0 seeing as the functionality this offered is now built-in. This can still be used as a utility module to check passwords against the HIBP database: 6 | 7 | In python code: 8 | 9 | ``` 10 | from keepassxc_pwned import check_password 11 | check_password("password") 12 | ``` 13 | 14 | _Note: `check_password` doesn't attempt to do any rate limiting._ 15 | 16 | or, by entering the password manually: 17 | 18 | ``` 19 | $ python3 -m keepassxc_pwned 20 | Password to check: 21 | Found password 1054 times! 22 | ``` 23 | ---- 24 | 25 | This checks a [KeePassXC](https://keepassxc.org/) database against previously cracked [haveibeenpwned](https://haveibeenpwned.com/) passwords. 26 | 27 | #### Requirements 28 | 29 | - `keepassxc-cli` binary (typically installed with KeePassXC) 30 | - python 3.6 or above 31 | 32 | #### Install 33 | 34 | `pip3 install keepassxc-pwned` 35 | 36 | #### Run 37 | 38 | Run: `keepassxc_pwned ~/database.kdbx` 39 | 40 | ``` 41 | Usage: keepassxc_pwned [OPTIONS] DATABASE 42 | 43 | Check a keepassxc database against previously cracked haveibeenpwned 44 | passwords 45 | 46 | Options: 47 | -p, --plaintext Print breached passwords in plaintext; defaults to 48 | sha1 hashes. 49 | 50 | -k, --key-file PATH Key file for the database 51 | -v, --verbose Print debug messages 52 | -q, --quiet Don't print status messages, just the summary 53 | --keepassxc-cli PATH Specify a different location for the keepassxc-cli 54 | binary 55 | 56 | --help Show this message and exit. 57 | ``` 58 | 59 | Sample Run: 60 | 61 | ``` 62 | $ keepassxc_pwned ~/Documents/updated_database.kdbx 63 | Insert password for /home/username/Documents/updated_database.kdbx: 64 | Checking password for Amazon... 65 | Checking password for Github... 66 | Checking password for Netflix... 67 | Checking password for Steam... 68 | Checking password for letterboxd... 69 | Checking password for linkedin... 70 | Checking password for minecraft... 71 | Found password for 'minecraft' 3 times in the dataset! 72 | Checking password for soundcloud... 73 | Checking password for stackoverflow... 74 | Checking password for wikipedia... 75 | Found 1 previously breached password: 76 | minecraft:5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8:3 77 | ``` 78 | 79 | #### Privacy concerns 80 | 81 | This tool only transmits the first 5 characters of the SHA-1 hash of your passwords. 82 | You can read more about that [here](https://www.troyhunt.com/ive-just-launched-pwned-passwords-version-2/#cloudflareprivacyandkanonymity). 83 | 84 | #### Troubleshooting 85 | 86 | If `keepassxc-cli` is named something else on your installation of KeepassXC, specify the full path by providing the `--keepassxc-cli` flag, like: `keepassxc_pwned --keepassxc-cli "$(which keepassxc.cli)" ~/Documents/updated_database.kdbx` 87 | 88 | If you get the following error while using `keepassxc-cli`: 89 | 90 | ``` 91 | dyld: Library not loaded: /usr/local/opt/quazip/lib/libquazip.1.dylib 92 | Referenced from: /usr/local/bin/keepassxc-cli 93 | Reason: image not found 94 | Abort trap: 6 95 | ``` 96 | 97 | ... installing `quazip` should fix that: 98 | 99 | - `brew install quazip` (Mac) 100 | 101 | - `sudo apt install libquazip-dev` (Linux) 102 | 103 | If `keepassxc-cli` fails with an error message like "Invalid Command extract.", the command was changed in KeePassXC 2.5.0, and is now called `export`. Upgrade KeePassXC to the latest version, and try again. 104 | 105 | #### Tests 106 | 107 | - Clone this repository 108 | - Install dev dependencies: `pip3 install -r requirements-dev.txt` 109 | - `mypy keepassxc_pwned` 110 | - `pytest` 111 | -------------------------------------------------------------------------------- /keepassxc_pwned/keepass_wrapper.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import os 3 | import shlex 4 | import subprocess 5 | import pathlib 6 | import shutil 7 | 8 | from typing import Optional, List 9 | from functools import partial 10 | from distutils.version import StrictVersion 11 | 12 | from .log import logger 13 | 14 | # redirect STDIN/STDERR from subprocess 15 | subprocess_piped = partial(subprocess.run, 16 | encoding="utf-8", 17 | stdout=subprocess.PIPE, 18 | stderr=subprocess.PIPE) 19 | 20 | 21 | class KeepassWrapper: 22 | """ 23 | Functions that create a subprocess and call the keepassxc-cli shell command 24 | """ 25 | 26 | KEEPASSXC_CLI_NAME = "keepassxc-cli" 27 | 28 | def __init__(self, keepassxc_cli_location: Optional[pathlib.Path] = None): 29 | """ 30 | Create an instance of KeepassWrapper, with an optional 31 | path to the keepassxc-cli binary. 32 | 33 | 34 | Allow the path of the keepassxc-cli to be changed because 35 | some package managers (e.g. mint with snap) call 36 | this the binary keepassxc.cli 37 | """ 38 | 39 | if keepassxc_cli_location is None: 40 | # search for keepassxc-cli which default name on $PATH 41 | keepassxc_location_output = shutil.which( 42 | self.__class__.KEEPASSXC_CLI_NAME) 43 | if keepassxc_location_output is None: 44 | logger.critical( 45 | "Could not find a binary called {} on your $PATH.".format( 46 | self.__class__.KEEPASSXC_CLI_NAME)) 47 | sys.exit(1) 48 | self.keepassxc_cli_location: pathlib.Path = pathlib.Path( 49 | keepassxc_location_output) 50 | else: 51 | self.keepassxc_cli_location = keepassxc_cli_location 52 | logger.debug("keepassxc-cli location: {}".format( 53 | self.keepassxc_cli_location)) 54 | 55 | def version(self) -> StrictVersion: 56 | """Returns the KeepassXC Version""" 57 | version_proc: subprocess.CompletedProcess = subprocess_piped( 58 | [self.keepassxc_cli_location, "--version"]) 59 | version_str: str = version_proc.stdout.strip() 60 | logger.debug("keepassxc cli version: {}".format(version_str)) 61 | return StrictVersion(version_str) 62 | 63 | def backwards_compatible_export(self) -> str: 64 | """ 65 | In KeepassXC version 2.5.0, the extract command was re-named to export 66 | Attempt to parse the version number and generate the correct subcommand 67 | """ 68 | try: 69 | version: StrictVersion = self.version() 70 | if version < StrictVersion("2.5.0"): 71 | return "extract" 72 | else: 73 | return "export" 74 | except ValueError: 75 | return "export" 76 | 77 | def export_database( 78 | self, 79 | database_file: pathlib.Path, 80 | database_password: str, 81 | database_keyfile: Optional[pathlib.Path] = None, 82 | keepassxc_cli_location: Optional[pathlib.Path] = None, 83 | ) -> str: 84 | """Calls the keepassxc-cli export command, returns the output from the command""" 85 | 86 | command_parts: List[str] = [ 87 | str(self.keepassxc_cli_location), 88 | self.backwards_compatible_export() 89 | ] 90 | if database_keyfile is not None: 91 | command_parts.extend(["-k", str(database_keyfile)]) 92 | command_parts.append(str(database_file)) 93 | command_str: str = " ".join(command_parts) 94 | logger.debug("Export database command: {}".format(command_str)) 95 | keepassxc_output: subprocess.CompletedProcess = subprocess_piped( 96 | shlex.split(command_str), 97 | input=database_password, 98 | ) 99 | if keepassxc_output.returncode != 0: 100 | logger.critical("Error communicating with {}".format( 101 | self.keepassxc_cli_location)) 102 | logger.critical(keepassxc_output.stderr) 103 | sys.exit(1) 104 | # python doesn't like the version tag, remove the first line 105 | return keepassxc_output.stdout.split(os.linesep, 2)[-1] 106 | -------------------------------------------------------------------------------- /tests/test_generic_database.py: -------------------------------------------------------------------------------- 1 | """ 2 | test edge cases for keepass databases 3 | when there is no title/username for a entry 4 | when theres no password 5 | """ 6 | 7 | import vcr 8 | from unittest.mock import patch 9 | 10 | from keepassxc_pwned.parser import Credential, Database 11 | from keepassxc_pwned.cli import main_wrapper 12 | 13 | from .common import * 14 | 15 | keepass_different_binary = os.path.abspath( 16 | os.path.join(this_dir, "keepassxc.cli")) 17 | 18 | db_file_loc = os.path.join(db_files, "generic_has_passwords.kdbx") 19 | 20 | 21 | # no flags 22 | @vcr.use_cassette("tests/vcr_cassettes/test_generic.yaml") 23 | def test_default(capsys, caplog): 24 | 25 | os.environ["KEEPASSXC_PWNED_PASSWD"] = "generic_has_passwords" 26 | main_wrapper(False, None, False, False, db_file_loc, None) 27 | captured = capsys.readouterr() 28 | captured_lines = captured.out.splitlines() 29 | assert len(captured_lines) == 2 30 | assert captured_lines[0] == "Found 1 previously breached password:" 31 | assert (captured_lines[1] == 32 | "breached_entry:74B0B92F4476AC6722C2232EB91CB79BC531311C:1054") 33 | captured_logs = list(map(lambda x: x.getMessage(), caplog.records)) 34 | assert len(captured_logs) == 4 35 | assert captured_logs[0] == "Checking password for breached_entry..." 36 | assert (captured_logs[1] == 37 | "Found password for 'breached_entry' 1054 times in the dataset!") 38 | assert captured_logs[2] == "Checking password for unbreached password..." 39 | assert (captured_logs[3] == 40 | "Checking password for 3DFE1FD27BDF9870F23C3A5916D9A1495E492518..." 41 | ) # uses sha1 value since no title 42 | 43 | 44 | # quiet flag 45 | @vcr.use_cassette("tests/vcr_cassettes/test_quiet.yaml") 46 | def test_quiet(capsys, caplog): 47 | os.environ["KEEPASSXC_PWNED_PASSWD"] = "generic_has_passwords" 48 | main_wrapper(False, None, False, True, db_file_loc, None) 49 | captured = capsys.readouterr() 50 | captured_lines = captured.out.splitlines() 51 | assert captured_lines[0] == "Found 1 previously breached password:" 52 | assert (captured_lines[1] == 53 | "breached_entry:74B0B92F4476AC6722C2232EB91CB79BC531311C:1054") 54 | captured_logs = list(map(lambda x: x.getMessage(), caplog.records)) 55 | assert len(captured_logs) == 0 56 | 57 | 58 | # verbose flag 59 | @vcr.use_cassette("tests/vcr_cassettes/test_verbose.yaml") 60 | def test_verbose(capsys, caplog): 61 | os.environ["KEEPASSXC_PWNED_PASSWD"] = "generic_has_passwords" 62 | main_wrapper(False, None, True, False, db_file_loc, None) 63 | captured = capsys.readouterr() 64 | captured_lines = captured.out.splitlines() 65 | assert len(captured_lines) == 2 66 | assert captured_lines[0] == "Found 1 previously breached password:" 67 | assert (captured_lines[1] == 68 | "breached_entry:74B0B92F4476AC6722C2232EB91CB79BC531311C:1054") 69 | captured_logs = list(map(lambda x: x.getMessage(), caplog.records)) 70 | assert len(captured_logs) == 13 71 | assert captured_logs[0].startswith("keepassxc-cli location: ") 72 | assert (captured_logs[1] == 73 | "Using password from KEEPASSXC_PWNED_PASSWD environment variable") 74 | assert captured_logs[2].startswith("keepassxc cli version: ") 75 | assert captured_logs[3].startswith("Export database command:") 76 | assert "export" in captured_logs[3] 77 | assert captured_logs[4].startswith( 78 | "Ignoring entry with no password: Credential(title='entry with no password'" 79 | ) 80 | assert captured_logs[5] == "KeepassXC parsed entry count: 3" 81 | assert captured_logs[6] == "Checking password for breached_entry..." 82 | assert captured_logs[ 83 | 7] == "Requesting https://api.pwnedpasswords.com/range/74B0B" 84 | assert (captured_logs[8] == 85 | "Found password for 'breached_entry' 1054 times in the dataset!") 86 | assert captured_logs[9] == "Checking password for unbreached password..." 87 | assert captured_logs[ 88 | 10] == "Requesting https://api.pwnedpasswords.com/range/92F9D" 89 | assert ( 90 | captured_logs[11] == 91 | "Checking password for 3DFE1FD27BDF9870F23C3A5916D9A1495E492518...") 92 | assert captured_logs[ 93 | 12] == "Requesting https://api.pwnedpasswords.com/range/3DFE1" 94 | 95 | 96 | # plaintext with quiet 97 | @vcr.use_cassette("tests/vcr_cassettes/test_plaintext.yaml") 98 | def test_plaintext(capsys, caplog): 99 | main_wrapper(True, None, False, True, db_file_loc, None) 100 | captured = capsys.readouterr() 101 | captured_lines = captured.out.splitlines() 102 | # assert len(captured_lines) == 2 103 | assert captured_lines[0] == "Found 1 previously breached password:" 104 | assert captured_lines[-1] == "breached_entry:hunter42:1054" 105 | 106 | 107 | # test passing keepassxc-cli file 108 | @vcr.use_cassette("tests/vcr_cassettes/test_plaintext.yaml") 109 | def test_change_keepassxc_cli_flag(capsys, caplog): 110 | main_wrapper(True, None, True, False, db_file_loc, 111 | keepass_different_binary) 112 | captured = capsys.readouterr() 113 | captured_lines = captured.out.splitlines() 114 | captured_logs = list(map(lambda x: x.getMessage(), caplog.records)) 115 | assert captured_lines[0] == "Found 1 previously breached password:" 116 | assert any(["tests/keepassxc.cli" in line for line in captured_logs]) 117 | -------------------------------------------------------------------------------- /keepassxc_pwned/parser.py: -------------------------------------------------------------------------------- 1 | import os 2 | import pathlib 3 | import hashlib 4 | import xml.etree.cElementTree as ET 5 | 6 | from getpass import getpass 7 | from typing import List, Optional 8 | from xml.etree.ElementTree import Element as XMLElement 9 | 10 | from .log import logger 11 | from .utils import AutoRepr 12 | from .keepass_wrapper import KeepassWrapper 13 | 14 | 15 | class Credential(AutoRepr): 16 | """ 17 | Represents one entry in a KeepassXC Database 18 | """ 19 | 20 | # ordering for repr 21 | attrs = ["title", "username", "password", "sha1"] 22 | 23 | # ordering for display 24 | display_attrs = ["title", "username", "sha1"] 25 | 26 | # attributes to extract from XML 27 | parsed_attrs = {"title", "username", "password"} 28 | 29 | def __init__(self, xml_entry: XMLElement): 30 | self._xml_entry = xml_entry 31 | for str_node in filter(lambda e: e.tag == "String", list(xml_entry)): 32 | key_node: Optional[XMLElement] = str_node.find("Key") 33 | value_node: Optional[XMLElement] = str_node.find("Value") 34 | 35 | if key_node is not None and value_node is not None: 36 | key = key_node.text.lower() # type: ignore 37 | value = value_node.text # type: ignore 38 | if key in self.__class__.parsed_attrs: 39 | setattr(self, key, value) 40 | 41 | if not hasattr(self, "password") or (hasattr( 42 | self, "password") and getattr(self, "password") is None): 43 | raise ValueError( 44 | "Ignoring entry with no password: {}".format(self)) 45 | 46 | self._sha1: Optional[str] = None 47 | 48 | @property 49 | def sha1(self) -> Optional[str]: 50 | """ 51 | Generates the sha1 from the password if needed, and returns it 52 | May return none, is password is none 53 | """ 54 | if self._sha1 is None: 55 | if self.password is not None: # type: ignore 56 | self._sha1 = ( 57 | hashlib.sha1(self.password.encode( # type: ignore 58 | "utf-8")).hexdigest().upper()) 59 | return self._sha1 60 | 61 | def __eq__(self, other): 62 | if not isinstance(other, self.__class__): 63 | return False 64 | try: 65 | return self.title == other.title and self.username == other.username and self.password == other.password 66 | except AttributeError: 67 | return self.password == other.password 68 | 69 | def display(self): 70 | """An basic representation of this credential""" 71 | # must have at least a password, which would be displayed as sha1 72 | for a in self.__class__.display_attrs: 73 | try: 74 | d = getattr(self, a) 75 | if d is not None: 76 | return d 77 | except AttributeError: 78 | pass 79 | 80 | 81 | class Database(AutoRepr): 82 | 83 | attrs = ["database_file", "key_file"] 84 | 85 | def __init__( 86 | self, 87 | database_file: pathlib.Path, 88 | key_file: Optional[pathlib.Path] = None, 89 | keepassxc_cli_location: Optional[pathlib.Path] = None, 90 | ): 91 | self.database_file = database_file 92 | self.key_file = key_file 93 | 94 | self._xml_tree: Optional[XMLElement] = None 95 | self._password: Optional[str] = None 96 | self._credentials: Optional[List[Credential]] = None 97 | 98 | self.keepass_wrapper = KeepassWrapper(keepassxc_cli_location) 99 | 100 | @property 101 | def password(self) -> str: 102 | """ 103 | Returns the password for this database 104 | If the KEEPASSXC_PWNED_PASSWD environment variable is set, 105 | uses that, else, prompts the user for password 106 | """ 107 | if self._password is not None: 108 | return self._password 109 | elif "KEEPASSXC_PWNED_PASSWD" in os.environ: 110 | logger.debug( 111 | "Using password from KEEPASSXC_PWNED_PASSWD environment variable" 112 | ) 113 | self._password = os.environ["KEEPASSXC_PWNED_PASSWD"] 114 | return self._password 115 | else: 116 | self._password = getpass("Insert password for {}: ".format( 117 | self.database_file)) 118 | return self._password 119 | 120 | @property 121 | def xml_tree(self) -> Optional[XMLElement]: 122 | """ 123 | Returns the parsed XML Element Tree from the keepassxc-cli export command 124 | Calls the command if it hasn't been called yet 125 | """ 126 | self._call_keepassxc_cli() 127 | return self._xml_tree 128 | 129 | def _call_keepassxc_cli(self) -> None: 130 | """ 131 | Calls the keepassxc-cli export as a subprocess 132 | Sets the '_xml_tree' attribute to the XML representation of the database 133 | """ 134 | if self._xml_tree is not None: 135 | return # already called, use cached value 136 | keepass_export_process_output: str = self.keepass_wrapper.export_database( 137 | database_file=self.database_file, 138 | database_password=self.password, # calls getpass if not set 139 | database_keyfile=self.key_file, 140 | ) 141 | self._xml_tree = ET.fromstring(keepass_export_process_output) 142 | 143 | @property 144 | def credentials(self) -> List[Credential]: 145 | """ 146 | Returns a list of credentials -- entries from the KDBX 147 | """ 148 | if self._credentials is not None: 149 | return self._credentials 150 | self._credentials = [] 151 | for group in self.xml_tree.find("Root").iter("Group"): # type: ignore 152 | # ignore deleted passwords 153 | if group.find("Name").text == "Recycle Bin": # type: ignore 154 | continue 155 | # grab username, title, and passwords 156 | for entry in filter(lambda g: g.tag == "Entry", list(group)): 157 | try: 158 | cred = Credential(entry) 159 | self._credentials.append(cred) 160 | except ValueError as no_pw: 161 | logger.debug(str(no_pw)) 162 | logger.debug("KeepassXC parsed entry count: {}".format( 163 | len(self._credentials))) 164 | return self._credentials 165 | -------------------------------------------------------------------------------- /tests/vcr_cassettes/pwned_passwords_api_response.txt: -------------------------------------------------------------------------------- 1 | 003D68EB55068C33ACE09247EE4C639306B:3 2 | 012C192B2F16F82EA0EB9EF18D9D539B0DD:1 3 | 01330C689E5D64F660D6947A93AD634EF8F:1 4 | 0198748F3315F40B1A102BF18EEA0194CD9:1 5 | 01F9033B3C00C65DBFD6D1DC4D22918F5E9:2 6 | 0424DB98C7A0846D2C6C75E697092A0CC3E:5 7 | 044A8FE3881EEF0DBCAE244BF261CD74DD7:2 8 | 047F229A81EE2747253F9897DA38946E241:1 9 | 04A37A676E312CC7C4D236C93FBD992AA3C:6 10 | 04AE045B134BDC43043B216AEF66100EE00:2 11 | 0502EA98ED7A1000D932B10F7707D37FFB4:5 12 | 0539F86F519AACC7030B728CD47803E5B22:5 13 | 054A0BD53E2BC83A87EFDC236E2D0498C08:3 14 | 05AA835DC9423327DAEC1CBD38FA99B8834:1 15 | 05E0182DEAE22D02F6ED35280BCAC370179:4 16 | 078FF3B0C6DD716047976D7D7569667E61C:1 17 | 07956D897C9204261693E1C8908FA12D30E:1 18 | 07A7225B7774BF2796FD3F7A19C17198B5C:1 19 | 07B20D697D2341BEB3EB9CBF0A55C82D5FB:2 20 | 07EE3C8C863CAD50CA4795A7FF79E3EBBC9:6 21 | 07FADF960FA28B5694988195277DC4C5F00:1 22 | 0871A33287C74B37B7A6FE7E57CA96A1490:1 23 | 09C127E05A5F032E0F2E942C676DD4F5D71:2 24 | 0B25AA3CF151CD4D0EA4BD8A1243A9B00AD:2 25 | 0BB286D4B7726898998D69E7E445CAD201E:1 26 | 0C54A78F6E71DCA1D15EF76864E565FB1F0:1 27 | 0C58C8D59A7C8C15BCF29EC2F3BC90BC1F6:2 28 | 0CBAEBA062F6639F3A062CC239EBA525DA3:1 29 | 0F1939EC5AD48A58879C46E069768F5E7A7:1 30 | 0F8C72A929F304D332F933A742337615FE5:3 31 | 0F8F7CEC9FB03196A96A16F3B10B02CF296:8 32 | 0FDFD37BB4EB84FAABB1980435E6E1F2885:3 33 | 11686E89E2FC9359ECD6F722800B90F093B:5 34 | 1170228E0FD2380A57EA6B7722E277FB8D4:2 35 | 11C9990E10807FAD895158DECBA900FD210:3 36 | 11F662D179759E8D4AEE33085E21C4577C8:2 37 | 12D980DB77C653E89C27AA5F757E1866BF3:3 38 | 1306B451DC880C7E4C69B648E8EDC488EB9:2 39 | 134F847708F2CA9B9C269EB1F731E32F3F6:2 40 | 13507FD5AAE15C9EBB2936F5807954A03F1:1 41 | 1374461EB91969C27AC69C0FCAA19D491EA:3 42 | 13C49876A8E2DF99A7A5F1ADA0AED3B10F6:1 43 | 13FF027A7A9CA9A9207AA41A5211AD4EA2D:1 44 | 14064116E29F235C7069D746496596D2051:10 45 | 14096FCCD91970F17B52E05099181424DD7:2 46 | 14B1468FF41FFF8363E997946DD4C7DA90B:1 47 | 14FE0CD3D1613C59FA14B97C970CE4C3E84:2 48 | 157FF96F5B3C80E6B77FA604DAD5F8E3954:1 49 | 1595A8D396AC6F7941A84D6F7100B1A7C5C:11 50 | 15A57FD7C945EA9CDC71C31FE3CF796F5D3:2 51 | 161F76D0F13992196417D5B84F2305B5CC1:1 52 | 17BA77B4ADFEC353A98F1D4C3EFE3DFD78F:1 53 | 17E198E4D172250925BD7D89EFDC21C098D:3 54 | 183F5A19D077A3139BDCCB3EA6DA831CC5E:3 55 | 184C1344F8AF3EA61906910510F277E2389:2 56 | 18C8096EE1FA5C8C6B9D3AB9A79D848E266:2 57 | 19BA1F38CE418910C7CB92516DAC6A347B9:3 58 | 19E0061EB9188471E381E9893736CF16EC4:2 59 | 1B9A9E0B079726677FDF4383AA7FFD2C23E:1 60 | 1C12D46C02461550809D10EF62DDEE99F75:2 61 | 1CB7055517A54D1B0F1847EB84904E69438:2 62 | 1CC93AEF7B58A1B631CB55BF3A3A3750285:3 63 | 1D2DA4053E34E76F6576ED1DA63134B5E2A:2 64 | 1D72CD07550416C216D8AD296BF5C0AE8E0:10 65 | 1E2AAA439972480CEC7F16C795BBB429372:1 66 | 1E3687A61BFCE35F69B7408158101C8E414:1 67 | 1E4C9B93F3F0682250B6CF8331B7EE68FD8:3000000 68 | 1F2B668E8AABEF1C59E9EC6F82E3F3CD786:1 69 | 20597F5AC10A2F67701B4AD1D3A09F72250:3 70 | 20AEBCE40E55EDA1CE07D175EC293150A7E:1 71 | 20FFB975547F6A33C2882CFF8CE2BC49720:1 72 | 21901C19C92442A5B1C45419F7887722FCF:1 73 | 22158C3C153B18E085F0AE99105605AA1F3:3 74 | 2274735627699B58FFF7728CB090A819AF6:1 75 | 2288B6F854BCD5B01DA45F2246939330D04:3 76 | 22ED852E72B423F8D5537C9093C5254C285:3 77 | 237B9E2165C9704F834C9ADAB8B4138967F:2 78 | 2404761C0CDC3FB6A038B7604EAAEE0A991:2 79 | 242C2F9322EBED6AA1A3187B9DAE7EF0FC5:1 80 | 243295E08A856D84FD007A2E602BBD3EFC3:1 81 | 2449F3C910F92602707D9EBD16B81AAAF82:1 82 | 24BFBDC4AC8AD4E530F3F6F991C4887A34A:4 83 | 25AB286C8F4253C862490165D07F56B4419:1 84 | 2648FB0B2EDA4FDFF99BF51E912CD95C023:7185 85 | 26A8FAC5C4B3B5A1D6E0BC262CE986309E0:2 86 | 26F5EBE324C3E6EA1884AF1BE70DA343811:3 87 | 270C60DC07A9247E2770AE4B78870F41275:13 88 | 276014D91CF1258BEAF8796679D2B61C0A6:1 89 | 27C1D736B05CEC7D7EB2D4F604607F8B2CD:2 90 | 28A5154F2F486EA05CD92C6DCCFBF9981C1:3 91 | 28B371AEA0A6A847A0A7A5EAAB8814AD9E0:6 92 | 2945E7A269FAF05C051EF9590B55D862FFB:5 93 | 29767C5C3FB2603E0026976E6CF2656D27D:1 94 | 2A5FC6CE848710F6BFD5A705AF2863435FC:8 95 | 2AC4330373ABE9B9915882537579DA795A7:4 96 | 2B00FB8C3D865D81DA9172F2D9C3BA11CBD:3 97 | 2B76B30EB9C4077D4F227E69644C38F4E62:6 98 | 2C38AE8FF7F40088614359234940931A18F:1 99 | 2CB187F80EDF332EBD447ED7608B5204E8B:1 100 | 2DF1A9246DAC8C59CCDD68CC3D45955483A:1 101 | 303D54CD2199324FDF71FD036A592180A8B:1 102 | 306A88CC35F16092410A9AF8989EDC10863:2 103 | 315033449A7622547963FC9F5A600402E3C:2 104 | 31A7182C7C20C3418D58342B22E4160700F:1 105 | 31AE86A9651780DB225AAC2D67866A353C9:2 106 | 3290230B7819FB268674CB8D40B75C9A987:3 107 | 32F203CB544F48B0FA79B280B7B7A562442:12 108 | 332D54F56D99A7B6B3D3CFB525826824C50:6 109 | 33D5F8FF2FB3B7F3EAAE8622D1052FA1092:5 110 | 34D19E502C1203FAD7BBCA78C7C6D09035F:1 111 | 351B76DCD15DA01C646FFBE2FD1307E1A00:1 112 | 3528494E021ABBC644E747F894C53B8BFD8:1 113 | 3546C4E98B01A04F7E93478DF43E845B050:2 114 | 357D0F5152916861E7207ED03AC8DE2AF78:1 115 | 35907AF39307CFEF8F36B2A5C3CC19BFA3C:3 116 | 35A6790F361C7CCDF0F22D37197B1294C9A:1 117 | 36E93A16342E6D0FF79338ACE3DB7BB8ED0:1 118 | 372E6E538CBB3C0DEB2B5A9E8CBD904A7B7:2 119 | 37DA457150458E12A430D61A826D8F488B1:4 120 | 38573F281243B33A5EB0D9F6AD0B1ABC85F:6 121 | 38BCEB8A220BE19DA4C2A5D7596D7FC802B:1 122 | 3A8ADE4CF1DAD5342AF2F9FC9247EC21943:18 123 | 3AE53BDEA0C591BC0B16CA7BA8342378C21:2 124 | 3B1B255A76AC7CC0156BF8681D867D7BDC8:1 125 | 3D77CFFEDDBB08869144C86E0567A70062F:3 126 | 3DD9A9CFC08F04C92E9E18626B8B408CAB1:10 127 | 3EFE0F0F89B5B54AA7FB6A117D25772759F:2 128 | 3F636B2B7A9DA3BE5BCF65248D66BC5FCEB:5 129 | 3FB73FD9C24C0E9DBA7CDFB83DEA139C3AB:2 130 | 400F72C16005CC627188355E4A0DAFD6AB1:1 131 | 406CFD9883177409007848905C7777BD1B4:1 132 | 40EF60B69F81CF5575FFDA8201EA116B9F2:1 133 | 416507FD35B215DEBB640D5BB3312207E0A:1 134 | 4198A5467A580D9F56A4FA93571E942D28D:4 135 | 41C25879F63E24F0859BADAEEA113576A26:1 136 | 41FA6A87D662364F8E3A96B9D174EE14AA3:6 137 | 42BAADCD710F9EA7E62B60E01D05469AC64:14 138 | 44B2FC5E31A4F4DD5226B3E3F7247891515:2 139 | 454D246498C2B4AE38B9109688A9057050D:1 140 | 461AD70E484C7B36D1C0895239A9453E95F:3 141 | 46549316B8759E8566A31DB4A5DCEF99D25:4 142 | 46B64C606975336AAF3396CFD4DE3019B27:2 143 | 46DC7CDEAF0857383C43452520619AB5717:2 144 | 47BD48E54AD6AA5AD3E96D0D6AA2519C5D7:1 145 | 47C6BEAA3C33564F963995EF4928317BDF9:1 146 | 48B5B3F11B3FB7F0F81287234EE5B3E2A8F:2 147 | 49463421E41DACB29B74C0086689688A5F6:2 148 | 497E16201345501F10F7B1244E564F6FF64:7 149 | 497FFCF7846D6E50F1C3B631F9E5F52E598:2 150 | 4A58E401767FA161ACC1DBEB1A9082D50B4:1 151 | 4AEE78286DF73B0F3D86D3AB344CD6DB382:9 152 | 4B3E4B6F3249233C26ACB5C995EEC2D905F:4 153 | 4B9B443FDA4DB21A367BCC0ED2D36D2A9E4:2 154 | 4BA08D26E7D66DF501348DB3BBC9850A1AE:1 155 | 4C092CCF57BCF7F0CE752608B57972ACA2F:1 156 | 4C1C5AD486CB1A110736DEDC91A2C064FC5:4 157 | 4C50F4EB9C64756374E97AB89604F12CF29:2 158 | 4C65D9C96E7CBBAB9205636CACFD58CA002:1 159 | 4C98B4FF7CFAA57597E9C57AA370D651A49:5 160 | 4CD9C233C66D766F7DD522BA16AE45C3ADE:6 161 | 4D07954F2231BEF338B718149597F1CC5CB:5 162 | 4DB38ED1F19ED25FBE0F03D00155FFBD2A1:3 163 | 4E2CAB3927DCB359FEA938BD89A130F77EA:4 164 | 4E94E781109936277B5B06CB1A1B19571E9:3 165 | 4ECDE364CBC0AE0B283341DBCAF889DC37B:2 166 | 4F39AFC1819280A809C40C3D3372BE138D5:4 167 | 4F58E0EFC884BB9410B5105682E140A8857:2 168 | 4FA1B9F3C571C20CBEBA1FB5DB03357380E:3 169 | 4FCB0A19A9F4BB445EF9147CBFB39D55A19:1 170 | 4FDDFAEE3A0E987FD60B4458529F0E66B22:4 171 | 50C4D3B98306313FCB2E19B159DFE5089F3:3 172 | 51B0F18F1FB141D15507F06908117FF9E5F:2 173 | 538CAED83269A28FDC9B1A081DAECF21811:1 174 | 53FF0293B1EFD828D27EFDF55F16F7937DE:2 175 | 5465C464033C00B887595DE51BFE80CA504:1 176 | 546FB8CEC465FBBB4312A3D2F0180694FF0:1 177 | 54C10A810A52F61E095A71F78F8B6995265:2 178 | 54ECB8CB0D2E05F3EFAE12409F9934B134D:2 179 | 55F4F83B9F9AEFCF165130ABA3D03AC5C8C:2 180 | 5649837FB6B77A6636A4FB65D443070F3EA:5 181 | 57A36C2404BD5FAC9350862D7375191B9C5:2 182 | 57D29195CDFD7344EFD11CD4A70CF540F25:3 183 | 58390CEA8FB725FAB7A01B40C52C59029E8:2 184 | 5887B3251745325257533ABB9D2195E311E:1 185 | 58AF3A0231FE86B65D5581E0F81AAED125A:1 186 | 5A13F3216DCE2D2B01A98444E3807B03E7C:1 187 | 5A1684397CF06D1D50435FE71DA92CC9CE5:1 188 | 5A1D0ACB70D3667ABBCCBA6A12A276130DC:1 189 | 5A920A5D5263BDF5AC8E17033D156889ABF:2 190 | 5ABE4E10752E33C9518388610E895274D76:2 191 | 5AFC79A111BDDAB13BFF5B41582731DAD49:1 192 | 5CF118797E15B3A2831436EEC2600D7DD1F:1 193 | 5E2BCB2FEF09257B0306B4744418999611B:18 194 | 5ECA9DCF9DD43458390131ADC7F7B3D30BE:1 195 | 5ED97BB8BC5D44C6C95E4CA5F4338A02DE0:2 196 | 5EFF7FF764DC1DBD43001E889F57218149D:1 197 | 5F0CD063060830BFC6270EA1A9751D656F4:2 198 | 5F5392AA709353B936C6BF31B247E58C1FA:2 199 | 5F6E1F4AEE3D5E2F296E873642C8CFCD77B:1 200 | 5FA4A27FB6FF58C9A32E6525591D1A4053B:1 201 | 608C96CDA8436FB63F1DAA204E8E158A6A1:2 202 | 6364DEE4BB0DD5729C334FE9DCB63637D07:1 203 | 63B0ED16A3959D8C2F232DB10CED4FA7B8F:1 204 | 642CD43FFC28AB87BBF93AA1CAF05B05BD1:2 205 | 65804A014B6430AA2808C2A8D876A1066C9:8 206 | 65ADE0384BF265A3C64B90747F1599A394B:3 207 | 65E47A6E9A64EAC9C3950DA021930BE2B59:2 208 | 65ECCF9A9102E9B9DE7C533CAFC2456331F:2 209 | 660C46EFAF6B66B1C6CA420842416DA606D:1 210 | 6720B9F1290A1B9D5FE8EF4D090A9857829:3 211 | 672E22360F0A39F1C20657F6C578751A651:2 212 | 67D16B114B2DF4CAD0394B3824478E2A26A:3 213 | 681D0CBD255504E3B07ABFC060C480F9886:2 214 | 69E987073909873541D7F546E7E5544200E:2 215 | 69FFB53C7AAE39CB18370BE1B9A43978211:10 216 | 6A16F2C1B70FC38AC528B259B1FAB51D8CC:4 217 | 6A65A90BF869866D8C139780EB10034D322:1 218 | 6AB59FDB74DF600FEC50ACA94E2FB70008D:1 219 | 6B1F1336296EBADAA217C76778DEB7A1D5D:3 220 | 6B2542EC15F7B80889BE89F249C4F1D511B:2 221 | 6B9A3887894D369C8960609A64BC6143EF8:4 222 | 6C70C037350D534493D4CAC88A326678321:1 223 | 6C89B56D25942AE0AE2AAAEA7496C7C5DFF:8 224 | 6C8D93ECA7476506BD92458DF90C39F6756:2 225 | 6CC0F555341DB4BE31786A9A4F769BD92E4:5 226 | 6D677D26A96B8432A485B38CF5A43A78091:1 227 | 6F03947E951A154A23E774A9A014B39C98A:3 228 | 6FF835580776A26A3D31E7E397E6674400E:1 229 | 703150CF3F56670C2D6376421DF207CC86D:1 230 | 709ED0BDA1678377E6CE8C2816CAC559E52:1 231 | 70C155A82C6EE2BFCA18E569B783B6276FF:2 232 | 70F392C6D8816D8A97970A4E07AB8796D87:5 233 | 710DCA1E8656C8BF2403C940E8DC73C1FA7:4 234 | 7128989558E49F3CCF23289D1DA744D854A:2 235 | 71C9C81607AFDF262B33AE2E4BCE7E99426:9 236 | 72A3C8E8B8F05244739CCCA82529EB24D10:8 237 | 731A29D65AA9F26AF6378FD5C0E29A01039:1 238 | 7337C3BD5008CBCC81C21FA227B2CEC513B:5 239 | 7393584DA0D509F4D3A241A40C3D4248110:2 240 | 74570315CF1230BAC931552D070AAA7DEFE:3 241 | 7550A5F6BE01B7A448B0BF5171EE5010549:13 242 | 755143A66169EA8D35662468991B728A535:1 243 | 7698261205C18E685A8F92AC30C64105EFB:8 244 | 771956F94167D5D1E08DC6B96D43E087551:6 245 | 78CA709A939372722D02667EDDA6CFBA0F1:4 246 | 7A27BCC7835158D1508AE75FAB7B07FBDDB:1 247 | 7A3EB27B059AB9C0DBE28C04CE17C080120:1 248 | 7B2223BF1662C54DCA023610ED8A4723009:2 249 | 7C6DB6EBCDE90DE0F36F6CC226B098BC77D:2 250 | 7C83C4B584C646E59925A3CC468003AA54C:7 251 | 7CAEFA1DA64A7816CD95CF5C16EB086E9CD:1 252 | 7CCD5B3EB6EB1B9D3EB4AF827CA572D17A6:1 253 | 7D4F0DEA9585E0D1C42ABD2793A9355D875:1 254 | 7D60188BAD089DC1D7BB88012375A72F199:5 255 | 7F9527D17679F123C37D0A61F949459FBCE:1 256 | 8075CDE2B5981A31E66C8A32BDACC272C8D:1 257 | 80C2504855845C04042F8C2899613DDA434:1 258 | 817EE5C907FC4CB6507BAEFE8ED0CDCE80E:2 259 | 81B000246326E7A45C72244AB023AD3B238:3 260 | 821A21D967813C4DDCE27E48EAD66827945:4 261 | 82E11D09624F96BD7CEFD8474AC82BFF733:1 262 | 82EF3E8DFA456A4C024AF143DB2F6CF620F:12 263 | 8333543F4FF45F5F8F36884A6B93CBED1BD:2 264 | 834BFF53842D2CD0675F42D9AFC0F746B07:3 265 | 835551444C7AFD3414A00AD91C5FC40AC77:2 266 | 83A5679C95CA20A34EC232230A89E6105F7:10 267 | 83DB397CBA6D2413893D6B651343C7881E6:2 268 | 83E1CED811F248A07D1AA95A55C598E7B26:1 269 | 846F3476EDB7F368CB218D79BCE71826CD2:3 270 | 853AE302D08ADDD2DDAB8BD0B2FFE67406E:2 271 | 862544EBFFA510349070B107DA3EE37C95C:2 272 | 87730F8E7D55C99B5FFAD3D6ADD6AEFC242:2 273 | 87A5BA4DB903042A2EF6EAB5A290D9E86F1:1 274 | 893BA737292FC109ED26234EE83CE31C89A:9 275 | 896B3D67DF5A2B5A5D168F7AA325466FB20:1 276 | 8AD12750BEBF2151A97918702BED06621BE:3 277 | 8BAF5C45FB11DF5D3C03F42215317A766C6:10 278 | 8C0266EED59C2791AD7CB27D3AADFAFA1F7:2 279 | 8C08B7E88C86EFD6A36B9918CE9C201EB6C:1 280 | 8C5CB86B66C554B7B46B840898832F8289E:9 281 | 8D2B568A99ACA5E680AA68DCE47A09A86E1:2 282 | 8D30DCA7937A5ECF3B11C17DE41892689B8:1 283 | 8DB6C4D490D7AAF90C93E04D5D7ADBDABC2:1 284 | 8E0D5C9D144BACC76E52C44F5B61E8DF629:208 285 | 8E409CDA87E90A91DFC5BEA3A3751756B04:1 286 | 8EF6868F4EB0607A7CB113C2ACEC08F0558:2 287 | 8F369299AEE0C69A685B903C6E5A212065D:3 288 | 8F54CE81FA3E7715A301979CF01CD559CDD:5 289 | 8F8B8EA87C75228F6A574251207494C359E:2 290 | 8FE581811FA691CADE0AC8E6EA905D24DF0:1 291 | 9102D1F14C10DB9CA75B38ED9A0BB3328ED:1 292 | 911DC08803FEAF1C1C664353510DCD8FB3E:2 293 | 92913B5A1ED91A113239E36AC3DC5319624:1 294 | 92C0C2B1323CC2095774AF6AF91569593CD:1 295 | 93886462AA99D5CA6A883DECB2C1369E68B:3 296 | 93C394542414BB56F99CD97AB401FE42ACB:1 297 | 93ED27A9ED83D48FEF022F084B367F8C16A:1 298 | 941F4DBE019927FFEF89210C3509525DFF0:12 299 | 946DAC1162A7F7EC16ED9603BF0CBDBCA41:1 300 | 948D599B9BB64E76809EDE9FDF3ED9D7014:6 301 | 94EE45F733696C8B7E1F80F2AE3DCB28BA6:3 302 | 959AF1CDA257303073CD6AA805D80173027:2 303 | 9718F656D19667FF839F5F5B82224A153BA:1 304 | 9787F93034022C2A0E8FD9680BF92F272A6:2 305 | 9829411C5B1B6AECAB7020A54D54DAA3E92:7 306 | 98321C82B45C3A4350ECCE813B036664A37:1 307 | 98A2E41029059231B2FE0E2FBF3546ADA1B:3 308 | 98AB3980D86AB254479BAF9DE9C090AB128:2 309 | 98C748A7D7F0A67B51913854E68E2FAEA32:1 310 | 98DC720A8AAFAFB529348F02FFAE491F1F2:1 311 | 991E745F4AB025D5BCC3B833CC45760CC08:1 312 | 99376328AD893CE27992C5C304A54F7733F:2 313 | 9973D2B8212808949BDC1C27B1C30C77DBC:1 314 | 9A64187BCC48B58951D257C52B14FB4BFAA:1 315 | 9B169DAF7CE65D21740C98E86BDBA060394:3 316 | 9B2910F2CFDDD75FFD3F8A66D2A7C94EA4C:2 317 | 9B3D0A0D720CD19E1666D436209FE225A84:2 318 | 9B4810BF7A2AA36C1A69C7BB389C0AB468A:3 319 | 9BDF0C480B0D0A11709B21CBE3817FF543D:1 320 | 9C259745113253B31DD49E1134660E97821:2 321 | 9C5B0CFF0631BB55FC80F2D3E3B01297405:1 322 | 9C809290E171DB37854E47232494435EDF5:1 323 | 9D782CA5C8B5FAEDE9CB53F6FF59C525A46:5 324 | 9D8FBE84AD481A6A714C8F9F902B6D22602:3 325 | 9D9C70172FC7A76001F60156A015A2FC61A:1 326 | 9E5A1D9A9CC5345A3A211024AA79D5D6EB3:1 327 | 9EBA10FEFD4F0897B93321952A375765133:1 328 | 9EE49ECA6CBCA78605AB8173563F93126AD:3 329 | 9F04970A69486003E6C22ECA0176014DF41:2 330 | 9F049DDF12CDF8665E74CDEE0DD4096E9F4:1 331 | 9F15CB4E8267D785B118793E4B3CCE1F617:12 332 | 9F42FC1B5932A6E6523FE05CCA9B9276123:1 333 | 9F7D4B60E60FD8AFCBCCD74041AE3805A92:4 334 | 9F9EE735F041681083BFBCBD1157E1F5DDB:2 335 | A01086E4757714337CCAA928A036FE12026:1 336 | A02902B8D0543C48998493211AEC22FF650:1 337 | A062699163FDA40D52D97A105465EDC1EE4:1 338 | A08C645E088E588F9E5B9ABDFCBCD9E9230:9 339 | A09D53E76D02C217CA8FC464E813AE1E5CC:1 340 | A116A3C9D67AD3806347115DAC2746255C6:1 341 | A18BF7767F0C617D31FB278C211BD65B454:4 342 | A1AF63850F90EA187A99DDDECAFA7E3365C:3 343 | A209E7253ED38864D64D9780E03FD868127:11 344 | A23F6342DD8EFD8574594C0CF76CB9E8464:3 345 | A2BE597396092AC2D590BCAB3AD9A9DD564:2 346 | A3AB5611237C03DAA93FA05FF59788C6420:2 347 | A3F24F9B51B2D78C2E3FDA31126F89DD9E8:1 348 | A42298023638CA4E04956C9F9C56FFE16BC:1 349 | A43D38B6D464BAE388791FED0DDA8832C2A:1 350 | A469A1756F617687038731E29E65EEE9A0D:11 351 | A49648ABFE19DE8EFA1228DF7B615159625:1 352 | A516C42C8CD4C7E7E328ABB90D002A9890E:28 353 | A5761127EA098A2114C94B2FDB9236FDFDE:1 354 | A590CAE00F5F2CCD9AD5BEC346216167734:4 355 | A7BE1046FB3DF8A326C6D98C1AA8EC625CF:1 356 | A911F7578DC3CA9A943080605EC1B12F401:2 357 | A91E69122C7DDDC98E6179943C4B6F27458:3 358 | A947803DC15AF833182B3EA4F7464BD1972:1 359 | A98FE4A46BB79BC92A7789EE993489997DF:1 360 | A9E99D281DF34917DEA0FDD670293E8293D:1 361 | AA8A90CA82095CAE59EB9B82CD3C05F9A57:3 362 | AB01CF40155A0F22CC516C48F3EC4C3EE59:5 363 | AB90ECE57E3A6BD47B6BC88DF57720B43E3:1 364 | AB91F322902BFFCEC5C4FC22F2D69761736:9 365 | ABED3B3777EFE04D8C02A044A7FC1FF0EFC:2 366 | AC18F44C596534157414E53436ABC7A911A:1 367 | AC2F4EF8601A54330A23E54492C6FB72EA4:1 368 | AC419B146AFAACCA48194237AA29B959DC6:8 369 | AC660D02A9E9C9440B93DBEE477FA2CD523:3 370 | AD750A533273094F74FE3C7C294E2992EED:5 371 | AD87A86518B1462CA197B21409D60560E24:2 372 | AE4E4D5D830167A9BFA45E407A7F513FAAD:1 373 | AECFAC6488926837B3B0290FCA96F0A767B:1 374 | B078561F9279998382B4CE8C9368C3C1A17:3 375 | B0ED6D2DBBE7C5EA643AE067C9A4F5DDA90:1 376 | B2242E00508F38A9AA0A002196E4D2AFB82:4 377 | B28C37A325544401BFBFAFB9E6DD269C7C0:3 378 | B485615DBA7E3E8B56C8F637D4F88B8B309:1 379 | B5145DC5709BC0A8593821805CF79C1A760:2 380 | B51F1511A14B6210C6D589AACE63BA4288C:2 381 | B560FC1B7B6734301F89A6AA3ABF98D144F:8 382 | B5C5880DF9F0C090C21E270D40764E414D1:2 383 | B5CC2B1A08DA02D4B7489827A7F3FF9C223:2 384 | B63A743F680DC010AABA28D4CBEE85BE757:1 385 | B675D0F02E3B0D944F5E76363CB7C2C46C1:3 386 | B7127FB732DFD38FBB503439374841819BE:2 387 | B87AAFC7DE1821E2335A869D815C455A0A3:4 388 | B8893A5B50CE516E52C501BB5CC71EDFF66:1 389 | B8E4141BCE85C6B5102B075DBDCAE054A78:4 390 | B907A25D1DE622E295A7AA6E645D5813D3A:5 391 | BA6F8B85EDC2133A5073468961A1756FF9A:4 392 | BBB0FDEF3A8EA131FFCC34CEDD360BAB421:4 393 | BC98BA06F816F8C0915440B51D1FCF6BD23:2 394 | BCFAE8A87705EFD6508E3BA356F427128AA:2 395 | BE187C7A53A7B0E95AEB6B68126EE7E3B85:2 396 | BF73319A343C0D4B635C447C9238A5F55EC:1 397 | BFA64A367C50A20CD78BFDFDC2BC52D6F6D:3 398 | C10E35E4531A6C6A1F99E0D6CAC8464344B:1 399 | C11466DEDCB4761F9610133AE1FC379EF00:1 400 | C17DF61DB70DFD0236DF384CB7DE753700E:1 401 | C295CA63A8DBC1A5861E8A5539B41496C11:1 402 | C2D4DCFEA2C41CB4C5666E72894788822F8:3 403 | C2D5DECAE0B738EEB078D18D261C8B93609:1 404 | C3170676DAB58B394BE8266F51D2B3EC87E:1 405 | C3C305B4B22B5983B779277F177A414DBCA:1 406 | C3E067EE7579FE8F50088945F20FAA8CAA9:9 407 | C44D9395A037CB159D41964D69AD9E4EE3D:5 408 | C7846E3F271F054FB790C30F4504DE65E9C:5 409 | C84782B604BE48977583E108AC6014C5909:11 410 | C933C97C2A353C712DDBAE9506788BD0367:2 411 | C991D5F50650C377CE6D7212E809C8C6086:2 412 | CB53EC83C6D1C81F0DB1013431279D06852:2 413 | CCA584375A77554391530848AC137A42FFC:2 414 | CD2021F110673F8AA95F1C447CAB1DFEAE4:1 415 | CD2B03E36B07B4471FE33A5892E17E0D7DF:6 416 | CD2ED30371EA8A8BB14FEF8BDEF5AC56824:1 417 | CD8BE68452C665F7400DE9DAD5485D2F315:1 418 | CDE902213D3FDD1237BF0BE02F05F44A820:3 419 | CF2F87E596758D031C0006D1827C9908E5C:34 420 | CFF6AFD2AB482897C76BCD2D19CACEC3B55:2 421 | D021616E53238BF0DE66516613F1DE72C2F:6 422 | D07276279B3B40A66FC78150FAEF3202577:1 423 | D0E88310DABF9931143593BDB954BFB84FF:5 424 | D107ECC5B8382B3E10F2029C22C01AB1103:4 425 | D1880BD3EAE74BC71EA1D9C550C0EE16DC0:7 426 | D197642F6CD619F04D83487A7EE33D0D81D:1 427 | D39B8E1C477C21BDFF42A0305338E10EE3C:8 428 | D4A628560BBD3298BB553AAA976A435A734:1 429 | D4DF0C13FF004C3CFF18F26296A8162CE6D:4 430 | D5EC2E34EA08AB1F652D4BC9097CD6950D9:2 431 | D767E8EB50640AD167EB99A8B9ECE03311B:4 432 | D78095FF9E98911210386E5B169EAF42D00:4 433 | D780C58333BD88105B3550380BAD608AD00:1 434 | D78252C1708F204B5106FE0C4FE8AEF752F:1 435 | D7E3C5E6EC075ACFEA86ACE6E7CD73C7725:1 436 | D8014AF60F20C465A6F3BAD7667C94049BC:4 437 | D83C819EE582E3C808BE5FB0ACC03384904:2 438 | D89AD7CC9D5A8E1B0517349AE1B2FD46976:2 439 | D9018B78508091B8FCA7F9BE7E0DAA76C24:4 440 | D9B25E96E6DFD439906BCD824B81D8B9762:1 441 | DA1B4D19AF7EC1E0A20985033EE36065887:2 442 | DA3C904059DBC5DFB0BB1D625B6E842F634:2 443 | DA50E8883AD0D97E2896E81D39067CE616F:1 444 | DA5B71BDF4DCC8694296B26965B824958DD:8 445 | DAA836CF8718E1B7FF44FEB58F75A76AC20:1 446 | DB08FE6509D70B4C0E9553FF66A3DDCA1FE:2 447 | DC9FA3E6AC49AA3FA958E8951BB06240B00:2 448 | DDBAE795D82E39DC56B9F833F4968E5D6AE:4 449 | DE04E96273F101F138AF73E1172F1ED0DA8:1 450 | DE7C435608A4B970752239AC436F4FAF7BB:2 451 | DF2E6BE8296B53F4BF849EF3AD1A80D30DE:1 452 | DF9E6E8A14AE5879867B337758E0A65BC65:1 453 | E0C69CD259D652F5BB3A41BADD1BA540D9C:2 454 | E0F41BF02B958F7DE9C27062905F45AA923:2 455 | E104AFC179613FE49DF005FEC12C419A349:4 456 | E190AC01EA900B96F8BF916D1F53C760C2C:3 457 | E1BD26D42BE2AD9D3BE5A473FB191208C66:1 458 | E235BEDC523A77216ED0EDA7858493533EC:2 459 | E2E4D50DCE1845D79BC5994B14F98CB022E:4 460 | E453123A30E96FB1DF0983C0551D5319C9F:2 461 | E537A2BC4DD5A7080836CF1DE7BC5ECD7C6:1 462 | E5DBEE639FA6E41634F248CFB8EAF548474:3 463 | E5ED4763425FBF2E9C780839A8D5B418970:2 464 | E72C94804E318BD07604F7FAE50B4FB1270:3 465 | E8138597E4299C64074968456AD80FEF505:2 466 | E887391253016D13B30922CEB502457E780:1 467 | E9CD985E2BF8EFC7F005508FF6BF08EE6BD:1 468 | EA2008F79BE2B0E0C02A1642725433BBB2F:15 469 | EA776CD65185506CBD7FDB53544C649D86E:2 470 | EAEB964E915FF8B1E611664084532AF3E6F:1 471 | EB025E2FEFDAAA8A59B824563CC77857202:1 472 | EB92A3344B40E7EC32D8200F410D0716889:3 473 | ED9038684A8B2E5BE0850F3304A51D5F5F6:2 474 | ED94C46C66D9BDA358030B9B0134DCE28EC:3 475 | EDF4ED33A63B21AD9DBC7130C3702B07537:4 476 | EE0AC0C0AF4A4A712147BCAD882B18D951C:1 477 | EE47E98067FAC07ECBE31ED7090F93C5E86:2 478 | EE5260CE766F47CFC88C958EC3CCD22CBD7:5 479 | EE79A7E71B34F415EADDCF8A6B5BA1DE0CD:4 480 | EE96E27CE6C16BD725DF9D4FD37BC4D2383:1 481 | EEBFAE69E8945473348BA4A8B98B312DB0D:1 482 | EF0E14CCB17E525D76050283148A57828F8:44 483 | EF14C50B9C48EA35CCA0FD7E710C13A83E2:5 484 | EF336D650AE64FCCA4F1CEC8F25AF5786A3:1 485 | EF6A5F7ADA4D07A6696A6AB107A72376CCF:2 486 | EFBCCEE88359A2A2D6743E467532B7E6EA9:5 487 | EFF9F5650357616CDB9D960A70765BF7C95:1 488 | F0A6FC05C68CC3BB7EE1CCA13F2288A35A6:2 489 | F14D95ADD5A136DC694AAB229805F4058C2:3 490 | F17A3DDBB8BF0404FEC1CB216094F6F84DD:7 491 | F294A73A046742292B48C2462CE6A743432:2 492 | F29FDD359957C00F801CC8A1774F703D9EF:1 493 | F32D422E0FC159C6AB218D04ED0FE2AEA8F:5 494 | F33C02F3AA937009C7671989F874A5C69D6:1 495 | F39EF3E98F44B314B60503B2EF0093148EF:2 496 | F4138F5BEDB65BC363EBA6944E5CA752199:2 497 | F60D6384E1488C26DFE31099AD91648D2D8:2 498 | F6E266EAABE91404454B287DBC2B79A7FC0:1 499 | F710E71262A0C34A481186361BE1E454D76:1 500 | F73D11BC6F5AB0B1D2A722E0BE245E74977:1 501 | F78C69EBE2E4522BA28EA12235B3DC4B397:4 502 | F7A5A85FB40A11E700157A9A4C59FA28399:1 503 | F80DCE3BC56F1E7CD5C191B60146A06A735:5 504 | F94031DF36AF0BA745ACA95EA5DDBB34794:4 505 | F9EE4AB12D8B5E829C4235184FE8DA7532F:2 506 | FA7CD065154FE84F28BED8BBE1F22B5277C:2 507 | FAA1D441B61F82B33B149A0B82B148B2097:1 508 | FB04650B9894B8FB38607FDA24957211042:1 509 | FB5F5A995FAAA87A49E8DF65F3E008F3150:1 510 | FBD0A69A6BF3A8EA34FB626F1737492060D:1 511 | FC1A58A04F24ABA0D53F07D17134802F761:1 512 | FD476CEA93CE558EB387B647444088B7136:2 513 | FD8044E06D204A3BCB1C615E3C7FA73A918:4 514 | FD98E151E6D5BCC6994B7B4A692BB03BB91:2 515 | FE210EA7F291B608505254390849B8609E2:2 516 | FF2CB655CE08DB53D721D10DC1EBE159D1E:2 517 | FF457ED69101D5FA9657D0AC888BFF1632E:1 518 | FF535E8286A9D9394E33ED388B20F73A794:4 519 | FFCDFF228BE98F296C0CA4CE1FC8815A30E:5 520 | -------------------------------------------------------------------------------- /tests/vcr_cassettes/test_user_password_fails.yaml: -------------------------------------------------------------------------------- 1 | interactions: 2 | - request: 3 | body: null 4 | headers: 5 | Accept: 6 | - '*/*' 7 | Accept-Encoding: 8 | - gzip, deflate 9 | Connection: 10 | - keep-alive 11 | User-Agent: 12 | - keepassxc-pwned 13 | method: GET 14 | uri: https://api.pwnedpasswords.com/range/A94A8 15 | response: 16 | body: 17 | string: !!binary | 18 | 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 273 | headers: 274 | Access-Control-Allow-Origin: 275 | - '*' 276 | Age: 277 | - '819568' 278 | Arr-Disable-Session-Affinity: 279 | - 'True' 280 | CF-Cache-Status: 281 | - HIT 282 | CF-Ray: 283 | - 55e858e9195ae4c4-LAX 284 | Cache-Control: 285 | - public, max-age=2678400 286 | Connection: 287 | - keep-alive 288 | Content-Encoding: 289 | - gzip 290 | Content-Type: 291 | - text/plain 292 | Date: 293 | - Sun, 02 Feb 2020 01:21:15 GMT 294 | Expect-CT: 295 | - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" 296 | Expires: 297 | - Wed, 04 Mar 2020 01:21:15 GMT 298 | Last-Modified: 299 | - Sat, 13 Jul 2019 01:25:35 GMT 300 | Server: 301 | - cloudflare 302 | Set-Cookie: 303 | - __cfduid=d58fa818792963aa24bb27c292a46aec11580606475; expires=Tue, 03-Mar-20 304 | 01:21:15 GMT; path=/; domain=.pwnedpasswords.com; HttpOnly; SameSite=Lax; 305 | Secure 306 | Strict-Transport-Security: 307 | - max-age=31536000; includeSubDomains; preload 308 | Transfer-Encoding: 309 | - chunked 310 | Vary: 311 | - Accept-Encoding 312 | X-Content-Type-Options: 313 | - nosniff 314 | X-Powered-By: 315 | - ASP.NET 316 | status: 317 | code: 200 318 | message: OK 319 | version: 1 320 | -------------------------------------------------------------------------------- /tests/vcr_cassettes/test_user_password_succeeds.yaml: -------------------------------------------------------------------------------- 1 | interactions: 2 | - request: 3 | body: null 4 | headers: 5 | Accept: 6 | - '*/*' 7 | Accept-Encoding: 8 | - gzip, deflate 9 | Connection: 10 | - keep-alive 11 | User-Agent: 12 | - keepassxc-pwned 13 | method: GET 14 | uri: https://api.pwnedpasswords.com/range/B9167 15 | response: 16 | body: 17 | string: !!binary | 18 | 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 276 | headers: 277 | Access-Control-Allow-Origin: 278 | - '*' 279 | Age: 280 | - '142' 281 | Arr-Disable-Session-Affinity: 282 | - 'True' 283 | CF-Cache-Status: 284 | - HIT 285 | CF-Ray: 286 | - 55e858eb1b9ad362-LAX 287 | Cache-Control: 288 | - public, max-age=2678400 289 | Connection: 290 | - keep-alive 291 | Content-Encoding: 292 | - gzip 293 | Content-Type: 294 | - text/plain 295 | Date: 296 | - Sun, 02 Feb 2020 01:21:16 GMT 297 | Expect-CT: 298 | - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" 299 | Expires: 300 | - Wed, 04 Mar 2020 01:21:16 GMT 301 | Last-Modified: 302 | - Sat, 13 Jul 2019 02:14:03 GMT 303 | Server: 304 | - cloudflare 305 | Set-Cookie: 306 | - __cfduid=d694b8508ae5b5a91486aae3ce32f5d791580606476; expires=Tue, 03-Mar-20 307 | 01:21:16 GMT; path=/; domain=.pwnedpasswords.com; HttpOnly; SameSite=Lax; 308 | Secure 309 | Strict-Transport-Security: 310 | - max-age=31536000; includeSubDomains; preload 311 | Transfer-Encoding: 312 | - chunked 313 | Vary: 314 | - Accept-Encoding 315 | X-Content-Type-Options: 316 | - nosniff 317 | X-Powered-By: 318 | - ASP.NET 319 | status: 320 | code: 200 321 | message: OK 322 | version: 1 323 | -------------------------------------------------------------------------------- /tests/vcr_cassettes/check_password.yaml: -------------------------------------------------------------------------------- 1 | interactions: 2 | - request: 3 | body: null 4 | headers: 5 | Accept: 6 | - '*/*' 7 | Accept-Encoding: 8 | - gzip, deflate 9 | Connection: 10 | - keep-alive 11 | User-Agent: 12 | - keepassxc-pwned 13 | method: GET 14 | uri: https://api.pwnedpasswords.com/range/5BAA6 15 | response: 16 | body: 17 | string: !!binary | 18 | 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 284 | SaL7/w9TZJwrMU8AAA== 285 | headers: 286 | Access-Control-Allow-Origin: 287 | - '*' 288 | Age: 289 | - '57834' 290 | Arr-Disable-Session-Affinity: 291 | - 'True' 292 | CF-Cache-Status: 293 | - HIT 294 | CF-Ray: 295 | - 55e10daaddf6ebad-LAX 296 | Cache-Control: 297 | - public, max-age=2678400 298 | Connection: 299 | - keep-alive 300 | Content-Encoding: 301 | - gzip 302 | Content-Type: 303 | - text/plain 304 | Date: 305 | - Sat, 01 Feb 2020 04:06:33 GMT 306 | Expect-CT: 307 | - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" 308 | Expires: 309 | - Tue, 03 Mar 2020 04:06:33 GMT 310 | Last-Modified: 311 | - Fri, 12 Jul 2019 21:23:19 GMT 312 | Server: 313 | - cloudflare 314 | Set-Cookie: 315 | - __cfduid=d99ae3279f7dd1dc8c05a5346d19cba0e1580529993; expires=Mon, 02-Mar-20 316 | 04:06:33 GMT; path=/; domain=.pwnedpasswords.com; HttpOnly; SameSite=Lax; 317 | Secure 318 | Strict-Transport-Security: 319 | - max-age=31536000; includeSubDomains; preload 320 | Transfer-Encoding: 321 | - chunked 322 | Vary: 323 | - Accept-Encoding 324 | X-Content-Type-Options: 325 | - nosniff 326 | X-Powered-By: 327 | - ASP.NET 328 | status: 329 | code: 200 330 | message: OK 331 | version: 1 332 | -------------------------------------------------------------------------------- /tests/vcr_cassettes/test_default.yaml: -------------------------------------------------------------------------------- 1 | interactions: 2 | - request: 3 | body: null 4 | headers: 5 | Accept: 6 | - '*/*' 7 | Accept-Encoding: 8 | - gzip, deflate 9 | Connection: 10 | - keep-alive 11 | User-Agent: 12 | - keepassxc-pwned 13 | method: GET 14 | uri: https://api.pwnedpasswords.com/range/5BAA6 15 | response: 16 | body: 17 | string: !!binary | 18 | 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 284 | SaL7/w9TZJwrMU8AAA== 285 | headers: 286 | Access-Control-Allow-Origin: 287 | - '*' 288 | Age: 289 | - '61606' 290 | Arr-Disable-Session-Affinity: 291 | - 'True' 292 | CF-Cache-Status: 293 | - HIT 294 | CF-Ray: 295 | - 55e169c11e92eb29-LAX 296 | Cache-Control: 297 | - public, max-age=2678400 298 | Connection: 299 | - keep-alive 300 | Content-Encoding: 301 | - gzip 302 | Content-Type: 303 | - text/plain 304 | Date: 305 | - Sat, 01 Feb 2020 05:09:25 GMT 306 | Expect-CT: 307 | - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct" 308 | Expires: 309 | - Tue, 03 Mar 2020 05:09:25 GMT 310 | Last-Modified: 311 | - Fri, 12 Jul 2019 21:23:19 GMT 312 | Server: 313 | - cloudflare 314 | Set-Cookie: 315 | - __cfduid=d3a6250d6cf076603030d6556d8f3a9641580533765; expires=Mon, 02-Mar-20 316 | 05:09:25 GMT; path=/; domain=.pwnedpasswords.com; HttpOnly; SameSite=Lax; 317 | Secure 318 | Strict-Transport-Security: 319 | - max-age=31536000; includeSubDomains; preload 320 | Transfer-Encoding: 321 | - chunked 322 | Vary: 323 | - Accept-Encoding 324 | X-Content-Type-Options: 325 | - nosniff 326 | X-Powered-By: 327 | - ASP.NET 328 | status: 329 | code: 200 330 | message: OK 331 | version: 1 332 | --------------------------------------------------------------------------------