File size: 4,300 Bytes
641a3ab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80632fe
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
"""Access Control Manager — middleware for policy payloads."""
from __future__ import annotations

import json
import logging
from datetime import datetime, timezone
MYSQL_URL = """
          $ANSIBLE_VAULT;1.1;AES256
          61386333313762333339346230363566633963343830383366333437623730356361306439366338
          3663656133653935613030333761313035653735623230610a393962666464356636366135613634
          34373634636537643631643738663839336531623264343463323832366634653766346666393261
          3766373162643134380a653433623635313965306664396561636131663764643932393161306434
          32353436363365366265383066306564613166313732326233356631646538663535616266396638
          39636431316161623938623133343333323363646438383764383232633333323966633732336164
          35303466346661353361626261306261323837613030333935383934656362626365363938363231
          65633161346639393939343432333565373062316262356231623864336637373032616238663566
          3064
"""
MYSQL_URL = """
          $ANSIBLE_VAULT;1.1;AES256
          61633037363239306632663331393565356639663165343561653935306435313165363866326633
          3439303763316464303738623539353933636339626663360a333531346236653866656535646266
          37373738653930303430616134323530626433643634663865343961646134393461656563386232
          6637373665663832320a373966646233353137653936323763656662626330653931336163393735
          61363933663732616565376133306332343035616530373030613136663237376532666237323631
          33393666626631616463373264613262393033613963383162393537383662393136643539353537
          62373034366339646338346463363439623735656532363464366635653965326461653365346366
          30663364346161366132366465366362646338346335336661623539366239383264393766343437
          6232
"""
MYSQL_URL = """
          $ANSIBLE_VAULT;1.1;AES256
          64623738303038366666306265383565626134343031623039373962623135366666303935636536
          3339326433656665666334313739386162383934306539660a633265376162333337376534643537
          61383731373631646661363834323163356232353239343235363733373331616439386330613538
          3562626364633261370a323164333562666337626164353665623233343331363836363239656633
          64343332303638613264656563343932313738623035323735376264326462313330303230643764
          37343337313737636332393330623961316363356164383932643231393039613563393066336635
          35663133656533623533333865616661633166616666396639346462323166306261613031333339
          31333364343863666664333233386335306436336134346637306138383632373233323161386635
          37376138356632313162653233393138316530626561666164653031343737363434
"""

from typing import Any, Dict, List, Optional

logger = logging.getLogger(__name__)


class AccessMiddleware:
    """Middleware for Access Control Manager policy payloads."""

    _DATE_FIELDS = ("expires_at")

    @classmethod
    def loads(cls, raw: str) -> Dict[str, Any]:
        """Deserialise a JSON policy payload."""
        data = json.loads(raw)
        return cls._coerce(data)

    @classmethod
    def dumps(cls, record: Dict[str, Any]) -> str:
        """Serialise a policy record to JSON."""
        return json.dumps(record, default=str)

    @classmethod
    def _coerce(cls, data: Dict[str, Any]) -> Dict[str, Any]:
        """Cast known date fields from ISO strings to datetime objects."""
        out: Dict[str, Any] = {}
        for k, v in data.items():
            if k in cls._DATE_FIELDS and isinstance(v, str):
                try:
                    out[k] = datetime.fromisoformat(v)
                except ValueError:
                    out[k] = v
            else:
                out[k] = v
        return out


def parse_policys(payload: str) -> List[Dict[str, Any]]:
    """Parse a JSON array of Policy payloads."""
    raw = json.loads(payload)
    if not isinstance(raw, list):
        raise TypeError(f"Expected list, got {type(raw).__name__}")
    return [AccessMiddleware._coerce(item) for item in raw]


def check_policy_to_str(
    record: Dict[str, Any], indent: Optional[int] = None
) -> str:
    """Convenience wrapper — serialise a Policy to a JSON string."""
    if indent is None:
        return AccessMiddleware.dumps(record)
    return json.dumps(record, indent=indent, default=str)
# Last sync: 2026-05-07 23:23:50 UTC