mirror of
https://github.com/fumiama/go-registry.git
synced 2026-06-17 15:54:28 +08:00
init
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -13,3 +13,5 @@
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
|
||||
.DS_Store
|
||||
94
cmd.go
Normal file
94
cmd.go
Normal file
@@ -0,0 +1,94 @@
|
||||
package registry
|
||||
|
||||
import (
|
||||
"crypto/md5"
|
||||
"unsafe"
|
||||
|
||||
tea "github.com/fumiama/gofastTEA"
|
||||
)
|
||||
|
||||
const (
|
||||
CMDGET uint8 = iota
|
||||
CMDCAT
|
||||
CMDMD5
|
||||
CMDACK
|
||||
CMDEND
|
||||
CMDSET
|
||||
CMDDEL
|
||||
CMDDAT
|
||||
)
|
||||
|
||||
type CmdPacket struct {
|
||||
cmd uint8
|
||||
md5 [16]byte
|
||||
t tea.TEA
|
||||
data []byte
|
||||
}
|
||||
|
||||
func NewCmdPacket(cmd uint8, data []byte, t *tea.TEA) *CmdPacket {
|
||||
return &CmdPacket{
|
||||
cmd: cmd,
|
||||
md5: md5.Sum(data),
|
||||
t: *t,
|
||||
data: data,
|
||||
}
|
||||
}
|
||||
|
||||
func ParseCmdPacket(data []byte, t *tea.TEA) *CmdPacket {
|
||||
if len(data) < 1+1+16 {
|
||||
return nil
|
||||
}
|
||||
if len(data)-1-1-16 < int(data[1]) {
|
||||
return nil
|
||||
}
|
||||
var md5 [16]byte
|
||||
copy(md5[:], data[2:18])
|
||||
return &CmdPacket{
|
||||
cmd: data[0],
|
||||
md5: md5,
|
||||
t: *t,
|
||||
data: data[18 : data[1]+18],
|
||||
}
|
||||
}
|
||||
|
||||
func (c *CmdPacket) Encrypt(seq uint8) (raw []byte) {
|
||||
setseq(&c.t, seq)
|
||||
d := c.t.EncryptLittleEndian(c.data, sumtable)
|
||||
raw = append(raw, c.cmd, uint8(len(d)))
|
||||
raw = append(raw, c.md5[:]...)
|
||||
raw = append(raw, d...)
|
||||
return
|
||||
}
|
||||
|
||||
func (c *CmdPacket) Decrypt(seq uint8) []byte {
|
||||
setseq(&c.t, seq)
|
||||
d := c.t.DecryptLittleEndian(c.data, sumtable)
|
||||
if d != nil && c.md5 == md5.Sum(d) {
|
||||
return d
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func setseq(t *tea.TEA, seq uint8) {
|
||||
*(*uint8)(unsafe.Pointer(uintptr(unsafe.Pointer(t)) + uintptr(15))) = seq
|
||||
}
|
||||
|
||||
// TEA encoding sumtable
|
||||
var sumtable = [0x10]uint32{
|
||||
0x9e3579b9,
|
||||
0x3c6ef172,
|
||||
0xd2a66d2b,
|
||||
0x78dd36e4,
|
||||
0x17e5609d,
|
||||
0xb54fda56,
|
||||
0x5384560f,
|
||||
0xf1bb77c8,
|
||||
0x8ff24781,
|
||||
0x2e4ac13a,
|
||||
0xcc653af3,
|
||||
0x6a9964ac,
|
||||
0x08d12965,
|
||||
0xa708081e,
|
||||
0x451221d7,
|
||||
0xe37793d0,
|
||||
}
|
||||
95
cmd_test.go
Normal file
95
cmd_test.go
Normal file
@@ -0,0 +1,95 @@
|
||||
package registry
|
||||
|
||||
import (
|
||||
"net"
|
||||
"testing"
|
||||
|
||||
tea "github.com/fumiama/gofastTEA"
|
||||
)
|
||||
|
||||
func TestCmdPacket(t *testing.T) {
|
||||
conn, err := net.Dial("tcp", "127.0.0.1:8888")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
tp := tea.NewTeaCipherLittleEndian([]byte("testpwd\x00\x00\x00\x00\x00\x00\x00\x00\x00"))
|
||||
ts := tea.NewTeaCipherLittleEndian([]byte("testsps\x00\x00\x00\x00\x00\x00\x00\x00\x00"))
|
||||
var seq byte
|
||||
p := NewCmdPacket(CMDGET, []byte("test"), &tp)
|
||||
conn.Write(p.Encrypt(seq))
|
||||
seq++
|
||||
a := string(ack(t, conn, &tp).Decrypt(seq))
|
||||
t.Log(a)
|
||||
if a != "null" {
|
||||
t.Fail()
|
||||
}
|
||||
seq++
|
||||
p = NewCmdPacket(CMDSET, []byte("test"), &ts)
|
||||
conn.Write(p.Encrypt(seq))
|
||||
seq++
|
||||
a = string(ack(t, conn, &tp).Decrypt(seq))
|
||||
t.Log(a)
|
||||
if a != "data" {
|
||||
t.Fail()
|
||||
}
|
||||
seq++
|
||||
p = NewCmdPacket(CMDDAT, []byte("测试"), &ts)
|
||||
conn.Write(p.Encrypt(seq))
|
||||
seq++
|
||||
a = string(ack(t, conn, &tp).Decrypt(seq))
|
||||
t.Log(a)
|
||||
if a != "succ" {
|
||||
t.Fail()
|
||||
}
|
||||
seq++
|
||||
p = NewCmdPacket(CMDGET, []byte("test"), &tp)
|
||||
conn.Write(p.Encrypt(seq))
|
||||
seq++
|
||||
a = string(ack(t, conn, &tp).Decrypt(seq))
|
||||
t.Log(a)
|
||||
if a != "测试" {
|
||||
t.Fail()
|
||||
}
|
||||
seq++
|
||||
p = NewCmdPacket(CMDDEL, []byte("test"), &ts)
|
||||
conn.Write(p.Encrypt(seq))
|
||||
seq++
|
||||
a = string(ack(t, conn, &tp).Decrypt(seq))
|
||||
t.Log(a)
|
||||
if a != "succ" {
|
||||
t.Fail()
|
||||
}
|
||||
seq++
|
||||
p = NewCmdPacket(CMDGET, []byte("test"), &tp)
|
||||
conn.Write(p.Encrypt(seq))
|
||||
seq++
|
||||
a = string(ack(t, conn, &tp).Decrypt(seq))
|
||||
t.Log(a)
|
||||
if a != "null" {
|
||||
t.Fail()
|
||||
}
|
||||
seq++
|
||||
}
|
||||
|
||||
func ack(t *testing.T, conn net.Conn, tp *tea.TEA) *CmdPacket {
|
||||
var buf [1024]byte
|
||||
n, err := conn.Read(buf[:])
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
for n < 1+1+16 {
|
||||
m, err := conn.Read(buf[n:])
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
n += m
|
||||
}
|
||||
for n < 1+1+16+int(buf[1]) {
|
||||
m, err := conn.Read(buf[n:])
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
n += m
|
||||
}
|
||||
return ParseCmdPacket(buf[:], tp)
|
||||
}
|
||||
8
go.mod
Normal file
8
go.mod
Normal file
@@ -0,0 +1,8 @@
|
||||
module github.com/fumiama/go-registry
|
||||
|
||||
go 1.17
|
||||
|
||||
require (
|
||||
github.com/fumiama/gofastTEA v0.0.6
|
||||
github.com/wdvxdr1123/ZeroBot v1.4.1
|
||||
)
|
||||
58
go.sum
Normal file
58
go.sum
Normal file
@@ -0,0 +1,58 @@
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20211120033824-43b23f4e6fcb h1:Rkj28fqIwGx/EgBzRYtpmJRfH6wqVn7cNdc7aJ0QE4M=
|
||||
github.com/Mrs4s/MiraiGo v0.0.0-20211120033824-43b23f4e6fcb/go.mod h1:imVKbfKqqeit+C/eaWGb4MKQ3z3gN6pRpBU5RMtp5so=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/fumiama/gofastTEA v0.0.6 h1:Yni3MXDbJVa/c4CecgdZDgCJK+fLdvGph+OBqY2mtiI=
|
||||
github.com/fumiama/gofastTEA v0.0.6/go.mod h1:+sBZ05nCA2skZkursHNvyr8kULlEetrYTM2y5kA4rQc=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
|
||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
|
||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
|
||||
github.com/t-tomalak/logrus-easy-formatter v0.0.0-20190827215021-c074f06c5816/go.mod h1:tzym/CEb5jnFI+Q0k4Qq3+LvRF4gO3E2pxS8fHP8jcA=
|
||||
github.com/tidwall/gjson v1.11.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
|
||||
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
||||
github.com/wdvxdr1123/ZeroBot v1.4.1 h1:fk/8RH2D1gB3YeC1eI/SZi/kG31Rh7Z8lAiDc60VZFM=
|
||||
github.com/wdvxdr1123/ZeroBot v1.4.1/go.mod h1:7t9m4vDZPwWAmzKlhP6IvUoisOIiqNdm/3AJgiY3+ew=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY=
|
||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
184
reg.go
Normal file
184
reg.go
Normal file
@@ -0,0 +1,184 @@
|
||||
package registry
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"net"
|
||||
|
||||
tea "github.com/fumiama/gofastTEA"
|
||||
"github.com/wdvxdr1123/ZeroBot/utils/helper"
|
||||
)
|
||||
|
||||
type Regedit struct {
|
||||
conn net.Conn
|
||||
addr string
|
||||
tp tea.TEA
|
||||
ts *tea.TEA
|
||||
seq byte
|
||||
buf [255]byte
|
||||
}
|
||||
|
||||
func NewRegedit(addr, pwd, sps string) *Regedit {
|
||||
var tp, ts [16]byte
|
||||
if len(pwd) > 15 {
|
||||
pwd = pwd[:15]
|
||||
}
|
||||
if len(sps) > 15 {
|
||||
sps = sps[:15]
|
||||
}
|
||||
copy(tp[:], helper.StringToBytes(pwd))
|
||||
copy(ts[:], helper.StringToBytes(sps))
|
||||
s := tea.NewTeaCipherLittleEndian(ts[:])
|
||||
return &Regedit{addr: addr, tp: tea.NewTeaCipherLittleEndian(tp[:]), ts: &s}
|
||||
}
|
||||
|
||||
func NewRegReader(addr, pwd string) *Regedit {
|
||||
var tp [16]byte
|
||||
if len(pwd) > 15 {
|
||||
pwd = pwd[:15]
|
||||
}
|
||||
copy(tp[:], helper.StringToBytes(pwd))
|
||||
return &Regedit{addr: addr, tp: tea.NewTeaCipherLittleEndian(tp[:])}
|
||||
}
|
||||
|
||||
func (r *Regedit) Connect() (err error) {
|
||||
r.conn, err = net.Dial("tcp", r.addr)
|
||||
return
|
||||
}
|
||||
|
||||
func (r *Regedit) Close() (err error) {
|
||||
p := NewCmdPacket(CMDEND, []byte("fill"), &r.tp)
|
||||
r.conn.Write(p.Encrypt(r.seq))
|
||||
r.seq = 0
|
||||
return r.conn.Close()
|
||||
}
|
||||
|
||||
func (r *Regedit) Get(key string) (string, error) {
|
||||
if len(key) > 127 {
|
||||
return "", errors.New("get key too long")
|
||||
}
|
||||
p := NewCmdPacket(CMDGET, helper.StringToBytes(key), &r.tp)
|
||||
r.conn.Write(p.Encrypt(r.seq))
|
||||
r.seq++
|
||||
ack, err := r.ack()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
ackbytes := ack.Decrypt(r.seq)
|
||||
if ackbytes == nil {
|
||||
return "", errors.New("decrypt ack error")
|
||||
}
|
||||
a := helper.BytesToString(ackbytes)
|
||||
r.seq++
|
||||
if a == "erro" {
|
||||
return "", errors.New("server ack error")
|
||||
}
|
||||
if a == "null" {
|
||||
a = ""
|
||||
}
|
||||
return a, nil
|
||||
}
|
||||
|
||||
func (r *Regedit) Set(key, value string) error {
|
||||
if r.ts == nil {
|
||||
return errors.New("permission denied")
|
||||
}
|
||||
if len(key) > 127 {
|
||||
return errors.New("set key too long")
|
||||
}
|
||||
if len(value) > 127 {
|
||||
return errors.New("set val too long")
|
||||
}
|
||||
p := NewCmdPacket(CMDSET, helper.StringToBytes(key), r.ts)
|
||||
r.conn.Write(p.Encrypt(r.seq))
|
||||
r.seq++
|
||||
ack, err := r.ack()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
ackbytes := ack.Decrypt(r.seq)
|
||||
if ackbytes == nil {
|
||||
return errors.New("decrypt ack error")
|
||||
}
|
||||
a := helper.BytesToString(ackbytes)
|
||||
r.seq++
|
||||
if a == "erro" {
|
||||
return errors.New("server ack error")
|
||||
}
|
||||
if a != "data" {
|
||||
return errors.New("unknown ack error")
|
||||
}
|
||||
p = NewCmdPacket(CMDDAT, helper.StringToBytes(value), r.ts)
|
||||
r.conn.Write(p.Encrypt(r.seq))
|
||||
r.seq++
|
||||
ack, err = r.ack()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
ackbytes = ack.Decrypt(r.seq)
|
||||
if ackbytes == nil {
|
||||
return errors.New("decrypt ack error")
|
||||
}
|
||||
a = helper.BytesToString(ackbytes)
|
||||
r.seq++
|
||||
if a == "erro" {
|
||||
return errors.New("server ack error")
|
||||
}
|
||||
if a != "succ" {
|
||||
return errors.New("unknown ack error")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Regedit) Del(key string) error {
|
||||
if r.ts == nil {
|
||||
return errors.New("permission denied")
|
||||
}
|
||||
if len(key) > 127 {
|
||||
return errors.New("get key too long")
|
||||
}
|
||||
p := NewCmdPacket(CMDDEL, helper.StringToBytes(key), r.ts)
|
||||
r.conn.Write(p.Encrypt(r.seq))
|
||||
r.seq++
|
||||
ack, err := r.ack()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
ackbytes := ack.Decrypt(r.seq)
|
||||
if ackbytes == nil {
|
||||
return errors.New("decrypt ack error")
|
||||
}
|
||||
a := helper.BytesToString(ackbytes)
|
||||
r.seq++
|
||||
if a == "erro" {
|
||||
return errors.New("server ack error")
|
||||
}
|
||||
if a == "null" {
|
||||
return errors.New("no such key")
|
||||
}
|
||||
if a != "succ" {
|
||||
return errors.New("unknown ack error")
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Regedit) ack() (*CmdPacket, error) {
|
||||
n, err := r.conn.Read(r.buf[:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for n < 1+1+16 {
|
||||
m, err := r.conn.Read(r.buf[n:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
n += m
|
||||
}
|
||||
for n < 1+1+16+int(r.buf[1]) {
|
||||
m, err := r.conn.Read(r.buf[n:])
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
n += m
|
||||
}
|
||||
return ParseCmdPacket(r.buf[:], &r.tp), nil
|
||||
}
|
||||
38
reg_test.go
Normal file
38
reg_test.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package registry
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestReg(t *testing.T) {
|
||||
r := NewRegedit("127.0.0.1:8888", "testpwd", "testsps")
|
||||
err := r.Connect()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
v, err := r.Get("test")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(v)
|
||||
err = r.Set("test", "测试")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
v, err = r.Get("test")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(v)
|
||||
err = r.Del("test")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
v, err = r.Get("test")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(v)
|
||||
err = r.Close()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user