Skip to content

Commit 47b8f2f

Browse files
add unit test for non-admin attempting to escalate others permissions
1 parent 62eea4e commit 47b8f2f

1 file changed

Lines changed: 92 additions & 0 deletions

File tree

test/wh_test_auth.c

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,6 +1253,98 @@ int whTest_AuthSetPermissions(whClientContext* client)
12531253
WH_TEST_ASSERT_RETURN(server_rc == WH_ERROR_NOTFOUND ||
12541254
server_rc != WH_ERROR_OK);
12551255

1256+
/* Test 3b: Non-admin user trying to change another user's permissions */
1257+
WH_TEST_PRINT(" Test: Non-admin user setting another user's perms\n");
1258+
{
1259+
whUserId nonadmin_id = WH_USER_ID_INVALID;
1260+
whUserId target_id = WH_USER_ID_INVALID;
1261+
whAuthPermissions nonadmin_perms;
1262+
whAuthPermissions target_perms;
1263+
1264+
/* non-admin user allowed the set permissions action */
1265+
memset(&nonadmin_perms, 0, sizeof(nonadmin_perms));
1266+
WH_AUTH_SET_ALLOWED_GROUP(nonadmin_perms, WH_MESSAGE_GROUP_AUTH);
1267+
WH_AUTH_SET_ALLOWED_ACTION(nonadmin_perms, WH_MESSAGE_GROUP_AUTH,
1268+
WH_MESSAGE_AUTH_ACTION_USER_SET_PERMISSIONS);
1269+
WH_AUTH_SET_IS_ADMIN(nonadmin_perms, 0);
1270+
1271+
server_rc = 0;
1272+
WH_TEST_RETURN_ON_FAIL(_whTest_Auth_UserAddOp(
1273+
client, "sp_nonadmin", nonadmin_perms, WH_AUTH_METHOD_PIN, "pass",
1274+
4, &server_rc, &nonadmin_id));
1275+
WH_TEST_ASSERT_RETURN(server_rc == WH_ERROR_OK);
1276+
WH_TEST_ASSERT_RETURN(nonadmin_id != WH_USER_ID_INVALID);
1277+
1278+
/* Target user with no permissions */
1279+
memset(&target_perms, 0, sizeof(target_perms));
1280+
server_rc = 0;
1281+
WH_TEST_RETURN_ON_FAIL(_whTest_Auth_UserAddOp(
1282+
client, "sp_target", target_perms, WH_AUTH_METHOD_PIN, "pass", 4,
1283+
&server_rc, &target_id));
1284+
WH_TEST_ASSERT_RETURN(server_rc == WH_ERROR_OK);
1285+
WH_TEST_ASSERT_RETURN(target_id != WH_USER_ID_INVALID);
1286+
1287+
/* Logout admin and login as the non-admin user */
1288+
server_rc = 0;
1289+
_whTest_Auth_LogoutOp(client, admin_id, &server_rc);
1290+
1291+
server_rc = 0;
1292+
WH_TEST_RETURN_ON_FAIL(_whTest_Auth_LoginOp(client, WH_AUTH_METHOD_PIN,
1293+
"sp_nonadmin", "pass", 4,
1294+
&server_rc, &nonadmin_id));
1295+
WH_TEST_ASSERT_RETURN(server_rc == WH_ERROR_OK);
1296+
1297+
/* Attempt to grant the target user admin - should be denied */
1298+
memset(&new_perms, 0, sizeof(new_perms));
1299+
WH_AUTH_SET_IS_ADMIN(new_perms, 1);
1300+
server_rc = 0;
1301+
WH_TEST_RETURN_ON_FAIL(
1302+
_whTest_Auth_UserSetPermsOp(client, target_id, new_perms,
1303+
&server_rc));
1304+
WH_TEST_ASSERT_RETURN(server_rc == WH_ERROR_ACCESS);
1305+
1306+
/* Attempt to grant self admin - should also be denied */
1307+
server_rc = 0;
1308+
WH_TEST_RETURN_ON_FAIL(
1309+
_whTest_Auth_UserSetPermsOp(client, nonadmin_id, new_perms,
1310+
&server_rc));
1311+
WH_TEST_ASSERT_RETURN(server_rc == WH_ERROR_ACCESS);
1312+
WH_TEST_PRINT(" Non-admin set permissions attempt correctly denied\n");
1313+
1314+
/* Logout non-admin and login as admin to verify and cleanup */
1315+
server_rc = 0;
1316+
_whTest_Auth_LogoutOp(client, nonadmin_id, &server_rc);
1317+
1318+
server_rc = 0;
1319+
WH_TEST_RETURN_ON_FAIL(_whTest_Auth_LoginOp(client, WH_AUTH_METHOD_PIN,
1320+
"admin", "1234", 4,
1321+
&server_rc, &admin_id));
1322+
WH_TEST_ASSERT_RETURN(server_rc == WH_ERROR_OK);
1323+
1324+
/* Target permissions must be unchanged */
1325+
memset(&fetched_perms, 0, sizeof(fetched_perms));
1326+
fetched_user_id = WH_USER_ID_INVALID;
1327+
get_rc = 0;
1328+
WH_TEST_RETURN_ON_FAIL(_whTest_Auth_UserGetOp(
1329+
client, "sp_target", &get_rc, &fetched_user_id, &fetched_perms));
1330+
WH_TEST_ASSERT_RETURN(get_rc == WH_ERROR_OK);
1331+
WH_TEST_ASSERT_RETURN(fetched_user_id == target_id);
1332+
WH_TEST_ASSERT_RETURN(!WH_AUTH_IS_ADMIN(fetched_perms));
1333+
1334+
/* Non-admin's own permissions must be unchanged as well */
1335+
memset(&fetched_perms, 0, sizeof(fetched_perms));
1336+
fetched_user_id = WH_USER_ID_INVALID;
1337+
get_rc = 0;
1338+
WH_TEST_RETURN_ON_FAIL(_whTest_Auth_UserGetOp(
1339+
client, "sp_nonadmin", &get_rc, &fetched_user_id, &fetched_perms));
1340+
WH_TEST_ASSERT_RETURN(get_rc == WH_ERROR_OK);
1341+
WH_TEST_ASSERT_RETURN(!WH_AUTH_IS_ADMIN(fetched_perms));
1342+
1343+
server_rc = 0;
1344+
_whTest_Auth_UserDeleteOp(client, nonadmin_id, &server_rc);
1345+
_whTest_Auth_UserDeleteOp(client, target_id, &server_rc);
1346+
}
1347+
12561348
/* Test 4: Set user permissions when not logged in */
12571349
WH_TEST_PRINT(" Test: Set user permissions when not logged in\n");
12581350
/* Logout */

0 commit comments

Comments
 (0)