regscale-cli 6.16.0.0__py3-none-any.whl
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.
Potentially problematic release.
This version of regscale-cli might be problematic. Click here for more details.
- regscale/__init__.py +1 -0
- regscale/airflow/__init__.py +9 -0
- regscale/airflow/azure/__init__.py +9 -0
- regscale/airflow/azure/cli.py +89 -0
- regscale/airflow/azure/upload_dags.py +116 -0
- regscale/airflow/click_dags.py +127 -0
- regscale/airflow/click_mixins.py +82 -0
- regscale/airflow/config.py +25 -0
- regscale/airflow/factories/__init__.py +0 -0
- regscale/airflow/factories/connections.py +58 -0
- regscale/airflow/factories/workflows.py +78 -0
- regscale/airflow/hierarchy.py +88 -0
- regscale/airflow/operators/__init__.py +0 -0
- regscale/airflow/operators/click.py +36 -0
- regscale/airflow/sensors/__init__.py +0 -0
- regscale/airflow/sensors/sql.py +107 -0
- regscale/airflow/sessions/__init__.py +0 -0
- regscale/airflow/sessions/sql/__init__.py +3 -0
- regscale/airflow/sessions/sql/queries.py +64 -0
- regscale/airflow/sessions/sql/sql_server_queries.py +248 -0
- regscale/airflow/tasks/__init__.py +0 -0
- regscale/airflow/tasks/branches.py +22 -0
- regscale/airflow/tasks/cli.py +116 -0
- regscale/airflow/tasks/click.py +73 -0
- regscale/airflow/tasks/debugging.py +9 -0
- regscale/airflow/tasks/groups.py +116 -0
- regscale/airflow/tasks/init.py +60 -0
- regscale/airflow/tasks/states.py +47 -0
- regscale/airflow/tasks/workflows.py +36 -0
- regscale/ansible/__init__.py +9 -0
- regscale/core/__init__.py +0 -0
- regscale/core/app/__init__.py +3 -0
- regscale/core/app/api.py +571 -0
- regscale/core/app/application.py +665 -0
- regscale/core/app/internal/__init__.py +136 -0
- regscale/core/app/internal/admin_actions.py +230 -0
- regscale/core/app/internal/assessments_editor.py +873 -0
- regscale/core/app/internal/catalog.py +316 -0
- regscale/core/app/internal/comparison.py +459 -0
- regscale/core/app/internal/control_editor.py +571 -0
- regscale/core/app/internal/encrypt.py +79 -0
- regscale/core/app/internal/evidence.py +1240 -0
- regscale/core/app/internal/file_uploads.py +151 -0
- regscale/core/app/internal/healthcheck.py +66 -0
- regscale/core/app/internal/login.py +305 -0
- regscale/core/app/internal/migrations.py +240 -0
- regscale/core/app/internal/model_editor.py +1701 -0
- regscale/core/app/internal/poam_editor.py +632 -0
- regscale/core/app/internal/workflow.py +105 -0
- regscale/core/app/logz.py +74 -0
- regscale/core/app/utils/XMLIR.py +258 -0
- regscale/core/app/utils/__init__.py +0 -0
- regscale/core/app/utils/api_handler.py +358 -0
- regscale/core/app/utils/app_utils.py +1110 -0
- regscale/core/app/utils/catalog_utils/__init__.py +0 -0
- regscale/core/app/utils/catalog_utils/common.py +91 -0
- regscale/core/app/utils/catalog_utils/compare_catalog.py +193 -0
- regscale/core/app/utils/catalog_utils/diagnostic_catalog.py +97 -0
- regscale/core/app/utils/catalog_utils/download_catalog.py +103 -0
- regscale/core/app/utils/catalog_utils/update_catalog.py +718 -0
- regscale/core/app/utils/catalog_utils/update_catalog_v2.py +1378 -0
- regscale/core/app/utils/catalog_utils/update_catalog_v3.py +1272 -0
- regscale/core/app/utils/catalog_utils/update_plans.py +334 -0
- regscale/core/app/utils/file_utils.py +238 -0
- regscale/core/app/utils/parser_utils.py +81 -0
- regscale/core/app/utils/pickle_file_handler.py +57 -0
- regscale/core/app/utils/regscale_utils.py +319 -0
- regscale/core/app/utils/report_utils.py +119 -0
- regscale/core/app/utils/variables.py +226 -0
- regscale/core/decorators.py +31 -0
- regscale/core/lazy_group.py +65 -0
- regscale/core/login.py +63 -0
- regscale/core/server/__init__.py +0 -0
- regscale/core/server/flask_api.py +473 -0
- regscale/core/server/helpers.py +373 -0
- regscale/core/server/rest.py +64 -0
- regscale/core/server/static/css/bootstrap.css +6030 -0
- regscale/core/server/static/css/bootstrap.min.css +6 -0
- regscale/core/server/static/css/main.css +176 -0
- regscale/core/server/static/images/regscale-cli.svg +49 -0
- regscale/core/server/static/images/regscale.svg +38 -0
- regscale/core/server/templates/base.html +74 -0
- regscale/core/server/templates/index.html +43 -0
- regscale/core/server/templates/login.html +28 -0
- regscale/core/server/templates/make_base64.html +22 -0
- regscale/core/server/templates/upload_STIG.html +109 -0
- regscale/core/server/templates/upload_STIG_result.html +26 -0
- regscale/core/server/templates/upload_ssp.html +144 -0
- regscale/core/server/templates/upload_ssp_result.html +128 -0
- regscale/core/static/__init__.py +0 -0
- regscale/core/static/regex.py +14 -0
- regscale/core/utils/__init__.py +117 -0
- regscale/core/utils/click_utils.py +13 -0
- regscale/core/utils/date.py +238 -0
- regscale/core/utils/graphql.py +254 -0
- regscale/core/utils/urls.py +23 -0
- regscale/dev/__init__.py +6 -0
- regscale/dev/analysis.py +454 -0
- regscale/dev/cli.py +235 -0
- regscale/dev/code_gen.py +492 -0
- regscale/dev/dirs.py +69 -0
- regscale/dev/docs.py +384 -0
- regscale/dev/monitoring.py +26 -0
- regscale/dev/profiling.py +216 -0
- regscale/exceptions/__init__.py +4 -0
- regscale/exceptions/license_exception.py +7 -0
- regscale/exceptions/validation_exception.py +9 -0
- regscale/integrations/__init__.py +1 -0
- regscale/integrations/commercial/__init__.py +486 -0
- regscale/integrations/commercial/ad.py +433 -0
- regscale/integrations/commercial/amazon/__init__.py +0 -0
- regscale/integrations/commercial/amazon/common.py +106 -0
- regscale/integrations/commercial/aqua/__init__.py +0 -0
- regscale/integrations/commercial/aqua/aqua.py +91 -0
- regscale/integrations/commercial/aws/__init__.py +6 -0
- regscale/integrations/commercial/aws/cli.py +322 -0
- regscale/integrations/commercial/aws/inventory/__init__.py +110 -0
- regscale/integrations/commercial/aws/inventory/base.py +64 -0
- regscale/integrations/commercial/aws/inventory/resources/__init__.py +19 -0
- regscale/integrations/commercial/aws/inventory/resources/compute.py +234 -0
- regscale/integrations/commercial/aws/inventory/resources/containers.py +113 -0
- regscale/integrations/commercial/aws/inventory/resources/database.py +101 -0
- regscale/integrations/commercial/aws/inventory/resources/integration.py +237 -0
- regscale/integrations/commercial/aws/inventory/resources/networking.py +253 -0
- regscale/integrations/commercial/aws/inventory/resources/security.py +240 -0
- regscale/integrations/commercial/aws/inventory/resources/storage.py +91 -0
- regscale/integrations/commercial/aws/scanner.py +823 -0
- regscale/integrations/commercial/azure/__init__.py +0 -0
- regscale/integrations/commercial/azure/common.py +32 -0
- regscale/integrations/commercial/azure/intune.py +488 -0
- regscale/integrations/commercial/azure/scanner.py +49 -0
- regscale/integrations/commercial/burp.py +78 -0
- regscale/integrations/commercial/cpe.py +144 -0
- regscale/integrations/commercial/crowdstrike.py +1117 -0
- regscale/integrations/commercial/defender.py +1511 -0
- regscale/integrations/commercial/dependabot.py +210 -0
- regscale/integrations/commercial/durosuite/__init__.py +0 -0
- regscale/integrations/commercial/durosuite/api.py +1546 -0
- regscale/integrations/commercial/durosuite/process_devices.py +101 -0
- regscale/integrations/commercial/durosuite/scanner.py +637 -0
- regscale/integrations/commercial/durosuite/variables.py +21 -0
- regscale/integrations/commercial/ecr.py +90 -0
- regscale/integrations/commercial/gcp/__init__.py +237 -0
- regscale/integrations/commercial/gcp/auth.py +96 -0
- regscale/integrations/commercial/gcp/control_tests.py +238 -0
- regscale/integrations/commercial/gcp/variables.py +18 -0
- regscale/integrations/commercial/gitlab.py +332 -0
- regscale/integrations/commercial/grype.py +165 -0
- regscale/integrations/commercial/ibm.py +90 -0
- regscale/integrations/commercial/import_all/__init__.py +0 -0
- regscale/integrations/commercial/import_all/import_all_cmd.py +467 -0
- regscale/integrations/commercial/import_all/scan_file_fingerprints.json +27 -0
- regscale/integrations/commercial/jira.py +1046 -0
- regscale/integrations/commercial/mappings/__init__.py +0 -0
- regscale/integrations/commercial/mappings/csf_controls.json +713 -0
- regscale/integrations/commercial/mappings/nist_800_53_r5_controls.json +1516 -0
- regscale/integrations/commercial/nessus/__init__.py +0 -0
- regscale/integrations/commercial/nessus/nessus_utils.py +429 -0
- regscale/integrations/commercial/nessus/scanner.py +416 -0
- regscale/integrations/commercial/nexpose.py +90 -0
- regscale/integrations/commercial/okta.py +798 -0
- regscale/integrations/commercial/opentext/__init__.py +0 -0
- regscale/integrations/commercial/opentext/click.py +99 -0
- regscale/integrations/commercial/opentext/scanner.py +143 -0
- regscale/integrations/commercial/prisma.py +91 -0
- regscale/integrations/commercial/qualys.py +1462 -0
- regscale/integrations/commercial/salesforce.py +980 -0
- regscale/integrations/commercial/sap/__init__.py +0 -0
- regscale/integrations/commercial/sap/click.py +31 -0
- regscale/integrations/commercial/sap/sysdig/__init__.py +0 -0
- regscale/integrations/commercial/sap/sysdig/click.py +57 -0
- regscale/integrations/commercial/sap/sysdig/sysdig_scanner.py +190 -0
- regscale/integrations/commercial/sap/tenable/__init__.py +0 -0
- regscale/integrations/commercial/sap/tenable/click.py +49 -0
- regscale/integrations/commercial/sap/tenable/scanner.py +196 -0
- regscale/integrations/commercial/servicenow.py +1756 -0
- regscale/integrations/commercial/sicura/__init__.py +0 -0
- regscale/integrations/commercial/sicura/api.py +855 -0
- regscale/integrations/commercial/sicura/commands.py +73 -0
- regscale/integrations/commercial/sicura/scanner.py +481 -0
- regscale/integrations/commercial/sicura/variables.py +16 -0
- regscale/integrations/commercial/snyk.py +90 -0
- regscale/integrations/commercial/sonarcloud.py +260 -0
- regscale/integrations/commercial/sqlserver.py +369 -0
- regscale/integrations/commercial/stig_mapper_integration/__init__.py +0 -0
- regscale/integrations/commercial/stig_mapper_integration/click_commands.py +38 -0
- regscale/integrations/commercial/stig_mapper_integration/mapping_engine.py +353 -0
- regscale/integrations/commercial/stigv2/__init__.py +0 -0
- regscale/integrations/commercial/stigv2/ckl_parser.py +349 -0
- regscale/integrations/commercial/stigv2/click_commands.py +95 -0
- regscale/integrations/commercial/stigv2/stig_integration.py +202 -0
- regscale/integrations/commercial/synqly/__init__.py +0 -0
- regscale/integrations/commercial/synqly/assets.py +46 -0
- regscale/integrations/commercial/synqly/ticketing.py +132 -0
- regscale/integrations/commercial/synqly/vulnerabilities.py +223 -0
- regscale/integrations/commercial/synqly_jira.py +840 -0
- regscale/integrations/commercial/tenablev2/__init__.py +0 -0
- regscale/integrations/commercial/tenablev2/authenticate.py +31 -0
- regscale/integrations/commercial/tenablev2/click.py +1584 -0
- regscale/integrations/commercial/tenablev2/scanner.py +504 -0
- regscale/integrations/commercial/tenablev2/stig_parsers.py +140 -0
- regscale/integrations/commercial/tenablev2/utils.py +78 -0
- regscale/integrations/commercial/tenablev2/variables.py +17 -0
- regscale/integrations/commercial/trivy.py +162 -0
- regscale/integrations/commercial/veracode.py +96 -0
- regscale/integrations/commercial/wizv2/WizDataMixin.py +97 -0
- regscale/integrations/commercial/wizv2/__init__.py +0 -0
- regscale/integrations/commercial/wizv2/click.py +429 -0
- regscale/integrations/commercial/wizv2/constants.py +1001 -0
- regscale/integrations/commercial/wizv2/issue.py +361 -0
- regscale/integrations/commercial/wizv2/models.py +112 -0
- regscale/integrations/commercial/wizv2/parsers.py +339 -0
- regscale/integrations/commercial/wizv2/sbom.py +115 -0
- regscale/integrations/commercial/wizv2/scanner.py +416 -0
- regscale/integrations/commercial/wizv2/utils.py +796 -0
- regscale/integrations/commercial/wizv2/variables.py +39 -0
- regscale/integrations/commercial/wizv2/wiz_auth.py +159 -0
- regscale/integrations/commercial/xray.py +91 -0
- regscale/integrations/integration/__init__.py +2 -0
- regscale/integrations/integration/integration.py +26 -0
- regscale/integrations/integration/inventory.py +17 -0
- regscale/integrations/integration/issue.py +100 -0
- regscale/integrations/integration_override.py +149 -0
- regscale/integrations/public/__init__.py +103 -0
- regscale/integrations/public/cisa.py +641 -0
- regscale/integrations/public/criticality_updater.py +70 -0
- regscale/integrations/public/emass.py +411 -0
- regscale/integrations/public/emass_slcm_import.py +697 -0
- regscale/integrations/public/fedramp/__init__.py +0 -0
- regscale/integrations/public/fedramp/appendix_parser.py +548 -0
- regscale/integrations/public/fedramp/click.py +479 -0
- regscale/integrations/public/fedramp/components.py +714 -0
- regscale/integrations/public/fedramp/docx_parser.py +259 -0
- regscale/integrations/public/fedramp/fedramp_cis_crm.py +1124 -0
- regscale/integrations/public/fedramp/fedramp_common.py +3181 -0
- regscale/integrations/public/fedramp/fedramp_docx.py +388 -0
- regscale/integrations/public/fedramp/fedramp_five.py +2343 -0
- regscale/integrations/public/fedramp/fedramp_traversal.py +138 -0
- regscale/integrations/public/fedramp/import_fedramp_r4_ssp.py +279 -0
- regscale/integrations/public/fedramp/import_workbook.py +495 -0
- regscale/integrations/public/fedramp/inventory_items.py +244 -0
- regscale/integrations/public/fedramp/mappings/__init__.py +0 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r4_parts.json +7388 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r5_params.json +8636 -0
- regscale/integrations/public/fedramp/mappings/fedramp_r5_parts.json +9605 -0
- regscale/integrations/public/fedramp/mappings/system_roles.py +34 -0
- regscale/integrations/public/fedramp/mappings/user.py +175 -0
- regscale/integrations/public/fedramp/mappings/values.py +141 -0
- regscale/integrations/public/fedramp/markdown_parser.py +150 -0
- regscale/integrations/public/fedramp/metadata.py +689 -0
- regscale/integrations/public/fedramp/models/__init__.py +59 -0
- regscale/integrations/public/fedramp/models/leveraged_auth_new.py +168 -0
- regscale/integrations/public/fedramp/models/poam_importer.py +522 -0
- regscale/integrations/public/fedramp/parts_mapper.py +107 -0
- regscale/integrations/public/fedramp/poam/__init__.py +0 -0
- regscale/integrations/public/fedramp/poam/scanner.py +851 -0
- regscale/integrations/public/fedramp/properties.py +201 -0
- regscale/integrations/public/fedramp/reporting.py +84 -0
- regscale/integrations/public/fedramp/resources.py +496 -0
- regscale/integrations/public/fedramp/rosetta.py +110 -0
- regscale/integrations/public/fedramp/ssp_logger.py +87 -0
- regscale/integrations/public/fedramp/system_characteristics.py +922 -0
- regscale/integrations/public/fedramp/system_control_implementations.py +582 -0
- regscale/integrations/public/fedramp/system_implementation.py +190 -0
- regscale/integrations/public/fedramp/xml_utils.py +87 -0
- regscale/integrations/public/nist_catalog.py +275 -0
- regscale/integrations/public/oscal.py +1946 -0
- regscale/integrations/public/otx.py +169 -0
- regscale/integrations/scanner_integration.py +2692 -0
- regscale/integrations/variables.py +25 -0
- regscale/models/__init__.py +7 -0
- regscale/models/app_models/__init__.py +5 -0
- regscale/models/app_models/catalog_compare.py +213 -0
- regscale/models/app_models/click.py +252 -0
- regscale/models/app_models/datetime_encoder.py +21 -0
- regscale/models/app_models/import_validater.py +321 -0
- regscale/models/app_models/mapping.py +260 -0
- regscale/models/app_models/pipeline.py +37 -0
- regscale/models/click_models.py +413 -0
- regscale/models/config.py +154 -0
- regscale/models/email_style.css +67 -0
- regscale/models/hierarchy.py +8 -0
- regscale/models/inspect_models.py +79 -0
- regscale/models/integration_models/__init__.py +0 -0
- regscale/models/integration_models/amazon_models/__init__.py +0 -0
- regscale/models/integration_models/amazon_models/inspector.py +262 -0
- regscale/models/integration_models/amazon_models/inspector_scan.py +206 -0
- regscale/models/integration_models/aqua.py +247 -0
- regscale/models/integration_models/azure_alerts.py +255 -0
- regscale/models/integration_models/base64.py +23 -0
- regscale/models/integration_models/burp.py +433 -0
- regscale/models/integration_models/burp_models.py +128 -0
- regscale/models/integration_models/cisa_kev_data.json +19333 -0
- regscale/models/integration_models/defender_data.py +93 -0
- regscale/models/integration_models/defenderimport.py +143 -0
- regscale/models/integration_models/drf.py +443 -0
- regscale/models/integration_models/ecr_models/__init__.py +0 -0
- regscale/models/integration_models/ecr_models/data.py +69 -0
- regscale/models/integration_models/ecr_models/ecr.py +239 -0
- regscale/models/integration_models/flat_file_importer.py +1079 -0
- regscale/models/integration_models/grype_import.py +247 -0
- regscale/models/integration_models/ibm.py +126 -0
- regscale/models/integration_models/implementation_results.py +85 -0
- regscale/models/integration_models/nexpose.py +140 -0
- regscale/models/integration_models/prisma.py +202 -0
- regscale/models/integration_models/qualys.py +720 -0
- regscale/models/integration_models/qualys_scanner.py +160 -0
- regscale/models/integration_models/sbom/__init__.py +0 -0
- regscale/models/integration_models/sbom/cyclone_dx.py +139 -0
- regscale/models/integration_models/send_reminders.py +620 -0
- regscale/models/integration_models/snyk.py +155 -0
- regscale/models/integration_models/synqly_models/__init__.py +0 -0
- regscale/models/integration_models/synqly_models/capabilities.json +1 -0
- regscale/models/integration_models/synqly_models/connector_types.py +22 -0
- regscale/models/integration_models/synqly_models/connectors/__init__.py +7 -0
- regscale/models/integration_models/synqly_models/connectors/assets.py +97 -0
- regscale/models/integration_models/synqly_models/connectors/ticketing.py +583 -0
- regscale/models/integration_models/synqly_models/connectors/vulnerabilities.py +169 -0
- regscale/models/integration_models/synqly_models/ocsf_mapper.py +331 -0
- regscale/models/integration_models/synqly_models/param.py +72 -0
- regscale/models/integration_models/synqly_models/synqly_model.py +733 -0
- regscale/models/integration_models/synqly_models/tenants.py +39 -0
- regscale/models/integration_models/tenable_models/__init__.py +0 -0
- regscale/models/integration_models/tenable_models/integration.py +187 -0
- regscale/models/integration_models/tenable_models/models.py +513 -0
- regscale/models/integration_models/trivy_import.py +231 -0
- regscale/models/integration_models/veracode.py +217 -0
- regscale/models/integration_models/xray.py +135 -0
- regscale/models/locking.py +100 -0
- regscale/models/platform.py +110 -0
- regscale/models/regscale_models/__init__.py +67 -0
- regscale/models/regscale_models/assessment.py +570 -0
- regscale/models/regscale_models/assessment_plan.py +52 -0
- regscale/models/regscale_models/asset.py +567 -0
- regscale/models/regscale_models/asset_mapping.py +190 -0
- regscale/models/regscale_models/case.py +42 -0
- regscale/models/regscale_models/catalog.py +261 -0
- regscale/models/regscale_models/cci.py +46 -0
- regscale/models/regscale_models/change.py +167 -0
- regscale/models/regscale_models/checklist.py +372 -0
- regscale/models/regscale_models/comment.py +49 -0
- regscale/models/regscale_models/compliance_settings.py +112 -0
- regscale/models/regscale_models/component.py +412 -0
- regscale/models/regscale_models/component_mapping.py +65 -0
- regscale/models/regscale_models/control.py +38 -0
- regscale/models/regscale_models/control_implementation.py +1128 -0
- regscale/models/regscale_models/control_objective.py +261 -0
- regscale/models/regscale_models/control_parameter.py +100 -0
- regscale/models/regscale_models/control_test.py +34 -0
- regscale/models/regscale_models/control_test_plan.py +75 -0
- regscale/models/regscale_models/control_test_result.py +52 -0
- regscale/models/regscale_models/custom_field.py +245 -0
- regscale/models/regscale_models/data.py +109 -0
- regscale/models/regscale_models/data_center.py +40 -0
- regscale/models/regscale_models/deviation.py +203 -0
- regscale/models/regscale_models/email.py +97 -0
- regscale/models/regscale_models/evidence.py +47 -0
- regscale/models/regscale_models/evidence_mapping.py +40 -0
- regscale/models/regscale_models/facility.py +59 -0
- regscale/models/regscale_models/file.py +382 -0
- regscale/models/regscale_models/filetag.py +37 -0
- regscale/models/regscale_models/form_field_value.py +94 -0
- regscale/models/regscale_models/group.py +169 -0
- regscale/models/regscale_models/implementation_objective.py +335 -0
- regscale/models/regscale_models/implementation_option.py +275 -0
- regscale/models/regscale_models/implementation_role.py +33 -0
- regscale/models/regscale_models/incident.py +177 -0
- regscale/models/regscale_models/interconnection.py +43 -0
- regscale/models/regscale_models/issue.py +1176 -0
- regscale/models/regscale_models/leveraged_authorization.py +125 -0
- regscale/models/regscale_models/line_of_inquiry.py +52 -0
- regscale/models/regscale_models/link.py +205 -0
- regscale/models/regscale_models/meta_data.py +64 -0
- regscale/models/regscale_models/mixins/__init__.py +0 -0
- regscale/models/regscale_models/mixins/parent_cache.py +124 -0
- regscale/models/regscale_models/module.py +224 -0
- regscale/models/regscale_models/modules.py +191 -0
- regscale/models/regscale_models/objective.py +14 -0
- regscale/models/regscale_models/parameter.py +87 -0
- regscale/models/regscale_models/ports_protocol.py +81 -0
- regscale/models/regscale_models/privacy.py +89 -0
- regscale/models/regscale_models/profile.py +50 -0
- regscale/models/regscale_models/profile_link.py +68 -0
- regscale/models/regscale_models/profile_mapping.py +124 -0
- regscale/models/regscale_models/project.py +63 -0
- regscale/models/regscale_models/property.py +278 -0
- regscale/models/regscale_models/question.py +85 -0
- regscale/models/regscale_models/questionnaire.py +87 -0
- regscale/models/regscale_models/questionnaire_instance.py +177 -0
- regscale/models/regscale_models/rbac.py +132 -0
- regscale/models/regscale_models/reference.py +86 -0
- regscale/models/regscale_models/regscale_model.py +1643 -0
- regscale/models/regscale_models/requirement.py +29 -0
- regscale/models/regscale_models/risk.py +274 -0
- regscale/models/regscale_models/sbom.py +54 -0
- regscale/models/regscale_models/scan_history.py +436 -0
- regscale/models/regscale_models/search.py +53 -0
- regscale/models/regscale_models/security_control.py +132 -0
- regscale/models/regscale_models/security_plan.py +204 -0
- regscale/models/regscale_models/software_inventory.py +159 -0
- regscale/models/regscale_models/stake_holder.py +64 -0
- regscale/models/regscale_models/stig.py +647 -0
- regscale/models/regscale_models/supply_chain.py +152 -0
- regscale/models/regscale_models/system_role.py +188 -0
- regscale/models/regscale_models/system_role_external_assignment.py +40 -0
- regscale/models/regscale_models/tag.py +37 -0
- regscale/models/regscale_models/tag_mapping.py +19 -0
- regscale/models/regscale_models/task.py +133 -0
- regscale/models/regscale_models/threat.py +196 -0
- regscale/models/regscale_models/user.py +175 -0
- regscale/models/regscale_models/user_group.py +55 -0
- regscale/models/regscale_models/vulnerability.py +242 -0
- regscale/models/regscale_models/vulnerability_mapping.py +162 -0
- regscale/models/regscale_models/workflow.py +55 -0
- regscale/models/regscale_models/workflow_action.py +34 -0
- regscale/models/regscale_models/workflow_instance.py +269 -0
- regscale/models/regscale_models/workflow_instance_step.py +114 -0
- regscale/models/regscale_models/workflow_template.py +58 -0
- regscale/models/regscale_models/workflow_template_step.py +45 -0
- regscale/regscale.py +815 -0
- regscale/utils/__init__.py +7 -0
- regscale/utils/b64conversion.py +14 -0
- regscale/utils/click_utils.py +118 -0
- regscale/utils/decorators.py +48 -0
- regscale/utils/dict_utils.py +59 -0
- regscale/utils/files.py +79 -0
- regscale/utils/fxns.py +30 -0
- regscale/utils/graphql_client.py +113 -0
- regscale/utils/lists.py +16 -0
- regscale/utils/numbers.py +12 -0
- regscale/utils/shell.py +148 -0
- regscale/utils/string.py +121 -0
- regscale/utils/synqly_utils.py +165 -0
- regscale/utils/threading/__init__.py +8 -0
- regscale/utils/threading/threadhandler.py +131 -0
- regscale/utils/threading/threadsafe_counter.py +47 -0
- regscale/utils/threading/threadsafe_dict.py +242 -0
- regscale/utils/threading/threadsafe_list.py +83 -0
- regscale/utils/version.py +104 -0
- regscale/validation/__init__.py +0 -0
- regscale/validation/address.py +37 -0
- regscale/validation/record.py +48 -0
- regscale/visualization/__init__.py +5 -0
- regscale/visualization/click.py +34 -0
- regscale_cli-6.16.0.0.dist-info/LICENSE +21 -0
- regscale_cli-6.16.0.0.dist-info/METADATA +659 -0
- regscale_cli-6.16.0.0.dist-info/RECORD +481 -0
- regscale_cli-6.16.0.0.dist-info/WHEEL +5 -0
- regscale_cli-6.16.0.0.dist-info/entry_points.txt +6 -0
- regscale_cli-6.16.0.0.dist-info/top_level.txt +2 -0
- tests/fixtures/__init__.py +2 -0
- tests/fixtures/api.py +87 -0
- tests/fixtures/models.py +91 -0
- tests/fixtures/test_fixture.py +144 -0
- tests/mocks/__init__.py +0 -0
- tests/mocks/objects.py +3 -0
- tests/mocks/response.py +32 -0
- tests/mocks/xml.py +13 -0
- tests/regscale/__init__.py +0 -0
- tests/regscale/core/__init__.py +0 -0
- tests/regscale/core/test_api.py +232 -0
- tests/regscale/core/test_app.py +406 -0
- tests/regscale/core/test_login.py +37 -0
- tests/regscale/core/test_logz.py +66 -0
- tests/regscale/core/test_sbom_generator.py +87 -0
- tests/regscale/core/test_validation_utils.py +163 -0
- tests/regscale/core/test_version.py +78 -0
- tests/regscale/models/__init__.py +0 -0
- tests/regscale/models/test_asset.py +71 -0
- tests/regscale/models/test_config.py +26 -0
- tests/regscale/models/test_control_implementation.py +27 -0
- tests/regscale/models/test_import.py +97 -0
- tests/regscale/models/test_issue.py +36 -0
- tests/regscale/models/test_mapping.py +52 -0
- tests/regscale/models/test_platform.py +31 -0
- tests/regscale/models/test_regscale_model.py +346 -0
- tests/regscale/models/test_report.py +32 -0
- tests/regscale/models/test_tenable_integrations.py +118 -0
- tests/regscale/models/test_user_model.py +121 -0
- tests/regscale/test_about.py +19 -0
- tests/regscale/test_authorization.py +65 -0
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"""This module contains the SSPDocParser class,
|
|
2
|
+
which is used to parse an SSP .docx file and return a list of dictionaries representing the table data.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
import zipfile
|
|
7
|
+
from collections import defaultdict
|
|
8
|
+
from typing import Dict, List, Any
|
|
9
|
+
|
|
10
|
+
import docx
|
|
11
|
+
import lxml.etree as etree
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class SSPDocParser:
|
|
15
|
+
"""
|
|
16
|
+
Parses an SSP .docx file and returns a list of dictionaries representing the table data.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
docx_path: str
|
|
20
|
+
xml_content: bytes
|
|
21
|
+
tables: List
|
|
22
|
+
text: Dict
|
|
23
|
+
|
|
24
|
+
def __init__(self, docx_path):
|
|
25
|
+
self.docx_path = docx_path
|
|
26
|
+
self.doc = docx.Document(self.docx_path)
|
|
27
|
+
|
|
28
|
+
def parse(self) -> List[Dict]:
|
|
29
|
+
"""
|
|
30
|
+
Parses the .docx file and returns a list of dictionaries representing the table data.
|
|
31
|
+
:return: A list of dictionaries, each representing a table's data.
|
|
32
|
+
:rtype: List[Dict]
|
|
33
|
+
"""
|
|
34
|
+
self.tables = self.parse_xml_for_tables(self.docx_to_xml(self.docx_path))
|
|
35
|
+
self.text = self.group_paragraphs_by_headings()
|
|
36
|
+
return self.tables
|
|
37
|
+
|
|
38
|
+
def get_figure_captions(self) -> Dict:
|
|
39
|
+
"""
|
|
40
|
+
Fetches the figure captions from the .docx file.
|
|
41
|
+
BETA: This method is still in development and may not work as expected.
|
|
42
|
+
:return: A dictionary mapping image blobs to their captions.
|
|
43
|
+
:rtype: Dict
|
|
44
|
+
"""
|
|
45
|
+
doc = self.doc
|
|
46
|
+
captions = {}
|
|
47
|
+
# Iterate through all the paragraphs to find the figure captions
|
|
48
|
+
for paragraph in doc.paragraphs:
|
|
49
|
+
# Check if the paragraph contains an image
|
|
50
|
+
if "graphicData" in paragraph._element.xml:
|
|
51
|
+
# Image found, now find the subsequent paragraphs for the caption
|
|
52
|
+
next_paragraph = paragraph._element.getnext()
|
|
53
|
+
while next_paragraph is not None and next_paragraph.tag.endswith("p"):
|
|
54
|
+
text = next_paragraph.text.strip()
|
|
55
|
+
if text.startswith("Figure"):
|
|
56
|
+
# Found the caption, map it to the image blob
|
|
57
|
+
r_id = paragraph._element.xpath(".//a:blip/@r:embed")[0]
|
|
58
|
+
captions[r_id] = text
|
|
59
|
+
break
|
|
60
|
+
next_paragraph = next_paragraph.getnext()
|
|
61
|
+
|
|
62
|
+
return captions
|
|
63
|
+
|
|
64
|
+
def group_paragraphs_by_headings(self) -> Dict:
|
|
65
|
+
"""
|
|
66
|
+
Groups the paragraphs in the .docx file by their headings.
|
|
67
|
+
:return: A dictionary mapping headings to their paragraphs.
|
|
68
|
+
:rtype: Dict
|
|
69
|
+
"""
|
|
70
|
+
grouped_text = defaultdict(list)
|
|
71
|
+
current_heading = None
|
|
72
|
+
|
|
73
|
+
for para in self.doc.paragraphs:
|
|
74
|
+
# Check if the paragraph is a heading based on its style
|
|
75
|
+
if para.style.name.startswith("Heading"):
|
|
76
|
+
# A new heading is encountered; update the current heading variable
|
|
77
|
+
current_heading = para.text
|
|
78
|
+
elif current_heading:
|
|
79
|
+
# Add the paragraph text under the current heading key
|
|
80
|
+
grouped_text[current_heading].append(para.text)
|
|
81
|
+
# Note: Paragraphs before the first heading won't be included
|
|
82
|
+
|
|
83
|
+
return dict(grouped_text)
|
|
84
|
+
|
|
85
|
+
@staticmethod
|
|
86
|
+
def docx_to_xml(docx_path: str) -> bytes:
|
|
87
|
+
"""
|
|
88
|
+
Converts a .docx file to XML.
|
|
89
|
+
:param str docx_path: The path to the .docx file.
|
|
90
|
+
:return: The XML content of the .docx file.
|
|
91
|
+
:rtype: bytes
|
|
92
|
+
"""
|
|
93
|
+
with zipfile.ZipFile(docx_path, "r") as docx_zip:
|
|
94
|
+
xml_content = docx_zip.read("word/document.xml")
|
|
95
|
+
return xml_content
|
|
96
|
+
|
|
97
|
+
@staticmethod
|
|
98
|
+
def parse_checkbox_string(text: str) -> List[Dict]:
|
|
99
|
+
"""
|
|
100
|
+
Parses a string like "Implementation Status (check all that apply): ☒ Implemented ..." and returns a list of dictionaries.
|
|
101
|
+
|
|
102
|
+
:param str text: The text to parse.
|
|
103
|
+
:return: A list of dictionaries, each representing a status option and its status.
|
|
104
|
+
:rtype: List[Dict]
|
|
105
|
+
"""
|
|
106
|
+
|
|
107
|
+
# Regular expression pattern to match status options change .*? to [^☒☐]* to match any character except ☒ and ☐
|
|
108
|
+
pattern = r"([☒☐]\s*([^☒☐]*))(?=[☒☐]|$)"
|
|
109
|
+
|
|
110
|
+
# Find all non-overlapping matches with the pattern
|
|
111
|
+
matches = re.findall(pattern, text)
|
|
112
|
+
|
|
113
|
+
# Process matches and create dictionaries
|
|
114
|
+
dict_list = []
|
|
115
|
+
for match in matches:
|
|
116
|
+
status_indicator, option_text = match
|
|
117
|
+
dict_list.append({option_text.strip(): status_indicator.startswith("☒")})
|
|
118
|
+
|
|
119
|
+
return dict_list
|
|
120
|
+
|
|
121
|
+
def parse_xml_for_tables(self, xml_content: bytes) -> List[Dict]:
|
|
122
|
+
"""
|
|
123
|
+
Parses the XML content for tables and returns a list of dictionaries representing the table data.
|
|
124
|
+
|
|
125
|
+
:param bytes xml_content: The XML content to parse.
|
|
126
|
+
:return: A list of dictionaries, each representing a table's data.
|
|
127
|
+
:rtype: List[Dict]
|
|
128
|
+
"""
|
|
129
|
+
# Parse the XML content
|
|
130
|
+
tree = etree.ElementTree(etree.fromstring(xml_content))
|
|
131
|
+
root = tree.getroot()
|
|
132
|
+
|
|
133
|
+
# Define namespace map to handle XML namespaces
|
|
134
|
+
namespaces = {
|
|
135
|
+
"w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main", # noqa
|
|
136
|
+
"w14": "http://schemas.microsoft.com/office/word/2010/wordml", # noqa
|
|
137
|
+
"w15": "http://schemas.microsoft.com/office/word/2012/wordml", # noqa
|
|
138
|
+
}
|
|
139
|
+
return self.parse_tables(root, namespaces)
|
|
140
|
+
|
|
141
|
+
@staticmethod
|
|
142
|
+
def extract_table_headers(table: Any, namespaces: Any) -> List:
|
|
143
|
+
"""
|
|
144
|
+
Extracts headers from a table.
|
|
145
|
+
|
|
146
|
+
:param Any table: The table element to extract headers from.
|
|
147
|
+
:param Any namespaces: The XML namespaces.
|
|
148
|
+
:return: A list of headers.
|
|
149
|
+
:rtype: List
|
|
150
|
+
"""
|
|
151
|
+
headers = []
|
|
152
|
+
for cell in table.findall(".//w:tr[1]//w:tc", namespaces):
|
|
153
|
+
cell_text = "".join(node.text for node in cell.findall(".//w:t", namespaces) if node.text)
|
|
154
|
+
headers.append(cell_text.strip() if cell_text else "")
|
|
155
|
+
return headers
|
|
156
|
+
|
|
157
|
+
@staticmethod
|
|
158
|
+
def fetch_cell_text(cell: any, namespaces: any) -> str:
|
|
159
|
+
"""
|
|
160
|
+
Fetches the text from a table cell.
|
|
161
|
+
:param any cell: The cell element to fetch text from.
|
|
162
|
+
:param any namespaces: The XML namespaces.
|
|
163
|
+
:return: The text from the cell.
|
|
164
|
+
:rtype: str
|
|
165
|
+
"""
|
|
166
|
+
cell_text = ""
|
|
167
|
+
for para in cell.findall(".//w:p", namespaces):
|
|
168
|
+
texts = ["".join(node.text for node in para.findall(".//w:t", namespaces) if node.text)]
|
|
169
|
+
cell_text += "".join(texts).strip() + " "
|
|
170
|
+
return cell_text
|
|
171
|
+
|
|
172
|
+
def extract_vertical_row_data(self, table: any, namespaces: any) -> List[Dict]:
|
|
173
|
+
"""
|
|
174
|
+
Extracts data from a table organized vertically, with the first cell as the key
|
|
175
|
+
and the second cell as the value.
|
|
176
|
+
|
|
177
|
+
:param any table: The table element to extract data from.
|
|
178
|
+
:param any namespaces: The XML namespaces.
|
|
179
|
+
:return: A list of dictionaries representing the table's data.
|
|
180
|
+
:rtype: List[Dict]
|
|
181
|
+
"""
|
|
182
|
+
dicts_list = []
|
|
183
|
+
for row in table.findall(".//w:tr", namespaces)[1:]:
|
|
184
|
+
cells = row.findall(".//w:tc", namespaces)
|
|
185
|
+
if len(cells) >= 2:
|
|
186
|
+
vertical_data = {
|
|
187
|
+
self.fetch_cell_text(cells[0], namespaces)
|
|
188
|
+
.strip(): self.fetch_cell_text(cells[1], namespaces)
|
|
189
|
+
.strip()
|
|
190
|
+
}
|
|
191
|
+
dicts_list.append(vertical_data)
|
|
192
|
+
return dicts_list
|
|
193
|
+
|
|
194
|
+
def extract_row_data(self, row: any, headers: any, namespaces: any) -> Dict:
|
|
195
|
+
"""
|
|
196
|
+
Extracts data from a table row.
|
|
197
|
+
|
|
198
|
+
:param any row: The row element to extract data from.
|
|
199
|
+
:param any headers: The headers of the table.
|
|
200
|
+
:param any namespaces: The XML namespaces.
|
|
201
|
+
:return: A dictionary representing the row's data.
|
|
202
|
+
:rtype: Dict
|
|
203
|
+
"""
|
|
204
|
+
row_data = {}
|
|
205
|
+
for header, cell in zip(headers, row.findall(".//w:tc", namespaces)):
|
|
206
|
+
cell_text = self.fetch_cell_text(cell, namespaces)
|
|
207
|
+
if "☒" in cell_text or "☐" in cell_text:
|
|
208
|
+
row_data[header] = self.parse_checkbox_string(cell_text)
|
|
209
|
+
else:
|
|
210
|
+
row_data[header] = cell_text.strip() if cell_text else None
|
|
211
|
+
return row_data
|
|
212
|
+
|
|
213
|
+
def fetch_preceding_text(self) -> List[str]:
|
|
214
|
+
"""
|
|
215
|
+
Fetches the text immediately preceding a table.
|
|
216
|
+
"""
|
|
217
|
+
preceding_texts = []
|
|
218
|
+
for element in self.doc.element.body:
|
|
219
|
+
if element.tag.endswith("tbl"):
|
|
220
|
+
para = element.getprevious()
|
|
221
|
+
text = para.text if para is not None and para.tag.endswith("p") else ""
|
|
222
|
+
preceding_texts.append(text)
|
|
223
|
+
return preceding_texts
|
|
224
|
+
|
|
225
|
+
def parse_tables(self, root: any, namespaces: any) -> List[Dict]:
|
|
226
|
+
"""
|
|
227
|
+
Parses all tables in the XML root.
|
|
228
|
+
|
|
229
|
+
:param any root: The XML root element.
|
|
230
|
+
:param any namespaces: The XML namespaces.
|
|
231
|
+
:return: A list of dictionaries, each representing a table's data.
|
|
232
|
+
:rtype: List[Dict]
|
|
233
|
+
"""
|
|
234
|
+
vertical_tables = [
|
|
235
|
+
"Identification of Organization that Prepared this Document".lower(),
|
|
236
|
+
"Identification of Cloud Service Provider".lower(),
|
|
237
|
+
"System Owner Information".lower(),
|
|
238
|
+
"System Information".lower(),
|
|
239
|
+
"System Component Information".lower(),
|
|
240
|
+
"ISSO (or Equivalent) Point of Contact".lower(),
|
|
241
|
+
]
|
|
242
|
+
tables_list = []
|
|
243
|
+
preceding_text = self.fetch_preceding_text()
|
|
244
|
+
for i, table in enumerate(root.findall(".//w:tbl", namespaces)):
|
|
245
|
+
tables_dicts_list = {}
|
|
246
|
+
headers = self.extract_table_headers(table, namespaces)
|
|
247
|
+
table_data = []
|
|
248
|
+
tables_dicts_list["preceding_text"] = preceding_text[i] if i < len(preceding_text) else ""
|
|
249
|
+
if len(headers) == 1 and headers[0].lower() in vertical_tables:
|
|
250
|
+
table_data = self.extract_vertical_row_data(table, namespaces)
|
|
251
|
+
tables_dicts_list["table_data"] = table_data
|
|
252
|
+
# tables_dicts_list.append({headers[0].lower(): table_data})
|
|
253
|
+
else:
|
|
254
|
+
for row in table.findall(".//w:tr", namespaces)[1:]: # Skip header row
|
|
255
|
+
row_data = self.extract_row_data(row, headers, namespaces)
|
|
256
|
+
table_data.append(row_data)
|
|
257
|
+
tables_dicts_list["table_data"] = table_data
|
|
258
|
+
tables_list.append(tables_dicts_list)
|
|
259
|
+
return tables_list
|