Skip to content

v6.8.0 - #3941

Open
mlodic wants to merge 25 commits into
masterfrom
develop
Open

v6.8.0#3941
mlodic wants to merge 25 commits into
masterfrom
develop

Conversation

@mlodic

@mlodic mlodic commented Aug 16, 2026

Copy link
Copy Markdown
Member

Checklist for creating a new release

  • If we changed/added Docker Analyzers, we need to configure Docker Hub / Dependabot properly.
  • I have already checked if all Dependabot issues have been solved before creating this PR.
  • Update CHANGELOG.md for the new version. Tag another maintainer to review the Changelog and wait for their feedback.
  • Change version number in docker/.env and frontend/package.json.
  • Verify CI Tests. Solve all the issues (Dependencies, Django Doctor, CodeFactor, DeepSource, etc).
  • Create release for the branch develop and set it as a pre-release. Remember to prepend a v to the version number.
    Write the following statement there (change the version number):
please refer to the [Changelog](https://github.com/intelowlproject/IntelOwl/blob/develop/.github/CHANGELOG.md#v331)

WARNING: We are building the new version of the project! The release will be officially available within 2 hours!
  • Wait for dockerHub to finish the builds
  • Merge the PR to the master branch. Note: Only use "Merge and commit" as the merge strategy and not "Squash and merge". Using "Squash and merge" makes history between branches misaligned.
  • Remove the "wait" statement in the release description and change the version status from pre-release to latest release.
  • Publish new Post into official Twitter and LinkedIn accounts (change the version number):
published #IntelOwl vX.X.X! https://github.com/intelowlproject/IntelOwl/releases/tag/vX.X.X #ThreatIntelligence #CyberSecurity #OpenSource #OSINT #DFIR
  • If that was a major release or an important release, communicate the news to the marketing staff
  • This is a good time to check for old dangling issues and clean-up the inactive ones. Same for issues solved by this release.

berardifra and others added 25 commits July 3, 2026 08:01
 (#3842)

* [GSoC 2026] chatbot: migrate agent engine to LangChain 1.x create_agent (Refs #3833)

Replace the deprecated AgentExecutor + create_tool_calling_agent with create_agent on the
LangGraph runtime. External behavior and the chat WebSocket wire protocol are unchanged.

- agent.py: build_agent() -> ChatAgent(runnable, tool_names) via create_agent(model, tools,
  system_prompt); page_context baked into the system prompt; final_answer() helper.
- streaming.py: ChatStreamConsumer consumes stream_mode=["messages","values"] and emits the
  same token/status/action_required events, returning the terminal answer (no callbacks).
- tasks.py / views.py: GraphRecursionError -> ITERATION_LIMIT (the AGENT_STOPPED_OUTPUT
  sentinel no longer exists in 1.x); agent input is a messages list.
- RECURSION_LIMIT = 2*rounds + 2 (=14): LangGraph bounds a run by supersteps, not agent rounds.
- deps: langchain==1.3.11, langchain-ollama==1.1.0 (core/langgraph stay transitive).
- security: remove the dependency-review allow-ghsas for GHSA-gr75-jv2w-4656 (fixed in
  langchain>=1.3.9, so the allowlist is no longer needed).

All 168 chatbot tests pass; a live Ollama smoke confirms token streaming, tool-call
visibility and the M-1 pending_id path are unchanged.

* [GSoC 2026] chatbot: address DeepSource findings on the LangChain 1.x tests (Refs #3833)

- test_agent.py: index the ToolMessage list instead of a bare next() (PTC-W0063).
- test_streaming.py / test_query_counts.py: make the self-less test helpers static
  (_make_consumer, the _FakeRunnable.stream fake) (PYL-R0201).

Behavior unchanged; 168 chatbot tests still green.
…E) — Refs #3855 (#3856)

* [GSoC 2026] chatbot: add keep_alive setting normalizer

* [GSoC 2026] chatbot: keep the Ollama model resident via OLLAMA_KEEP_ALIVE
…3865)

* feat(connectors): show health check errors in ui

* test(connectors): update tests for health checks
… + forbid placeholder names (#3881)

* [GSoC 2026] chatbot: default analyze_observable to a curated playbook + forbid placeholder
  names — Refs #3880

A1: when the model names neither a playbook nor analyzers, analyze_observable now
  resolves the curated FREE_TO_USE_ANALYZERS playbook (when visible, applicable and
  enabled) instead of dead-ending on 'No Analyzers and Connectors can be run after
  filtering'. Falls back to an actionable error listing the applicable visible
  playbooks. The plan carries a 'reason' explaining the choice, the model is told to
  surface it in the confirmation, and the pending record stores the resolved playbook
  so confirm re-validates the same plan.

  A2: a [Rules] line tells the model to copy analyzer/playbook/job names verbatim and
  never emit bracketed placeholders like [Analyzer 1].

* chatbot: extract analyze_observable input handling to cut cyclomatic complexity (DeepSource
  PY-R1000)
…free domain/URL analyzers (#3893)

* [GSoC 2026] core(datamodel): extract shared classify() from the DataModel visualizer

* [GSoC 2026] core(datamodel): populate evaluation for key-free DNS malicious detectors

* [GSoC 2026] core(datamodel): Phishtank verdict (verified vs unverified reliability)

* [GSoC 2026] core(datamodel): PhishingArmy + Phishstats verdict on a listing hit

* [GSoC 2026] core(datamodel): Tranco popularity verdict (trusted, rank-banded reliability)

* [GSoC 2026] test(datamodel): anti-rot guard for key-free verdict target configs

* [GSoC 2026] core(datamodel): score Tranco top-1000 domains as allowlist evidence

* [GSoC 2026] core(datamodel): replace the bucket constants with a shared enum
* [GSoC 2026] chatbot: read the reconciled job verdict from the core

* [GSoC 2026] chatbot: fold the verdict into summarize_job

* [GSoC 2026] chatbot(frontend): collapse the job summary and evaluate chips

* [GSoC 2026] chatbot: address DeepSource findings in the verdict tests
…ool.org (#3903)

repo_downloader.sh fetched ExifTool from
https://exiftool.org/Image-ExifTool-$version.tar.gz, which now returns
404 - exiftool.org no longer hosts the tarball and links its own Unix
downloads to SourceForge instead. That broke the ExifTool analyzer's
install step.

Point the download at the SourceForge URL. Since it ends in "/download"
and redirects to a mirror, added -O so the file is saved as
Image-ExifTool-$version.tar.gz for the extraction step that follows
(the comment above the line already documented -O as the intent).

Verified for 13.59: the SourceForge URL serves a valid gzip tarball
that extracts to Image-ExifTool-13.59/ with the exiftool binary intact,
and shellcheck passes on the script.

Fixes #3861
… support data model enrichment Closes #3890 (#3891)

* feat(connectors): add shared CTIConnector base class with data model enrichment

* fix(connectors): update file classifcation

* test(connectors): add tests for new cti connector base class

* fix(core): strictly filter all_subclasses by module base path

* chore(connectors): add abstract run method to CTIConnector and make helper methods static in CTIConnectorTestCase
…s, message) Closes #3906 (#3907)

* [Health Check] Refactor health_check methods to return a tuple (status, message)

* fix deepsource errors
…loses #3912 (#3913)

* updated PR automation Slow run to avoid executing all the optional containers

* fix(ci): update shellcheck pipeline script URL (closes #3912)

---------

Co-authored-by: Daniele Rosetti <55402684+drosetti@users.noreply.github.com>
Co-authored-by: Matteo Lodi <30625432+mlodic@users.noreply.github.com>
…QUEUE (#3919)

* [GSoC 2026] fix(settings): single, env-driven definition for CHATBOT_QUEUE

CHATBOT_QUEUE was assigned twice: in settings/chatbot.py from the environment,
and in settings/celery.py as a hardcoded literal. Both modules are wildcard
imported by settings/__init__.py, so the literal (imported last) shadowed the
env read and CHATBOT_QUEUE in the environment had no effect on
settings.CHATBOT_QUEUE.

Keep a single definition in settings/celery.py, next to the other queue names
and the CELERY_QUEUES loop that registers it. One assignment makes the value
independent of the wildcard import order, so re-ordering those lines cannot
resurface the bug. settings/celery.py is also the lower-level module (it must
run before the others and imports only ._util and .aws), so this adds no new
import edge; the reverse direction would have pulled .cache into it.

The consumer side was hardcoded too: docker/entrypoints/celery_chatbot.sh
pinned "chatbot" in its -Q list, so a custom queue name would have published
chat turns to a queue no worker drains. It now reads the same variable, with
the same unset/blank fallback, and the variable is documented in
env_file_app_template.

tests/intel_owl/test_settings.py boots Django in a subprocess with a custom
CHATBOT_QUEUE and asserts it reaches settings, CELERY_QUEUES and the Celery
route of process_chat_message; plus an AST guard that fails if any setting is
ever again assigned in two wildcard-imported settings modules.

Refs #3910

* [GSoC 2026] test(settings): guard the producer/consumer coupling of CHATBOT_QUEUE

Split tests/intel_owl/test_settings.py into one file per concern, so a settings
PR touching the chatbot queue does not collide with one touching the shadowing
invariant: test_settings_chatbot_queue.py (the queue reaches settings and the
Celery route) and test_settings_shadowing.py (no setting is assigned twice).

Add the coupling guard the fix was missing. Django publishes the chat task and
the worker entrypoint consumes it, each reading CHATBOT_QUEUE on its own side,
so the default queue name now lives in two layers: flipping one of them silently
sends turns to a queue nobody drains -- the same failure this setting already
had, one layer down. The new test extracts ${CHATBOT_QUEUE:-...} from
celery_chatbot.sh, compares it with what the settings fall back to, and fails if
either side hardcodes the queue again. Verified by mutation: flipping the shell
default to "chat" fails with 'chat' != 'chatbot'.

The shadowing guard now also audits __init__.py's own assignments (TEST_RUNNER,
INSTALLED_APPS), which are made before the wildcard block and could be shadowed
by a submodule -- the same bug in the opposite direction. Verified by mutation
on a copy of the settings package.

Also: the probe reads the routed task name from process_chat_message.name
instead of repeating the dotted path, the subprocess timeout is a named constant
with its rationale, and celery.py states why the lookup is environment-only (the
worker side is a shell script and cannot resolve an AWS secret).

* chore: trigger CI actions

* fix(tests): explicitly pass check=False to subprocess.run for DeepSource PYL-W1510
…tails and enhance unit tests for message content (#3933)
Bumps [github/codeql-action](https://github.com/github/codeql-action) from 4.35.1 to 4.37.6.
- [Release notes](https://github.com/github/codeql-action/releases)
- [Changelog](https://github.com/github/codeql-action/blob/main/CHANGELOG.md)
- [Commits](github/codeql-action@v4.35.1...v4.37.6)

---
updated-dependencies:
- dependency-name: github/codeql-action
  dependency-version: 4.37.6
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…lder names (#3920)

* chatbot: detect fabricated bracketed names in an answer

  Refs #3909

* chatbot: annotate a flagged answer on both the WebSocket and REST paths

  Refs #3909

* chatbot: keep the placeholder notice out of the replayed prompt history

  Refs #3909

* test(chatbot): re-enable logging during placeholder guard assertions

* test(chatbot): use mock.patch for placeholder guard logging assertions to avoid CI logging disable issues
Co-authored-by: mlodic <30625432+mlodic@users.noreply.github.com>
Bumps [playwright](https://github.com/microsoft/playwright-python) from 1.50.0 to 1.62.0.
- [Release notes](https://github.com/microsoft/playwright-python/releases)
- [Commits](microsoft/playwright-python@v1.50.0...v1.62.0)

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: 1.62.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Bumps [actions/stale](https://github.com/actions/stale) from 9 to 11.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](actions/stale@v9...v11)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-version: '11'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: mlodic <30625432+mlodic@users.noreply.github.com>
Co-authored-by: mlodic <30625432+mlodic@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants