Fix packet password on exports, move __unserialize() to EncodeUTF8::decode

This commit is contained in:
Deon George 2021-09-08 22:07:00 +10:00
parent dbbfe46cb9
commit 03c4b87cdd
3 changed files with 42 additions and 42 deletions

View File

@ -200,9 +200,9 @@ class Message extends FTNBase
* Parse a message from a packet * Parse a message from a packet
* *
* @param string $msg * @param string $msg
* @param Domain|null $domain * @param Zone|null $zone
* @return Message * @return Message
* @throws InvalidPacketException * @throws \Exception
*/ */
public static function parseMessage(string $msg,Zone $zone=NULL): self public static function parseMessage(string $msg,Zone $zone=NULL): self
{ {
@ -402,34 +402,7 @@ class Message extends FTNBase
*/ */
public function __unserialize(array $values): void public function __unserialize(array $values): void
{ {
$properties = (new \ReflectionClass($this))->getProperties(); $this->decode($values);
$class = get_class($this);
foreach ($properties as $property) {
if ($property->isStatic()) {
continue;
}
$name = $property->getName();
$decode = in_array($name,self::cast_utf8);
if ($property->isPrivate()) {
$name = "\0{$class}\0{$name}";
} elseif ($property->isProtected()) {
$name = "\0*\0{$name}";
}
if (! array_key_exists($name, $values)) {
continue;
}
$property->setAccessible(true);
$property->setValue(
$this, $decode ? utf8_decode($values[$name]) : $values[$name]
);
}
} }
/** /**

View File

@ -314,20 +314,15 @@ class Packet extends FTNBase implements \Iterator, \Countable
*/ */
public function __toString(): string public function __toString(): string
{ {
// Cache the packet creation $return = $this->createHeader();
static $return = NULL;
if (is_null($return)) { foreach ($this->messages as $o) {
$return = $this->createHeader(); if ($o->packed)
$return .= "\02\00".(string)$o;
foreach ($this->messages as $o) {
if ($o->packed)
$return .= "\02\00".(string)$o;
}
$return .= "\00\00";
} }
$return .= "\00\00";
return $return; return $return;
} }
@ -337,7 +332,7 @@ class Packet extends FTNBase implements \Iterator, \Countable
private function createHeader(): string private function createHeader(): string
{ {
try { try {
$a = pack(collect(self::v2header)->pluck(1)->join(''), $a = pack(collect(self::v2header)->merge(['password' => [0x1a,'a8',8]])->pluck(1)->join(''),
$this->ff, $this->ff,
$this->tf, $this->tf,
Arr::get($this->header,'y'), Arr::get($this->header,'y'),

View File

@ -7,6 +7,38 @@ namespace App\Traits;
trait EncodeUTF8 trait EncodeUTF8
{ {
private function decode(array $values): void
{
$properties = (new \ReflectionClass($this))->getProperties();
$class = get_class($this);
foreach ($properties as $property) {
if ($property->isStatic()) {
continue;
}
$name = $property->getName();
$decode = in_array($name,self::cast_utf8);
if ($property->isPrivate()) {
$name = "\0{$class}\0{$name}";
} elseif ($property->isProtected()) {
$name = "\0*\0{$name}";
}
if (! array_key_exists($name,$values)) {
continue;
}
$property->setAccessible(true);
$property->setValue(
$this,$decode ? utf8_decode($values[$name]) : $values[$name]
);
}
}
private function encode(): array private function encode(): array
{ {
$values = []; $values = [];