From 3a1c6d55c66ff60125b75394cb3cbb3f71edb927 Mon Sep 17 00:00:00 2001 From: Deon George Date: Wed, 1 Dec 2021 22:45:51 +1100 Subject: [PATCH] Enable UTF8 encoding to/from as well in messages --- app/Classes/FTN/Message.php | 16 +++---- app/Models/Echomail.php | 2 + app/Models/Netmail.php | 2 + app/Traits/EncodeUTF8.php | 56 ++++++++++++++--------- resources/views/pkt.blade.php | 4 +- resources/views/widgets/message.blade.php | 4 +- 6 files changed, 51 insertions(+), 33 deletions(-) diff --git a/app/Classes/FTN/Message.php b/app/Classes/FTN/Message.php index 8a1c45a..aafdb25 100644 --- a/app/Classes/FTN/Message.php +++ b/app/Classes/FTN/Message.php @@ -27,6 +27,8 @@ class Message extends FTNBase private const LOGKEY = 'FM-'; private const cast_utf8 = [ + 'user_to', + 'user_from', 'subject', 'message', 'message_src', @@ -697,6 +699,7 @@ class Message extends FTNBase // If there was no return, its part of the message. if ($retpos === FALSE) { $this->message .= "\x01".$kl; + continue; } @@ -704,20 +707,17 @@ class Message extends FTNBase if ($originpos = strrpos($kl,"\r * Origin: ")) { if (! $this->message) { $this->message .= substr($kl,$retpos+1,$originpos-$retpos-1); - $this->parseOrigin(substr($kl,$originpos+1)); - $kl = substr($kl,0,$retpos); - - $this->message_src = substr($message, 0, $msgpos - strlen($kl) + 9); } else { $this->message .= "\x01".substr($kl,0,$originpos); - $this->parseOrigin(substr($kl,$originpos+1)); - // Capture the raw message, in case we send it on - $this->message_src = substr($message, 0, $msgpos - strlen($kl) - 1 + $originpos + 12 + strlen($this->origin) + 1); - $kl = ''; + $retpos = 0; } + $this->parseOrigin(substr($kl,$originpos+1)); + $this->message_src = substr($message, 0, $msgpos - (1+strlen($kl)) + $originpos + 12 + strlen($this->origin) + 1); + $kl = substr($kl,0,$retpos); + // If this is netmail, the FQFA will have been set by the INTL line, we can skip the rest of this $matches = []; diff --git a/app/Models/Echomail.php b/app/Models/Echomail.php index 539a827..bf022b6 100644 --- a/app/Models/Echomail.php +++ b/app/Models/Echomail.php @@ -24,6 +24,8 @@ final class Echomail extends Model implements Packet protected $casts = [ 'kludges' => 'json' ]; private const cast_utf8 = [ + 'to', + 'from', 'subject', 'msg', 'origin', diff --git a/app/Models/Netmail.php b/app/Models/Netmail.php index 9ebfaf2..9130623 100644 --- a/app/Models/Netmail.php +++ b/app/Models/Netmail.php @@ -18,6 +18,8 @@ final class Netmail extends Model implements Packet use SoftDeletes,UseMongo,EncodeUTF8; private const cast_utf8 = [ + 'to', + 'from', 'subject', 'msg', 'origin', diff --git a/app/Traits/EncodeUTF8.php b/app/Traits/EncodeUTF8.php index 672110b..eeca24e 100644 --- a/app/Traits/EncodeUTF8.php +++ b/app/Traits/EncodeUTF8.php @@ -5,6 +5,8 @@ */ namespace App\Traits; +use Illuminate\Support\Arr; + trait EncodeUTF8 { private function decode(array $values): void @@ -14,28 +16,30 @@ trait EncodeUTF8 $class = get_class($this); foreach ($properties as $property) { - if ($property->isStatic()) { + if ($property->isStatic()) continue; - } $name = $property->getName(); $decode = in_array($name,self::cast_utf8); - if ($property->isPrivate()) { + if ($property->isPrivate()) $name = "\0{$class}\0{$name}"; - } elseif ($property->isProtected()) { + elseif ($property->isProtected()) $name = "\0*\0{$name}"; - } - if (! array_key_exists($name,$values)) { + if (! array_key_exists($name,$values)) continue; - } $property->setAccessible(true); - $property->setValue( - $this,$decode ? utf8_decode($values[$name]) : $values[$name] - ); + try { + $property->setValue( + $this,$decode ? utf8_decode($values[$name]) : $values[$name] + ); + + } catch (\Exception $e) { + dd(['e'=>$e->getMessage(),'name'=>$name,'values'=>$values[$name],'decode'=>$decode]); + } } } @@ -49,34 +53,44 @@ trait EncodeUTF8 foreach ($properties as $property) { // Dont serialize the validation error - if ($property->name == 'errors') + if (($property->name == 'errors') || $property->isStatic()) continue; - if ($property->isStatic()) { - continue; - } - $property->setAccessible(true); - if (! $property->isInitialized($this)) { + if (! $property->isInitialized($this)) continue; - } $name = $property->getName(); $encode = in_array($name,self::cast_utf8); - if ($property->isPrivate()) { + if ($property->isPrivate()) $name = "\0{$class}\0{$name}"; - } elseif ($property->isProtected()) { + elseif ($property->isProtected()) $name = "\0*\0{$name}"; - } $property->setAccessible(true); $value = $property->getValue($this); - $values[$name] = $encode ? utf8_encode($value) : $value; } return $values; } + + public function getAttribute($key) + { + static $encoded = []; + + if (in_array($key,self::cast_utf8) && Arr::get($this->attributes,$key) && (! Arr::get($encoded,$key))) { + $this->attributes[$key] = utf8_decode($this->attributes[$key]); + $encoded[$key] = TRUE; + } + + return parent::getAttribute($key); + } + + public function setAttribute($key,$value) + { + return parent::setAttribute($key,in_array($key,self::cast_utf8) ? utf8_encode($value) : $value); + } } \ No newline at end of file diff --git a/resources/views/pkt.blade.php b/resources/views/pkt.blade.php index 74c4aaf..67af2c2 100644 --- a/resources/views/pkt.blade.php +++ b/resources/views/pkt.blade.php @@ -91,10 +91,10 @@
- FROM: {{ $msg->user_from }} ({{ $msg->fftn }}) + FROM: {!! \App\Classes\FTN\Message::tr($msg->user_from) !!} ({{ $msg->fftn }})
- TO: {{ $msg->user_to }} ({{ $msg->tftn }}) + TO: {!! \App\Classes\FTN\Message::tr($msg->user_to) !!} XX({{ $msg->tftn }})
diff --git a/resources/views/widgets/message.blade.php b/resources/views/widgets/message.blade.php index f238e94..e7c0018 100644 --- a/resources/views/widgets/message.blade.php +++ b/resources/views/widgets/message.blade.php @@ -9,10 +9,10 @@
- FROM: {{ $msg->from }} ({{ $msg->fftn->ftn }}) + FROM: {!! \App\Classes\FTN\Message::tr($msg->from) !!} ({{ $msg->fftn->ftn }})
- TO: {{ $msg->to }} + TO: {!! \App\Classes\FTN\Message::tr($msg->to) !!}