Skip to content

Commit c90e0be

Browse files
authored
Merge pull request #21 from DevopsArtFactory/codex/windows-permission-fix-main
fix: handle private key permission checks correctly on windows
2 parents d3706e9 + 45d0b76 commit c90e0be

File tree

4 files changed

+16
-2
lines changed

4 files changed

+16
-2
lines changed

USAGE_EN.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,8 @@ Options:
318318
- `verify-required=true` by default in `decrypt`
319319
- unknown sender IDs are rejected during decrypt
320320
- Plaintext stdout blocked by default (`--out -` required)
321-
- Private key file permission `0600` enforced
321+
- Private key file permission `0600` enforced on Unix-like systems
322+
- Windows skips POSIX mode checks because NTFS ACLs do not map to `0600`
322323

323324
- Operational safety
324325
- Secrets are handled via file/stdin paths, not CLI secret arguments

USAGE_KO.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,8 @@ recipient + trusted sender를 한 번에 등록
318318
- `decrypt`에서 `verify-required=true` 기본
319319
- unknown sender ID는 복호화 단계에서 거부
320320
- 평문 stdout 기본 차단 (`--out -` 명시 필요)
321-
- 개인키 파일 권한 `0600` 강제
321+
- Unix 계열에서는 개인키 파일 권한 `0600` 강제
322+
- Windows는 NTFS ACL이 `0600`과 직접 매핑되지 않아 POSIX 모드 검사를 생략
322323

323324
- 운영/감사 관점
324325
- 비밀값을 CLI 인자로 받지 않고 파일/stdin 중심 처리

internal/policy/policy.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,18 @@ package policy
33
import (
44
"fmt"
55
"os"
6+
"runtime"
67
)
78

89
func EnsurePrivateFile(path string) error {
910
info, err := os.Stat(path)
1011
if err != nil {
1112
return fmt.Errorf("stat private file %s: %w", path, err)
1213
}
14+
if runtime.GOOS == "windows" {
15+
// Windows ACLs do not map cleanly to POSIX mode bits.
16+
return nil
17+
}
1318
mode := info.Mode().Perm()
1419
if mode != 0o600 {
1520
return fmt.Errorf("private key file %s must have 0600 permission, got %o", path, mode)

internal/policy/policy_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package policy
33
import (
44
"os"
55
"path/filepath"
6+
"runtime"
67
"testing"
78
)
89

@@ -18,6 +19,12 @@ func TestEnsurePrivateFile(t *testing.T) {
1819
if err := os.Chmod(p, 0o644); err != nil {
1920
t.Fatal(err)
2021
}
22+
if runtime.GOOS == "windows" {
23+
if err := EnsurePrivateFile(p); err != nil {
24+
t.Fatalf("expected Windows permission check bypass: %v", err)
25+
}
26+
return
27+
}
2128
if err := EnsurePrivateFile(p); err == nil {
2229
t.Fatal("expected failure for 0644")
2330
}

0 commit comments

Comments
 (0)