Skip to content

Commit 7a05566

Browse files
committed
feat: add option --arhive-user and --archive-dir-user
Add ability to allow archiving for specified user
1 parent 0997d0e commit 7a05566

File tree

8 files changed

+86
-41
lines changed

8 files changed

+86
-41
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,10 @@ ghfs [options]
248248
A download link will appear on top part of the page.
249249
Make sure there is no circular symbol links.
250250
--archive <url-path> ...
251+
--archive-user <separator><url-path>[<separator><allowed-username>...] ...
251252
Allow user to download the whole contents of current directory for specific url paths(and sub paths).
252253
--archive-dir <fs-path> ...
254+
--archive-dir-user <separator><fs-path>[<separator><allowed-username>...] ...
253255
Similar to --archive, but use file system path instead of url path.
254256
255257
--global-cors

README.zh-CN.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,10 @@ ghfs [选项]
238238
页面顶部会出现下载链接。
239239
请确保符号链接没有循环引用。
240240
--archive <URL路径> ...
241+
--archive-user <分隔符><URL路径>[<分隔符><允许的用户名>...] ...
241242
对指定URL路径(及子路径)开启打包下载当前目录内容的功能。
242243
--archive-dir <文件系统路径> ...
244+
--archive-dir-user <分隔符><文件系统路径>[<分隔符><允许的用户名>...] ...
243245
与--archive类似,但指定的是文件系统路径,而不是URL路径。
244246
245247
--global-cors

src/param/cli.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,15 @@ func NewCliCmd() *goNixArgParser.Command {
138138
err = options.AddFlagValues("archiveurls", "--archive", "", nil, "url path that enable download as archive for specific directories")
139139
serverError.CheckFatal(err)
140140

141+
err = options.AddFlagValues("archiveurlsusers", "--archive-user", "", nil, "url path that allow archive files for specific users, <sep><url-path>[<sep><user>...]")
142+
serverError.CheckFatal(err)
143+
141144
err = options.AddFlagValues("archivedirs", "--archive-dir", "", nil, "file system path that enable download as archive for specific directories")
142145
serverError.CheckFatal(err)
143146

147+
err = options.AddFlagValues("archivedirsusers", "--archive-dir-user", "", nil, "file system path that allow archive files for specific users, <sep><fs-path>[<sep><user>...]")
148+
serverError.CheckFatal(err)
149+
144150
err = options.AddFlag("globalcors", "--global-cors", "GHFS_GLOBAL_CORS", "enable CORS headers for all directories")
145151
serverError.CheckFatal(err)
146152

@@ -388,7 +394,7 @@ func CmdResultsToParams(results []*goNixArgParser.ParseResult) (params Params, e
388394
param.CorsUrls, _ = result.GetStrings("corsurls")
389395
param.CorsDirs, _ = result.GetStrings("corsdirs")
390396

391-
// auth/upload/mkdir/delete urls/dirs urls users
397+
// auth/upload/mkdir/delete/archive urls/dirs urls users
392398
authUrlsUsers, _ := result.GetStrings("authurlsusers")
393399
param.AuthUrlsUsers = SplitAllKeyValues(authUrlsUsers)
394400

@@ -419,6 +425,12 @@ func CmdResultsToParams(results []*goNixArgParser.ParseResult) (params Params, e
419425
deleteDirsUsers, _ := result.GetStrings("deletedirsusers")
420426
param.DeleteDirsUsers = SplitAllKeyValues(deleteDirsUsers)
421427

428+
archiveUrlsUsers, _ := result.GetStrings("archiveurlsusers")
429+
param.ArchiveUrlsUsers = SplitAllKeyValues(archiveUrlsUsers)
430+
431+
archiveDirsUsers, _ := result.GetStrings("archivedirsusers")
432+
param.ArchiveDirsUsers = SplitAllKeyValues(archiveDirsUsers)
433+
422434
// global restrict access
423435
if result.HasKey("globalrestrictaccess") {
424436
param.GlobalRestrictAccess, _ = result.GetStrings("globalrestrictaccess")

src/param/main.go

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,6 @@ type Param struct {
3434
AuthDirs []string
3535
AuthDirsUsers [][]string // [][path, user...]
3636

37-
GlobalRestrictAccess []string
38-
// [][restrict-path, allow-hosts...]
39-
RestrictAccessUrls [][]string
40-
RestrictAccessDirs [][]string
41-
42-
GlobalHeaders [][2]string // [][name, value]
43-
// [][path, (name, value)...]
44-
HeadersUrls [][]string
45-
HeadersDirs [][]string
46-
4737
IndexUrls []string
4838
IndexUrlsUsers [][]string // [][path, user...]
4939
IndexDirs []string
@@ -67,14 +57,26 @@ type Param struct {
6757
DeleteDirs []string
6858
DeleteDirsUsers [][]string // [][path, user...]
6959

70-
GlobalArchive bool
71-
ArchiveUrls []string
72-
ArchiveDirs []string
60+
GlobalArchive bool
61+
ArchiveUrls []string
62+
ArchiveUrlsUsers [][]string // [][path, user...]
63+
ArchiveDirs []string
64+
ArchiveDirsUsers [][]string // [][path, user...]
7365

7466
GlobalCors bool
7567
CorsUrls []string
7668
CorsDirs []string
7769

70+
GlobalRestrictAccess []string
71+
// [][restrict-path, allow-hosts...]
72+
RestrictAccessUrls [][]string
73+
RestrictAccessDirs [][]string
74+
75+
GlobalHeaders [][2]string // [][name, value]
76+
// [][path, (name, value)...]
77+
HeadersUrls [][]string
78+
HeadersDirs [][]string
79+
7880
Certificates []tls.Certificate
7981
Listens []string
8082
ListensPlain []string
@@ -165,7 +167,7 @@ func (param *Param) normalize() (errs []error) {
165167
param.CorsUrls = NormalizeUrlPaths(param.CorsUrls)
166168
param.CorsDirs = NormalizeFsPaths(param.CorsDirs)
167169

168-
// auth/index/upload/mkdir/delete urls/dirs users
170+
// auth/index/upload/mkdir/delete/archive urls/dirs users
169171
param.AuthUrlsUsers, es = normalizeAllPathValues(param.AuthUrlsUsers, true, util.NormalizeUrlPath, nil)
170172
if len(es) == 0 {
171173
dedupAllPathValues(param.AuthUrlsUsers)
@@ -231,6 +233,19 @@ func (param *Param) normalize() (errs []error) {
231233
errs = append(errs, es...)
232234
}
233235

236+
param.ArchiveUrlsUsers, es = normalizeAllPathValues(param.ArchiveUrlsUsers, false, util.NormalizeUrlPath, nil)
237+
if len(es) == 0 {
238+
dedupAllPathValues(param.ArchiveUrlsUsers)
239+
} else {
240+
errs = append(errs, es...)
241+
}
242+
param.ArchiveDirsUsers, es = normalizeAllPathValues(param.ArchiveDirsUsers, false, filepath.Abs, nil)
243+
if len(es) == 0 {
244+
dedupAllPathValues(param.ArchiveDirsUsers)
245+
} else {
246+
errs = append(errs, es...)
247+
}
248+
234249
// global restrict access, nil to disable, non-nil to enable with allowed hosts
235250
if param.GlobalRestrictAccess != nil {
236251
param.GlobalRestrictAccess = util.ExtractHostsFromUrls(param.GlobalRestrictAccess)

src/serverHandler/aliasHandler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,7 +192,7 @@ func newAliasHandler(
192192
upload: newHierarchyAvailability(currentAlias.url, currentAlias.fs, p.GlobalUpload, p.UploadUrls, vhostCtx.uploadUrlsUsers, p.UploadDirs, vhostCtx.uploadDirsUsers),
193193
mkdir: newHierarchyAvailability(currentAlias.url, currentAlias.fs, p.GlobalMkdir, p.MkdirUrls, vhostCtx.mkdirUrlsUsers, p.MkdirDirs, vhostCtx.mkdirDirsUsers),
194194
delete: newHierarchyAvailability(currentAlias.url, currentAlias.fs, p.GlobalDelete, p.DeleteUrls, vhostCtx.deleteUrlsUsers, p.DeleteDirs, vhostCtx.deleteDirsUsers),
195-
archive: newHierarchyAvailability(currentAlias.url, currentAlias.fs, p.GlobalArchive, p.ArchiveUrls, nil, p.ArchiveDirs, nil),
195+
archive: newHierarchyAvailability(currentAlias.url, currentAlias.fs, p.GlobalArchive, p.ArchiveUrls, vhostCtx.archiveUrlsUsers, p.ArchiveDirs, vhostCtx.archiveDirsUsers),
196196
cors: newHierarchyAvailability(currentAlias.url, currentAlias.fs, p.GlobalCors, p.CorsUrls, nil, p.CorsDirs, nil),
197197

198198
globalRestrictAccess: globalRestrictAccess,

src/serverHandler/perm.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func (h *aliasHandler) getCanDelete(info os.FileInfo, rawReqPath, reqFsPath stri
164164
return false
165165
}
166166

167-
func (h *aliasHandler) getCanArchive(subInfos []os.FileInfo, rawReqPath, reqFsPath string) bool {
167+
func (h *aliasHandler) getCanArchive(subInfos []os.FileInfo, rawReqPath, reqFsPath string, userId int) bool {
168168
if len(subInfos) == 0 {
169169
return false
170170
}
@@ -173,7 +173,17 @@ func (h *aliasHandler) getCanArchive(subInfos []os.FileInfo, rawReqPath, reqFsPa
173173
return true
174174
}
175175

176-
return hasUrlOrDirPrefix(h.archive.urls, rawReqPath, h.archive.dirs, reqFsPath)
176+
if hasUrlOrDirPrefix(h.archive.urls, rawReqPath, h.archive.dirs, reqFsPath) {
177+
return true
178+
}
179+
180+
if userId >= 0 {
181+
if _, match := hasUrlOrDirPrefixUsers(h.archive.urlsUsers, rawReqPath, h.archive.dirsUsers, reqFsPath, userId); match {
182+
return true
183+
}
184+
}
185+
186+
return false
177187
}
178188

179189
func (h *aliasHandler) getCanCors(rawReqPath, reqFsPath string) bool {

src/serverHandler/sessionData.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ func (h *aliasHandler) getSessionData(r *http.Request) (session *sessionContext,
457457
canMkdir := allowAccess && authSuccess && h.getCanMkdir(item, vhostReqPath, fsPath, authUserId)
458458
canDelete := allowAccess && authSuccess && h.getCanDelete(item, vhostReqPath, fsPath, authUserId)
459459
hasDeletable := canDelete && len(subItems) > len(aliasSubItems)
460-
canArchive := allowAccess && authSuccess && h.getCanArchive(subItems, vhostReqPath, fsPath)
460+
canArchive := allowAccess && authSuccess && h.getCanArchive(subItems, vhostReqPath, fsPath, authUserId)
461461
canCors := allowAccess && authSuccess && h.getCanCors(vhostReqPath, fsPath)
462462
loginAvail := len(authUserName) == 0 && h.users.Len() > 0
463463

src/serverHandler/vhostHandler.go

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,19 @@ type vhostContext struct {
1414
logger *serverLog.Logger
1515
theme theme.Theme
1616

17-
users *user.List
18-
authUrlsUsers pathIntsList
19-
authDirsUsers pathIntsList
20-
indexUrlsUsers pathIntsList
21-
indexDirsUsers pathIntsList
22-
uploadUrlsUsers pathIntsList
23-
uploadDirsUsers pathIntsList
24-
mkdirUrlsUsers pathIntsList
25-
mkdirDirsUsers pathIntsList
26-
deleteUrlsUsers pathIntsList
27-
deleteDirsUsers pathIntsList
17+
users *user.List
18+
authUrlsUsers pathIntsList
19+
authDirsUsers pathIntsList
20+
indexUrlsUsers pathIntsList
21+
indexDirsUsers pathIntsList
22+
uploadUrlsUsers pathIntsList
23+
uploadDirsUsers pathIntsList
24+
mkdirUrlsUsers pathIntsList
25+
mkdirDirsUsers pathIntsList
26+
deleteUrlsUsers pathIntsList
27+
deleteDirsUsers pathIntsList
28+
archiveUrlsUsers pathIntsList
29+
archiveDirsUsers pathIntsList
2830

2931
shows *regexp.Regexp
3032
showDirs *regexp.Regexp
@@ -89,17 +91,19 @@ func NewVhostHandler(
8991
theme: theme,
9092
logger: logger,
9193

92-
users: users,
93-
authUrlsUsers: pathUsernamesToPathUids(users, p.AuthUrlsUsers),
94-
authDirsUsers: pathUsernamesToPathUids(users, p.AuthDirsUsers),
95-
indexUrlsUsers: pathUsernamesToPathUids(users, p.IndexUrlsUsers),
96-
indexDirsUsers: pathUsernamesToPathUids(users, p.IndexDirsUsers),
97-
uploadUrlsUsers: pathUsernamesToPathUids(users, p.UploadUrlsUsers),
98-
uploadDirsUsers: pathUsernamesToPathUids(users, p.UploadDirsUsers),
99-
mkdirUrlsUsers: pathUsernamesToPathUids(users, p.MkdirUrlsUsers),
100-
mkdirDirsUsers: pathUsernamesToPathUids(users, p.MkdirDirsUsers),
101-
deleteUrlsUsers: pathUsernamesToPathUids(users, p.DeleteUrlsUsers),
102-
deleteDirsUsers: pathUsernamesToPathUids(users, p.DeleteDirsUsers),
94+
users: users,
95+
authUrlsUsers: pathUsernamesToPathUids(users, p.AuthUrlsUsers),
96+
authDirsUsers: pathUsernamesToPathUids(users, p.AuthDirsUsers),
97+
indexUrlsUsers: pathUsernamesToPathUids(users, p.IndexUrlsUsers),
98+
indexDirsUsers: pathUsernamesToPathUids(users, p.IndexDirsUsers),
99+
uploadUrlsUsers: pathUsernamesToPathUids(users, p.UploadUrlsUsers),
100+
uploadDirsUsers: pathUsernamesToPathUids(users, p.UploadDirsUsers),
101+
mkdirUrlsUsers: pathUsernamesToPathUids(users, p.MkdirUrlsUsers),
102+
mkdirDirsUsers: pathUsernamesToPathUids(users, p.MkdirDirsUsers),
103+
deleteUrlsUsers: pathUsernamesToPathUids(users, p.DeleteUrlsUsers),
104+
deleteDirsUsers: pathUsernamesToPathUids(users, p.DeleteDirsUsers),
105+
archiveUrlsUsers: pathUsernamesToPathUids(users, p.ArchiveUrlsUsers),
106+
archiveDirsUsers: pathUsernamesToPathUids(users, p.ArchiveDirsUsers),
103107

104108
shows: shows,
105109
showDirs: showDirs,

0 commit comments

Comments
 (0)