Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
439 commits
Select commit Hold shift + click to select a range
1a1f4e0
refactor: remove or revert code smells picked up during development
seansica Jan 6, 2026
620bbab
Merge pull request #448 from center-for-threat-informed-defense/alpha
seansica Jan 6, 2026
32ce5f9
build(npm): regenerate lockfile
seansica Jan 6, 2026
03c6b6d
Merge branch 'alpha' into adm
seansica Jan 6, 2026
9613355
refactor: migrate new endpoints to new /api/reports path
seansica Jan 8, 2026
0b85a2a
fix: update migrate-mongo usage for v14 async API
seansica Jan 8, 2026
39e8bf5
Merge pull request #447 from center-for-threat-informed-defense/adm
seansica Jan 12, 2026
aa522f7
Merge branch 'alpha' into beta
seansica Jan 15, 2026
8835f3f
build(npm): regenerate lockfile
seansica Jan 15, 2026
f19dfac
refactor: move validate service to system folder
seansica Jan 15, 2026
c62d92a
chore: complete beta merge
adpare Jan 16, 2026
cbcbdcc
chore: complete beta merge
adpare Jan 16, 2026
71392d9
chore: update path for validation service
adpare Jan 16, 2026
ce53fbf
chore: update package-lock to resume tests
adpare Jan 16, 2026
ab79fb3
fix: remove unauthorized test errors
adpare Jan 16, 2026
8b15176
fix: remove unauthorized test errors
adpare Jan 16, 2026
9672561
chore: update port to fix tests
adpare Jan 18, 2026
13390a3
fix: update zod version
adpare Jan 19, 2026
94e3401
chore: remove reports function from attack objects spec file
adpare Jan 22, 2026
a5c855d
fix: remove 401 validation errors and fix parallel relationships endp…
adpare Jan 22, 2026
9e78421
feat: add tests for reports endpoint
adpare Jan 22, 2026
4941046
fix: 401 errors for middleware tests
adpare Jan 22, 2026
0068aa6
chore: fix identation
adpare Jan 22, 2026
0f9befa
chore: add .nocommit folder to .gitignore for local development artif…
seansica Jan 26, 2026
bc9fe72
feat(openapi): add validateContents query paramater to POST /api/coll…
seansica Jan 26, 2026
12a2485
feat(exceptions): add new ValidationError and SchemaValidationError e…
seansica Jan 26, 2026
60e9b44
feat(bundle-helpers): add validationError category to importErrors
seansica Jan 26, 2026
00fd84b
docs(feature-planning): add draft spec for release track feature to r…
seansica Jan 30, 2026
3f5f1a6
docs(feature-planning): modify virtual tracks structure and release w…
seansica Jan 30, 2026
9434938
docs(feature-planning): small tweaks and typo corrections
seansica Jan 30, 2026
2692d01
feat: update validation to enable running .partial() with refinements
adpare Jan 30, 2026
d063883
chore: fix identation
adpare Jan 30, 2026
d268e21
feat(release-tracks): implement mongoose models for release track reg…
seansica Jan 30, 2026
2ac0ff5
refactor(release-tracks): organize zod schemas and mongoose middlewar…
seansica Feb 2, 2026
7e2054f
refactor(release-track-registry-model): simplify model validation mid…
seansica Feb 2, 2026
1da83d6
feat(release-tracks): implement dynamic dao/repository for registry a…
seansica Feb 2, 2026
67eaca5
feat(release-tracks): implement service facade, controller, and routes
seansica Feb 2, 2026
85d6fdb
feat(release-tracks): implement standard track service
seansica Feb 2, 2026
8c1cecb
chore: fix imports
adpare Feb 2, 2026
d8c0d97
chore: fix imports
adpare Feb 2, 2026
afe5706
feat(release-tracks): implement auto-promotion functionality
seansica Feb 3, 2026
542c7dd
feat(release-tracks): implement openapi spec files
seansica Feb 3, 2026
e4dcf5c
feat(release-tracks): implement bump/tag/versioning operations
seansica Feb 3, 2026
e8a322f
feat(release-tracks): implement virtual tracks
seansica Feb 3, 2026
6dcc873
fix(release-tracks): restrict dangerous 'Update Contents' endpoint to…
seansica Feb 3, 2026
ccdf50f
style: apply formatting
seansica Feb 3, 2026
5688ea3
fix(release-tracks): if using abort policy and found conflicts, throw…
seansica Feb 3, 2026
440835c
docs(release-tracks): define member sync strategy concept
seansica Feb 5, 2026
d1f95e0
feat(release-tracks): implement export and ephemeral service
seansica Feb 5, 2026
5a0a470
docs(release-tracks): remove section on migration handling for existi…
seansica Feb 5, 2026
730430c
feat(release-tracks): execute phase A of member sync strategy impl
seansica Feb 5, 2026
867a32f
feat(release-tracks): implement member sync strategies
seansica Feb 6, 2026
a20a783
fix(release-tracks): remove include_candidates_in_snapshots config se…
seansica Feb 6, 2026
22d37a5
chore: update zod and adm versions
adpare Feb 17, 2026
04638ec
refactor: compose ADM schemas with base+checks to avoid Zod .check() …
seansica Feb 17, 2026
58e556c
fix: update tests to incorporate new schema structure
adpare Feb 18, 2026
3b5e8f0
chore: fix identation
adpare Feb 18, 2026
bf51068
feat: add source and target objects to parallel relationships
adpare Feb 18, 2026
df93627
chore: fix identation
adpare Feb 18, 2026
a944401
Merge branch 'beta' of github.com:center-for-threat-informed-defense/…
adpare Feb 18, 2026
5bdea1b
chore: clean imports
adpare Feb 18, 2026
abc6669
chore: code cleanup
adpare Feb 18, 2026
d9bcafd
chore: fox identation
adpare Feb 18, 2026
7a8208f
chore: code cleanup
adpare Feb 18, 2026
2e7fda8
ci: add environment variable for MongoDB store crypto secret in regre…
jondricek Feb 20, 2026
441613e
fix: update function to generate secrets that satisfy complexity requ…
adpare Feb 20, 2026
b53beab
chore: fix indentation
adpare Feb 20, 2026
d224947
Merge branch 'beta' of github.com:center-for-threat-informed-defense/…
adpare Feb 20, 2026
7fe854e
fix: update connect-mongo version to use cryptoAdapter for encryption
adpare Feb 23, 2026
43261d4
chore: update import format
adpare Feb 23, 2026
7329a22
chore: add carat to connect-mongo
adpare Feb 23, 2026
797f0c3
feat: consolidate DTO handling using Zod for release tracks
seansica Feb 25, 2026
f091c85
Merge branch 'beta' into update-zod
seansica Feb 25, 2026
316c040
Merge pull request #450 from center-for-threat-informed-defense/updat…
seansica Mar 5, 2026
0a793b1
feat: refactor ADM validation into service-layer ETL pipeline
seansica Mar 9, 2026
7e54ef0
feat: add dryRun support to all remaining relevant CRUD endpoints
seansica Mar 11, 2026
062db92
fix: update controllers to enable fallback to global error handler
seansica Mar 12, 2026
9b4cf82
refactor: add logging statements to ext ref builder
seansica Mar 12, 2026
8e488fc
fix: resolve bug where techniqueMatchesTactic throws when x_mitre_dom…
seansica Mar 16, 2026
6d05da5
fix: impl workflow to auto change technique phase names when tactic r…
seansica Mar 16, 2026
34de4c1
Merge branch 'next' into beta
seansica Mar 18, 2026
70e1a91
Merge pull request #449 from center-for-threat-informed-defense/beta
seansica Mar 18, 2026
a4630c3
feat: implement revoke endpoints on all controllers
seansica Mar 26, 2026
00342f7
feat: bind new revoke endpoints to all routers
seansica Mar 26, 2026
8a95699
style: apply formatting
seansica Mar 26, 2026
ed3c13c
feat: implement new exception types for revoke workflow
seansica Mar 26, 2026
9a263ca
feat: define new revoke endpoints in openapi spec files
seansica Mar 26, 2026
97da469
feat: implement new event types for revoke operations
seansica Mar 26, 2026
b908474
feat: implement new methods for retrieving and deleting relationship …
seansica Mar 26, 2026
4cf9133
feat: implement service layer logic for new revoke workflow + new lif…
seansica Mar 26, 2026
dd85126
fix: a bug where server attempts to create attack external refs for r…
seansica Mar 26, 2026
05e43ae
test: update all tests that were setting revoked to use new dedicated…
seansica Mar 26, 2026
b8e8b0f
test: add new techniques.revoke.spec.js to evaluate e2e revoke operat…
seansica Mar 26, 2026
f0839fa
style: apply formatting
seansica Mar 26, 2026
a4c1aca
docs: document the revoke workflow
seansica Mar 27, 2026
9a47bc5
docs: major reorg of markdown documentation
seansica Mar 27, 2026
79ee10e
docs: fix typo in revoke-workflow documentation
seansica Mar 27, 2026
6535b2b
fix: stop throwing assertion error when analytic refs are omitted
seansica Mar 27, 2026
ceaa216
fix: stop requiring first + last seen fields for campaigns in openapi…
seansica Mar 27, 2026
438e2b4
feat: make spec_version/created/modified optional; server sets defaul…
seansica Mar 27, 2026
bf4cb46
test: stop requiring spec_version in group-related tests
seansica Mar 27, 2026
a9b5811
Merge pull request #459 from center-for-threat-informed-defense/456-a…
seansica Mar 27, 2026
00765e9
Merge branch 'next' into revoke-workflow
seansica Mar 27, 2026
40e87af
feat: define new endpoints for converting technique in openapi spec docs
seansica Mar 27, 2026
01141af
feat: implement service methods for converting technique to sub and v…
seansica Mar 27, 2026
0005a79
feat: bind new technique conversion methods to controller endpoints
seansica Mar 27, 2026
ce3617d
feat: attach routes to new technique conversion endpoints
seansica Mar 27, 2026
ee982c1
fix: block from changing x_mitre_is_subtechnique in PUT/update requests
seansica Mar 27, 2026
2ecbc39
test: implement tests for evaluating new technique conversion workflows
seansica Mar 27, 2026
66e4301
feat(software): ensure x_mitre_aliases[0] is always the object's own …
seansica Mar 31, 2026
5a68f64
fix: update revoke workflow to deprecate SROs rather than delete
seansica Mar 31, 2026
cb50c9f
feat(campaigns+groups): ensure aliases[0] is always the object's own …
seansica Mar 31, 2026
46e3ae4
test: update unit tests in campaigns.spec and technique.revoke.spec
seansica Mar 31, 2026
e28b58c
Merge branch 'revoke-workflow' into technique-convert-workflows
seansica Mar 31, 2026
eec6355
docs: add user documentation explaining the technique conversion work…
seansica Apr 1, 2026
9b62521
feat: allow handlers to return content asynchronously over event bus
seansica Apr 1, 2026
9e3be59
feat: add DTO pattern to handle workflow results
seansica Apr 1, 2026
ddd73c6
feat: update technique conversion workflows to use universal workflow…
seansica Apr 1, 2026
c9c43a1
feat: implement relationship handlers for technique to subtechnique w…
seansica Apr 1, 2026
ee8d960
refactor: update revoke workflow to use universal workflow response s…
seansica Apr 1, 2026
8556305
docs: add developer documentation explaining new universal workflow r…
seansica Apr 1, 2026
ba3c36e
fix: during revoke ops, push a warning when revoking obj already has …
seansica Apr 1, 2026
cc8b560
fix: update adm test to trigger validation error using an unprotected…
seansica Apr 1, 2026
93509c4
Merge pull request #460 from center-for-threat-informed-defense/techn…
seansica Apr 1, 2026
a409b07
Merge pull request #461 from center-for-threat-informed-defense/next
seansica Apr 1, 2026
52a1c52
Merge pull request #455 from center-for-threat-informed-defense/revok…
seansica Apr 1, 2026
a9c62d2
fix: permanently remove the /api/validate endpoint
seansica Apr 6, 2026
d51a5a1
feat: enable JIT validation bypass for ADM rules + support ATT&CK ID …
seansica Apr 6, 2026
a4ead5b
refactor: update BaseService to use event-bus pattern for preflight v…
seansica Apr 6, 2026
ab08b87
docs: update developer documentation to reflect new restrictions on c…
seansica Apr 6, 2026
7c6ab0c
feat: version system config, validate org identity, and propagate ide…
seansica Apr 6, 2026
9079149
Merge pull request #462 from center-for-threat-informed-defense/valid…
seansica Apr 6, 2026
c54af94
feat: add support to load ADM validation bypass rules at runtime via …
seansica Apr 7, 2026
0918417
feat(models): array-based stix fields now default to undefined instea…
seansica Apr 7, 2026
58d05b6
fix: restores revoked key in create + updateFull pipelines
seansica Apr 7, 2026
cf186ab
test: update marking definition test to include object marking refs
seansica Apr 7, 2026
82c8699
fix: add x_mitre_contributors for attack-patterns to start script to …
seansica Apr 7, 2026
9691f93
fix: add static adm bypass rules for x_mitre_modified_by_ref
seansica Apr 8, 2026
f51ca93
fix(collection-bundles): make importBundle workflow interoperable wit…
seansica Apr 8, 2026
823a78c
fix: remove empty embedded_relationships and collections from workspa…
seansica Apr 8, 2026
6607301
fix(migrations): unset each empty array field individually to avoid r…
seansica Apr 9, 2026
f559b2f
fix(migrations): remove-empty-array-fields targets both attackObjects…
seansica Apr 9, 2026
b36af5c
feat: create mongo views on startup
seansica Apr 9, 2026
78339ba
feat: add scheduled workflows to run adm validation and statefully tr…
seansica Apr 9, 2026
4e04bb3
feat: add db migration script to strip empty string fields
seansica Apr 9, 2026
df24b19
feat: strip empty string fields during create operations
seansica Apr 9, 2026
bf8a79c
fix: was calling static method via this
seansica Apr 9, 2026
8ecf44b
fix: remove check-attack-ids-task from scheduler
seansica Apr 10, 2026
8c95d90
fix: remove x_mitre_version from all SRO docs in database
seansica Apr 10, 2026
1c1b387
fix: remove endpoint and associated functionality for getting new att…
seansica Apr 10, 2026
66a64ab
fix: add constraints on {sub,parent}<>{sub,parent} technique revoke o…
seansica Apr 11, 2026
92d337e
fix: remove restrictions when revoking sub<>sub when subs in differen…
seansica Apr 13, 2026
8076710
feat: structured warning objects in workflow responses and verbose er…
seansica Apr 13, 2026
f66ee77
feat: remove the revoked field from all relationhip entities
seansica Apr 13, 2026
32c4852
fix: report SRO id and description in all response bodies for workflo…
seansica Apr 13, 2026
ac3684c
refactor: optimize backfill-workspace-validation migration script
seansica Apr 13, 2026
b0b42e2
fix: optimize backfill-workspace-validation migration script
seansica Apr 13, 2026
e44fd2b
Merge pull request #463 from center-for-threat-informed-defense/beta
seansica Apr 13, 2026
bfbc877
fix: generate ATT&CK external reference for matrix objects
seansica Apr 14, 2026
f628b00
ci: trigger pipeline
seansica Apr 14, 2026
7fcd99f
Merge branch 'next' into beta
seansica Apr 14, 2026
df0a3a8
feat: scope tactic shortname propagation to matching domains
seansica Apr 14, 2026
8940743
Merge pull request #464 from center-for-threat-informed-defense/beta
seansica Apr 14, 2026
80a890e
fix: write migration script to backfill workspace.embedded_relationsh…
seansica Apr 16, 2026
fce2b1d
ci: trigger pipeline
seansica Apr 16, 2026
47392eb
fix(stix): preserve embedded relationships on POST version creation
seansica Apr 16, 2026
409e4ca
fix(external-refs): preserve analytic ATT&CK URLs across versioned POSTs
seansica Apr 16, 2026
5851751
test: update regressions to align with fixed embedded relationship ha…
seansica Apr 16, 2026
7df4fe3
Merge pull request #465 from center-for-threat-informed-defense/beta
jondricek Apr 16, 2026
e06f0a1
fix: stop throwing exception when parentTechniqueId query param is om…
seansica Apr 21, 2026
5f20eb4
fix: reset created + modified on preserved relationships during revok…
seansica Apr 21, 2026
72a57a9
ci: trigger pipeline
seansica Apr 21, 2026
92325cc
fix(errors): normalize custom exception serialization and wrapped err…
seansica Apr 21, 2026
21f36f2
fix: drop required=true from the campaign mongoose schema for custom …
seansica Apr 22, 2026
4085d74
fix: stop throwing exception when parentTechniqueId query param is om…
seansica Apr 22, 2026
3b71eb5
Merge pull request #468 from center-for-threat-informed-defense/beta
seansica Apr 22, 2026
c8274ac
fix(external-references): correct detection strategy website url
clemiller Apr 24, 2026
875318c
fix(analytics): format AN IDs as Analytic <number>
clemiller Apr 24, 2026
88ee68a
fix(analytics): fallback x_mitre_log_source_references + x_mitre_muta…
seansica Apr 24, 2026
9f93cf8
fix(collections): set default value for x_mitre_contents to undefined
seansica Apr 24, 2026
7cd0903
Merge branch 'next' of github.com:center-for-threat-informed-defense/…
seansica Apr 24, 2026
4235410
fix(create-mongo-views): set stix.type filter for assets to 'x-mitre-…
seansica Apr 27, 2026
6e80f37
fix(migrations): target additional array fields that could be empty
seansica Apr 29, 2026
3dd24a4
feat(data-components): support domain filtering
scotluns Apr 29, 2026
7f5f190
fix(data-components): use dynamic test cookie name
scotluns May 4, 2026
ed85bf1
fix(validation): upgrade ADM to v4.10.1 to treat x_mitre_contributors…
seansica May 6, 2026
042ca9e
fix(validation): treat workspace.validation as server-controlled
seansica May 6, 2026
bac4eb5
docs(developer): explain stateful validation tracking
seansica May 6, 2026
a236c85
feat(validation): bump ADM to v4.11.0 and expose ADM_LOG_LEVEL
seansica May 6, 2026
8deb6d7
Merge pull request #473 from center-for-threat-informed-defense/beta
seansica May 6, 2026
2a6ac52
fix(migrations): remove older duplicate migration script
seansica May 7, 2026
7847b32
fix(stix-bundles): resolve issue with x_mitre_domains not appearing o…
seansica May 7, 2026
f52de6d
Merge pull request #474 from center-for-threat-informed-defense/beta
seansica May 7, 2026
8ef3aea
refactor(validation): use ADM partial schemas for WIP objects
seansica May 7, 2026
efbaba8
feat(data-components): support domain filtering
scotluns May 7, 2026
b97ae54
fix(base-service): stop logging irrelevant warning when modifying obj…
seansica May 7, 2026
48fd429
feat(migrations): normalize x_mitre_platforms and persist automation …
seansica May 7, 2026
c56a762
fix(platforms): remove support for Google Workspace and Azure AD
seansica May 8, 2026
56cb789
feat(validation): bump ADM to v4.11.1 to reflect updated platform
seansica May 8, 2026
7e05194
docs(developer): improve design rationale section in automation-runs.md
seansica May 8, 2026
f6c2280
fix(validation): upgrade ADM to v4.10.5
seansica May 11, 2026
db73941
feat(migrations): normalize x_mitre_mutable_elements on analytics
seansica May 11, 2026
f02c31a
style: apply formatting
seansica May 11, 2026
9b0fb80
feat(migrations): demote assets with noncompliant related_assets
seansica May 11, 2026
d37bc2c
fix(migrations): remove 20260507130000-normalize-x-mitre-platforms.js
seansica May 11, 2026
f6c8ffb
Merge pull request #475 from center-for-threat-informed-defense/beta
seansica May 11, 2026
c134083
fix(platforms): restore Network and restrict ICS selection
seansica May 11, 2026
cb7a7a7
Merge pull request #476 from center-for-threat-informed-defense/beta
seansica May 11, 2026
6223705
fix(validation): upgrade ADM to v4.11.7
seansica May 12, 2026
f069234
Merge branch 'beta' into next
seansica May 12, 2026
c091f56
fix(migrations): skip org-identity check when no candidates
seansica May 12, 2026
1ba2148
perf(import-bundle): batch and parallelize STIX bundle import
seansica May 14, 2026
b12ced6
feat(config): enable ADM validation by default
seansica May 14, 2026
eea4f1e
feat(import-bundle): enforce stix-fidelity contract on lifecycle hooks
seansica May 14, 2026
d69472e
fix(import-bundle): surface ADM validation errors in import response
seansica May 14, 2026
029b0e1
docs(import-bundle): add user guide, pipeline overview, fidelity cont…
seansica May 14, 2026
b86d506
fix(import-bundle): skip x_mitre_contents check for marking-definitions
seansica May 14, 2026
6785185
fix(import-bundle): surface Mongoose validation errors on bulk insert
seansica May 14, 2026
b78b474
Merge pull request #477 from center-for-threat-informed-defense/beta
seansica May 20, 2026
ac2d803
fix(logging): interpolate %s placeholders and unify validation error …
seansica Jun 18, 2026
ede05c1
test: inline small JSON fixtures into their spec files
seansica Jun 18, 2026
b415727
test(techniques): run technique suites with ADM validation enabled
seansica Jun 18, 2026
a1f6f78
test(analytics): run analytics suites with ADM validation enabled
seansica Jun 18, 2026
e3767d0
test(assets): run assets suite with ADM validation enabled
seansica Jun 19, 2026
436e142
test(campaigns): run campaigns suite with ADM validation enabled
seansica Jun 19, 2026
506d42e
test(collections): run collections suite with ADM validation enabled
seansica Jun 19, 2026
bcaeba5
test(data-components): run data-components suites with ADM validation…
seansica Jun 19, 2026
3a41b59
test(data-sources): run data-sources suites with ADM validation enabled
seansica Jun 19, 2026
ccb2f5b
test(detection-strategies): run suites with ADM validation enabled
seansica Jun 19, 2026
974d958
test(groups): run groups suites with ADM validation enabled
seansica Jun 22, 2026
2983755
test(identities): run identities suites with ADM validation enabled
seansica Jun 22, 2026
28eaa2c
test(marking-definitions): run marking-definitions suites with ADM va…
seansica Jun 22, 2026
ae2e2ca
test(matrices): run matrices suites with ADM validation enabled
seansica Jun 22, 2026
2e06c02
test(mitigations): run mitigations suites with ADM validation enabled
seansica Jun 22, 2026
8b1e954
test(notes): run notes suites with ADM validation enabled
seansica Jun 22, 2026
19a347b
test(recent-activity): run recent-activity suites with ADM validation…
seansica Jun 22, 2026
51ad6cc
test(references): run references suites with ADM validation enabled
seansica Jun 22, 2026
d07fe1a
test(relationships): run relationships suites with ADM validation ena…
seansica Jun 22, 2026
0c4202f
test(reports): run reports suites with ADM validation enabled
seansica Jun 22, 2026
3604275
test(session): run session suites with ADM validation enabled
seansica Jun 22, 2026
136298b
test(software): run software suites with ADM validation enabled
seansica Jun 22, 2026
f3d4452
test(stix-bundles): run stix-bundles suites with ADM validation enabled
seansica Jun 22, 2026
e2a4f5e
test(system-configuration): run system-configuration suites with ADM …
seansica Jun 22, 2026
1669310
test(tactics): run tactics suites with ADM validation enabled
seansica Jun 22, 2026
da1a062
test(teams): run teams suites with ADM validation enabled
seansica Jun 22, 2026
31adf50
test(user-accounts): run user-accounts suites with ADM validation ena…
seansica Jun 22, 2026
fd7153e
test(attack-objects): run attack-objects suites with ADM validation e…
seansica Jun 22, 2026
fe9c91f
test(collection-bundles): run collection-bundles suites with ADM vali…
seansica Jun 22, 2026
bd32292
test(collection-indexes): run collection-indexes suites with ADM vali…
seansica Jun 22, 2026
f3fd8f1
Merge pull request #479 from center-for-threat-informed-defense/fix/a…
seansica Jun 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ jobs:

- name: Run regression tests with code coverage
run: npm run coverage:cobertura
env:
MONGOSTORE_CRYPTO_SECRET: 'ThisisASecretKeyForTestingPurposesOnly1234567890!@#$'

- name: Upload Coverage to CodeCov
uses: codecov/codecov-action@v4
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
# A place to store artifacts during local development (scripts, datasets, dotenv files, etc.)
.nocommit/**/*

# Logs
logs
*.log
Expand Down
4 changes: 0 additions & 4 deletions .releaserc
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,6 @@
{
"name": "alpha",
"prerelease": true
},
{
"name": "adm",
"prerelease": true
}
],
"plugins": [
Expand Down
6 changes: 5 additions & 1 deletion .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@
"skipFiles": ["<node_internals>/**"],
"program": "${workspaceFolder}/bin/www",
"outputCapture": "std",
"envFile": "${workspaceFolder}/.env"
"envFile": "${workspaceFolder}/.env",
"env": {
"DATABASE_URL": "mongodb://localhost:27017/attack-workspace",
"LOG_LEVEL": "debug"
}
},
{
"type": "node",
Expand Down
21 changes: 11 additions & 10 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -60,20 +60,20 @@ If your changes are related to or dependent on changes in [attack-workbench-fron

The project uses the following branch structure to support semantic-release:

- `main` / `master`: Production-ready code
- `main`: Production-ready code
- `next`: Features for the next minor version
- `next-major`: Features for the next major version
- `beta`: Beta pre-releases
- `alpha`: Alpha pre-releases
- `*.*.x` or `*.x`: Maintenance branches for specific version releases
- `*.x`: Maintenance branches for specific version releases

Always target your pull requests to the `develop` branch unless specifically advised otherwise.
Always target your pull requests to the `main` branch unless specifically advised otherwise.

## Commit Message Guidelines

This project uses [conventional commits](https://www.conventionalcommits.org/) to automatically determine semantic versioning through semantic-release. Your commit messages should follow this format:

```
```text
<type>(<scope>): <description>

[optional body]
Expand Down Expand Up @@ -101,7 +101,7 @@ Adding `BREAKING CHANGE:` in the commit message footer will trigger a MAJOR vers
The project uses GitHub Actions for continuous integration with the following workflow:

1. **Commit Linting**: Ensures all commits follow the conventional commit format
2. **Static Checks**:
2. **Static Checks**:
- Runs linting checks
- Performs security scanning with Snyk
- Generates code coverage reports
Expand Down Expand Up @@ -140,11 +140,12 @@ Pre-release branches (alpha, beta) will generate pre-release versions with appro

The project publishes Docker images to the GitHub Container Registry (ghcr.io) with these tags:

- `latest`: Points to the most recent release from the main branch
- `v{major}.{minor}.{patch}`: Specific version tags (e.g., `v1.2.3`)
- `{major}.{minor}.{patch}`: Version tags without the 'v' prefix
- `sha-{short-commit-sha}`: Specific commit reference
- `latest`: Points to the most recent release from the `main` branch
- `next`: Points to the most recent release from the `next` branch
- `beta`: Points to the most recent release from the `beta` branch
- `alpha`: Points to the most recent release from the `alpha` branch
- `{major}.{minor}.{patch}`: Specific version tags (e.g., `v1.2.3`)

Docker images include metadata such as version, build time, and commit reference, which are accessible via both environment variables and image labels.

The image contains the Express.js REST API service and is designed to work with a MongoDB database.
The image contains the Express.js REST API service and is designed to work with a MongoDB database.
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ For a full ATT&CK Workbench deployment, including the frontend application, see

- [Usage Guide](USAGE.md): Comprehensive instructions for installing, configuring, and administering the REST API
- [Contributing Guide](CONTRIBUTING.md): Information for developers about contributing to the project
- [Data Model](docs/data-model.md): Technical details about the data models used in the application
- [Data Model](docs/developer/data-model.md): Technical details about the data models used in the application

## Technical Information

Expand All @@ -57,10 +57,10 @@ Copyright 2020-2025 MITRE Engenuity. Approved for public release. Document numbe

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0
<http://www.apache.org/licenses/LICENSE-2.0>

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

This project makes use of ATT&CK®

[ATT&CK Terms of Use](https://attack.mitre.org/resources/terms-of-use/)
[ATT&CK Terms of Use](https://attack.mitre.org/resources/terms-of-use/)
89 changes: 31 additions & 58 deletions USAGE.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ This guide provides comprehensive instructions for installing, configuring, and
- [Environment Variables](#environment-variables)
- [Configuration File](#configuration-file)
- [Authentication](#authentication)
- [Authentication Mechanisms](#authentication-mechanisms)
- [OpenID Connect (OIDC) Configuration](#openid-connect-oidc-configuration)
- [Service Authentication](#service-authentication)
- [User Management](#user-management)
- [User Roles and Permissions](#user-roles-and-permissions)
- [User Account Status](#user-account-status)
Expand All @@ -37,6 +34,7 @@ This guide provides comprehensive instructions for installing, configuring, and
The ATT&CK Workbench REST API provides services for storing, querying, and editing ATT&CK objects. It is built on Node.js and Express.js, and uses MongoDB for data persistence.

This component is part of the larger ATT&CK Workbench application, which includes:

- [ATT&CK Workbench Frontend](https://github.com/center-for-threat-informed-defense/attack-workbench-frontend)
- [ATT&CK Workbench REST API](https://github.com/center-for-threat-informed-defense/attack-workbench-rest-api) (this component)

Expand All @@ -48,25 +46,29 @@ The recommended deployment method is using Docker. The REST API is published as

#### Using Docker Compose (Recommended)

The simplest way to deploy the entire ATT&CK Workbench application is using Docker Compose. Instructions are available in the [Workbench Deployment Guide](https://github.com/mitre-attack/attack-workbench-deployment).
The simplest way to deploy the entire ATT&CK Workbench application is using Docker Compose.
Instructions are available in the [Workbench Deployment Guide](https://github.com/mitre-attack/attack-workbench-deployment).

#### Standalone Docker Deployment

To run only the REST API in a Docker container:

1. **Create a Docker network** (if not already created):

```shell
docker network create attack-workbench-network
```

2. **Run MongoDB container**:

```shell
docker run --name attack-workbench-mongodb -d \
--network attack-workbench-network \
mongo:latest
```

3. **Run REST API container**:

```shell
docker run -p 3000:3000 -d \
--name attack-workbench-rest-api \
Expand All @@ -86,6 +88,8 @@ docker run -p 3000:3000 -d \
ghcr.io/center-for-threat-informed-defense/attack-workbench-rest-api:latest
```

More infomation about configuration options is in the [configuration file documentation](./docs/admin/configuration.md).

### Manual Installation

#### Requirements
Expand All @@ -96,19 +100,22 @@ docker run -p 3000:3000 -d \
#### Installation Steps

1. **Clone the repository**:

```shell
git clone https://github.com/center-for-threat-informed-defense/attack-workbench-rest-api.git
cd attack-workbench-rest-api
```

2. **Install dependencies**:

```shell
npm install
```

3. **Configure the application** using environment variables or a configuration file (see [Configuration](#configuration)).

4. **Start the application**:

```shell
node ./bin/www
```
Expand Down Expand Up @@ -165,42 +172,8 @@ Example configuration file:

## Authentication

The REST API supports different authentication mechanisms for both user and service authentication.

### Authentication Mechanisms

The application supports these user authentication mechanisms:

- **Anonymous**: Default mechanism with no actual authentication (primarily for local development)
- **OpenID Connect (OIDC)**: Integration with organizational identity providers

### OpenID Connect (OIDC) Configuration

To enable OIDC authentication:

1. **Register with your OIDC Identity Provider** with these details:
- Authentication flow: Authorization Code Flow
- Required claims: `email` (required), `preferred_username` (optional), `name` (optional)
- Grant Types: Client Credentials, Authorization Code, and Refresh Token
- Redirect URL: `<host_url>/api/authn/oidc/callback`

2. **Configure the REST API** with these environment variables:

| Environment Variable | Required | Description | Configuration Property |
|---------------------|----------|-------------|------------------------|
| **AUTHN_MECHANISM** | Yes | Must be set to `oidc` | userAuthn.mechanism |
| **AUTHN_OIDC_CLIENT_ID** | Yes | Client ID from your OIDC provider | userAuthn.oidc.clientId |
| **AUTHN_OIDC_CLIENT_SECRET** | Yes | Client secret from your OIDC provider | userAuthn.oidc.clientSecret |
| **AUTHN_OIDC_ISSUER_URL** | Yes | Issuer URL for the Identity Server | userAuthn.oidc.issuerUrl |
| **AUTHN_OIDC_REDIRECT_ORIGIN** | Yes | URL for the Workbench host | userAuthn.oidc.redirectOrigin |

### Service Authentication

For service-to-service communication, the REST API supports three methods:

1. **API Key Challenge Authentication**: Services obtain a JWT using a challenge-response protocol
2. **API Key Basic Authentication**: Services authenticate using HTTP Basic Authentication
3. **OIDC Client Credentials Flow**: Services obtain a JWT from an OIDC provider
The REST API has several authentication options.
Read all about them in the [authentication docs](./docs/admin/authentication/README.md).

## User Management

Expand All @@ -210,29 +183,29 @@ The REST API includes a user management system when using OIDC authentication.

The system supports these roles:

| Role | Description |
|------|-------------|
| `none` | No access to the system (for pending/inactive users) |
| `visitor` | Read-only access to ATT&CK objects |
| `editor` | Read and write access to ATT&CK objects |
| `admin` | Full access to all system capabilities, including user management |
| Role | Description |
|-----------|-------------------------------------------------------------------|
| `none` | No access to the system (for pending/inactive users) |
| `visitor` | Read-only access to ATT&CK objects |
| `editor` | Read and write access to ATT&CK objects |
| `admin` | Full access to all system capabilities, including user management |

### User Account Status

| Status | Description |
|--------|-------------|
| `pending` | User has registered but awaits approval |
| `active` | User is registered and approved |
| `inactive` | User is no longer active |
| Status | Description |
|------------|-----------------------------------------|
| `pending` | User has registered but awaits approval |
| `active` | User is registered and approved |
| `inactive` | User is no longer active |

### User Management Endpoints

| Endpoint | Method | Description | Authorization |
|----------|--------|-------------|--------------|
| `/api/user-accounts` | GET | List all users | Admin only |
| `/api/user-accounts/:id` | GET | Get user by ID | Admin or self |
| `/api/user-accounts/register` | POST | Register new user | Logged in, unregistered users |
| `/api/user-accounts/:id` | PUT | Update user | Admin only |
| Endpoint | Method | Description | Authorization |
|-------------------------------|--------|-------------------|-------------------------------|
| `/api/user-accounts` | GET | List all users | Admin only |
| `/api/user-accounts/:id` | GET | Get user by ID | Admin or self |
| `/api/user-accounts/register` | POST | Register new user | Logged in, unregistered users |
| `/api/user-accounts/:id` | PUT | Update user | Admin only |

## API Documentation

Expand Down Expand Up @@ -284,4 +257,4 @@ Common issues and their solutions:

4. **Permission denied errors**:
- Check the user's role and status
- Ensure the user account has the necessary permissions for the operation
- Ensure the user account has the necessary permissions for the operation
4 changes: 0 additions & 4 deletions app/api/definitions/components/campaigns.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,6 @@ components:
- type: object
required:
- name
- first_seen
- last_seen
- x_mitre_first_seen_citation
- x_mitre_last_seen_citation
properties:
# campaign specific properties
name:
Expand Down
14 changes: 14 additions & 0 deletions app/api/definitions/components/query-parameters.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
components:
parameters:
dryRun:
name: dryRun
in: query
description: |
When set to `true`, the request runs through the full composition and validation
pipeline but does not persist changes. Returns the composed object that would have
been created or updated.

Use this to validate data before committing it. Replaces the deprecated `POST /api/validate` endpoint.
schema:
type: boolean
default: false
Loading
Loading