├── .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 |
8 | -
9 | Add token
10 |
11 |
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 |
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 |
6 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/044.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/048.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/050.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/056.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/104.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/120.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/148.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/152.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/178.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/204.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/250.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/254.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/266.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/270.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/275.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/276.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/288.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/324.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/328.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/372.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/380.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/384.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/388.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/418.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/428.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/450.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/466.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/540.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/566.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/624.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/634.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/638.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/642.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/652.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/662.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/663.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/670.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/686.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/706.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/729.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/740.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/764.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/784.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/876.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/AE.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/ARE.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/BD.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/BE.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/BEL.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/BEN.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/BGD.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/BH.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/BHR.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/BHS.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/BJ.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/BL.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/BLM.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/BQ-SA.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/BS.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/CG.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/CHL.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/CI.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/CIV.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/CL.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/CM.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/CMR.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/COG.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/DE.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/DEU.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/DZ.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/DZA.svg:
--------------------------------------------------------------------------------
1 |
6 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/FR.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/FRA.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GA.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GAB.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GB-ENG.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GB-SCT.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GF.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GH.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GHA.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GIN.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GM.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GMB.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GN.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GNB.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GUF.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GUY.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GW.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/GY.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/IE.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/IRL.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/IT.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/ITA.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/JAM.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/JM.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/LA.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/LAO.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/LC.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/LCA.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/LV.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/LVA.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/MAF.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/MDG.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/MF.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/MG.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/ML.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/MLI.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/MM.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/MMR.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/NC.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/NCL.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/NG.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/NGA.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/PS.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/PSE.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/QA.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/QAT.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/RE.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/REU.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/RO.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/ROU.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/SD.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/SDN.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/SEN.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/SN.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/SO.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/SOM.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/SR.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/SUR.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/TCD.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/TD.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/TH.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/THA.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/VC.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/VCT.svg:
--------------------------------------------------------------------------------
1 |
12 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/WF.svg:
--------------------------------------------------------------------------------
1 |
11 |
--------------------------------------------------------------------------------
/ui/app/assets/flags/files/WLF.svg:
--------------------------------------------------------------------------------
1 |
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 |
20 | );
21 |
--------------------------------------------------------------------------------
/ui/app/assets/icons/client.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const ClientIcon = () => (
4 |
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 |
17 | );
18 |
--------------------------------------------------------------------------------
/ui/app/assets/icons/sword.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | export const SwordIcon = () => (
4 |
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
--------------------------------------------------------------------------------