mirror of
https://github.com/prowler-cloud/prowler.git
synced 2026-07-23 04:21:52 +00:00
4371ad1535
* feat(Backend): PRWLR-3989 add RLS to postgresql db and base models
* feat(API): PRWLR-3989 add TenantMiddleware
* chore(API, Backend): PRWLR-3989 create new db user without RLS bypass on migrations
* chore(Backend): PRWLR-3989 fix RLS bypasser for POST requests
* fix(Backend): PRWLR-3989 fix user permissions when migrating new models
* chore(Backend): PRWLR-3989 add testing view for RLS manual tests
* feat(API): PRWLR-3989 add tenant_id to API logging
* chore(API, Backend): PRWLR-3989 add TODOs
* test(API): PRWLR-3989 add new middleware unit tests
* chore(API): PRWLR-3989 refactor RLS code
* fix(tests): PRWLR-3989 fix testing db connector
* chore: PRWLR-3989 add references to JIRA tickets
* fix: PRWLR-3989 remove bypass logic and fix serializers
* fix: PRWLR-3989 improve drop SQL query for RLS models
* feat(Backend): PRWLR-3989 add specific permissions on each model
* fix(Backend): PRWLR-3989 fix database routing and grant select perms
* fix(test): PRWLR-3989 fix routing issues with unit tests
* chore: PRWLR-3989 remove references to JIRA tickets
* feat(Backend): PRWLR-3999 add Provider model
* feat: PRWLR-3999 add providers view logic
* fix: PRWLR-3999 fix unique index fields
* feat(API): PRWLR-3999 add custom exception handlers
* feat(API): PRWLR-3999 add /providers/{provider_id}/connection endpoint
* test(API): PRWLR-3999 add base unit tests for providers
* fix(API, Backend): PRWLR-3999 fix bugs after rebase
* chore(API, docker): PRWLR-3999 add dev feats for demo
* feat(API): PRWLR-3999 add drf-spectacular-jsonapi and improve docs
* test(API): PRWLR-3999 add providers unit tests
* chore(Backend): PRWLR-3989 adjust privileges for user on table tenant
* chore: PRWLR-3999 rename model custom validation error
* chore: PRWLR-3999 remove Test references
* chore: PRWLR-3999 update API v1 spec
* fix: PRWLR-3999 apply requested changes to filter and models
* feat: PRWLR-3999 add validation to PATCH /providers payload
* fix: PRWLR-3999 fix providers enum description
* chore: add more providers fixtures
* fix: PRWLR-3999 make providers.alias optional
101 lines
2.4 KiB
Python
101 lines
2.4 KiB
Python
from drf_spectacular.utils import extend_schema_field
|
|
from rest_framework_json_api import serializers
|
|
from rest_framework_json_api.serializers import ValidationError
|
|
|
|
from api.models import Provider
|
|
from api.rls import Tenant
|
|
|
|
|
|
# Base
|
|
|
|
|
|
class BaseSerializerV1(serializers.ModelSerializer):
|
|
def get_root_meta(self, _resource, _many):
|
|
return {"version": "v1"}
|
|
|
|
|
|
class BaseWriteSerializer(BaseSerializerV1):
|
|
def validate(self, data):
|
|
if hasattr(self, "initial_data"):
|
|
initial_data = set(self.initial_data.keys()) - {"id", "type"}
|
|
unknown_keys = initial_data - set(self.fields.keys())
|
|
if unknown_keys:
|
|
raise ValidationError(f"Invalid fields: {unknown_keys}")
|
|
return data
|
|
|
|
|
|
class RLSSerializer(BaseSerializerV1):
|
|
def create(self, validated_data):
|
|
tenant_id = self.context.get("tenant_id")
|
|
validated_data["tenant_id"] = tenant_id
|
|
return super().create(validated_data)
|
|
|
|
|
|
# Tenants
|
|
|
|
|
|
class TenantSerializer(BaseSerializerV1):
|
|
"""
|
|
Serializer for the Tenant model.
|
|
"""
|
|
|
|
class Meta:
|
|
model = Tenant
|
|
fields = "__all__"
|
|
|
|
|
|
# Providers
|
|
|
|
|
|
class ProviderSerializer(RLSSerializer):
|
|
"""
|
|
Serializer for the Provider model.
|
|
"""
|
|
|
|
connection = serializers.SerializerMethodField(read_only=True)
|
|
|
|
class Meta:
|
|
model = Provider
|
|
fields = [
|
|
"id",
|
|
"inserted_at",
|
|
"updated_at",
|
|
"provider",
|
|
"provider_id",
|
|
"alias",
|
|
"connection",
|
|
"scanner_args",
|
|
]
|
|
extra_kwargs = {
|
|
"id": {"read_only": True},
|
|
"inserted_at": {"read_only": True},
|
|
"updated_at": {"read_only": True},
|
|
"connection": {"read_only": True},
|
|
}
|
|
|
|
@extend_schema_field(
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"connected": {"type": "boolean"},
|
|
"last_checked_at": {"type": "string", "format": "date-time"},
|
|
},
|
|
}
|
|
)
|
|
def get_connection(self, obj):
|
|
return {
|
|
"connected": obj.connected,
|
|
"last_checked_at": obj.connection_last_checked_at,
|
|
}
|
|
|
|
|
|
class ProviderUpdateSerializer(BaseWriteSerializer):
|
|
"""
|
|
Serializer for updating the Provider model.
|
|
Only allows "alias" and "scanner_args" fields to be updated.
|
|
"""
|
|
|
|
class Meta:
|
|
model = Provider
|
|
fields = ["alias", "scanner_args"]
|