Fix sshchat connection logic (#661)

This commit is contained in:
Duco van Amstel 2018-12-26 15:09:36 +01:00 committed by Wim
parent d82726cd1b
commit 1b834c6858
1 changed files with 28 additions and 13 deletions

View File

@ -23,22 +23,35 @@ func New(cfg *bridge.Config) bridge.Bridger {
} }
func (b *Bsshchat) Connect() error { func (b *Bsshchat) Connect() error {
var err error
b.Log.Infof("Connecting %s", b.GetString("Server")) b.Log.Infof("Connecting %s", b.GetString("Server"))
// connHandler will be called by 'sshd.ConnectShell()' below
// once the connection is established in order to handle it.
connErr := make(chan error, 1) // Needs to be buffered.
connSignal := make(chan struct{})
connHandler := func(r io.Reader, w io.WriteCloser) error {
b.r = bufio.NewScanner(r)
b.r.Scan()
b.w = w
if _, err := b.w.Write([]byte("/theme mono\r\n")); err != nil {
return err
}
close(connSignal) // Connection is established so we can signal the success.
return b.handleSSHChat()
}
go func() { go func() {
err = sshd.ConnectShell(b.GetString("Server"), b.GetString("Nick"), func(r io.Reader, w io.WriteCloser) error { // As a successful connection will result in this returning after the Connection
b.r = bufio.NewScanner(r) // method has already returned point we NEED to have a buffered channel to still
b.w = w // be able to write.
b.r.Scan() connErr <- sshd.ConnectShell(b.GetString("Server"), b.GetString("Nick"), connHandler)
if _, handleErr := w.Write([]byte("/theme mono\r\n")); handleErr != nil {
return handleErr
}
return b.handleSSHChat()
})
}() }()
if err != nil {
b.Log.Debugf("%#v", err) select {
case err := <-connErr:
b.Log.Error("Connection failed")
return err return err
case <-connSignal:
} }
b.Log.Info("Connection succeeded") b.Log.Info("Connection succeeded")
return nil return nil
@ -64,7 +77,9 @@ func (b *Bsshchat) Send(msg config.Message) (string, error) {
b.Log.Errorf("Could not send extra message: %#v", err) b.Log.Errorf("Could not send extra message: %#v", err)
} }
} }
return b.handleUploadFile(&msg) if len(msg.Extra["file"]) > 0 {
return b.handleUploadFile(&msg)
}
} }
_, err := b.w.Write([]byte(msg.Username + msg.Text + "\r\n")) _, err := b.w.Write([]byte(msg.Username + msg.Text + "\r\n"))
return "", err return "", err