Skip to content
Open
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
19 changes: 2 additions & 17 deletions backend/api/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@
)
from uuid import uuid4
from datetime import timedelta
from backend.api.kv import write
import json
from django.utils import timezone
from django.conf import settings
from api.services import Providers, ServiceConfig
from api.tasks.syncing import trigger_sync_tasks, detect_and_trigger_referencing_syncs
from backend.quotas import (
Expand All @@ -20,9 +17,6 @@
from django.core.exceptions import ValidationError
from api.utils.access.roles import MANAGED_ROLE_CHOICES

CLOUD_HOSTED = settings.APP_HOST == "cloud"


class CustomUserManager(BaseUserManager):
def create_user(self, username, email, password=None):
"""
Expand Down Expand Up @@ -231,6 +225,8 @@ class App(models.Model):
)
name = models.CharField(max_length=64)
description = models.TextField(null=True, blank=True)
# Retired KMS fields are retained for upgrade compatibility and historical
# data preservation. They are not credentials for any supported API.
identity_key = models.CharField(max_length=256)
app_version = models.IntegerField(null=False, blank=False, default=1)
app_token = models.CharField(max_length=64)
Expand All @@ -244,17 +240,6 @@ class App(models.Model):

objects = AppManager()

def save(self, *args, **kwargs):
super().save(*args, **kwargs) # Call the "real" save() method.
if CLOUD_HOSTED:
key = self.app_token
value = self.wrapped_key_share
meta = {"appId": self.id, "appName": self.name, "live": True}
try:
write(key, value, json.dumps(meta))
except:
pass

def __str__(self):
return self.name

Expand Down
45 changes: 0 additions & 45 deletions backend/api/views/apps.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,6 @@
service_account_can_access_app,
)
from api.utils.access.roles import ADMIN_ROLE_KEY, OWNER_ROLE_KEY
from api.utils.crypto import (
encrypt_raw,
env_keypair,
get_server_keypair,
random_hex,
split_secret_hex,
wrap_share_hex,
)
from api.utils.audit_logging import audit_app_cascade_envs, log_audit_event, get_actor_info, build_change_values
from api.utils.environments import create_environment
from api.utils.rest import METHOD_TO_ACTION, get_resolver_request_meta, validate_text_field
Expand All @@ -31,14 +23,10 @@
from rest_framework.response import Response
from rest_framework import status
from djangorestframework_camel_case.render import CamelCaseJSONRenderer
from django.conf import settings
from django.db import transaction

logger = logging.getLogger(__name__)

CLOUD_HOSTED = settings.APP_HOST == "cloud"


class PublicAppsView(APIView):
authentication_classes = [PhaseTokenAuthentication]
permission_classes = [IsAuthenticated, IsIPAllowed]
Expand Down Expand Up @@ -189,19 +177,6 @@ def post(self, request, *args, **kwargs):
status=status.HTTP_403_FORBIDDEN,
)

# --- Generate cryptographic material (server-side, SSE) ---
app_seed = random_hex(32)
app_token = random_hex(32)
wrap_key = random_hex(32)

identity_key_pub, identity_key_priv = env_keypair(app_seed)

_share0, share1 = split_secret_hex(identity_key_priv)
wrapped_key_share = wrap_share_hex(share1, wrap_key)

_server_pk, server_sk = get_server_keypair()
encrypted_app_seed = bytes(encrypt_raw(app_seed, server_sk)).hex()

# --- Determine requesting account ---
requesting_user = None
requesting_sa = None
Expand All @@ -217,11 +192,6 @@ def post(self, request, *args, **kwargs):
organisation=org,
name=name,
description=description,
identity_key=identity_key_pub,
app_version=1,
app_token=app_token,
app_seed=encrypted_app_seed,
wrapped_key_share=wrapped_key_share,
sse_enabled=True,
)

Expand Down Expand Up @@ -409,28 +379,13 @@ def delete(self, request, app_id, *args, **kwargs):
app_name = app.name
org = app.organisation

if CLOUD_HOSTED:
from backend.api.kv import delete as kv_delete, purge as kv_purge

deleted = kv_delete(app.app_token)
purged = kv_purge(
f"phApp:v{app.app_version}:{app.identity_key}/{app.app_token}"
)
if not deleted or not purged:
return Response(
{"error": "Failed to delete app keys from CDN. Please try again."},
status=status.HTTP_500_INTERNAL_SERVER_ERROR,
)

actor_type, actor_id, actor_meta = get_actor_info(request)
ip_address, user_agent = get_resolver_request_meta(request)

audit_app_cascade_envs(
app, actor_type, actor_id, actor_meta, ip_address, user_agent
)

app.wrapped_key_share = ""
app.save()
app.delete()

log_audit_event(
Expand Down
41 changes: 0 additions & 41 deletions backend/api/views/kms.py

This file was deleted.

85 changes: 0 additions & 85 deletions backend/backend/api/kv.py

This file was deleted.

Loading