Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 85 additions & 6 deletions admin/create_secrets_files.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import datetime
import os
import sys
import tempfile
import textwrap
from pathlib import Path
from typing import TYPE_CHECKING
Expand All @@ -32,6 +33,15 @@
reraise=True,
)

VUMARK_TEMPLATE_SVG = textwrap.dedent(
text="""\
<svg xmlns="http://www.w3.org/2000/svg" width="512" height="512">
<rect x="0" y="0" width="512" height="512" fill="#ffffff" />
<circle cx="256" cy="256" r="144" fill="#000000" />
</svg>
""",
)


def _create_and_get_database_details(
driver: "WebDriver",
Expand Down Expand Up @@ -87,6 +97,7 @@ def _generate_secrets_file_content(
database_details: "DatabaseDict",
vumark_details: "VuMarkDatabaseDict",
inactive_database_details: "DatabaseDict",
vumark_target_id: str,
) -> str:
"""Generate the content of a secrets file."""
return textwrap.dedent(
Expand All @@ -104,12 +115,65 @@ def _generate_secrets_file_content(
INACTIVE_VUFORIA_CLIENT_SECRET_KEY={inactive_database_details["client_secret_key"]}

VUMARK_VUFORIA_TARGET_MANAGER_DATABASE_NAME={vumark_details["database_name"]}
VUMARK_VUFORIA_TARGET_ID={vumark_target_id}
VUMARK_VUFORIA_SERVER_ACCESS_KEY={vumark_details["server_access_key"]}
VUMARK_VUFORIA_SERVER_SECRET_KEY={vumark_details["server_secret_key"]}
""",
)


def _create_and_get_vumark_target_id(
driver: "WebDriver",
vumark_database_name: str,
vumark_template_name: str,
) -> str:
"""Upload a VuMark template and get its target ID."""
with tempfile.TemporaryDirectory() as temporary_directory:
svg_file_path = Path(temporary_directory) / "template.svg"
svg_file_path.write_text(
data=VUMARK_TEMPLATE_SVG,
encoding="utf-8",
)
upload_result = RETRY_ON_TIMEOUT(vws_web_tools.upload_vumark_template)(
driver=driver,
database_name=vumark_database_name,
svg_file_path=svg_file_path,
template_name=vumark_template_name,
width=100.0,
)

if isinstance(upload_result, str):
return upload_result

if isinstance(upload_result, dict):
target_id = upload_result.get("target_id")
if isinstance(target_id, str):
return target_id

target_id = getattr(upload_result, "target_id", None)
if isinstance(target_id, str):
return target_id

msg = (
"Expected `upload_vumark_template` to return a target ID. "
"Upgrade `vws-web-tools` to a version that returns one."
)
raise RuntimeError(msg)


def _create_vuforia_resource_names() -> tuple[str, str, str, str]:
"""Create names for Vuforia resources."""
time = datetime.datetime.now(tz=datetime.UTC).strftime(
format="%Y-%m-%d-%H-%M-%S",
)
return (
f"my-license-{time}",
f"my-database-{time}",
f"my-vumark-database-{time}",
f"my-vumark-template-{time}",
)


def main() -> None:
"""Create secrets files."""
email_address = os.environ["VWS_EMAIL_ADDRESS"]
Expand Down Expand Up @@ -146,12 +210,12 @@ def main() -> None:
driver = vws_web_tools.create_chrome_driver()
file = files_to_create[-1]
sys.stdout.write(f"Creating database {file.name}\n")
time = datetime.datetime.now(tz=datetime.UTC).strftime(
format="%Y-%m-%d-%H-%M-%S",
)
license_name = f"my-license-{time}"
database_name = f"my-database-{time}"
vumark_database_name = f"my-vumark-database-{time}"
(
license_name,
database_name,
vumark_database_name,
vumark_template_name,
) = _create_vuforia_resource_names()

try:
database_details = _create_and_get_database_details(
Expand Down Expand Up @@ -182,13 +246,28 @@ def main() -> None:
driver = None
continue

try:
vumark_target_id = _create_and_get_vumark_target_id(
driver=driver,
vumark_database_name=vumark_database_name,
vumark_template_name=vumark_template_name,
)
except TimeoutException:
sys.stderr.write(
"Timed out waiting for VuMark template upload after retries\n"
)
driver.quit()
driver = None
continue
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unhandled upload result leaks browser driver

Low Severity

main only handles TimeoutException around _create_and_get_vumark_target_id. When upload_vumark_template returns an unexpected shape, _create_and_get_vumark_target_id raises RuntimeError, which bypasses cleanup and leaves driver running. This can terminate admin/create_secrets_files.py early and leak browser processes.

Additional Locations (1)

Fix in Cursor Fix in Web


driver.quit()
driver = None

file_contents = _generate_secrets_file_content(
database_details=database_details,
vumark_details=vumark_details,
inactive_database_details=inactive_database_details,
vumark_target_id=vumark_target_id,
)
file.write_text(data=file_contents)
sys.stdout.write(f"Created database {file.name}\n")
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ optional-dependencies.dev = [
"vulture==2.14",
"vws-python==2026.2.15",
"vws-test-fixtures==2023.3.5",
"vws-web-tools==2026.2.16.1",
"vws-web-tools==2026.2.17",
"yamlfix==1.19.1",
"zizmor==1.22.0",
]
Expand Down
1 change: 1 addition & 0 deletions vuforia_secrets.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ INACTIVE_VUFORIA_CLIENT_ACCESS_KEY=<INACTIVE_CLIENT_ACCESS_KEY>
INACTIVE_VUFORIA_CLIENT_SECRET_KEY=<INACTIVE_CLIENT_SECRET_KEY>

VUMARK_VUFORIA_TARGET_MANAGER_DATABASE_NAME=<VUMARK_DATABASE_NAME>
VUMARK_VUFORIA_TARGET_ID=<SHARED_VUMARK_TARGET_ID>

VUMARK_VUFORIA_SERVER_ACCESS_KEY=<VUMARK_SERVER_ACCESS_KEY>
VUMARK_VUFORIA_SERVER_SECRET_KEY=<VUMARK_SERVER_SECRET_KEY>
Loading