From bf24f5eef811b2d132f77e75c6d255f7381a608e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Janiszewski?= Date: Sat, 21 May 2016 16:13:35 +0200 Subject: [PATCH] Use human-readable names for storing permissions --- src/network/network.cpp | 38 +++++++++++++++++++++++++--------- src/network/network.h | 46 +++++++++++++++++++++-------------------- 2 files changed, 52 insertions(+), 32 deletions(-) diff --git a/src/network/network.cpp b/src/network/network.cpp index 9593f3b158..f6d07b36f6 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -233,6 +233,20 @@ int NetworkActions::FindCommand(int command) return -1; } +int NetworkActions::FindCommandByPermissionName(const std::string &permission_name) +{ + auto it = std::find_if(actions.begin(), actions.end(), [&permission_name](NetworkAction const& action) { + if (action.permission_name == permission_name) { + return true; + } + return false; + }); + if (it != actions.end()) { + return it - actions.begin(); + } + return -1; +} + NetworkGroup::NetworkGroup() { actions_allowed = {0}; @@ -267,8 +281,11 @@ json_t * NetworkGroup::ToJson() const json_object_set_new(jsonGroup, "id", json_integer(id)); json_object_set_new(jsonGroup, "name", json_string(GetName().c_str())); json_t * actionsArray = json_array(); - for (size_t i = 0; i < actions_allowed.size(); i++) { - json_array_append_new(actionsArray, json_integer(actions_allowed[i])); + for (size_t i = 0; i < gNetworkActions.actions.size(); i++) { + if (CanPerformAction(i)) { + const char * perm_name = gNetworkActions.actions[i].permission_name.c_str(); + json_array_append_new(actionsArray, json_string(perm_name)); + } } json_object_set_new(jsonGroup, "permissions", actionsArray); return jsonGroup; @@ -286,13 +303,14 @@ NetworkGroup NetworkGroup::FromJson(const json_t * json) group.id = (uint8)json_integer_value(jsonId); group.name = std::string(json_string_value(jsonName)); for (size_t i = 0; i < group.actions_allowed.size(); i++) { + group.actions_allowed[i] = 0; + } + for (size_t i = 0; i < json_array_size(jsonPermissions); i++) { json_t * jsonPermissionValue = json_array_get(jsonPermissions, i); - // This guards a case where there are less permissions in file than we want, - // which could happen when we add permissions or user has malformed the file. - if (jsonPermissionValue == nullptr) { - group.actions_allowed[i] = 0; - } else { - group.actions_allowed[i] = (uint8)json_integer_value(jsonPermissionValue); + const char * perm_name = json_string_value(jsonPermissionValue); + int action_id = gNetworkActions.FindCommandByPermissionName(perm_name); + if (action_id != -1) { + group.ToggleActionPermission(action_id); } } return group; @@ -308,7 +326,7 @@ void NetworkGroup::ToggleActionPermission(size_t index) actions_allowed[byte] ^= (1 << bit); } -bool NetworkGroup::CanPerformAction(size_t index) +bool NetworkGroup::CanPerformAction(size_t index) const { size_t byte = index / 8; size_t bit = index % 8; @@ -318,7 +336,7 @@ bool NetworkGroup::CanPerformAction(size_t index) return (actions_allowed[byte] & (1 << bit)) ? true : false; } -bool NetworkGroup::CanPerformCommand(int command) +bool NetworkGroup::CanPerformCommand(int command) const { int action = gNetworkActions.FindCommand(command); if (action != -1) { diff --git a/src/network/network.h b/src/network/network.h index 2a774abc20..d70a281b51 100644 --- a/src/network/network.h +++ b/src/network/network.h @@ -173,6 +173,7 @@ class NetworkAction { public: rct_string_id name; + std::string permission_name; std::vector commands; }; @@ -180,27 +181,28 @@ class NetworkActions { public: int FindCommand(int command); + int FindCommandByPermissionName(const std::string &permission_name); const std::vector actions = { - {STR_ACTION_CHAT, {-1}}, - {STR_ACTION_TERRAFORM, {GAME_COMMAND_SET_LAND_HEIGHT, GAME_COMMAND_RAISE_LAND, GAME_COMMAND_LOWER_LAND, GAME_COMMAND_EDIT_LAND_SMOOTH, GAME_COMMAND_CHANGE_SURFACE_STYLE}}, - {STR_ACTION_SET_WATER_LEVEL, {GAME_COMMAND_SET_WATER_HEIGHT, GAME_COMMAND_RAISE_WATER, GAME_COMMAND_LOWER_WATER}}, - {STR_ACTION_TOGGLE_PAUSE, {GAME_COMMAND_TOGGLE_PAUSE}}, - {STR_ACTION_CREATE_RIDE, {GAME_COMMAND_CREATE_RIDE}}, - {STR_ACTION_REMOVE_RIDE, {GAME_COMMAND_DEMOLISH_RIDE}}, - {STR_ACTION_BUILD_RIDE, {GAME_COMMAND_PLACE_TRACK, GAME_COMMAND_REMOVE_TRACK, GAME_COMMAND_SET_MAZE_TRACK, GAME_COMMAND_PLACE_TRACK_DESIGN, GAME_COMMAND_PLACE_MAZE_DESIGN, GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT}}, - {STR_ACTION_RIDE_PROPERTIES, {GAME_COMMAND_SET_RIDE_NAME, GAME_COMMAND_SET_RIDE_APPEARANCE, GAME_COMMAND_SET_RIDE_STATUS, GAME_COMMAND_SET_RIDE_VEHICLES, GAME_COMMAND_SET_RIDE_SETTING, GAME_COMMAND_SET_RIDE_PRICE, GAME_COMMAND_SET_BRAKES_SPEED}}, - {STR_ACTION_SCENERY, {GAME_COMMAND_REMOVE_SCENERY, GAME_COMMAND_PLACE_SCENERY, GAME_COMMAND_SET_BRAKES_SPEED, GAME_COMMAND_REMOVE_FENCE, GAME_COMMAND_PLACE_FENCE, GAME_COMMAND_REMOVE_LARGE_SCENERY, GAME_COMMAND_PLACE_LARGE_SCENERY, GAME_COMMAND_PLACE_BANNER, GAME_COMMAND_REMOVE_BANNER, GAME_COMMAND_SET_SCENERY_COLOUR, GAME_COMMAND_SET_FENCE_COLOUR, GAME_COMMAND_SET_LARGE_SCENERY_COLOUR, GAME_COMMAND_SET_BANNER_COLOUR, GAME_COMMAND_SET_BANNER_NAME, GAME_COMMAND_SET_SIGN_NAME, GAME_COMMAND_SET_BANNER_STYLE, GAME_COMMAND_SET_SIGN_STYLE}}, - {STR_ACTION_PATH, {GAME_COMMAND_PLACE_PATH, GAME_COMMAND_PLACE_PATH_FROM_TRACK, GAME_COMMAND_REMOVE_PATH}}, - {STR_ACTION_CLEAR_LANDSCAPE, {GAME_COMMAND_CLEAR_SCENERY}}, - {STR_ACTION_GUEST, {GAME_COMMAND_SET_GUEST_NAME}}, - {STR_ACTION_STAFF, {GAME_COMMAND_HIRE_NEW_STAFF_MEMBER, GAME_COMMAND_SET_STAFF_PATROL, GAME_COMMAND_FIRE_STAFF_MEMBER, GAME_COMMAND_SET_STAFF_ORDER, GAME_COMMAND_SET_STAFF_COLOUR, GAME_COMMAND_SET_STAFF_NAME}}, - {STR_ACTION_PARK_PROPERTIES, {GAME_COMMAND_SET_PARK_NAME, GAME_COMMAND_SET_PARK_OPEN, GAME_COMMAND_SET_PARK_ENTRANCE_FEE, GAME_COMMAND_SET_LAND_OWNERSHIP, GAME_COMMAND_BUY_LAND_RIGHTS, GAME_COMMAND_PLACE_PARK_ENTRANCE, GAME_COMMAND_REMOVE_PARK_ENTRANCE}}, - {STR_ACTION_PARK_FUNDING, {GAME_COMMAND_SET_CURRENT_LOAN, GAME_COMMAND_SET_RESEARCH_FUNDING, GAME_COMMAND_START_MARKETING_CAMPAIGN}}, - {STR_ACTION_KICK_PLAYER, {GAME_COMMAND_KICK_PLAYER}}, - {STR_ACTION_MODIFY_GROUPS, {GAME_COMMAND_MODIFY_GROUPS}}, - {STR_ACTION_SET_PLAYER_GROUP, {GAME_COMMAND_SET_PLAYER_GROUP}}, - {STR_ACTION_CHEAT, {GAME_COMMAND_CHEAT}}, - {STR_ACTION_TOGGLE_SCENERY_CLUSTER, {-2}} + {STR_ACTION_CHAT, "PERMISSION_CHAT", {-1}}, + {STR_ACTION_TERRAFORM, "PERMISSION_TERRAFORM", {GAME_COMMAND_SET_LAND_HEIGHT, GAME_COMMAND_RAISE_LAND, GAME_COMMAND_LOWER_LAND, GAME_COMMAND_EDIT_LAND_SMOOTH, GAME_COMMAND_CHANGE_SURFACE_STYLE}}, + {STR_ACTION_SET_WATER_LEVEL, "PERMISSION_SET_WATER_LEVEL", {GAME_COMMAND_SET_WATER_HEIGHT, GAME_COMMAND_RAISE_WATER, GAME_COMMAND_LOWER_WATER}}, + {STR_ACTION_TOGGLE_PAUSE, "PERMISSION_TOGGLE_PAUSE", {GAME_COMMAND_TOGGLE_PAUSE}}, + {STR_ACTION_CREATE_RIDE, "PERMISSION_CREATE_RIDE", {GAME_COMMAND_CREATE_RIDE}}, + {STR_ACTION_REMOVE_RIDE, "PERMISSION_REMOVE_RIDE", {GAME_COMMAND_DEMOLISH_RIDE}}, + {STR_ACTION_BUILD_RIDE, "PERMISSION_BUILD_RIDE", {GAME_COMMAND_PLACE_TRACK, GAME_COMMAND_REMOVE_TRACK, GAME_COMMAND_SET_MAZE_TRACK, GAME_COMMAND_PLACE_TRACK_DESIGN, GAME_COMMAND_PLACE_MAZE_DESIGN, GAME_COMMAND_PLACE_RIDE_ENTRANCE_OR_EXIT, GAME_COMMAND_REMOVE_RIDE_ENTRANCE_OR_EXIT}}, + {STR_ACTION_RIDE_PROPERTIES, "PERMISSION_RIDE_PROPERTIES", {GAME_COMMAND_SET_RIDE_NAME, GAME_COMMAND_SET_RIDE_APPEARANCE, GAME_COMMAND_SET_RIDE_STATUS, GAME_COMMAND_SET_RIDE_VEHICLES, GAME_COMMAND_SET_RIDE_SETTING, GAME_COMMAND_SET_RIDE_PRICE, GAME_COMMAND_SET_BRAKES_SPEED}}, + {STR_ACTION_SCENERY, "PERMISSION_SCENERY", {GAME_COMMAND_REMOVE_SCENERY, GAME_COMMAND_PLACE_SCENERY, GAME_COMMAND_SET_BRAKES_SPEED, GAME_COMMAND_REMOVE_FENCE, GAME_COMMAND_PLACE_FENCE, GAME_COMMAND_REMOVE_LARGE_SCENERY, GAME_COMMAND_PLACE_LARGE_SCENERY, GAME_COMMAND_PLACE_BANNER, GAME_COMMAND_REMOVE_BANNER, GAME_COMMAND_SET_SCENERY_COLOUR, GAME_COMMAND_SET_FENCE_COLOUR, GAME_COMMAND_SET_LARGE_SCENERY_COLOUR, GAME_COMMAND_SET_BANNER_COLOUR, GAME_COMMAND_SET_BANNER_NAME, GAME_COMMAND_SET_SIGN_NAME, GAME_COMMAND_SET_BANNER_STYLE, GAME_COMMAND_SET_SIGN_STYLE}}, + {STR_ACTION_PATH, "PERMISSION_PATH", {GAME_COMMAND_PLACE_PATH, GAME_COMMAND_PLACE_PATH_FROM_TRACK, GAME_COMMAND_REMOVE_PATH}}, + {STR_ACTION_CLEAR_LANDSCAPE, "PERMISSION_CLEAR_LANDSCAPE", {GAME_COMMAND_CLEAR_SCENERY}}, + {STR_ACTION_GUEST, "PERMISSION_GUEST", {GAME_COMMAND_SET_GUEST_NAME}}, + {STR_ACTION_STAFF, "PERMISSION_STAFF", {GAME_COMMAND_HIRE_NEW_STAFF_MEMBER, GAME_COMMAND_SET_STAFF_PATROL, GAME_COMMAND_FIRE_STAFF_MEMBER, GAME_COMMAND_SET_STAFF_ORDER, GAME_COMMAND_SET_STAFF_COLOUR, GAME_COMMAND_SET_STAFF_NAME}}, + {STR_ACTION_PARK_PROPERTIES, "PERMISSION_PARK_PROPERTIES", {GAME_COMMAND_SET_PARK_NAME, GAME_COMMAND_SET_PARK_OPEN, GAME_COMMAND_SET_PARK_ENTRANCE_FEE, GAME_COMMAND_SET_LAND_OWNERSHIP, GAME_COMMAND_BUY_LAND_RIGHTS, GAME_COMMAND_PLACE_PARK_ENTRANCE, GAME_COMMAND_REMOVE_PARK_ENTRANCE}}, + {STR_ACTION_PARK_FUNDING, "PERMISSION_PARK_FUNDING", {GAME_COMMAND_SET_CURRENT_LOAN, GAME_COMMAND_SET_RESEARCH_FUNDING, GAME_COMMAND_START_MARKETING_CAMPAIGN}}, + {STR_ACTION_KICK_PLAYER, "PERMISSION_KICK_PLAYER", {GAME_COMMAND_KICK_PLAYER}}, + {STR_ACTION_MODIFY_GROUPS, "PERMISSION_MODIFY_GROUPS", {GAME_COMMAND_MODIFY_GROUPS}}, + {STR_ACTION_SET_PLAYER_GROUP, "PERMISSION_SET_PLAYER_GROUP", {GAME_COMMAND_SET_PLAYER_GROUP}}, + {STR_ACTION_CHEAT, "PERMISSION_CHEAT", {GAME_COMMAND_CHEAT}}, + {STR_ACTION_TOGGLE_SCENERY_CLUSTER, "PERMISSION_TOGGLE_SCENERY_CLUSTER", {-2}} }; }; @@ -214,8 +216,8 @@ public: json_t * ToJson() const; static NetworkGroup FromJson(const json_t * json); void ToggleActionPermission(size_t index); - bool CanPerformAction(size_t index); - bool CanPerformCommand(int command); + bool CanPerformAction(size_t index) const; + bool CanPerformCommand(int command) const; const std::string& GetName() const; void SetName(std::string name); std::array actions_allowed;