<?php namespace Tests\Feature; use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Support\Facades\Storage; use Tests\TestCase; use App\Classes\File; use App\Classes\FTN\{Message,Packet}; use App\Models\{Address,Domain,System,Zone}; class PacketTest extends TestCase { use DatabaseTransactions; //private System $so; private Domain $do; private function init_fidonet(): void { $do = new Domain; $do->active = TRUE; $do->name = 'fidonet'; $do->flatten = TRUE; $do->save(); $zo = new Zone; $zo->zone_id = 1; $zo->active = TRUE; $zo->system_id = 2; $zo->default = TRUE; $do->zones()->save($zo); $zo = new Zone; $zo->zone_id = 2; $zo->active = TRUE; $zo->system_id = 3; $zo->default = TRUE; $do->zones()->save($zo); $zo = new Zone; $zo->zone_id = 3; $zo->active = TRUE; $zo->system_id = 1; $zo->default = TRUE; $do->zones()->save($zo); Address::createFTN('3:633/280@fidonet',System::findOrFail(1)); Address::createFTN('3:633/2744@fidonet',System::findOrFail(2)); $this->do = $do; } private function init_fsxnet(): void { $do = new Domain; $do->active = TRUE; $do->name = 'fsxnet'; $do->flatten = TRUE; $do->save(); $zo = new Zone; $zo->zone_id = 21; $zo->active = TRUE; $zo->system_id = 1; $zo->default = TRUE; $do->zones()->save($zo); Address::createFTN('21:3/100@fsxnet',System::findOrFail(2)); Address::createFTN('21:3/2744@fsxnet',System::findOrFail(3)); Address::createFTN('21:3/184@fsxnet',System::findOrFail(4)); $this->do = $do; } private function init_private(): void { $do = new Domain; $do->active = TRUE; $do->name = 'private'; $do->flatten = TRUE; $do->save(); $zo = new Zone; $zo->zone_id = 10; $zo->active = TRUE; $zo->system_id = 1; $zo->default = TRUE; $do->zones()->save($zo); Address::createFTN('10:1/1@private',System::findOrFail(3)); Address::createFTN('10:1/2@private',System::findOrFail(4)); $this->do = $do; } private function mail_file(string $file) { $fs = Storage::disk(config('fido.local_disk')); return new File($fs->path(sprintf('%s/%s',config('fido.dir'),$file))); } public function test_packet_1() { $this->init_fidonet(); $f = $this->mail_file('mail/018A-1702393055-78754407.pkt'); foreach ($f as $packet) { $pkt = Packet::process($packet,$x=$f->itemName(),$f->itemSize(),$this->do); $this->assertInstanceOf(Packet\FSC39::class,$pkt); $this->assertEquals('ABCDEFGH',$pkt->password); $this->assertEquals(1,count($pkt)); $this->assertEquals('3634/27 12 154/10 221/6 218/840 770/1 633/280',$pkt->messages[0]->path[0]); $this->assertEquals('1/120 18/0 116/116 120/616 123/0 10 25 126 160 180 200 525 755 3001',$pkt->messages[0]->seenby[0]); $this->assertEquals('*The Gate BBS*Shelby, NC USA*thegateb.synchro.net* (1:3634/27)',$pkt->messages[0]->origin); $this->assertEquals('1:3634/27.0@fidonet',$pkt->messages[0]->fftn); $this->assertEquals('1:633/2744.0@fidonet',$pkt->messages[0]->tftn); $this->assertEquals('Gate Keeper',$pkt->messages[0]->user_from); $this->assertEquals('Meitsi',$pkt->messages[0]->user_to); $this->assertEquals('Status of HAM radio in FidoNet',$pkt->messages[0]->subject); $this->assertEquals('275.fidonet_ham@1:3634/27 29ddab74',$pkt->messages[0]->msgid); $this->assertEquals('1:229/428 012c0322',$pkt->messages[0]->replyid); $this->assertEquals('bc291b3ea15750c2d0c39c9221093901',md5($pkt->messages[0]->message)); } } public function test_packet_2() { $this->init_fidonet(); $f = $this->mail_file('mail/018A-1701955391-71c7a400.pkt'); foreach ($f as $packet) { $pkt = Packet::process($packet,$x=$f->itemName(),$f->itemSize(),$this->do); $this->assertInstanceOf(Packet\FSC39::class,$pkt); $this->assertEquals('ABCDEFGH',$pkt->password); $this->assertEquals(43,count($pkt)); $this->assertEquals('229/664 426 633/280',$pkt->messages[0]->path[0]); $this->assertEquals('15/0 106/201 128/260 129/305 153/7715 218/700 221/6 226/30 227/114',$pkt->messages[0]->seenby[0]); $this->assertEquals('Northern Realms (1:229/664)',$pkt->messages[0]->origin); $this->assertEquals('1:229/664.0@fidonet',$pkt->messages[0]->fftn); $this->assertEquals('1:633/2744.0@fidonet',$pkt->messages[0]->tftn); $this->assertEquals('Northern Realms',$pkt->messages[0]->user_from); $this->assertEquals('All',$pkt->messages[0]->user_to); $this->assertEquals('NYPost Daily Horoscope',$pkt->messages[0]->subject); $this->assertEquals('1:229/664 56db6f89',$pkt->messages[0]->msgid); $this->assertEquals('',$pkt->messages[0]->replyid); $this->assertEquals('b8c33987647e88f86456f0e571e98398',md5($pkt->messages[0]->message)); } } public function test_packet_3() { $this->init_fsxnet(); $f = $this->mail_file('mail/0B39-1701919239-65713a06.pkt'); foreach ($f as $packet) { $pkt = Packet::process($packet,$x=$f->itemName(),$f->itemSize(),$this->do); $this->assertInstanceOf(Packet\FSC48::class,$pkt); $this->assertEquals('ABCDEFG#',$pkt->password); $this->assertEquals(4,count($pkt)); $this->assertInstanceOf(Message::class,$pkt->messages[0]); $this->assertEquals('3/165 100 184',$pkt->messages[0]->path[0]); $this->assertEquals('1/100 179 2/100 116 3/100 105 107 108 109 110 111 113 119 120 126 127',$pkt->messages[0]->seenby[0]); $this->assertEquals('www.theunderground.us Telnet 10023 SSH 7771 (21:3/165)',$pkt->messages[0]->origin); $this->assertEquals('21:3/165.0@fsxnet',$pkt->messages[0]->fftn); $this->assertEquals('21:3/2744.0@fsxnet',$pkt->messages[0]->tftn); $this->assertEquals('ibbslastcall',$pkt->messages[0]->user_from); $this->assertEquals('All',$pkt->messages[0]->user_to); $this->assertEquals('ibbslastcall-data',$pkt->messages[0]->subject); $this->assertEquals('21:3/165 6b42fe09',$pkt->messages[0]->msgid); $this->assertEquals('',$pkt->messages[0]->replyid); $this->assertEquals('aa6bc82b63355ab68889f61822305072',md5($pkt->messages[0]->message)); } } public function test_nomsgid_origin() { $this->init_private(); $f = $this->mail_file('mail/test_nomsgid_origin.pkt'); foreach ($f as $packet) { $pkt = Packet::process($packet,$f->itemName(),$f->itemSize()); $this->assertInstanceOf(Packet\FSC39::class,$pkt); $this->assertEquals(1,$pkt->count()); foreach ($pkt as $msg) { $this->assertNotTrue($msg->isNetmail()); $this->assertEquals('PVT_TEST',$msg->echoarea); } $this->assertInstanceOf(Message::class,$pkt->messages[0]); $this->assertEquals('1/1 999/1',$pkt->messages[0]->path[0]); $this->assertEquals('Daytona BBS (Netherlands) (10:3/151)',$pkt->messages[0]->origin); $this->assertEquals('10:3/151.0@private',$pkt->messages[0]->fftn); $this->assertEquals('10:999/999.0@private',$pkt->messages[0]->tftn); $this->assertEquals('Hub Robot',$pkt->messages[0]->user_from); $this->assertEquals('Henk Hilgersum',$pkt->messages[0]->user_to); $this->assertEquals('LEMEIN',$pkt->messages[0]->subject); $this->assertEquals('',$pkt->messages[0]->msgid); $this->assertEquals('',$pkt->messages[0]->replyid); $this->assertEquals('6bbe3d0475cf60804ca4e942212d3456',md5($pkt->messages[0]->message)); } } /* * @todo We are not correctly setup to parse messages without an origin line public function test_nomsgid_noorigin() { $this->init_private(); // This packet has no Origin Line $f = $this->mail_file('mail/test_nomsgid_noorigin.pkt'); foreach ($f as $packet) { $pkt = Packet::process($packet,$f->itemName(),$f->itemSize(),$this->do); $this->assertInstanceOf(Packet\FSC39::class,$pkt); $this->assertEquals(1,$pkt->count()); foreach ($pkt as $msg) { dump($msg); $this->assertNotTrue($msg->isNetmail()); $this->assertNotFalse($msg->path->search('1/1 999/1')); $this->assertNotFalse($msg->seenby->search('1/1 4 3/0 999/1 999')); } } } */ public function test_msgid_origin() { $this->init_private(); // This packet has an incorrect zone in the Origin $f = $this->mail_file('mail/test_msgid_origin.pkt'); foreach ($f as $packet) { $pkt = Packet::process($packet,$f->itemName(),$f->itemSize(),$this->do); $this->assertInstanceOf(Packet\FSC39::class,$pkt); $this->assertEquals(1,$pkt->count()); foreach ($pkt as $msg) { $this->assertNotTrue($msg->isNetmail()); $this->assertEquals('PVT_TEST',$msg->echoarea); $this->assertNotFalse($msg->seenby->search('1/1 999/1 999')); } $this->assertInstanceOf(Message::class,$pkt->messages[0]); $this->assertEquals('999/1',$pkt->messages[0]->path[0]); $this->assertEquals('Alterant MailHUB at your service (10:999/1)',$pkt->messages[0]->origin); $this->assertEquals('10:999/1.0@private',$pkt->messages[0]->fftn); $this->assertEquals('10:999/999.0@private',$pkt->messages[0]->tftn); $this->assertEquals('Hub Robot',$pkt->messages[0]->user_from); $this->assertEquals('deon',$pkt->messages[0]->user_to); $this->assertEquals('Hub Robot Report',$pkt->messages[0]->subject); $this->assertEquals('10:999/1 612aecda',$pkt->messages[0]->msgid); $this->assertEquals('',$pkt->messages[0]->replyid); $this->assertEquals('61078e680cda04c8b5eba0f712582e70',md5($pkt->messages[0]->message)); } } public function test_soh_char_soa() { $this->init_fsxnet(); // This packet has a SOH<char>SOH sequence $f = $this->mail_file('mail/test_binary_content-2.pkt'); foreach ($f as $packet) { $pkt = Packet::process($packet,$f->itemName(),$f->itemSize(),$this->do); $this->assertEquals(1,$pkt->count()); $messages = FALSE; foreach ($pkt as $msg) { $messages = TRUE; $this->assertNotTrue($msg->isNetmail()); $this->assertSame('21:1/151 6189F64C',$msg->msgid); $this->assertSame('db727bd3778ddd457784ada4bf016010',md5($msg->message)); $this->assertSame('5b627ab5936b0550a97b738f4deff419',md5($msg->message_src)); $this->assertContains('3/2744 4/100 106 5/100',$msg->seenby); $this->assertContains('1/151 100 3/100',$msg->path); $this->assertCount(11,$msg->seenby); $this->assertCount(0,$msg->unknown); } $this->assertTrue($messages); } } public function test_soh_message() { $this->init_fsxnet(); // This packet has SOH in the message content $f = $this->mail_file('mail/test_binary_content.pkt'); foreach ($f as $packet) { $pkt = Packet::process($packet,$f->itemName(),$f->itemSize()); $this->assertEquals(1,$pkt->count()); $messages = FALSE; foreach ($pkt as $msg) { $messages = TRUE; $this->assertNotTrue($msg->isNetmail()); $this->assertSame('21:1/126 eec6e958',$msg->msgid); $this->assertSame('5a525cc1c393292dc65160a852d4d615',md5($msg->message)); $this->assertSame('a3193edcc68521d4ed07da6db2aeb0b6',md5($msg->message_src)); $this->assertContains('1/995 2/100 116 1202 3/100 105 107 108 109 110 111 112 113 117 119',$msg->seenby); $this->assertContains('1/126 100 3/100',$msg->path); $this->assertCount(10,$msg->seenby); $this->assertCount(0,$msg->unknown); } $this->assertTrue($messages); } } public function test_bad_zone() { $this->init_private(); // This packet has an incorrect zone in the Origin $f = $this->mail_file('mail/test_msgid_origin.pkt'); foreach ($f as $packet) { $pkt = Packet::process($packet,$f->itemName(),$f->itemSize()); $this->assertEquals(1,$pkt->count()); $messages = FALSE; foreach ($pkt as $msg) { $messages = TRUE; $this->assertNotTrue($msg->isNetmail()); $this->assertSame('10:999/1 612aecda',$msg->msgid); $this->assertSame('61078e680cda04c8b5eba0f712582e70',md5($msg->message)); $this->assertSame('b9d65d4f7319ded282f3f1986276ae79',md5($msg->message_src)); $this->assertContains('1/1 999/1 999',$msg->seenby); $this->assertContains('999/1',$msg->path); $this->assertCount(1,$msg->seenby); $this->assertCount(0,$msg->unknown); } $this->assertTrue($messages); } } public function test_soh_in_origin() { $this->init_fidonet(); // This packet has a SOH<char>SOH sequence $f = $this->mail_file('mail/test_msg_with_soh_in_origin.pkt'); foreach ($f as $packet) { $pkt = Packet::process($packet,$f->itemName(),$f->itemSize()); $this->assertEquals(9,$pkt->count()); $messages = FALSE; $c = 0; foreach ($pkt as $msg) { $c++; $messages = TRUE; $this->assertNotTrue($msg->isNetmail()); switch ($c) { case 1: $this->assertSame('3:712/886 220da89f',$msg->msgid); $this->assertSame('9f5544bea46ef57a45f561b9e07dd71e',md5($msg->message)); $this->assertSame('9bf4b8c348ac235cc218577abf7140af',md5($msg->message_src)); $this->assertContains('633/0 267 280 281 408 410 412 509 509 640/1384 712/114 550 620 848',$msg->seenby); $this->assertContains('712/886 848 633/280',$msg->path); $this->assertCount(2,$msg->seenby); $this->assertCount(0,$msg->unknown); break; case 4: $this->assertSame('',$msg->msgid); $this->assertSame('b975057002def556c5a9497aacd000fb',md5($msg->message)); $this->assertSame('c90dd234d2aa029af22c453a25b79a4e',md5($msg->message_src)); $this->assertContains('633/267 280 281 384 408 410 412 418 420 509 509 712/848 770/1 100 330',$msg->seenby); $this->assertContains('772/210 770/1 633/280',$msg->path); $this->assertCount(2,$msg->seenby); $this->assertCount(0,$msg->unknown); default: continue 2; } } $this->assertTrue($messages); } } }