# Active ANY to Local Node Routings

> This report identifies Integration Broker routings where the sender node is ~~ANY~~ and the receiver is the default local node.

---

Site [llms.txt](/llms.txt)

---

<div class="alert alert-primary border shadow-sm mb-4 psl-prospect-cta" role="note">
  <div class="d-flex flex-column flex-lg-row align-items-lg-center justify-content-between gap-3">
    <div>
      <strong>New to psLens?</strong> This page documents one specific report. To see how it runs in the product, what
      the output looks like, and how teams use it in practice, start with a live walkthrough.
    </div>
    <div class="d-flex flex-wrap gap-2">
      <a class="btn btn-sm btn-primary" href="/contact/">Book a Demo</a>
      <a class="btn btn-sm btn-outline-primary" href="/docs/reports/">Browse Reports</a>
    </div>
  </div>
</div><div id="pslens-context-panel" class="card border-info mb-4 d-none">
  <div class="card-header bg-light text-info py-2 fw-bold d-flex align-items-center border-bottom border-info-subtle">
    <i class="bi bi-info-circle-fill me-2"></i>
    <span>Tailored Operational Context</span>
  </div>
  <div class="card-body p-0">
    <ul class="list-group list-group-flush">
      <li id="row-db" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Target Database:</strong>
        <span id="ctx-db" class="badge bg-secondary font-monospace">&mdash;</span>
      </li>
      <li id="row-type" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Context Type:</strong>
        <span id="ctx-type" class="badge bg-light text-dark border font-monospace text-uppercase">&mdash;</span>
      </li>
      <li id="row-severity" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Alert Severity:</strong>
        <span id="ctx-severity" class="badge">&mdash;</span>
      </li>
      <li id="row-time" class="list-group-item d-flex align-items-center justify-content-between py-2 d-none">
        <strong>Triggered Time:</strong>
        <span id="ctx-time" class="text-muted small">&mdash;</span>
      </li>
      <li id="row-details" class="list-group-item py-2 d-none">
        <strong id="label-details" class="d-block mb-1">Firing Context:</strong>
        <code id="ctx-details" class="d-block p-2 bg-light border rounded small"
          style="white-space: pre-wrap; word-break: break-all;">&mdash;</code>
      </li>
      <li id="row-sql" class="list-group-item py-2 d-none">
        <div class="d-flex justify-content-between align-items-center mb-1">
          <strong id="label-sql">Contextual SQL:</strong>
          <button id="btn-copy-sql" type="button" class="btn btn-sm btn-outline-secondary py-0 px-2 small">
            <i class="bi bi-clipboard me-1"></i>Copy SQL
          </button>
        </div>
        <pre class="mb-0 p-2 bg-light border rounded small"><code id="ctx-sql" style="white-space: pre-wrap; word-break: break-word;">&mdash;</code></pre>
      </li>
    </ul>
  </div>
</div>

<script>
  (function () {
    const params = new URLSearchParams(window.location.search);
    const metadata = params.get('metadata');
    if (!metadata) return;

    try {
      
      const base64 = metadata.replace(/-/g, '+').replace(/_/g, '/');
      const jsonStr = decodeURIComponent(escape(window.atob(base64)));
      const data = JSON.parse(jsonStr);

      if (data) {
        let hasData = false;

        if (data.db) {
          document.getElementById('ctx-db').textContent = data.db;
          document.getElementById('row-db').classList.remove('d-none');
          hasData = true;
        }

        if (data.type) {
          document.getElementById('ctx-type').textContent = data.type;
          document.getElementById('row-type').classList.remove('d-none');
          hasData = true;
        }

        if (data.severity) {
          const severityBadge = document.getElementById('ctx-severity');
          const severity = data.severity.toLowerCase();
          severityBadge.textContent = severity.toUpperCase();
          if (severity === 'critical') {
            severityBadge.className = 'badge bg-danger';
          } else if (severity === 'warning') {
            severityBadge.className = 'badge bg-warning text-dark';
          } else {
            severityBadge.className = 'badge bg-info';
          }
          document.getElementById('row-severity').classList.remove('d-none');
          hasData = true;
        }

        if (data.t) {
          const date = new Date(data.t * 1000);
          document.getElementById('ctx-time').textContent = date.toLocaleString();
          document.getElementById('row-time').classList.remove('d-none');
          hasData = true;
        }

        if (data.details) {
          document.getElementById('ctx-details').textContent = data.details;

          
          const labelDetails = document.getElementById('label-details');
          if (data.type === 'object') {
            labelDetails.textContent = 'Object Metadata Details:';
          } else if (data.type === 'report') {
            labelDetails.textContent = 'Report Description:';
          } else {
            labelDetails.textContent = 'Firing Context:';
          }

          document.getElementById('row-details').classList.remove('d-none');
          hasData = true;
        }

        if (data.sql) {
          document.getElementById('ctx-sql').textContent = data.sql;
          document.getElementById('row-sql').classList.remove('d-none');
          const copyBtn = document.getElementById('btn-copy-sql');
          if (copyBtn && navigator.clipboard) {
            copyBtn.addEventListener('click', function () {
              navigator.clipboard.writeText(data.sql).then(function () {
                copyBtn.innerHTML = '<i class="bi bi-check2 me-1"></i>Copied';
                setTimeout(function () {
                  copyBtn.innerHTML = '<i class="bi bi-clipboard me-1"></i>Copy SQL';
                }, 2000);
              });
            });
          }
          hasData = true;
        }

        if (hasData) {
          document.getElementById('pslens-context-panel').classList.remove('d-none');
        }
      }
    } catch (e) {
      console.error('Failed to parse operational context metadata:', e);
    }
  })();
</script>

## Active `~~ANY~~` to Local Node Routings Report

**Report ID:** `ib-any-to-local-routing`
**Category:** Integration Broker

## Purpose

This report identifies Integration Broker routings where the sender node is `~~ANY~~` and the receiver is the default local node. The `~~ANY~~` sender is a wildcard that allows **any external node** to send messages to the local system for that routing's operation, bypassing node-specific routing controls.

`~~ANY~~` routings are sometimes intentional (e.g., for broadly available services), but if left active without review they let any external node send messages inbound. This report lists which operations are open to inbound messages from any node.

## What It Detects

### WARNING — Active `~~ANY~~` to Local Node Routings

Active routings in PSIBRTNGDEFN where:

- `SENDERNODENAME = '~~ANY~~'`
- `RECEIVERNODENAME` is the default local node
- `EFF_STATUS = 'A'` (Active)

These routings are currently allowing any external node to send messages inbound.

## Tables Queried

### PSMSGNODEDEFN — Message Node Definitions

Used to identify the default local node(s).

|      Field      |            Description            | Filter  |
| --------------- | --------------------------------- | ------- |
| MSGNODENAME     | Node name (primary key)           |         |
| LOCALNODE       | Whether node is local             | `= 1`   |
| LOCALDEFAULTFLG | Whether node is the default local | `= 'Y'` |
| ACTIVE_NODE     | Whether the node is active        |         |

### PSIBRTNGDEFN — Integration Broker Routing Definitions

Used to find inbound routings to the default local node.

|      Field       |       Description       |            Filter            |
| ---------------- | ----------------------- | ---------------------------- |
| ROUTINGDEFNNAME  | Routing definition name |                              |
| SENDERNODENAME   | Sender node             | Checked for `~~ANY~~`        |
| RECEIVERNODENAME | Receiver node           | `= {default local node}`     |
| EFF_STATUS       | Effective status        | `A` = Active, `I` = Inactive |
| EFFDT            | Effective date          |                              |
| IB_OPERATIONNAME | Service operation name  |                              |
| DESCR            | Description             |                              |

## Data Flow

```text
1. Fetch ALL message nodes from PSMSGNODEDEFN
   (batches of 300)
        |
        v
2. Filter for default local nodes:
   LOCALNODE = 1 AND LOCALDEFAULTFLG = 'Y'
        |
        v
3. For each default local node, fetch inbound routings
   from PSIBRTNGDEFN where RECEIVERNODENAME = node
        |
        v
4. Filter for active routings where SENDERNODENAME = '~~ANY~~'
        |
        v
5. Generate Markdown report with findings
```

## Report Output

The generated report contains:

- **Header** with database name and generation timestamp
- **Summary** with total nodes scanned, default local node name(s), and count of active `~~ANY~~` routings
- **WARNING section** (if any): Table of active `~~ANY~~` routings with routing name, receiver node, linked service operation, and description
- **Recommendations** if active `~~ANY~~` routings are found

## Interpreting Results

- **WARNING findings should be reviewed.** Each active `~~ANY~~` routing means any external node can send messages for that operation to the local system. Determine whether this is intentional.
- **No findings** means all inbound routings use explicit sender nodes, which is the most secure configuration.

## Recommendations

1. Review each active `~~ANY~~` routing to determine if a wildcard sender is truly needed
2. Replace with explicit sender node routings where possible to restrict which nodes can send messages inbound
3. Deactivate unneeded `~~ANY~~` routings to reduce the attack surface
