privaterelay/apps.py (108 lines of code) (raw):
import base64
import json
import os
from pathlib import Path
from typing import TYPE_CHECKING, Any
from django.apps import AppConfig
from django.conf import settings
from django.utils.functional import cached_property
import markus
import requests
ROOT_DIR = os.path.abspath(os.curdir)
if TYPE_CHECKING:
from allauth.socialaccount.models import SocialApp
def configure_google_profiler() -> None:
if (
settings.GOOGLE_APPLICATION_CREDENTIALS == ""
or settings.GOOGLE_CLOUD_PROFILER_CREDENTIALS_B64 == ""
):
return
# Set up Google Cloud Profiler
service, version = get_profiler_startup_data()
if service is None:
return
gcp_key_json_path = Path(settings.GOOGLE_APPLICATION_CREDENTIALS)
if not gcp_key_json_path.exists():
write_gcp_key_json_file(gcp_key_json_path)
try:
with gcp_key_json_path.open() as gcp_key_file:
try:
# Make sure the expected gcp_key.json file is valid json
gcp_key_data = json.load(gcp_key_file)
import googlecloudprofiler
googlecloudprofiler.start(
service=service,
service_version=version,
project_id=gcp_key_data["project_id"],
)
except json.JSONDecodeError:
print(f"error during json.load({gcp_key_json_path})")
except Exception as exc:
print(
f"exception {repr(exc)}"
" while starting google cloud profiler"
f" with key file: {gcp_key_json_path}"
)
def get_profiler_startup_data() -> tuple[str | None, str | None]:
from .utils import get_version_info
if settings.RELAY_CHANNEL not in ("dev", "stage", "prod"):
return (None, None)
if settings.RELAY_CHANNEL in ("dev", "stage"):
service = f"fxprivaterelay-{settings.RELAY_CHANNEL}"
if settings.RELAY_CHANNEL == "prod":
service = "fxprivaterelay"
version_info = get_version_info()
version = version_info.get("version", "unknown")
return service, version
def write_gcp_key_json_file(gcp_key_json_path: Path) -> None:
"""
Create the gcp key json file from contents of GOOGLE_CLOUD_PROFILER_CREDENTIALS_B64
"""
google_app_creds = base64.b64decode(settings.GOOGLE_CLOUD_PROFILER_CREDENTIALS_B64)
if not google_app_creds == b"":
with open(gcp_key_json_path, "w+") as gcp_key_file:
gcp_key_file.write(google_app_creds.decode("utf-8"))
def configure_markus() -> None:
backends: list[dict[str, Any]] = []
if settings.DJANGO_STATSD_ENABLED and not settings.IN_PYTEST:
backends.append(
{
"class": "markus.backends.datadog.DatadogMetrics",
"options": {
"statsd_host": settings.STATSD_HOST,
"statsd_port": settings.STATSD_PORT,
"statsd_namespace": settings.STATSD_PREFIX,
},
}
)
if settings.STATSD_DEBUG:
backends.append(
{
"class": "markus.backends.logging.LoggingMetrics",
"options": {
"logger_name": "markus",
"leader": "METRICS",
},
}
)
markus.configure(backends=backends)
class PrivateRelayConfig(AppConfig):
name = "privaterelay"
def ready(self) -> None:
configure_markus()
configure_google_profiler()
import privaterelay.signals # noqa: F401 (imported but unused warning)
try:
del self.fxa_verifying_keys # Clear cache
del self.fxa_social_app # Clear cache
except AttributeError:
pass
@cached_property
def fxa_verifying_keys(self) -> list[dict[str, Any]]:
resp = requests.get(
"{}/jwks".format(settings.SOCIALACCOUNT_PROVIDERS["fxa"]["OAUTH_ENDPOINT"]),
timeout=10,
)
if resp.status_code == 200:
keys: list[dict[str, Any]] = resp.json()["keys"]
return keys
return []
@cached_property
def fxa_social_app(self) -> "SocialApp":
from allauth.socialaccount.models import SocialApp
return SocialApp.objects.get(provider="fxa")