PHP Classes

File: tests/detailed_packet_analysis.php

Recommend this page to a friend!
  Packages of Matthew Asham   Binkterm PHP   tests/detailed_packet_analysis.php   Download  
File: tests/detailed_packet_analysis.php
Role: Example script
Content type: text/plain
Description: Example script
Class: Binkterm PHP
Bulletin board system based on the Web
Author: By
Last change:
Date: 5 days ago
Size: 4,852 bytes
 

Contents

Class file image Download
<?php

require_once __DIR__ . '/../vendor/autoload.php';

use
BinktermPHP\MessageHandler;
use
BinktermPHP\Database;
use
BinktermPHP\BinkdProcessor;

// Initialize database
Database::getInstance();

echo
"=== DETAILED PACKET ANALYSIS ===\n";

// Post a test message
$messageHandler = new MessageHandler();
echo
"1. Creating test echomail message...\n";

$result = $messageHandler->postEchomail(
   
1,
   
'LOCALTEST',
   
'All',
   
'Packet Analysis Test',
   
'Analyzing packet structure in detail.'
);

if (!
$result) {
    echo
"Failed to create message\n";
    exit(
1);
}

// Get the message
$db = Database::getInstance()->getPdo();
$stmt = $db->prepare("
    SELECT em.*, ea.tag as echoarea_tag
    FROM echomail em
    JOIN echoareas ea ON em.echoarea_id = ea.id
    ORDER BY em.id DESC LIMIT 1
"
);
$stmt->execute();
$message = $stmt->fetch();

// Prepare for packet creation
$message['attributes'] = 0x0000;
$message['is_echomail'] = true;
$message['to_address'] = '1:153/149';

// Create processor and packet
$processor = new BinkdProcessor();
$packetFile = $processor->createOutboundPacket([$message], '1:153/149');

echo
"2. Created packet: $packetFile\n";

if (!
file_exists($packetFile)) {
    echo
"Packet file not found\n";
    exit(
1);
}

$content = file_get_contents($packetFile);
$size = strlen($content);

echo
"3. Packet size: $size bytes\n\n";

echo
"=== PACKET HEADER ANALYSIS (58 bytes) ===\n";
$header = substr($content, 0, 58);
$headerData = unpack('vorigNode/vdestNode/vyear/vmonth/vday/vhour/vminute/vsecond/vbaud/vpacketVersion/vorigNet/vdestNet', substr($header, 0, 24));

printf("Origin: %d:%d/%d\n", 1, $headerData['origNet'], $headerData['origNode']);
printf("Destination: %d:%d/%d\n", 1, $headerData['destNet'], $headerData['destNode']);
printf("Date: %04d-%02d-%02d %02d:%02d:%02d\n",
   
$headerData['year'], $headerData['month'] + 1, $headerData['day'],
   
$headerData['hour'], $headerData['minute'], $headerData['second']);
printf("Packet version: %d\n", $headerData['packetVersion']);

// Check zone info
if (strlen($header) >= 38) {
   
$zoneData = unpack('vorigZone/vdestZone', substr($header, 34, 4));
   
printf("Zone info (FSC-39): Orig=%d, Dest=%d\n", $zoneData['origZone'], $zoneData['destZone']);
}

echo
"\n=== MESSAGE STRUCTURE ANALYSIS ===\n";
$messageStart = 58;
$msgType = unpack('v', substr($content, $messageStart, 2))[1];
printf("Message type: %d (should be 2)\n", $msgType);

$msgHeader = unpack('vorigNode/vdestNode/vorigNet/vdestNet/vattr/vcost', substr($content, $messageStart + 2, 14));
printf("Message header - From: %d:%d/%d, To: %d:%d/%d\n",
   
1, $msgHeader['origNet'], $msgHeader['origNode'],
   
1, $msgHeader['destNet'], $msgHeader['destNode']);
printf("Message attributes: 0x%04X (%s)\n", $msgHeader['attr'],
   
$msgHeader['attr'] & 0x0001 ? 'PRIVATE/NETMAIL' : 'PUBLIC/ECHOMAIL');

// Read null-terminated strings
$pos = $messageStart + 16; // After type + header

function readNullString($content, &$pos) {
   
$start = $pos;
    while (
$pos < strlen($content) && ord($content[$pos]) !== 0) {
       
$pos++;
    }
   
$result = substr($content, $start, $pos - $start);
   
$pos++; // Skip null terminator
   
return $result;
}

$dateTime = readNullString($content, $pos);
$toName = readNullString($content, $pos);
$fromName = readNullString($content, $pos);
$subject = readNullString($content, $pos);

printf("DateTime: '%s'\n", $dateTime);
printf("To: '%s'\n", $toName);
printf("From: '%s'\n", $fromName);
printf("Subject: '%s'\n", $subject);

echo
"\n=== MESSAGE TEXT ANALYSIS ===\n";
$messageText = '';
while (
$pos < strlen($content) && ord($content[$pos]) !== 0) {
   
$messageText .= $content[$pos];
   
$pos++;
}

echo
"Message text length: " . strlen($messageText) . " bytes\n";
echo
"First 100 bytes (hex): " . bin2hex(substr($messageText, 0, 100)) . "\n";

// Look for kludge lines
$lines = explode("\n", str_replace("\r\n", "\n", $messageText));
echo
"\nKludge lines found:\n";
foreach (
$lines as $i => $line) {
    if (
strlen($line) > 0 && ord($line[0]) === 0x01) {
       
$kludgeLine = substr($line, 1); // Remove SOH
       
echo " ^A$kludgeLine\n";
    } elseif (
$i < 5) { // Show first few non-kludge lines
       
echo " TEXT: " . substr($line, 0, 50) . (strlen($line) > 50 ? '...' : '') . "\n";
    }
}

// Check for AREA kludge specifically
if (strpos($messageText, "\x01AREA:") !== false) {
    echo
"\n? AREA kludge line found\n";
} else {
    echo
"\n? AREA kludge line MISSING\n";
}

// Check for tearline and origin
if (strpos($messageText, "---") !== false) {
    echo
"? Tearline found\n";
} else {
    echo
"? Tearline missing\n";
}

if (
strpos($messageText, "* Origin:") !== false) {
    echo
"? Origin line found\n";
} else {
    echo
"? Origin line missing\n";
}

// Cleanup
unlink($packetFile);

echo
"\n=== ANALYSIS COMPLETE ===\n";