806 Commits

Author SHA1 Message Date
dextmorgn
249374e6d7 chore: update .gitignore v1.2.9 2026-05-31 14:53:34 +02:00
dextmorgn
a15ee54af0 chore: update skill name 2026-05-31 14:52:37 +02:00
dextmorgn
cc829704e5 Merge pull request #148 from reconurge/fix/phase1-critical
fix: security issues
2026-05-30 19:47:55 +02:00
dextmorgn
e8ca7b39bf fix(types): apply extra=allow via Pydantic v2 model_config
FlowsintType declared an inner `class ConfigDict: extra = "allow"`, which
Pydantic v2 treats as an ordinary nested class and ignores entirely. The
base therefore fell back to the default extra="ignore", silently dropping
user-supplied extra properties on every entity type. Replaced with
model_config = ConfigDict(extra="allow"). Extra keys are now retained.

flowsint-types (44), flowsint-enrichers (12) and flowsint-core (390) suites pass.
2026-05-30 19:03:30 +02:00
dextmorgn
1d409d7929 fix(scan): persist results to existing details column, errors to error column
The Scan model exposes details (JSON) and error (Text) columns, but the
enricher/flow tasks assigned to scan.results — a non-mapped attribute.
SQLAlchemy accepted the assignment silently, so commit() never persisted
it and the data was lost. Success paths now write scan.details; failure
paths write scan.error. ScanCreate.results renamed to details to match.

Scan repository tests pass.
2026-05-30 19:02:14 +02:00
dextmorgn
ee06d6cf3e fix(api): restrict CORS origins via ALLOWED_ORIGINS env
allow_origins was ["*"] together with allow_credentials=True, which is
both insecure and rejected by browsers for credentialed requests. Read a
comma-separated ALLOWED_ORIGINS env var instead, defaulting to the Vite
dev origin http://localhost:5173. Documented in .env.example.
2026-05-30 18:49:44 +02:00
dextmorgn
dd00bae9ce fix(api): run production container as non-root flowsint user
The production stage created the flowsint user and chowned all app
files to it, but the USER directive was commented out, so the API
ran as root. Uncommented it. Verified: image builds, container reports
whoami=flowsint and /health returns 200.
2026-05-30 18:49:43 +02:00
dextmorgn
c9d594a8e7 fix(api): load AUTH_SECRET from validated core.auth source
deps.py read AUTH_SECRET via os.getenv() before load_dotenv() ran,
yielding None when the secret was only present in .env. Import the
already-validated AUTH_SECRET from core.auth (loads dotenv first and
raises if unset) instead of re-reading it. Removes the dup + ordering bug.
2026-05-30 18:44:07 +02:00
dextmorgn
de4f4ea87f Update README with new image links
Added additional image links to the README.
2026-05-28 00:00:13 +02:00
dextmorgn
67ba8cfcc6 feat(chore): update SKILL.md 2026-05-21 11:09:28 +02:00
dextmorgn
8fbcf0c025 chore(skills): add flowsint-transform-builder claude skill
Project-scoped Claude Code skill guiding enricher and type creation.
Whitelists .claude/skills/flowsint-transform-builder/ in .gitignore so
the skill ships with the repo while keeping the rest of .claude/ ignored.
2026-05-15 18:55:56 +02:00
dextmorgn
d431ef4fae docs: sync with flowsint-types and flowsint-enrichers (v1.2.8)
- available-enrichers.mdx: add 17 missing enrichers, drop phantom entries
- managing-enrichers.mdx: fix stale Troubleshooting referencing EnricherRegistry.register()
- managing-types.mdx: note 8 registered-but-uncategorized types
- bump all frontmatter to version 1.2.8 / 2026-05-15
2026-05-15 18:55:25 +02:00
dextmorgn
5be480d4f5 Merge pull request #138 from z3rodaycve/feature/collection-enrichers
Release of my collection of Flowsint enrichers
2026-05-10 17:58:55 +02:00
dextmorgn
431d3997f4 Merge pull request #142 from harmsolo13/fix/celery-healthcheck
fix: replace celery container's inherited curl-based healthcheck
2026-04-29 11:35:17 +02:00
harmsolo13
d4dbe8d0fe fix: replace celery container's inherited curl-based healthcheck
The celery container builds from flowsint-api/Dockerfile which carries
a HEALTHCHECK directive that does `curl -f http://localhost:5001/health`.
The API container has an HTTP server on 5001 — celery doesn't, it's a
worker. So the inherited healthcheck always fails and `docker ps` shows
celery as (unhealthy) even when the worker is actively processing jobs.

This is cosmetic noise today but bites in two real ways: (1) restart
policies that key off health won't re-up celery on a real failure
because Docker can't tell good unhealthy from bad unhealthy, (2) any
service that adds `depends_on: celery: condition: service_healthy`
will refuse to start.

Fix: add a service-level healthcheck on celery in both compose files
(prod and dev) that uses celery's own `inspect ping` primitive
against the worker's broker. Compose-level healthcheck overrides the
Dockerfile-level one, so no Dockerfile change needed.

Smoke-tested locally: container goes from (unhealthy) to (healthy)
within ~30s of restart with no other changes.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 18:13:26 +09:30
z3rodaycve
f79403d361 Fixed to_ssl enricher to use httpX Docker Tool 2026-04-24 19:49:20 +02:00
z3rodaycve
0d04423b59 Release of DeHashed, httpX, veriphone, scamalytics enrichers 2026-04-21 16:49:12 +02:00
dextmorgn
62e34c6e9b chore: update README.md with discord link 2026-04-19 13:18:55 +02:00
dextmorgn
2a4878c8fc chore: update gh workflow v1.2.8 2026-04-11 15:20:07 +02:00
dextmorgn
6a14484ccd Merge pull request #136 from reconurge/feat/rbac
Feat/rbac
2026-04-11 14:51:34 +02:00
dextmorgn
47b0c05115 feat(app): RBAC permission gating, UserAvatar component, share dialog redesign and responsive grids
- Add UserAvatar and AvatarGroup components to /ui/avatar, migrate all consumers
- Display collaborator avatars in top navbar with AvatarGroup
- Gate edit actions behind canEdit: toolbar (connect, merge, layouts), nodes-view,
  nodes-panel, relationships-view (checkboxes + delete), edge-details-panel,
  graph-navigation (Add tab), import sheet, analysis creation
- Add role badge (owner/admin/editor/viewer) with colored icons in case-header
- Redesign share-dialog: role badges as dropdown triggers, skeleton loading,
  owner/member separation, hover-reveal delete button
- Switch all card grids from viewport breakpoints to CSS container queries
  (dashboard-stats, investigations-list, sketches-section, metrics-grid, custom-types)
- Extend container query classes in styles.css for all needed column counts
2026-04-11 14:44:29 +02:00
dextmorgn
8cd6b237bb fix(core/tests): update failing test 2026-04-11 14:44:29 +02:00
dextmorgn
ce1f50bb72 chore: update yarn.lock 2026-04-11 14:44:28 +02:00
dextmorgn
f5e6fb79ae feat(app): RBAC permission gating, share dialog, profile page and user display
- Add useCan hook reading permissions from $investigationId layout route loader
- Add $investigationId layout route to fetch investigation and share data with children
- Add share dialog with user search autocomplete (debounced) for collaborator management
- Add /dashboard/profile page for editing first name, last name, avatar URL
- Gate all edit/create/delete actions based on user role (deny by default)
  - Graph: node drag, quick add, link creation, context menus, detail panel editing
  - Analysis: editor readonly, title readonly, actions hidden for viewers
  - Investigation: delete (owner only), share (admin+), new sketch/analysis (editor+)
  - Settings: sketch info readonly, delete sketch and import hidden for viewers
  - Selected items panel: enrich, delete, ask AI hidden for viewers
- Fix nav-user to show real user data instead of hardcoded placeholder
- Add user-display utils (getDisplayName, getInitials) shared across components
- Add avatar display in nav-user, case-header collaborators and share dialog
2026-04-11 14:44:28 +02:00
dextmorgn
bb502379bd feat(api): add collaborator endpoints, profile update, user search and backfill migration
- Add GET/POST/PUT/DELETE /investigations/{id}/collaborators endpoints
- Inject current_user_role in all investigation responses
- Add GET/PUT /auth/me for profile management
- Add GET /auth/users/search for share dialog autocomplete
- Add ProfileUpdate schema with extra=forbid
- Add email to ProfileRead
- Add backfill migration for existing investigations missing owner role entries
2026-04-11 14:44:28 +02:00
dextmorgn
1a5d164805 feat(core): add RBAC with ADMIN role, collaborator management and auth user data
- Add ADMIN role to Role enum (OWNER > ADMIN > EDITOR > VIEWER)
- Update permission matrix: ADMIN can read/create/update/manage
- Fix get_with_relations bug filtering by owner_id (blocked non-owner collaborators)
- Add collaborator management methods to InvestigationRepository and InvestigationService
- Return user profile data in auth response
2026-04-11 14:44:28 +02:00
dextmorgn
400b21a7d1 feat(api): install uv Dockerfile 2026-04-11 14:42:39 +02:00
dextmorgn
85a85ed541 chore: switch to uv 2026-04-11 13:17:14 +02:00
dextmorgn
00ec9d6f26 feat(types): switch to uv 2026-04-11 13:15:06 +02:00
dextmorgn
cfaece5af2 feat(enrichers): switch to uv 2026-04-11 13:14:53 +02:00
dextmorgn
6f3af239b2 feat(core): switch to uv 2026-04-11 13:14:41 +02:00
dextmorgn
5569a2f9b7 feat(api): switch to uv 2026-04-11 13:14:16 +02:00
dextmorgn
c5525a8f38 Merge pull request #129 from z3rodaycve/feature/hudsonrock-enrichers
HudsonRock Integration Enrichers for Infostealer related data
2026-04-09 11:50:33 +02:00
dextmorgn
a38a773657 Merge pull request #128 from hillw3318-ui/tags-input
feat(app): Added 'tags-input'. Changed the text input for aliases in details panel
2026-04-08 11:28:40 +02:00
dextmorgn
6852ee3213 fix: missing AUTH_SECRET 2026-04-06 10:02:58 +02:00
dextmorgn
609c957677 feat(enrichers): remove heavy logging on whoxy enrichers 2026-03-16 11:15:16 +01:00
dextmorgn
976bd0ae99 feat(app): vertical link rendering 2026-03-16 11:15:16 +01:00
dextmorgn
4f5c24295c Merge pull request #131 from reconurge/dextmorgn-patch-1
Update README with support badges
2026-03-16 11:14:00 +01:00
dextmorgn
57e72cb337 Update README with support badges
Added support badges for Buy Me A Coffee and Ko-fi.
2026-03-16 11:13:44 +01:00
William Hill
1d376b8ac0 Merge branch 'reconurge:main' into tags-input 2026-03-16 00:32:00 +03:00
bjst0ne
def29144eb fix(app): fixed lists/arrays render in 'details-panel' 2026-03-16 00:37:03 +03:00
dextmorgn
3ef942a2bc feat(app): fix double-click detection and graphRef initialization
Thread MouseEvent through onBackgroundClick for double-click detection.
Use stable callback ref to avoid ForceGraph2D stale closure issues.
Fix graphRef not being set on first load by notifying parent immediately
after ForceGraph2D mounts. Close quick-add input on blur.
v1.2.7
2026-03-15 13:34:34 +01:00
dextmorgn
1ee06f5c8a feat(types): format phone numbers to avoid doublons 2026-03-15 13:07:01 +01:00
dextmorgn
37cdd93257 feat(types): detect individual from spaces 2026-03-15 13:06:40 +01:00
dextmorgn
5292a3c541 feat(app): add quick-add node on double-click
Double-click on the graph background opens an inline input at that position.
Typing triggers debounced type detection via the API, showing the detected
type as a badge. On Enter, a node is created at the click position with the
detected type and persisted to the API. Escape or click outside cancels.
2026-03-15 12:37:46 +01:00
dextmorgn
972763343e feat(api): add type detection route and service
Add POST /api/types/detect endpoint that detects the type of a text input
by iterating registered types and calling their detect() classmethod.
Returns detected type with fields and primary field pre-filled.
Falls back to Phrase when no type matches.
2026-03-15 12:35:46 +01:00
dextmorgn
97ef7e4695 feat(app): add alt+drag edge creation between nodes
Allow creating edges by holding Alt and dragging from one node to another.
On release, the edge is added to the graph and the edge context menu opens
with the label input focused and selected, ready for editing. The edge is
only persisted to the API on Enter/submit; Escape removes it from the store.
2026-03-15 11:51:05 +01:00
bjst0ne
3e8e4c8423 Merge branch 'main' into tags-input 2026-03-10 13:37:48 +03:00
bjst0ne
cd67ae369b refactor(app): changed props for 'tags-input' 2026-03-10 12:54:16 +03:00
z3rodaycve
ff9d270ddd Release of HudsonRockToUsername, HudsonRockToPhone, HudsonRockToEmail 2026-03-10 10:24:39 +01:00