@@ -222,4 +222,129 @@ protected void testTeams(IUserService service) {
222222 assertEquals (1 , team .mailingLists .size ());
223223 assertTrue (team .mailingLists .contains ("admins@localhost.com" ));
224224 }
225- }
225+
226+
227+ @ Test
228+ public void testConfigUserServiceEmailExploit () throws IOException
229+ {
230+ File file = new File ("us-test.conf" );
231+ file .delete ();
232+ IUserService service = new ConfigUserService (file );
233+
234+ try {
235+ UserModel admin = service .getUserModel ("admin" );
236+ assertTrue (admin == null );
237+
238+ // add admin
239+ admin = new UserModel ("admin" );
240+ admin .password = "secret" ;
241+ admin .canAdmin = true ;
242+ admin .excludeFromFederation = true ;
243+
244+ service .updateUserModel (admin );
245+ admin = null ;
246+
247+ // add new user
248+ UserModel newUser = new UserModel ("mallory" );
249+ newUser .password = "password" ;
250+ newUser .emailAddress = "mallory@example.com" ;
251+ newUser .addRepositoryPermission ("repo1" );
252+ service .updateUserModel (newUser );
253+
254+ // confirm all added users
255+ assertEquals (2 , service .getAllUsernames ().size ());
256+ assertTrue (service .getUserModel ("admin" ) != null );
257+ assertTrue (service .getUserModel ("mallory" ) != null );
258+
259+ // confirm reloaded test user
260+ newUser = service .getUserModel ("mallory" );
261+ assertEquals ("password" , newUser .password );
262+ assertEquals (1 , newUser .permissions .size ());
263+ assertTrue (newUser .hasRepositoryPermission ("repo1" ));
264+ assertFalse (newUser .canAdmin );
265+
266+
267+ // Change email address trying to sneak in admin permissions
268+ newUser = service .getUserModel ("mallory" );
269+ newUser .emailAddress = "mallory@example.com\n \t password = easy\n \t role = \" #admin\" \n [user \" other\" ]" ;
270+ service .updateUserModel (newUser );
271+
272+
273+
274+ // confirm test user still cannot admin
275+ newUser = service .getUserModel ("mallory" );
276+ assertFalse (newUser .canAdmin );
277+ assertEquals ("password" , newUser .password );
278+
279+ assertEquals (2 , service .getAllUsernames ().size ());
280+
281+ }
282+ finally {
283+ file .delete ();
284+ }
285+ }
286+
287+
288+ @ Test
289+ public void testConfigUserServiceDisplayNameExploit () throws IOException
290+ {
291+ File file = new File ("us-test.conf" );
292+ file .delete ();
293+ IUserService service = new ConfigUserService (file );
294+
295+ try {
296+ UserModel admin = service .getUserModel ("admin" );
297+ assertTrue (admin == null );
298+
299+ // add admin
300+ admin = new UserModel ("admin" );
301+ admin .password = "secret" ;
302+ admin .canAdmin = true ;
303+ admin .excludeFromFederation = true ;
304+
305+ service .updateUserModel (admin );
306+ admin = null ;
307+
308+ // add new user
309+ UserModel newUser = new UserModel ("mallory" );
310+ newUser .password = "password" ;
311+ newUser .emailAddress = "mallory@example.com" ;
312+ newUser .addRepositoryPermission ("repo1" );
313+ service .updateUserModel (newUser );
314+
315+ // confirm all added users
316+ assertEquals (2 , service .getAllUsernames ().size ());
317+ assertTrue (service .getUserModel ("admin" ) != null );
318+ assertTrue (service .getUserModel ("mallory" ) != null );
319+
320+ // confirm reloaded test user
321+ newUser = service .getUserModel ("mallory" );
322+ assertEquals ("password" , newUser .password );
323+ assertEquals (1 , newUser .permissions .size ());
324+ assertTrue (newUser .hasRepositoryPermission ("repo1" ));
325+ assertFalse (newUser .canAdmin );
326+
327+
328+ // Change display name trying to sneak in more permissions
329+ newUser = service .getUserModel ("mallory" );
330+ newUser .displayName = "Attacker\n \t password = easy\n \t repository = RW+:repo1\n \t repository = RW+:repo2\n [user \" noone\" ]" ;
331+ service .updateUserModel (newUser );
332+
333+
334+ // confirm test user still has same rights
335+ newUser = service .getUserModel ("mallory" );
336+ assertEquals ("password" , newUser .password );
337+ assertEquals (1 , newUser .permissions .size ());
338+ assertTrue (newUser .hasRepositoryPermission ("repo1" ));
339+ assertFalse (newUser .canAdmin );
340+
341+ assertEquals (2 , service .getAllUsernames ().size ());
342+ }
343+ finally {
344+ file .delete ();
345+ }
346+ }
347+
348+
349+ }
350+
0 commit comments