import (
"encoding/binary"
"golang.org/x/crypto/bcrypt"
+ "io"
"log"
+ "slices"
)
const GuestAccount = "guest" // default account used when no login is provided for a connection
fieldCount := make([]byte, 2)
binary.BigEndian.PutUint16(fieldCount, uint16(len(fields)))
- p = append(p, fieldCount...)
-
+ var fieldBytes []byte
for _, field := range fields {
- p = append(p, field.Payload()...)
+ fieldBytes = append(fieldBytes, field.Payload()...)
}
- return len(p), nil
+ return copy(p, slices.Concat(fieldCount, fieldBytes)), io.EOF
}
// hashAndSalt generates a password hash from a users obfuscated plaintext password
for _, f := range t.Fields {
var fn FileNameWithInfo
- err = fn.UnmarshalBinary(f.Data)
+ _, err = fn.Write(f.Data)
if err != nil {
return nil, nil
}
return c.Connection.Close()
}
-
func (c *Client) HandleTransactions(ctx context.Context) error {
// Create a new scanner for parsing incoming bytes into transaction tokens
scanner := bufio.NewScanner(c.Connection)
import (
"bytes"
"encoding/binary"
+ "io"
+ "slices"
)
type FileNameWithInfo struct {
return int(binary.BigEndian.Uint16(f.NameSize[:]))
}
-func (f *FileNameWithInfo) MarshalBinary() (data []byte, err error) {
- var buf bytes.Buffer
- err = binary.Write(&buf, binary.LittleEndian, f.fileNameWithInfoHeader)
- if err != nil {
- return data, err
- }
-
- _, err = buf.Write(f.name)
- if err != nil {
- return data, err
- }
-
- return buf.Bytes(), err
+// Read implements io.Reader for FileNameWithInfo
+func (f *FileNameWithInfo) Read(b []byte) (int, error) {
+ return copy(b,
+ slices.Concat(
+ f.Type[:],
+ f.Creator[:],
+ f.FileSize[:],
+ f.RSVD[:],
+ f.NameScript[:],
+ f.NameSize[:],
+ f.name,
+ ),
+ ), io.EOF
}
-func (f *FileNameWithInfo) UnmarshalBinary(data []byte) error {
- err := binary.Read(bytes.NewReader(data), binary.BigEndian, &f.fileNameWithInfoHeader)
+func (f *FileNameWithInfo) Write(p []byte) (int, error) {
+ err := binary.Read(bytes.NewReader(p), binary.BigEndian, &f.fileNameWithInfoHeader)
if err != nil {
- return err
+ return 0, err
}
headerLen := binary.Size(f.fileNameWithInfoHeader)
- f.name = data[headerLen : headerLen+f.nameLen()]
+ f.name = p[headerLen : headerLen+f.nameLen()]
- return err
+ return len(p), nil
}
import (
"github.com/stretchr/testify/assert"
+ "io"
"reflect"
"testing"
)
fileNameWithInfoHeader: tt.fields.fileNameWithInfoHeader,
name: tt.fields.name,
}
- gotData, err := f.MarshalBinary()
+ gotData, err := io.ReadAll(f)
if (err != nil) != tt.wantErr {
t.Errorf("MarshalBinary() error = %v, wantErr %v", err, tt.wantErr)
return
fileNameWithInfoHeader: tt.fields.fileNameWithInfoHeader,
name: tt.fields.name,
}
- if err := f.UnmarshalBinary(tt.args.data); (err != nil) != tt.wantErr {
+ if _, err := f.Write(tt.args.data); (err != nil) != tt.wantErr {
t.Errorf("Write() error = %v, wantErr %v", err, tt.wantErr)
}
if !assert.Equal(t, tt.want, f) {
import (
"encoding/binary"
"errors"
+ "io"
"io/fs"
"os"
"path/filepath"
fnwi.name = []byte(strippedName)
- b, err := fnwi.MarshalBinary()
+ b, err := io.ReadAll(&fnwi)
if err != nil {
return nil, err
}
"errors"
"fmt"
"gopkg.in/yaml.v3"
+ "io"
"math/big"
"os"
"path"
var userFields []Field
for _, acc := range cc.Server.Accounts {
- b := make([]byte, 0, 100)
- n, err := acc.Read(b)
+ b, err := io.ReadAll(acc)
if err != nil {
return res, err
}
- userFields = append(userFields, NewField(FieldData, b[:n]))
+ userFields = append(userFields, NewField(FieldData, b))
}
res = append(res, cc.NewReply(t, userFields...))
"fmt"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
+ "io"
"io/fs"
"math/rand"
"os"
},
name: []byte("testfile-1k"),
}
- b, _ := fnwi.MarshalBinary()
+ b, _ := io.ReadAll(&fnwi)
return b
}(),
),