...
1
2
3
4 package pq
5
6 import (
7 "errors"
8 "os"
9 "syscall"
10 )
11
12 const (
13 rootUserID = uint32(0)
14
15
16
17 maxUserOwnedKeyPermissions os.FileMode = 0600
18
19
20
21 maxRootOwnedKeyPermissions os.FileMode = 0640
22 )
23
24 var (
25 errSSLKeyHasUnacceptableUserPermissions = errors.New("permissions for files not owned by root should be u=rw (0600) or less")
26 errSSLKeyHasUnacceptableRootPermissions = errors.New("permissions for root owned files should be u=rw,g=r (0640) or less")
27 )
28
29
30
31
32
33 func sslKeyPermissions(sslkey string) error {
34 info, err := os.Stat(sslkey)
35 if err != nil {
36 return err
37 }
38
39 err = hasCorrectPermissions(info)
40
41
42
43 if err == errSSLKeyHasUnacceptableUserPermissions || err == errSSLKeyHasUnacceptableRootPermissions {
44 err = ErrSSLKeyHasWorldPermissions
45 }
46 return err
47 }
48
49
50
51
52
53
54
55
56
57
58
59 func hasCorrectPermissions(info os.FileInfo) error {
60
61 userPermissionMask := (os.FileMode(0777) ^ maxUserOwnedKeyPermissions)
62
63
64
65 if info.Mode().Perm()&userPermissionMask == 0 {
66 return nil
67 }
68
69
70
71
72 sysInfo := info.Sys()
73 if sysInfo == nil {
74 return ErrSSLKeyUnknownOwnership
75 }
76
77 unixStat, ok := sysInfo.(*syscall.Stat_t)
78 if !ok {
79 return ErrSSLKeyUnknownOwnership
80 }
81
82
83
84 if unixStat.Uid == rootUserID {
85 rootPermissionMask := (os.FileMode(0777) ^ maxRootOwnedKeyPermissions)
86 if info.Mode().Perm()&rootPermissionMask != 0 {
87 return errSSLKeyHasUnacceptableRootPermissions
88 }
89 return nil
90 }
91
92 return errSSLKeyHasUnacceptableUserPermissions
93 }
94
View as plain text