Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/archive/sevenzip/utils.go
1520 views
1
package sevenzip
2
3
import (
4
"errors"
5
"github.com/alist-org/alist/v3/internal/archive/tool"
6
"github.com/alist-org/alist/v3/internal/errs"
7
"github.com/alist-org/alist/v3/internal/stream"
8
"github.com/bodgit/sevenzip"
9
"io"
10
"io/fs"
11
)
12
13
type WrapReader struct {
14
Reader *sevenzip.Reader
15
}
16
17
func (r *WrapReader) Files() []tool.SubFile {
18
ret := make([]tool.SubFile, 0, len(r.Reader.File))
19
for _, f := range r.Reader.File {
20
ret = append(ret, &WrapFile{f: f})
21
}
22
return ret
23
}
24
25
type WrapFile struct {
26
f *sevenzip.File
27
}
28
29
func (f *WrapFile) Name() string {
30
return f.f.Name
31
}
32
33
func (f *WrapFile) FileInfo() fs.FileInfo {
34
return f.f.FileInfo()
35
}
36
37
func (f *WrapFile) Open() (io.ReadCloser, error) {
38
return f.f.Open()
39
}
40
41
func getReader(ss []*stream.SeekableStream, password string) (*sevenzip.Reader, error) {
42
readerAt, err := stream.NewMultiReaderAt(ss)
43
if err != nil {
44
return nil, err
45
}
46
sr, err := sevenzip.NewReaderWithPassword(readerAt, readerAt.Size(), password)
47
if err != nil {
48
return nil, filterPassword(err)
49
}
50
return sr, nil
51
}
52
53
func filterPassword(err error) error {
54
if err != nil {
55
var e *sevenzip.ReadError
56
if errors.As(err, &e) && e.Encrypted {
57
return errs.WrongArchivePassword
58
}
59
}
60
return err
61
}
62
63