11
11
12
12
namespace compliance
13
13
{
14
+ namespace
15
+ {
16
+ const mode_t supportedMask = 0x1FF ;
17
+ } // anonymous namespace
14
18
15
19
AUDIT_FN (ensureFilePermissions)
16
20
{
@@ -19,6 +23,11 @@ AUDIT_FN(ensureFilePermissions)
19
23
{
20
24
return Error (" No filename provided" );
21
25
}
26
+ if (args.find (" permissions" ) != args.end () && args.find (" mask" ) != args.end ())
27
+ {
28
+ return Error (" Cannot specify both permissions and mask" );
29
+ }
30
+
22
31
logstream << " ensureFilePermissions for '" << args[" filename" ] << " ' " ;
23
32
24
33
if (0 != stat (args[" filename" ].c_str (), &statbuf))
@@ -37,7 +46,7 @@ AUDIT_FN(ensureFilePermissions)
37
46
}
38
47
if (args[" user" ] != pwd->pw_name )
39
48
{
40
- logstream << " Invalid user - is " << pwd->pw_name << " should be " << args[" user" ];
49
+ logstream << " Invalid user - is ' " << pwd->pw_name << " ' should be ' " << args[" user" ] << " ' " ;
41
50
return false ;
42
51
}
43
52
}
@@ -63,42 +72,42 @@ AUDIT_FN(ensureFilePermissions)
63
72
}
64
73
if (!groupOk)
65
74
{
66
- logstream << " Invalid group - is '" << grp->gr_name << " ' should be '" << args[" group" ] << " ' " ;
75
+ logstream << " Invalid group - is '" << grp->gr_name << " ' should be '" << args[" group" ] << " '" ;
67
76
return false ;
68
77
}
69
78
}
70
79
71
- unsigned short perms = 0xFFF ;
72
- unsigned short mask = 0xFFF ;
73
- bool has_perms_or_mask = false ;
80
+ const mode_t supportedMask = 0x1FF ;
74
81
if (args.find (" permissions" ) != args.end ())
75
82
{
76
83
char * endptr;
77
- perms = strtol (args[" permissions" ].c_str (), &endptr, 8 );
78
- if (' \0 ' != *endptr)
84
+ mode_t perms = strtol (args[" permissions" ].c_str (), &endptr, 8 );
85
+ if ((' \0 ' != *endptr) || ((perms & supportedMask) != perms))
86
+ {
87
+ return Error (" Invalid permissions parameter" );
88
+ }
89
+ if (perms != (statbuf.st_mode & supportedMask))
79
90
{
80
- logstream << " Invalid permissions: " << args[ " permissions " ] ;
91
+ logstream << " Invalid permissions - are " << std::oct << (statbuf. st_mode & supportedMask) << " should be " << std::oct << perms << std::dec ;
81
92
return false ;
82
93
}
83
- has_perms_or_mask = true ;
84
94
}
85
95
if (args.find (" mask" ) != args.end ())
86
96
{
87
97
char * endptr;
88
- mask = strtol (args[" mask" ].c_str (), &endptr, 8 );
89
- if (' \0 ' != *endptr)
98
+ mode_t mask = strtol (args[" mask" ].c_str (), &endptr, 8 );
99
+ if (( ' \0 ' != *endptr) || ((mask & supportedMask) != mask) )
90
100
{
91
- logstream << " Invalid permissions mask: " << args[" mask" ];
101
+ return Error (" Invalid mask parameter" );
102
+ }
103
+ if (((statbuf.st_mode & supportedMask) & mask) != 0 )
104
+ {
105
+ logstream << " Invalid permissions - are " << std::oct << (statbuf.st_mode & supportedMask) << " should be " << std::oct
106
+ << ((statbuf.st_mode & supportedMask) & (~mask)) << " with mask " << std::oct << mask << std::dec;
92
107
return false ;
93
108
}
94
- has_perms_or_mask = true ;
95
- }
96
- if (has_perms_or_mask && ((perms & mask) != (statbuf.st_mode & mask)))
97
- {
98
- logstream << " Invalid permissions - are " << std::oct << statbuf.st_mode << " should be " << std::oct << perms << " with mask " << std::oct
99
- << mask << std::dec;
100
- return false ;
101
109
}
110
+
102
111
return true ;
103
112
}
104
113
@@ -109,6 +118,10 @@ REMEDIATE_FN(ensureFilePermissions)
109
118
logstream << " ERROR: No filename provided" ;
110
119
return Error (" No filename provided" );
111
120
}
121
+ if (args.find (" permissions" ) != args.end () && args.find (" mask" ) != args.end ())
122
+ {
123
+ return Error (" Cannot specify both permissions and mask" );
124
+ }
112
125
113
126
struct stat statbuf;
114
127
if (stat (args[" filename" ].c_str (), &statbuf) < 0 )
@@ -126,7 +139,7 @@ REMEDIATE_FN(ensureFilePermissions)
126
139
if (pwd == nullptr )
127
140
{
128
141
logstream << " ERROR: No user with name " << args[" user" ];
129
- return Error ( " No user with name " + args[ " user " ]) ;
142
+ return false ;
130
143
}
131
144
uid = pwd->pw_uid ;
132
145
owner_changed = true ;
@@ -161,7 +174,7 @@ REMEDIATE_FN(ensureFilePermissions)
161
174
if (grp == nullptr )
162
175
{
163
176
logstream << " ERROR: No group with name " << args[" group" ];
164
- return Error ( " No group with name " + args[ " group " ]) ;
177
+ return false ;
165
178
}
166
179
gid = grp->gr_gid ;
167
180
owner_changed = true ;
@@ -172,42 +185,44 @@ REMEDIATE_FN(ensureFilePermissions)
172
185
if (0 != chown (args[" filename" ].c_str (), uid, gid))
173
186
{
174
187
logstream << " ERROR: Chown error " << strerror (errno);
175
- return Error (" Chown error" );
188
+ return Error (" Chown error" , errno );
176
189
}
177
190
}
178
191
179
- unsigned short perms = 0xFFF ;
180
- unsigned short mask = 0xFFF ;
181
- bool has_perms_or_mask = false ;
182
192
if (args.find (" permissions" ) != args.end ())
183
193
{
184
194
char * endptr;
185
- perms = strtol (args[" permissions" ].c_str (), &endptr, 8 );
186
- if (' \0 ' != *endptr)
195
+ const mode_t perms = strtol (args[" permissions" ].c_str (), &endptr, 8 );
196
+ if (( ' \0 ' != *endptr) || ((perms & supportedMask) != perms) )
187
197
{
188
198
logstream << " ERROR: Invalid permissions: " << args[" permissions" ];
189
199
return Error (" Invalid permissions: " + args[" permissions" ]);
190
200
}
191
- has_perms_or_mask = true ;
201
+ if (perms != (statbuf.st_mode & supportedMask))
202
+ {
203
+ if (chmod (args[" filename" ].c_str (), perms) < 0 )
204
+ {
205
+ logstream << " ERROR: Chmod error " << strerror (errno);
206
+ return false ;
207
+ }
208
+ }
192
209
}
193
210
if (args.find (" mask" ) != args.end ())
194
211
{
195
212
char * endptr;
196
- mask = strtol (args[" mask" ].c_str (), &endptr, 8 );
197
- if (' \0 ' != *endptr)
213
+ const mode_t mask = strtol (args[" mask" ].c_str (), &endptr, 8 );
214
+ if (( ' \0 ' != *endptr) || ((mask & supportedMask) != mask) )
198
215
{
199
216
logstream << " ERROR: Invalid permissions mask: " << args[" mask" ];
200
217
return Error (" Invalid permissions mask: " + args[" mask" ]);
201
218
}
202
- has_perms_or_mask = true ;
203
- }
204
- unsigned short new_perms = (statbuf.st_mode & ~mask) | (perms & mask);
205
- if (has_perms_or_mask && (new_perms != statbuf.st_mode ))
206
- {
207
- if (chmod (args[" filename" ].c_str (), new_perms) < 0 )
219
+ if (((statbuf.st_mode & supportedMask) & mask) != 0 )
208
220
{
209
- logstream << " ERROR: Chmod error" ;
210
- return Error (" Chmod error" );
221
+ if (chmod (args[" filename" ].c_str (), statbuf.st_mode & (~mask)) < 0 )
222
+ {
223
+ logstream << " ERROR: Chmod error " << strerror (errno);
224
+ return false ;
225
+ }
211
226
}
212
227
}
213
228
0 commit comments