Skip to content

Commit 1a67f01

Browse files
committed
添加 bash id, 避免链接到不正确的服务器
1 parent e6f036b commit 1a67f01

3 files changed

Lines changed: 29 additions & 6 deletions

File tree

bash/bash.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ type Bash struct {
2929

3030
IDGenerator IDGenerator
3131
VERSION string
32+
ID string
3233
}
3334

3435
type ID interface {
@@ -54,6 +55,7 @@ func (sh *Bash) Serve(l net.Listener) (err error) {
5455
if sh.IDGenerator == nil {
5556
return fmt.Errorf("IDGenerator is required")
5657
}
58+
sh.ID = fmt.Sprintf("lcode-hub@%s:%s", sh.VERSION, uuid.NewString())
5759
sh.listener = l
5860
for {
5961
conn := To1(l.Accept())
@@ -74,6 +76,11 @@ func (sh *Bash) serve(conn net.Conn) (err error) {
7476
return
7577
}
7678
switch v := string(header[0]); v {
79+
case "-":
80+
defer conn.Close()
81+
if string(header) == "-1" {
82+
io.WriteString(conn, sh.ID+"\n")
83+
}
7784
case "0":
7885
sh.Connect(r, conn)
7986
case "1":
@@ -121,7 +128,7 @@ func (sh *Bash) Connect(r *bufio.Reader, conn net.Conn) (err error) {
121128

122129
c := webdav.NewClient(conn)
123130

124-
To(c.Open(r, sh.VERSION))
131+
To(c.Open(r, sh.VERSION, sh.ID))
125132
defer c.Close()
126133
idRaw := strings.ToLower(c.ID)
127134

bash/webdav/client.go

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,12 +63,12 @@ func (c *Client) log(err error) {
6363
}
6464
c.Logger(nil, err)
6565
}
66-
func (c *Client) Open(r *bufio.Reader, version string) (err error) {
66+
func (c *Client) Open(r *bufio.Reader, version string, id string) (err error) {
6767
defer err2.Handle(&err, func() {
6868
c.log(fmt.Errorf("bash client start failed: %w", err))
6969
})
7070
To(c.parseArgs(r, version))
71-
To(c.initServerAddr())
71+
To(c.initServerAddr(r, id))
7272
To(c.initID(r))
7373
To(c.initPWD(r))
7474
go c.tasks.Start()
@@ -108,12 +108,27 @@ func (c *Client) parseArgs(r *bufio.Reader, version string) (err error) {
108108
return
109109
}
110110

111-
func (c *Client) initServerAddr() (err error) {
111+
func (c *Client) initServerAddr(r *bufio.Reader, id string) (err error) {
112112
defer err2.Handle(&err, func() {
113-
err = ErrServerAddrParseFailed
113+
if errors.Is(err, ErrNeedPrint) {
114+
return
115+
}
116+
err = ErrServerAddrIncorrect
114117
})
115-
addr := To1(net.ResolveTCPAddr("tcp", c.ServerAddr))
118+
addr, err := net.ResolveTCPAddr("tcp", c.ServerAddr)
119+
if err != nil {
120+
return ErrServerAddrParseFailed
121+
}
116122
c.ServerAddr = fmt.Sprintf("%s/%d", addr.IP.String(), addr.Port)
123+
124+
tcp := fmt.Sprintf("4>&0 5>/dev/tcp/%s 3> >(>&5 dd bs=1 <&4) dd bs=1 <&5", c.ServerAddr)
125+
cmd := fmt.Sprintf("echo -1 | %s || echo /dev/null\n", tcp)
126+
To1(io.WriteString(c.conn, cmd))
127+
line, _ := To2(r.ReadLine())
128+
if string(line) != id {
129+
err = ErrServerAddrIncorrect
130+
return
131+
}
117132
return
118133
}
119134

bash/webdav/errors.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ var (
99
ErrNeedPrint = errors.New("")
1010
ErrEditTargetNotExists = fmt.Errorf("the edit target is not exists. %w", ErrNeedPrint)
1111
ErrServerAddrParseFailed = fmt.Errorf("the server addr parse failed. %w", ErrNeedPrint)
12+
ErrServerAddrIncorrect = fmt.Errorf("the server addr is incorrect server. %w", ErrNeedPrint)
1213
ErrPrintHelp = errors.New("print help msg")
1314
)

0 commit comments

Comments
 (0)