Skip to content

Commit dce017c

Browse files
authored
Merge branch 'master' into adjust_pr1152
2 parents a7896ee + f775df3 commit dce017c

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

lark/lark.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
from .parser_frontends import ParsingFrontend
2020

2121
from .exceptions import ConfigurationError, assert_config, UnexpectedInput
22-
from .utils import Serialize, SerializeMemoizer, FS, isascii, logger, SerializeMemoizer
23-
from .load_grammar import load_grammar, FromPackageLoader, Grammar, verify_used_files, PackageResource
22+
from .utils import Serialize, SerializeMemoizer, FS, isascii, logger
23+
from .load_grammar import load_grammar, FromPackageLoader, Grammar, verify_used_files, PackageResource, md5_digest
2424
from .tree import Tree
2525
from .common import LexerConf, ParserConf, _ParserArgType, _LexerArgType
2626

@@ -303,7 +303,7 @@ def __init__(self, grammar: 'Union[Grammar, str, IO[str]]', **options) -> None:
303303
options_str = ''.join(k+str(v) for k, v in options.items() if k not in unhashable)
304304
from . import __version__
305305
s = grammar + options_str + __version__ + str(sys.version_info[:2])
306-
cache_md5 = hashlib.md5(s.encode('utf8')).hexdigest()
306+
cache_md5 = md5_digest(s)
307307

308308
if isinstance(self.options.cache, str):
309309
cache_fn = self.options.cache

lark/load_grammar.py

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1312,7 +1312,7 @@ def do_import(self, dotted_path: Tuple[str, ...], base_path: Optional[str], alia
13121312
except IOError:
13131313
continue
13141314
else:
1315-
h = hashlib.md5(text.encode('utf8')).hexdigest()
1315+
h = md5_digest(text)
13161316
if self.used_files.get(joined_path, h) != h:
13171317
raise RuntimeError("Grammar file was changed during importing")
13181318
self.used_files[joined_path] = h
@@ -1391,7 +1391,7 @@ def verify_used_files(file_hashes):
13911391
if text is None: # We don't know how to load the path. ignore it.
13921392
continue
13931393

1394-
current = hashlib.md5(text.encode()).hexdigest()
1394+
current = md5_digest(text)
13951395
if old != current:
13961396
logger.info("File %r changed, rebuilding Parser" % path)
13971397
return False
@@ -1407,3 +1407,15 @@ def load_grammar(grammar, source, import_paths, global_keep_all_tokens):
14071407
builder = GrammarBuilder(global_keep_all_tokens, import_paths)
14081408
builder.load_grammar(grammar, source)
14091409
return builder.build(), builder.used_files
1410+
1411+
1412+
def md5_digest(s: str) -> str:
1413+
"""Get the md5 digest of a string
1414+
1415+
Supports the `usedforsecurity` argument for Python 3.9+ to allow running on
1416+
a FIPS-enabled system.
1417+
"""
1418+
if sys.version_info >= (3, 9):
1419+
return hashlib.md5(s.encode('utf8'), usedforsecurity=False).hexdigest()
1420+
else:
1421+
return hashlib.md5(s.encode('utf8')).hexdigest()

0 commit comments

Comments
 (0)