├── .dockerignore ├── .eslintrc ├── .github └── workflows │ └── docker-build.yml ├── .gitignore ├── .gitlab-ci-rules.yml ├── .gitlab-ci.yml ├── .travis.yml ├── Dockerfile ├── LICENSE ├── MANIFEST.in ├── README.rst ├── SECURITY.md ├── accounts ├── __init__.py ├── forms.py ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ └── create_or_restore_scirius_superuser.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20151110_1657.py │ ├── 0003_timezone.py │ ├── 0004_group.py │ ├── 0005_remove_user_flags.py │ ├── 0006_fix_role_default_priority.py │ ├── 0007_auto_20220412_1219.py │ ├── 0008_sciriustokenuser.py │ └── __init__.py ├── models.py ├── rest_api.py ├── south_migrations │ ├── 0001_initial.py │ └── __init__.py ├── tables.py ├── templates │ └── accounts │ │ ├── accounts_list.html │ │ ├── edit.html │ │ ├── group.html │ │ ├── login.html │ │ ├── priorities.html │ │ ├── token_add.html │ │ ├── token_list.html │ │ └── user.html ├── tests.py ├── urls.py └── views.py ├── compose.yaml ├── doc ├── Makefile ├── _theme │ └── scirius │ │ ├── layout.html │ │ ├── static │ │ └── nature.css │ │ └── theme.conf ├── backup-ce.rst ├── conf.py ├── hunt.rst ├── images │ ├── kibana-link.png │ ├── public-sources.png │ ├── rule-detail.png │ ├── rule-page.png │ ├── ruleset.png │ ├── suricata-display.png │ ├── suricata-index.png │ └── suricata-update.png ├── index.rst ├── installation-ce.rst ├── intro-ce.rst ├── local-user-management.rst ├── make.bat ├── ruleset.rst └── suricata-ce.rst ├── docker ├── Arkime │ ├── Dockerfile.arkime │ ├── arkimepcapread-selks-config.ini │ └── start-arkimeviewer.sh ├── LICENSE ├── README.txt ├── configs │ ├── fluentd │ │ ├── fluent.conf │ │ └── template.json │ ├── opensearch │ │ └── opensearch.yml │ └── opensearch_dashboards │ │ └── opensearch_dashboards.yml ├── containers-data │ ├── .gitignore │ ├── cron-jobs │ │ ├── README.md │ │ └── daily │ │ │ ├── scirius-update-suri-rules.sh │ │ │ └── suricata-logrotate.sh │ ├── nginx │ │ ├── conf.d │ │ │ └── selks6.conf │ │ └── nginx.conf │ └── suricata │ │ ├── .gitignore │ │ └── etc │ │ ├── new_entrypoint.sh │ │ └── selks6-addin.yaml ├── fluentd │ └── Dockerfile ├── opensearch-dashboards │ └── Dockerfile ├── scirius │ ├── bin │ │ ├── create_ILM_policy.sh │ │ ├── reset_dashboards.sh │ │ └── start-scirius.sh │ ├── scirius │ │ └── local_settings.py │ └── suricata │ │ └── scripts │ │ └── suri_reloader └── scripts │ ├── cleanup.sh │ └── readpcap.sh ├── manage.py ├── npm ├── npm.scss └── scirius-bundle.js ├── package-lock.json ├── package.json ├── postcss.config.js ├── requirements.txt ├── rules ├── __init__.py ├── backup.py ├── es_analytics.py ├── es_data.py ├── es_graphs.py ├── es_query.py ├── filter_sets.py ├── forms.py ├── hunt_webpack.py ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ ├── addsource.py │ │ ├── defaultruleset.py │ │ ├── delsource.py │ │ ├── disablecategory.py │ │ ├── es_clear.py │ │ ├── kibana_clear.py │ │ ├── kibana_export.py │ │ ├── kibana_import.py │ │ ├── kibana_reset.py │ │ ├── scbackup.py │ │ ├── screstore.py │ │ └── source_analyze.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20141207_1824.py │ ├── 0003_auto_20141210_1421.py │ ├── 0004_auto_20141210_1525.py │ ├── 0005_auto_20141210_1734.py │ ├── 0006_auto_20141210_1846.py │ ├── 0007_auto_20141210_2037.py │ ├── 0008_auto_20141210_2057.py │ ├── 0009_auto_20141214_1203.py │ ├── 0010_auto_20141222_1209.py │ ├── 0011_auto_20141222_1304.py │ ├── 0012_auto_20141222_1306.py │ ├── 0013_auto_20141229_1527.py │ ├── 0014_auto_20141229_1528.py │ ├── 0015_auto_20141229_1610.py │ ├── 0016_auto_20141229_1629.py │ ├── 0017_auto_20141229_1716.py │ ├── 0018_auto_20141229_1716.py │ ├── 0019_auto_20141229_1719.py │ ├── 0020_auto_20141229_1852.py │ ├── 0021_auto_20141229_1853.py │ ├── 0022_auto_20141229_1858.py │ ├── 0023_auto_20141229_1903.py │ ├── 0024_auto_20141229_2204.py │ ├── 0025_auto_20141230_0812.py │ ├── 0026_auto_20141231_0948.py │ ├── 0027_auto_20141231_0953.py │ ├── 0028_auto_20150101_2305.py │ ├── 0029_auto_20150102_1212.py │ ├── 0030_auto_20150103_1136.py │ ├── 0031_auto_20150103_1138.py │ ├── 0032_auto_20150103_1255.py │ ├── 0033_auto_20150109_2319.py │ ├── 0034_auto_20150111_2200.py │ ├── 0035_auto_20150202_0937.py │ ├── 0036_auto_20150203_1421.py │ ├── 0037_auto_20150407_2040.py │ ├── 0038_auto_20150516_0912.py │ ├── 0039_auto_20150805_1737.py │ ├── 0040_ruleset_rules_count.py │ ├── 0041_source_authkey.py │ ├── 0042_rule_state_in_source.py │ ├── 0043_threshold.py │ ├── 0044_flowbit_type.py │ ├── 0045_auto_20160405_1300.py │ ├── 0046_source_cert_verif.py │ ├── 0047_proxy_validation.py │ ├── 0048_custom_es.py │ ├── 0049_auto_20161121_2342.py │ ├── 0050_auto_20161128_2110.py │ ├── 0051_auto_20161207_0758.py │ ├── 0052_useraction_user.py │ ├── 0053_unique_none_rules.py │ ├── 0054_login_action.py │ ├── 0055_auto_20180213_1723.py │ ├── 0056_auto_20180223_0823.py │ ├── 0057_auto_20180302_1312.py │ ├── 0058_source_public_source.py │ ├── 0059_auto_20180309_2012.py │ ├── 0060_auto_20180403_0921.py │ ├── 0061_auto_20180503_2200.py │ ├── 0061_auto_20180507_1410.py │ ├── 0062_useraction_username.py │ ├── 0063_merge_20180718_0118.py │ ├── 0063_ruleprocessingfilter_ruleprocessingfilterdef.py │ ├── 0064_ruleprocessingfilter_rulesets.py │ ├── 0065_merge_20180719_1505.py │ ├── 0066_auto_20180807_1428.py │ ├── 0067_source_use_iprep.py │ ├── 0068_auto_20180818_2204.py │ ├── 0069_auto_20190220_1500.py │ ├── 0070_ruleprocessingfilterdef_full_string.py │ ├── 0071_filterset.py │ ├── 0072_send_mail.py │ ├── 0073_filterset_description.py │ ├── 0074_redlights_useraction.py │ ├── 0075_custom_es_no_empty.py │ ├── 0075_suppress_validator.py │ ├── 0076_merge_20190926_1233.py │ ├── 0077_auto_20191002_0820.py │ ├── 0078_auto_20200206_1648.py │ ├── 0079_source_remove_choice.py │ ├── 0080_source_version.py │ ├── 0081_django-2.py │ ├── 0082_source_use_sys_proxy.py │ ├── 0083_multi_es_validation.py │ ├── 0084_fakepermissionmodel.py │ ├── 0085_roles_migrations.py │ ├── 0086_ruleset_suppressed_sids.py │ ├── 0087_systemsettings_use_proxy_for_es.py │ ├── 0088_ruleprocessingfilter_import_member.py │ ├── 0089_ruleprocessingfilter_event_type.py │ ├── 0090_useraction_ip.py │ ├── 0091_useraction_missing_ruleset.py │ ├── 0092_auto_20220412_1219.py │ ├── 0093_systemsettings_custom_cookie_age.py │ ├── 0094_elasticsearch_auth.py │ ├── 0095_ruleset_activate_categories.py │ ├── 0096_systemsettings_custom_login_banner.py │ ├── 0097_auto_20221121_1645.py │ ├── 0098_source_trusted.py │ ├── 0099_alter_source_datatype.py │ ├── 0100_systemsettings_session_cookie_age.py │ ├── 0101_rule_content.py │ ├── 0102_auto_20230626_1624.py │ ├── 0103_alter_rule_sid.py │ ├── 0104_ruleatversion_analysis.py │ ├── 0105_source_is_stamus.py │ ├── 0106_alter_ruleprocessingfilterdef_value.py │ ├── 0107_deeplink_deeplinkentity.py │ ├── 0108_alter_source_created_date.py │ ├── 0109_source_remove_original_sids.py │ └── __init__.py ├── models.py ├── rest_api.py ├── rest_permissions.py ├── rest_processing.py ├── south_migrations │ ├── 0001_initial.py │ ├── 0002_auto__chg_field_reference_value.py │ ├── 0003_auto__del_reference__add_sourceupdate__chg_field_source_uri__del_field.py │ ├── 0004_auto__add_field_sourceupdate_change.py │ ├── 0005_auto__del_field_sourceupdate_change__add_field_sourceupdate_changed.py │ ├── 0006_auto__add_flowbit.py │ ├── 0007_auto__add_systemsettings.py │ ├── 0008_auto__add_field_ruleset_need_test__add_field_ruleset_validity.py │ ├── 0009_auto__add_field_ruleset_errors.py │ ├── 0010_auto__add_field_ruleset_rules_count.py │ ├── 0011_auto__add_field_source_authkey.py │ ├── 0012_auto__add_field_rule_state_in_state.py │ ├── 0013_auto__del_field_rule_state_in_state__add_field_rule_state_in_source.py │ └── __init__.py ├── static │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ ├── js │ │ └── scirius.js │ └── rules │ │ ├── Stamus_Pattern_16x9.jpg │ │ ├── Stamus_SEH_icon.png │ │ ├── Stamus_SPM_icon.png │ │ ├── Stamus_STR_icon.png │ │ ├── about-modal-pf.png │ │ ├── bootstrap.min.css │ │ ├── c3.min.css │ │ ├── favicon.ico │ │ ├── gallery.css │ │ ├── images │ │ ├── ui-icons_444444_256x240.png │ │ ├── ui-icons_555555_256x240.png │ │ ├── ui-icons_777620_256x240.png │ │ ├── ui-icons_777777_256x240.png │ │ ├── ui-icons_cc0000_256x240.png │ │ └── ui-icons_ffffff_256x240.png │ │ ├── jquery-ui.min.css │ │ ├── license.txt │ │ ├── nv.d3.min.css │ │ ├── scirius.jpg │ │ ├── selks.png │ │ ├── stamus-color.png │ │ ├── stamus.png │ │ ├── stamus_logo.png │ │ └── static.css ├── suripyg.py ├── tables.py ├── templates │ └── rules │ │ ├── add_public_source.html │ │ ├── add_ruleset.html │ │ ├── add_source.html │ │ ├── add_threshold.html │ │ ├── base.html │ │ ├── category.html │ │ ├── copy_ruleset.html │ │ ├── delete.html │ │ ├── delete_alerts.html │ │ ├── disable_category.html │ │ ├── disable_rule.html │ │ ├── edit_rule.html │ │ ├── edit_ruleset.html │ │ ├── edit_threshold.html │ │ ├── elasticsearch.html │ │ ├── es_clear_all.html │ │ ├── footer.html │ │ ├── header_right.html │ │ ├── history.html │ │ ├── index.html │ │ ├── object_list.html │ │ ├── policies.html │ │ ├── recurrence.html │ │ ├── rule.html │ │ ├── ruleset.html │ │ ├── ruleset_export.html │ │ ├── rulesets.html │ │ ├── schedule.html │ │ ├── schedule_recurrence.html │ │ ├── scheduledtask.html │ │ ├── search.html │ │ ├── search_rule.html │ │ ├── source.html │ │ ├── sources.html │ │ ├── status.html │ │ ├── system_settings.html │ │ ├── table.html │ │ ├── task.html │ │ ├── tasks_status.html │ │ ├── threshold.html │ │ ├── useraction.html │ │ └── useraction_entry.html ├── tests.py ├── tests_rules.py ├── urls.py ├── validators.py └── views.py ├── scirius ├── __init__.py ├── loginrequired.py ├── rest_api.py ├── rest_utils.py ├── settings.py ├── templates │ └── scirius │ │ └── ui.html ├── urls.py ├── utils.py ├── views.py └── wsgi.py ├── scss ├── _mixins.scss ├── _styles.scss └── _variables.scss ├── setup.py ├── suricata ├── __init__.py ├── admin.py ├── celery.py ├── common.py ├── forms.py ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ ├── addsuricata.py │ │ └── updatesuricata.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_auto_20151110_1657.py │ ├── 0003_suricata_yaml_file.py │ ├── 0004_auto_20160316_0844.py │ ├── 0005_django-2.py │ ├── 0006_alter_suricata_id.py │ ├── 0007_auto_20240912_0901.py │ ├── 0008_alter_celerytask_user.py │ └── __init__.py ├── models.py ├── rest_api.py ├── sc │ ├── __init__.py │ ├── specs.py │ └── suricatasc.py ├── scripts │ └── suri_reloader ├── south_migrations │ ├── 0001_initial.py │ ├── 0002_auto__add_field_suricata_output_directory.py │ ├── 0003_auto__chg_field_suricata_ruleset.py │ └── __init__.py ├── tables.py ├── tasks.py ├── templates │ └── suricata │ │ ├── edit.html │ │ ├── index.html │ │ └── update.html ├── urls.py └── views.py ├── tests ├── check_non_ascii_chars.py ├── eslint_check.py ├── master-build.py ├── robotframework │ ├── 10_rules │ │ ├── 10_source.robot │ │ ├── 20_ruleset.robot │ │ ├── __init__.robot │ │ ├── common.robot │ │ ├── es.robot │ │ ├── ruleset.robot │ │ ├── selenium_debug.robot │ │ ├── settings.robot │ │ └── source.robot │ ├── README.txt │ ├── config.txt │ ├── start.sh │ └── tools │ │ ├── clean.robot │ │ ├── create.robot │ │ └── rf_indent.py └── selks-sync.sh ├── ui ├── .all-contributorsrc ├── .editorconfig ├── .env ├── .eslintrc.js ├── .nvmrc ├── .prettierignore ├── .prettierrc ├── .travis.yml ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Changelog.md ├── Dockerfile.ui.dev ├── LICENSE.md ├── README.md ├── app │ ├── FilterToggleModal.js │ ├── HuntPaginationRow.js │ ├── HuntStat.js │ ├── HuntTrend.js │ ├── RuleInList.js │ ├── RulePage.js │ ├── RuleStatus.js │ ├── RuleToggleModal.js │ ├── app.js │ ├── assets │ │ ├── flags │ │ │ ├── files │ │ │ │ ├── 004.svg │ │ │ │ ├── 008.svg │ │ │ │ ├── 010.svg │ │ │ │ ├── 012.svg │ │ │ │ ├── 016.svg │ │ │ │ ├── 020.svg │ │ │ │ ├── 024.svg │ │ │ │ ├── 028.svg │ │ │ │ ├── 031.svg │ │ │ │ ├── 032.svg │ │ │ │ ├── 040.svg │ │ │ │ ├── 044.svg │ │ │ │ ├── 048.svg │ │ │ │ ├── 050.svg │ │ │ │ ├── 051.svg │ │ │ │ ├── 052.svg │ │ │ │ ├── 056.svg │ │ │ │ ├── 060.svg │ │ │ │ ├── 064.svg │ │ │ │ ├── 068.svg │ │ │ │ ├── 070.svg │ │ │ │ ├── 072.svg │ │ │ │ ├── 074.svg │ │ │ │ ├── 076.svg │ │ │ │ ├── 084.svg │ │ │ │ ├── 086.svg │ │ │ │ ├── 090.svg │ │ │ │ ├── 092.svg │ │ │ │ ├── 096.svg │ │ │ │ ├── 100.svg │ │ │ │ ├── 104.svg │ │ │ │ ├── 108.svg │ │ │ │ ├── 112.svg │ │ │ │ ├── 116.svg │ │ │ │ ├── 120.svg │ │ │ │ ├── 124.svg │ │ │ │ ├── 132.svg │ │ │ │ ├── 136.svg │ │ │ │ ├── 140.svg │ │ │ │ ├── 144.svg │ │ │ │ ├── 148.svg │ │ │ │ ├── 152.svg │ │ │ │ ├── 156.svg │ │ │ │ ├── 158.svg │ │ │ │ ├── 162.svg │ │ │ │ ├── 166.svg │ │ │ │ ├── 170.svg │ │ │ │ ├── 174.svg │ │ │ │ ├── 175.svg │ │ │ │ ├── 178.svg │ │ │ │ ├── 180.svg │ │ │ │ ├── 184.svg │ │ │ │ ├── 188.svg │ │ │ │ ├── 191.svg │ │ │ │ ├── 192.svg │ │ │ │ ├── 196.svg │ │ │ │ ├── 203.svg │ │ │ │ ├── 204.svg │ │ │ │ ├── 208.svg │ │ │ │ ├── 212.svg │ │ │ │ ├── 214.svg │ │ │ │ ├── 218.svg │ │ │ │ ├── 222.svg │ │ │ │ ├── 226.svg │ │ │ │ ├── 231.svg │ │ │ │ ├── 232.svg │ │ │ │ ├── 233.svg │ │ │ │ ├── 234.svg │ │ │ │ ├── 238.svg │ │ │ │ ├── 239.svg │ │ │ │ ├── 242.svg │ │ │ │ ├── 246.svg │ │ │ │ ├── 248.svg │ │ │ │ ├── 250.svg │ │ │ │ ├── 254.svg │ │ │ │ ├── 258.svg │ │ │ │ ├── 260.svg │ │ │ │ ├── 262.svg │ │ │ │ ├── 266.svg │ │ │ │ ├── 268.svg │ │ │ │ ├── 270.svg │ │ │ │ ├── 275.svg │ │ │ │ ├── 276.svg │ │ │ │ ├── 288.svg │ │ │ │ ├── 292.svg │ │ │ │ ├── 296.svg │ │ │ │ ├── 300.svg │ │ │ │ ├── 304.svg │ │ │ │ ├── 308.svg │ │ │ │ ├── 312.svg │ │ │ │ ├── 316.svg │ │ │ │ ├── 320.svg │ │ │ │ ├── 324.svg │ │ │ │ ├── 328.svg │ │ │ │ ├── 332.svg │ │ │ │ ├── 334.svg │ │ │ │ ├── 336.svg │ │ │ │ ├── 340.svg │ │ │ │ ├── 344.svg │ │ │ │ ├── 348.svg │ │ │ │ ├── 352.svg │ │ │ │ ├── 356.svg │ │ │ │ ├── 360.svg │ │ │ │ ├── 364.svg │ │ │ │ ├── 368.svg │ │ │ │ ├── 372.svg │ │ │ │ ├── 376.svg │ │ │ │ ├── 380.svg │ │ │ │ ├── 384.svg │ │ │ │ ├── 388.svg │ │ │ │ ├── 392.svg │ │ │ │ ├── 398.svg │ │ │ │ ├── 400.svg │ │ │ │ ├── 404.svg │ │ │ │ ├── 408.svg │ │ │ │ ├── 410.svg │ │ │ │ ├── 414.svg │ │ │ │ ├── 417.svg │ │ │ │ ├── 418.svg │ │ │ │ ├── 422.svg │ │ │ │ ├── 426.svg │ │ │ │ ├── 428.svg │ │ │ │ ├── 430.svg │ │ │ │ ├── 434.svg │ │ │ │ ├── 438.svg │ │ │ │ ├── 440.svg │ │ │ │ ├── 442.svg │ │ │ │ ├── 446.svg │ │ │ │ ├── 450.svg │ │ │ │ ├── 454.svg │ │ │ │ ├── 458.svg │ │ │ │ ├── 462.svg │ │ │ │ ├── 466.svg │ │ │ │ ├── 470.svg │ │ │ │ ├── 474.svg │ │ │ │ ├── 478.svg │ │ │ │ ├── 480.svg │ │ │ │ ├── 484.svg │ │ │ │ ├── 492.svg │ │ │ │ ├── 496.svg │ │ │ │ ├── 498.svg │ │ │ │ ├── 499.svg │ │ │ │ ├── 500.svg │ │ │ │ ├── 504.svg │ │ │ │ ├── 508.svg │ │ │ │ ├── 512.svg │ │ │ │ ├── 516.svg │ │ │ │ ├── 520.svg │ │ │ │ ├── 524.svg │ │ │ │ ├── 528.svg │ │ │ │ ├── 531.svg │ │ │ │ ├── 533.svg │ │ │ │ ├── 534.svg │ │ │ │ ├── 540.svg │ │ │ │ ├── 548.svg │ │ │ │ ├── 554.svg │ │ │ │ ├── 558.svg │ │ │ │ ├── 562.svg │ │ │ │ ├── 566.svg │ │ │ │ ├── 570.svg │ │ │ │ ├── 574.svg │ │ │ │ ├── 578.svg │ │ │ │ ├── 580.svg │ │ │ │ ├── 581.svg │ │ │ │ ├── 583.svg │ │ │ │ ├── 584.svg │ │ │ │ ├── 585.svg │ │ │ │ ├── 586.svg │ │ │ │ ├── 591.svg │ │ │ │ ├── 598.svg │ │ │ │ ├── 600.svg │ │ │ │ ├── 604.svg │ │ │ │ ├── 608.svg │ │ │ │ ├── 612.svg │ │ │ │ ├── 616.svg │ │ │ │ ├── 620.svg │ │ │ │ ├── 624.svg │ │ │ │ ├── 626.svg │ │ │ │ ├── 630.svg │ │ │ │ ├── 634.svg │ │ │ │ ├── 638.svg │ │ │ │ ├── 642.svg │ │ │ │ ├── 643.svg │ │ │ │ ├── 646.svg │ │ │ │ ├── 652.svg │ │ │ │ ├── 654.svg │ │ │ │ ├── 659.svg │ │ │ │ ├── 660.svg │ │ │ │ ├── 662.svg │ │ │ │ ├── 663.svg │ │ │ │ ├── 666.svg │ │ │ │ ├── 670.svg │ │ │ │ ├── 674.svg │ │ │ │ ├── 678.svg │ │ │ │ ├── 682.svg │ │ │ │ ├── 686.svg │ │ │ │ ├── 688.svg │ │ │ │ ├── 690.svg │ │ │ │ ├── 694.svg │ │ │ │ ├── 702.svg │ │ │ │ ├── 703.svg │ │ │ │ ├── 704.svg │ │ │ │ ├── 705.svg │ │ │ │ ├── 706.svg │ │ │ │ ├── 710.svg │ │ │ │ ├── 716.svg │ │ │ │ ├── 724.svg │ │ │ │ ├── 728.svg │ │ │ │ ├── 729.svg │ │ │ │ ├── 732.svg │ │ │ │ ├── 740.svg │ │ │ │ ├── 744.svg │ │ │ │ ├── 748.svg │ │ │ │ ├── 752.svg │ │ │ │ ├── 756.svg │ │ │ │ ├── 760.svg │ │ │ │ ├── 762.svg │ │ │ │ ├── 764.svg │ │ │ │ ├── 768.svg │ │ │ │ ├── 772.svg │ │ │ │ ├── 776.svg │ │ │ │ ├── 780.svg │ │ │ │ ├── 784.svg │ │ │ │ ├── 788.svg │ │ │ │ ├── 792.svg │ │ │ │ ├── 795.svg │ │ │ │ ├── 796.svg │ │ │ │ ├── 798.svg │ │ │ │ ├── 800.svg │ │ │ │ ├── 804.svg │ │ │ │ ├── 807.svg │ │ │ │ ├── 818.svg │ │ │ │ ├── 831.svg │ │ │ │ ├── 832.svg │ │ │ │ ├── 833.svg │ │ │ │ ├── 834.svg │ │ │ │ ├── 836.svg │ │ │ │ ├── 840.svg │ │ │ │ ├── 850.svg │ │ │ │ ├── 854.svg │ │ │ │ ├── 858.svg │ │ │ │ ├── 860.svg │ │ │ │ ├── 862.svg │ │ │ │ ├── 876.svg │ │ │ │ ├── 882.svg │ │ │ │ ├── 887.svg │ │ │ │ ├── 894.svg │ │ │ │ ├── ABW.svg │ │ │ │ ├── AD.svg │ │ │ │ ├── AE.svg │ │ │ │ ├── AF.svg │ │ │ │ ├── AFG.svg │ │ │ │ ├── AG.svg │ │ │ │ ├── AGO.svg │ │ │ │ ├── AI.svg │ │ │ │ ├── AIA.svg │ │ │ │ ├── AL.svg │ │ │ │ ├── ALA.svg │ │ │ │ ├── ALB.svg │ │ │ │ ├── AM.svg │ │ │ │ ├── AND.svg │ │ │ │ ├── AO.svg │ │ │ │ ├── AQ.svg │ │ │ │ ├── AR.svg │ │ │ │ ├── ARE.svg │ │ │ │ ├── ARG.svg │ │ │ │ ├── ARM.svg │ │ │ │ ├── AS.svg │ │ │ │ ├── ASM.svg │ │ │ │ ├── AT.svg │ │ │ │ ├── ATA.svg │ │ │ │ ├── ATF.svg │ │ │ │ ├── ATG.svg │ │ │ │ ├── AU.svg │ │ │ │ ├── AUS.svg │ │ │ │ ├── AUT.svg │ │ │ │ ├── AW.svg │ │ │ │ ├── AX.svg │ │ │ │ ├── AZ.svg │ │ │ │ ├── AZE.svg │ │ │ │ ├── BA.svg │ │ │ │ ├── BB.svg │ │ │ │ ├── BD.svg │ │ │ │ ├── BDI.svg │ │ │ │ ├── BE.svg │ │ │ │ ├── BEL.svg │ │ │ │ ├── BEN.svg │ │ │ │ ├── BF.svg │ │ │ │ ├── BFA.svg │ │ │ │ ├── BG.svg │ │ │ │ ├── BGD.svg │ │ │ │ ├── BGR.svg │ │ │ │ ├── BH.svg │ │ │ │ ├── BHR.svg │ │ │ │ ├── BHS.svg │ │ │ │ ├── BI.svg │ │ │ │ ├── BIH.svg │ │ │ │ ├── BJ.svg │ │ │ │ ├── BL.svg │ │ │ │ ├── BLM.svg │ │ │ │ ├── BLR.svg │ │ │ │ ├── BLZ.svg │ │ │ │ ├── BM.svg │ │ │ │ ├── BMU.svg │ │ │ │ ├── BN.svg │ │ │ │ ├── BO.svg │ │ │ │ ├── BOL.svg │ │ │ │ ├── BQ-BO.svg │ │ │ │ ├── BQ-SA.svg │ │ │ │ ├── BQ-SE.svg │ │ │ │ ├── BR.svg │ │ │ │ ├── BRA.svg │ │ │ │ ├── BRB.svg │ │ │ │ ├── BRN.svg │ │ │ │ ├── BS.svg │ │ │ │ ├── BT.svg │ │ │ │ ├── BTN.svg │ │ │ │ ├── BV.svg │ │ │ │ ├── BVT.svg │ │ │ │ ├── BW.svg │ │ │ │ ├── BWA.svg │ │ │ │ ├── BY.svg │ │ │ │ ├── BZ.svg │ │ │ │ ├── CA.svg │ │ │ │ ├── CAF.svg │ │ │ │ ├── CAN.svg │ │ │ │ ├── CC.svg │ │ │ │ ├── CCK.svg │ │ │ │ ├── CD.svg │ │ │ │ ├── CF.svg │ │ │ │ ├── CG.svg │ │ │ │ ├── CH.svg │ │ │ │ ├── CHE.svg │ │ │ │ ├── CHL.svg │ │ │ │ ├── CHN.svg │ │ │ │ ├── CI.svg │ │ │ │ ├── CIV.svg │ │ │ │ ├── CK.svg │ │ │ │ ├── CL.svg │ │ │ │ ├── CM.svg │ │ │ │ ├── CMR.svg │ │ │ │ ├── CN.svg │ │ │ │ ├── CO.svg │ │ │ │ ├── COD.svg │ │ │ │ ├── COG.svg │ │ │ │ ├── COK.svg │ │ │ │ ├── COL.svg │ │ │ │ ├── COM.svg │ │ │ │ ├── CPV.svg │ │ │ │ ├── CR.svg │ │ │ │ ├── CRI.svg │ │ │ │ ├── CU.svg │ │ │ │ ├── CUB.svg │ │ │ │ ├── CUW.svg │ │ │ │ ├── CV.svg │ │ │ │ ├── CW.svg │ │ │ │ ├── CX.svg │ │ │ │ ├── CXR.svg │ │ │ │ ├── CY.svg │ │ │ │ ├── CYM.svg │ │ │ │ ├── CYP.svg │ │ │ │ ├── CZ.svg │ │ │ │ ├── CZE.svg │ │ │ │ ├── DE.svg │ │ │ │ ├── DEU.svg │ │ │ │ ├── DJ.svg │ │ │ │ ├── DJI.svg │ │ │ │ ├── DK.svg │ │ │ │ ├── DM.svg │ │ │ │ ├── DMA.svg │ │ │ │ ├── DNK.svg │ │ │ │ ├── DO.svg │ │ │ │ ├── DOM.svg │ │ │ │ ├── DZ.svg │ │ │ │ ├── DZA.svg │ │ │ │ ├── EC.svg │ │ │ │ ├── ECU.svg │ │ │ │ ├── EE.svg │ │ │ │ ├── EG.svg │ │ │ │ ├── EGY.svg │ │ │ │ ├── EH.svg │ │ │ │ ├── ER.svg │ │ │ │ ├── ERI.svg │ │ │ │ ├── ES.svg │ │ │ │ ├── ESH.svg │ │ │ │ ├── ESP.svg │ │ │ │ ├── EST.svg │ │ │ │ ├── ET.svg │ │ │ │ ├── ETH.svg │ │ │ │ ├── FI.svg │ │ │ │ ├── FIN.svg │ │ │ │ ├── FJ.svg │ │ │ │ ├── FJI.svg │ │ │ │ ├── FK.svg │ │ │ │ ├── FLK.svg │ │ │ │ ├── FM.svg │ │ │ │ ├── FO.svg │ │ │ │ ├── FR.svg │ │ │ │ ├── FRA.svg │ │ │ │ ├── FRO.svg │ │ │ │ ├── FSM.svg │ │ │ │ ├── GA.svg │ │ │ │ ├── GAB.svg │ │ │ │ ├── GB-ENG.svg │ │ │ │ ├── GB-NIR.svg │ │ │ │ ├── GB-SCT.svg │ │ │ │ ├── GB-UKM.svg │ │ │ │ ├── GB-WLS.svg │ │ │ │ ├── GBR.svg │ │ │ │ ├── GD.svg │ │ │ │ ├── GE.svg │ │ │ │ ├── GEO.svg │ │ │ │ ├── GF.svg │ │ │ │ ├── GG.svg │ │ │ │ ├── GGY.svg │ │ │ │ ├── GH.svg │ │ │ │ ├── GHA.svg │ │ │ │ ├── GI.svg │ │ │ │ ├── GIB.svg │ │ │ │ ├── GIN.svg │ │ │ │ ├── GL.svg │ │ │ │ ├── GLP.svg │ │ │ │ ├── GM.svg │ │ │ │ ├── GMB.svg │ │ │ │ ├── GN.svg │ │ │ │ ├── GNB.svg │ │ │ │ ├── GNQ.svg │ │ │ │ ├── GP.svg │ │ │ │ ├── GQ.svg │ │ │ │ ├── GR.svg │ │ │ │ ├── GRC.svg │ │ │ │ ├── GRD.svg │ │ │ │ ├── GRL.svg │ │ │ │ ├── GS.svg │ │ │ │ ├── GT.svg │ │ │ │ ├── GTM.svg │ │ │ │ ├── GU.svg │ │ │ │ ├── GUF.svg │ │ │ │ ├── GUM.svg │ │ │ │ ├── GUY.svg │ │ │ │ ├── GW.svg │ │ │ │ ├── GY.svg │ │ │ │ ├── HK.svg │ │ │ │ ├── HKG.svg │ │ │ │ ├── HM.svg │ │ │ │ ├── HMD.svg │ │ │ │ ├── HN.svg │ │ │ │ ├── HND.svg │ │ │ │ ├── HR.svg │ │ │ │ ├── HRV.svg │ │ │ │ ├── HT.svg │ │ │ │ ├── HTI.svg │ │ │ │ ├── HU.svg │ │ │ │ ├── HUN.svg │ │ │ │ ├── ID.svg │ │ │ │ ├── IDN.svg │ │ │ │ ├── IE.svg │ │ │ │ ├── IL.svg │ │ │ │ ├── IM.svg │ │ │ │ ├── IMN.svg │ │ │ │ ├── IN.svg │ │ │ │ ├── IND.svg │ │ │ │ ├── IO.svg │ │ │ │ ├── IOT.svg │ │ │ │ ├── IQ.svg │ │ │ │ ├── IR.svg │ │ │ │ ├── IRL.svg │ │ │ │ ├── IRN.svg │ │ │ │ ├── IRQ.svg │ │ │ │ ├── IS.svg │ │ │ │ ├── ISL.svg │ │ │ │ ├── ISR.svg │ │ │ │ ├── IT.svg │ │ │ │ ├── ITA.svg │ │ │ │ ├── JAM.svg │ │ │ │ ├── JE.svg │ │ │ │ ├── JEY.svg │ │ │ │ ├── JM.svg │ │ │ │ ├── JO.svg │ │ │ │ ├── JOR.svg │ │ │ │ ├── JP.svg │ │ │ │ ├── JPN.svg │ │ │ │ ├── KAZ.svg │ │ │ │ ├── KE.svg │ │ │ │ ├── KEN.svg │ │ │ │ ├── KG.svg │ │ │ │ ├── KGZ.svg │ │ │ │ ├── KH.svg │ │ │ │ ├── KHM.svg │ │ │ │ ├── KI.svg │ │ │ │ ├── KIR.svg │ │ │ │ ├── KM.svg │ │ │ │ ├── KN.svg │ │ │ │ ├── KNA.svg │ │ │ │ ├── KOR.svg │ │ │ │ ├── KP.svg │ │ │ │ ├── KR.svg │ │ │ │ ├── KW.svg │ │ │ │ ├── KWT.svg │ │ │ │ ├── KY.svg │ │ │ │ ├── KZ.svg │ │ │ │ ├── LA.svg │ │ │ │ ├── LAO.svg │ │ │ │ ├── LB.svg │ │ │ │ ├── LBN.svg │ │ │ │ ├── LBR.svg │ │ │ │ ├── LBY.svg │ │ │ │ ├── LC.svg │ │ │ │ ├── LCA.svg │ │ │ │ ├── LI.svg │ │ │ │ ├── LIE.svg │ │ │ │ ├── LK.svg │ │ │ │ ├── LKA.svg │ │ │ │ ├── LR.svg │ │ │ │ ├── LS.svg │ │ │ │ ├── LSO.svg │ │ │ │ ├── LT.svg │ │ │ │ ├── LTU.svg │ │ │ │ ├── LU.svg │ │ │ │ ├── LUX.svg │ │ │ │ ├── LV.svg │ │ │ │ ├── LVA.svg │ │ │ │ ├── LY.svg │ │ │ │ ├── MA.svg │ │ │ │ ├── MAC.svg │ │ │ │ ├── MAF.svg │ │ │ │ ├── MAR.svg │ │ │ │ ├── MC.svg │ │ │ │ ├── MCO .svg │ │ │ │ ├── MD.svg │ │ │ │ ├── MDA.svg │ │ │ │ ├── MDG.svg │ │ │ │ ├── MDV.svg │ │ │ │ ├── ME.svg │ │ │ │ ├── MEX.svg │ │ │ │ ├── MF.svg │ │ │ │ ├── MG.svg │ │ │ │ ├── MH.svg │ │ │ │ ├── MHL.svg │ │ │ │ ├── MK.svg │ │ │ │ ├── MKD.svg │ │ │ │ ├── ML.svg │ │ │ │ ├── MLI.svg │ │ │ │ ├── MLT.svg │ │ │ │ ├── MM.svg │ │ │ │ ├── MMR.svg │ │ │ │ ├── MN.svg │ │ │ │ ├── MNE.svg │ │ │ │ ├── MNG.svg │ │ │ │ ├── MNP.svg │ │ │ │ ├── MO.svg │ │ │ │ ├── MOZ.svg │ │ │ │ ├── MP.svg │ │ │ │ ├── MQ.svg │ │ │ │ ├── MR.svg │ │ │ │ ├── MRT.svg │ │ │ │ ├── MS.svg │ │ │ │ ├── MSR.svg │ │ │ │ ├── MT.svg │ │ │ │ ├── MTQ.svg │ │ │ │ ├── MU.svg │ │ │ │ ├── MUS.svg │ │ │ │ ├── MV.svg │ │ │ │ ├── MW.svg │ │ │ │ ├── MWI.svg │ │ │ │ ├── MX.svg │ │ │ │ ├── MY.svg │ │ │ │ ├── MYS.svg │ │ │ │ ├── MYT.svg │ │ │ │ ├── MZ.svg │ │ │ │ ├── NA.svg │ │ │ │ ├── NAM.svg │ │ │ │ ├── NC.svg │ │ │ │ ├── NCL.svg │ │ │ │ ├── NE.svg │ │ │ │ ├── NER.svg │ │ │ │ ├── NF.svg │ │ │ │ ├── NFK.svg │ │ │ │ ├── NG.svg │ │ │ │ ├── NGA.svg │ │ │ │ ├── NI.svg │ │ │ │ ├── NIC.svg │ │ │ │ ├── NIU.svg │ │ │ │ ├── NL.svg │ │ │ │ ├── NLD.svg │ │ │ │ ├── NO.svg │ │ │ │ ├── NOR.svg │ │ │ │ ├── NP.svg │ │ │ │ ├── NPL.svg │ │ │ │ ├── NR.svg │ │ │ │ ├── NRU.svg │ │ │ │ ├── NU.svg │ │ │ │ ├── NZ.svg │ │ │ │ ├── NZL.svg │ │ │ │ ├── OM.svg │ │ │ │ ├── OMN.svg │ │ │ │ ├── PA.svg │ │ │ │ ├── PAK.svg │ │ │ │ ├── PAN.svg │ │ │ │ ├── PCN.svg │ │ │ │ ├── PE.svg │ │ │ │ ├── PER.svg │ │ │ │ ├── PF.svg │ │ │ │ ├── PG.svg │ │ │ │ ├── PH.svg │ │ │ │ ├── PHL.svg │ │ │ │ ├── PK.svg │ │ │ │ ├── PL.svg │ │ │ │ ├── PLW.svg │ │ │ │ ├── PM.svg │ │ │ │ ├── PN.svg │ │ │ │ ├── PNG.svg │ │ │ │ ├── POL.svg │ │ │ │ ├── PR.svg │ │ │ │ ├── PRI.svg │ │ │ │ ├── PRK.svg │ │ │ │ ├── PRT.svg │ │ │ │ ├── PRY.svg │ │ │ │ ├── PS.svg │ │ │ │ ├── PSE.svg │ │ │ │ ├── PT.svg │ │ │ │ ├── PW.svg │ │ │ │ ├── PY.svg │ │ │ │ ├── PYF.svg │ │ │ │ ├── QA.svg │ │ │ │ ├── QAT.svg │ │ │ │ ├── RE.svg │ │ │ │ ├── REU.svg │ │ │ │ ├── RO.svg │ │ │ │ ├── ROU.svg │ │ │ │ ├── RS.svg │ │ │ │ ├── RU.svg │ │ │ │ ├── RUS.svg │ │ │ │ ├── RW.svg │ │ │ │ ├── RWA.svg │ │ │ │ ├── SA.svg │ │ │ │ ├── SAU.svg │ │ │ │ ├── SB.svg │ │ │ │ ├── SC.svg │ │ │ │ ├── SD.svg │ │ │ │ ├── SDN.svg │ │ │ │ ├── SE.svg │ │ │ │ ├── SEN.svg │ │ │ │ ├── SG.svg │ │ │ │ ├── SGP.svg │ │ │ │ ├── SGS.svg │ │ │ │ ├── SH.svg │ │ │ │ ├── SHN.svg │ │ │ │ ├── SI.svg │ │ │ │ ├── SJ.svg │ │ │ │ ├── SJM.svg │ │ │ │ ├── SK.svg │ │ │ │ ├── SL.svg │ │ │ │ ├── SLB.svg │ │ │ │ ├── SLE.svg │ │ │ │ ├── SLV.svg │ │ │ │ ├── SM.svg │ │ │ │ ├── SMR.svg │ │ │ │ ├── SN.svg │ │ │ │ ├── SO.svg │ │ │ │ ├── SOM.svg │ │ │ │ ├── SPM.svg │ │ │ │ ├── SR.svg │ │ │ │ ├── SRB.svg │ │ │ │ ├── SS.svg │ │ │ │ ├── SSD.svg │ │ │ │ ├── ST.svg │ │ │ │ ├── STP.svg │ │ │ │ ├── SUR.svg │ │ │ │ ├── SV.svg │ │ │ │ ├── SVK.svg │ │ │ │ ├── SVN.svg │ │ │ │ ├── SWE.svg │ │ │ │ ├── SWZ.svg │ │ │ │ ├── SX.svg │ │ │ │ ├── SXM.svg │ │ │ │ ├── SY.svg │ │ │ │ ├── SYC.svg │ │ │ │ ├── SYR.svg │ │ │ │ ├── SZ.svg │ │ │ │ ├── TC.svg │ │ │ │ ├── TCA.svg │ │ │ │ ├── TCD.svg │ │ │ │ ├── TD.svg │ │ │ │ ├── TF.svg │ │ │ │ ├── TG.svg │ │ │ │ ├── TGO.svg │ │ │ │ ├── TH.svg │ │ │ │ ├── THA.svg │ │ │ │ ├── TJ.svg │ │ │ │ ├── TJK.svg │ │ │ │ ├── TK.svg │ │ │ │ ├── TKL.svg │ │ │ │ ├── TKM.svg │ │ │ │ ├── TL.svg │ │ │ │ ├── TLS.svg │ │ │ │ ├── TM.svg │ │ │ │ ├── TN.svg │ │ │ │ ├── TO.svg │ │ │ │ ├── TON.svg │ │ │ │ ├── TR.svg │ │ │ │ ├── TT.svg │ │ │ │ ├── TTO.svg │ │ │ │ ├── TUN.svg │ │ │ │ ├── TUR.svg │ │ │ │ ├── TUV.svg │ │ │ │ ├── TV.svg │ │ │ │ ├── TW.svg │ │ │ │ ├── TWN.svg │ │ │ │ ├── TZ.svg │ │ │ │ ├── TZA.svg │ │ │ │ ├── UA.svg │ │ │ │ ├── UG.svg │ │ │ │ ├── UGA.svg │ │ │ │ ├── UKR.svg │ │ │ │ ├── UM.svg │ │ │ │ ├── UMI.svg │ │ │ │ ├── URY.svg │ │ │ │ ├── US.svg │ │ │ │ ├── USA.svg │ │ │ │ ├── UY.svg │ │ │ │ ├── UZ.svg │ │ │ │ ├── UZB.svg │ │ │ │ ├── VA.svg │ │ │ │ ├── VAT.svg │ │ │ │ ├── VC.svg │ │ │ │ ├── VCT.svg │ │ │ │ ├── VE.svg │ │ │ │ ├── VEN.svg │ │ │ │ ├── VG.svg │ │ │ │ ├── VGB.svg │ │ │ │ ├── VI.svg │ │ │ │ ├── VIR.svg │ │ │ │ ├── VN.svg │ │ │ │ ├── VNM.svg │ │ │ │ ├── VU.svg │ │ │ │ ├── VUT.svg │ │ │ │ ├── WF.svg │ │ │ │ ├── WLF.svg │ │ │ │ ├── WS.svg │ │ │ │ ├── WSM.svg │ │ │ │ ├── YE.svg │ │ │ │ ├── YEM.svg │ │ │ │ ├── YT.svg │ │ │ │ ├── ZA.svg │ │ │ │ ├── ZAF.svg │ │ │ │ ├── ZM.svg │ │ │ │ ├── ZMB.svg │ │ │ │ ├── ZW.svg │ │ │ │ └── ZWE.svg │ │ │ └── index.js │ │ ├── fonts │ │ │ ├── files │ │ │ │ ├── opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-mu0SC55I.woff2 │ │ │ │ ├── opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu0SC55K5gw.woff2 │ │ │ │ ├── opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu0SC55K5gw.woff2 │ │ │ │ ├── opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu0SC55K5gw.woff2 │ │ │ │ ├── opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu0SC55K5gw.woff2 │ │ │ │ ├── opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu0SC55K5gw.woff2 │ │ │ │ ├── opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu0SC55K5gw.woff2 │ │ │ │ └── opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu0SC55K5gw.woff2 │ │ │ └── fonts.css │ │ ├── icons │ │ │ ├── arrow.js │ │ │ ├── client.js │ │ │ ├── index.js │ │ │ ├── read_more.js │ │ │ ├── server.js │ │ │ ├── sword.js │ │ │ └── target.js │ │ └── images │ │ │ ├── favicon.ico │ │ │ ├── icon-512x512.png │ │ │ ├── stamus.png │ │ │ └── stamus_logo.png │ ├── buildFilterParams.js │ ├── buildQFilter.js │ ├── components │ │ ├── AdditionalFilters │ │ │ └── index.js │ │ ├── AlertRelatedData │ │ │ ├── columns.js │ │ │ ├── index.js │ │ │ └── style.js │ │ ├── AlgorithmicDetection │ │ │ ├── AlgorithmicDetection.js │ │ │ ├── index.js │ │ │ └── style.js │ │ ├── AppSpinner │ │ │ └── index.js │ │ ├── Badge │ │ │ └── index.jsx │ │ ├── CalendarHeader │ │ │ └── index.js │ │ ├── Charts │ │ │ ├── Timeline │ │ │ │ ├── Timeline.js │ │ │ │ ├── helpers.js │ │ │ │ ├── index.js │ │ │ │ └── style.js │ │ │ ├── components │ │ │ │ ├── XAxisLabelDateTime.js │ │ │ │ └── index.js │ │ │ ├── config.js │ │ │ └── index.js │ │ ├── Content │ │ │ └── index.js │ │ ├── DashboardBlock │ │ │ └── index.js │ │ ├── DashboardBlockData │ │ │ └── index.js │ │ ├── DashboardBlockMore │ │ │ └── index.js │ │ ├── DashboardMosaic │ │ │ └── index.js │ │ ├── DashboardPanel │ │ │ └── index.js │ │ ├── DateRangePicker │ │ │ └── index.js │ │ ├── DonutChart │ │ │ └── index.js │ │ ├── DownloadCSV │ │ │ ├── helper.js │ │ │ └── index.js │ │ ├── Error │ │ │ └── index.js │ │ ├── ErrorHandler │ │ │ └── index.js │ │ ├── EventField │ │ │ └── index.js │ │ ├── EventValue │ │ │ └── index.js │ │ ├── EventsField │ │ │ └── index.js │ │ ├── ExpandedSignature │ │ │ └── index.js │ │ ├── FilterButton.js │ │ ├── FilterEditKebab │ │ │ └── index.js │ │ ├── FilterEditModal │ │ │ └── index.js │ │ ├── FilterItem │ │ │ ├── FilterActionButton.styled.js │ │ │ ├── FilterItem.js │ │ │ ├── index.js │ │ │ └── style.js │ │ ├── FilterList │ │ │ ├── FilterList.js │ │ │ └── index.js │ │ ├── FilterSetItem │ │ │ └── index.js │ │ ├── FilterSetSaveModal │ │ │ ├── actions.js │ │ │ ├── constants.js │ │ │ ├── index.js │ │ │ ├── reducer.js │ │ │ ├── saga.js │ │ │ └── selectors.js │ │ ├── FilterSetSearch │ │ │ └── index.js │ │ ├── FilterSets │ │ │ └── index.js │ │ ├── Filters │ │ │ ├── Title.styled.js │ │ │ ├── components │ │ │ │ ├── Actions │ │ │ │ │ └── index.js │ │ │ │ ├── ActionsButtons │ │ │ │ │ └── index.js │ │ │ │ ├── ClearFiltersButton │ │ │ │ │ └── index.js │ │ │ │ ├── LoadFilterSetButton │ │ │ │ │ └── index.js │ │ │ │ ├── SaveFilterSetButton │ │ │ │ │ └── index.js │ │ │ │ └── styles.js │ │ │ └── index.js │ │ ├── FiltersDropdown │ │ │ └── index.js │ │ ├── Flag │ │ │ ├── index.jsx │ │ │ └── style.css │ │ ├── Flow │ │ │ └── MethodTitle.js │ │ ├── Header │ │ │ ├── index.js │ │ │ └── styles.js │ │ ├── HelpMenu │ │ │ └── index.js │ │ ├── HistoryItem │ │ │ └── index.js │ │ ├── HuntRestError │ │ │ └── index.js │ │ ├── IconAntd │ │ │ └── index.js │ │ ├── LeftNav │ │ │ ├── index.js │ │ │ └── styles.js │ │ ├── LoadingIndicator │ │ │ ├── Circle.js │ │ │ ├── Wrapper.js │ │ │ └── index.js │ │ ├── LogoutMenuItem │ │ │ └── index.js │ │ ├── Markdown │ │ │ ├── Markdown.js │ │ │ └── index.js │ │ ├── Modal │ │ │ └── DocDopvModal.js │ │ ├── PCAPFile │ │ │ └── index.js │ │ ├── PeriodsList │ │ │ └── index.js │ │ ├── ProxyRoute │ │ │ └── index.js │ │ ├── Refresh │ │ │ └── index.js │ │ ├── ReloadButton │ │ │ ├── ReloadButton.js │ │ │ ├── index.js │ │ │ └── style.js │ │ ├── RuleContentModal │ │ │ └── index.js │ │ ├── RuleEditKebab │ │ │ └── index.js │ │ ├── SMBAlertCard │ │ │ └── index.js │ │ ├── Signature │ │ │ ├── Signature.js │ │ │ ├── components │ │ │ │ ├── buffer │ │ │ │ │ ├── Buffer.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── styles.js │ │ │ │ ├── field │ │ │ │ │ ├── Field.js │ │ │ │ │ └── index.js │ │ │ │ ├── generalInformation │ │ │ │ │ ├── GeneralInformation.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── styles.js │ │ │ │ ├── index.js │ │ │ │ └── target │ │ │ │ │ ├── Target.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── styles.js │ │ │ ├── index.js │ │ │ ├── styles.js │ │ │ └── utils.js │ │ ├── SignatureFlow │ │ │ └── index.js │ │ ├── Sort │ │ │ ├── index.js │ │ │ └── options.js │ │ ├── TableCellOverflow │ │ │ ├── TableCellOverflow.js │ │ │ ├── index.js │ │ │ └── style.js │ │ ├── TimeRangePickersContainer │ │ │ └── index.js │ │ ├── TypedValue │ │ │ ├── index.js │ │ │ └── options.js │ │ ├── UIElements │ │ │ ├── UIBlock │ │ │ │ └── index.js │ │ │ ├── UIBreadcrumb │ │ │ │ └── index.js │ │ │ ├── UICard │ │ │ │ └── index.js │ │ │ ├── UISwitch │ │ │ │ └── index.js │ │ │ ├── UISwitchLabel │ │ │ │ └── index.js │ │ │ └── UITabs │ │ │ │ └── index.js │ │ ├── UpdatePushRuleset │ │ │ └── index.js │ │ └── UserMenu │ │ │ ├── index.js │ │ │ └── style.js │ ├── config.js │ ├── config │ │ ├── Api.js │ │ ├── Dashboard.js │ │ ├── endpoints.js │ │ ├── index.js │ │ ├── ipFields.js │ │ └── theme.js │ ├── configureStore.js │ ├── constants.js │ ├── constants │ │ ├── antd.json │ │ └── colors.js │ ├── containers │ │ ├── App │ │ │ ├── actions.js │ │ │ ├── constants.js │ │ │ ├── index.js │ │ │ ├── reducer.js │ │ │ ├── saga.js │ │ │ └── selectors.js │ │ └── HuntApp │ │ │ └── stores │ │ │ ├── filterParams.js │ │ │ └── global.js │ ├── context │ │ └── DashboardContext.js │ ├── global-styles.js │ ├── helpers │ │ ├── Api.js │ │ ├── CamelCaseToDashCase.js │ │ ├── CamelCaseToNormal.js │ │ ├── Link.js │ │ ├── buildFilterNew.js │ │ ├── buildListParams.js │ │ ├── capitalize.js │ │ ├── common.js │ │ ├── compressIPv6.js │ │ ├── copyTextToClipboard.js │ │ ├── crcf.js │ │ ├── dashboardSanitizer.js │ │ ├── downloadData.js │ │ ├── formatDropdownItem.js │ │ ├── getCurrentUser.js │ │ ├── getQueryObject.js │ │ ├── index.js │ │ ├── isEmail.js │ │ ├── isIP.js │ │ ├── isIPv4.js │ │ ├── isNumeric.js │ │ ├── isUsername.js │ │ ├── localStorage.js │ │ ├── markdown.js │ │ ├── notify.js │ │ ├── parseObjectToUrl.js │ │ ├── parseUrl.js │ │ ├── request.js │ │ ├── stringToColor.js │ │ ├── timeline.js │ │ ├── translateMap.js │ │ ├── translateUrl.js │ │ ├── updateHitsStats.js │ │ ├── useAutorun.js │ │ ├── uuid.js │ │ └── withAlerts.js │ ├── hooks │ │ ├── useEnterprise.js │ │ ├── useFilterParams.js │ │ ├── useHistoryFilters.js │ │ ├── useKeyPress.js │ │ ├── useNetworkDefs.js │ │ ├── usePrevious.js │ │ ├── useResizeObserver.js │ │ ├── useSearchParamsListener.js │ │ └── useWindowWidth.js │ ├── index.css │ ├── index.html │ ├── maps │ │ ├── EventTypesEnum.js │ │ ├── FilterValidationType.js │ │ ├── FilterValueType.js │ │ ├── Filters.js │ │ ├── FiltersDropdownItems.js │ │ ├── KillChainStepsEnum.js │ │ ├── LeftNavMap.js │ │ ├── PeriodEnum.js │ │ ├── ReloadPeriodEnum.js │ │ ├── StorageEnum.js │ │ └── TimePickersEnum.js │ ├── mobx │ │ ├── RootStoreProvider.js │ │ ├── api.js │ │ ├── map.js │ │ └── stores │ │ │ ├── CommonStore.js │ │ │ ├── CommonStore.util.js │ │ │ ├── EsStore.js │ │ │ ├── HistoryStore.js │ │ │ └── RootStore.js │ ├── pages │ │ ├── Administration │ │ │ └── Administration.js │ │ ├── Arkime │ │ │ └── Arkime.js │ │ ├── CyberChef │ │ │ └── CyberChef.js │ │ ├── Dashboards │ │ │ ├── DashboardPage.js │ │ │ ├── Dashboards.js │ │ │ ├── components │ │ │ │ ├── DashboardTimeline │ │ │ │ │ ├── DashboardTimeline.js │ │ │ │ │ ├── index.js │ │ │ │ │ └── style.js │ │ │ │ └── index.js │ │ │ └── style.js │ │ ├── EveBox │ │ │ └── EveBox.js │ │ ├── Events │ │ │ ├── Events.js │ │ │ ├── EventsPage.js │ │ │ └── components │ │ │ │ └── AlertItem │ │ │ │ ├── helper.js │ │ │ │ ├── index.js │ │ │ │ └── styles.js │ │ ├── History │ │ │ ├── History.js │ │ │ └── HistoryPage.js │ │ ├── Kibana │ │ │ └── Kibana.js │ │ ├── Linking │ │ │ ├── CreateModal │ │ │ │ ├── CreateModal.js │ │ │ │ └── index.js │ │ │ ├── DeleteModal │ │ │ │ ├── DeleteModal.js │ │ │ │ ├── index.js │ │ │ │ └── style.js │ │ │ ├── Linking.columns.jsx │ │ │ ├── Linking.js │ │ │ └── Linking.style.js │ │ ├── NotFound │ │ │ ├── NotFound.js │ │ │ └── style.js │ │ ├── Policies │ │ │ ├── ActionItem.js │ │ │ ├── Policies.js │ │ │ ├── PoliciesPage.js │ │ │ ├── PolicyParameters.js │ │ │ └── style.js │ │ ├── Signatures │ │ │ ├── Signatures.js │ │ │ ├── SignaturesPage.js │ │ │ └── components │ │ │ │ ├── Timeline │ │ │ │ ├── SignatureTimeline.js │ │ │ │ ├── index.js │ │ │ │ └── style.js │ │ │ │ └── index.js │ │ └── index.js │ ├── pygments.css │ ├── reducers.js │ ├── services │ │ ├── API.js │ │ └── NetworkService.js │ ├── store.js │ ├── stores │ │ ├── filters │ │ │ ├── actions.js │ │ │ ├── constants.js │ │ │ ├── reducer.js │ │ │ ├── saga.js │ │ │ └── selectors.js │ │ └── filterset │ │ │ ├── actions.js │ │ │ ├── constants.js │ │ │ ├── reducer.js │ │ │ ├── saga.js │ │ │ └── selectors.js │ ├── styled-components-vars.js │ ├── supportedActions.js │ └── utils │ │ ├── Filter.js │ │ ├── checkStore.js │ │ ├── constants.js │ │ ├── history.js │ │ ├── injectReducer.js │ │ ├── injectSaga.js │ │ ├── loadable.js │ │ ├── reducerInjectors.js │ │ ├── request.js │ │ ├── rgbToHex.js │ │ └── sagaInjectors.js ├── appveyor.yml ├── babel.config.js ├── docker-compose.ui.yml ├── docs │ ├── README.md │ ├── forks │ │ └── README.md │ ├── general │ │ ├── README.md │ │ ├── commands.md │ │ ├── components.md │ │ ├── debugging.md │ │ ├── deployment.md │ │ ├── editor.md │ │ ├── faq.md │ │ ├── files.md │ │ ├── gotchas.md │ │ ├── introduction.md │ │ ├── remove.md │ │ ├── server-configs.md │ │ ├── webstorm-debug.png │ │ ├── webstorm-eslint.png │ │ └── workflow.png │ ├── js │ │ ├── README.md │ │ ├── async-components.md │ │ ├── i18n.md │ │ ├── immer.md │ │ ├── redux-saga.md │ │ ├── redux.md │ │ ├── remove.md │ │ ├── reselect.md │ │ └── routing.md │ ├── maintenance │ │ └── dependency.md │ └── testing │ │ ├── README.md │ │ ├── component-testing.md │ │ ├── remote-testing.md │ │ └── unit-testing.md ├── internals │ ├── generators │ │ ├── component │ │ │ ├── index.js │ │ │ ├── index.js.hbs │ │ │ ├── loadable.js.hbs │ │ │ ├── messages.js.hbs │ │ │ └── test.js.hbs │ │ ├── container │ │ │ ├── actions.js.hbs │ │ │ ├── actions.test.js.hbs │ │ │ ├── constants.js.hbs │ │ │ ├── index.js │ │ │ ├── index.js.hbs │ │ │ ├── messages.js.hbs │ │ │ ├── reducer.js.hbs │ │ │ ├── reducer.test.js.hbs │ │ │ ├── saga.js.hbs │ │ │ ├── saga.test.js.hbs │ │ │ ├── selectors.js.hbs │ │ │ ├── selectors.test.js.hbs │ │ │ └── test.js.hbs │ │ ├── index.js │ │ ├── language │ │ │ ├── add-locale-data.hbs │ │ │ ├── app-locale.hbs │ │ │ ├── format-translation-messages.hbs │ │ │ ├── index.js │ │ │ ├── intl-locale-data.hbs │ │ │ ├── polyfill-intl-locale.hbs │ │ │ ├── translation-messages.hbs │ │ │ └── translations-json.hbs │ │ └── utils │ │ │ └── componentExists.js │ ├── mocks │ │ ├── cssModule.js │ │ └── image.js │ ├── scripts │ │ ├── analyze.js │ │ ├── clean.js │ │ ├── extract-intl.js │ │ ├── generate-templates-for-linting.js │ │ ├── helpers │ │ │ ├── checkmark.js │ │ │ ├── get-npm-config.js │ │ │ ├── progress.js │ │ │ └── xmark.js │ │ └── npmcheckversion.js │ ├── testing │ │ └── test-bundler.js │ └── webpack │ │ ├── env.js │ │ ├── webpack.base.babel.js │ │ ├── webpack.dev.babel.js │ │ └── webpack.prod.babel.js ├── jest.config.js ├── jsconfig.json ├── package-lock.json ├── package.json └── server │ ├── argv.js │ ├── index.js │ ├── logger.js │ ├── middlewares │ ├── addDevMiddlewares.js │ ├── addProdMiddlewares.js │ └── frontendMiddleware.js │ └── port.js ├── viz ├── __init__.py ├── apps.py ├── migrations │ └── __init__.py ├── templates │ └── viz │ │ ├── dashboard.html │ │ └── dashboard_target.html ├── urls.py └── views.py └── webpack.config.js /.dockerignore: -------------------------------------------------------------------------------- 1 | .dockerignore 2 | Dockerfile 3 | .github 4 | .gitignore 5 | .gitlab-ci-rules.yml 6 | .gitlab-ci.yml 7 | .travis.yml 8 | .direnv 9 | .envrc 10 | docker/containers-data 11 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "@babel/eslint-parser", 3 | "parserOptions": { 4 | "requireConfigFile": false 5 | }, 6 | "rules": { 7 | "strict": 1, 8 | "no-undef": "error" 9 | }, 10 | "env": { 11 | "browser": true, 12 | "node": true, 13 | "jquery": true 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | scirius/local_settings.py 3 | *.swp 4 | git-sources/* 5 | node_modules 6 | rules/static/dist 7 | rules/static/doc 8 | doc/_build/ 9 | -------------------------------------------------------------------------------- /.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | default: 2 | tags: 3 | - scirius 4 | 5 | stages: 6 | - build 7 | - test 8 | - custom 9 | 10 | include: .gitlab-ci-rules.yml 11 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include LICENSE 2 | include README.rst 3 | recursive-include rules/static * 4 | recursive-include rules/templates * 5 | recursive-include suricata/static * 6 | recursive-include suricata/templates * 7 | recursive-include accounts/templates * 8 | recursive-include scirius/templates * 9 | recursive-include viz/templates * 10 | recursive-include viz/migrations * 11 | recursive-include viz/static * 12 | recursive-include accounts/migrations * 13 | recursive-include rules/migrations * 14 | recursive-include suricata/migrations * 15 | recursive-include rules/management *.py 16 | recursive-include suricata/management *.py 17 | 18 | -------------------------------------------------------------------------------- /accounts/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/accounts/management/__init__.py -------------------------------------------------------------------------------- /accounts/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/accounts/management/commands/__init__.py -------------------------------------------------------------------------------- /accounts/migrations/0005_remove_user_flags.py: -------------------------------------------------------------------------------- 1 | from django.db import migrations 2 | 3 | 4 | def migration(apps, _): 5 | User = apps.get_model('auth', 'User') 6 | User.objects.all().update( 7 | is_staff=False, 8 | is_superuser=False 9 | ) 10 | 11 | 12 | class Migration(migrations.Migration): 13 | dependencies = [ 14 | ('rules', '0085_roles_migrations'), 15 | ('accounts', '0004_group'), 16 | ] 17 | 18 | operations = [ 19 | migrations.RunPython(migration) 20 | ] 21 | -------------------------------------------------------------------------------- /accounts/migrations/0006_fix_role_default_priority.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.17 on 2021-03-26 10:06 2 | 3 | import accounts.models 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('accounts', '0005_remove_user_flags'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='group', 16 | name='priority', 17 | field=models.IntegerField(default=accounts.models.get_next_priority), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /accounts/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/accounts/migrations/__init__.py -------------------------------------------------------------------------------- /accounts/south_migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/accounts/south_migrations/__init__.py -------------------------------------------------------------------------------- /accounts/templates/accounts/token_list.html: -------------------------------------------------------------------------------- 1 | {% extends "rules/base.html" %} 2 | {% load bootstrap3 %} 3 | {% block sidebar %} 4 |
5 |

Manage tokens

6 |
7 | 12 | {% endblock sidebar %} 13 | {% block content %} 14 |

Token list

15 | {% load render_table from django_tables2 %} 16 | {% render_table token_table %} 17 | 18 | {% endblock content %} 19 | -------------------------------------------------------------------------------- /doc/_theme/scirius/theme.conf: -------------------------------------------------------------------------------- 1 | [theme] 2 | inherit = nature 3 | stylesheet = nature.css 4 | pygments_style = sphinx 5 | sidebars = localtoc.html, searchbox.html 6 | 7 | #[options] 8 | #variable = default value 9 | -------------------------------------------------------------------------------- /doc/images/kibana-link.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/doc/images/kibana-link.png -------------------------------------------------------------------------------- /doc/images/public-sources.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/doc/images/public-sources.png -------------------------------------------------------------------------------- /doc/images/rule-detail.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/doc/images/rule-detail.png -------------------------------------------------------------------------------- /doc/images/rule-page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/doc/images/rule-page.png -------------------------------------------------------------------------------- /doc/images/ruleset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/doc/images/ruleset.png -------------------------------------------------------------------------------- /doc/images/suricata-display.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/doc/images/suricata-display.png -------------------------------------------------------------------------------- /doc/images/suricata-index.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/doc/images/suricata-index.png -------------------------------------------------------------------------------- /doc/images/suricata-update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/doc/images/suricata-update.png -------------------------------------------------------------------------------- /doc/index.rst: -------------------------------------------------------------------------------- 1 | .. Scirius documentation master file, created by 2 | sphinx-quickstart on Sat Feb 24 23:22:32 2018. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to Scirius's documentation! 7 | =================================== 8 | 9 | .. toctree:: 10 | :maxdepth: 2 11 | :caption: Contents: 12 | 13 | intro-ce 14 | installation-ce 15 | local-user-management 16 | ruleset 17 | hunt 18 | suricata-ce 19 | backup-ce 20 | -------------------------------------------------------------------------------- /doc/intro-ce.rst: -------------------------------------------------------------------------------- 1 | Introduction 2 | ============ 3 | 4 | Scirius Community Edition is a web interface dedicated to Suricata ruleset management. 5 | It handles the rules file and update associated files. 6 | 7 | .. image:: images/suricata-index.png 8 | :alt: suricata update in scirius 9 | :align: center 10 | 11 | Scirius CE is developed by `Stamus Networks `_ and is available under the 12 | GNU GPLv3 license. 13 | -------------------------------------------------------------------------------- /docker/README.txt: -------------------------------------------------------------------------------- 1 | local development setup -------------------------------------------------------------------------------- /docker/configs/opensearch/opensearch.yml: -------------------------------------------------------------------------------- 1 | plugins.security.disabled: true 2 | 3 | discovery.type: single-node 4 | xpack.security.enabled: false 5 | xpack.ml.enabled: true 6 | ingest.geoip.downloader.enabled: false 7 | -------------------------------------------------------------------------------- /docker/configs/opensearch_dashboards/opensearch_dashboards.yml: -------------------------------------------------------------------------------- 1 | server.host: 0.0.0.0 2 | opensearch.hosts: http://elasticsearch:9200 3 | -------------------------------------------------------------------------------- /docker/containers-data/.gitignore: -------------------------------------------------------------------------------- 1 | scirius 2 | -------------------------------------------------------------------------------- /docker/containers-data/cron-jobs/daily/scirius-update-suri-rules.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | 3 | echo "Updating Suricata rules from Scirius" 4 | docker exec scirius python /opt/scirius/manage.py updatesuricata && echo "done." || echo "ERROR" 5 | -------------------------------------------------------------------------------- /docker/containers-data/cron-jobs/daily/suricata-logrotate.sh: -------------------------------------------------------------------------------- 1 | #! /bin/sh 2 | # 3 | # Example of rotating the logs within the Suricata container. 4 | # 5 | # Add -v for verbose output. 6 | # Add -f to force rotation. 7 | 8 | echo "Rotating Suricata logs" 9 | docker exec suricata logrotate -v /etc/logrotate.d/suricata $@ && echo "done." || echo "ERROR" 10 | -------------------------------------------------------------------------------- /docker/containers-data/suricata/.gitignore: -------------------------------------------------------------------------------- 1 | etc/classification.config 2 | etc/reference.config 3 | etc/rules/ 4 | etc/suricata.yaml 5 | etc/threshold.config 6 | etc/update.yaml 7 | logs/ 8 | logrotate/ 9 | -------------------------------------------------------------------------------- /docker/fluentd/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ghcr.io/calyptia/fluentd:v1.14.6-debian-1.0 2 | 3 | USER root 4 | 5 | RUN gem install fluent-plugin-opensearch 6 | RUN fluent-gem install fluent-plugin-rewrite-tag-filter fluent-plugin-multi-format-parser 7 | 8 | USER fluent 9 | ENTRYPOINT ["tini", "--", "/bin/entrypoint.sh"] 10 | CMD ["fluentd"] -------------------------------------------------------------------------------- /docker/opensearch-dashboards/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM opensearchproject/opensearch-dashboards:1 2 | RUN /usr/share/opensearch-dashboards/bin/opensearch-dashboards-plugin remove securityDashboards -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "scirius.settings") 7 | 8 | from django.core.management import execute_from_command_line 9 | 10 | execute_from_command_line(sys.argv) 11 | -------------------------------------------------------------------------------- /npm/npm.scss: -------------------------------------------------------------------------------- 1 | @import "~bootstrap/scss/bootstrap"; 2 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | }; -------------------------------------------------------------------------------- /rules/hunt_webpack.py: -------------------------------------------------------------------------------- 1 | from webpack_loader.loader import WebpackLoader 2 | 3 | 4 | class HuntLoader(WebpackLoader): 5 | def get_assets(self): 6 | assets = super().get_assets() 7 | assets['assets'] = {} 8 | for asset in assets['chunks']['main']: 9 | assets['assets'][asset['name']] = asset 10 | 11 | assets['chunks']['main'] = list(assets['assets'].keys()) 12 | return assets 13 | -------------------------------------------------------------------------------- /rules/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/management/__init__.py -------------------------------------------------------------------------------- /rules/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/management/commands/__init__.py -------------------------------------------------------------------------------- /rules/migrations/0040_ruleset_rules_count.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('rules', '0039_auto_20150805_1737'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='ruleset', 16 | name='rules_count', 17 | field=models.IntegerField(default=0), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /rules/migrations/0041_source_authkey.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('rules', '0040_ruleset_rules_count'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='source', 16 | name='authkey', 17 | field=models.CharField(max_length=400, null=True, blank=True), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /rules/migrations/0042_rule_state_in_source.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | from django.db import models, migrations 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('rules', '0041_source_authkey'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='rule', 16 | name='state_in_source', 17 | field=models.BooleanField(default=True), 18 | preserve_default=True, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /rules/migrations/0044_flowbit_type.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('rules', '0043_threshold'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='flowbit', 16 | name='type', 17 | field=models.CharField(default='flowbits', max_length=12, choices=[(b'flowbits', b'Flowbits'), (b'hostbits', b'Hostbits'), (b'xbits', b'Xbits')]), 18 | preserve_default=False, 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /rules/migrations/0045_auto_20160405_1300.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('rules', '0044_flowbit_type'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='threshold', 16 | name='threshold_type', 17 | field=models.CharField(default=b'suppress', max_length=20, choices=[(b'threshold', b'threshold'), (b'suppress', b'suppress')]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rules/migrations/0046_source_cert_verif.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('rules', '0045_auto_20160405_1300'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='source', 16 | name='cert_verif', 17 | field=models.BooleanField(default=True, verbose_name=b'Check certificates'), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rules/migrations/0051_auto_20161207_0758.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('rules', '0050_auto_20161128_2110'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='useraction', 16 | name='options', 17 | field=models.CharField(default=None, max_length=1000, null=True, blank=True), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rules/migrations/0058_source_public_source.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.10 on 2018-03-05 09:24 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('rules', '0057_auto_20180302_1312'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='source', 17 | name='public_source', 18 | field=models.CharField(blank=True, max_length=100, null=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /rules/migrations/0062_useraction_username.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.13 on 2018-06-05 08:21 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('rules', '0061_auto_20180507_1410'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='useraction', 17 | name='username', 18 | field=models.CharField(max_length=150), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /rules/migrations/0063_merge_20180718_0118.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.11 on 2018-07-18 01:18 3 | 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('rules', '0062_useraction_username'), 12 | ('rules', '0061_auto_20180503_2200'), 13 | ] 14 | 15 | operations = [ 16 | ] 17 | -------------------------------------------------------------------------------- /rules/migrations/0064_ruleprocessingfilter_rulesets.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.13 on 2018-07-03 08:58 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('rules', '0063_ruleprocessingfilter_ruleprocessingfilterdef'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='ruleprocessingfilter', 17 | name='rulesets', 18 | field=models.ManyToManyField(related_name='processing_filters', to='rules.Ruleset'), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /rules/migrations/0065_merge_20180719_1505.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.11 on 2018-07-19 15:05 3 | 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('rules', '0063_merge_20180718_0118'), 12 | ('rules', '0064_ruleprocessingfilter_rulesets'), 13 | ] 14 | 15 | operations = [ 16 | ] 17 | -------------------------------------------------------------------------------- /rules/migrations/0068_auto_20180818_2204.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.13 on 2018-08-18 22:04 3 | 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('rules', '0067_source_use_iprep'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterModelOptions( 16 | name='ruleprocessingfilterdef', 17 | options={'ordering': ('key', 'value')}, 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rules/migrations/0069_auto_20190220_1500.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.16 on 2019-02-20 15:00 3 | 4 | 5 | from django.db import migrations, models 6 | import rules.validators 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('rules', '0068_auto_20180818_2204'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='threshold', 18 | name='net', 19 | field=models.CharField(blank=True, max_length=100, validators=[rules.validators.validate_address_or_network]), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /rules/migrations/0070_ruleprocessingfilterdef_full_string.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.16 on 2019-05-06 06:36 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('rules', '0069_auto_20190220_1500'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='ruleprocessingfilterdef', 17 | name='full_string', 18 | field=models.BooleanField(default=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /rules/migrations/0072_send_mail.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.16 on 2019-01-11 15:28 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('rules', '0071_filterset'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='ruleprocessingfilter', 17 | name='action', 18 | field=models.CharField(choices=[('suppress', 'Suppress'), ('threshold', 'Threshold'), ('tag', 'Tag'), ('tagkeep', 'Tag and keep'), ('send_mail', 'Send email')], max_length=10), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /rules/migrations/0073_filterset_description.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.20 on 2019-07-03 13:47 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('rules', '0072_send_mail'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='filterset', 17 | name='description', 18 | field=models.TextField(blank=True, null=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /rules/migrations/0075_custom_es_no_empty.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.20 on 2019-09-18 10:11 3 | 4 | 5 | from django.db import migrations, models 6 | import rules.models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('rules', '0074_redlights_useraction'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='systemsettings', 18 | name='elasticsearch_url', 19 | field=models.CharField(default='http://elasticsearch:9200/', max_length=200, validators=[rules.models.validate_url]), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /rules/migrations/0075_suppress_validator.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.20 on 2019-09-16 10:03 3 | 4 | 5 | from django.db import migrations, models 6 | import rules.validators 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('rules', '0074_redlights_useraction'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='threshold', 18 | name='net', 19 | field=models.CharField(blank=True, max_length=100, validators=[rules.validators.validate_addresses_or_networks]), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /rules/migrations/0076_merge_20190926_1233.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.20 on 2019-09-26 12:33 3 | 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('rules', '0075_custom_es_no_empty'), 12 | ('rules', '0075_suppress_validator'), 13 | ] 14 | 15 | operations = [ 16 | ] 17 | -------------------------------------------------------------------------------- /rules/migrations/0077_auto_20191002_0820.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.20 on 2019-10-02 08:20 3 | 4 | 5 | from django.db import migrations 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('rules', '0076_merge_20190926_1233'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name='useraction', 17 | name='content_type', 18 | ), 19 | migrations.RemoveField( 20 | model_name='useraction', 21 | name='object_id', 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /rules/migrations/0078_auto_20200206_1648.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.20 on 2020-02-06 16:48 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('rules', '0077_auto_20191002_0820'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='ruleprocessingfilter', 17 | name='action', 18 | field=models.CharField(max_length=10), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /rules/migrations/0079_source_remove_choice.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.20 on 2020-03-10 08:34 3 | 4 | 5 | from django.db import migrations, models 6 | import rules.models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('rules', '0078_auto_20200206_1648'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='source', 18 | name='datatype', 19 | field=models.CharField(max_length=10, validators=[rules.models.validate_source_datatype]), 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /rules/migrations/0080_source_version.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Generated by Django 1.11.20 on 2020-03-26 16:52 3 | 4 | 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('rules', '0079_source_remove_choice'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AddField( 16 | model_name='source', 17 | name='version', 18 | field=models.IntegerField(default=1), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /rules/migrations/0082_source_use_sys_proxy.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.13 on 2020-11-19 13:37 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0081_django-2'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='source', 15 | name='use_sys_proxy', 16 | field=models.BooleanField(default=True, verbose_name='Use system proxy'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0083_multi_es_validation.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.17 on 2020-12-31 16:58 2 | 3 | from django.db import migrations, models 4 | import rules.models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('rules', '0082_source_use_sys_proxy'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='systemsettings', 16 | name='elasticsearch_url', 17 | field=models.CharField(default='http://elasticsearch:9200/', max_length=4096, validators=[rules.models.validate_url_list]), 18 | ), 19 | ] 20 | -------------------------------------------------------------------------------- /rules/migrations/0086_ruleset_suppressed_sids.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.17 on 2021-03-16 14:29 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0085_roles_migrations'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='ruleset', 15 | name='suppressed_sids', 16 | field=models.TextField(blank=True, default='', verbose_name='Suppress events'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0087_systemsettings_use_proxy_for_es.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.17 on 2021-06-10 13:39 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0086_ruleset_suppressed_sids'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='systemsettings', 15 | name='use_proxy_for_es', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0089_ruleprocessingfilter_event_type.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-08-04 07:09 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0088_ruleprocessingfilter_import_member'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='ruleprocessingfilter', 15 | name='event_type', 16 | field=models.CharField(default='alert', max_length=32), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0090_useraction_ip.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2021-08-25 09:43 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0089_ruleprocessingfilter_event_type'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='useraction', 15 | name='client_ip', 16 | field=models.CharField(blank=True, max_length=64, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0093_systemsettings_custom_cookie_age.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.24 on 2022-03-31 08:20 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0092_auto_20220412_1219'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='systemsettings', 15 | name='custom_cookie_age', 16 | field=models.FloatField(default=360, verbose_name='Age of session cookies'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0095_ruleset_activate_categories.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.15 on 2022-09-06 08:42 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0094_elasticsearch_auth'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='ruleset', 15 | name='activate_categories', 16 | field=models.BooleanField(default=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0096_systemsettings_custom_login_banner.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.15 on 2022-09-26 08:03 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0095_ruleset_activate_categories'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='systemsettings', 15 | name='custom_login_banner', 16 | field=models.TextField(blank=True, default='', verbose_name='Add your own banner on login page'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0097_auto_20221121_1645.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.16 on 2022-11-21 16:45 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0096_systemsettings_custom_login_banner'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='source', 15 | name='cats_count', 16 | ), 17 | migrations.RemoveField( 18 | model_name='source', 19 | name='rules_count', 20 | ), 21 | ] 22 | -------------------------------------------------------------------------------- /rules/migrations/0098_source_trusted.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.16 on 2022-12-16 09:18 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0097_auto_20221121_1645'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='source', 15 | name='untrusted', 16 | field=models.BooleanField(default=True, verbose_name='Source sanitization'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0099_alter_source_datatype.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.16 on 2023-02-17 09:36 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0098_source_trusted'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='source', 15 | name='datatype', 16 | field=models.CharField(max_length=10), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0100_systemsettings_session_cookie_age.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.18 on 2023-10-10 14:40 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0099_alter_source_datatype'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='systemsettings', 15 | name='session_cookie_age', 16 | field=models.IntegerField(default=0), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0103_alter_rule_sid.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.20 on 2023-10-04 21:34 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0102_auto_20230626_1624'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='rule', 15 | name='sid', 16 | field=models.BigIntegerField(primary_key=True, serialize=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0104_ruleatversion_analysis.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.20 on 2024-02-07 14:09 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0103_alter_rule_sid'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='ruleatversion', 15 | name='analysis', 16 | field=models.TextField(blank=True, null=True), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0105_source_is_stamus.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.25 on 2024-05-17 15:29 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0104_ruleatversion_analysis'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='source', 15 | name='is_stamus', 16 | field=models.BooleanField(default=False), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0106_alter_ruleprocessingfilterdef_value.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.25 on 2024-06-07 07:46 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0105_source_is_stamus'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='ruleprocessingfilterdef', 15 | name='value', 16 | field=models.CharField(max_length=1024), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/0108_alter_source_created_date.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.25 on 2024-09-23 07:56 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('rules', '0107_deeplink_deeplinkentity'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='source', 15 | name='created_date', 16 | field=models.DateTimeField(auto_now_add=True, verbose_name='date created'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /rules/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/migrations/__init__.py -------------------------------------------------------------------------------- /rules/south_migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/south_migrations/__init__.py -------------------------------------------------------------------------------- /rules/static/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /rules/static/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /rules/static/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /rules/static/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /rules/static/rules/Stamus_Pattern_16x9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/Stamus_Pattern_16x9.jpg -------------------------------------------------------------------------------- /rules/static/rules/Stamus_SEH_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/Stamus_SEH_icon.png -------------------------------------------------------------------------------- /rules/static/rules/Stamus_SPM_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/Stamus_SPM_icon.png -------------------------------------------------------------------------------- /rules/static/rules/Stamus_STR_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/Stamus_STR_icon.png -------------------------------------------------------------------------------- /rules/static/rules/about-modal-pf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/about-modal-pf.png -------------------------------------------------------------------------------- /rules/static/rules/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/favicon.ico -------------------------------------------------------------------------------- /rules/static/rules/images/ui-icons_444444_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/images/ui-icons_444444_256x240.png -------------------------------------------------------------------------------- /rules/static/rules/images/ui-icons_555555_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/images/ui-icons_555555_256x240.png -------------------------------------------------------------------------------- /rules/static/rules/images/ui-icons_777620_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/images/ui-icons_777620_256x240.png -------------------------------------------------------------------------------- /rules/static/rules/images/ui-icons_777777_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/images/ui-icons_777777_256x240.png -------------------------------------------------------------------------------- /rules/static/rules/images/ui-icons_cc0000_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/images/ui-icons_cc0000_256x240.png -------------------------------------------------------------------------------- /rules/static/rules/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /rules/static/rules/scirius.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/scirius.jpg -------------------------------------------------------------------------------- /rules/static/rules/selks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/selks.png -------------------------------------------------------------------------------- /rules/static/rules/stamus-color.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/stamus-color.png -------------------------------------------------------------------------------- /rules/static/rules/stamus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/stamus.png -------------------------------------------------------------------------------- /rules/static/rules/stamus_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/rules/static/rules/stamus_logo.png -------------------------------------------------------------------------------- /rules/templates/rules/copy_ruleset.html: -------------------------------------------------------------------------------- 1 | {% extends "rules/base.html" %} 2 | {% load bootstrap3 %} 3 | {% block sidebar %} 4 |
5 |

Copy ruleset "{{ object.name }}"

6 |
7 | {% endblock sidebar %} 8 | {% block content %} 9 | {% if form %} 10 |
13 | {% csrf_token %} 14 | {% bootstrap_form form %} 15 | 16 |
17 | {% endif %} 18 | {% endblock content %} 19 | -------------------------------------------------------------------------------- /rules/templates/rules/history.html: -------------------------------------------------------------------------------- 1 | {% extends "rules/base.html" %} 2 | {% block content %} 3 |

User action history

4 | {% include "rules/useraction.html" %} 5 | {% endblock %} 6 | {% block sidebar %} 7 |
8 |

History

9 |
10 |
Chronological list of user actions and comments.
11 | {% endblock %} 12 | -------------------------------------------------------------------------------- /rules/templates/rules/schedule_recurrence.html: -------------------------------------------------------------------------------- 1 | {% load bootstrap3 %} 2 | 3 |
4 | {% bootstrap_label "Periodicity" %} 5 | {% include 'rules/schedule.html' %} 6 | {% include 'rules/recurrence.html' %} 7 |
8 | -------------------------------------------------------------------------------- /rules/templates/rules/table.html: -------------------------------------------------------------------------------- 1 | {% if table %} 2 | {% load render_table from django_tables2 %} 3 | {% render_table table %} 4 | {% else %} 5 |

6 | No data for period. 7 |

8 | {% endif %} 9 | -------------------------------------------------------------------------------- /scirius/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/scirius/__init__.py -------------------------------------------------------------------------------- /scirius/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for scirius project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.6/howto/deployment/wsgi/ 8 | """ 9 | 10 | 11 | import os 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "scirius.settings") 15 | application = get_wsgi_application() 16 | -------------------------------------------------------------------------------- /scss/_variables.scss: -------------------------------------------------------------------------------- 1 | $brand-color: #005792; 2 | $brand-green: #0297A9; 3 | $background-black: #414042; 4 | $border-black: #414042; 5 | $light-background: #dcddde; 6 | $light-border: #dcddde; 7 | $success-color: #0297a9; 8 | $warning-color: #fbde00; 9 | $danger-color: #923b00; 10 | -------------------------------------------------------------------------------- /suricata/__init__.py: -------------------------------------------------------------------------------- 1 | # This will make sure the app is always imported when 2 | # Django starts so that shared_task will use this app. 3 | from .celery import app as celery_app # noqa: F401 4 | 5 | from . import common # noqa: F401 6 | -------------------------------------------------------------------------------- /suricata/admin.py: -------------------------------------------------------------------------------- 1 | 2 | from django.contrib import admin # noqa: F401 3 | 4 | # Register your models here. 5 | from suricata.models import Suricata # noqa: F401 6 | -------------------------------------------------------------------------------- /suricata/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/suricata/management/__init__.py -------------------------------------------------------------------------------- /suricata/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/suricata/management/commands/__init__.py -------------------------------------------------------------------------------- /suricata/migrations/0002_auto_20151110_1657.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | from django.db import models, migrations 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('suricata', '0001_initial'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='suricata', 17 | name='ruleset', 18 | field=models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, to='rules.Ruleset', null=True), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /suricata/migrations/0006_alter_suricata_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.2.13 on 2022-04-12 12:19 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('suricata', '0005_django-2'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='suricata', 15 | name='id', 16 | field=models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /suricata/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/suricata/migrations/__init__.py -------------------------------------------------------------------------------- /suricata/sc/__init__.py: -------------------------------------------------------------------------------- 1 | from suricata.sc.suricatasc import SuricataSC 2 | __all__ = ['SuricataSC'] 3 | -------------------------------------------------------------------------------- /suricata/south_migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/suricata/south_migrations/__init__.py -------------------------------------------------------------------------------- /tests/master-build.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | -------------------------------------------------------------------------------- /tests/robotframework/10_rules/__init__.robot: -------------------------------------------------------------------------------- 1 | | * Settings * | | 2 | | Documentation | Scirius rules tests | 3 | | Library | OperatingSystem | 4 | | Library | Process | 5 | | Resource | ../config.txt | 6 | | Resource | common.robot | 7 | | Suite Setup | Suite Setup | 8 | -------------------------------------------------------------------------------- /ui/.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | insert_final_newline = true 9 | indent_style = space 10 | indent_size = 2 11 | trim_trailing_whitespace = true 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /ui/.env: -------------------------------------------------------------------------------- 1 | REACT_APP_HAS_ACTION=1 2 | REACT_APP_HAS_TAG=1 3 | -------------------------------------------------------------------------------- /ui/.nvmrc: -------------------------------------------------------------------------------- 1 | lts/dubnium 2 | -------------------------------------------------------------------------------- /ui/.prettierignore: -------------------------------------------------------------------------------- 1 | build/ 2 | node_modules/ 3 | internals/generators/ 4 | internals/scripts/ 5 | package-lock.json 6 | yarn.lock 7 | package.json 8 | -------------------------------------------------------------------------------- /ui/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 150, 3 | "tabWidth": 2, 4 | "useTabs": false, 5 | "semi": true, 6 | "singleQuote": true, 7 | "trailingComma": "all", 8 | "arrowParens": "avoid" 9 | } 10 | -------------------------------------------------------------------------------- /ui/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - 'node' 5 | - 'lts/*' 6 | 7 | script: 8 | - node ./internals/scripts/generate-templates-for-linting 9 | - npm test -- --maxWorkers=4 10 | - npm run build 11 | 12 | before_install: 13 | - export CHROME_BIN=chromium-browser 14 | - export DISPLAY=:99.0 15 | - sh -e /etc/init.d/xvfb start 16 | 17 | notifications: 18 | email: 19 | on_failure: change 20 | 21 | after_success: 'npm run coveralls' 22 | 23 | cache: 24 | directories: 25 | - node_modules 26 | -------------------------------------------------------------------------------- /ui/Dockerfile.ui.dev: -------------------------------------------------------------------------------- 1 | # manual way of starting the container (otherwise see docker-compose.ui.yml): 2 | # docker build -f Dockerfile.ui.dev -t tzetzo/ui . 3 | # docker run -p 3003:3000 tzetzo/ui 4 | 5 | FROM debian:buster 6 | 7 | WORKDIR /app 8 | 9 | RUN apt-get update &&\ 10 | apt-get install -y curl &&\ 11 | curl -fsSL https://deb.nodesource.com/setup_18.x | bash - &&\ 12 | apt-get install -y nodejs &&\ 13 | apt-get install -y ssh rsync 14 | 15 | COPY . . 16 | 17 | WORKDIR /app/ui 18 | 19 | RUN npm install 20 | 21 | CMD ["npm", "start"] 22 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/012.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/044.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/048.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/050.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/056.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/104.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/120.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/148.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/152.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/178.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/204.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/250.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/254.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/266.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/270.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/275.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/276.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/288.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/324.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/328.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/372.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/380.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/384.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/388.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/418.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/428.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/450.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/466.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/540.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/566.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/624.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/634.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/638.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/642.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/652.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/662.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/663.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/670.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/686.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/706.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/729.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/740.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/764.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/784.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/876.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/AE.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/ARE.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/BD.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/BE.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/BEL.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/BEN.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/BGD.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/BH.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/BHR.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/BHS.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/BJ.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/BL.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/BLM.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/BQ-SA.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/BS.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/CG.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/CHL.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/CI.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/CIV.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/CL.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/CM.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/CMR.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/COG.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/DE.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/DEU.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/DZ.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/DZA.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/FR.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/FRA.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GA.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GAB.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GB-ENG.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GB-SCT.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GF.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GH.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GHA.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GIN.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GM.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GMB.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GN.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GNB.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GUF.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GUY.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GW.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/GY.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/IE.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/IRL.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/IT.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/ITA.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/JAM.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/JM.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/LA.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/LAO.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/LC.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/LCA.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/LV.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/LVA.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/MAF.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/MDG.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/MF.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/MG.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/ML.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/MLI.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/MM.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/MMR.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/NC.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/NCL.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/NG.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/NGA.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/PS.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/PSE.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/QA.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/QAT.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/RE.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/REU.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/RO.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/ROU.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/SD.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/SDN.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/SEN.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/SN.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/SO.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/SOM.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/SR.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/SUR.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/TCD.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/TD.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/TH.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/THA.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/VC.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/VCT.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/WF.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/flags/files/WLF.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-mu0SC55I.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS-mu0SC55I.woff2 -------------------------------------------------------------------------------- /ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu0SC55K5gw.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTS2mu0SC55K5gw.woff2 -------------------------------------------------------------------------------- /ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu0SC55K5gw.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSCmu0SC55K5gw.woff2 -------------------------------------------------------------------------------- /ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu0SC55K5gw.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSGmu0SC55K5gw.woff2 -------------------------------------------------------------------------------- /ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu0SC55K5gw.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSKmu0SC55K5gw.woff2 -------------------------------------------------------------------------------- /ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu0SC55K5gw.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSOmu0SC55K5gw.woff2 -------------------------------------------------------------------------------- /ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu0SC55K5gw.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSumu0SC55K5gw.woff2 -------------------------------------------------------------------------------- /ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu0SC55K5gw.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/app/assets/fonts/files/opensans-v27-memvYaGs126MiZpBA-UvWbX2vVnXBbObj2OVTSymu0SC55K5gw.woff2 -------------------------------------------------------------------------------- /ui/app/assets/icons/arrow.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export const ArrowIcon = () => ( 4 | 15 | 16 | 17 | 18 | 19 | 20 | ); 21 | -------------------------------------------------------------------------------- /ui/app/assets/icons/client.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export const ClientIcon = () => ( 4 | 15 | 16 | 17 | 18 | 19 | 20 | ); 21 | -------------------------------------------------------------------------------- /ui/app/assets/icons/index.js: -------------------------------------------------------------------------------- 1 | export { ArrowIcon } from './arrow'; 2 | export { ClientIcon } from './client'; 3 | export { ReadMoreIcon } from './read_more'; 4 | export { ServerIcon } from './server'; 5 | export { SwordIcon } from './sword'; 6 | export { TargetIcon } from './target'; 7 | -------------------------------------------------------------------------------- /ui/app/assets/icons/read_more.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export const ReadMoreIcon = () => ( 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | ); 18 | -------------------------------------------------------------------------------- /ui/app/assets/icons/sword.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export const SwordIcon = () => ( 4 | 16 | 17 | 18 | 19 | 20 | 21 | ); 22 | -------------------------------------------------------------------------------- /ui/app/assets/images/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/app/assets/images/favicon.ico -------------------------------------------------------------------------------- /ui/app/assets/images/icon-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/app/assets/images/icon-512x512.png -------------------------------------------------------------------------------- /ui/app/assets/images/stamus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/app/assets/images/stamus.png -------------------------------------------------------------------------------- /ui/app/assets/images/stamus_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/app/assets/images/stamus_logo.png -------------------------------------------------------------------------------- /ui/app/buildFilterParams.js: -------------------------------------------------------------------------------- 1 | export function buildFilterParams(filterParams) { 2 | const fromDate = filterParams.duration > 0 ? `from_date=${Date.now() - parseInt(filterParams.duration, 10)}` : `from_date=${filterParams.fromDate}`; 3 | const toDate = filterParams.duration > 0 ? `&to_date=${Date.now()}` : `&to_date=${filterParams.toDate}`; 4 | return `${fromDate}${toDate}`; 5 | } 6 | -------------------------------------------------------------------------------- /ui/app/components/AdditionalFilters/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const AdditionalFilters = () =>
; 4 | 5 | export default AdditionalFilters; 6 | -------------------------------------------------------------------------------- /ui/app/components/AlertRelatedData/style.js: -------------------------------------------------------------------------------- 1 | import { Table as AntTable } from 'antd'; 2 | import styled from 'styled-components'; 3 | 4 | export const Table = styled(AntTable)` 5 | .ant-table { 6 | margin: 0 !important; 7 | } 8 | td { 9 | font-size: 0.75rem; 10 | } 11 | .pretty-json-container { 12 | font-size: 1rem; 13 | } 14 | `; 15 | 16 | export const BreakAnywhere = styled.div` 17 | word-break: break-all; 18 | white-space: pre-wrap; 19 | `; 20 | -------------------------------------------------------------------------------- /ui/app/components/AlgorithmicDetection/index.js: -------------------------------------------------------------------------------- 1 | export { AlgorithmicDetection } from './AlgorithmicDetection'; 2 | -------------------------------------------------------------------------------- /ui/app/components/AlgorithmicDetection/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Row = styled.div` 4 | display: grid; 5 | grid-template-columns: 1fr 1fr; 6 | grid-gap: 1rem; 7 | margin-bottom: 1rem; 8 | `; 9 | -------------------------------------------------------------------------------- /ui/app/components/AppSpinner/index.js: -------------------------------------------------------------------------------- 1 | import { Spin } from 'antd'; 2 | import styled from 'styled-components'; 3 | 4 | const AppSpinner = styled(Spin)` 5 | height: 100vh; 6 | display: flex; 7 | align-items: center; 8 | justify-content: center; 9 | `; 10 | 11 | export default AppSpinner; 12 | -------------------------------------------------------------------------------- /ui/app/components/Charts/Timeline/index.js: -------------------------------------------------------------------------------- 1 | export { Timeline } from './Timeline'; 2 | -------------------------------------------------------------------------------- /ui/app/components/Charts/Timeline/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const EmptyWrapper = styled.div` 4 | display: flex; 5 | justify-content: center; 6 | align-items: center; 7 | height: calc(100% - 20px); 8 | `; 9 | -------------------------------------------------------------------------------- /ui/app/components/Charts/components/index.js: -------------------------------------------------------------------------------- 1 | export { XAxisLabelDateTime } from './XAxisLabelDateTime'; 2 | -------------------------------------------------------------------------------- /ui/app/components/Charts/config.js: -------------------------------------------------------------------------------- 1 | export const keyColors = { 2 | relevant: '#ec7a08', 3 | informational: '#7b1244', 4 | untagged: '#005792', 5 | default: '#0044ff', 6 | }; 7 | -------------------------------------------------------------------------------- /ui/app/components/Charts/index.js: -------------------------------------------------------------------------------- 1 | export { Timeline } from './Timeline'; 2 | export { XAxisLabelDateTime } from './components'; 3 | -------------------------------------------------------------------------------- /ui/app/components/Content/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Layout } from 'antd'; 4 | import PropTypes from 'prop-types'; 5 | import styled from 'styled-components'; 6 | 7 | const { Content: AntdContent } = Layout; 8 | 9 | const StyledOuterWrapper = styled(AntdContent)` 10 | padding: 0 20px 20px 20px; 11 | `; 12 | 13 | const Content = ({ children }) => {children}; 14 | 15 | Content.propTypes = { 16 | children: PropTypes.any, 17 | }; 18 | 19 | export default Content; 20 | -------------------------------------------------------------------------------- /ui/app/components/EventField/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import EventValue from 'ui/components/EventValue'; 6 | import Filter from 'ui/utils/Filter'; 7 | 8 | const EventField = ({ filter }) => { 9 | if (typeof filter.value === 'undefined') return null; 10 | 11 | return ( 12 |
13 |
{filter.title}
14 |
15 | 16 |
17 |
18 | ); 19 | }; 20 | 21 | EventField.propTypes = { 22 | filter: PropTypes.instanceOf(Filter), 23 | }; 24 | 25 | export default EventField; 26 | -------------------------------------------------------------------------------- /ui/app/components/FilterItem/FilterActionButton.styled.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | const FilterActionButton = styled.a` 4 | padding: 5px !important; 5 | margin: 0 !important; 6 | color: #ffffff; 7 | cursor: ${p => (p.disabled ? 'not-allowed' : 'pointer')}; 8 | &:hover { 9 | color: #ffffff; 10 | } 11 | `; 12 | 13 | export default FilterActionButton; 14 | -------------------------------------------------------------------------------- /ui/app/components/FilterItem/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './FilterItem'; 2 | -------------------------------------------------------------------------------- /ui/app/components/FilterList/index.js: -------------------------------------------------------------------------------- 1 | export { default } from './FilterList'; 2 | -------------------------------------------------------------------------------- /ui/app/components/FilterSetSaveModal/actions.js: -------------------------------------------------------------------------------- 1 | import constants from './constants'; 2 | 3 | const saveFilterSetRequest = data => ({ 4 | type: constants.SAVE_FILTER_SET_REQUEST, 5 | payload: { data }, 6 | }); 7 | 8 | const saveFilterSetSuccess = data => ({ 9 | type: constants.SAVE_FILTER_SET_SUCCESS, 10 | payload: { data }, 11 | }); 12 | 13 | const saveFilterSetFailure = error => ({ 14 | type: constants.SAVE_FILTER_SET_FAILURE, 15 | payload: error, 16 | }); 17 | 18 | export default { 19 | saveFilterSetRequest, 20 | saveFilterSetSuccess, 21 | saveFilterSetFailure, 22 | }; 23 | -------------------------------------------------------------------------------- /ui/app/components/FilterSetSaveModal/constants.js: -------------------------------------------------------------------------------- 1 | const SAVE_FILTER_SET_REQUEST = 'APP/COMPONENTS/SAVE_FILTER_SET_REQUEST'; 2 | const SAVE_FILTER_SET_SUCCESS = 'APP/COMPONENTS/SAVE_FILTER_SET_SUCCESS'; 3 | const SAVE_FILTER_SET_FAILURE = 'APP/COMPONENTS/SAVE_FILTER_SET_FAILURE'; 4 | 5 | export default { 6 | SAVE_FILTER_SET_REQUEST, 7 | SAVE_FILTER_SET_SUCCESS, 8 | SAVE_FILTER_SET_FAILURE, 9 | }; 10 | -------------------------------------------------------------------------------- /ui/app/components/FilterSetSaveModal/selectors.js: -------------------------------------------------------------------------------- 1 | import { createSelector } from 'reselect'; 2 | 3 | import { initialState } from './reducer'; 4 | 5 | const selectForm = state => state.filterSetSave || initialState; 6 | const makeSelectForm = () => createSelector(selectForm, subState => subState.request); 7 | 8 | export default { 9 | makeSelectForm, 10 | }; 11 | -------------------------------------------------------------------------------- /ui/app/components/Filters/Title.styled.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | const Title = styled.div` 4 | padding: 0px 0px 5px 0px; 5 | color: #005792; 6 | font-weight: bold; 7 | `; 8 | 9 | export default Title; 10 | -------------------------------------------------------------------------------- /ui/app/components/Filters/components/styles.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const ActionButton = styled.div` 4 | display: flex; 5 | flex-direction: row; 6 | align-items: center; 7 | cursor: ${p => (p.active ? 'pointer' : 'default')}; 8 | border-radius: 5px; 9 | gap: 2px; 10 | &:hover { 11 | background: ${p => (p.active ? '#f0f2f5' : 'none')}; 12 | } 13 | svg { 14 | padding: 0 2px; 15 | fill: ${p => (p.active ? '#196d9e' : '#000')}; 16 | } 17 | `; 18 | -------------------------------------------------------------------------------- /ui/app/components/Flow/MethodTitle.js: -------------------------------------------------------------------------------- 1 | export const MethodTitle = () => {}; 2 | -------------------------------------------------------------------------------- /ui/app/components/IconAntd/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | const AntdIcon = ({ component }) => { 6 | const Component = component; 7 | return ( 8 | 9 | 10 | 11 | ); 12 | }; 13 | 14 | AntdIcon.propTypes = { 15 | component: PropTypes.any, 16 | }; 17 | 18 | export default AntdIcon; 19 | -------------------------------------------------------------------------------- /ui/app/components/LoadingIndicator/Wrapper.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | const Wrapper = styled.div` 4 | margin: 2em auto; 5 | width: 40px; 6 | height: 40px; 7 | position: relative; 8 | `; 9 | 10 | export default Wrapper; 11 | -------------------------------------------------------------------------------- /ui/app/components/LogoutMenuItem/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { PoweroffOutlined } from '@ant-design/icons'; 4 | 5 | import * as Styled from 'ui/components/UserMenu/style'; 6 | 7 | const LogoutMenuItem = () => ( 8 | } 12 | onClick={() => { 13 | window.location = '/accounts/logout'; 14 | }} 15 | data-test="logout-button" 16 | > 17 | Log Out 18 | 19 | ); 20 | 21 | export default LogoutMenuItem; 22 | -------------------------------------------------------------------------------- /ui/app/components/Markdown/Markdown.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import { getMarkdownText } from 'ui/helpers/markdown'; 6 | 7 | /* eslint-disable react/no-danger */ 8 | export const Markdown = ({ text }) =>
; 9 | 10 | Markdown.propTypes = { 11 | text: PropTypes.string, 12 | }; 13 | -------------------------------------------------------------------------------- /ui/app/components/Markdown/index.js: -------------------------------------------------------------------------------- 1 | export { Markdown } from './Markdown'; 2 | -------------------------------------------------------------------------------- /ui/app/components/Modal/DocDopvModal.js: -------------------------------------------------------------------------------- 1 | export default () => null; 2 | -------------------------------------------------------------------------------- /ui/app/components/ProxyRoute/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Route, Switch } from 'react-router-dom'; 4 | 5 | import pages from 'ui/pages'; 6 | 7 | const ProxyRoute = () => ( 8 | 9 | 10 | 11 | ); 12 | 13 | export default ProxyRoute; 14 | -------------------------------------------------------------------------------- /ui/app/components/ReloadButton/index.js: -------------------------------------------------------------------------------- 1 | export { ReloadButton } from './ReloadButton'; 2 | -------------------------------------------------------------------------------- /ui/app/components/ReloadButton/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const ReloadButton = styled.div` 4 | display: flex; 5 | align-items: center; 6 | 7 | background: transparent; 8 | border: none; 9 | color: rgba(255, 255, 255); 10 | opacity: 0.65; 11 | 12 | padding: 0 20px; 13 | gap: 8px; 14 | 15 | svg { 16 | width: 24px; 17 | height: 24px; 18 | } 19 | 20 | &:hover { 21 | color: rgba(255, 255, 255); 22 | opacity: 1; 23 | } 24 | `; 25 | -------------------------------------------------------------------------------- /ui/app/components/SMBAlertCard/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const SMBAlertCard = () =>
; 4 | 5 | export default SMBAlertCard; 6 | -------------------------------------------------------------------------------- /ui/app/components/Signature/components/buffer/index.js: -------------------------------------------------------------------------------- 1 | export * from './Buffer'; 2 | -------------------------------------------------------------------------------- /ui/app/components/Signature/components/buffer/styles.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Matches = styled.div` 4 | display: flex; 5 | flex-direction: column; 6 | gap: 0.5rem; 7 | margin-top: 0.5rem; 8 | `; 9 | 10 | export const Row = styled.div` 11 | display: flex; 12 | align-items: center; 13 | column-gap: 0.5rem; 14 | flex-wrap: wrap; 15 | `; 16 | -------------------------------------------------------------------------------- /ui/app/components/Signature/components/field/index.js: -------------------------------------------------------------------------------- 1 | export * from './Field'; 2 | -------------------------------------------------------------------------------- /ui/app/components/Signature/components/generalInformation/index.js: -------------------------------------------------------------------------------- 1 | export * from './GeneralInformation'; 2 | -------------------------------------------------------------------------------- /ui/app/components/Signature/components/generalInformation/styles.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Row = styled.div` 4 | display: grid; 5 | grid-template-columns: ${({ span }) => (span ? '1fr' : '1fr 1fr')}; 6 | gap: 1.5rem; 7 | `; 8 | 9 | export const TopRow = styled.div` 10 | display: grid; 11 | grid-template-columns: 1fr 1px 1fr; 12 | gap: 0.75rem; 13 | & > div { 14 | display: flex; 15 | flex-direction: column; 16 | gap: 0.5rem; 17 | } 18 | `; 19 | 20 | export const VerticalDivider = styled.div` 21 | width: 1px; 22 | height: 100%; 23 | background-color: #ececec; 24 | margin: 0 auto; 25 | `; 26 | -------------------------------------------------------------------------------- /ui/app/components/Signature/components/index.js: -------------------------------------------------------------------------------- 1 | export * from './buffer'; 2 | export * from './generalInformation'; 3 | export * from './target'; 4 | export * from './field'; 5 | -------------------------------------------------------------------------------- /ui/app/components/Signature/components/target/index.js: -------------------------------------------------------------------------------- 1 | export * from './Target'; 2 | -------------------------------------------------------------------------------- /ui/app/components/Signature/index.js: -------------------------------------------------------------------------------- 1 | export * from './Signature'; 2 | -------------------------------------------------------------------------------- /ui/app/components/SignatureFlow/index.js: -------------------------------------------------------------------------------- 1 | export default () => null; 2 | -------------------------------------------------------------------------------- /ui/app/components/TableCellOverflow/index.js: -------------------------------------------------------------------------------- 1 | export { TableCellOverflow } from './TableCellOverflow'; 2 | -------------------------------------------------------------------------------- /ui/app/components/UIElements/UISwitchLabel/index.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | const UISwitchLabel = styled.span` 4 | cursor: default; 5 | color: ${p => (p.disabled ? '#9d9d9d' : '#000')}; 6 | `; 7 | 8 | export default UISwitchLabel; 9 | -------------------------------------------------------------------------------- /ui/app/components/UIElements/UITabs/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { Tabs } from 'antd'; 4 | import PropTypes from 'prop-types'; 5 | 6 | const { TabPane } = Tabs; 7 | 8 | const UITabs = ({ tabs, ...props }) => ( 9 | 10 | {tabs.map(tab => ( 11 | 12 | ))} 13 | 14 | ); 15 | 16 | UITabs.propTypes = { 17 | tabs: PropTypes.arrayOf(PropTypes.object), 18 | }; 19 | 20 | export default UITabs; 21 | -------------------------------------------------------------------------------- /ui/app/components/UserMenu/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { SettingOutlined } from '@ant-design/icons'; 4 | 5 | import LogoutMenuItem from 'ui/components/LogoutMenuItem'; 6 | 7 | import * as Style from './style'; 8 | 9 | const UserMenu = () => ( 10 | 11 | } 15 | onClick={() => { 16 | window.location = '/accounts/edit'; 17 | }} 18 | > 19 | Account Settings 20 | 21 | 22 | 23 | ); 24 | 25 | UserMenu.propTypes = {}; 26 | 27 | export default UserMenu; 28 | -------------------------------------------------------------------------------- /ui/app/config.js: -------------------------------------------------------------------------------- 1 | export const API_URL = '/rest/appliances'; 2 | export const RULES_URL = '/rest/rules'; 3 | export const APP_URL = '/stamus'; 4 | export const HUNT_URL = '/rules/hunt'; 5 | export const CURRENT_USER_PATH = '/rest/accounts/sciriususer/current_user/'; 6 | export const STAMUS = 'Stamus'; 7 | export const HOME_PATH = '/stamus'; 8 | -------------------------------------------------------------------------------- /ui/app/config/index.js: -------------------------------------------------------------------------------- 1 | export const API_URL = '/rest/appliances'; 2 | export const RULES_URL = '/rest/rules'; 3 | export const APP_URL = '/stamus'; 4 | export const HUNT_URL = '/rules/hunt'; 5 | export const RULE_PATH = '/rest/rules/rule'; 6 | export const CURRENT_USER_PATH = '/rest/accounts/sciriususer/current_user/'; 7 | export const LOGIN_PATH = '/accounts/login/'; 8 | export const HOME_PATH = '/stamus'; 9 | -------------------------------------------------------------------------------- /ui/app/config/ipFields.js: -------------------------------------------------------------------------------- 1 | const IP_FIELDS = [ 2 | 'src_ip', 3 | 'dest_ip', 4 | 'alert.source.ip', 5 | 'alert.target.ip', 6 | 'host_id.ip', 7 | 'ip', 8 | 'dns.rdata', 9 | 'dns.answers.rdata', 10 | 'dns.grouped.A', 11 | 'dns.grouped.AAAA', 12 | 'tunnel.src_ip', 13 | 'tunnel.dest_ip', 14 | ]; 15 | 16 | export default IP_FIELDS; 17 | -------------------------------------------------------------------------------- /ui/app/config/theme.js: -------------------------------------------------------------------------------- 1 | export const theme = { 2 | token: { 3 | // Seed Token 4 | borderRadius: 4, 5 | colorPrimary: '#005792', 6 | colorInfo: '#005792', 7 | colorLink: '#005792', 8 | }, 9 | components: { 10 | Layout: { 11 | siderBg: '#fff', 12 | }, 13 | Menu: { 14 | itemBg: '#fff', 15 | subMenuItemBg: '#fff', 16 | }, 17 | }, 18 | }; 19 | -------------------------------------------------------------------------------- /ui/app/constants/antd.json: -------------------------------------------------------------------------------- 1 | { 2 | "ANTD_THEME": { 3 | "primary-color": "#005792" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /ui/app/context/DashboardContext.js: -------------------------------------------------------------------------------- 1 | import { createContext } from 'react'; 2 | 3 | const DashboardContext = createContext(null); 4 | 5 | export default DashboardContext; 6 | -------------------------------------------------------------------------------- /ui/app/helpers/CamelCaseToDashCase.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Converts CamelCase string to camel-case by removing the preceding dash 3 | * 4 | * @param value 5 | */ 6 | 7 | export default function (value) { 8 | return value.replace(/[A-Z]/g, (match, offset) => (offset > 0 ? '-' : '') + match.toLowerCase()); 9 | } 10 | -------------------------------------------------------------------------------- /ui/app/helpers/CamelCaseToNormal.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Converts CamelCase string Camel Case with spaces 3 | * 4 | * @param value 5 | */ 6 | 7 | export default function (value) { 8 | return value.replace(/([A-Z])/g, ' $1').replace(/^./, function (str) { 9 | return str.toUpperCase(); 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /ui/app/helpers/buildFilterNew.js: -------------------------------------------------------------------------------- 1 | import { buildQFilter } from 'ui/buildQFilter'; 2 | 3 | const buildFilterNew = (filters, systemSettings) => { 4 | const regularFilters = filters 5 | .filter(f => f.id !== 'probe' && f.id !== 'alert.tag') 6 | .reduce((acc, cur) => { 7 | acc[cur.id] = cur.value; 8 | return acc; 9 | }, {}); 10 | const queryFilters = buildQFilter(filters, systemSettings, 'object'); 11 | return { ...regularFilters, ...queryFilters }; 12 | }; 13 | 14 | export default buildFilterNew; 15 | -------------------------------------------------------------------------------- /ui/app/helpers/capitalize.js: -------------------------------------------------------------------------------- 1 | const capitalize = string => string.charAt(0).toUpperCase() + string.slice(1); 2 | 3 | export default capitalize; 4 | -------------------------------------------------------------------------------- /ui/app/helpers/crcf.js: -------------------------------------------------------------------------------- 1 | import cookie from 'cookie'; 2 | 3 | const crcf = () => { 4 | const cookies = cookie.parse(document.cookie); 5 | return { 6 | headers: { 7 | 'Content-Type': 'application/json', 8 | 'X-CSRFToken': cookies.csrftoken, 9 | }, 10 | }; 11 | }; 12 | 13 | export default crcf; 14 | -------------------------------------------------------------------------------- /ui/app/helpers/dashboardSanitizer.js: -------------------------------------------------------------------------------- 1 | import { createRef } from 'react'; 2 | 3 | const dashboardSanitizer = data => { 4 | /** 5 | * Convert empty keys to 'Unknown' values 6 | */ 7 | const blockIds = Object.keys(data); 8 | if (blockIds.length > 0) { 9 | blockIds.forEach(blockId => { 10 | for (let idx = 0; idx < data[blockId].length; idx += 1) { 11 | data.nodeRef = createRef(null); 12 | if (!data[blockId][idx].key) { 13 | data[blockId][idx].key = 'Unknown'; 14 | } 15 | } 16 | }); 17 | } 18 | return data; 19 | }; 20 | 21 | export default dashboardSanitizer; 22 | -------------------------------------------------------------------------------- /ui/app/helpers/getCurrentUser.js: -------------------------------------------------------------------------------- 1 | export const getCurrentUser = (param, fallback) => { 2 | const currentUser = window.current_user || {}; 3 | if (param) { 4 | if (typeof fallback !== 'undefined') { 5 | return currentUser[param] || fallback; 6 | } 7 | return currentUser ? currentUser[param] : fallback; 8 | } 9 | return currentUser; 10 | }; 11 | -------------------------------------------------------------------------------- /ui/app/helpers/getQueryObject.js: -------------------------------------------------------------------------------- 1 | import { isEqual, isEmpty } from 'lodash'; 2 | import store from 'store'; 3 | 4 | import { parseUrl } from 'ui/helpers/parseUrl'; 5 | import { StorageEnum } from 'ui/maps/StorageEnum'; 6 | 7 | export const getQueryObject = () => { 8 | const currentUrlObject = parseUrl(); 9 | const existingStorageFilters = store.get(StorageEnum.FILTERS); 10 | if (isEmpty(currentUrlObject) && !isEmpty(existingStorageFilters)) { 11 | return existingStorageFilters; 12 | } 13 | return !isEqual(currentUrlObject, existingStorageFilters) ? currentUrlObject : existingStorageFilters; 14 | }; 15 | -------------------------------------------------------------------------------- /ui/app/helpers/index.js: -------------------------------------------------------------------------------- 1 | export { default as CamelCaseToDashCase } from './CamelCaseToDashCase'; 2 | export { default as CamelCaseToNormal } from './CamelCaseToNormal'; 3 | -------------------------------------------------------------------------------- /ui/app/helpers/isEmail.js: -------------------------------------------------------------------------------- 1 | const isEmail = str => /\S+@\S+\.\S+/.test(str); 2 | 3 | export default isEmail; 4 | -------------------------------------------------------------------------------- /ui/app/helpers/isIPv4.js: -------------------------------------------------------------------------------- 1 | const isIPv4 = str => 2 | /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test( 3 | str, 4 | ); 5 | 6 | export default isIPv4; 7 | -------------------------------------------------------------------------------- /ui/app/helpers/isNumeric.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-restricted-globals */ 2 | const isNumeric = n => !isNaN(parseFloat(n)) && isFinite(n); 3 | 4 | export default isNumeric; 5 | -------------------------------------------------------------------------------- /ui/app/helpers/isUsername.js: -------------------------------------------------------------------------------- 1 | const isUsername = str => /^([a-zA-Z0-9]+)$/.test(str); 2 | 3 | export default isUsername; 4 | -------------------------------------------------------------------------------- /ui/app/helpers/localStorage.js: -------------------------------------------------------------------------------- 1 | import notify from 'ui/helpers/notify'; 2 | 3 | export const getFromLocalStorage = key => { 4 | try { 5 | const value = localStorage.getItem(key); 6 | return JSON.parse(value); 7 | } catch (e) { 8 | notify.error('Error getting from local storage', e); 9 | return null; 10 | } 11 | }; 12 | 13 | export const saveToLocalStorage = (key, value) => { 14 | try { 15 | const stringified = JSON.stringify(value); 16 | localStorage.setItem(key, stringified); 17 | } catch (e) { 18 | notify.error('Error saving to local storage', e); 19 | } 20 | }; 21 | -------------------------------------------------------------------------------- /ui/app/helpers/markdown.js: -------------------------------------------------------------------------------- 1 | import DOMPurify from 'dompurify'; 2 | import { marked } from 'marked'; 3 | 4 | export function getMarkdownText(text) { 5 | if (typeof text === 'undefined' || text === null) return { __html: '' }; 6 | const rawMarkup = DOMPurify.sanitize(marked.parse(text)); 7 | return { __html: rawMarkup }; 8 | } 9 | -------------------------------------------------------------------------------- /ui/app/helpers/parseObjectToUrl.js: -------------------------------------------------------------------------------- 1 | export const parseObjectToUrl = (obj, prefix) => { 2 | const str = []; 3 | let p; 4 | // eslint-disable-next-line no-restricted-syntax 5 | for (p in obj) { 6 | // eslint-disable-next-line no-prototype-builtins 7 | if (obj.hasOwnProperty(p)) { 8 | const k = prefix ? `${prefix}[${p}]` : p; 9 | const v = obj[p]; 10 | str.push(v !== null && typeof v === 'object' ? parseObjectToUrl(v, k) : `${encodeURIComponent(k)}=${encodeURIComponent(v)}`); 11 | } 12 | } 13 | return str.join('&'); 14 | }; 15 | -------------------------------------------------------------------------------- /ui/app/helpers/parseUrl.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | export const parseUrl = () => { 3 | const params = {}; 4 | new URLSearchParams(document.location.search).forEach((d, e) => { 5 | let a = decodeURIComponent(e); 6 | const c = decodeURIComponent(d); 7 | if (a.endsWith('[]')) { 8 | (a = a.replace('[]', '')), params[a] || (params[a] = []), params[a].push(c); 9 | } else { 10 | let b = a.match(/\[([a-z0-9_\/\s,.-])+\]$/g); 11 | b ? ((a = a.replace(b, '')), (b = b[0].replace('[', '').replace(']', '')), params[a] || (params[a] = []), (params[a][b] = c)) : (params[a] = c); 12 | } 13 | }); 14 | return params; 15 | }; 16 | -------------------------------------------------------------------------------- /ui/app/helpers/stringToColor.js: -------------------------------------------------------------------------------- 1 | export const stringToColor = value => { 2 | let hash = 0; 3 | for (let i = 0; i < value.length; i += 1) { 4 | // eslint-disable-next-line no-bitwise 5 | hash = value.charCodeAt(i) + ((hash << 5) - hash); 6 | } 7 | 8 | return `hsl(${hash % 360}, 85%, 55%)`; 9 | }; 10 | -------------------------------------------------------------------------------- /ui/app/helpers/timeline.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/app/helpers/timeline.js -------------------------------------------------------------------------------- /ui/app/helpers/translateMap.js: -------------------------------------------------------------------------------- 1 | import selectors from 'ui/containers/App/selectors'; 2 | 3 | export const getMap = state => ({ 4 | ':filters': selectors.makeSelectFilters()(state), 5 | ':dates': selectors.makeSelectURLDates(state), 6 | ':datesEs': selectors.makeSelectURLDatesES(state), 7 | }); 8 | -------------------------------------------------------------------------------- /ui/app/helpers/uuid.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | 3 | /** 4 | * UUID v4 5 | * @returns {string} 6 | */ 7 | const uuid = () => 8 | '10000000-1000-4000-8000-100000000000'.replace(/[018]/g, c => (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16)); 9 | 10 | export default uuid; 11 | -------------------------------------------------------------------------------- /ui/app/helpers/withAlerts.js: -------------------------------------------------------------------------------- 1 | import { cloneDeep } from 'lodash'; 2 | 3 | import Filter from 'utils/Filter'; 4 | 5 | const withAlerts = idsFilters => { 6 | let isEnabled = false; 7 | try { 8 | isEnabled = Boolean(JSON.parse(localStorage.getItem('withAlerts'))); 9 | } catch (e) { 10 | isEnabled = false; 11 | } 12 | 13 | const filters = cloneDeep(idsFilters); 14 | if (isEnabled) { 15 | const i = filters.findIndex(f => f.id === 'hits_min'); 16 | if (i === -1) { 17 | const hitsMin = new Filter('hits_min', 1); 18 | filters.push(hitsMin.toJSON()); 19 | } 20 | } 21 | return filters; 22 | }; 23 | 24 | export default withAlerts; 25 | -------------------------------------------------------------------------------- /ui/app/hooks/useEnterprise.js: -------------------------------------------------------------------------------- 1 | const useEnterprise = () => false; 2 | export default useEnterprise; 3 | -------------------------------------------------------------------------------- /ui/app/hooks/useFilterParams.js: -------------------------------------------------------------------------------- 1 | import { useStore } from 'ui/mobx/RootStoreProvider'; 2 | 3 | const useFilterParams = () => { 4 | const { commonStore } = useStore(); 5 | let fromDate = commonStore.startDate; 6 | let toDate = commonStore.endDate; 7 | 8 | if (commonStore.relativeType !== 'Auto') { 9 | if (commonStore.relativeType !== 'All') { 10 | fromDate *= 1000; 11 | } 12 | toDate *= 1000; 13 | } 14 | return `from_date=${fromDate}&to_date=${toDate}`; 15 | }; 16 | 17 | export default useFilterParams; 18 | -------------------------------------------------------------------------------- /ui/app/hooks/useNetworkDefs.js: -------------------------------------------------------------------------------- 1 | const useNetworkDefs = () => []; 2 | 3 | export default useNetworkDefs; 4 | -------------------------------------------------------------------------------- /ui/app/hooks/usePrevious.js: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from 'react'; 2 | 3 | export const usePrevious = value => { 4 | const ref = useRef(); 5 | useEffect(() => { 6 | ref.current = value; 7 | }); 8 | return ref.current; 9 | }; 10 | -------------------------------------------------------------------------------- /ui/app/hooks/useWindowWidth.js: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react'; 2 | 3 | export default function useWindowWidth() { 4 | const [windowWidth, setWindowWidth] = useState(window.innerWidth); 5 | 6 | useEffect(() => { 7 | const handleResize = () => setWindowWidth(window.innerWidth); 8 | window.addEventListener('resize', handleResize); 9 | return () => window.removeEventListener('resize', handleResize); 10 | }, []); 11 | 12 | return windowWidth; 13 | } 14 | -------------------------------------------------------------------------------- /ui/app/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | padding: 0; 4 | font-family: sans-serif; 5 | } 6 | -------------------------------------------------------------------------------- /ui/app/maps/EventTypesEnum.js: -------------------------------------------------------------------------------- 1 | // Description: Enum for event types. 2 | // Do not modify, as they are mapped to the localStorage keys in alert_tag 3 | export const EVENT_TYPES = { 4 | ALERT: 'alerts', 5 | SIGHTINGS: 'sightings', 6 | STAMUS: 'stamus', 7 | }; 8 | -------------------------------------------------------------------------------- /ui/app/maps/FilterValidationType.js: -------------------------------------------------------------------------------- 1 | export const FilterValidationType = { 2 | IP: 'IP', 3 | POSITIVE_INT: 'POSITIVE_INT', 4 | }; 5 | 6 | export default FilterValidationType; 7 | -------------------------------------------------------------------------------- /ui/app/maps/FilterValueType.js: -------------------------------------------------------------------------------- 1 | const FilterValueType = { 2 | TEXT: 'TEXT', 3 | NUMBER: 'NUMBER', 4 | SELECT: 'SELECT', 5 | }; 6 | 7 | export default FilterValueType; 8 | -------------------------------------------------------------------------------- /ui/app/maps/LeftNavMap.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import { LinkOutlined, SecurityScanOutlined, SettingOutlined } from '@ant-design/icons'; 4 | 5 | export const LeftNavMap = [ 6 | { 7 | id: 'STAMUS_ND', 8 | title: 'Hunting', 9 | icon: () => , 10 | }, 11 | { 12 | id: 'ADMINISTRATION', 13 | title: 'Administration', 14 | icon: () => , 15 | }, 16 | { 17 | id: 'OTHER_APPS', 18 | title: 'Other Apps', 19 | icon: () => , 20 | }, 21 | ]; 22 | -------------------------------------------------------------------------------- /ui/app/maps/StorageEnum.js: -------------------------------------------------------------------------------- 1 | export const StorageEnum = { 2 | SEARCH_TERM: 'str-search-term', 3 | SOURCE: 'str-source', 4 | TIMESPAN: 'str-timespan', 5 | TENANT: 'str-tenant', 6 | FILTERS: 'str-filters', 7 | BOOT: 'str-boot', 8 | SYSTEM_SETTINGS: 'str-system-settings', 9 | }; 10 | -------------------------------------------------------------------------------- /ui/app/maps/TimePickersEnum.js: -------------------------------------------------------------------------------- 1 | export const TimePickerEnum = { 2 | QUICK: 0, 3 | ABSOLUTE: 1, 4 | }; 5 | -------------------------------------------------------------------------------- /ui/app/mobx/stores/HistoryStore.js: -------------------------------------------------------------------------------- 1 | import { makeAutoObservable } from 'mobx'; 2 | 3 | import * as config from 'config/Api'; 4 | 5 | import { api } from '../api'; 6 | 7 | class HistoryStore { 8 | root = null; 9 | 10 | constructor(root) { 11 | this.root = root; 12 | makeAutoObservable(this, { 13 | root: false, 14 | }); 15 | } 16 | 17 | async fetchData(stringFilters, listParams) { 18 | const response = await api.get(`rest/${config.HISTORY_PATH}?${listParams}${stringFilters}`); 19 | if (response.ok) { 20 | return response.data; 21 | } 22 | return response; 23 | } 24 | } 25 | 26 | export default HistoryStore; 27 | -------------------------------------------------------------------------------- /ui/app/mobx/stores/RootStore.js: -------------------------------------------------------------------------------- 1 | import CommonStore from './CommonStore'; 2 | import EsStore from './EsStore'; 3 | import HistoryStore from './HistoryStore'; 4 | 5 | class RootStore { 6 | commonStore = null; 7 | 8 | historyStore = null; 9 | 10 | esStore = null; 11 | 12 | constructor() { 13 | this.commonStore = new CommonStore(this); 14 | this.historyStore = new HistoryStore(this); 15 | this.esStore = new EsStore(this); 16 | } 17 | } 18 | 19 | export default RootStore; 20 | -------------------------------------------------------------------------------- /ui/app/pages/Arkime/Arkime.js: -------------------------------------------------------------------------------- 1 | const Arkime = () => null; 2 | 3 | Arkime.metadata = { 4 | category: 'OTHER_APPS', 5 | url: systemSettings => systemSettings.arkime_url, 6 | access: (_, systemSettings) => systemSettings.use_arkime, 7 | title: 'Arkime', 8 | }; 9 | 10 | export default Arkime; 11 | -------------------------------------------------------------------------------- /ui/app/pages/CyberChef/CyberChef.js: -------------------------------------------------------------------------------- 1 | const CyberChef = () => null; 2 | 3 | CyberChef.metadata = { 4 | category: 'OTHER_APPS', 5 | url: systemSettings => systemSettings.cyberchef_url, 6 | access: (permissions, systemSettings) => systemSettings.cyberchef, 7 | title: 'CyberChef', 8 | }; 9 | 10 | export default CyberChef; 11 | -------------------------------------------------------------------------------- /ui/app/pages/Dashboards/Dashboards.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import UIBreadcrumb from 'ui/components/UIElements/UIBreadcrumb'; 4 | import { Link } from 'ui/helpers/Link'; 5 | 6 | import DashboardPage from './DashboardPage'; 7 | 8 | const Dashboards = () => ( 9 |
10 | 14 | Dashboards 15 | , 16 | ]} 17 | /> 18 | 19 |
20 | ); 21 | Dashboards.metadata = { 22 | category: 'STAMUS_ND', 23 | url: 'hunting/dashboards', 24 | position: 0, 25 | }; 26 | 27 | export default Dashboards; 28 | -------------------------------------------------------------------------------- /ui/app/pages/Dashboards/components/DashboardTimeline/index.js: -------------------------------------------------------------------------------- 1 | export { DashboardTimeline } from './DashboardTimeline'; 2 | -------------------------------------------------------------------------------- /ui/app/pages/Dashboards/components/DashboardTimeline/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | import UICard from 'ui/components/UIElements/UICard'; 4 | 5 | export const Card = styled(UICard)` 6 | padding-top: 40px; 7 | height: 300px; 8 | `; 9 | -------------------------------------------------------------------------------- /ui/app/pages/Dashboards/components/index.js: -------------------------------------------------------------------------------- 1 | export { DashboardTimeline } from './DashboardTimeline'; 2 | -------------------------------------------------------------------------------- /ui/app/pages/Dashboards/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | import { DashboardTimeline } from './components'; 4 | 5 | export const Timeline = styled(DashboardTimeline)` 6 | margin-top: 1.5rem; 7 | `; 8 | 9 | export const Switch = styled.div` 10 | position: absolute; 11 | z-index: 1; 12 | top: 8px; 13 | right: 8px; 14 | `; 15 | -------------------------------------------------------------------------------- /ui/app/pages/EveBox/EveBox.js: -------------------------------------------------------------------------------- 1 | const EveBox = () => null; 2 | 3 | EveBox.metadata = { 4 | category: 'OTHER_APPS', 5 | url: systemSettings => systemSettings.evebox_url, 6 | access: (permissions, systemSettings) => systemSettings.evebox && permissions.includes('rules.events_evebox'), 7 | title: 'EveBox', 8 | }; 9 | 10 | export default EveBox; 11 | -------------------------------------------------------------------------------- /ui/app/pages/Events/Events.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import UIBreadcrumb from 'ui/components/UIElements/UIBreadcrumb'; 4 | import { Link } from 'ui/helpers/Link'; 5 | 6 | import EventsPage from './EventsPage'; 7 | 8 | const Events = () => ( 9 |
10 | 14 | Events 15 | , 16 | ]} 17 | /> 18 | 19 |
20 | ); 21 | Events.metadata = { 22 | category: 'STAMUS_ND', 23 | url: 'hunting/events', 24 | position: 1, 25 | }; 26 | 27 | export default Events; 28 | -------------------------------------------------------------------------------- /ui/app/pages/Events/components/AlertItem/helper.js: -------------------------------------------------------------------------------- 1 | import _ from 'lodash'; 2 | 3 | export const getTitle = (protoMap, key, events) => 4 | `Related ${protoMap[key] || _.capitalize(events[key][0].rawJson.event_type)}${key === 'Alert' && Object.keys(events[key]).length > 1 ? 's' : ''}`; 5 | -------------------------------------------------------------------------------- /ui/app/pages/History/History.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import UIBreadcrumb from 'ui/components/UIElements/UIBreadcrumb'; 4 | import { Link } from 'ui/helpers/Link'; 5 | 6 | import HistoryPage from './HistoryPage'; 7 | 8 | const History = () => ( 9 |
10 | 14 | History 15 | , 16 | ]} 17 | /> 18 | 19 |
20 | ); 21 | History.metadata = { 22 | category: 'ADMINISTRATION', 23 | url: 'administration/history', 24 | }; 25 | 26 | export default History; 27 | -------------------------------------------------------------------------------- /ui/app/pages/Kibana/Kibana.js: -------------------------------------------------------------------------------- 1 | const Kibana = () => null; 2 | 3 | Kibana.metadata = { 4 | category: 'OTHER_APPS', 5 | url: systemSettings => systemSettings.kibana_url, 6 | access: (permissions, systemSettings) => systemSettings.kibana && permissions.includes('rules.events_kibana'), 7 | computedTitle: systemSettings => (systemSettings.use_opensearch ? 'Dashboards' : 'Kibana'), 8 | }; 9 | 10 | export default Kibana; 11 | -------------------------------------------------------------------------------- /ui/app/pages/Linking/CreateModal/index.js: -------------------------------------------------------------------------------- 1 | export { CreateModal } from './CreateModal'; 2 | -------------------------------------------------------------------------------- /ui/app/pages/Linking/DeleteModal/index.js: -------------------------------------------------------------------------------- 1 | export { DeleteModal } from './DeleteModal'; 2 | -------------------------------------------------------------------------------- /ui/app/pages/Linking/DeleteModal/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Content = styled.div` 4 | display: flex; 5 | gap: 1rem; 6 | align-items: center; 7 | svg { 8 | color: red; 9 | font-size: 24px; 10 | } 11 | `; 12 | -------------------------------------------------------------------------------- /ui/app/pages/Linking/Linking.style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const TableActions = styled.div` 4 | display: flex; 5 | gap: 0.5rem; 6 | `; 7 | -------------------------------------------------------------------------------- /ui/app/pages/NotFound/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const PageWrapper = styled.div` 4 | display: flex; 5 | flex-direction: column; 6 | align-items: center; 7 | justify-content: center; 8 | gap: 1rem; 9 | height: 100%; 10 | `; 11 | -------------------------------------------------------------------------------- /ui/app/pages/Policies/PolicyParameters.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | import PropTypes from 'prop-types'; 4 | 5 | import * as Style from './style'; 6 | 7 | const PolicyParameters = ({ options }) => 8 | Object.keys(options).map(option => ( 9 | 10 | {option}: {options[option]} 11 | 12 | )); 13 | 14 | PolicyParameters.propTypes = { 15 | options: PropTypes.objectOf(PropTypes.string).isRequired, 16 | }; 17 | 18 | export default PolicyParameters; 19 | -------------------------------------------------------------------------------- /ui/app/pages/Signatures/components/Timeline/index.js: -------------------------------------------------------------------------------- 1 | export { SignatureTimeline } from './SignatureTimeline'; 2 | -------------------------------------------------------------------------------- /ui/app/pages/Signatures/components/Timeline/style.js: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | import UICard from 'ui/components/UIElements/UICard'; 4 | 5 | export const Card = styled(UICard)` 6 | margin: 0.5rem 0; 7 | `; 8 | -------------------------------------------------------------------------------- /ui/app/pages/Signatures/components/index.js: -------------------------------------------------------------------------------- 1 | export { SignatureTimeline } from './Timeline'; 2 | -------------------------------------------------------------------------------- /ui/app/reducers.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Combine all reducers in this file and export the combined reducers. 3 | */ 4 | 5 | import { combineReducers } from 'redux'; 6 | 7 | import globalReducer from 'ui/containers/App/reducer'; 8 | import { reducer as huntReducer } from 'ui/containers/HuntApp/stores/global'; 9 | 10 | /** 11 | * Merges the main reducer with the router state and dynamically injected reducers 12 | */ 13 | export default function createReducer(injectedReducers = {}) { 14 | const rootReducer = combineReducers({ 15 | global: globalReducer, 16 | hunt: huntReducer, 17 | ...injectedReducers, 18 | }); 19 | 20 | return rootReducer; 21 | } 22 | -------------------------------------------------------------------------------- /ui/app/store.js: -------------------------------------------------------------------------------- 1 | import configureStore from './configureStore'; 2 | 3 | export const store = configureStore({}); 4 | -------------------------------------------------------------------------------- /ui/app/supportedActions.js: -------------------------------------------------------------------------------- 1 | export const supportedActions = ['threshold']; 2 | 3 | export function setDefaultOptions() { 4 | let options = {}; 5 | switch (this.props.action) { 6 | case 'threshold': 7 | options = { 8 | type: 'both', 9 | count: 1, 10 | seconds: 60, 11 | track: 'by_src', 12 | }; 13 | break; 14 | default: 15 | break; 16 | } 17 | this.setState({ options }); 18 | } 19 | -------------------------------------------------------------------------------- /ui/app/utils/checkStore.js: -------------------------------------------------------------------------------- 1 | import invariant from 'invariant'; 2 | import { conformsTo, isFunction, isObject } from 'lodash'; 3 | 4 | /** 5 | * Validate the shape of redux store 6 | */ 7 | export default function checkStore(store) { 8 | const shape = { 9 | dispatch: isFunction, 10 | subscribe: isFunction, 11 | getState: isFunction, 12 | replaceReducer: isFunction, 13 | runSaga: isFunction, 14 | injectedReducers: isObject, 15 | injectedSagas: isObject, 16 | }; 17 | invariant(conformsTo(store, shape), '(app/utils...) injectors: Expected a valid redux store'); 18 | } 19 | -------------------------------------------------------------------------------- /ui/app/utils/constants.js: -------------------------------------------------------------------------------- 1 | export const RESTART_ON_REMOUNT = '@@saga-injector/restart-on-remount'; 2 | export const DAEMON = '@@saga-injector/daemon'; 3 | export const ONCE_TILL_UNMOUNT = '@@saga-injector/once-till-unmount'; 4 | -------------------------------------------------------------------------------- /ui/app/utils/history.js: -------------------------------------------------------------------------------- 1 | import { createBrowserHistory } from 'history'; 2 | 3 | const history = createBrowserHistory(); 4 | export default history; 5 | -------------------------------------------------------------------------------- /ui/app/utils/loadable.js: -------------------------------------------------------------------------------- 1 | import React, { lazy, Suspense } from 'react'; 2 | 3 | const loadable = (importFunc, { fallback = null } = { fallback: null }) => { 4 | const LazyComponent = lazy(importFunc); 5 | 6 | return props => ( 7 | 8 | 9 | 10 | ); 11 | }; 12 | 13 | export default loadable; 14 | -------------------------------------------------------------------------------- /ui/app/utils/rgbToHex.js: -------------------------------------------------------------------------------- 1 | function componentToHex(c) { 2 | const hex = c.toString(16); 3 | return hex.length === 1 ? `0${hex}` : hex; 4 | } 5 | 6 | export function rgbToHex(string) { 7 | const [r, g, b] = string.slice(4, -1).split(', ').map(Number); 8 | return `#${componentToHex(r)}${componentToHex(g)}${componentToHex(b)}`; 9 | } 10 | -------------------------------------------------------------------------------- /ui/docs/general/webstorm-debug.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/docs/general/webstorm-debug.png -------------------------------------------------------------------------------- /ui/docs/general/webstorm-eslint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/docs/general/webstorm-eslint.png -------------------------------------------------------------------------------- /ui/docs/general/workflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/ui/docs/general/workflow.png -------------------------------------------------------------------------------- /ui/docs/testing/remote-testing.md: -------------------------------------------------------------------------------- 1 | # Remote testing 2 | 3 | ```Shell 4 | npm run start:tunnel 5 | ``` 6 | 7 | This command will start a server and tunnel it with `ngrok`. You'll get a URL 8 | that looks a bit like this: `http://abcdef.ngrok.com` 9 | 10 | This URL will show the version of your application that's in the `build` folder, 11 | and it's accessible from the entire world! This is great for testing on different 12 | devices and from different locations! 13 | -------------------------------------------------------------------------------- /ui/internals/generators/component/loadable.js.hbs: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * Asynchronously loads the component for {{ properCase name }} 4 | * 5 | */ 6 | 7 | import loadable from 'utils/loadable'; 8 | 9 | export default loadable(() => import('./index')); 10 | -------------------------------------------------------------------------------- /ui/internals/generators/component/messages.js.hbs: -------------------------------------------------------------------------------- 1 | /* 2 | * {{ properCase name }} Messages 3 | * 4 | * This contains all the text for the {{ properCase name }} component. 5 | */ 6 | 7 | import { defineMessages } from 'react-intl'; 8 | 9 | export const scope = 'app.components.{{ properCase name }}'; 10 | 11 | export default defineMessages({ 12 | header: { 13 | id: `${scope}.header`, 14 | defaultMessage: 'This is the {{ properCase name }} component!', 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /ui/internals/generators/container/actions.js.hbs: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * {{ properCase name }} actions 4 | * 5 | */ 6 | 7 | import { DEFAULT_ACTION } from './constants'; 8 | 9 | export function defaultAction() { 10 | return { 11 | type: DEFAULT_ACTION, 12 | }; 13 | } 14 | -------------------------------------------------------------------------------- /ui/internals/generators/container/actions.test.js.hbs: -------------------------------------------------------------------------------- 1 | import { defaultAction } from '../actions'; 2 | import { DEFAULT_ACTION } from '../constants'; 3 | 4 | describe('{{ properCase name }} actions', () => { 5 | describe('Default Action', () => { 6 | it('has a type of DEFAULT_ACTION', () => { 7 | const expected = { 8 | type: DEFAULT_ACTION, 9 | }; 10 | expect(defaultAction()).toEqual(expected); 11 | }); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /ui/internals/generators/container/constants.js.hbs: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * {{ properCase name }} constants 4 | * 5 | */ 6 | 7 | export const DEFAULT_ACTION = 'app/{{ properCase name }}/DEFAULT_ACTION'; 8 | -------------------------------------------------------------------------------- /ui/internals/generators/container/messages.js.hbs: -------------------------------------------------------------------------------- 1 | /* 2 | * {{ properCase name }} Messages 3 | * 4 | * This contains all the text for the {{ properCase name }} container. 5 | */ 6 | 7 | import { defineMessages } from 'react-intl'; 8 | 9 | export const scope = 'app.containers.{{ properCase name }}'; 10 | 11 | export default defineMessages({ 12 | header: { 13 | id: `${scope}.header`, 14 | defaultMessage: 'This is the {{ properCase name }} container!', 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /ui/internals/generators/container/reducer.js.hbs: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * {{ properCase name }} reducer 4 | * 5 | */ 6 | import produce from 'immer'; 7 | import { DEFAULT_ACTION } from './constants'; 8 | 9 | export const initialState = {}; 10 | 11 | /* eslint-disable default-case */ 12 | const {{ camelCase name }}Reducer = (state = initialState, action) => 13 | produce(state, (/* draft */) => { 14 | switch (action.type) { 15 | case DEFAULT_ACTION: 16 | break; 17 | } 18 | }); 19 | 20 | export default {{ camelCase name }}Reducer; 21 | -------------------------------------------------------------------------------- /ui/internals/generators/container/saga.js.hbs: -------------------------------------------------------------------------------- 1 | // import { take, call, put, select } from 'redux-saga/effects'; 2 | 3 | // Individual exports for testing 4 | export default function* {{ camelCase name }}Saga() { 5 | // See example in containers/HomePage/saga.js 6 | } 7 | -------------------------------------------------------------------------------- /ui/internals/generators/container/saga.test.js.hbs: -------------------------------------------------------------------------------- 1 | /** 2 | * Test sagas 3 | */ 4 | 5 | /* eslint-disable redux-saga/yield-effects */ 6 | // import { take, call, put, select } from 'redux-saga/effects'; 7 | // import {{ camelCase name }}Saga from '../saga'; 8 | 9 | // const generator = {{ camelCase name }}Saga(); 10 | 11 | describe('{{ camelCase name }}Saga Saga', () => { 12 | it('Expect to have unit tests specified', () => { 13 | expect(true).toEqual(false); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /ui/internals/generators/container/selectors.test.js.hbs: -------------------------------------------------------------------------------- 1 | // import { select{{ properCase name }}Domain } from '../selectors'; 2 | 3 | describe('select{{ properCase name }}Domain', () => { 4 | it('Expect to have unit tests specified', () => { 5 | expect(true).toEqual(false); 6 | }); 7 | }); 8 | -------------------------------------------------------------------------------- /ui/internals/generators/language/add-locale-data.hbs: -------------------------------------------------------------------------------- 1 | $1addLocaleData({{language}}LocaleData); 2 | -------------------------------------------------------------------------------- /ui/internals/generators/language/app-locale.hbs: -------------------------------------------------------------------------------- 1 | $1 '{{language}}', 2 | -------------------------------------------------------------------------------- /ui/internals/generators/language/format-translation-messages.hbs: -------------------------------------------------------------------------------- 1 | $1 {{language}}: formatTranslationMessages('{{language}}', {{language}}TranslationMessages), 2 | -------------------------------------------------------------------------------- /ui/internals/generators/language/intl-locale-data.hbs: -------------------------------------------------------------------------------- 1 | $&const {{language}}LocaleData = require('react-intl/locale-data/{{language}}'); 2 | -------------------------------------------------------------------------------- /ui/internals/generators/language/polyfill-intl-locale.hbs: -------------------------------------------------------------------------------- 1 | $1 import('intl/locale-data/jsonp/{{language}}.js'), 2 | -------------------------------------------------------------------------------- /ui/internals/generators/language/translation-messages.hbs: -------------------------------------------------------------------------------- 1 | $1const {{language}}TranslationMessages = require('./translations/{{language}}.json'); 2 | -------------------------------------------------------------------------------- /ui/internals/generators/language/translations-json.hbs: -------------------------------------------------------------------------------- 1 | [] 2 | -------------------------------------------------------------------------------- /ui/internals/generators/utils/componentExists.js: -------------------------------------------------------------------------------- 1 | /** 2 | * componentExists 3 | * 4 | * Check whether the given component exist in either the components or containers directory 5 | */ 6 | 7 | const fs = require('fs'); 8 | const path = require('path'); 9 | 10 | const pageComponents = fs.readdirSync( 11 | path.join(__dirname, '../../../app/components'), 12 | ); 13 | const pageContainers = fs.readdirSync( 14 | path.join(__dirname, '../../../app/containers'), 15 | ); 16 | const components = pageComponents.concat(pageContainers); 17 | 18 | function componentExists(comp) { 19 | return components.indexOf(comp) >= 0; 20 | } 21 | 22 | module.exports = componentExists; 23 | -------------------------------------------------------------------------------- /ui/internals/mocks/cssModule.js: -------------------------------------------------------------------------------- 1 | module.exports = 'CSS_MODULE'; 2 | -------------------------------------------------------------------------------- /ui/internals/mocks/image.js: -------------------------------------------------------------------------------- 1 | module.exports = 'IMAGE_MOCK'; 2 | -------------------------------------------------------------------------------- /ui/internals/scripts/helpers/checkmark.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk'); 2 | 3 | /** 4 | * Adds mark check symbol 5 | */ 6 | function addCheckMark(callback) { 7 | process.stdout.write(chalk.green(' ✓')); /* ignore_utf8_check: 10003 */ 8 | if (callback) callback(); 9 | } 10 | 11 | module.exports = addCheckMark; 12 | -------------------------------------------------------------------------------- /ui/internals/scripts/helpers/get-npm-config.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | 3 | module.exports = JSON.parse(fs.readFileSync('package.json', 'utf8')); 4 | -------------------------------------------------------------------------------- /ui/internals/scripts/helpers/progress.js: -------------------------------------------------------------------------------- 1 | const readline = require('readline'); 2 | 3 | /** 4 | * Adds an animated progress indicator 5 | * 6 | * @param {string} message The message to write next to the indicator 7 | * @param {number} [amountOfDots=3] The amount of dots you want to animate 8 | */ 9 | function animateProgress(message, amountOfDots = 3) { 10 | let i = 0; 11 | return setInterval(() => { 12 | readline.cursorTo(process.stdout, 0); 13 | i = (i + 1) % (amountOfDots + 1); 14 | const dots = new Array(i + 1).join('.'); 15 | process.stdout.write(message + dots); 16 | }, 500); 17 | } 18 | 19 | module.exports = animateProgress; 20 | -------------------------------------------------------------------------------- /ui/internals/scripts/helpers/xmark.js: -------------------------------------------------------------------------------- 1 | const chalk = require('chalk'); 2 | 3 | /** 4 | * Adds mark cross symbol 5 | */ 6 | function addXMark(callback) { 7 | process.stdout.write(chalk.red(' ✘')); /* ignore_utf8_check: 10008 */ 8 | if (callback) callback(); 9 | } 10 | 11 | module.exports = addXMark; 12 | -------------------------------------------------------------------------------- /ui/internals/scripts/npmcheckversion.js: -------------------------------------------------------------------------------- 1 | const { exec } = require('child_process'); 2 | 3 | exec('npm -v', (err, stdout) => { 4 | if (err) throw err; 5 | if (parseFloat(stdout) < 5) { 6 | // NOTE: This can happen if you have a dependency which lists an old version of npm in its own dependencies. 7 | throw new Error(`[ERROR] You need npm version @>=5 but you have ${stdout}`); 8 | } 9 | }); 10 | -------------------------------------------------------------------------------- /ui/internals/testing/test-bundler.js: -------------------------------------------------------------------------------- 1 | // needed for regenerator-runtime 2 | // (ES7 generator support is required by redux-saga) 3 | import '@babel/polyfill'; 4 | -------------------------------------------------------------------------------- /ui/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "baseUrl": "./", 4 | "paths": { 5 | "ui/*": ["app/appliance/*", "app/*"] 6 | } 7 | }, 8 | "include": ["app/**/*"] 9 | } 10 | -------------------------------------------------------------------------------- /ui/server/argv.js: -------------------------------------------------------------------------------- 1 | module.exports = require('minimist')(process.argv.slice(2)); 2 | -------------------------------------------------------------------------------- /ui/server/middlewares/frontendMiddleware.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable global-require */ 2 | 3 | /** 4 | * Front-end middleware 5 | */ 6 | module.exports = (app, options) => { 7 | const isProd = process.env.NODE_ENV === 'production'; 8 | 9 | if (isProd) { 10 | const addProdMiddlewares = require('./addProdMiddlewares'); 11 | addProdMiddlewares(app, options); 12 | } else { 13 | const webpackConfig = require('../../internals/webpack/webpack.dev.babel'); 14 | const addDevMiddlewares = require('./addDevMiddlewares'); 15 | addDevMiddlewares(app, webpackConfig); 16 | } 17 | 18 | return app; 19 | }; 20 | -------------------------------------------------------------------------------- /ui/server/port.js: -------------------------------------------------------------------------------- 1 | const argv = require('./argv'); 2 | 3 | module.exports = parseInt(argv.port || process.env.PORT || '3000', 10); 4 | -------------------------------------------------------------------------------- /viz/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/viz/__init__.py -------------------------------------------------------------------------------- /viz/apps.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | from django.apps import AppConfig 5 | 6 | 7 | class VizConfig(AppConfig): 8 | name = 'viz' 9 | -------------------------------------------------------------------------------- /viz/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/StamusNetworks/scirius/3bb49d383f4801b79e6356f9de9f25806afe0311/viz/migrations/__init__.py --------------------------------------------------------------------------------