mcl-platform-sdk 1.0.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mcl_platform_sdk-1.0.0/LICENSE.md +21 -0
- mcl_platform_sdk-1.0.0/MANIFEST.in +21 -0
- mcl_platform_sdk-1.0.0/PKG-INFO +305 -0
- mcl_platform_sdk-1.0.0/README.md +282 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/__init__.py +661 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/__init__.py +24 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/admin_api.py +1297 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/analysis_api.py +1351 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/apikey_api.py +491 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/application_information_api.py +386 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/auth_api.py +399 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/batch_api.py +819 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/config_api.py +401 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/data_sanitization_cdr_api.py +274 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/dynamic_analysis_api.py +398 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/engines_api.py +767 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/file_scanning_api.py +729 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/hash_lookups_api.py +552 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/license_api.py +412 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/malware_sample_sharing_api.py +530 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/multipart_api.py +610 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/reputation_service_api.py +810 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/stats_api.py +619 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/status_endpoints_api.py +235 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/threat_intelligence_feed_api.py +302 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api/yara_api.py +507 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api_client.py +805 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/api_response.py +21 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/configuration.py +579 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/exceptions.py +220 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/__init__.py +304 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/account_information.py +140 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/active_performance200_response.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/active_performance200_response_active_performance.py +118 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/active_performance200_response_active_performance_hash_time.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/active_performance200_response_active_performance_processing_time.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/active_performance200_response_active_performance_queue_time.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/active_performance200_response_active_performance_wait_time.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/admin_import200_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/analysis_rules200_response_inner.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/analysis_summary.py +126 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/analysis_summary_dlp_info.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/analysis_summary_sandbox.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/analysis_summary_vulnerability.py +105 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/apikey_usage.py +97 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/apikey_usage1.py +99 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/apk_hash_results.py +124 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/apk_hash_results_application.py +126 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/apk_hash_results_application_activities_inner.py +102 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/apk_hash_results_application_activities_inner_intent_filters_inner.py +108 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/apk_hash_results_application_launcher_activities_inner.py +102 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/apk_hash_results_application_launcher_activities_inner_intent_filters_inner.py +108 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/apk_hash_results_application_launcher_activities_inner_intent_filters_inner_actions_inner.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/apk_hash_results_application_launcher_activities_inner_intent_filters_inner_categories_inner.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/apk_hash_results_uses_sdk.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/batch_close200_response.py +110 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/batch_close200_response_process_info.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/batch_close200_response_scan_results.py +118 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/batch_create200_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/batch_status200_response.py +110 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/batch_status200_response_batch_files.py +102 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/batch_status200_response_batch_files_files_in_batch_inner.py +132 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/batch_status200_response_batch_files_files_in_batch_inner_process_info.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/batch_status200_response_process_info.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/batch_status200_response_scan_results.py +118 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/bulk_hash_lookup_results.py +96 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/city.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_audit_log_request.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_delete_skip_hash200_response.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_get_cache_user_request.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_get_custom_response_header200_response.py +102 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_get_custom_response_header200_response_include_address.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_get_custom_response_header200_response_specify_users_agent.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_get_health_check200_response.py +106 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_get_health_check200_response_engines_inner.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_get_proxy200_response.py +106 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_get_proxy200_response_feature_proxy_inner.py +118 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_get_sessioncookie200_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_get_skip_hash200_response.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_get_sync_scan_timeout200_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_get_sync_scan_timeout500_response.py +138 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_get_sync_scan_timeout500_response_one_of.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_get_sync_scan_timeout500_response_one_of1.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_post_proxy_testconnection200_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_post_proxy_testconnection400_response.py +152 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_post_proxy_testconnection_request.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_put_cache_user400_response.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_sanitized_repo_request.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_session_request.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_health_check400_response.py +138 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_health_check400_response_one_of.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_health_check400_response_one_of1.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_health_check_request.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_proxy400_response.py +180 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_proxy400_response_one_of.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_proxy400_response_one_of1.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_proxy400_response_one_of2.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_proxy400_response_one_of3.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_proxy400_response_one_of4.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_proxy_request.py +108 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_request.py +114 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_request_disabledupdate_inner.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_sync_scan_timeout500_response.py +138 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_sync_scan_timeout500_response_one_of.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_update_sync_scan_timeout_request.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/config_webhook200_response.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/country.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post200_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post400_response.py +222 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post400_response_one_of.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post400_response_one_of1.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post400_response_one_of2.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post400_response_one_of3.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post400_response_one_of4.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post400_response_one_of5.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post400_response_one_of6.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post400_response_one_of7.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post403_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post500_response.py +166 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post500_response_one_of.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post500_response_one_of1.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post500_response_one_of2.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/create_multipart_upload_post500_response_one_of3.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/deleted_sanitized_version_of_the_file.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/domain_bulk_lookup_request.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/domain_reputation.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/engine_definition_results.py +182 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/engine_disable200_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/engine_enable200_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/engine_pin200_response.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/engine_unpin200_response.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/engines_status200_response_inner.py +126 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/error.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/exif_hash_results.py +122 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/failed_request.py +93 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/failed_request1.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/feed_latestcleanhashes200_response.py +102 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/feed_latestcleanhashes200_response_hashes_inner.py +104 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response.py +148 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_dlp_info.py +150 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_dlp_info_hits.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_dlp_info_hits_ccn.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_dlp_info_hits_ccn_hits_inner.py +122 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_dlp_info_metadata_removal.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_dlp_info_redact.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_dlp_info_watermark.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_extracted_files_inner.py +140 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_extracted_files_inner_extracted_files_inner.py +136 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_extracted_files_inner_extracted_files_inner_file_info.py +131 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_extracted_files_inner_extracted_files_inner_process_info.py +131 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_extracted_files_inner_extracted_files_inner_process_info_processing_time_details.py +104 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_extracted_files_inner_extracted_files_inner_scan_results.py +126 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_extracted_files_inner_process_info.py +131 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_extracted_files_inner_process_info_processing_time_details.py +106 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_process_info.py +131 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_get_all_child_files200_response_process_info_processing_time_details.py +108 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_sync_post200_response.py +144 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_sync_post400_response.py +250 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_sync_post400_response_one_of.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_sync_post400_response_one_of1.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_sync_post400_response_one_of2.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_sync_post400_response_one_of3.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_sync_post400_response_one_of4.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_sync_post400_response_one_of5.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_sync_post400_response_one_of6.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_sync_post403_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_sync_post408_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_sync_post500_response.py +180 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_analysis_sync_post500_response_one_of.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_info.py +96 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_info1.py +135 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_info1_signer_infos_inner.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_info2.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results.py +174 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_dlp_info.py +150 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_dlp_info_hits.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_dlp_info_hits_ccn.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_dlp_info_hits_ccn_hits_inner.py +122 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_dlp_info_metadata_removal.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_dlp_info_redact.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_dlp_info_watermark.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_download_info.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_extracted_files.py +96 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_extracted_files_files_in_archive_inner.py +100 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_extraction_info.py +106 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_filetype_info.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_filetype_info_file_info.py +110 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_process_info.py +135 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_process_info_post_processing.py +102 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_process_info_post_processing_sanitization_details.py +121 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_process_info_post_processing_sanitization_details_all_of_details_inner.py +111 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_process_info_post_processing_sanitization_details_all_of_details_inner_details.py +104 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_process_info_post_processing_sanitization_details_all_of_sanitized_file_info.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_process_info_processing_time_details.py +106 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_sanitized.py +109 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_sanitized_failure_reasons.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_vulnerability_info.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_vulnerability_info_result.py +112 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_vulnerability_info_result_detected_product.py +140 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_vulnerability_info_result_detected_product_product.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_vulnerability_info_result_detected_product_vendor.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_vulnerability_info_result_detected_product_version_data.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_vulnerability_info_result_detected_product_vulnerabilites_inner.py +110 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_vulnerability_info_result_detected_product_vulnerabilites_inner_details.py +104 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_vulnerability_info_result_detected_product_vulnerabilites_inner_details_cvss.py +104 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_scan_results_yara.py +100 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_upload403_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_upload411_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_upload_results.py +134 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/file_upload_results_sandbox_error.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/geo_info.py +114 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/get_license_backup200_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/hash_lookup_results.py +127 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/headers.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/health_check200_response.py +120 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/health_check200_response_database.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/health_check200_response_engines_inner.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/health_check200_response_license.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/health_check200_response_number_active_av_engines.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/health_check200_response_scan_queue.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/imported_dll.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/ip_bulk_lookup_request.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/ip_reputation.py +100 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/license_activation_request.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/license_get200_response.py +102 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/license_upload200_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/location.py +89 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/lookup_results.py +100 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/multiple_domain_reputation.py +96 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/multiple_hash_lookup_request.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/multiple_ip_reputation.py +96 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/multiple_url_reputation.py +96 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/nodes_status200_response_inner.py +100 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/nodes_status200_response_inner_statuses_inner.py +138 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/nodes_status200_response_inner_statuses_inner_engines_inner.py +110 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/nodes_status200_response_inner_statuses_inner_issues_inner.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/nodes_status200_response_inner_statuses_inner_scan_queue_details.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/optional_headers.py +110 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/pe_lookup_results.py +140 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/per_engine_result.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/post_license_backup200_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/post_processing.py +96 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/process_info.py +102 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/product_version200_response.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/repository_scan_request.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/repository_scan_results.py +96 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/resource_id.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/resource_info.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/retrieve_blocked_leaf_file200_response.py +100 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/retrieve_blocked_leaf_file200_response_details_inner.py +106 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/retrieve_blocked_leaf_file200_response_details_inner_process_info.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/retrieve_blocked_leaf_file200_response_details_inner_process_info_post_processing.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/role_create200_response.py +100 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/role_create_request.py +96 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/role_create_request_rights.py +307 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/sandbox_lookup200_response.py +158 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/sandbox_response_for_a_file.py +108 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/sandbox_response_for_a_file1.py +108 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/sandbox_response_for_aurl.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/sandbox_response_for_aurl_final_verdict.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/sandbox_url_scan_request.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/sandbox_url_upload_results.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/sanitization_offending_file.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/sanitized.py +89 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/sanitized_file_download_link.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/scan_details.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/scan_history.py +96 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/scan_history1.py +102 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/scan_reports.py +100 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/scan_result_history.py +98 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/scan_result_submission_summary.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/scan_result_submission_summary1.py +112 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/scan_result_submission_summary1_scan_details.py +92 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/scan_result_submission_summary1_scan_details_clam_av.py +100 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/scan_results.py +105 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/section_header.py +110 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/source.py +96 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/status_version200_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/subdivision.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_delete400_response.py +138 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_delete400_response_one_of.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_delete409_response.py +152 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_delete409_response_one_of.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_get200_response.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_get400_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_get404_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_post200_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_post400_response.py +152 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_post400_response_one_of.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_post400_response_one_of1.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_post409_response.py +138 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_post409_response_one_of.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_post409_response_one_of1.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_post416_response.py +138 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_post416_response_one_of.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_post416_response_one_of1.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/upload_part_post422_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/url_bulk_lookup_request.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/url_reputation.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/user_change_pass_request.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/user_create200_response.py +100 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/user_create_request.py +102 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/user_login200_response.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/user_login403_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/user_login_request.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/user_logout200_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/user_logout400_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/user_logout403_response.py +88 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/votes.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/vs_version_info.py +102 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/webhook_status200_response.py +94 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/yara_package_generate200_response.py +106 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/yara_package_generate200_response_issues.py +106 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/yara_package_generate200_response_issues_general_inner.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/yara_package_generate200_response_issues_source_inner.py +90 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/yara_sources_get200_response.py +106 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/yara_sources_get200_response_http_sources_inner.py +100 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/models/yara_sources_get200_response_local_sources_inner.py +100 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/py.typed +0 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk/rest.py +264 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk.egg-info/PKG-INFO +305 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk.egg-info/SOURCES.txt +330 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk.egg-info/dependency_links.txt +1 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk.egg-info/requires.txt +4 -0
- mcl_platform_sdk-1.0.0/mcl_platform_sdk.egg-info/top_level.txt +2 -0
- mcl_platform_sdk-1.0.0/pyproject.toml +97 -0
- mcl_platform_sdk-1.0.0/requirements.txt +4 -0
- mcl_platform_sdk-1.0.0/setup.cfg +7 -0
- mcl_platform_sdk-1.0.0/setup.py +50 -0
- mcl_platform_sdk-1.0.0/tests/__init__.py +7 -0
- mcl_platform_sdk-1.0.0/tests/exemple_all_workflows.py +211 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 OPSWAT
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Include important files
|
|
2
|
+
include README.md
|
|
3
|
+
include LICENSE.md
|
|
4
|
+
include requirements.txt
|
|
5
|
+
include setup.py
|
|
6
|
+
include pyproject.toml
|
|
7
|
+
|
|
8
|
+
# Include the package
|
|
9
|
+
recursive-include mcl_platform_sdk *.py
|
|
10
|
+
|
|
11
|
+
# Include exemples folder
|
|
12
|
+
recursive-include exemples *.py
|
|
13
|
+
include exemples/*.pdf
|
|
14
|
+
|
|
15
|
+
# Exclude unnecessary files
|
|
16
|
+
exclude .gitignore
|
|
17
|
+
exclude git_push.sh
|
|
18
|
+
recursive-exclude venv *
|
|
19
|
+
recursive-exclude * __pycache__
|
|
20
|
+
recursive-exclude * *.py[co]
|
|
21
|
+
recursive-exclude * .DS_Store
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: mcl_platform_sdk
|
|
3
|
+
Version: 1.0.0
|
|
4
|
+
Summary: OPSWAT MetaDefender Cloud Python SDK
|
|
5
|
+
Home-page: https://github.com/opswat/mcl-platform-sdk
|
|
6
|
+
Author: Florentina Gheorma
|
|
7
|
+
Author-email: Florentina Gheorma <gheorma.florentina@opswat.com>
|
|
8
|
+
License: MIT
|
|
9
|
+
Project-URL: Repository, https://github.com/opswat/mcl-platform-sdk
|
|
10
|
+
Project-URL: Homepage, https://www.opswat.com/
|
|
11
|
+
Project-URL: Documentation, https://docs.opswat.com/
|
|
12
|
+
Keywords: OPSWAT,MetaDefender,MetaDefender Cloud,Security,Malware Scanning
|
|
13
|
+
Requires-Python: >=3.9
|
|
14
|
+
Description-Content-Type: text/markdown
|
|
15
|
+
License-File: LICENSE.md
|
|
16
|
+
Requires-Dist: urllib3<3.0.0,>=2.1.0
|
|
17
|
+
Requires-Dist: python-dateutil>=2.8.2
|
|
18
|
+
Requires-Dist: pydantic>=2
|
|
19
|
+
Requires-Dist: typing-extensions>=4.7.1
|
|
20
|
+
Dynamic: author
|
|
21
|
+
Dynamic: home-page
|
|
22
|
+
Dynamic: license-file
|
|
23
|
+
|
|
24
|
+
# MetaDefender Python SDK
|
|
25
|
+
|
|
26
|
+
[](https://pypi.org/project/mcl-platform-sdk/)
|
|
27
|
+
[](LICENSE.md)
|
|
28
|
+
|
|
29
|
+
Python SDK for MetaDefender Cloud - file scanning, threat detection, and CDR with 20+ anti-malware engines.
|
|
30
|
+
|
|
31
|
+
## Versions
|
|
32
|
+
|
|
33
|
+
- API version: `4.0`
|
|
34
|
+
- SDK version: `1.0.0`
|
|
35
|
+
|
|
36
|
+
## About the API
|
|
37
|
+
|
|
38
|
+
MetaDefender SDK provides an interface for interacting with MetaDefender Cloud and Core services. It enables file analysis with 20+ anti-malware engines, Deep Content Disarm and Reconstruction (CDR), sandbox analysis, and more.
|
|
39
|
+
|
|
40
|
+
### Key Features of MetaDefender Cloud
|
|
41
|
+
|
|
42
|
+
- **File Analysis** – Scan files using 20+ anti-malware engines
|
|
43
|
+
- **Deep CDR** – Supports sanitization of 100+ file types
|
|
44
|
+
- **Sandbox Analysis** – Detects unknown and targeted attacks through dynamic analysis
|
|
45
|
+
|
|
46
|
+
## Maintainer: publish to Test PyPI
|
|
47
|
+
|
|
48
|
+
Build and upload with a Test PyPI API token (non-interactive):
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
python -m pip install build twine && python -m build
|
|
52
|
+
export TWINE_USERNAME=__token__
|
|
53
|
+
export TWINE_PASSWORD=pypi-your-testpypi-token
|
|
54
|
+
twine upload --repository-url https://test.pypi.org/legacy/ dist/*
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
See **[docs/PUBLISHING.md](docs/PUBLISHING.md)** for details and production PyPI.
|
|
58
|
+
|
|
59
|
+
## Table of Contents
|
|
60
|
+
|
|
61
|
+
- [Versions](#versions)
|
|
62
|
+
- [About the API](#about-the-api)
|
|
63
|
+
- [Setup & Configuration](#setup--configuration)
|
|
64
|
+
- [Supported Python Versions](#supported-python-versions)
|
|
65
|
+
- [Installation](#installation)
|
|
66
|
+
- [Authentication](#authentication)
|
|
67
|
+
- [Basic Usage](#basic-usage)
|
|
68
|
+
- [API Services](#api-services)
|
|
69
|
+
- [File Scanning](#file-scanning)
|
|
70
|
+
- [Data Sanitization (CDR)](#data-sanitization-cdr)
|
|
71
|
+
- [Hash Lookups](#hash-lookups)
|
|
72
|
+
- [Reputation Service](#reputation-service)
|
|
73
|
+
- [Dynamic Analysis (Sandbox)](#dynamic-analysis-sandbox)
|
|
74
|
+
- [API Key Management](#api-key-management)
|
|
75
|
+
- [Error Handling](#error-handling)
|
|
76
|
+
- [Example Workflow](#example-workflow)
|
|
77
|
+
- [License](#license)
|
|
78
|
+
|
|
79
|
+
## Setup & Configuration
|
|
80
|
+
|
|
81
|
+
### Supported Python Versions
|
|
82
|
+
|
|
83
|
+
This SDK is compatible with the following versions:
|
|
84
|
+
- Python 3.9 or higher
|
|
85
|
+
- pip package manager
|
|
86
|
+
|
|
87
|
+
## Installation
|
|
88
|
+
|
|
89
|
+
Install the SDK using pip:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
pip install mcl-platform-sdk
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Requirements:** Python 3.9 or higher
|
|
96
|
+
|
|
97
|
+
**Import name:** After install, import the SDK as **`mcl_platform_sdk`**:
|
|
98
|
+
|
|
99
|
+
```python
|
|
100
|
+
from mcl_platform_sdk import ApiClient
|
|
101
|
+
from mcl_platform_sdk.api.file_scanning_api import FileScanningApi
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## Authentication
|
|
105
|
+
|
|
106
|
+
Set your API key as an environment variable:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
export METADEFENDER_APIKEY="YOUR_API_KEY_HERE"
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
The SDK automatically reads from `METADEFENDER_APIKEY`. Alternatively, pass it directly:
|
|
113
|
+
|
|
114
|
+
```python
|
|
115
|
+
from mcl_platform_sdk import ApiClient
|
|
116
|
+
|
|
117
|
+
config = ApiClient(api_key="YOUR_API_KEY")
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
The ApiClient automatically reads the API key from the METADEFENDER_APIKEY environment variable.
|
|
121
|
+
|
|
122
|
+
### Optional parameters (`headers` options bag)
|
|
123
|
+
|
|
124
|
+
All SDK methods keep only **required** path/body parameters in the function signature.
|
|
125
|
+
All **optional request parameters** (both HTTP headers *and* query parameters) are passed via:
|
|
126
|
+
|
|
127
|
+
- `headers: Optional[Dict[str, Any]] = None`
|
|
128
|
+
|
|
129
|
+
Example:
|
|
130
|
+
|
|
131
|
+
```python
|
|
132
|
+
fs_api.analyze_file(file=data, headers={"filename": "test.pdf", "rule": "sanitize"})
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Basic Usage
|
|
136
|
+
|
|
137
|
+
```python
|
|
138
|
+
from mcl_platform_sdk import ApiClient
|
|
139
|
+
from mcl_platform_sdk.api.file_scanning_api import FileScanningApi
|
|
140
|
+
|
|
141
|
+
# Initialize client - reads METADEFENDER_APIKEY automatically
|
|
142
|
+
client = ApiClient()
|
|
143
|
+
fs_api = FileScanningApi(client)
|
|
144
|
+
|
|
145
|
+
# Upload and scan file
|
|
146
|
+
with open('test.pdf', 'rb') as f:
|
|
147
|
+
upload = fs_api.analyze_file(
|
|
148
|
+
file=f.read(),
|
|
149
|
+
headers={
|
|
150
|
+
"filename": "test.pdf",
|
|
151
|
+
"rule": "sanitize",
|
|
152
|
+
}
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
# Poll for results with automatic timeout (configured via headers)
|
|
156
|
+
try:
|
|
157
|
+
result = fs_api.get_file_analysis(
|
|
158
|
+
upload.data_id,
|
|
159
|
+
headers={
|
|
160
|
+
"timeout": 60,
|
|
161
|
+
"poll_interval": 2, # seconds (optional)
|
|
162
|
+
},
|
|
163
|
+
)
|
|
164
|
+
print('Scan result:', result.scan_results.scan_all_result_a)
|
|
165
|
+
except TimeoutError:
|
|
166
|
+
print('Scan failed to complete in 60 seconds')
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## API Services
|
|
170
|
+
|
|
171
|
+
### File Scanning
|
|
172
|
+
|
|
173
|
+
```python
|
|
174
|
+
from mcl_platform_sdk.api.file_scanning_api import FileScanningApi
|
|
175
|
+
|
|
176
|
+
fs_api = FileScanningApi(client)
|
|
177
|
+
|
|
178
|
+
# Upload file
|
|
179
|
+
with open('file.pdf', 'rb') as f:
|
|
180
|
+
upload = fs_api.analyze_file(
|
|
181
|
+
file=f.read(),
|
|
182
|
+
headers={
|
|
183
|
+
"filename": "file.pdf",
|
|
184
|
+
"rule": "sanitize", # Options: multiscan, sanitize, cdr, unarchive, dlp
|
|
185
|
+
}
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
# Poll for scan completion (recommended)
|
|
189
|
+
try:
|
|
190
|
+
result = fs_api.get_file_analysis(upload.data_id, headers={"timeout": 60})
|
|
191
|
+
print('Scan completed:', result.scan_results.scan_all_result_a)
|
|
192
|
+
except TimeoutError:
|
|
193
|
+
print('Scan failed to complete in 60 seconds')
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Data Sanitization (CDR)
|
|
197
|
+
|
|
198
|
+
```python
|
|
199
|
+
from mcl_platform_sdk.api.data_sanitization_cdr_api import DataSanitizationCDRApi
|
|
200
|
+
|
|
201
|
+
cdr_api = DataSanitizationCDRApi(client)
|
|
202
|
+
|
|
203
|
+
# Get sanitized file URL
|
|
204
|
+
sanitized = cdr_api.file_sanitized(data_id)
|
|
205
|
+
print('Download URL:', sanitized.sanitized_file_path)
|
|
206
|
+
|
|
207
|
+
# Cleanup
|
|
208
|
+
cdr_api.file_converted_data_id_delete(data_id)
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Hash Lookups
|
|
212
|
+
|
|
213
|
+
```python
|
|
214
|
+
from mcl_platform_sdk.api.hash_lookups_api import HashLookupsApi
|
|
215
|
+
|
|
216
|
+
hash_api = HashLookupsApi(client)
|
|
217
|
+
result = hash_api.hash_lookup('640CCA22FBF439406BA200EEFB9C52BE87BC97D6')
|
|
218
|
+
print('Hash lookup result:', result)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Reputation Service
|
|
222
|
+
|
|
223
|
+
```python
|
|
224
|
+
from mcl_platform_sdk.api.reputation_service_api import ReputationServiceApi
|
|
225
|
+
|
|
226
|
+
rep_api = ReputationServiceApi(client)
|
|
227
|
+
|
|
228
|
+
# Check IP, domain, or URL reputation
|
|
229
|
+
ip_rep = rep_api.i_p_lookup(observable_ip='198.15.127.171')
|
|
230
|
+
domain_rep = rep_api.domain_lookup(observable_domain='example.com')
|
|
231
|
+
url_rep = rep_api.url_lookup(observable_url='http://suspicious-url.com')
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Dynamic Analysis (Sandbox)
|
|
235
|
+
|
|
236
|
+
```python
|
|
237
|
+
from mcl_platform_sdk.api.dynamic_analysis_api import DynamicAnalysisApi
|
|
238
|
+
|
|
239
|
+
sandbox_api = DynamicAnalysisApi(client)
|
|
240
|
+
sandbox_res = sandbox_api.sandbox_lookup(sandbox_id)
|
|
241
|
+
print('Verdict:', sandbox_res.final_verdict)
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### API Key Management
|
|
245
|
+
|
|
246
|
+
```python
|
|
247
|
+
from mcl_platform_sdk.api.apikey_api import ApikeyApi
|
|
248
|
+
|
|
249
|
+
apikey_api = ApikeyApi(client)
|
|
250
|
+
|
|
251
|
+
# Get API key info
|
|
252
|
+
info = apikey_api.get_api_key()
|
|
253
|
+
print('Nickname:', info.nickname)
|
|
254
|
+
|
|
255
|
+
# Check limits
|
|
256
|
+
limits = apikey_api.apikey_limits()
|
|
257
|
+
remaining = apikey_api.apikey_limits_status_get()
|
|
258
|
+
history = apikey_api.apikey_scan_history_get()
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Error Handling
|
|
262
|
+
|
|
263
|
+
```python
|
|
264
|
+
from mcl_platform_sdk.rest import ApiException
|
|
265
|
+
|
|
266
|
+
try:
|
|
267
|
+
result = fs_api.get_file_analysis(data_id)
|
|
268
|
+
except ApiException as e:
|
|
269
|
+
print('Status:', e.status)
|
|
270
|
+
print('Details:', e.body)
|
|
271
|
+
except TimeoutError as e:
|
|
272
|
+
print('Timeout:', e)
|
|
273
|
+
except Exception as e:
|
|
274
|
+
print('Error:', e)
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Example Workflow
|
|
278
|
+
|
|
279
|
+
The SDK includes a comprehensive example script. After installation:
|
|
280
|
+
|
|
281
|
+
```bash
|
|
282
|
+
# Set your API key
|
|
283
|
+
export METADEFENDER_APIKEY="YOUR_API_KEY"
|
|
284
|
+
|
|
285
|
+
# Run the example workflow
|
|
286
|
+
python -m exemples.exemple_all_workflows
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
The example demonstrates:
|
|
290
|
+
- API key validation
|
|
291
|
+
- File upload and scanning
|
|
292
|
+
- Polling for results
|
|
293
|
+
- Sanitized file retrieval
|
|
294
|
+
- Hash lookups
|
|
295
|
+
- IP/Domain/URL reputation checks
|
|
296
|
+
|
|
297
|
+
## For maintainers: build and publish
|
|
298
|
+
|
|
299
|
+
To build the package and publish to PyPI, see **[docs/PUBLISHING.md](docs/PUBLISHING.md)** for the full build and deploy process.
|
|
300
|
+
|
|
301
|
+
To regenerate the client from OpenAPI Generator, use **`packageName=mcl_platform_sdk`** . See **[docs/REGENERATING_CLIENT.md](docs/REGENERATING_CLIENT.md)**.
|
|
302
|
+
|
|
303
|
+
## License
|
|
304
|
+
|
|
305
|
+
MIT License - see [LICENSE.md](LICENSE.md) for details.
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
# MetaDefender Python SDK
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/mcl-platform-sdk/)
|
|
4
|
+
[](LICENSE.md)
|
|
5
|
+
|
|
6
|
+
Python SDK for MetaDefender Cloud - file scanning, threat detection, and CDR with 20+ anti-malware engines.
|
|
7
|
+
|
|
8
|
+
## Versions
|
|
9
|
+
|
|
10
|
+
- API version: `4.0`
|
|
11
|
+
- SDK version: `1.0.0`
|
|
12
|
+
|
|
13
|
+
## About the API
|
|
14
|
+
|
|
15
|
+
MetaDefender SDK provides an interface for interacting with MetaDefender Cloud and Core services. It enables file analysis with 20+ anti-malware engines, Deep Content Disarm and Reconstruction (CDR), sandbox analysis, and more.
|
|
16
|
+
|
|
17
|
+
### Key Features of MetaDefender Cloud
|
|
18
|
+
|
|
19
|
+
- **File Analysis** – Scan files using 20+ anti-malware engines
|
|
20
|
+
- **Deep CDR** – Supports sanitization of 100+ file types
|
|
21
|
+
- **Sandbox Analysis** – Detects unknown and targeted attacks through dynamic analysis
|
|
22
|
+
|
|
23
|
+
## Maintainer: publish to Test PyPI
|
|
24
|
+
|
|
25
|
+
Build and upload with a Test PyPI API token (non-interactive):
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
python -m pip install build twine && python -m build
|
|
29
|
+
export TWINE_USERNAME=__token__
|
|
30
|
+
export TWINE_PASSWORD=pypi-your-testpypi-token
|
|
31
|
+
twine upload --repository-url https://test.pypi.org/legacy/ dist/*
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
See **[docs/PUBLISHING.md](docs/PUBLISHING.md)** for details and production PyPI.
|
|
35
|
+
|
|
36
|
+
## Table of Contents
|
|
37
|
+
|
|
38
|
+
- [Versions](#versions)
|
|
39
|
+
- [About the API](#about-the-api)
|
|
40
|
+
- [Setup & Configuration](#setup--configuration)
|
|
41
|
+
- [Supported Python Versions](#supported-python-versions)
|
|
42
|
+
- [Installation](#installation)
|
|
43
|
+
- [Authentication](#authentication)
|
|
44
|
+
- [Basic Usage](#basic-usage)
|
|
45
|
+
- [API Services](#api-services)
|
|
46
|
+
- [File Scanning](#file-scanning)
|
|
47
|
+
- [Data Sanitization (CDR)](#data-sanitization-cdr)
|
|
48
|
+
- [Hash Lookups](#hash-lookups)
|
|
49
|
+
- [Reputation Service](#reputation-service)
|
|
50
|
+
- [Dynamic Analysis (Sandbox)](#dynamic-analysis-sandbox)
|
|
51
|
+
- [API Key Management](#api-key-management)
|
|
52
|
+
- [Error Handling](#error-handling)
|
|
53
|
+
- [Example Workflow](#example-workflow)
|
|
54
|
+
- [License](#license)
|
|
55
|
+
|
|
56
|
+
## Setup & Configuration
|
|
57
|
+
|
|
58
|
+
### Supported Python Versions
|
|
59
|
+
|
|
60
|
+
This SDK is compatible with the following versions:
|
|
61
|
+
- Python 3.9 or higher
|
|
62
|
+
- pip package manager
|
|
63
|
+
|
|
64
|
+
## Installation
|
|
65
|
+
|
|
66
|
+
Install the SDK using pip:
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
pip install mcl-platform-sdk
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
**Requirements:** Python 3.9 or higher
|
|
73
|
+
|
|
74
|
+
**Import name:** After install, import the SDK as **`mcl_platform_sdk`**:
|
|
75
|
+
|
|
76
|
+
```python
|
|
77
|
+
from mcl_platform_sdk import ApiClient
|
|
78
|
+
from mcl_platform_sdk.api.file_scanning_api import FileScanningApi
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Authentication
|
|
82
|
+
|
|
83
|
+
Set your API key as an environment variable:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
export METADEFENDER_APIKEY="YOUR_API_KEY_HERE"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
The SDK automatically reads from `METADEFENDER_APIKEY`. Alternatively, pass it directly:
|
|
90
|
+
|
|
91
|
+
```python
|
|
92
|
+
from mcl_platform_sdk import ApiClient
|
|
93
|
+
|
|
94
|
+
config = ApiClient(api_key="YOUR_API_KEY")
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The ApiClient automatically reads the API key from the METADEFENDER_APIKEY environment variable.
|
|
98
|
+
|
|
99
|
+
### Optional parameters (`headers` options bag)
|
|
100
|
+
|
|
101
|
+
All SDK methods keep only **required** path/body parameters in the function signature.
|
|
102
|
+
All **optional request parameters** (both HTTP headers *and* query parameters) are passed via:
|
|
103
|
+
|
|
104
|
+
- `headers: Optional[Dict[str, Any]] = None`
|
|
105
|
+
|
|
106
|
+
Example:
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
fs_api.analyze_file(file=data, headers={"filename": "test.pdf", "rule": "sanitize"})
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Basic Usage
|
|
113
|
+
|
|
114
|
+
```python
|
|
115
|
+
from mcl_platform_sdk import ApiClient
|
|
116
|
+
from mcl_platform_sdk.api.file_scanning_api import FileScanningApi
|
|
117
|
+
|
|
118
|
+
# Initialize client - reads METADEFENDER_APIKEY automatically
|
|
119
|
+
client = ApiClient()
|
|
120
|
+
fs_api = FileScanningApi(client)
|
|
121
|
+
|
|
122
|
+
# Upload and scan file
|
|
123
|
+
with open('test.pdf', 'rb') as f:
|
|
124
|
+
upload = fs_api.analyze_file(
|
|
125
|
+
file=f.read(),
|
|
126
|
+
headers={
|
|
127
|
+
"filename": "test.pdf",
|
|
128
|
+
"rule": "sanitize",
|
|
129
|
+
}
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
# Poll for results with automatic timeout (configured via headers)
|
|
133
|
+
try:
|
|
134
|
+
result = fs_api.get_file_analysis(
|
|
135
|
+
upload.data_id,
|
|
136
|
+
headers={
|
|
137
|
+
"timeout": 60,
|
|
138
|
+
"poll_interval": 2, # seconds (optional)
|
|
139
|
+
},
|
|
140
|
+
)
|
|
141
|
+
print('Scan result:', result.scan_results.scan_all_result_a)
|
|
142
|
+
except TimeoutError:
|
|
143
|
+
print('Scan failed to complete in 60 seconds')
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## API Services
|
|
147
|
+
|
|
148
|
+
### File Scanning
|
|
149
|
+
|
|
150
|
+
```python
|
|
151
|
+
from mcl_platform_sdk.api.file_scanning_api import FileScanningApi
|
|
152
|
+
|
|
153
|
+
fs_api = FileScanningApi(client)
|
|
154
|
+
|
|
155
|
+
# Upload file
|
|
156
|
+
with open('file.pdf', 'rb') as f:
|
|
157
|
+
upload = fs_api.analyze_file(
|
|
158
|
+
file=f.read(),
|
|
159
|
+
headers={
|
|
160
|
+
"filename": "file.pdf",
|
|
161
|
+
"rule": "sanitize", # Options: multiscan, sanitize, cdr, unarchive, dlp
|
|
162
|
+
}
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
# Poll for scan completion (recommended)
|
|
166
|
+
try:
|
|
167
|
+
result = fs_api.get_file_analysis(upload.data_id, headers={"timeout": 60})
|
|
168
|
+
print('Scan completed:', result.scan_results.scan_all_result_a)
|
|
169
|
+
except TimeoutError:
|
|
170
|
+
print('Scan failed to complete in 60 seconds')
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### Data Sanitization (CDR)
|
|
174
|
+
|
|
175
|
+
```python
|
|
176
|
+
from mcl_platform_sdk.api.data_sanitization_cdr_api import DataSanitizationCDRApi
|
|
177
|
+
|
|
178
|
+
cdr_api = DataSanitizationCDRApi(client)
|
|
179
|
+
|
|
180
|
+
# Get sanitized file URL
|
|
181
|
+
sanitized = cdr_api.file_sanitized(data_id)
|
|
182
|
+
print('Download URL:', sanitized.sanitized_file_path)
|
|
183
|
+
|
|
184
|
+
# Cleanup
|
|
185
|
+
cdr_api.file_converted_data_id_delete(data_id)
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Hash Lookups
|
|
189
|
+
|
|
190
|
+
```python
|
|
191
|
+
from mcl_platform_sdk.api.hash_lookups_api import HashLookupsApi
|
|
192
|
+
|
|
193
|
+
hash_api = HashLookupsApi(client)
|
|
194
|
+
result = hash_api.hash_lookup('640CCA22FBF439406BA200EEFB9C52BE87BC97D6')
|
|
195
|
+
print('Hash lookup result:', result)
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Reputation Service
|
|
199
|
+
|
|
200
|
+
```python
|
|
201
|
+
from mcl_platform_sdk.api.reputation_service_api import ReputationServiceApi
|
|
202
|
+
|
|
203
|
+
rep_api = ReputationServiceApi(client)
|
|
204
|
+
|
|
205
|
+
# Check IP, domain, or URL reputation
|
|
206
|
+
ip_rep = rep_api.i_p_lookup(observable_ip='198.15.127.171')
|
|
207
|
+
domain_rep = rep_api.domain_lookup(observable_domain='example.com')
|
|
208
|
+
url_rep = rep_api.url_lookup(observable_url='http://suspicious-url.com')
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
### Dynamic Analysis (Sandbox)
|
|
212
|
+
|
|
213
|
+
```python
|
|
214
|
+
from mcl_platform_sdk.api.dynamic_analysis_api import DynamicAnalysisApi
|
|
215
|
+
|
|
216
|
+
sandbox_api = DynamicAnalysisApi(client)
|
|
217
|
+
sandbox_res = sandbox_api.sandbox_lookup(sandbox_id)
|
|
218
|
+
print('Verdict:', sandbox_res.final_verdict)
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### API Key Management
|
|
222
|
+
|
|
223
|
+
```python
|
|
224
|
+
from mcl_platform_sdk.api.apikey_api import ApikeyApi
|
|
225
|
+
|
|
226
|
+
apikey_api = ApikeyApi(client)
|
|
227
|
+
|
|
228
|
+
# Get API key info
|
|
229
|
+
info = apikey_api.get_api_key()
|
|
230
|
+
print('Nickname:', info.nickname)
|
|
231
|
+
|
|
232
|
+
# Check limits
|
|
233
|
+
limits = apikey_api.apikey_limits()
|
|
234
|
+
remaining = apikey_api.apikey_limits_status_get()
|
|
235
|
+
history = apikey_api.apikey_scan_history_get()
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Error Handling
|
|
239
|
+
|
|
240
|
+
```python
|
|
241
|
+
from mcl_platform_sdk.rest import ApiException
|
|
242
|
+
|
|
243
|
+
try:
|
|
244
|
+
result = fs_api.get_file_analysis(data_id)
|
|
245
|
+
except ApiException as e:
|
|
246
|
+
print('Status:', e.status)
|
|
247
|
+
print('Details:', e.body)
|
|
248
|
+
except TimeoutError as e:
|
|
249
|
+
print('Timeout:', e)
|
|
250
|
+
except Exception as e:
|
|
251
|
+
print('Error:', e)
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
## Example Workflow
|
|
255
|
+
|
|
256
|
+
The SDK includes a comprehensive example script. After installation:
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
# Set your API key
|
|
260
|
+
export METADEFENDER_APIKEY="YOUR_API_KEY"
|
|
261
|
+
|
|
262
|
+
# Run the example workflow
|
|
263
|
+
python -m exemples.exemple_all_workflows
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
The example demonstrates:
|
|
267
|
+
- API key validation
|
|
268
|
+
- File upload and scanning
|
|
269
|
+
- Polling for results
|
|
270
|
+
- Sanitized file retrieval
|
|
271
|
+
- Hash lookups
|
|
272
|
+
- IP/Domain/URL reputation checks
|
|
273
|
+
|
|
274
|
+
## For maintainers: build and publish
|
|
275
|
+
|
|
276
|
+
To build the package and publish to PyPI, see **[docs/PUBLISHING.md](docs/PUBLISHING.md)** for the full build and deploy process.
|
|
277
|
+
|
|
278
|
+
To regenerate the client from OpenAPI Generator, use **`packageName=mcl_platform_sdk`** . See **[docs/REGENERATING_CLIENT.md](docs/REGENERATING_CLIENT.md)**.
|
|
279
|
+
|
|
280
|
+
## License
|
|
281
|
+
|
|
282
|
+
MIT License - see [LICENSE.md](LICENSE.md) for details.
|