How the Egonex-AI Code Viewer Fetches and Displays Source Content Securely

The Egonex-AI code viewer protects source files through a defense-in-depth architecture that combines one-time access tokens, strict path validation against a knowledge-graph allow-list, and server-side binary detection before serving content to the React frontend.

The Understand-Anything repository provides a secure dashboard for visualizing codebases without exposing sensitive files to unauthorized browsers. Its code viewer implements multiple security layers in the Vite development server configuration to ensure only intended source files are accessible.

Security Architecture Overview

The system operates on a token-gated endpoint model that validates every request before filesystem access occurs. This architecture prevents unauthorized access even if the development server is exposed to the network.

Token-Based Authentication

When the development server starts, it generates a cryptographically random ACCESS_TOKEN in vite.config.ts (lines 9-13). This one-time secret is printed to the console and embedded in the dashboard URL as /?token=<token>. Every protected endpoint—including /file-content.json and /knowledge-graph.json—requires this token as a query parameter. Requests with missing or incorrect tokens receive an immediate 403 Forbidden response (lines 63-68).

Request Routing and Validation

The server intercepts all data requests through a custom middleware that routes traffic to specific handlers. The readSourceFile function (lines 14-76) serves as the single entry point for source file access, ensuring consistent security policy enforcement across all file requests.

Server-Side Security Implementation

The readSourceFile function in vite.config.ts implements five critical validation layers before returning file content.

Path Sanitization and Allow-Listing

The function first validates the requested path against injection and traversal attacks:

  • Null-byte rejection: Paths containing null bytes are immediately rejected
  • Absolute path blocking: Requests for absolute paths are denied
  • Traversal prevention: The function resolves the path and verifies it remains within the project root, preventing ../ escape sequences
  • Knowledge-graph allow-list: The graphFilePathSet contains only file paths present in the generated knowledge graph; any request for a path not in this set returns 404 Not Found

File Content Restrictions

Even valid paths undergo content inspection:

  • Size enforcement: Files exceeding MAX_SOURCE_FILE_BYTES (1 MiB) return 413 Payload Too Large
  • Binary detection: If the file buffer contains a NUL byte (0x00), the server assumes binary content and returns 415 Unsupported Media Type
  • JSON encoding: All successful responses pass through sendJson, ensuring predictable Content-Type headers and preventing accidental raw filesystem data leakage

Client-Side Implementation

The React frontend in CodeViewer.tsx constructs authenticated requests and manages UI states while never exposing filesystem access logic.

URL Construction and Fetch Logic

The component builds signed URLs using the accessToken prop and selected file path:

// CodeViewer.tsx lines 26-30
function fileContentUrl(filePath: string, token: string): string {
  const params = new URLSearchParams({ token, path: filePath });
  return `/file-content.json?${params.toString()}`;
}

The useEffect hook (lines 84-102) issues the fetch request and validates the response status before updating the component state to loaded, error, or loading. Error handling captures both network failures and permission denials from the server.

Rendering with Syntax Highlighting

Upon successful fetch, the component receives a SourceFile JSON payload containing path, language, content, sizeBytes, and lineCount. The content feeds into prism-react-renderer (lines 111-119) for syntax-highlighted display, while the component manages modal presentation and close callbacks.

Starting the Secure Dashboard

To launch the protected environment:


# Inside the plugin workspace

pnpm dev:dashboard

# Console output:

🔑  Dashboard URL: http://127.0.0.1:5173/?token=8f3a9c2d5e1b4a6c9d0e1f2a3b4c5d6e

Important: The printed token must remain secret; the dashboard will not function without it, and all API endpoints will return 403 errors.

For programmatic access or testing, construct requests with the encoded token:

const token = "8f3a9c2d5e1b4a6c9d0e1f2a3b4c5d6e";
const path = "src/utils/helpers.ts";

fetch(`http://127.0.0.1:5173/file-content.json?token=${token}&path=${encodeURIComponent(path)}`)
  .then(r => r.json())
  .then(console.log)
  .catch(console.error);

The response conforms to the SourceFile interface:

{
  "path": "src/utils/helpers.ts",
  "language": "typescript",
  "content": "export function foo() { … }",
  "sizeBytes": 342,
  "lineCount": 12
}

Summary

  • One-time tokens: The server generates a cryptographically secure ACCESS_TOKEN at startup that gates all data endpoints in vite.config.ts
  • Defense-in-depth validation: The readSourceFile function enforces path sanitization, allow-list membership, size limits, and binary detection before serving content
  • Signed URLs: The CodeViewer.tsx component constructs authenticated requests using the token and selected file path, handling loading and error states gracefully
  • Knowledge-graph isolation: Only files explicitly referenced in the generated knowledge graph are accessible, preventing arbitrary filesystem browsing
  • Binary and size protection: Files over 1 MiB or containing binary data are automatically rejected with appropriate HTTP status codes

Frequently Asked Questions

What happens if the access token is missing or incorrect?

The server middleware in vite.config.ts (lines 63-66) checks url.searchParams.get("token") against the ACCESS_TOKEN constant. If the values do not match, the server immediately responds with 403 Forbidden and terminates the request before any filesystem access occurs.

How does the server prevent directory traversal attacks?

The readSourceFile function validates paths by resolving them against the project root and verifying they do not escape the repository boundary. It rejects absolute paths, null bytes, and any relative path sequences (such as ../) that resolve outside the allowed directory, effectively neutralizing traversal attempts.

Why is there a 1 MiB file size limit?

The MAX_SOURCE_FILE_BYTES constant (1 MiB) prevents denial-of-service attacks through excessive memory consumption and ensures the syntax highlighter can process files efficiently. Files exceeding this limit return 413 Payload Too Large, protecting both server resources and client-side rendering performance.

Can binary files be viewed through the code viewer?

No. The server inspects the file buffer for NUL bytes (0x00), which indicate binary content. If detected, the server returns 415 Unsupported Media Type. This restriction ensures only human-readable source code is displayed through the prism-react-renderer interface, preventing corruption of the syntax-highlighted output.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →