parent
e92eb525e7
commit
2405a79ace
|
@ -20,7 +20,6 @@ import (
|
||||||
type preferencesService struct {
|
type preferencesService struct {
|
||||||
pref *storage2.PreferencesStorage
|
pref *storage2.PreferencesStorage
|
||||||
clientVersion string
|
clientVersion string
|
||||||
customDecoder []convutil.CmdConvert
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var preferences *preferencesService
|
var preferences *preferencesService
|
||||||
|
@ -101,6 +100,20 @@ func (p *preferencesService) GetFontList() (resp types.JSResp) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *preferencesService) GetBuildInDecoder() (resp types.JSResp) {
|
||||||
|
buildinDecoder := make([]string, 0, len(convutil.BuildInDecoders))
|
||||||
|
for name, convert := range convutil.BuildInDecoders {
|
||||||
|
if convert.Enable() {
|
||||||
|
buildinDecoder = append(buildinDecoder, name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
resp.Data = map[string]any{
|
||||||
|
"decoder": buildinDecoder,
|
||||||
|
}
|
||||||
|
resp.Success = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (p *preferencesService) SetAppVersion(ver string) {
|
func (p *preferencesService) SetAppVersion(ver string) {
|
||||||
if !strings.HasPrefix(ver, "v") {
|
if !strings.HasPrefix(ver, "v") {
|
||||||
p.clientVersion = "v" + ver
|
p.clientVersion = "v" + ver
|
||||||
|
|
|
@ -14,3 +14,5 @@ const DECODE_DEFLATE = "Deflate"
|
||||||
const DECODE_ZSTD = "ZStd"
|
const DECODE_ZSTD = "ZStd"
|
||||||
const DECODE_BROTLI = "Brotli"
|
const DECODE_BROTLI = "Brotli"
|
||||||
const DECODE_MSGPACK = "Msgpack"
|
const DECODE_MSGPACK = "Msgpack"
|
||||||
|
const DECODE_PHP = "PHP"
|
||||||
|
const DECODE_PICKLE = "Pickle"
|
||||||
|
|
|
@ -7,6 +7,10 @@ import (
|
||||||
|
|
||||||
type Base64Convert struct{}
|
type Base64Convert struct{}
|
||||||
|
|
||||||
|
func (Base64Convert) Enable() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (Base64Convert) Encode(str string) (string, bool) {
|
func (Base64Convert) Encode(str string) (string, bool) {
|
||||||
return base64.StdEncoding.EncodeToString([]byte(str)), true
|
return base64.StdEncoding.EncodeToString([]byte(str)), true
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,10 @@ import (
|
||||||
|
|
||||||
type BinaryConvert struct{}
|
type BinaryConvert struct{}
|
||||||
|
|
||||||
|
func (BinaryConvert) Enable() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (BinaryConvert) Encode(str string) (string, bool) {
|
func (BinaryConvert) Encode(str string) (string, bool) {
|
||||||
var result strings.Builder
|
var result strings.Builder
|
||||||
total := len(str)
|
total := len(str)
|
||||||
|
|
|
@ -9,6 +9,10 @@ import (
|
||||||
|
|
||||||
type BrotliConvert struct{}
|
type BrotliConvert struct{}
|
||||||
|
|
||||||
|
func (BrotliConvert) Enable() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (BrotliConvert) Encode(str string) (string, bool) {
|
func (BrotliConvert) Encode(str string) (string, bool) {
|
||||||
var compress = func(b []byte) (string, error) {
|
var compress = func(b []byte) (string, error) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
|
@ -2,7 +2,10 @@ package convutil
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
|
"github.com/vrischmann/userdir"
|
||||||
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
sliceutil "tinyrdm/backend/utils/slice"
|
sliceutil "tinyrdm/backend/utils/slice"
|
||||||
)
|
)
|
||||||
|
@ -18,6 +21,10 @@ type CmdConvert struct {
|
||||||
|
|
||||||
const replaceholder = "{VALUE}"
|
const replaceholder = "{VALUE}"
|
||||||
|
|
||||||
|
func (c CmdConvert) Enable() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (c CmdConvert) Encode(str string) (string, bool) {
|
func (c CmdConvert) Encode(str string) (string, bool) {
|
||||||
base64Content := base64.StdEncoding.EncodeToString([]byte(str))
|
base64Content := base64.StdEncoding.EncodeToString([]byte(str))
|
||||||
var containHolder bool
|
var containHolder bool
|
||||||
|
@ -73,3 +80,13 @@ func (c CmdConvert) Decode(str string) (string, bool) {
|
||||||
}
|
}
|
||||||
return string(outputContent[:n]), true
|
return string(outputContent[:n]), true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c CmdConvert) writeExecuteFile(content []byte, filename string) (string, error) {
|
||||||
|
filepath := path.Join(userdir.GetConfigHome(), "TinyRDM", "decoder", filename)
|
||||||
|
_ = os.Mkdir(path.Dir(filepath), 0777)
|
||||||
|
err := os.WriteFile(filepath, content, 0777)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return filepath, nil
|
||||||
|
}
|
||||||
|
|
|
@ -8,6 +8,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type DataConvert interface {
|
type DataConvert interface {
|
||||||
|
Enable() bool
|
||||||
Encode(string) (string, bool)
|
Encode(string) (string, bool)
|
||||||
Decode(string) (string, bool)
|
Decode(string) (string, bool)
|
||||||
}
|
}
|
||||||
|
@ -24,8 +25,29 @@ var (
|
||||||
zstdConv ZStdConvert
|
zstdConv ZStdConvert
|
||||||
brotliConv BrotliConvert
|
brotliConv BrotliConvert
|
||||||
msgpackConv MsgpackConvert
|
msgpackConv MsgpackConvert
|
||||||
|
phpConv = NewPhpConvert()
|
||||||
|
pickleConv = NewPickleConvert()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var BuildInFormatters = map[string]DataConvert{
|
||||||
|
types.FORMAT_JSON: jsonConv,
|
||||||
|
types.FORMAT_YAML: yamlConv,
|
||||||
|
types.FORMAT_XML: xmlConv,
|
||||||
|
types.FORMAT_HEX: hexConv,
|
||||||
|
types.FORMAT_BINARY: binaryConv,
|
||||||
|
}
|
||||||
|
|
||||||
|
var BuildInDecoders = map[string]DataConvert{
|
||||||
|
types.DECODE_BASE64: base64Conv,
|
||||||
|
types.DECODE_GZIP: gzipConv,
|
||||||
|
types.DECODE_DEFLATE: deflateConv,
|
||||||
|
types.DECODE_ZSTD: zstdConv,
|
||||||
|
types.DECODE_BROTLI: brotliConv,
|
||||||
|
types.DECODE_MSGPACK: msgpackConv,
|
||||||
|
types.DECODE_PHP: phpConv,
|
||||||
|
types.DECODE_PICKLE: pickleConv,
|
||||||
|
}
|
||||||
|
|
||||||
// ConvertTo convert string to specified type
|
// ConvertTo convert string to specified type
|
||||||
// @param decodeType empty string indicates automatic detection
|
// @param decodeType empty string indicates automatic detection
|
||||||
// @param formatType empty string indicates automatic detection
|
// @param formatType empty string indicates automatic detection
|
||||||
|
@ -59,59 +81,17 @@ func ConvertTo(str, decodeType, formatType string, customDecoder []CmdConvert) (
|
||||||
|
|
||||||
func decodeWith(str, decodeType string, customDecoder []CmdConvert) (value, resultDecode string) {
|
func decodeWith(str, decodeType string, customDecoder []CmdConvert) (value, resultDecode string) {
|
||||||
if len(decodeType) > 0 {
|
if len(decodeType) > 0 {
|
||||||
switch decodeType {
|
value = str
|
||||||
case types.DECODE_NONE:
|
|
||||||
value = str
|
|
||||||
|
|
||||||
case types.DECODE_BASE64:
|
if buildinDecoder, ok := BuildInDecoders[decodeType]; ok {
|
||||||
if base64Str, ok := base64Conv.Decode(str); ok {
|
if decodedStr, ok := buildinDecoder.Decode(str); ok {
|
||||||
value = base64Str
|
value = decodedStr
|
||||||
} else {
|
|
||||||
value = str
|
|
||||||
}
|
}
|
||||||
|
} else if decodeType != types.DECODE_NONE {
|
||||||
case types.DECODE_GZIP:
|
|
||||||
if gzipStr, ok := gzipConv.Decode(str); ok {
|
|
||||||
value = gzipStr
|
|
||||||
} else {
|
|
||||||
value = str
|
|
||||||
}
|
|
||||||
|
|
||||||
case types.DECODE_DEFLATE:
|
|
||||||
if falteStr, ok := deflateConv.Decode(str); ok {
|
|
||||||
value = falteStr
|
|
||||||
} else {
|
|
||||||
value = str
|
|
||||||
}
|
|
||||||
|
|
||||||
case types.DECODE_ZSTD:
|
|
||||||
if zstdStr, ok := zstdConv.Decode(str); ok {
|
|
||||||
value = zstdStr
|
|
||||||
} else {
|
|
||||||
value = str
|
|
||||||
}
|
|
||||||
|
|
||||||
case types.DECODE_BROTLI:
|
|
||||||
if brotliStr, ok := brotliConv.Decode(str); ok {
|
|
||||||
value = brotliStr
|
|
||||||
} else {
|
|
||||||
value = str
|
|
||||||
}
|
|
||||||
|
|
||||||
case types.DECODE_MSGPACK:
|
|
||||||
if msgpackStr, ok := msgpackConv.Decode(str); ok {
|
|
||||||
value = msgpackStr
|
|
||||||
} else {
|
|
||||||
value = str
|
|
||||||
}
|
|
||||||
|
|
||||||
default:
|
|
||||||
for _, decoder := range customDecoder {
|
for _, decoder := range customDecoder {
|
||||||
if decoder.Name == decodeType {
|
if decoder.Name == decodeType {
|
||||||
if decodedStr, ok := decoder.Decode(str); ok {
|
if decodedStr, ok := decoder.Decode(str); ok {
|
||||||
value = decodedStr
|
value = decodedStr
|
||||||
} else {
|
|
||||||
value = str
|
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -167,6 +147,16 @@ func autoDecode(str string, customDecoder []CmdConvert) (value, resultDecode str
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if value, ok = phpConv.Decode(str); ok {
|
||||||
|
resultDecode = types.DECODE_PHP
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if value, ok = pickleConv.Decode(str); ok {
|
||||||
|
resultDecode = types.DECODE_PICKLE
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// try decode with custom decoder
|
// try decode with custom decoder
|
||||||
for _, decoder := range customDecoder {
|
for _, decoder := range customDecoder {
|
||||||
if decoder.Auto {
|
if decoder.Auto {
|
||||||
|
@ -186,31 +176,10 @@ func autoDecode(str string, customDecoder []CmdConvert) (value, resultDecode str
|
||||||
|
|
||||||
func viewAs(str, formatType string) (value, resultFormat string) {
|
func viewAs(str, formatType string) (value, resultFormat string) {
|
||||||
if len(formatType) > 0 {
|
if len(formatType) > 0 {
|
||||||
switch formatType {
|
value = str
|
||||||
default:
|
if buildinFormatter, ok := BuildInFormatters[formatType]; ok {
|
||||||
fallthrough
|
if formattedStr, ok := buildinFormatter.Decode(str); ok {
|
||||||
case types.FORMAT_RAW, types.FORMAT_YAML, types.FORMAT_XML:
|
value = formattedStr
|
||||||
value = str
|
|
||||||
|
|
||||||
case types.FORMAT_JSON:
|
|
||||||
if jsonStr, ok := jsonConv.Decode(str); ok {
|
|
||||||
value = jsonStr
|
|
||||||
} else {
|
|
||||||
value = str
|
|
||||||
}
|
|
||||||
|
|
||||||
case types.FORMAT_HEX:
|
|
||||||
if hexStr, ok := hexConv.Decode(str); ok {
|
|
||||||
value = hexStr
|
|
||||||
} else {
|
|
||||||
value = str
|
|
||||||
}
|
|
||||||
|
|
||||||
case types.FORMAT_BINARY:
|
|
||||||
if binStr, ok := binaryConv.Decode(str); ok {
|
|
||||||
value = binStr
|
|
||||||
} else {
|
|
||||||
value = str
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
resultFormat = formatType
|
resultFormat = formatType
|
||||||
|
@ -254,87 +223,29 @@ func autoViewAs(str string) (value, resultFormat string) {
|
||||||
|
|
||||||
func SaveAs(str, format, decode string, customDecoder []CmdConvert) (value string, err error) {
|
func SaveAs(str, format, decode string, customDecoder []CmdConvert) (value string, err error) {
|
||||||
value = str
|
value = str
|
||||||
switch format {
|
if buildingFormatter, ok := BuildInFormatters[format]; ok {
|
||||||
case types.FORMAT_JSON:
|
if formattedStr, ok := buildingFormatter.Encode(str); ok {
|
||||||
if jsonStr, ok := jsonConv.Encode(str); ok {
|
value = formattedStr
|
||||||
value = jsonStr
|
|
||||||
} else {
|
} else {
|
||||||
err = errors.New("invalid json data")
|
err = errors.New("invalid " + format + " data")
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
case types.FORMAT_HEX:
|
|
||||||
if hexStr, ok := hexConv.Encode(str); ok {
|
|
||||||
value = hexStr
|
|
||||||
} else {
|
|
||||||
err = errors.New("invalid hex data")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
case types.FORMAT_BINARY:
|
|
||||||
if binStr, ok := binaryConv.Encode(str); ok {
|
|
||||||
value = binStr
|
|
||||||
} else {
|
|
||||||
err = errors.New("invalid binary data")
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch decode {
|
if buildinDecoder, ok := BuildInDecoders[decode]; ok {
|
||||||
case types.DECODE_NONE:
|
if encodedValue, ok := buildinDecoder.Encode(str); ok {
|
||||||
return
|
value = encodedValue
|
||||||
|
|
||||||
case types.DECODE_BASE64:
|
|
||||||
value, _ = base64Conv.Encode(value)
|
|
||||||
return
|
|
||||||
|
|
||||||
case types.DECODE_GZIP:
|
|
||||||
if gzipStr, ok := gzipConv.Encode(str); ok {
|
|
||||||
value = gzipStr
|
|
||||||
} else {
|
} else {
|
||||||
err = errors.New("fail to build gzip")
|
err = errors.New("fail to build " + decode)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
} else if decode != types.DECODE_NONE {
|
||||||
case types.DECODE_DEFLATE:
|
|
||||||
if deflateStr, ok := deflateConv.Encode(str); ok {
|
|
||||||
value = deflateStr
|
|
||||||
} else {
|
|
||||||
err = errors.New("fail to build deflate")
|
|
||||||
}
|
|
||||||
return
|
|
||||||
|
|
||||||
case types.DECODE_ZSTD:
|
|
||||||
if zstdStr, ok := zstdConv.Encode(str); ok {
|
|
||||||
value = zstdStr
|
|
||||||
} else {
|
|
||||||
err = errors.New("fail to build zstd")
|
|
||||||
}
|
|
||||||
return
|
|
||||||
|
|
||||||
case types.DECODE_BROTLI:
|
|
||||||
if brotliStr, ok := brotliConv.Encode(str); ok {
|
|
||||||
value = brotliStr
|
|
||||||
} else {
|
|
||||||
err = errors.New("fail to build brotli")
|
|
||||||
}
|
|
||||||
return
|
|
||||||
|
|
||||||
case types.DECODE_MSGPACK:
|
|
||||||
if msgpackStr, ok := msgpackConv.Encode(str); ok {
|
|
||||||
value = msgpackStr
|
|
||||||
} else {
|
|
||||||
err = errors.New("fail to build msgpack")
|
|
||||||
}
|
|
||||||
return
|
|
||||||
|
|
||||||
default:
|
|
||||||
for _, decoder := range customDecoder {
|
for _, decoder := range customDecoder {
|
||||||
if decoder.Name == decode {
|
if decoder.Name == decode {
|
||||||
if encodedStr, ok := decoder.Encode(str); ok {
|
if encodedStr, ok := decoder.Encode(str); ok {
|
||||||
value = encodedStr
|
value = encodedStr
|
||||||
} else {
|
} else {
|
||||||
value = str
|
err = errors.New("fail to build " + decode)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,10 @@ import (
|
||||||
|
|
||||||
type DeflateConvert struct{}
|
type DeflateConvert struct{}
|
||||||
|
|
||||||
|
func (d DeflateConvert) Enable() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (d DeflateConvert) Encode(str string) (string, bool) {
|
func (d DeflateConvert) Encode(str string) (string, bool) {
|
||||||
var compress = func(b []byte) (string, error) {
|
var compress = func(b []byte) (string, error) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
|
@ -9,6 +9,10 @@ import (
|
||||||
|
|
||||||
type GZipConvert struct{}
|
type GZipConvert struct{}
|
||||||
|
|
||||||
|
func (GZipConvert) Enable() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (GZipConvert) Encode(str string) (string, bool) {
|
func (GZipConvert) Encode(str string) (string, bool) {
|
||||||
var compress = func(b []byte) (string, error) {
|
var compress = func(b []byte) (string, error) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
|
@ -7,6 +7,10 @@ import (
|
||||||
|
|
||||||
type HexConvert struct{}
|
type HexConvert struct{}
|
||||||
|
|
||||||
|
func (HexConvert) Enable() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (HexConvert) Encode(str string) (string, bool) {
|
func (HexConvert) Encode(str string) (string, bool) {
|
||||||
hexStrArr := strings.Split(str, "\\x")
|
hexStrArr := strings.Split(str, "\\x")
|
||||||
hexStr := strings.Join(hexStrArr, "")
|
hexStr := strings.Join(hexStrArr, "")
|
||||||
|
|
|
@ -8,6 +8,10 @@ import (
|
||||||
|
|
||||||
type JsonConvert struct{}
|
type JsonConvert struct{}
|
||||||
|
|
||||||
|
func (JsonConvert) Enable() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (JsonConvert) Decode(str string) (string, bool) {
|
func (JsonConvert) Decode(str string) (string, bool) {
|
||||||
trimedStr := strings.TrimSpace(str)
|
trimedStr := strings.TrimSpace(str)
|
||||||
if (strings.HasPrefix(trimedStr, "{") && strings.HasSuffix(trimedStr, "}")) ||
|
if (strings.HasPrefix(trimedStr, "{") && strings.HasSuffix(trimedStr, "}")) ||
|
||||||
|
|
|
@ -7,6 +7,10 @@ import (
|
||||||
|
|
||||||
type MsgpackConvert struct{}
|
type MsgpackConvert struct{}
|
||||||
|
|
||||||
|
func (MsgpackConvert) Enable() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (MsgpackConvert) Encode(str string) (string, bool) {
|
func (MsgpackConvert) Encode(str string) (string, bool) {
|
||||||
var obj map[string]any
|
var obj map[string]any
|
||||||
if err := json.Unmarshal([]byte(str), &obj); err == nil {
|
if err := json.Unmarshal([]byte(str), &obj); err == nil {
|
||||||
|
@ -31,7 +35,9 @@ func (MsgpackConvert) Decode(str string) (string, bool) {
|
||||||
var obj map[string]any
|
var obj map[string]any
|
||||||
if err := msgpack.Unmarshal([]byte(str), &obj); err == nil {
|
if err := msgpack.Unmarshal([]byte(str), &obj); err == nil {
|
||||||
if b, err := json.Marshal(obj); err == nil {
|
if b, err := json.Marshal(obj); err == nil {
|
||||||
return string(b), true
|
if len(b) >= 10 {
|
||||||
|
return string(b), true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
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);
|
||||||
|
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.Command(c.DecodePath, "-v").Err; err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var filepath string
|
||||||
|
if filepath, err = c.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)
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
package convutil
|
||||||
|
|
||||||
|
import "os/exec"
|
||||||
|
|
||||||
|
type PickleConvert struct {
|
||||||
|
CmdConvert
|
||||||
|
}
|
||||||
|
|
||||||
|
const pickleDecodeCode = `
|
||||||
|
import base64
|
||||||
|
import json
|
||||||
|
import pickle
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
if len(sys.argv) >= 3:
|
||||||
|
action = sys.argv[1].lower()
|
||||||
|
content = sys.argv[2]
|
||||||
|
|
||||||
|
try:
|
||||||
|
if action == 'decode':
|
||||||
|
decoded = base64.b64decode(content)
|
||||||
|
obj = pickle.loads(decoded)
|
||||||
|
unserialized = json.dumps(obj, ensure_ascii=False)
|
||||||
|
print(base64.b64encode(unserialized.encode('utf-8')).decode('utf-8'))
|
||||||
|
elif action == 'encode':
|
||||||
|
decoded = base64.b64decode(content)
|
||||||
|
obj = json.loads(decoded)
|
||||||
|
serialized = pickle.dumps(obj)
|
||||||
|
print(base64.b64encode(serialized).decode('utf-8'))
|
||||||
|
except:
|
||||||
|
print('[RDM-ERROR]')
|
||||||
|
else:
|
||||||
|
print('[RDM-ERROR]')
|
||||||
|
|
||||||
|
`
|
||||||
|
|
||||||
|
func NewPickleConvert() *PickleConvert {
|
||||||
|
c := CmdConvert{
|
||||||
|
Name: "Pickle",
|
||||||
|
Auto: true,
|
||||||
|
}
|
||||||
|
c.DecodePath, c.EncodePath = "python3", "python3"
|
||||||
|
var err error
|
||||||
|
if err = exec.Command(c.DecodePath, "--version").Err; err != nil {
|
||||||
|
c.DecodePath, c.EncodePath = "python", "python"
|
||||||
|
if err = exec.Command(c.DecodePath, "--version").Err; err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// check if pickle available
|
||||||
|
if err = exec.Command(c.DecodePath, "-c", "import pickle").Err; err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var filepath string
|
||||||
|
if filepath, err = c.writeExecuteFile([]byte(pickleDecodeCode), "pickle_decoder.py"); err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
c.DecodeArgs = []string{filepath, "decode"}
|
||||||
|
c.EncodeArgs = []string{filepath, "encode"}
|
||||||
|
|
||||||
|
return &PickleConvert{
|
||||||
|
CmdConvert: c,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PickleConvert) Enable() bool {
|
||||||
|
if p == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PickleConvert) Encode(str string) (string, bool) {
|
||||||
|
if !p.Enable() {
|
||||||
|
return str, false
|
||||||
|
}
|
||||||
|
return p.CmdConvert.Encode(str)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *PickleConvert) Decode(str string) (string, bool) {
|
||||||
|
if !p.Enable() {
|
||||||
|
return str, false
|
||||||
|
}
|
||||||
|
return p.CmdConvert.Decode(str)
|
||||||
|
}
|
|
@ -7,6 +7,10 @@ import (
|
||||||
|
|
||||||
type XmlConvert struct{}
|
type XmlConvert struct{}
|
||||||
|
|
||||||
|
func (XmlConvert) Enable() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (XmlConvert) Encode(str string) (string, bool) {
|
func (XmlConvert) Encode(str string) (string, bool) {
|
||||||
return str, true
|
return str, true
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,10 @@ import (
|
||||||
|
|
||||||
type YamlConvert struct{}
|
type YamlConvert struct{}
|
||||||
|
|
||||||
|
func (YamlConvert) Enable() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (YamlConvert) Encode(str string) (string, bool) {
|
func (YamlConvert) Encode(str string) (string, bool) {
|
||||||
return str, true
|
return str, true
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,10 @@ import (
|
||||||
|
|
||||||
type ZStdConvert struct{}
|
type ZStdConvert struct{}
|
||||||
|
|
||||||
|
func (ZStdConvert) Enable() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (ZStdConvert) Encode(str string) (string, bool) {
|
func (ZStdConvert) Encode(str string) (string, bool) {
|
||||||
var compress = func(b []byte) (string, error) {
|
var compress = func(b []byte) (string, error) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
|
@ -31,6 +31,7 @@ onMounted(async () => {
|
||||||
try {
|
try {
|
||||||
initializing.value = true
|
initializing.value = true
|
||||||
await prefStore.loadFontList()
|
await prefStore.loadFontList()
|
||||||
|
await prefStore.loadBuildInDecoder()
|
||||||
await connectionStore.initConnections()
|
await connectionStore.initConnections()
|
||||||
if (prefStore.autoCheckUpdate) {
|
if (prefStore.autoCheckUpdate) {
|
||||||
prefStore.checkForUpdate()
|
prefStore.checkForUpdate()
|
||||||
|
|
|
@ -3,7 +3,7 @@ import { decodeTypes, formatTypes } from '@/consts/value_view_type.js'
|
||||||
import Code from '@/components/icons/Code.vue'
|
import Code from '@/components/icons/Code.vue'
|
||||||
import Conversion from '@/components/icons/Conversion.vue'
|
import Conversion from '@/components/icons/Conversion.vue'
|
||||||
import DropdownSelector from '@/components/common/DropdownSelector.vue'
|
import DropdownSelector from '@/components/common/DropdownSelector.vue'
|
||||||
import { isEmpty, map, some } from 'lodash'
|
import { includes, isEmpty, map, pull, some, values } from 'lodash'
|
||||||
import { computed } from 'vue'
|
import { computed } from 'vue'
|
||||||
import usePreferencesStore from 'stores/preferences.js'
|
import usePreferencesStore from 'stores/preferences.js'
|
||||||
|
|
||||||
|
@ -26,17 +26,24 @@ const formatTypeOption = computed(() => {
|
||||||
})
|
})
|
||||||
|
|
||||||
const decodeTypeOption = computed(() => {
|
const decodeTypeOption = computed(() => {
|
||||||
const customTypes = []
|
const buildinTypes = [decodeTypes.NONE],
|
||||||
// has custom decoder
|
customTypes = []
|
||||||
if (!isEmpty(prefStore.decoder)) {
|
const typs = values(decodeTypes)
|
||||||
for (const decoder of prefStore.decoder) {
|
// build-in decoder
|
||||||
// types[decoder.name] = types[decoder.name] || decoder.name
|
for (const typ of typs) {
|
||||||
if (!decodeTypes.hasOwnProperty(decoder.name)) {
|
if (includes(prefStore.buildInDecoder, typ)) {
|
||||||
customTypes.push(decoder.name)
|
buildinTypes.push(typ)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return [map(decodeTypes, (t) => t), customTypes]
|
// custom decoder
|
||||||
|
if (!isEmpty(prefStore.decoder)) {
|
||||||
|
for (const decoder of prefStore.decoder) {
|
||||||
|
// replace build-in decoder if name conflicted
|
||||||
|
pull(buildinTypes, decoder.name)
|
||||||
|
customTypes.push(decoder.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return [buildinTypes, customTypes]
|
||||||
})
|
})
|
||||||
|
|
||||||
const emit = defineEmits(['formatChanged', 'update:decode', 'update:format'])
|
const emit = defineEmits(['formatChanged', 'update:decode', 'update:format'])
|
||||||
|
|
|
@ -23,6 +23,7 @@ export const decodeTypes = {
|
||||||
ZSTD: 'ZStd',
|
ZSTD: 'ZStd',
|
||||||
BROTLI: 'Brotli',
|
BROTLI: 'Brotli',
|
||||||
MSGPACK: 'Msgpack',
|
MSGPACK: 'Msgpack',
|
||||||
// PHP: 'PHP',
|
PHP: 'PHP',
|
||||||
|
PICKLE: 'Pickle',
|
||||||
// Java: 'Java',
|
// Java: 'Java',
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { lang } from '@/langs/index.js'
|
||||||
import { cloneDeep, findIndex, get, isEmpty, join, map, merge, pick, set, some, split } from 'lodash'
|
import { cloneDeep, findIndex, get, isEmpty, join, map, merge, pick, set, some, split } from 'lodash'
|
||||||
import {
|
import {
|
||||||
CheckForUpdate,
|
CheckForUpdate,
|
||||||
|
GetBuildInDecoder,
|
||||||
GetFontList,
|
GetFontList,
|
||||||
GetPreferences,
|
GetPreferences,
|
||||||
RestorePreferences,
|
RestorePreferences,
|
||||||
|
@ -66,6 +67,7 @@ const usePreferencesStore = defineStore('preferences', {
|
||||||
fontSize: 14,
|
fontSize: 14,
|
||||||
cursorStyle: 'block',
|
cursorStyle: 'block',
|
||||||
},
|
},
|
||||||
|
buildInDecoder: [],
|
||||||
decoder: [],
|
decoder: [],
|
||||||
lastPref: {},
|
lastPref: {},
|
||||||
fontList: [],
|
fontList: [],
|
||||||
|
@ -320,6 +322,20 @@ const usePreferencesStore = defineStore('preferences', {
|
||||||
return this.fontList
|
return this.fontList
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get all available build-in decoder
|
||||||
|
* @return {Promise<void>}
|
||||||
|
*/
|
||||||
|
async loadBuildInDecoder() {
|
||||||
|
const { success, data } = await GetBuildInDecoder()
|
||||||
|
if (success) {
|
||||||
|
const { decoder = [] } = data
|
||||||
|
this.buildInDecoder = decoder
|
||||||
|
} else {
|
||||||
|
this.buildInDecoder = []
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* save preferences to local
|
* save preferences to local
|
||||||
* @returns {Promise<boolean>}
|
* @returns {Promise<boolean>}
|
||||||
|
|
Loading…
Reference in New Issue