diff --git a/ciscosecurefirewall.json b/ciscosecurefirewall.json index e84d6f1..eaaf3c1 100644 --- a/ciscosecurefirewall.json +++ b/ciscosecurefirewall.json @@ -1,7 +1,7 @@ { "appid": "268cecc2-a5ea-438b-96f8-3ab1d8443d93", "name": "Cisco Secure Firewall", - "description": "This app interfaces with Cisco Firepower devices to adds, updates and deletes network objects, network object groups, access policies and access rules", + "description": "This app interfaces with Cisco Firepower devices to add, update and delete network objects, network object groups, access policies and access rules", "publisher": "Splunk", "package_name": "phantom_ciscosecurefirewall", "type": "firewall", @@ -212,7 +212,7 @@ "order": 1 }, "value": { - "description": "Value of the network object. If type if Range specify value in the following format: ip1-ip2", + "description": "Value of the network object. If type is Range specify value in the following format: ip1-ip2", "data_type": "string", "required": true, "order": 2 @@ -356,7 +356,7 @@ "order": 1 }, "type": { - "description": "Network object type. Note this cannot change and is only used to identify the network object value you'd liek to update.", + "description": "Network object type. Note this cannot change and is only used to identify the network object value you'd like to update.", "data_type": "string", "value_list": [ "Host", @@ -872,7 +872,7 @@ "order": 2 }, "network_object_ids_to_remove": { - "description": "Network objects to remove frin the group.", + "description": "Network objects to remove from the group.", "data_type": "string", "example_values": [ "b2df29e8-5e6f-4c5d-9d5e-3fa9b3c9467b, a1c2f7d9-4b5e-42b1-8d9f-2f6b4a8e5e3c" @@ -1470,7 +1470,7 @@ }, { "action": "delete access control policies", - "description": "Deleted the specified access control policy", + "description": "Deletes the specified access control policy", "type": "generic", "identifier": "delete_access_policy", "read_only": false, @@ -2811,7 +2811,7 @@ }, { "action": "delete intrusion policy", - "description": "Deleted the specified access intrusion policy", + "description": "Deletes the specified access intrusion policy", "type": "generic", "identifier": "delete_intrusion_policy", "read_only": false, @@ -3239,21 +3239,5 @@ }, "versions": "EQ(*)" } - ], - "pip_dependencies": { - "wheel": [ - { - "module": "simplejson", - "input_file": "wheels/py36/simplejson-3.17.2-cp36-cp36m-manylinux2010_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - } - ] - }, - "pip39_dependencies": { - "wheel": [ - { - "module": "simplejson", - "input_file": "wheels/py39/simplejson-3.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl" - } - ] - } + ] } diff --git a/ciscosecurefirewall_connector.py b/ciscosecurefirewall_connector.py index 8da5b75..d94014b 100644 --- a/ciscosecurefirewall_connector.py +++ b/ciscosecurefirewall_connector.py @@ -1,6 +1,6 @@ # File: ciscosecurefirewall_connector.py # -# Copyright (c) 2024 Splunk Inc. +# Copyright (c) 2025 Splunk Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,12 +13,12 @@ # either express or implied. See the License for the specific language governing permissions # and limitations under the License. -from typing import Any, Dict, Optional, Tuple +import json +from typing import Any, Optional import encryption_helper import phantom.app as phantom import requests -import simplejson as json from bs4 import BeautifulSoup from phantom.action_result import ActionResult from phantom.base_connector import BaseConnector @@ -169,7 +169,7 @@ def _update_state(self) -> None: self._state["domains"] = self.domains self.save_state(self._state) - def authenicate_cloud_fmc(self, config: Dict[str, Any]) -> bool: + def authenicate_cloud_fmc(self, config: dict[str, Any]) -> bool: """ This method updates the headers and sets the firepower host based on the users region when connecting to a cloud FMC. @@ -313,12 +313,12 @@ def _make_rest_call( method: str, endpoint: str, action_result: ActionResult, - json_body: Dict[str, Any] = None, + json_body: dict[str, Any] = None, headers_only: bool = False, first_try: bool = True, - params: Dict[str, Any] = None, + params: dict[str, Any] = None, auth: HTTPBasicAuth = None, - ) -> Tuple[bool, Any]: + ) -> tuple[bool, Any]: """Function that makes the REST call to the app. :param method: REST method :param endpoint: REST endpoint to be called @@ -372,7 +372,7 @@ def is_cloud_deployment(self) -> bool: """ return self.fmc_type == "Cloud" - def _handle_test_connectivity(self, param: Dict[str, Any]) -> bool: + def _handle_test_connectivity(self, param: dict[str, Any]) -> bool: action_result = ActionResult(dict(param)) self.add_action_result(action_result) @@ -429,7 +429,7 @@ def get_network_objects_of_type(self, object_type: str, domain_uuid: str, action return phantom.APP_SUCCESS - def _handle_list_network_objects(self, param: Dict[str, Any]) -> bool: + def _handle_list_network_objects(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -453,7 +453,7 @@ def _handle_list_network_objects(self, param: Dict[str, Any]) -> bool: return action_result.set_status(phantom.APP_SUCCESS) - def get_network_object(self, domain_id: str, object_id: str) -> Tuple[bool, Dict[str, Any]]: + def get_network_object(self, domain_id: str, object_id: str) -> tuple[bool, dict[str, Any]]: """Helper to get a specfic network object. Args: domain_uuid (str): Domain to be queried @@ -465,7 +465,7 @@ def get_network_object(self, domain_id: str, object_id: str) -> Tuple[bool, Dict ret_val, response = self._make_rest_call("get", url, self) return ret_val, response - def _handle_create_network_object(self, param: Dict[str, Any]) -> bool: + def _handle_create_network_object(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -485,7 +485,7 @@ def _handle_create_network_object(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully created network object with name {name}" return action_result.set_status(phantom.APP_SUCCESS) - def _handle_update_network_object(self, param: Dict[str, Any]) -> bool: + def _handle_update_network_object(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -511,7 +511,7 @@ def _handle_update_network_object(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully updated network object with name {name}" return action_result.set_status(phantom.APP_SUCCESS) - def _handle_delete_network_object(self, param: Dict[str, Any]) -> bool: + def _handle_delete_network_object(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -547,7 +547,7 @@ def get_domain_id(self, domain_name: str) -> str: if domain_name.lower() == leaf_domain: return domain["uuid"] - def list_objects(self, url: str, action_result: ActionResult, expanded: bool = False) -> Tuple[bool, list]: + def list_objects(self, url: str, action_result: ActionResult, expanded: bool = False) -> tuple[bool, list]: """Helper to get list any type of FMC objects (groups, policies, rules). Args: url (str): REST endpoint to query @@ -581,7 +581,7 @@ def list_objects(self, url: str, action_result: ActionResult, expanded: bool = F return phantom.APP_SUCCESS, objects - def _handle_get_network_groups(self, param: Dict[str, Any]) -> bool: + def _handle_get_network_groups(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") # Add an action result object to self (BaseConnector) to represent the action for this param @@ -596,14 +596,17 @@ def _handle_get_network_groups(self, param: Dict[str, Any]) -> bool: return action_result.get_status() for item in network_group_list: - if not group_name or group_name == item["name"]: + if not group_name: action_result.add_data({"name": item["name"], "uuid": item["id"]}) + if group_name == item["name"]: + action_result.add_data({"name": item["name"], "uuid": item["id"]}) + break action_result.update_summary({"total_groups_returned": len(action_result.get_data())}) return action_result.set_status(phantom.APP_SUCCESS) - def _handle_create_network_group(self, param: Dict[str, Any]) -> bool: + def _handle_create_network_group(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -628,7 +631,7 @@ def _handle_create_network_group(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully added network group with name {group_name}" return action_result.set_status(phantom.APP_SUCCESS) - def get_network_group(self, domain_uuid: str, group_id: str) -> Tuple[bool, Dict[str, Any]]: + def get_network_group(self, domain_uuid: str, group_id: str) -> tuple[bool, dict[str, Any]]: """Helper to get a specfic network group. Args: domain_uuid (str): Domain to be queried @@ -640,7 +643,7 @@ def get_network_group(self, domain_uuid: str, group_id: str) -> Tuple[bool, Dict ret_val, response = self._make_rest_call("get", url, self) return ret_val, response - def _handle_update_network_group(self, param: Dict[str, Any]) -> bool: + def _handle_update_network_group(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -675,7 +678,7 @@ def _handle_update_network_group(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully update network group with id {group_id}" return action_result.set_status(phantom.APP_SUCCESS) - def _handle_delete_network_group(self, param: Dict[str, Any]) -> bool: + def _handle_delete_network_group(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -693,7 +696,7 @@ def _handle_delete_network_group(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully deleted network group with id {group_id}" return action_result.set_status(phantom.APP_SUCCESS) - def _handle_get_access_policies(self, param: Dict[str, Any]) -> bool: + def _handle_get_access_policies(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -719,7 +722,7 @@ def _handle_get_access_policies(self, param: Dict[str, Any]) -> bool: return action_result.set_status(phantom.APP_SUCCESS) - def _handle_create_access_policy(self, param: Dict[str, Any]) -> bool: + def _handle_create_access_policy(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -740,7 +743,7 @@ def _handle_create_access_policy(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully created access policy with name {name}" return action_result.set_status(phantom.APP_SUCCESS) - def get_access_policy(self, domain_uuid: str, policy_id: str) -> Tuple[bool, Dict[str, Any]]: + def get_access_policy(self, domain_uuid: str, policy_id: str) -> tuple[bool, dict[str, Any]]: """Helper to get a specfic access policy. Args: domain_uuid (str): Domain to be queried @@ -752,7 +755,7 @@ def get_access_policy(self, domain_uuid: str, policy_id: str) -> Tuple[bool, Dic ret_val, response = self._make_rest_call("get", url, self) return ret_val, response - def _handle_update_access_policy(self, param: Dict[str, Any]) -> bool: + def _handle_update_access_policy(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -787,7 +790,7 @@ def _handle_update_access_policy(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully updated access policy with id {policy_id}" return action_result.set_status(phantom.APP_SUCCESS) - def _handle_delete_access_policy(self, param: Dict[str, Any]) -> bool: + def _handle_delete_access_policy(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -805,7 +808,7 @@ def _handle_delete_access_policy(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully deleted access policy with id {policy_id}" return action_result.set_status(phantom.APP_SUCCESS) - def _handle_get_access_rules(self, param: Dict[str, Any]) -> bool: + def _handle_get_access_rules(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -836,7 +839,7 @@ def _handle_get_access_rules(self, param: Dict[str, Any]) -> bool: return action_result.set_status(phantom.APP_SUCCESS) - def build_network_objects_list(self, network_ids: list, dommain_uuid: str) -> Tuple[bool, Optional[list]]: + def build_network_objects_list(self, network_ids: list, dommain_uuid: str) -> tuple[bool, Optional[list]]: """Helper that classifys and builds a list of network objects and groups. Args: network_ids (list): Ids of network objects and groups @@ -857,7 +860,7 @@ def build_network_objects_list(self, network_ids: list, dommain_uuid: str) -> Tu return phantom.APP_SUCCESS, networks_objects - def _handle_create_access_rules(self, param: Dict[str, Any]) -> bool: + def _handle_create_access_rules(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -899,7 +902,7 @@ def _handle_create_access_rules(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully added access control rule with name {name} to policy {policy_id}" return action_result.set_status(phantom.APP_SUCCESS) - def get_access_control_rule(self, domain_id: str, policy_id: str, rule_id: str) -> Tuple[bool, Dict[str, Any]]: + def get_access_control_rule(self, domain_id: str, policy_id: str, rule_id: str) -> tuple[bool, dict[str, Any]]: """Helper to get a specfic access control rule belonging to a specfic access policy. Args: domain_id (str): Domain to be queried @@ -912,7 +915,7 @@ def get_access_control_rule(self, domain_id: str, policy_id: str, rule_id: str) ret_val, response = self._make_rest_call("get", url, self) return ret_val, response - def _handle_update_access_rule(self, param: Dict[str, Any]) -> bool: + def _handle_update_access_rule(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -973,7 +976,7 @@ def _handle_update_access_rule(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully updated access control rule with id {rule_id}" return action_result.set_status(phantom.APP_SUCCESS) - def _handle_delete_access_rule(self, param: Dict[str, Any]) -> bool: + def _handle_delete_access_rule(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -992,7 +995,7 @@ def _handle_delete_access_rule(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully delete access control rule with id {rule_id}" return action_result.set_status(phantom.APP_SUCCESS) - def _handle_list_devices(self, param: Dict[str, Any]) -> bool: + def _handle_list_devices(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -1011,7 +1014,7 @@ def _handle_list_devices(self, param: Dict[str, Any]) -> bool: return action_result.set_status(phantom.APP_SUCCESS) - def get_deployable_devices(self, domain_id: str, action_result) -> Tuple[bool, Any]: + def get_deployable_devices(self, domain_id: str, action_result) -> tuple[bool, Any]: """Helper that gets list of devices ready for deployment. Args: domain_id (str): Domain to be queried @@ -1030,7 +1033,7 @@ def get_deployable_devices(self, domain_id: str, action_result) -> Tuple[bool, A return phantom.APP_SUCCESS, device_lst - def _handle_get_deployable_devices(self, param: Dict[str, Any]) -> bool: + def _handle_get_deployable_devices(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -1048,7 +1051,7 @@ def _handle_get_deployable_devices(self, param: Dict[str, Any]) -> bool: return action_result.set_status(phantom.APP_SUCCESS) - def _handle_deploy_devices(self, param: Dict[str, Any]) -> bool: + def _handle_deploy_devices(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -1080,7 +1083,7 @@ def _handle_deploy_devices(self, param: Dict[str, Any]) -> bool: summary["Message"] = "Successfully deployed devices" return action_result.set_status(phantom.APP_SUCCESS) - def _handle_get_deployment_status(self, param: Dict[str, Any]) -> bool: + def _handle_get_deployment_status(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -1098,7 +1101,7 @@ def _handle_get_deployment_status(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully retrieved status for deployment {deployment_id}" return action_result.set_status(phantom.APP_SUCCESS) - def get_intrusion_policy(self, domain_uuid: str, policy_id: str) -> Tuple[int, any]: + def get_intrusion_policy(self, domain_uuid: str, policy_id: str) -> tuple[int, any]: """Helper to get a specfic intrusion policy. Args: domain_uuid (str): Domain to be queried @@ -1110,7 +1113,7 @@ def get_intrusion_policy(self, domain_uuid: str, policy_id: str) -> Tuple[int, a ret_val, response = self._make_rest_call("get", url, self) return ret_val, response - def _handle_list_intrusion_policies(self, param: Dict[str, Any]) -> bool: + def _handle_list_intrusion_policies(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -1136,7 +1139,7 @@ def _handle_list_intrusion_policies(self, param: Dict[str, Any]) -> bool: return action_result.set_status(phantom.APP_SUCCESS) - def _handle_create_intrusion_policy(self, param: Dict[str, Any]) -> bool: + def _handle_create_intrusion_policy(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) name = param["name"] @@ -1161,7 +1164,7 @@ def _handle_create_intrusion_policy(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully added intrusion policy with name {name}" return action_result.set_status(phantom.APP_SUCCESS) - def _handle_update_intrusion_policy(self, param: Dict[str, Any]) -> bool: + def _handle_update_intrusion_policy(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -1189,7 +1192,7 @@ def _handle_update_intrusion_policy(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully updated intrusion policy with id {policy_id}" return action_result.set_status(phantom.APP_SUCCESS) - def _handle_delete_intrusion_policy(self, param: Dict[str, Any]) -> bool: + def _handle_delete_intrusion_policy(self, param: dict[str, Any]) -> bool: self.save_progress(f"In action handler for: {self.get_action_identifier()}") action_result = self.add_action_result(ActionResult(dict(param))) @@ -1206,7 +1209,7 @@ def _handle_delete_intrusion_policy(self, param: Dict[str, Any]) -> bool: summary["Message"] = f"Successfully delete intrusion policy with id {policy_id}" return action_result.set_status(phantom.APP_SUCCESS) - def handle_action(self, param: Dict[str, Any]) -> bool: + def handle_action(self, param: dict[str, Any]) -> bool: ret_val = phantom.APP_SUCCESS diff --git a/ciscosecurefirewall_consts.py b/ciscosecurefirewall_consts.py index 7252707..ee8c533 100644 --- a/ciscosecurefirewall_consts.py +++ b/ciscosecurefirewall_consts.py @@ -1,6 +1,6 @@ # File: ciscosecurefirewall_consts.py # -# Copyright (c) 2024 Splunk Inc. +# Copyright (c) 2025 Splunk Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. diff --git a/manual_readme_content.md b/manual_readme_content.md index e0fe56d..b97f443 100644 --- a/manual_readme_content.md +++ b/manual_readme_content.md @@ -1,18 +1,3 @@ -[comment]: # " File: README.md" -[comment]: # "Copyright (c) 2025 Splunk Inc." -[comment]: # "" -[comment]: # "Licensed under the Apache License, Version 2.0 (the 'License');" -[comment]: # "you may not use this file except in compliance with the License." -[comment]: # "You may obtain a copy of the License at" -[comment]: # "" -[comment]: # " http://www.apache.org/licenses/LICENSE-2.0" -[comment]: # "" -[comment]: # "Unless required by applicable law or agreed to in writing, software distributed under" -[comment]: # "the License is distributed on an 'AS IS' BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND," -[comment]: # "either express or implied. See the License for the specific language governing permissions" -[comment]: # "and limitations under the License." -[comment]: # "" - This connector supports both cloud and on-prem delivered FMC. Below are the steps for connecting to both ## Connecting to a cloud delivered FMC @@ -26,6 +11,6 @@ This connector supports both cloud and on-prem delivered FMC. Below are the step ## Connecting to an on-prem delivered FMC 1. On the SOAR asset setting page select On-prem for the type of FMC you are connecting to -2. Specify the device ip/hostname of your on-prem FMC along with the username and password used ot login to FMC +2. Specify the device ip/hostname of your on-prem FMC along with the username and password used to login to FMC -**Note** that you can optionally specify a default firepower domain that will be queried. You an overide this domain when running an action. In addition, cloud versions of FMC only support the default domain, to achieve multi tenancy you must use seperate tenants. +**Note** that you can optionally specify a default firepower domain that will be queried. You can override this domain when running an action. In addition, cloud versions of FMC only support the default domain. To achieve multi tenancy you must use separate tenants. diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 614d435..0000000 --- a/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -simplejson==3.17.2 diff --git a/wheels/py36/simplejson-3.17.2-cp36-cp36m-manylinux2010_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl b/wheels/py36/simplejson-3.17.2-cp36-cp36m-manylinux2010_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl deleted file mode 100644 index fbd5f1c..0000000 Binary files a/wheels/py36/simplejson-3.17.2-cp36-cp36m-manylinux2010_x86_64.manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl and /dev/null differ diff --git a/wheels/py39/simplejson-3.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl b/wheels/py39/simplejson-3.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl deleted file mode 100644 index 0aeb7e1..0000000 Binary files a/wheels/py39/simplejson-3.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl and /dev/null differ