tiny-rdm/backend/utils/convert/php_convert.go

90 lines
1.8 KiB
Go
Raw Normal View History

package convutil
import (
"os/exec"
)
type PhpConvert struct {
CmdConvert
}
const phpDecodeCode = `
<?php
$action = strtolower($argv[1]);
$content = $argv[2];
if ($action === 'decode') {
$decoded = base64_decode($content);
if ($decoded !== false) {
$obj = unserialize($decoded);
if ($obj !== false) {
$unserialized = json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
if ($unserialized !== false) {
echo base64_encode($unserialized);
return;
}
}
}
} elseif ($action === 'encode') {
$decoded = base64_decode($content);
if ($decoded !== false) {
$json = json_decode($decoded, true);
if ($json !== false) {
$serialized = serialize($json);
if ($serialized !== false) {
echo base64_encode($serialized);
return;
}
}
}
}
echo '[RDM-ERROR]';
`
func NewPhpConvert() *PhpConvert {
c := CmdConvert{
Name: "PHP",
Auto: true,
DecodePath: "php",
EncodePath: "php",
}
var err error
if _, err = exec.LookPath(c.DecodePath); err != nil {
return nil
}
var filepath string
if filepath, err = writeExecuteFile([]byte(phpDecodeCode), "php_decoder.php"); err != nil {
return nil
}
c.DecodeArgs = []string{filepath, "decode"}
c.EncodeArgs = []string{filepath, "encode"}
return &PhpConvert{
CmdConvert: c,
}
}
func (p *PhpConvert) Enable() bool {
if p == nil {
return false
}
return true
}
func (p *PhpConvert) Encode(str string) (string, bool) {
if !p.Enable() {
return str, false
}
return p.CmdConvert.Encode(str)
}
func (p *PhpConvert) Decode(str string) (string, bool) {
if !p.Enable() {
return str, false
}
return p.CmdConvert.Decode(str)
}