...
1
2
3
4
5 package packet
6
7 import (
8 "encoding/binary"
9 "io"
10 )
11
12
13 type LiteralData struct {
14 Format uint8
15 IsBinary bool
16 FileName string
17 Time uint32
18 Body io.Reader
19 }
20
21
22
23 func (l *LiteralData) ForEyesOnly() bool {
24 return l.FileName == "_CONSOLE"
25 }
26
27 func (l *LiteralData) parse(r io.Reader) (err error) {
28 var buf [256]byte
29
30 _, err = readFull(r, buf[:2])
31 if err != nil {
32 return
33 }
34
35 l.Format = buf[0]
36 l.IsBinary = l.Format == 'b'
37 fileNameLen := int(buf[1])
38
39 _, err = readFull(r, buf[:fileNameLen])
40 if err != nil {
41 return
42 }
43
44 l.FileName = string(buf[:fileNameLen])
45
46 _, err = readFull(r, buf[:4])
47 if err != nil {
48 return
49 }
50
51 l.Time = binary.BigEndian.Uint32(buf[:4])
52 l.Body = r
53 return
54 }
55
56
57
58
59 func SerializeLiteral(w io.WriteCloser, isBinary bool, fileName string, time uint32) (plaintext io.WriteCloser, err error) {
60 var buf [4]byte
61 buf[0] = 't'
62 if isBinary {
63 buf[0] = 'b'
64 }
65 if len(fileName) > 255 {
66 fileName = fileName[:255]
67 }
68 buf[1] = byte(len(fileName))
69
70 inner, err := serializeStreamHeader(w, packetTypeLiteralData)
71 if err != nil {
72 return
73 }
74
75 _, err = inner.Write(buf[:2])
76 if err != nil {
77 return
78 }
79 _, err = inner.Write([]byte(fileName))
80 if err != nil {
81 return
82 }
83 binary.BigEndian.PutUint32(buf[:], time)
84 _, err = inner.Write(buf[:])
85 if err != nil {
86 return
87 }
88
89 plaintext = inner
90 return
91 }
92
View as plain text