@@ -13,6 +13,8 @@ import (
1313 "fmt"
1414 "log/slog"
1515 "os"
16+ "strconv"
17+ "strings"
1618 "sync"
1719
1820 "google.golang.org/grpc"
@@ -152,6 +154,11 @@ func (fms *FileManagerService) ConfigApply(ctx context.Context,
152154 return model .Error , allowedErr
153155 }
154156
157+ permissionErr := fms .validateAndFixPermissions (ctx , fileOverview .GetFiles ())
158+ if permissionErr != nil {
159+ return model .PermissionChange , permissionErr
160+ }
161+
155162 diffFiles , fileContent , compareErr := fms .DetermineFileActions (
156163 ctx ,
157164 fms .currentFilesOnDisk ,
@@ -518,6 +525,58 @@ func (fms *FileManagerService) checkAllowedDirectory(checkFiles []*mpi.File) err
518525 return nil
519526}
520527
528+ func (fms * FileManagerService ) validateAndFixPermissions (ctx context.Context , fileList []* mpi.File ) error {
529+ var permissionIssues []string
530+
531+ for _ , file := range fileList {
532+ if err := fms .checkFilePermissions (file ); err != nil {
533+ permissionIssues = append (permissionIssues , file .GetFileMeta ().GetName ())
534+
535+ if resetErr := fms .resetFilePermissions (file ); resetErr != nil {
536+ return fmt .Errorf ("failed to reset permissions for %s: %w" , file .GetFileMeta ().GetName (), resetErr )
537+ }
538+
539+ slog .InfoContext (ctx , "Reset execute permissions" , "file" , file .GetFileMeta ().GetName ())
540+ }
541+ }
542+
543+ if len (permissionIssues ) > 0 {
544+ return fmt .Errorf ("reset execute permissions for files: %s" , strings .Join (permissionIssues , ", " ))
545+ }
546+
547+ return nil
548+ }
549+
550+ func (fms * FileManagerService ) checkFilePermissions (file * mpi.File ) error {
551+ filePermission := file .GetFileMeta ().GetPermissions ()
552+
553+ permissionCodes := filePermission [1 :]
554+
555+ for _ , digit := range permissionCodes {
556+ singleCode := digit - '0'
557+
558+ if singleCode & 1 != 0 {
559+ return fmt .Errorf ("file %s has execute permissions" , file .GetFileMeta ().GetName ())
560+ }
561+ }
562+
563+ return nil
564+ }
565+
566+ func (fms * FileManagerService ) resetFilePermissions (file * mpi.File ) error {
567+ perm , err := strconv .ParseUint ("0644" , 8 , 32 )
568+ if err != nil {
569+ return fmt .Errorf ("error parsing file permissions: %w" , err )
570+ }
571+
572+ err = os .Chmod (file .GetFileMeta ().GetName (), os .FileMode (perm ))
573+ if err != nil {
574+ return fmt .Errorf ("failed to set file permissions: %w" , err )
575+ }
576+
577+ return nil
578+ }
579+
521580func (fms * FileManagerService ) convertToManifestFileMap (
522581 currentFiles map [string ]* mpi.File ,
523582 referenced bool ,
0 commit comments