mirror of
https://github.com/OpenListTeam/OpenList.git
synced 2025-09-19 04:06:18 +08:00

提供一种类似大多数网盘的文件分享操作,这种分享方式可以通过强制 Web 代理隐藏文件源路径,可以设置分享码、最大访问数和过期时间,并且不需要启用 guest 用户。 在全局设置中可以调整: - 是否强制 Web 代理 - 是否允许预览 - 是否允许预览压缩文件 - 分享文件后,点击“复制链接”按钮复制的内容 前端部分:OpenListTeam/OpenList-Frontend#156 文档部分:OpenListTeam/OpenList-Docs#130 Close #183 Close #526 Close #860 Close #892 Close #1079 * feat(share): support more secure file sharing * feat(share): add archive preview * fix(share): fix some bugs * feat(openlist_share): add openlist share driver * fix(share): lack unwrap when get virtual path * fix: use unwrapPath instead of path for virtual file name comparison * fix(share): change request method of /api/share/list from GET to Any * fix(share): path traversal vulnerability in sharing path check * 修复分享alias驱动的文件 没开代理时无法获取URL * fix(sharing): update error message for sharing root link extraction --------- Co-authored-by: Suyunmeng <69945917+Suyunmeng@users.noreply.github.com> Co-authored-by: j2rong4cn <j2rong@qq.com>
121 lines
2.3 KiB
Go
121 lines
2.3 KiB
Go
package model
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/OpenListTeam/OpenList/v4/pkg/http_range"
|
|
"github.com/OpenListTeam/OpenList/v4/pkg/utils"
|
|
)
|
|
|
|
type ListArgs struct {
|
|
ReqPath string
|
|
S3ShowPlaceholder bool
|
|
Refresh bool
|
|
}
|
|
|
|
type LinkArgs struct {
|
|
IP string
|
|
Header http.Header
|
|
Type string
|
|
Redirect bool
|
|
}
|
|
|
|
type Link struct {
|
|
URL string `json:"url"` // most common way
|
|
Header http.Header `json:"header"` // needed header (for url)
|
|
RangeReader RangeReaderIF `json:"-"` // recommended way if can't use URL
|
|
MFile File `json:"-"` // best for local,smb... file system, which exposes MFile
|
|
|
|
Expiration *time.Duration // local cache expire Duration
|
|
|
|
//for accelerating request, use multi-thread downloading
|
|
Concurrency int `json:"concurrency"`
|
|
PartSize int `json:"part_size"`
|
|
ContentLength int64 `json:"-"` // 转码视频、缩略图
|
|
|
|
utils.SyncClosers `json:"-"`
|
|
}
|
|
|
|
type OtherArgs struct {
|
|
Obj Obj
|
|
Method string
|
|
Data interface{}
|
|
}
|
|
|
|
type FsOtherArgs struct {
|
|
Path string `json:"path" form:"path"`
|
|
Method string `json:"method" form:"method"`
|
|
Data interface{} `json:"data" form:"data"`
|
|
}
|
|
|
|
type ArchiveArgs struct {
|
|
Password string
|
|
LinkArgs
|
|
}
|
|
|
|
type ArchiveInnerArgs struct {
|
|
ArchiveArgs
|
|
InnerPath string
|
|
}
|
|
|
|
type ArchiveMetaArgs struct {
|
|
ArchiveArgs
|
|
Refresh bool
|
|
}
|
|
|
|
type ArchiveListArgs struct {
|
|
ArchiveInnerArgs
|
|
Refresh bool
|
|
}
|
|
|
|
type ArchiveDecompressArgs struct {
|
|
ArchiveInnerArgs
|
|
CacheFull bool
|
|
PutIntoNewDir bool
|
|
}
|
|
|
|
type SharingListArgs struct {
|
|
Refresh bool
|
|
Pwd string
|
|
}
|
|
|
|
type SharingArchiveMetaArgs struct {
|
|
ArchiveMetaArgs
|
|
Pwd string
|
|
}
|
|
|
|
type SharingArchiveListArgs struct {
|
|
ArchiveListArgs
|
|
Pwd string
|
|
}
|
|
|
|
type SharingLinkArgs struct {
|
|
Pwd string
|
|
LinkArgs
|
|
}
|
|
|
|
type RangeReaderIF interface {
|
|
RangeRead(ctx context.Context, httpRange http_range.Range) (io.ReadCloser, error)
|
|
}
|
|
|
|
type RangeReadCloserIF interface {
|
|
RangeReaderIF
|
|
utils.ClosersIF
|
|
}
|
|
|
|
var _ RangeReadCloserIF = (*RangeReadCloser)(nil)
|
|
|
|
type RangeReadCloser struct {
|
|
RangeReader RangeReaderIF
|
|
utils.Closers
|
|
}
|
|
|
|
func (r *RangeReadCloser) RangeRead(ctx context.Context, httpRange http_range.Range) (io.ReadCloser, error) {
|
|
rc, err := r.RangeReader.RangeRead(ctx, httpRange)
|
|
r.Add(rc)
|
|
return rc, err
|
|
}
|