Skip to content

Commit bb22104

Browse files
authored
Merge pull request #138 from beclab/fix/smb_public_share
fix: support anonymous SMB access
2 parents 3915806 + ccadbcf commit bb22104

File tree

5 files changed

+103
-47
lines changed

5 files changed

+103
-47
lines changed

pkg/files/fileutils.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,8 +305,10 @@ func Chown(fs afero.Fs, path string, uid, gid int) error {
305305
var err error = nil
306306
if fs == nil {
307307
err = os.Chown(path, uid, gid)
308+
err = os.Chmod(path, 0775)
308309
} else {
309310
err = fs.Chown(path, uid, gid)
311+
err = fs.Chmod(path, 0775)
310312
}
311313
if err != nil {
312314
klog.Errorf("can't chown directory %s to user %d: %s", path, uid, err)

pkg/hertz/biz/handler/api/share/share_service.go

Lines changed: 29 additions & 23 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/samba/commands.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,28 @@ func (c *commands) DeleteGroup(groupName string) error {
192192
return nil
193193
}
194194

195+
func (c *commands) SetAnonymousPermission(owner string, smbPath string) error {
196+
var args = []string{fmt.Sprintf("nobody:%s", owner), smbPath}
197+
cmd := exec.Command("chown", args...)
198+
out, err := cmd.CombinedOutput()
199+
if err != nil {
200+
klog.Errorf("samba chown anonymous error: %v, output: %s, cmd: %s", err, string(out), cmd.String())
201+
} else {
202+
klog.Infof("samba chown anonymous: %s done.", cmd.String())
203+
}
204+
205+
args = []string{"-R", "3777", smbPath}
206+
cmd = exec.Command("chmod", args...)
207+
out, err = cmd.CombinedOutput()
208+
if err != nil {
209+
klog.Errorf("samba chmod anonymous error: %v, output: %s, cmd: %s", err, string(out), cmd.String())
210+
} else {
211+
klog.Infof("samba chmod anonymous: %s done.", cmd.String())
212+
}
213+
214+
return nil
215+
}
216+
195217
func (c *commands) SetAcl(user string, owner string, op string, rw string, smbPath string) error {
196218
var userAcl = fmt.Sprintf("%s:%s", user, rw)
197219
if op == "-x" {

pkg/samba/samba.go

Lines changed: 36 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ type SambaShare struct {
5555
ReadOnly string `json:"read_only"`
5656
ForceUser string `json:"force_user"`
5757
ForceGroup string `json:"force_group"`
58+
Anonymous bool `json:"anonymous"`
5859
}
5960

6061
type SambaSharePathAccount struct {
@@ -283,22 +284,6 @@ func (s *samba) generateConf() {
283284
continue
284285
}
285286

286-
shareUser, sharePwd, err := s.getUser(item.PasswordMd5)
287-
if err != nil {
288-
klog.Errorf("samba decode user error: %v, data: %s, id: %s, name: %s, owner: %s", err, item.PasswordMd5, item.ID, item.Name, item.Owner)
289-
continue
290-
}
291-
292-
if err := s.commands.CreateGroup(item.Owner, ""); err != nil {
293-
klog.Errorf("samba create group %s error: %v", item.Owner, err)
294-
return
295-
}
296-
297-
if err := s.commands.CreateUser(shareUser, sharePwd, item.Owner); err != nil {
298-
klog.Errorf("samba create user %s error: %v", shareUser, err)
299-
return
300-
}
301-
302287
fPath := fmt.Sprintf("/%s/%s%s", item.FileType, item.Extend, item.Path)
303288
fp, err := models.CreateFileParam(item.Owner, fPath)
304289
if err != nil {
@@ -312,11 +297,35 @@ func (s *samba) generateConf() {
312297
return
313298
}
314299

315-
if item.Permission > 1 {
316-
if err := s.commands.SetAcl(shareUser, item.Owner, "-m", "rwx", fileUri+fp.Path); err != nil {
317-
klog.Errorf("samba setfacl error: %v", err)
300+
var anonymous bool
301+
var shareUser, sharePwd string
302+
if item.PasswordMd5 != "" {
303+
shareUser, sharePwd, err = s.getUser(item.PasswordMd5)
304+
if err != nil {
305+
klog.Errorf("samba decode user error: %v, data: %s, id: %s, name: %s, owner: %s", err, item.PasswordMd5, item.ID, item.Name, item.Owner)
306+
continue
307+
}
308+
309+
if err := s.commands.CreateGroup(item.Owner, ""); err != nil {
310+
klog.Errorf("samba create group %s error: %v", item.Owner, err)
311+
return
312+
}
313+
314+
if err := s.commands.CreateUser(shareUser, sharePwd, item.Owner); err != nil {
315+
klog.Errorf("samba create user %s error: %v", shareUser, err)
318316
return
319317
}
318+
319+
if item.Permission > 1 {
320+
if err := s.commands.SetAcl(shareUser, item.Owner, "-m", "rwx", fileUri+fp.Path); err != nil {
321+
klog.Errorf("samba setfacl error: %v", err)
322+
return
323+
}
324+
}
325+
} else {
326+
// anonymous
327+
anonymous = true
328+
s.commands.SetAnonymousPermission(item.Owner, fileUri+fp.Path)
320329
}
321330

322331
w, r := s.formatPrivilege(item.Permission)
@@ -330,6 +339,7 @@ func (s *samba) generateConf() {
330339
ReadOnly: r,
331340
ForceUser: shareUser,
332341
ForceGroup: item.Owner,
342+
Anonymous: anonymous,
333343
}
334344
shares.Paths = append(shares.Paths, smbShare)
335345
}
@@ -474,11 +484,14 @@ func (s *samba) recoverSharedOwner(sharedPaths []string) {
474484
continue
475485
}
476486

477-
if err := s.commands.SetAcl(smb.User, smb.Owner, "-x", "", uri+m.Path); err != nil { // remove acl
478-
klog.Errorf("samba recover, setfacl remove error: %v", err)
479-
return
487+
if smb.User != "" {
488+
if err := s.commands.SetAcl(smb.User, smb.Owner, "-x", "", uri+m.Path); err != nil { // remove acl
489+
klog.Errorf("samba recover, setfacl remove error: %v", err)
490+
return
491+
}
492+
493+
s.commands.DeleteUser([]string{smb.User})
480494
}
481495

482-
s.commands.DeleteUser([]string{smb.User})
483496
}
484497
}

pkg/samba/template/samba.conf.tmpl

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[global]
22
server string = samba
3+
map to guest = Bad User
34
idmap config * : range = 3000-7999
45
security = user
56
client min protocol = SMB2
@@ -16,15 +17,27 @@
1617
[{{ $data.Name }}]
1718
path = {{ $data.Path }}
1819
comment = {{ $data.Comment }}
20+
{{ if $data.Anonymous -}}
21+
browseable = yes
22+
writable = yes
23+
read only = no
24+
guest ok = yes
25+
force user = nobody
26+
force group = {{ $data.ForceGroup }}
27+
create mask = 0664
28+
directory mask = 0775
29+
{{ else -}}
1930
valid users = {{ $data.ForceUser }} @{{ $data.ForceGroup }}
2031
browseable = yes
2132
writable = {{ $data.Writable }}
2233
read only = {{ $data.ReadOnly }}
34+
force group = {{ $data.ForceGroup }}
2335
{{ if eq $data.Writable "yes" -}}
2436
create mask = 0664
2537
directory mask = 2775
2638
vfs objects = acl_xattr
2739
inherit permissions = no
2840
map acl inherit = yes
29-
{{ end }}
41+
{{ end -}}
42+
{{ end -}}
3043
{{ end }}

0 commit comments

Comments
 (0)