netgiv/client.go

183 lines
3.5 KiB
Go
Raw Normal View History

package main
import (
2022-01-13 22:20:35 +10:30
"bufio"
2022-01-14 23:30:14 +10:30
"bytes"
"encoding/gob"
"errors"
"fmt"
2022-01-13 22:20:35 +10:30
"io"
"log"
"net"
2022-01-13 22:20:35 +10:30
"os"
"github.com/tardisx/netgiv/secure"
)
type Client struct {
2022-01-13 22:20:35 +10:30
address string
port int
2022-01-14 23:30:14 +10:30
list bool
2022-01-15 14:04:13 +10:30
receive bool
}
func (c *Client) Connect() error {
2022-01-13 22:20:35 +10:30
address := fmt.Sprintf("%s:%d", c.address, c.port)
serverAddress, _ := net.ResolveTCPAddr("tcp", address)
conn, err := net.DialTCP("tcp", nil, serverAddress)
if err != nil {
return errors.New("problem connecting to server, is it running?\n")
}
defer conn.Close()
2022-01-15 14:04:13 +10:30
log.Printf("Connection on %s\n", address)
sharedKey := secure.Handshake(conn)
2022-01-14 23:30:14 +10:30
secureConnection := secure.SecureConnection{Conn: conn, SharedKey: sharedKey, Buffer: &bytes.Buffer{}}
enc := gob.NewEncoder(&secureConnection)
2022-01-14 23:30:14 +10:30
dec := gob.NewDecoder(&secureConnection)
2022-01-14 23:30:14 +10:30
if c.list {
log.Printf("requesting file list")
// list mode
msg := secure.PacketStart{
OperationType: secure.OperationTypeList,
ClientName: "Justin Hawkins",
ProtocolVersion: "v1.0",
AuthToken: "abc123",
}
err := enc.Encode(msg)
if err != nil {
panic(err)
}
// now we expect to get stuff back until we don't
for {
listPacket := secure.PacketListData{}
err := dec.Decode(&listPacket)
if err == io.EOF {
break
}
if err != nil {
panic(err)
}
log.Printf("%d: %s (%d bytes)", listPacket.Id, listPacket.Kind, listPacket.FileSize)
}
conn.Close()
log.Printf("done listing")
2022-01-15 14:04:13 +10:30
} else if c.receive {
log.Printf("receiving a file")
// list mode
msg := secure.PacketStart{
OperationType: secure.OperationTypeReceive,
ClientName: "Justin Hawkins",
ProtocolVersion: "v1.0",
AuthToken: "abc123",
}
err := enc.Encode(msg)
if err != nil {
panic(err)
}
req := secure.PacketReceiveDataStartRequest{
Id: 0, // 0 means last? Change to do a fetch?
2022-01-15 14:04:13 +10:30
}
err = enc.Encode(req)
if err != nil {
panic(err)
}
// expect a response telling us if we can go ahead
res := secure.PacketReceiveDataStartResponse{}
err = dec.Decode(&res)
if err != nil {
panic(err)
}
if res.Status == secure.ReceiveDataStartResponseOK {
for {
res := secure.PacketReceiveDataNext{}
err = dec.Decode(&res)
if err != nil {
panic(err)
}
os.Stdout.Write(res.Data[:res.Size])
if res.Last {
break
}
}
log.Printf("finished")
} else if res.Status == secure.ReceiveDataStartResponseNotFound {
log.Printf("ngf not found")
2022-01-15 14:04:13 +10:30
} else {
panic("unknown status")
2022-01-15 14:04:13 +10:30
}
conn.Close()
2022-01-14 23:30:14 +10:30
} else {
// must be send mode
msg := secure.PacketStart{
OperationType: secure.OperationTypeSend,
ClientName: "Justin Hawkins",
ProtocolVersion: "v1.0",
AuthToken: "abc123",
}
// gob.Register(secure.PacketSendStart{})
err := enc.Encode(msg)
if err != nil {
panic(err)
}
data := secure.PacketSendDataStart{
Filename: "",
TotalSize: 0,
}
err = enc.Encode(data)
if err != nil {
panic(err)
}
2022-01-13 22:20:35 +10:30
nBytes, nChunks := int64(0), int64(0)
reader := bufio.NewReader(os.Stdin)
buf := make([]byte, 0, 1024)
for {
n, err := reader.Read(buf[:cap(buf)])
2022-01-14 10:06:55 +10:30
2022-01-13 22:20:35 +10:30
buf = buf[:n]
2022-01-14 10:06:55 +10:30
2022-01-13 22:20:35 +10:30
if n == 0 {
if err == nil {
continue
}
if err == io.EOF {
break
}
log.Fatal(err)
}
nChunks++
nBytes += int64(len(buf))
2022-01-14 10:06:55 +10:30
2022-01-13 22:20:35 +10:30
send := secure.PacketSendDataNext{
Size: 5000,
Data: buf,
}
enc.Encode(send)
// time.Sleep(time.Second)
if err != nil {
log.Fatal(err)
}
}
log.Println("Bytes:", nBytes, "Chunks:", nChunks)
conn.Close()
}
return nil
2022-01-14 23:30:14 +10:30
}