...
1
2
3
4
5 package packet
6
7 import (
8 "io"
9
10 "github.com/ProtonMail/go-crypto/openpgp/errors"
11 )
12
13
14
15 type Reader struct {
16 q []Packet
17 readers []io.Reader
18 }
19
20
21
22
23
24
25
26 const maxReaders = 32
27
28
29
30 func (r *Reader) Next() (p Packet, err error) {
31 if len(r.q) > 0 {
32 p = r.q[len(r.q)-1]
33 r.q = r.q[:len(r.q)-1]
34 return
35 }
36
37 for len(r.readers) > 0 {
38 p, err = Read(r.readers[len(r.readers)-1])
39 if err == nil {
40 return
41 }
42 if err == io.EOF {
43 r.readers = r.readers[:len(r.readers)-1]
44 continue
45 }
46
47 if _, ok := err.(errors.UnknownPacketTypeError); ok {
48 continue
49 }
50 if _, ok := err.(errors.UnsupportedError); ok {
51 switch p.(type) {
52 case *SymmetricallyEncrypted, *AEADEncrypted, *Compressed, *LiteralData:
53 return nil, err
54 }
55 continue
56 }
57 return nil, err
58 }
59
60 return nil, io.EOF
61 }
62
63
64
65
66
67
68 func (r *Reader) Push(reader io.Reader) (err error) {
69 if len(r.readers) >= maxReaders {
70 return errors.StructuralError("too many layers of packets")
71 }
72 r.readers = append(r.readers, reader)
73 return nil
74 }
75
76
77 func (r *Reader) Unread(p Packet) {
78 r.q = append(r.q, p)
79 }
80
81 func NewReader(r io.Reader) *Reader {
82 return &Reader{
83 q: nil,
84 readers: []io.Reader{r},
85 }
86 }
87
View as plain text