Skip to content

Commit 646c7bc

Browse files
authored
fix(archive): use another sign for extraction (#7982)
1 parent cdc4159 commit 646c7bc

File tree

5 files changed

+78
-32
lines changed

5 files changed

+78
-32
lines changed

internal/sign/archive.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package sign
2+
3+
import (
4+
"sync"
5+
"time"
6+
7+
"github.com/alist-org/alist/v3/internal/conf"
8+
"github.com/alist-org/alist/v3/internal/setting"
9+
"github.com/alist-org/alist/v3/pkg/sign"
10+
)
11+
12+
var onceArchive sync.Once
13+
var instanceArchive sign.Sign
14+
15+
func SignArchive(data string) string {
16+
expire := setting.GetInt(conf.LinkExpiration, 0)
17+
if expire == 0 {
18+
return NotExpiredArchive(data)
19+
} else {
20+
return WithDurationArchive(data, time.Duration(expire)*time.Hour)
21+
}
22+
}
23+
24+
func WithDurationArchive(data string, d time.Duration) string {
25+
onceArchive.Do(InstanceArchive)
26+
return instanceArchive.Sign(data, time.Now().Add(d).Unix())
27+
}
28+
29+
func NotExpiredArchive(data string) string {
30+
onceArchive.Do(InstanceArchive)
31+
return instanceArchive.Sign(data, 0)
32+
}
33+
34+
func VerifyArchive(data string, sign string) error {
35+
onceArchive.Do(InstanceArchive)
36+
return instanceArchive.Verify(data, sign)
37+
}
38+
39+
func InstanceArchive() {
40+
instanceArchive = sign.NewHMACSign([]byte(setting.GetStr(conf.Token) + "-archive"))
41+
}

server/debug.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
_ "net/http/pprof"
66
"runtime"
77

8+
"github.com/alist-org/alist/v3/internal/sign"
89
"github.com/alist-org/alist/v3/server/common"
910
"github.com/alist-org/alist/v3/server/middlewares"
1011
"github.com/gin-gonic/gin"
@@ -15,7 +16,7 @@ func _pprof(g *gin.RouterGroup) {
1516
}
1617

1718
func debug(g *gin.RouterGroup) {
18-
g.GET("/path/*path", middlewares.Down, func(ctx *gin.Context) {
19+
g.GET("/path/*path", middlewares.Down(sign.Verify), func(ctx *gin.Context) {
1920
rawPath := ctx.MustGet("path").(string)
2021
ctx.JSON(200, gin.H{
2122
"path": rawPath,

server/handles/archive.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func FsArchiveMeta(c *gin.Context) {
120120
}
121121
s := ""
122122
if isEncrypt(meta, reqPath) || setting.GetBool(conf.SignAll) {
123-
s = sign.Sign(reqPath)
123+
s = sign.SignArchive(reqPath)
124124
}
125125
api := "/ae"
126126
if ret.DriverProviding {

server/middlewares/down.go

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,35 +9,36 @@ import (
99
"github.com/alist-org/alist/v3/internal/errs"
1010
"github.com/alist-org/alist/v3/internal/model"
1111
"github.com/alist-org/alist/v3/internal/op"
12-
"github.com/alist-org/alist/v3/internal/sign"
1312
"github.com/alist-org/alist/v3/pkg/utils"
1413
"github.com/alist-org/alist/v3/server/common"
1514
"github.com/gin-gonic/gin"
1615
"github.com/pkg/errors"
1716
)
1817

19-
func Down(c *gin.Context) {
20-
rawPath := parsePath(c.Param("path"))
21-
c.Set("path", rawPath)
22-
meta, err := op.GetNearestMeta(rawPath)
23-
if err != nil {
24-
if !errors.Is(errors.Cause(err), errs.MetaNotFound) {
25-
common.ErrorResp(c, err, 500, true)
26-
return
27-
}
28-
}
29-
c.Set("meta", meta)
30-
// verify sign
31-
if needSign(meta, rawPath) {
32-
s := c.Query("sign")
33-
err = sign.Verify(rawPath, strings.TrimSuffix(s, "/"))
18+
func Down(verifyFunc func(string, string) error) func(c *gin.Context) {
19+
return func(c *gin.Context) {
20+
rawPath := parsePath(c.Param("path"))
21+
c.Set("path", rawPath)
22+
meta, err := op.GetNearestMeta(rawPath)
3423
if err != nil {
35-
common.ErrorResp(c, err, 401)
36-
c.Abort()
37-
return
24+
if !errors.Is(errors.Cause(err), errs.MetaNotFound) {
25+
common.ErrorResp(c, err, 500, true)
26+
return
27+
}
28+
}
29+
c.Set("meta", meta)
30+
// verify sign
31+
if needSign(meta, rawPath) {
32+
s := c.Query("sign")
33+
err = verifyFunc(rawPath, strings.TrimSuffix(s, "/"))
34+
if err != nil {
35+
common.ErrorResp(c, err, 401)
36+
c.Abort()
37+
return
38+
}
3839
}
40+
c.Next()
3941
}
40-
c.Next()
4142
}
4243

4344
// TODO: implement

server/router.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"github.com/alist-org/alist/v3/cmd/flags"
55
"github.com/alist-org/alist/v3/internal/conf"
66
"github.com/alist-org/alist/v3/internal/message"
7+
"github.com/alist-org/alist/v3/internal/sign"
78
"github.com/alist-org/alist/v3/internal/stream"
89
"github.com/alist-org/alist/v3/pkg/utils"
910
"github.com/alist-org/alist/v3/server/common"
@@ -40,16 +41,18 @@ func Init(e *gin.Engine) {
4041
S3(g.Group("/s3"))
4142

4243
downloadLimiter := middlewares.DownloadRateLimiter(stream.ClientDownloadLimit)
43-
g.GET("/d/*path", middlewares.Down, downloadLimiter, handles.Down)
44-
g.GET("/p/*path", middlewares.Down, downloadLimiter, handles.Proxy)
45-
g.HEAD("/d/*path", middlewares.Down, handles.Down)
46-
g.HEAD("/p/*path", middlewares.Down, handles.Proxy)
47-
g.GET("/ad/*path", middlewares.Down, downloadLimiter, handles.ArchiveDown)
48-
g.GET("/ap/*path", middlewares.Down, downloadLimiter, handles.ArchiveProxy)
49-
g.GET("/ae/*path", middlewares.Down, downloadLimiter, handles.ArchiveInternalExtract)
50-
g.HEAD("/ad/*path", middlewares.Down, handles.ArchiveDown)
51-
g.HEAD("/ap/*path", middlewares.Down, handles.ArchiveProxy)
52-
g.HEAD("/ae/*path", middlewares.Down, handles.ArchiveInternalExtract)
44+
signCheck := middlewares.Down(sign.Verify)
45+
g.GET("/d/*path", signCheck, downloadLimiter, handles.Down)
46+
g.GET("/p/*path", signCheck, downloadLimiter, handles.Proxy)
47+
g.HEAD("/d/*path", signCheck, handles.Down)
48+
g.HEAD("/p/*path", signCheck, handles.Proxy)
49+
archiveSignCheck := middlewares.Down(sign.VerifyArchive)
50+
g.GET("/ad/*path", archiveSignCheck, downloadLimiter, handles.ArchiveDown)
51+
g.GET("/ap/*path", archiveSignCheck, downloadLimiter, handles.ArchiveProxy)
52+
g.GET("/ae/*path", archiveSignCheck, downloadLimiter, handles.ArchiveInternalExtract)
53+
g.HEAD("/ad/*path", archiveSignCheck, handles.ArchiveDown)
54+
g.HEAD("/ap/*path", archiveSignCheck, handles.ArchiveProxy)
55+
g.HEAD("/ae/*path", archiveSignCheck, handles.ArchiveInternalExtract)
5356

5457
api := g.Group("/api")
5558
auth := api.Group("", middlewares.Auth)

0 commit comments

Comments
 (0)