@@ -44,104 +44,103 @@ proc echoP(msg: string) =
4444 echo wrapWords (msg, 80 )
4545
4646proc checkAndCreateDataDir * (dataDir: string ): bool =
47- # # Checks `conf.dataDir`.
48- # # If folder exists, procedure will check it for access and
49- # # permissions `0750 (rwxr-x---)`, if folder do not exists it will be created
50- # # with permissions `0750 (rwxr-x---)`.
51- let amask = {AccessFlags .Read , AccessFlags .Write , AccessFlags .Execute }
5247 when defined (posix):
53- if fileAccessible (dataDir, amask):
54- let gmask = {UserRead , UserWrite , UserExec , GroupRead , GroupExec }
55- let pmask = {OtherRead , OtherWrite , OtherExec , GroupWrite }
56- let pres = getPermissionsSet (dataDir)
57- if pres.isErr ():
58- fatal " Could not check data folder permissions" ,
59- data_dir = dataDir, errorCode = $ pres.error,
60- errorMsg = ioErrorMsg (pres.error)
61- false
48+ let requiredPerms = 0o 700
49+ if isDir (dataDir):
50+ let currPermsRes = getPermissions (dataDir)
51+ if currPermsRes.isErr ():
52+ fatal " Could not check data directory permissions" ,
53+ data_dir = dataDir, errorCode = $ currPermsRes.error,
54+ errorMsg = ioErrorMsg (currPermsRes.error)
55+ return false
6256 else :
63- let insecurePermissions = pres.get () * pmask
64- if insecurePermissions != {}:
65- fatal " Data folder has insecure permissions" ,
66- data_dir = dataDir,
67- insecure_permissions = $ insecurePermissions,
68- current_permissions = pres.get ().toString (),
69- required_permissions = gmask.toString ()
70- false
71- else :
72- true
57+ let currPerms = currPermsRes.get ()
58+ if currPerms != requiredPerms:
59+ warn " Data directory has insecure permissions. Correcting them." ,
60+ data_dir = dataDir,
61+ current_permissions = currPerms.toOct (4 ),
62+ required_permissions = requiredPerms.toOct (4 )
63+ let newPermsRes = setPermissions (dataDir, requiredPerms)
64+ if newPermsRes.isErr ():
65+ fatal " Could not set data directory permissions" ,
66+ data_dir = dataDir,
67+ errorCode = $ newPermsRes.error,
68+ errorMsg = ioErrorMsg (newPermsRes.error),
69+ old_permissions = currPerms.toOct (4 ),
70+ new_permissions = requiredPerms.toOct (4 )
71+ return false
7372 else :
7473 let res = secureCreatePath (dataDir)
7574 if res.isErr ():
76- fatal " Could not create data folder " , data_dir = dataDir,
75+ fatal " Could not create data directory " , data_dir = dataDir,
7776 errorMsg = ioErrorMsg (res.error), errorCode = $ res.error
78- false
79- else :
80- true
77+ return false
8178 elif defined (windows):
79+ let amask = {AccessFlags .Read , AccessFlags .Write , AccessFlags .Execute }
8280 if fileAccessible (dataDir, amask):
8381 let cres = checkCurrentUserOnlyACL (dataDir)
8482 if cres.isErr ():
8583 fatal " Could not check data folder's ACL" ,
8684 data_dir = dataDir, errorCode = $ cres.error,
8785 errorMsg = ioErrorMsg (cres.error)
88- false
86+ return false
8987 else :
9088 if cres.get () == false :
9189 fatal " Data folder has insecure ACL" , data_dir = dataDir
92- false
93- else :
94- true
90+ return false
9591 else :
9692 let res = secureCreatePath (dataDir)
9793 if res.isErr ():
9894 fatal " Could not create data folder" , data_dir = dataDir,
9995 errorMsg = ioErrorMsg (res.error), errorCode = $ res.error
100- false
101- else :
102- true
96+ return false
10397 else :
10498 fatal " Unsupported operation system"
10599 return false
106100
101+ return true
102+
107103proc checkSensitiveFilePermissions * (filePath: string ): bool =
108104 # # Check if ``filePath`` has only "(600) rw-------" permissions.
109- # # Procedure returns ``false`` if permissions are different
105+ # # Procedure returns ``false`` if permissions are different and we can't
106+ # # correct them.
110107 when defined (windows):
111108 let cres = checkCurrentUserOnlyACL (filePath)
112109 if cres.isErr ():
113110 fatal " Could not check file's ACL" ,
114111 key_path = filePath, errorCode = $ cres.error,
115112 errorMsg = ioErrorMsg (cres.error)
116- false
113+ return false
117114 else :
118115 if cres.get () == false :
119116 fatal " File has insecure permissions" , key_path = filePath
120- false
121- else :
122- true
117+ return false
123118 else :
124- let allowedMask = {UserRead , UserWrite }
125- let mask = {UserExec ,
126- GroupRead , GroupWrite , GroupExec ,
127- OtherRead , OtherWrite , OtherExec }
128- let pres = getPermissionsSet (filePath)
129- if pres.isErr ():
119+ let requiredPerms = 0o 600
120+ let currPermsRes = getPermissions (filePath)
121+ if currPermsRes.isErr ():
130122 error " Could not check file permissions" ,
131- key_path = filePath, errorCode = $ pres .error,
132- errorMsg = ioErrorMsg (pres .error)
133- false
123+ key_path = filePath, errorCode = $ currPermsRes .error,
124+ errorMsg = ioErrorMsg (currPermsRes .error)
125+ return false
134126 else :
135- let insecurePermissions = pres .get () * mask
136- if insecurePermissions != {} :
137- error " File has insecure permissions" ,
127+ let currPerms = currPermsRes .get ()
128+ if currPerms != requiredPerms :
129+ warn " File has insecure permissions. Correcting them. " ,
138130 key_path = filePath,
139- insecure_permissions = $ insecurePermissions,
140- current_permissions = pres.get ().toString (),
141- required_permissions = allowedMask.toString ()
142- false
143- else :
144- true
131+ current_permissions = currPerms.toOct (4 ),
132+ required_permissions = requiredPerms.toOct (4 )
133+ let newPermsRes = setPermissions (filePath, requiredPerms)
134+ if newPermsRes.isErr ():
135+ fatal " Could not set data directory permissions" ,
136+ key_path = filePath,
137+ errorCode = $ newPermsRes.error,
138+ errorMsg = ioErrorMsg (newPermsRes.error),
139+ old_permissions = currPerms.toOct (4 ),
140+ new_permissions = requiredPerms.toOct (4 )
141+ return false
142+
143+ return true
145144
146145proc keyboardCreatePassword (prompt: string ,
147146 confirm: string ,
0 commit comments