|
|
@@ -1,93 +0,0 @@
|
|
|
-package command
|
|
|
-
|
|
|
-import (
|
|
|
- "io"
|
|
|
-
|
|
|
- v2net "github.com/v2ray/v2ray-core/common/net"
|
|
|
- proto "github.com/v2ray/v2ray-core/common/protocol"
|
|
|
- "github.com/v2ray/v2ray-core/common/serial"
|
|
|
- "github.com/v2ray/v2ray-core/common/uuid"
|
|
|
- "github.com/v2ray/v2ray-core/transport"
|
|
|
-)
|
|
|
-
|
|
|
-func init() {
|
|
|
- RegisterResponseCommand(1, func() Command { return new(SwitchAccount) })
|
|
|
-}
|
|
|
-
|
|
|
-// Structure
|
|
|
-// 1 byte: host len N
|
|
|
-// N bytes: host
|
|
|
-// 2 bytes: port
|
|
|
-// 16 bytes: uuid
|
|
|
-// 2 bytes: alterid
|
|
|
-// 1 byte: level
|
|
|
-// 1 bytes: time
|
|
|
-type SwitchAccount struct {
|
|
|
- Host v2net.Address
|
|
|
- Port v2net.Port
|
|
|
- ID *uuid.UUID
|
|
|
- AlterIds serial.Uint16Literal
|
|
|
- Level proto.UserLevel
|
|
|
- ValidMin byte
|
|
|
-}
|
|
|
-
|
|
|
-func (this *SwitchAccount) Marshal(writer io.Writer) {
|
|
|
- hostStr := ""
|
|
|
- if this.Host != nil {
|
|
|
- hostStr = this.Host.String()
|
|
|
- }
|
|
|
- writer.Write([]byte{byte(len(hostStr))})
|
|
|
-
|
|
|
- if len(hostStr) > 0 {
|
|
|
- writer.Write([]byte(hostStr))
|
|
|
- }
|
|
|
-
|
|
|
- writer.Write(this.Port.Bytes())
|
|
|
-
|
|
|
- idBytes := this.ID.Bytes()
|
|
|
- writer.Write(idBytes)
|
|
|
-
|
|
|
- writer.Write(this.AlterIds.Bytes())
|
|
|
- writer.Write([]byte{byte(this.Level)})
|
|
|
-
|
|
|
- writer.Write([]byte{this.ValidMin})
|
|
|
-}
|
|
|
-
|
|
|
-func (this *SwitchAccount) Unmarshal(data []byte) error {
|
|
|
- if len(data) == 0 {
|
|
|
- return transport.ErrorCorruptedPacket
|
|
|
- }
|
|
|
- lenHost := int(data[0])
|
|
|
- if len(data) < lenHost+1 {
|
|
|
- return transport.ErrorCorruptedPacket
|
|
|
- }
|
|
|
- if lenHost > 0 {
|
|
|
- this.Host = v2net.ParseAddress(string(data[1 : 1+lenHost]))
|
|
|
- }
|
|
|
- portStart := 1 + lenHost
|
|
|
- if len(data) < portStart+2 {
|
|
|
- return transport.ErrorCorruptedPacket
|
|
|
- }
|
|
|
- this.Port = v2net.PortFromBytes(data[portStart : portStart+2])
|
|
|
- idStart := portStart + 2
|
|
|
- if len(data) < idStart+16 {
|
|
|
- return transport.ErrorCorruptedPacket
|
|
|
- }
|
|
|
- this.ID, _ = uuid.ParseBytes(data[idStart : idStart+16])
|
|
|
- alterIdStart := idStart + 16
|
|
|
- if len(data) < alterIdStart+2 {
|
|
|
- return transport.ErrorCorruptedPacket
|
|
|
- }
|
|
|
- this.AlterIds = serial.BytesLiteral(data[alterIdStart : alterIdStart+2]).Uint16()
|
|
|
- levelStart := alterIdStart + 2
|
|
|
- if len(data) < levelStart+1 {
|
|
|
- return transport.ErrorCorruptedPacket
|
|
|
- }
|
|
|
- this.Level = proto.UserLevel(data[levelStart])
|
|
|
- timeStart := levelStart + 1
|
|
|
- if len(data) < timeStart {
|
|
|
- return transport.ErrorCorruptedPacket
|
|
|
- }
|
|
|
- this.ValidMin = data[timeStart]
|
|
|
- return nil
|
|
|
-}
|