-
-
Notifications
You must be signed in to change notification settings - Fork 312
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix windows permissions #1766
base: develop
Are you sure you want to change the base?
Fix windows permissions #1766
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,15 +2,14 @@ package dataroot | |
|
||
import ( | ||
"errors" | ||
"os" | ||
|
||
"github.com/safing/portmaster/base/utils" | ||
) | ||
|
||
var root *utils.DirStructure | ||
|
||
// Initialize initializes the data root directory. | ||
func Initialize(rootDir string, perm os.FileMode) error { | ||
func Initialize(rootDir string, perm utils.FSPermission) error { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification Update permission value in notifier/main.go to use utils.FSPermission The verification shows that most callers have been updated to use
🔗 Analysis chainVerify all callers of Initialize function The parameter type change from 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Search for any remaining direct calls using os.FileMode
rg -A 2 "Initialize\([^,]+,\s*os\."
# Search for all calls to Initialize to verify they've been updated
rg -A 2 "dataroot\.Initialize\("
Length of output: 897 |
||
if root != nil { | ||
return errors.New("already initialized") | ||
} | ||
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -14,10 +14,10 @@ import ( | |||||
"path/filepath" | ||||||
"time" | ||||||
|
||||||
"github.com/hectane/go-acl" | ||||||
"github.com/safing/jess/filesig" | ||||||
"github.com/safing/jess/lhash" | ||||||
"github.com/safing/portmaster/base/log" | ||||||
"github.com/safing/portmaster/base/utils" | ||||||
"github.com/safing/portmaster/base/utils/renameio" | ||||||
) | ||||||
|
||||||
|
@@ -137,17 +137,10 @@ func (reg *ResourceRegistry) fetchFile(ctx context.Context, client *http.Client, | |||||
return fmt.Errorf("%s: failed to finalize file %s: %w", reg.Name, rv.storagePath(), err) | ||||||
} | ||||||
// set permissions | ||||||
if onWindows { | ||||||
err = acl.Chmod(rv.storagePath(), 0o0755) | ||||||
if err != nil { | ||||||
log.Warningf("%s: failed to set permissions on downloaded file %s: %s", reg.Name, rv.storagePath(), err) | ||||||
} | ||||||
} else { | ||||||
// TODO: only set executable files to 0755, set other to 0644 | ||||||
err = os.Chmod(rv.storagePath(), 0o0755) //nolint:gosec // See TODO above. | ||||||
if err != nil { | ||||||
log.Warningf("%s: failed to set permissions on downloaded file %s: %s", reg.Name, rv.storagePath(), err) | ||||||
} | ||||||
// TODO: distinguish between executable and non executable files. | ||||||
err = utils.SetExecPermission(rv.storagePath(), utils.PublicReadPermission) | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The function
Suggested change
Copilot is powered by AI, so mistakes are possible. Review output carefully before use. |
||||||
if err != nil { | ||||||
log.Warningf("%s: failed to set permissions on downloaded file %s: %s", reg.Name, rv.storagePath(), err) | ||||||
Comment on lines
+140
to
+143
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification Let me analyze the current findings and generate a final response based on the code search results. Executable detection should be based on file extension and platform The codebase already has platform-specific handling for executables, particularly for Windows (
Suggested improvements:
🔗 Analysis chainConsider implementing TODO for executable detection. The current implementation sets execution permissions on all files, but the TODO suggests a need for differentiation. This could be important for security and functionality. Consider implementing the following improvements:
🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Description: Check current file types and their permissions
# Test: Look for patterns that could help identify executable files
# Check file extensions of resources
rg "NewResource\(" -A 3
# Check for existing executable detection logic
rg -g "*.go" "executable|\.exe"
Length of output: 37839 |
||||||
} | ||||||
|
||||||
log.Debugf("%s: fetched %s and stored to %s", reg.Name, downloadURL, rv.storagePath()) | ||||||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,15 +6,13 @@ import ( | |
"io/fs" | ||
"os" | ||
"runtime" | ||
|
||
"github.com/hectane/go-acl" | ||
) | ||
|
||
const isWindows = runtime.GOOS == "windows" | ||
|
||
// EnsureDirectory ensures that the given directory exists and that is has the given permissions set. | ||
// If path is a file, it is deleted and a directory created. | ||
func EnsureDirectory(path string, perm os.FileMode) error { | ||
func EnsureDirectory(path string, perm FSPermission) error { | ||
// open path | ||
f, err := os.Stat(path) | ||
if err == nil { | ||
|
@@ -23,10 +21,10 @@ func EnsureDirectory(path string, perm os.FileMode) error { | |
// directory exists, check permissions | ||
if isWindows { | ||
// Ignore windows permission error. For none admin users it will always fail. | ||
acl.Chmod(path, perm) | ||
SetDirPermission(path, perm) | ||
return nil | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Add logging for Windows permission failures Instead of silently ignoring Windows permission errors, log them to help diagnose permission issues during deployment and maintenance. if isWindows {
// Ignore windows permission error. For none admin users it will always fail.
- SetDirPermission(path, perm)
+ if err := SetDirPermission(path, perm); err != nil {
+ log.Warningf("Failed to set directory permissions on Windows: %v", err)
+ }
return nil
}
|
||
} else if f.Mode().Perm() != perm { | ||
return os.Chmod(path, perm) | ||
} else if f.Mode().Perm() != perm.AsUnixDirExecPermission() { | ||
return SetDirPermission(path, perm) | ||
} | ||
return nil | ||
} | ||
|
@@ -37,17 +35,16 @@ func EnsureDirectory(path string, perm os.FileMode) error { | |
} | ||
// file does not exist (or has been deleted) | ||
if err == nil || errors.Is(err, fs.ErrNotExist) { | ||
err = os.Mkdir(path, perm) | ||
err = os.Mkdir(path, perm.AsUnixDirExecPermission()) | ||
if err != nil { | ||
return fmt.Errorf("could not create dir %s: %w", path, err) | ||
} | ||
// Set windows permissions. Linux permission where already set with creation. | ||
if isWindows { | ||
// Ignore windows permission error. For none admin users it will always fail. | ||
acl.Chmod(path, perm) | ||
return nil | ||
} else { | ||
return os.Chmod(path, perm) | ||
SetDirPermission(path, perm) | ||
} | ||
return nil | ||
} | ||
// other error opening path | ||
return fmt.Errorf("failed to access %s: %w", path, err) | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
//go:build !windows | ||
|
||
package utils | ||
|
||
import "os" | ||
|
||
// SetDirPermission sets the permission of a directory. | ||
func SetDirPermission(path string, perm FSPermission) error { | ||
return os.Chmod(path, perm.AsUnixDirExecPermission()) | ||
} | ||
|
||
// SetExecPermission sets the permission of an executable file. | ||
func SetExecPermission(path string, perm FSPermission) error { | ||
return SetDirPermission(path, perm) | ||
} | ||
|
||
// SetFilePermission sets the permission of a non executable file. | ||
func SetFilePermission(path string, perm FSPermission) error { | ||
return os.Chmod(path, perm.AsUnixFilePermission()) | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,35 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
//go:build windows | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
package utils | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"github.com/hectane/go-acl" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
"golang.org/x/sys/windows" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func SetDirPermission(path string, perm FSPermission) error { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
setWindowsFilePermissions(path, perm) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return nil | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Critical: Add error handling for ACL operations The function ignores all errors from func SetDirPermission(path string, perm FSPermission) error {
- setWindowsFilePermissions(path, perm)
- return nil
+ return setWindowsFilePermissions(path, perm)
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// SetExecPermission sets the permission of an executable file. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func SetExecPermission(path string, perm FSPermission) error { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return SetDirPermission(path, perm) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
func setWindowsFilePermissions(path string, perm FSPermission) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
switch perm { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case AdminOnlyPermission: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Set only admin rights, remove all others. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
acl.Apply(path, true, false, acl.GrantName(windows.GENERIC_ALL|windows.STANDARD_RIGHTS_ALL, "Administrators")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case PublicReadPermission: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Set admin rights and read/execute rights for users, remove all others. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
acl.Apply(path, true, false, acl.GrantName(windows.GENERIC_ALL|windows.STANDARD_RIGHTS_ALL, "Administrators")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
acl.Apply(path, false, false, acl.GrantName(windows.GENERIC_EXECUTE, "Users")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
acl.Apply(path, false, false, acl.GrantName(windows.GENERIC_READ, "Users")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
case PublicWritePermission: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Set full control to admin and regular users. Guest users will not have access. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
acl.Apply(path, true, false, acl.GrantName(windows.GENERIC_ALL|windows.STANDARD_RIGHTS_ALL, "Administrators")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
acl.Apply(path, false, false, acl.GrantName(windows.GENERIC_ALL|windows.STANDARD_RIGHTS_ALL, "Users")) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Codebase verification Based on the context gathered, I can now provide a final response: Security concern confirmed: PublicWritePermission requires restrictive implementation The
Recommendations:
🔗 Analysis chainSecurity concern: Review PublicWritePermission implementation Granting Let me gather more context about how this permission is used in the codebase. 🏁 Scripts executedThe following scripts were executed for the analysis: Script: #!/bin/bash
# Search for usage of PublicWritePermission to assess impact
rg "PublicWritePermission" --type go
Length of output: 546 Script: #!/bin/bash
# Check the implementation and usage context of PublicWritePermission
ast-grep --pattern 'const PublicWritePermission = $_'
# Check the content of files using this permission
rg -B 5 -A 5 "PublicWritePermission" --type go
# Check what directories are created with these permissions
fd exec logs -t d -x ls -la {}
Length of output: 4702 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Critical: Improve error handling in setWindowsFilePermissions
-func setWindowsFilePermissions(path string, perm FSPermission) {
+func setWindowsFilePermissions(path string, perm FSPermission) error {
+ // Validate path to prevent directory traversal
+ cleanPath, err := filepath.Abs(filepath.Clean(path))
+ if err != nil {
+ return fmt.Errorf("invalid path: %w", err)
+ }
+
switch perm {
case AdminOnlyPermission:
- acl.Apply(path, true, false, acl.GrantName(windows.GENERIC_ALL|windows.STANDARD_RIGHTS_ALL, "Administrators"))
+ if err := acl.Apply(cleanPath, true, false,
+ acl.GrantName(windows.GENERIC_ALL|windows.STANDARD_RIGHTS_ALL, "Administrators")); err != nil {
+ return fmt.Errorf("failed to set admin-only permissions: %w", err)
+ }
case PublicReadPermission:
- acl.Apply(path, true, false, acl.GrantName(windows.GENERIC_ALL|windows.STANDARD_RIGHTS_ALL, "Administrators"))
- acl.Apply(path, false, false, acl.GrantName(windows.GENERIC_EXECUTE, "Users"))
- acl.Apply(path, false, false, acl.GrantName(windows.GENERIC_READ, "Users"))
+ if err := acl.Apply(cleanPath, true, false,
+ acl.GrantName(windows.GENERIC_ALL|windows.STANDARD_RIGHTS_ALL, "Administrators")); err != nil {
+ return fmt.Errorf("failed to set admin permissions: %w", err)
+ }
+ if err := acl.Apply(cleanPath, false, false,
+ acl.GrantName(windows.GENERIC_EXECUTE|windows.GENERIC_READ, "Users")); err != nil {
+ return fmt.Errorf("failed to set user permissions: %w", err)
+ }
case PublicWritePermission:
- acl.Apply(path, true, false, acl.GrantName(windows.GENERIC_ALL|windows.STANDARD_RIGHTS_ALL, "Administrators"))
- acl.Apply(path, false, false, acl.GrantName(windows.GENERIC_ALL|windows.STANDARD_RIGHTS_ALL, "Users"))
+ if err := acl.Apply(cleanPath, true, false,
+ acl.GrantName(windows.GENERIC_ALL|windows.STANDARD_RIGHTS_ALL, "Administrators")); err != nil {
+ return fmt.Errorf("failed to set admin permissions: %w", err)
+ }
+ if err := acl.Apply(cleanPath, false, false,
+ acl.GrantName(windows.GENERIC_ALL|windows.STANDARD_RIGHTS_ALL, "Users")); err != nil {
+ return fmt.Errorf("failed to set user permissions: %w", err)
+ }
}
+ return nil
} 📝 Committable suggestion
Suggested change
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -2,25 +2,61 @@ package utils | |||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
import ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"fmt" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"os" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"io/fs" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"path/filepath" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"strings" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
"sync" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
type FSPermission uint8 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
const ( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
AdminOnlyPermission FSPermission = iota | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
PublicReadPermission | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
PublicWritePermission | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// AsUnixDirPermission return the corresponding unix permission for a directory or executable. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (perm FSPermission) AsUnixDirExecPermission() fs.FileMode { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
switch perm { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
case AdminOnlyPermission: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return 0o700 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
case PublicReadPermission: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return 0o755 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
case PublicWritePermission: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return 0o777 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
return 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add validation for zero FSPermission value Both permission conversion methods return 0 for invalid/zero FSPermission values without any error indication. This could lead to security issues if the permission value is not properly initialized. Consider adding validation: func (perm FSPermission) AsUnixDirExecPermission() fs.FileMode {
+ if perm > PublicWritePermission {
+ panic("invalid FSPermission value")
+ }
switch perm {
// ...
}
- return 0
}
func (perm FSPermission) AsUnixFilePermission() fs.FileMode {
+ if perm > PublicWritePermission {
+ panic("invalid FSPermission value")
+ }
switch perm {
// ...
}
- return 0
} Also applies to: 33-45 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// AsUnixDirPermission return the corresponding unix permission for a regular file. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (perm FSPermission) AsUnixFilePermission() fs.FileMode { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
switch perm { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
case AdminOnlyPermission: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return 0o600 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
case PublicReadPermission: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return 0o655 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
case PublicWritePermission: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return 0o666 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
return 0 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix incorrect file permission for PublicReadPermission The file permission for Apply this fix: case PublicReadPermission:
- return 0o655
+ return 0o644 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// DirStructure represents a directory structure with permissions that should be enforced. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
type DirStructure struct { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
sync.Mutex | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
Path string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Dir string | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Perm os.FileMode | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Perm FSPermission | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Parent *DirStructure | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Children map[string]*DirStructure | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// NewDirStructure returns a new DirStructure. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
func NewDirStructure(path string, perm os.FileMode) *DirStructure { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
func NewDirStructure(path string, perm FSPermission) *DirStructure { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
return &DirStructure{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Path: path, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Perm: perm, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -29,7 +65,7 @@ func NewDirStructure(path string, perm os.FileMode) *DirStructure { | |||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
// ChildDir adds a new child DirStructure and returns it. Should the child already exist, the existing child is returned and the permissions are updated. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (ds *DirStructure) ChildDir(dirName string, perm os.FileMode) (child *DirStructure) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
func (ds *DirStructure) ChildDir(dirName string, perm FSPermission) (child *DirStructure) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
ds.Lock() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
defer ds.Unlock() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Consider implementing Windows-specific permission handling.
The TODO comment correctly identifies that Windows requires the full path for setting permissions. Consider implementing this using the Windows-specific APIs from the
go-acl
package that's already imported.Here's a suggested implementation: