Skip to main content

OCI Lexer Parser

Wiki PyPI Unit Tests License Issues Forks Stars

Overview

Note this SDK is used in "OCInferno", a tool to be released within the NetSPI repo by end of March for OCI enumeration and mapping.

In the spirit of full transparency, the development of the script was done with the help of LLM coding assistants. The assistant did most of the heavy lifting. As with any open-source tool, make sure that you review the code to understand what its doing before you run it. That said, we've reviewed the code for any potential issues and welcome any changes via PR requests. See Contributing.md at the repo root.

OCI Lexer Parser converts human-readable OCI IAM statements and dynamic group rules into normalized JSON for analysis, testing, or transformation. It is built with built with ANTLR4 and Python. See Credits below for the original groundwork in the area by Gordon Trevorrow.

For additional information regarding the JSON schema and different options offered by the SDK, review the corresponding Github wiki:


At a Glance

Area Details
Statement types ALLOW, DENY, DEFINE, ADMIT, ENDORSE
Verbs and permissions manage, use, read, inspect, plus {PERMISSION} lists
Subjects group, dynamic-group, service, any-user, any-group
Locations tenancy, compartment name, compartment path, compartment OCID
Conditions ANY / ALL clauses, nested groups, same-mode flattening
Dynamic group rules ALL / ANY groups, nested structures, strict LHS paths
Diagnostics raise, report, or ignore error handling
Output normalization DEFINE substitutions, identity domain enrichment, spans

Some features offered by the SDK include:

  • Auto-simplification of large complex conditionals in policies or dynamic groups
  • Auto-substitutaiton of values for DEFINE statements
  • Data enrichment by supplying information like tenancy data
  • Different reporting modes depending on your specific use case

Installation

Requires Python 3.10+.

Option A: pip

pip install oci-lexer-parser

Option B: Git clone

git clone git@github.com:NetSPI/oci-lexer-parser.git
cd oci-lexer-parser
virtualenv .venv && source .venv/bin/activate
pip install -U pip
pip install .

Import name in Python:

import oci_lexer_parser

Verify the CLI:

oci-lexer-parse --help

SDK Examples

Parse Policy Statements

Input:

Allow service faas to read keys in compartment f_compartment where request.operation='GetKeyVersion'

SDK:

from oci_lexer_parser import parse_policy_statements

text = "Allow service faas to read keys in compartment f_compartment where request.operation='GetKeyVersion'"
payload, diagnostics = parse_policy_statements(text, error_mode="report")
print(payload)

Output:

{
  "schema_version": "1.0",
  "statements": [
    {
      "kind": "allow",
      "subject": {"type": "service", "values": [{"label": "faas"}]},
      "actions": {"type": "verbs", "values": ["read"]},
      "resources": {"type": "specific", "values": ["keys"]},
      "location": {"type": "compartment_name", "values": ["f_compartment"]},
      "conditions": {
        "type": "group",
        "mode": "all",
        "items": [
          {
            "type": "clause",
            "node": {
              "lhs": "request.operation",
              "op": "eq",
              "rhs": {"type": "literal", "value": "GetKeyVersion"}
            }
          }
        ]
      }
    }
  ]
}

Parse Dynamic Group Matching Rules

Input:

ALL { instance.compartment.id = 'ocid1.compartment.oc1..example', resource.type = 'instance' }

SDK:

from oci_lexer_parser import parse_dynamic_group_matching_rules

payload = parse_dynamic_group_matching_rules(
    "ALL { instance.compartment.id = 'ocid1.compartment.oc1..example', resource.type = 'instance' }"
)
print(payload)

Output:

{
  "schema_version": "1.0",
  "rules": [
    {
      "level": 1,
      "expr": {
        "type": "group",
        "mode": "all",
        "items": [
          {
            "type": "clause",
            "node": {
              "lhs": "instance.compartment.id",
              "op": "eq",
              "rhs": {"type": "ocid", "value": "ocid1.compartment.oc1..example"}
            }
          },
          {
            "type": "clause",
            "node": {
              "lhs": "resource.type",
              "op": "eq",
              "rhs": {"type": "literal", "value": "instance"}
            }
          }
        ]
      }
    }
  ]
}

CLI Examples

Parse from stdin:

echo "Allow service faas to read keys in compartment f_compartment" | oci-lexer-parse --pretty

Parse a file with diagnostics:

oci-lexer-parse --error-mode report ./policy.txt --pretty

Stream JSON Lines:

oci-lexer-parse ./policy.txt --jsonl

Dependencies

Runtime dependency:

antlr4-python3-runtime>=4.13.2,<4.14

Contributing

See Contributing.md.


Credits

Author: WebbinRoot

Metadata

Release files for oci-lexer-parser 0.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for oci-lexer-parser 0.5.0
File Size Uploaded Provenance
oci_lexer_parser-0.5.0.tar.gz 58.7 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for oci-lexer-parser 0.5.0
File Interpreter ABI Platform
oci_lexer_parser-0.5.0-py3-none-any.whl Python 3 none any Details

Total release size: 122.1 kB

Release files / oci_lexer_parser-0.5.0.tar.gz

Download URL oci_lexer_parser-0.5.0.tar.gz
Size 58.7 kB
Tags Source
SHA-256 checksum
How to use checksums
a9efdb28bc42b9f93b35cd76dae3b2fe2f297b7e1e1c792bbeb359223b7da8c0
BLAKE2b-256 checksum
How to use checksums
852b5f4621e9375ca0498d8795fa211b426e5d225ac2fcd77ed23bc7eb08394a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 12, 2026.

Transparency log

Release files / oci_lexer_parser-0.5.0-py3-none-any.whl

Download URL oci_lexer_parser-0.5.0-py3-none-any.whl
Size 63.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
1d2b793ec3adf597bbe98a03875ada6e9b592c7f1140ca2b26b11d1934fba998
BLAKE2b-256 checksum
How to use checksums
2d871a9d1b7e4ed2cf5a878ab2b86830bdb48a5a8b32b34f0267a8c2a5d2b3a7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 12, 2026.

Transparency log

Security for oci-lexer-parser 0.5.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for oci_lexer_parser-0.5.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Aug 12, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

0.5.0 This release

2 release files Full provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page