Seal catalog publication Git metadata
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import hashlib
|
||||
import json
|
||||
import os
|
||||
from pathlib import Path
|
||||
@@ -26,12 +27,65 @@ from govoplan_release.publisher import ( # noqa: E402
|
||||
verify_committed_publication,
|
||||
verify_remote_branch_head,
|
||||
verify_remote_publication,
|
||||
_git_bytes,
|
||||
_sanitized_git_environment,
|
||||
_seal_git_metadata_file,
|
||||
_trusted_npm_command,
|
||||
)
|
||||
|
||||
|
||||
class ReleaseCatalogPublicationTests(unittest.TestCase):
|
||||
def test_publication_git_writes_ignore_permissive_operator_umask(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
repository = Path(temp_dir) / "website"
|
||||
repository.mkdir()
|
||||
self._git(repository, "init", "--quiet")
|
||||
payload_number = 0
|
||||
while True:
|
||||
payload = f"private publication object {payload_number}\n".encode()
|
||||
header = f"blob {len(payload)}\0".encode()
|
||||
expected_object = hashlib.sha1(
|
||||
header + payload,
|
||||
usedforsecurity=False,
|
||||
).hexdigest()
|
||||
object_parent = repository / ".git" / "objects" / expected_object[:2]
|
||||
if not object_parent.exists():
|
||||
break
|
||||
payload_number += 1
|
||||
|
||||
previous_umask = os.umask(0o002)
|
||||
try:
|
||||
object_id = (
|
||||
_git_bytes(
|
||||
repository,
|
||||
"hash-object",
|
||||
"-w",
|
||||
"--stdin",
|
||||
input_bytes=payload,
|
||||
)
|
||||
.decode("ascii")
|
||||
.strip()
|
||||
)
|
||||
finally:
|
||||
os.umask(previous_umask)
|
||||
|
||||
object_path = object_parent / expected_object[2:]
|
||||
self.assertEqual(expected_object, object_id)
|
||||
self.assertEqual(os.geteuid(), object_parent.stat().st_uid)
|
||||
self.assertEqual(0o700, object_parent.stat().st_mode & 0o777)
|
||||
self.assertEqual(os.geteuid(), object_path.stat().st_uid)
|
||||
self.assertEqual(0o400, object_path.stat().st_mode & 0o777)
|
||||
|
||||
def test_publication_git_metadata_is_sealed_after_git_writes(self) -> None:
|
||||
with tempfile.TemporaryDirectory() as temp_dir:
|
||||
metadata = Path(temp_dir) / "index"
|
||||
metadata.write_bytes(b"index")
|
||||
metadata.chmod(0o664)
|
||||
|
||||
_seal_git_metadata_file(metadata, label="test index")
|
||||
|
||||
self.assertEqual(0o600, metadata.stat().st_mode & 0o777)
|
||||
|
||||
def test_publication_git_identity_is_fixed_and_non_personal(self) -> None:
|
||||
with patch.dict(
|
||||
os.environ,
|
||||
|
||||
Reference in New Issue
Block a user