mirror of
https://github.com/nicocha30/ligolo-ng
synced 2026-08-09 12:58:47 +00:00
91 lines
2.7 KiB
Go
91 lines
2.7 KiB
Go
// Ligolo-ng
|
|
// Copyright (C) 2025 Nicolas Chatelain (nicocha30)
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
package protocol
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/shamaton/msgpack/v2"
|
|
"io"
|
|
)
|
|
|
|
// LigoloEncoder is the structure containing the writer used when encoding Envelopes
|
|
type LigoloEncoder struct {
|
|
writer io.Writer
|
|
}
|
|
|
|
// NewEncoder encode Ligolo-ng packets
|
|
func NewEncoder(writer io.Writer) LigoloEncoder {
|
|
return LigoloEncoder{writer: writer}
|
|
}
|
|
|
|
func payloadTypeFromInterface(payload interface{}) (uint8, error) {
|
|
switch payload := payload.(type) {
|
|
case InfoRequestPacket:
|
|
return MessageInfoRequest, nil
|
|
case InfoReplyPacket:
|
|
return MessageInfoReply, nil
|
|
case ConnectRequestPacket:
|
|
return MessageConnectRequest, nil
|
|
case ConnectResponsePacket:
|
|
return MessageConnectResponse, nil
|
|
case HostPingRequestPacket:
|
|
return MessageHostPingRequest, nil
|
|
case HostPingResponsePacket:
|
|
return MessageHostPingResponse, nil
|
|
case ListenerRequestPacket:
|
|
return MessageListenerRequest, nil
|
|
case ListenerResponsePacket:
|
|
return MessageListenerResponse, nil
|
|
case ListenerBindPacket:
|
|
return MessageListenerBindRequest, nil
|
|
case ListenerBindReponse:
|
|
return MessageListenerBindResponse, nil
|
|
case ListenerSockRequestPacket:
|
|
return MessageListenerSockRequest, nil
|
|
case ListenerSockResponsePacket:
|
|
return MessageListenerSockResponse, nil
|
|
case ListenerCloseRequestPacket:
|
|
return MessageListenerCloseRequest, nil
|
|
case ListenerCloseResponsePacket:
|
|
return MessageListenerCloseResponse, nil
|
|
case AgentKillRequestPacket:
|
|
return MessageAgentKillRequest, nil
|
|
case ListenerSocketConnectionReady:
|
|
return MessageListenerSocketConnectionReady, nil
|
|
default:
|
|
return 0, fmt.Errorf("payloadTypeFromInterface called for unknown payload type: %v", payload)
|
|
}
|
|
}
|
|
|
|
// Encode an Envelope packet and write the result into the writer
|
|
func (e *LigoloEncoder) Encode(payload interface{}) error {
|
|
payloadType, err := payloadTypeFromInterface(payload)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := msgpack.MarshalWrite(e.writer, payloadType); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := msgpack.MarshalWrite(e.writer, payload); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|