PHP Classes

File: tests/test_compose_replyto_demo.php

Recommend this page to a friend!
  Packages of Matthew Asham   Binkterm PHP   tests/test_compose_replyto_demo.php   Download  
File: tests/test_compose_replyto_demo.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: 6,873 bytes
 

Contents

Class file image Download
<?php

/**
 * Demo test showing how the compose route handles REPLYTO kludges
 * This simulates the actual web interface behavior
 */

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

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

/**
 * Copy the helper functions from index.php for testing
 */
function isValidFidonetAddress($address) {
    return
preg_match('/^\d+:\d+\/\d+(?:\.\d+)?(?:@\w+)?$/', trim($address));
}

function
parseReplyToKludge($messageText) {
    if (empty(
$messageText)) {
        return
null;
    }
   
   
$lines = preg_split('/\r\n|\r|\n/', $messageText);
   
    foreach (
$lines as $line) {
       
$trimmed = trim($line);
       
        if (
preg_match('/^\x01REPLYTO\s+(.+)$/i', $trimmed, $matches)) {
           
$replyToData = trim($matches[1]);
           
            if (
preg_match('/^(\S+)(?:\s+(.+))?$/', $replyToData, $addressMatches)) {
               
$address = trim($addressMatches[1]);
               
$name = isset($addressMatches[2]) ? trim($addressMatches[2]) : null;
               
                if (
isValidFidonetAddress($address)) {
                    return [
                       
'address' => $address,
                       
'name' => $name
                   
];
                }
            }
        }
    }
   
    return
null;
}

echo
"Enhanced REPLYTO Demo - Web Interface Simulation\n";
echo
"===============================================\n\n";

// Create test data
$db = Database::getInstance()->getPdo();
$db->exec("DELETE FROM netmail WHERE subject LIKE 'REPLYTO DEMO%'");

echo
"1. Creating test message with REPLYTO kludge...\n";

$testMessage = [
   
'origAddr' => '1:234/567',
   
'destAddr' => '1:123/456',
   
'fromName' => 'Original Sender',
   
'toName' => 'Recipient',
   
'subject' => 'REPLYTO DEMO Message',
   
'dateTime' => date('d M y H:i:s'),
   
'text' => "\x01MSGID: 1:234/567 DEMO123\r\n\x01REPLYTO 2:460/256 8421559770\r\n\r\nThis message should be replied to 8421559770 at 2:460/256, not the original sender.",
   
'attributes' => 1
];

$processor = new BinkdProcessor();
$reflection = new ReflectionClass($processor);
$storeNetmailMethod = $reflection->getMethod('storeNetmail');
$storeNetmailMethod->setAccessible(true);
$storeNetmailMethod->invoke($processor, $testMessage, ['origZone' => 1, 'destZone' => 1]);

$stmt = $db->prepare("SELECT * FROM netmail WHERE subject = ? ORDER BY id DESC LIMIT 1");
$stmt->execute(['REPLYTO DEMO Message']);
$originalMessage = $stmt->fetch();

echo
" Original Message Details:\n";
echo
" - From: {$originalMessage['from_name']} ({$originalMessage['from_address']})\n";
echo
" - Subject: {$originalMessage['subject']}\n";
echo
" - Contains REPLYTO kludge in message text\n\n";

echo
"2. Simulating web interface reply logic...\n";

$handler = new MessageHandler();
$messageForReply = $handler->getMessage($originalMessage['id'], 'netmail', 1);

// Simulate the enhanced compose route logic
$replyToData = parseReplyToKludge($messageForReply['message_text']);

$templateVars = [];

if (
$replyToData) {
   
// Use REPLYTO address and name if valid FidoNet address found
   
$templateVars['reply_to_address'] = $replyToData['address'];
   
$templateVars['reply_to_name'] = $replyToData['name'] ?: $messageForReply['from_name'];
    echo
" ? REPLYTO kludge found and parsed successfully\n";
} else {
   
// Fallback to existing logic if no valid REPLYTO found
   
$templateVars['reply_to_address'] = $messageForReply['reply_address'] ?: ($messageForReply['original_author_address'] ?: $messageForReply['from_address']);
   
$templateVars['reply_to_name'] = $messageForReply['from_name'];
    echo
" ? No valid REPLYTO found, using fallback logic\n";
}

$templateVars['reply_subject'] = 'Re: ' . ltrim($messageForReply['subject'] ?? '', 'Re: ');

echo
"\n3. Compose form would be populated with:\n";
echo
" Reply To Address: {$templateVars['reply_to_address']}\n";
echo
" Reply To Name: {$templateVars['reply_to_name']}\n";
echo
" Reply Subject: {$templateVars['reply_subject']}\n\n";

// Test comparison - show what would happen with old vs new logic
echo "4. Comparison with old logic:\n";
$oldAddress = $messageForReply['reply_address'] ?: ($messageForReply['original_author_address'] ?: $messageForReply['from_address']);
$oldName = $messageForReply['from_name'];

echo
" Old Logic Would Use:\n";
echo
" - Address: $oldAddress\n";
echo
" - Name: $oldName\n\n";

echo
" New Enhanced Logic Uses:\n";
echo
" - Address: {$templateVars['reply_to_address']}\n";
echo
" - Name: {$templateVars['reply_to_name']}\n\n";

if (
$templateVars['reply_to_address'] !== $oldAddress || $templateVars['reply_to_name'] !== $oldName) {
    echo
" ? ENHANCEMENT ACTIVE: Reply will go to REPLYTO address instead of original sender!\n\n";
} else {
    echo
" ?? No difference (no valid REPLYTO found)\n\n";
}

// Test fallback scenario
echo "5. Testing fallback with UUCP address...\n";

$testMessage2 = [
   
'origAddr' => '1:234/567',
   
'destAddr' => '1:123/456',
   
'fromName' => 'Gateway User',
   
'toName' => 'Recipient',
   
'subject' => 'REPLYTO DEMO Fallback',
   
'dateTime' => date('d M y H:i:s'),
   
'text' => "\x01MSGID: 1:234/567 DEMO456\r\n\x01REPLYTO user@domain.com Gateway\r\n\r\nThis has invalid REPLYTO address.",
   
'attributes' => 1
];

$storeNetmailMethod->invoke($processor, $testMessage2, ['origZone' => 1, 'destZone' => 1]);

$stmt->execute(['REPLYTO DEMO Fallback']);
$fallbackMessage = $stmt->fetch();

$fallbackForReply = $handler->getMessage($fallbackMessage['id'], 'netmail', 1);
$fallbackReplyToData = parseReplyToKludge($fallbackForReply['message_text']);

if (
$fallbackReplyToData === null) {
    echo
" ? UUCP address correctly rejected\n";
    echo
" ? System will fall back to original sender address\n";
   
$fallbackAddress = $fallbackForReply['reply_address'] ?: ($fallbackForReply['original_author_address'] ?: $fallbackForReply['from_address']);
    echo
" ? Fallback address: $fallbackAddress\n\n";
} else {
    echo
" ? UUCP address should have been rejected\n";
}

// Clean up
echo "6. Cleaning up test data...\n";
$db->exec("DELETE FROM netmail WHERE subject LIKE 'REPLYTO DEMO%'");
echo
" ? Test data cleaned up\n\n";

echo
"=== DEMO COMPLETE ===\n";
echo
"The enhanced REPLYTO functionality is now working in the web interface:\n\n";
echo
"? When replying to netmail with 'REPLYTO 2:460/256 8421559770':\n";
echo
" - Reply address becomes: 2:460/256\n";
echo
" - Reply name becomes: 8421559770\n";
echo
" - Original sender address/name is ignored\n\n";
echo
"? UUCP addresses are rejected and system falls back gracefully\n";
echo
"? FidoNet address validation ensures only valid addresses are used\n";
echo
"? Integration works seamlessly with existing compose functionality\n\n";

?>