Preliminary debug state

This commit is contained in:
9seconds
2018-07-06 17:29:24 +03:00
parent 88faeb7195
commit a3933e6ede
21 changed files with 127 additions and 57 deletions
+16 -7
View File
@@ -1,12 +1,14 @@
package wrappers
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"fmt"
"net"
"github.com/juju/errors"
"github.com/9seconds/mtg/utils"
)
type BlockCipherReadWriteCloserWithAddr struct {
@@ -19,16 +21,18 @@ type BlockCipherReadWriteCloserWithAddr struct {
func (c *BlockCipherReadWriteCloserWithAddr) Read(p []byte) (int, error) {
return c.BufferedRead(p, func() error {
buf := &bytes.Buffer{}
for buf.Len()%aes.BlockSize != 0 || buf.Len() == 0 {
n, err := c.conn.Read(p)
var buf []byte
for len(buf) == 0 || len(buf)%aes.BlockSize != 0 {
rv, err := utils.ReadCurrentData(c.conn)
if err != nil {
return errors.Annotate(err, "Cannot read from socket")
}
buf.Write(p[:n])
buf = append(buf, rv...)
}
c.decryptor.CryptBlocks(buf.Bytes(), buf.Bytes())
c.Buffer.Write(buf.Bytes())
c.decryptor.CryptBlocks(buf, buf)
c.Buffer.Write(buf)
return nil
})
@@ -46,6 +50,7 @@ func (c *BlockCipherReadWriteCloserWithAddr) Write(p []byte) (int, error) {
}
func (c *BlockCipherReadWriteCloserWithAddr) Close() error {
fmt.Println("BlockCipherReadWriteCloserWithAddr closes", "sockid", c.SocketID(), "bufsize", c.Buffer.Len())
return c.conn.Close()
}
@@ -57,6 +62,10 @@ func (c *BlockCipherReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
return c.conn.RemoteAddr()
}
func (c *BlockCipherReadWriteCloserWithAddr) SocketID() string {
return c.conn.SocketID()
}
func NewBlockCipherRWC(conn ReadWriteCloserWithAddr, encryptor, decryptor cipher.BlockMode) ReadWriteCloserWithAddr {
return &BlockCipherReadWriteCloserWithAddr{
BufferedReader: NewBufferedReader(),
+10 -2
View File
@@ -1,11 +1,19 @@
package wrappers
import "bytes"
import (
"bytes"
"github.com/juju/errors"
)
type BufferedReader struct {
Buffer *bytes.Buffer
}
var (
BufferedReaderContinue = errors.New("Please continue reading")
)
func (b *BufferedReader) BufferedRead(p []byte, callback func() error) (int, error) {
if b.Buffer.Len() > 0 {
return b.flush(p)
@@ -17,7 +25,7 @@ func (b *BufferedReader) BufferedRead(p []byte, callback func() error) (int, err
}
func (b *BufferedReader) flush(p []byte) (int, error) {
if b.Buffer.Len() < len(p) {
if b.Buffer.Len() <= len(p) {
sizeToReturn := b.Buffer.Len()
copy(p, b.Buffer.Bytes())
b.Buffer.Reset()
+4
View File
@@ -56,6 +56,10 @@ func (c *CtxReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
return c.conn.RemoteAddr()
}
func (c *CtxReadWriteCloserWithAddr) SocketID() string {
return c.conn.SocketID()
}
// NewCtxRWC returns ReadWriteCloser which respects given context,
// cancellation etc.
func NewCtxRWC(ctx context.Context, cancel context.CancelFunc, conn ReadWriteCloserWithAddr) ReadWriteCloserWithAddr {
+6 -2
View File
@@ -18,14 +18,14 @@ type LogReadWriteCloserWithAddr struct {
// Read reads from connection
func (l *LogReadWriteCloserWithAddr) Read(p []byte) (n int, err error) {
n, err = l.conn.Read(p)
l.logger.Debugw("Finish reading", "name", l.name, "socketid", l.sockid, "nbytes", n, "error", err)
l.logger.Debugw("Finish reading", "name", l.name, "socketid", l.sockid, "nbytes", n, "error", err, "localAddr", l.LocalAddr())
return
}
// Write writes into connection.
func (l *LogReadWriteCloserWithAddr) Write(p []byte) (n int, err error) {
n, err = l.conn.Write(p)
l.logger.Debugw("Finish writing", "name", l.name, "socketid", l.sockid, "nbytes", n, "error", err)
l.logger.Debugw("Finish writing", "name", l.name, "socketid", l.sockid, "nbytes", n, "error", err, "localAddr", l.LocalAddr())
return
}
@@ -44,6 +44,10 @@ func (l *LogReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
return l.conn.RemoteAddr()
}
func (l *LogReadWriteCloserWithAddr) SocketID() string {
return l.sockid
}
// NewLogRWC wraps ReadWriteCloser with logger calls.
func NewLogRWC(conn ReadWriteCloserWithAddr, logger *zap.SugaredLogger, sockid string, name string) ReadWriteCloserWithAddr {
return &LogReadWriteCloserWithAddr{
+1
View File
@@ -10,4 +10,5 @@ type ReadWriteCloserWithAddr interface {
LocalAddr() *net.TCPAddr
RemoteAddr() *net.TCPAddr
SocketID() string
}
+4
View File
@@ -51,6 +51,10 @@ func (c *StreamCipherReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
return c.conn.RemoteAddr()
}
func (c *StreamCipherReadWriteCloserWithAddr) SocketID() string {
return c.conn.SocketID()
}
// NewStreamCipherRWC returns wrapper which transparently
// encrypts/decrypts traffic with obfuscated2 protocol.
func NewStreamCipherRWC(conn ReadWriteCloserWithAddr, encryptor, decryptor cipher.Stream) ReadWriteCloserWithAddr {
+7 -1
View File
@@ -9,6 +9,7 @@ import (
type TimeoutReadWriteCloserWithAddr struct {
conn net.Conn
sock string
publicIPv4 net.IP
publicIPv6 net.IP
}
@@ -46,10 +47,15 @@ func (t *TimeoutReadWriteCloserWithAddr) LocalAddr() *net.TCPAddr {
return &newAddr
}
func NewTimeoutRWC(conn net.Conn, ipv4, ipv6 net.IP) ReadWriteCloserWithAddr {
func (t *TimeoutReadWriteCloserWithAddr) SocketID() string {
return t.sock
}
func NewTimeoutRWC(conn net.Conn, sock string, ipv4, ipv6 net.IP) ReadWriteCloserWithAddr {
return &TimeoutReadWriteCloserWithAddr{
conn: conn,
publicIPv4: ipv4,
publicIPv6: ipv6,
sock: sock,
}
}
+4
View File
@@ -37,6 +37,10 @@ func (t *TrafficReadWriteCloserWithAddr) RemoteAddr() *net.TCPAddr {
return t.conn.RemoteAddr()
}
func (t *TrafficReadWriteCloserWithAddr) SocketID() string {
return t.conn.SocketID()
}
// NewTrafficRWC wraps ReadWriteCloser to have read/write callbacks.
func NewTrafficRWC(conn ReadWriteCloserWithAddr, readCallback, writeCallback func(int)) ReadWriteCloserWithAddr {
return &TrafficReadWriteCloserWithAddr{