Compare commits

..

16 Commits

Author SHA1 Message Date
dc73c2e97d fix: custom token expires in doesn't work 2022-09-27 14:23:56 +08:00
a624121095 ci: manual trigger github actions 2022-09-27 14:12:36 +08:00
9d9c79179b feat: custom token expires in 2022-09-27 14:05:00 +08:00
b7479651e1 fix: incorrect base_path from site_url (close #1830) 2022-09-27 13:56:32 +08:00
2fc0ccbfe0 fix: don't init aria2 in new goroutine (close #1752) 2022-09-26 15:11:08 +08:00
f86ad1dce4 fix: create temp dir perm with 777 (close #1813) 2022-09-26 14:48:59 +08:00
f0181d92cd fix: keep type of setting item is correct 2022-09-25 21:20:32 +08:00
5ac6a30c56 fix: use get_share_link_download_url if can't get_download_url (close #1753) 2022-09-25 20:32:11 +08:00
96d8a382e8 fix(aliyundrive_share): reget share token if token expired (close #1798) 2022-09-25 20:14:33 +08:00
7c32af4649 refactor!: move api_url and base_path to config file 2022-09-25 17:57:54 +08:00
03dbb3a403 chore: fix typo of env name 2022-09-25 17:41:04 +08:00
a570e4c7a0 fix: some settings don't take effect at startup 2022-09-23 20:37:49 +08:00
539c47bd3b chore: change log if aria2 not ready 2022-09-23 20:04:47 +08:00
b6d9018ebd fix: sorting by modified doesn't work (close #1756) 2022-09-23 12:30:32 +08:00
c929888e39 fix(123): change remove api (close #1760) 2022-09-23 12:28:57 +08:00
af946ff13e fix(baidu_photo): cannot download when proxy is opened 2022-09-23 01:15:12 +08:00
16 changed files with 143 additions and 63 deletions

View File

@ -3,6 +3,7 @@ name: Close inactive
on: on:
schedule: schedule:
- cron: "0 0 */7 * *" - cron: "0 0 */7 * *"
workflow_dispatch:
jobs: jobs:
close-inactive: close-inactive:

View File

@ -3,6 +3,7 @@ name: Close need info
on: on:
schedule: schedule:
- cron: "0 0 */7 * *" - cron: "0 0 */7 * *"
workflow_dispatch:
jobs: jobs:
close-need-info: close-need-info:

View File

@ -164,7 +164,7 @@ func (d *Pan123) Remove(ctx context.Context, obj model.Obj) error {
"operation": true, "operation": true,
"fileTrashInfoList": []File{f}, "fileTrashInfoList": []File{f},
} }
_, err := d.request("https://www.123pan.com/a/api/file/trash", http.MethodPost, func(req *resty.Request) { _, err := d.request("https://www.123pan.com/b/api/file/trash", http.MethodPost, func(req *resty.Request) {
req.SetBody(data) req.SetBody(data)
}, nil) }, nil)
return err return err

View File

@ -93,6 +93,7 @@ func (d *AliyundriveShare) Link(ctx context.Context, file model.Obj, args model.
if err != nil { if err != nil {
return nil, err return nil, err
} }
var u string
if e.Code != "" { if e.Code != "" {
if e.Code == "AccessTokenInvalid" { if e.Code == "AccessTokenInvalid" {
err = d.refreshToken() err = d.refreshToken()
@ -100,14 +101,47 @@ func (d *AliyundriveShare) Link(ctx context.Context, file model.Obj, args model.
return nil, err return nil, err
} }
return d.Link(ctx, file, args) return d.Link(ctx, file, args)
} else if e.Code == "ForbiddenNoPermission.File" {
data = utils.MergeMap(data, base.Json{
// Only ten minutes valid
"expire_sec": 600,
"share_id": d.ShareId,
})
var resp ShareLinkResp
var e2 ErrorResp
_, err = base.RestyClient.R().
SetError(&e2).SetBody(data).SetResult(&resp).
SetHeader("content-type", "application/json").
SetHeader("Authorization", "Bearer\t"+d.AccessToken).
SetHeader("x-share-token", d.ShareToken).
Post("https://api.aliyundrive.com/v2/file/get_share_link_download_url")
if err != nil {
return nil, err
} }
return nil, errors.New(e.Message) if e2.Code != "" {
if e2.Code == "AccessTokenInvalid" || e2.Code == "ShareLinkTokenInvalid" {
err = d.getShareToken()
if err != nil {
return nil, err
}
return d.Link(ctx, file, args)
} else {
return nil, errors.New(e2.Code + ":" + e2.Message)
}
} else {
u = resp.DownloadUrl
}
} else {
return nil, errors.New(e.Code + ":" + e.Message)
}
} else {
u = utils.Json.Get(res.Body(), "url").ToString()
} }
return &model.Link{ return &model.Link{
Header: http.Header{ Header: http.Header{
"Referer": []string{"https://www.aliyundrive.com/"}, "Referer": []string{"https://www.aliyundrive.com/"},
}, },
URL: utils.Json.Get(res.Body(), "url").ToString(), URL: u,
}, nil }, nil
} }

View File

@ -50,8 +50,8 @@ func fileToObj(f File) *model.ObjThumb {
} }
} }
//type ShareLinkResp struct { type ShareLinkResp struct {
// DownloadUrl string `json:"download_url"` DownloadUrl string `json:"download_url"`
// Url string `json:"url"` Url string `json:"url"`
// Thumbnail string `json:"thumbnail"` Thumbnail string `json:"thumbnail"`
//} }

View File

@ -80,7 +80,7 @@ func (d *AliyundriveShare) getFiles(fileId string) ([]File, error) {
} }
log.Debugf("aliyundrive share get files: %s", res.String()) log.Debugf("aliyundrive share get files: %s", res.String())
if e.Code != "" { if e.Code != "" {
if e.Code == "AccessTokenInvalid" { if e.Code == "AccessTokenInvalid" || e.Code == "ShareLinkTokenInvalid" {
err = d.getShareToken() err = d.getShareToken()
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -333,6 +333,7 @@ func (d *BaiduPhoto) linkAlbum(ctx context.Context, file model.Obj, args model.L
URL: res.Header().Get("location"), URL: res.Header().Get("location"),
Header: http.Header{ Header: http.Header{
"User-Agent": []string{headers["User-Agent"]}, "User-Agent": []string{headers["User-Agent"]},
"Referer": []string{"https://photo.baidu.com/"},
}, },
//Expiration: &exp, //Expiration: &exp,
} }
@ -369,6 +370,7 @@ func (d *BaiduPhoto) linkFile(ctx context.Context, file model.Obj, args model.Li
URL: downloadUrl.Dlink, URL: downloadUrl.Dlink,
Header: http.Header{ Header: http.Header{
"User-Agent": []string{headers["User-Agent"]}, "User-Agent": []string{headers["User-Agent"]},
"Referer": []string{"https://photo.baidu.com/"},
}, },
//Expiration: &exp, //Expiration: &exp,
} }

View File

@ -6,10 +6,9 @@ import (
) )
func InitAria2() { func InitAria2() {
go func() {
_, err := aria2.InitClient(2) _, err := aria2.InitClient(2)
if err != nil { if err != nil {
utils.Log.Errorf("failed to init aria2 client: %+v", err) //utils.Log.Errorf("failed to init aria2 client: %+v", err)
utils.Log.Infof("Aria2 not ready.")
} }
}()
} }

View File

@ -1,7 +1,6 @@
package bootstrap package bootstrap
import ( import (
"io/ioutil"
"os" "os"
"path/filepath" "path/filepath"
@ -25,7 +24,7 @@ func InitConfig() {
log.Fatalf("failed to create default config file") log.Fatalf("failed to create default config file")
} }
} else { } else {
configBytes, err := ioutil.ReadFile(flags.Config) configBytes, err := os.ReadFile(flags.Config)
if err != nil { if err != nil {
log.Fatalf("reading config file error: %+v", err) log.Fatalf("reading config file error: %+v", err)
} }
@ -39,7 +38,7 @@ func InitConfig() {
if err != nil { if err != nil {
log.Fatalf("marshal config error: %+v", err) log.Fatalf("marshal config error: %+v", err)
} }
err = ioutil.WriteFile(flags.Config, confBody, 0777) err = os.WriteFile(flags.Config, confBody, 0777)
if err != nil { if err != nil {
log.Fatalf("update config struct error: %+v", err) log.Fatalf("update config struct error: %+v", err)
} }
@ -59,7 +58,7 @@ func InitConfig() {
if err != nil { if err != nil {
log.Errorln("failed delete temp file:", err) log.Errorln("failed delete temp file:", err)
} }
err = os.MkdirAll(conf.Conf.TempDir, 0700) err = os.MkdirAll(conf.Conf.TempDir, 0777)
if err != nil { if err != nil {
log.Fatalf("create temp dir error: %+v", err) log.Fatalf("create temp dir error: %+v", err)
} }

View File

@ -34,7 +34,7 @@ func initSettings() {
// insert new items // insert new items
for i := range initialSettingItems { for i := range initialSettingItems {
v := initialSettingItems[i] v := initialSettingItems[i]
_, err := db.GetSettingItemByKey(v.Key) stored, err := db.GetSettingItemByKey(v.Key)
if errors.Is(err, gorm.ErrRecordNotFound) || v.Key == conf.VERSION { if errors.Is(err, gorm.ErrRecordNotFound) || v.Key == conf.VERSION {
err = db.SaveSettingItem(v) err = db.SaveSettingItem(v)
if err != nil { if err != nil {
@ -42,6 +42,12 @@ func initSettings() {
} }
} else if err != nil { } else if err != nil {
log.Fatalf("failed get setting: %+v", err) log.Fatalf("failed get setting: %+v", err)
} else {
v.Value = stored.Value
err = db.SaveSettingItem(v)
if err != nil {
log.Fatalf("failed resave setting: %+v", err)
}
} }
} }
} }
@ -65,14 +71,14 @@ func InitialSettings() []model.SettingItem {
initialSettingItems = []model.SettingItem{ initialSettingItems = []model.SettingItem{
// site settings // site settings
{Key: conf.VERSION, Value: conf.Version, Type: conf.TypeString, Group: model.SITE, Flag: model.READONLY}, {Key: conf.VERSION, Value: conf.Version, Type: conf.TypeString, Group: model.SITE, Flag: model.READONLY},
{Key: conf.ApiUrl, Value: "", Type: conf.TypeString, Group: model.SITE}, //{Key: conf.ApiUrl, Value: "", Type: conf.TypeString, Group: model.SITE},
{Key: conf.BasePath, Value: "", Type: conf.TypeString, Group: model.SITE}, //{Key: conf.BasePath, Value: "", Type: conf.TypeString, Group: model.SITE},
{Key: conf.SiteTitle, Value: "AList", Type: conf.TypeString, Group: model.SITE}, {Key: conf.SiteTitle, Value: "AList", Type: conf.TypeString, Group: model.SITE},
{Key: conf.Announcement, Value: "### repo\nhttps://github.com/alist-org/alist", Type: conf.TypeText, Group: model.SITE}, {Key: conf.Announcement, Value: "### repo\nhttps://github.com/alist-org/alist", Type: conf.TypeText, Group: model.SITE},
{Key: "pagination_type", Value: "all", Type: conf.TypeSelect, Options: "all,pagination,load_more,auto_load_more", Group: model.SITE}, {Key: "pagination_type", Value: "all", Type: conf.TypeSelect, Options: "all,pagination,load_more,auto_load_more", Group: model.SITE},
{Key: "default_page_size", Value: "30", Type: conf.TypeNumber, Group: model.SITE}, {Key: "default_page_size", Value: "30", Type: conf.TypeNumber, Group: model.SITE},
// style settings // style settings
{Key: conf.Logo, Value: "https://cdn.jsdelivr.net/gh/alist-org/logo@main/logo.svg", Type: conf.TypeString, Group: model.STYLE}, {Key: conf.Logo, Value: "https://cdn.jsdelivr.net/gh/alist-org/logo@main/logo.svg", Type: conf.TypeText, Group: model.STYLE},
{Key: conf.Favicon, Value: "https://cdn.jsdelivr.net/gh/alist-org/logo@main/logo.svg", Type: conf.TypeString, Group: model.STYLE}, {Key: conf.Favicon, Value: "https://cdn.jsdelivr.net/gh/alist-org/logo@main/logo.svg", Type: conf.TypeString, Group: model.STYLE},
{Key: conf.MainColor, Value: "#1890ff", Type: conf.TypeString, Group: model.STYLE}, {Key: conf.MainColor, Value: "#1890ff", Type: conf.TypeString, Group: model.STYLE},
{Key: "home_icon", Value: "🏠", Type: conf.TypeString, Group: model.STYLE}, {Key: "home_icon", Value: "🏠", Type: conf.TypeString, Group: model.STYLE},

View File

@ -23,7 +23,7 @@ type Scheme struct {
} }
type LogConfig struct { type LogConfig struct {
Enable bool `json:"enable" env:"log_enable"` Enable bool `json:"enable" env:"LOG_ENABLE"`
Name string `json:"name" env:"LOG_NAME"` Name string `json:"name" env:"LOG_NAME"`
MaxSize int `json:"max_size" env:"MAX_SIZE"` MaxSize int `json:"max_size" env:"MAX_SIZE"`
MaxBackups int `json:"max_backups" env:"MAX_BACKUPS"` MaxBackups int `json:"max_backups" env:"MAX_BACKUPS"`
@ -32,12 +32,13 @@ type LogConfig struct {
} }
type Config struct { type Config struct {
Force bool `json:"force"` Force bool `json:"force" env:"FORCE"`
Address string `json:"address" env:"ADDR"` Address string `json:"address" env:"ADDR"`
Port int `json:"port" env:"PORT"` Port int `json:"port" env:"PORT"`
JwtSecret string `json:"jwt_secret" env:"JWT_SECRET"` SiteURL string `json:"site_url" env:"SITE_URL"`
// CaCheExpiration int `json:"cache_expiration" env:"CACHE_EXPIRATION"`
Cdn string `json:"cdn" env:"CDN"` Cdn string `json:"cdn" env:"CDN"`
JwtSecret string `json:"jwt_secret" env:"JWT_SECRET"`
TokenExpiresIn int `json:"token_expires_in" env:"TOKEN_EXPIRES_IN"`
Database Database `json:"database"` Database Database `json:"database"`
Scheme Scheme `json:"scheme"` Scheme Scheme `json:"scheme"`
TempDir string `json:"temp_dir" env:"TEMP_DIR"` TempDir string `json:"temp_dir" env:"TEMP_DIR"`
@ -49,7 +50,7 @@ func DefaultConfig() *Config {
Address: "0.0.0.0", Address: "0.0.0.0",
Port: 5244, Port: 5244,
JwtSecret: random.String(16), JwtSecret: random.String(16),
Cdn: "", TokenExpiresIn: 48,
TempDir: "data/temp", TempDir: "data/temp",
Database: Database{ Database: Database{
Type: "sqlite3", Type: "sqlite3",
@ -57,7 +58,6 @@ func DefaultConfig() *Config {
TablePrefix: "x_", TablePrefix: "x_",
DBFile: "data/data.db", DBFile: "data/data.db",
}, },
// CaCheExpiration: 30,
Log: LogConfig{ Log: LogConfig{
Enable: true, Enable: true,
Name: "log/log.log", Name: "log/log.log",

View File

@ -58,7 +58,7 @@ func SortFiles(objs []Obj, orderBy, orderDirection string) {
} }
return objs[i].GetSize() <= objs[j].GetSize() return objs[i].GetSize() <= objs[j].GetSize()
} }
case "updated_at": case "modified":
if orderDirection == "desc" { if orderDirection == "desc" {
return objs[i].ModTime().After(objs[j].ModTime()) return objs[i].ModTime().After(objs[j].ModTime())
} }

View File

@ -3,6 +3,7 @@ package common
import ( import (
"time" "time"
"github.com/alist-org/alist/v3/internal/conf"
"github.com/golang-jwt/jwt/v4" "github.com/golang-jwt/jwt/v4"
"github.com/pkg/errors" "github.com/pkg/errors"
) )
@ -18,7 +19,7 @@ func GenerateToken(username string) (tokenString string, err error) {
claim := UserClaims{ claim := UserClaims{
Username: username, Username: username,
RegisteredClaims: jwt.RegisteredClaims{ RegisteredClaims: jwt.RegisteredClaims{
ExpiresAt: jwt.NewNumericDate(time.Now().Add(12 * time.Hour)), ExpiresAt: jwt.NewNumericDate(time.Now().Add(time.Duration(conf.Conf.TokenExpiresIn) * time.Hour)),
IssuedAt: jwt.NewNumericDate(time.Now()), IssuedAt: jwt.NewNumericDate(time.Now()),
NotBefore: jwt.NewNumericDate(time.Now()), NotBefore: jwt.NewNumericDate(time.Now()),
}} }}

View File

@ -10,15 +10,17 @@ import (
) )
func GetApiUrl(r *http.Request) string { func GetApiUrl(r *http.Request) string {
api := setting.GetStr(conf.ApiUrl) api := conf.Conf.SiteURL
if api == "" {
api = setting.GetStr(conf.ApiUrl)
}
if r != nil && api == "" {
protocol := "http" protocol := "http"
if r != nil {
if r.TLS != nil { if r.TLS != nil {
protocol = "https" protocol = "https"
} }
if api == "" {
api = fmt.Sprintf("%s://%s", protocol, r.Host) api = fmt.Sprintf("%s://%s", protocol, r.Host)
}
} }
strings.TrimSuffix(api, "/") strings.TrimSuffix(api, "/")
return api return api

40
server/static/config.go Normal file
View File

@ -0,0 +1,40 @@
package static
import (
"net/url"
"strings"
"github.com/alist-org/alist/v3/internal/conf"
"github.com/alist-org/alist/v3/internal/setting"
"github.com/alist-org/alist/v3/pkg/utils"
)
type SiteConfig struct {
ApiURL string
BasePath string
Cdn string
}
func getSiteConfig() SiteConfig {
u, err := url.Parse(conf.Conf.SiteURL)
if err != nil {
utils.Log.Fatalf("can't parse site_url: %+v", err)
}
siteConfig := SiteConfig{
ApiURL: conf.Conf.SiteURL,
BasePath: u.Path,
Cdn: strings.ReplaceAll(strings.TrimSuffix(conf.Conf.Cdn, "/"), "$version", conf.WebVersion),
}
// try to get old config
if siteConfig.ApiURL == "" {
siteConfig.ApiURL = setting.GetStr(conf.ApiUrl)
siteConfig.BasePath = setting.GetStr(conf.BasePath)
}
if siteConfig.BasePath != "" {
siteConfig.BasePath = utils.StandardizePath(siteConfig.BasePath)
}
if siteConfig.Cdn == "" {
siteConfig.Cdn = siteConfig.BasePath
}
return siteConfig
}

View File

@ -10,7 +10,6 @@ import (
"github.com/alist-org/alist/v3/cmd/flags" "github.com/alist-org/alist/v3/cmd/flags"
"github.com/alist-org/alist/v3/internal/conf" "github.com/alist-org/alist/v3/internal/conf"
"github.com/alist-org/alist/v3/internal/setting" "github.com/alist-org/alist/v3/internal/setting"
"github.com/alist-org/alist/v3/pkg/utils"
"github.com/alist-org/alist/v3/public" "github.com/alist-org/alist/v3/public"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
@ -22,20 +21,19 @@ func InitIndex() {
log.Fatalf("failed to read index.html: %v", err) log.Fatalf("failed to read index.html: %v", err)
} }
conf.RawIndexHtml = string(index) conf.RawIndexHtml = string(index)
siteConfig := getSiteConfig()
replaceMap := map[string]string{
"cdn: undefined": fmt.Sprintf("cdn: '%s'", siteConfig.Cdn),
"base_path: undefined": fmt.Sprintf("base_path: '%s'", siteConfig.BasePath),
"api: undefined": fmt.Sprintf("api: '%s'", siteConfig.ApiURL),
}
for k, v := range replaceMap {
conf.RawIndexHtml = strings.Replace(conf.RawIndexHtml, k, v, 1)
}
UpdateIndex() UpdateIndex()
} }
func UpdateIndex() { func UpdateIndex() {
cdn := strings.TrimSuffix(conf.Conf.Cdn, "/")
cdn = strings.ReplaceAll(cdn, "$version", conf.WebVersion)
basePath := setting.GetStr(conf.BasePath)
if basePath != "" {
basePath = utils.StandardizePath(basePath)
}
if cdn == "" {
cdn = basePath
}
apiUrl := setting.GetStr(conf.ApiUrl)
favicon := setting.GetStr(conf.Favicon) favicon := setting.GetStr(conf.Favicon)
title := setting.GetStr(conf.SiteTitle) title := setting.GetStr(conf.SiteTitle)
customizeHead := setting.GetStr(conf.CustomizeHead) customizeHead := setting.GetStr(conf.CustomizeHead)
@ -45,9 +43,6 @@ func UpdateIndex() {
replaceMap1 := map[string]string{ replaceMap1 := map[string]string{
"https://jsd.nn.ci/gh/alist-org/logo@main/logo.svg": favicon, "https://jsd.nn.ci/gh/alist-org/logo@main/logo.svg": favicon,
"Loading...": title, "Loading...": title,
"cdn: undefined": fmt.Sprintf("cdn: '%s'", cdn),
"base_path: undefined": fmt.Sprintf("base_path: '%s'", basePath),
"api: undefined": fmt.Sprintf("api: '%s'", apiUrl),
"main_color: undefined": fmt.Sprintf("main_color: '%s'", mainColor), "main_color: undefined": fmt.Sprintf("main_color: '%s'", mainColor),
} }
for k, v := range replaceMap1 { for k, v := range replaceMap1 {