Skip to content

Commit 52ae9f5

Browse files
committed
parse user's permissions and remove execute bit
1 parent 1f4c2a9 commit 52ae9f5

File tree

2 files changed

+74
-36
lines changed

2 files changed

+74
-36
lines changed

internal/file/file_manager_service.go

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ const (
3838
maxAttempts = 5
3939
dirPerm = 0o755
4040
filePerm = 0o600
41+
executePerm = 0o111
4142
)
4243

4344
type (
@@ -627,26 +628,34 @@ func (fms *FileManagerService) validateAndFixPermissions(ctx context.Context, fi
627628
func (fms *FileManagerService) checkFilePermissions(file *mpi.File) error {
628629
filePermission := file.GetFileMeta().GetPermissions()
629630

630-
permissionCodes := filePermission[1:]
631-
632-
for _, digit := range permissionCodes {
633-
singleCode := digit - '0'
631+
permissionOctal, err := strconv.ParseUint(filePermission, 8, 32)
632+
if err != nil {
633+
return fmt.Errorf("file %s has malformed permissions", file.GetFileMeta().GetName())
634+
}
634635

635-
if singleCode&1 != 0 {
636-
return fmt.Errorf("file %s has execute permissions", file.GetFileMeta().GetName())
637-
}
636+
if permissionOctal&executePerm > 0 {
637+
return fmt.Errorf("file %s has execute permissions", file.GetFileMeta().GetName())
638638
}
639639

640640
return nil
641641
}
642642

643643
func (fms *FileManagerService) resetFilePermissions(file *mpi.File) error {
644-
perm, err := strconv.ParseUint("0644", 8, 32)
644+
filePermission := file.GetFileMeta().GetPermissions()
645+
646+
permissionOctal, err := strconv.ParseUint(filePermission, 8, 32)
645647
if err != nil {
646-
return fmt.Errorf("error parsing file permissions: %w", err)
648+
chmodErr := os.Chmod(file.GetFileMeta().GetName(), os.FileMode(filePerm))
649+
if chmodErr != nil {
650+
return fmt.Errorf("failed to set file permissions: %w", err)
651+
}
652+
653+
return fmt.Errorf("falied to parse file permissions, permissions set to 0o644: %w", err)
647654
}
648655

649-
err = os.Chmod(file.GetFileMeta().GetName(), os.FileMode(perm))
656+
newPermission := permissionOctal &^ executePerm
657+
658+
err = os.Chmod(file.GetFileMeta().GetName(), os.FileMode(newPermission))
650659
if err != nil {
651660
return fmt.Errorf("failed to set file permissions: %w", err)
652661
}

internal/file/file_manager_service_test.go

Lines changed: 55 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import (
1313
"os"
1414
"path"
1515
"path/filepath"
16+
"strconv"
1617
"sync"
1718
"testing"
1819

@@ -335,7 +336,7 @@ func TestFileManagerService_validateAndFixPermissions(t *testing.T) {
335336

336337
err := os.Chmod(execFile.Name(), 0o700)
337338
require.NoError(t, err)
338-
err = os.Chmod(normalFile.Name(), 0o600)
339+
err = os.Chmod(normalFile.Name(), 0o620)
339340
require.NoError(t, err)
340341

341342
fileList := []*mpi.File{
@@ -348,7 +349,7 @@ func TestFileManagerService_validateAndFixPermissions(t *testing.T) {
348349
{
349350
FileMeta: &mpi.FileMeta{
350351
Name: normalFile.Name(),
351-
Permissions: "0600",
352+
Permissions: "0620",
352353
},
353354
},
354355
}
@@ -361,11 +362,11 @@ func TestFileManagerService_validateAndFixPermissions(t *testing.T) {
361362

362363
info, err := os.Stat(execFile.Name())
363364
require.NoError(t, err)
364-
assert.Equal(t, os.FileMode(0o644), info.Mode().Perm())
365+
assert.Equal(t, os.FileMode(0o600), info.Mode().Perm())
365366

366367
info, err = os.Stat(normalFile.Name())
367368
require.NoError(t, err)
368-
assert.Equal(t, os.FileMode(0o600), info.Mode().Perm())
369+
assert.Equal(t, os.FileMode(0o620), info.Mode().Perm())
369370
}
370371

371372
func TestFileManagerService_checkFilePermissions(t *testing.T) {
@@ -382,22 +383,17 @@ func TestFileManagerService_checkFilePermissions(t *testing.T) {
382383
permissions: "0600",
383384
expectError: false,
384385
},
385-
{
386-
name: "File with read permissions for all",
387-
permissions: "0444",
388-
expectError: false,
389-
},
390386
{
391387
name: "File with read/write and execute permissions for owner",
392388
permissions: "0700",
393389
expectError: true,
394390
errorMsg: "has execute permissions",
395391
},
396392
{
397-
name: "File with execute permission for all",
398-
permissions: "0777",
393+
name: "File with malformed permissions",
394+
permissions: "abcde",
399395
expectError: true,
400-
errorMsg: "has execute permissions",
396+
errorMsg: "has malformed permissions",
401397
},
402398
}
403399

@@ -424,26 +420,59 @@ func TestFileManagerService_checkFilePermissions(t *testing.T) {
424420

425421
func TestFileManagerService_resetFilePermissions(t *testing.T) {
426422
fileManagerService := NewFileManagerService(nil, types.AgentConfig(), &sync.RWMutex{})
427-
428423
tempDir := t.TempDir()
429-
tempFile := helpers.CreateFileWithErrorCheck(t, tempDir, "test.conf")
430-
defer helpers.RemoveFileWithErrorCheck(t, tempFile.Name())
431424

432-
err := os.Chmod(tempFile.Name(), 0o700)
433-
require.NoError(t, err)
434-
435-
file := &mpi.File{
436-
FileMeta: &mpi.FileMeta{
437-
Name: tempFile.Name(),
425+
tests := []struct {
426+
name string
427+
permissions string
428+
errorMsg string
429+
expectPermissions string
430+
expectError bool
431+
}{
432+
{
433+
name: "File with execute permissions for owner and others",
434+
permissions: "0703",
435+
expectError: false,
436+
expectPermissions: "0602",
437+
},
438+
{
439+
name: "File with malformed permissions",
440+
permissions: "abcde",
441+
expectError: true,
442+
expectPermissions: "0600",
443+
errorMsg: "falied to parse file permissions",
438444
},
439445
}
440446

441-
err = fileManagerService.resetFilePermissions(file)
442-
require.NoError(t, err)
447+
for _, test := range tests {
448+
t.Run(test.name, func(t *testing.T) {
449+
tempFile := helpers.CreateFileWithErrorCheck(t, tempDir, "test.conf")
450+
defer helpers.RemoveFileWithErrorCheck(t, tempFile.Name())
443451

444-
info, err := os.Stat(tempFile.Name())
445-
require.NoError(t, err)
446-
assert.Equal(t, os.FileMode(0o644), info.Mode().Perm())
452+
file := &mpi.File{
453+
FileMeta: &mpi.FileMeta{
454+
Name: tempFile.Name(),
455+
Permissions: test.permissions,
456+
},
457+
}
458+
459+
parseErr := fileManagerService.resetFilePermissions(file)
460+
461+
info, err := os.Stat(tempFile.Name())
462+
require.NoError(t, err)
463+
464+
actual := "0" + strconv.FormatUint(uint64(info.Mode().Perm()), 8)
465+
466+
if test.expectError {
467+
require.Error(t, parseErr)
468+
assert.Equal(t, test.expectPermissions, actual)
469+
assert.Contains(t, parseErr.Error(), test.errorMsg)
470+
} else {
471+
require.NoError(t, parseErr)
472+
assert.Equal(t, test.expectPermissions, actual)
473+
}
474+
})
475+
}
447476
}
448477

449478
func TestFileManagerService_ClearCache(t *testing.T) {

0 commit comments

Comments
 (0)