Files
OpenList/internal/model/args.go
awaae 78c5d9b60b fix(sharing): count share access atomically per client IP (#3294)
- Atomically reserve sharing access slots in the database.
- Deduplicate access counting by client IP for 30 minutes.
- Separate sharing usability and password validation from access-limit checks.
- Keep browsing and archive metadata operations non-counting.
- Count downloads, link generation, and archive extraction through the unified access flow.
- Coordinate same-IP validation with slot publication to prevent concurrent requests from being rejected during the cache update window.
- Add coverage for database-authoritative access state, concurrent access limits, same-IP deduplication, and cache publication races.
2026-10-29 22:30:16 +08:00

124 lines
2.5 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
WithStorageDetails bool
SkipHook 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
Expiration *time.Duration // local cache expiration; not transferred by Clone
//for accelerating request, use multi-thread downloading
Concurrency int `json:"concurrency"`
PartSize int `json:"part_size"`
ContentLength int64 `json:"content_length"` // 转码视频、缩略图
utils.SyncClosers `json:"-"`
// 如果SyncClosers中的资源被关闭后Link将不可用,则此值应为 true
RequireReference bool `json:"-"`
}
// Clone transfers ownership of l without inheriting its cache expiration.
func (l *Link) Clone() *Link {
return &Link{
URL: l.URL,
Header: l.Header,
RangeReader: l.RangeReader,
Concurrency: l.Concurrency,
PartSize: l.PartSize,
ContentLength: l.ContentLength,
SyncClosers: utils.NewSyncClosers(l),
RequireReference: l.RequireReference,
}
}
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
Overwrite bool
}
type SharingListArgs struct {
Refresh bool
Pwd string
ClientIP string
}
type SharingArchiveMetaArgs struct {
ArchiveMetaArgs
Pwd string
ClientIP string
}
type SharingArchiveListArgs struct {
ArchiveListArgs
Pwd string
ClientIP string
}
type SharingLinkArgs struct {
Pwd string
LinkArgs
}
type RangeReaderIF interface {
RangeRead(ctx context.Context, httpRange http_range.Range) (io.ReadCloser, error)
}