Skip to content

build: Go 1.27.2, and eml - pictures in the text, messages inside messages, recipients, base64 text and two more character sets - #176

Merged
donislawdev merged 3 commits into
mainfrom
build/go-1.27.2
Oct 13, 2026
Merged

donislawdev merged 3 commits into
mainfrom
build/go-1.27.2

Conversation

@donislawdev

@donislawdev donislawdev commented Oct 13, 2026 •

Copy link
Copy Markdown
Owner

What

Two things on one branch.

Go 1.27.2. The scheduled CI run of 2026-10-12 was red in govulncheck: ten vulnerabilities in the standard library (net/http, net/textproto, crypto/tls, html/template), reachable from the desktop window through its toolkit. The command line tool links none of them. go.mod, GO_VERSION in the three workflows, README and CONTRIBUTING move to 1.27.2, govulncheck to v1.9.0 and staticcheck to v0.8.2. Generated bytes do not move - the golden values and the standard library outputs are unchanged. A ### Security entry in the changelog.

eml, the second set of settings.

  • inline, inline_format, inline_size - pictures the text shows. Beside an HTML each has a Content-ID and the HTML shows it through cid: inside multipart/related. Beside a plain text they follow it. Readers count them differently: mailparser lists every picture among the attachments, Python's email package lists them when the HTML is alone, MimeKit never does.
  • attachment_format=eml attaches a message as it is (message/rfc822, the way mail is forwarded), and message_depth puts up to 2000 messages inside each other. Python 3.14 runs out of recursion at around 490, MimeKit stops taking them apart past 513 without a word.
  • recipients - up to 100 000 addresses in To, each on a line of its own, past the 1 MiB of header mailparser refuses.
  • charset - iso-8859-2 or windows-1250, which write ą, ś and ź as different bytes.
  • text_encoding=base64 - the whole text in base64. filename_style=none - no name at all.
  • The manifest records inline_bytes and inline_encoded_bytes.

Around it

  • archive.Door gains Nests: a container may hold a file of its own format. Archives still refuse it, a message does not.
  • strict.py check_eml walks nested parts, multipart/related, message/rfc822, base64 text and the two character sets.
  • Registry and engine sentences in English and Polish, the format table in README and the site in 22 languages.

Checked by

  • Four readers measured on generated files: Python's email package, mailparser, MimeKit and Go's standard library.
  • New guards for the parts and the text (emlparts_test.go, emltext_test.go), eight new golden values, the parity guard.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features
    • EML generation now supports inline images, forwarded messages, up to 100,000 recipients, additional character sets, Base64-encoded text, and attachments without filenames.
  • Security
    • Updated the minimum Go version to 1.27.2 to address vulnerabilities affecting the desktop app.
  • Documentation
    • Updated EML options and build requirements in the documentation.

…sages, recipients, base64 text and two more character sets

Go 1.27.2 fixes ten vulnerabilities govulncheck reported on 2026-10-12 in
net/http, net/textproto, crypto/tls and html/template, all reachable from
the desktop window through its toolkit. The command line tool links none of
them. Generated bytes are unchanged under 1.27.2. CI moves to govulncheck
v1.9.0 and staticcheck v0.8.2.

eml gains inline, inline_format and inline_size (pictures the text shows,
through cid: beside an HTML and after a plain text), attachment_format=eml
with message_depth up to 2000 (messages inside each other, the way mail is
forwarded), recipients up to 100 000 addresses in To, charset iso-8859-2 and
windows-1250, text_encoding=base64 and filename_style=none. The manifest
records inline_bytes and inline_encoded_bytes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration
  • Configuration used: Repository UI (base), Organization UI (inherited)
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 3d2559f9-05e3-4e0a-910b-cbb9373ad4ae

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: Repository UI (base), Organization UI (inherited)
  • Review profile: ASSERTIVE
  • Plan: Advanced
  • Run ID: 4ce96c63-0df3-41c0-92ab-6e5a7e2f51a5
📥 Commits

Reviewing files that changed from the base of the PR and between 36d6b39 and a0d1666.

⛔ Files ignored due to path filters: 22
  • web/public/ar/formats/index.html is excluded by !**/web/public/**
  • web/public/cs/formaty/index.html is excluded by !**/web/public/**
  • web/public/de/formate/index.html is excluded by !**/web/public/**
  • web/public/es/formatos/index.html is excluded by !**/web/public/**
  • web/public/formats/index.html is excluded by !**/web/public/**
  • web/public/fr/formats/index.html is excluded by !**/web/public/**
  • web/public/hi/formats/index.html is excluded by !**/web/public/**
  • web/public/id/format/index.html is excluded by !**/web/public/**
  • web/public/it/formati/index.html is excluded by !**/web/public/**
  • web/public/ja/formats/index.html is excluded by !**/web/public/**
  • web/public/ko/formats/index.html is excluded by !**/web/public/**
  • web/public/nl/formaten/index.html is excluded by !**/web/public/**
  • web/public/pl/formaty/index.html is excluded by !**/web/public/**
  • web/public/pt-br/formatos/index.html is excluded by !**/web/public/**
  • web/public/ro/formate/index.html is excluded by !**/web/public/**
  • web/public/ru/formats/index.html is excluded by !**/web/public/**
  • web/public/th/formats/index.html is excluded by !**/web/public/**
  • web/public/tr/bicimler/index.html is excluded by !**/web/public/**
  • web/public/uk/formats/index.html is excluded by !**/web/public/**
  • web/public/vi/dinh-dang/index.html is excluded by !**/web/public/**
  • web/public/zh-hans/formats/index.html is excluded by !**/web/public/**
  • web/public/zh-hant/formats/index.html is excluded by !**/web/public/**
📒 Files selected for processing: 50
  • .github/workflows/ci.yml
  • .github/workflows/dev-build.yml
  • .github/workflows/release.yml
  • CHANGELOG.md
  • CONTRIBUTING.md
  • README.md
  • go.mod
  • internal/format/archive/archive.go
  • internal/format/eml/attach.go
  • internal/format/eml/eml.go
  • internal/format/eml/header.go
  • internal/format/eml/inline.go
  • internal/format/eml/message.go
  • internal/format/eml/settings.go
  • internal/format/eml/text.go
  • internal/guard/eml_test.go
  • internal/guard/emlgo_test.go
  • internal/guard/emlparts_test.go
  • internal/guard/emltext_test.go
  • internal/guard/generatorbytes_test.go
  • internal/guard/parity_test.go
  • internal/guard/testdata/generator-golden.json
  • internal/gui/text/locale/registry/en.json
  • internal/gui/text/locale/registry/pl.json
  • internal/gui/text/locale/said/en.json
  • internal/gui/text/locale/said/pl.json
  • internal/oracle/mailscripts.go
  • internal/oracle/strict.py
  • web/content/ar/site.json
  • web/content/cs/site.json
  • web/content/de/site.json
  • web/content/en/site.json
  • web/content/es/site.json
  • web/content/fr/site.json
  • web/content/hi/site.json
  • web/content/id/site.json
  • web/content/it/site.json
  • web/content/ja/site.json
  • web/content/ko/site.json
  • web/content/nl/site.json
  • web/content/pl/site.json
  • web/content/pt-BR/site.json
  • web/content/ro/site.json
  • web/content/ru/site.json
  • web/content/th/site.json
  • web/content/tr/site.json
  • web/content/uk/site.json
  • web/content/vi/site.json
  • web/content/zh-Hans/site.json
  • web/content/zh-Hant/site.json

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

📜 Recent review details
⏰ Context from checks skipped due to timeout: 18
  • GitHub Check: linters
  • GitHub Check: test on macos-latest
  • GitHub Check: test on windows-latest
  • GitHub Check: coverage gate
  • GitHub Check: bill of materials
  • GitHub Check: reference tools actually installed
  • GitHub Check: the Chocolatey packages install and leave
  • GitHub Check: test on ubuntu-latest
  • GitHub Check: known vulnerabilities
  • GitHub Check: what this push touched
  • GitHub Check: staticcheck
  • GitHub Check: the installer installs and leaves
  • GitHub Check: semgrep
  • GitHub Check: import table of the window binary
  • GitHub Check: review new dependencies
  • GitHub Check: Analyze (python)
  • GitHub Check: Analyze (actions)
  • GitHub Check: Analyze (go)
🧰 Additional context used
📓 Path-based instructions: 16
For every added or upgraded dependency: confirm the package really exists and the name is spelled correctly (typosquatting), it is actively maintained, the license is compatible with this project's license, and it is actually needed (not re...

⚙️ CodeRabbit configuration file

Files:

  • go.mod
Applies to text shown to the user (labels, buttons, tooltips, placeholders, dialogs, errors, status messages, empty states, translations).

⚙️ CodeRabbit configuration file

Files:

  • internal/gui/text/locale/said/pl.json
  • internal/guard/generatorbytes_test.go
  • internal/gui/text/locale/said/en.json
  • internal/guard/eml_test.go
  • internal/format/archive/archive.go
  • internal/format/eml/header.go
  • internal/guard/parity_test.go
  • internal/oracle/mailscripts.go
  • internal/guard/emltext_test.go
  • internal/format/eml/text.go
  • internal/format/eml/eml.go
  • internal/gui/text/locale/registry/pl.json
  • internal/format/eml/inline.go
  • internal/gui/text/locale/registry/en.json
  • internal/guard/emlgo_test.go
  • internal/guard/emlparts_test.go
  • internal/format/eml/message.go
  • internal/format/eml/settings.go
  • internal/format/eml/attach.go
  • internal/oracle/strict.py
Verify tests check real behavior and would fail if the implementation were broken.

⚙️ CodeRabbit configuration file

Files:

  • internal/guard/generatorbytes_test.go
  • internal/guard/eml_test.go
  • internal/guard/parity_test.go
  • internal/guard/emltext_test.go
  • internal/guard/emlgo_test.go
  • internal/guard/emlparts_test.go
These are end-user desktop applications.

⚙️ CodeRabbit configuration file

Files:

  • internal/guard/generatorbytes_test.go
  • internal/guard/eml_test.go
  • internal/format/archive/archive.go
  • internal/format/eml/header.go
  • internal/guard/parity_test.go
  • internal/oracle/mailscripts.go
  • internal/guard/emltext_test.go
  • internal/format/eml/text.go
  • internal/format/eml/eml.go
  • internal/format/eml/inline.go
  • internal/guard/emlgo_test.go
  • internal/guard/emlparts_test.go
  • internal/format/eml/message.go
  • internal/format/eml/settings.go
  • internal/format/eml/attach.go
  • internal/oracle/strict.py
Performance is a known weak spot of these projects.

⚙️ CodeRabbit configuration file

Files:

  • internal/guard/generatorbytes_test.go
  • internal/guard/eml_test.go
  • internal/format/archive/archive.go
  • internal/format/eml/header.go
  • internal/guard/parity_test.go
  • internal/oracle/mailscripts.go
  • internal/guard/emltext_test.go
  • internal/format/eml/text.go
  • internal/format/eml/eml.go
  • internal/format/eml/inline.go
  • internal/guard/emlgo_test.go
  • internal/guard/emlparts_test.go
  • internal/format/eml/message.go
  • internal/format/eml/settings.go
  • internal/format/eml/attach.go
  • internal/oracle/strict.py
Applies only to code that builds or styles a GUI.

⚙️ CodeRabbit configuration file

Files:

  • internal/guard/generatorbytes_test.go
  • internal/guard/eml_test.go
  • internal/format/archive/archive.go
  • internal/format/eml/header.go
  • internal/guard/parity_test.go
  • internal/oracle/mailscripts.go
  • internal/guard/emltext_test.go
  • internal/format/eml/text.go
  • internal/format/eml/eml.go
  • internal/format/eml/inline.go
  • internal/guard/emlgo_test.go
  • internal/guard/emlparts_test.go
  • internal/format/eml/message.go
  • internal/format/eml/settings.go
  • internal/format/eml/attach.go
  • internal/oracle/strict.py
Check GitHub Actions security: third-party actions pinned to a full commit SHA, minimal `permissions:` block, no `pull_request_target` with checkout of PR code, no untrusted input (`github.event.*.title/body`, branch names) interpolated dir...

⚙️ CodeRabbit configuration file

Files:

  • .github/workflows/dev-build.yml
  • .github/workflows/release.yml
  • .github/workflows/ci.yml
User-facing changelog.

⚙️ CodeRabbit configuration file

Files:

  • CHANGELOG.md
Domain: test file generator (Go; `tfg` CLI and `tfg-gui` Fyne window over one engine).

⚙️ CodeRabbit configuration file

Files:

  • internal/gui/text/locale/said/pl.json
  • internal/guard/generatorbytes_test.go
  • internal/gui/text/locale/said/en.json
  • internal/guard/testdata/generator-golden.json
  • internal/guard/eml_test.go
  • internal/format/archive/archive.go
  • internal/format/eml/header.go
  • internal/guard/parity_test.go
  • internal/oracle/mailscripts.go
  • internal/guard/emltext_test.go
  • internal/format/eml/text.go
  • internal/format/eml/eml.go
  • internal/gui/text/locale/registry/pl.json
  • internal/format/eml/inline.go
  • internal/gui/text/locale/registry/en.json
  • internal/guard/emlgo_test.go
  • internal/guard/emlparts_test.go
  • internal/format/eml/message.go
  • internal/format/eml/settings.go
  • internal/format/eml/attach.go
  • internal/oracle/strict.py
SECURITY, HIGH PRIORITY.

⚙️ CodeRabbit configuration file

Files:

  • internal/guard/generatorbytes_test.go
  • internal/guard/eml_test.go
  • internal/format/archive/archive.go
  • internal/format/eml/header.go
  • internal/guard/parity_test.go
  • internal/oracle/mailscripts.go
  • internal/guard/emltext_test.go
  • internal/format/eml/text.go
  • internal/format/eml/eml.go
  • internal/format/eml/inline.go
  • internal/guard/emlgo_test.go
  • internal/guard/emlparts_test.go
  • internal/format/eml/message.go
  • internal/format/eml/settings.go
  • internal/format/eml/attach.go
  • internal/oracle/strict.py
These apps are QA/developer tools.

⚙️ CodeRabbit configuration file

Files:

  • internal/guard/generatorbytes_test.go
  • internal/guard/eml_test.go
  • internal/format/archive/archive.go
  • internal/format/eml/header.go
  • internal/guard/parity_test.go
  • internal/oracle/mailscripts.go
  • internal/guard/emltext_test.go
  • internal/format/eml/text.go
  • internal/format/eml/eml.go
  • internal/format/eml/inline.go
  • internal/guard/emlgo_test.go
  • internal/guard/emlparts_test.go
  • internal/format/eml/message.go
  • internal/format/eml/settings.go
  • internal/format/eml/attach.go
  • internal/oracle/strict.py
Source of the public project website (generated output is excluded from review).

⚙️ CodeRabbit configuration file

Files:

  • web/content/cs/site.json
  • web/content/ko/site.json
  • web/content/fr/site.json
  • web/content/nl/site.json
  • web/content/ru/site.json
  • web/content/de/site.json
  • web/content/it/site.json
  • web/content/pl/site.json
  • web/content/th/site.json
  • web/content/id/site.json
  • web/content/tr/site.json
  • web/content/es/site.json
  • web/content/ro/site.json
  • web/content/en/site.json
  • web/content/hi/site.json
  • web/content/ja/site.json
  • web/content/zh-Hans/site.json
  • web/content/uk/site.json
  • web/content/ar/site.json
  • web/content/zh-Hant/site.json
  • web/content/vi/site.json
  • web/content/pt-BR/site.json
Go code.

⚙️ CodeRabbit configuration file

Files:

  • internal/guard/generatorbytes_test.go
  • internal/guard/eml_test.go
  • internal/format/archive/archive.go
  • internal/format/eml/header.go
  • internal/guard/parity_test.go
  • internal/oracle/mailscripts.go
  • internal/guard/emltext_test.go
  • internal/format/eml/text.go
  • internal/format/eml/eml.go
  • internal/format/eml/inline.go
  • internal/guard/emlgo_test.go
  • internal/guard/emlparts_test.go
  • internal/format/eml/message.go
  • internal/format/eml/settings.go
  • internal/format/eml/attach.go
Check that documentation matches the actual code in this PR: commands, flags, config keys, file paths, build steps and examples must exist.

⚙️ CodeRabbit configuration file

Files:

  • README.md
  • CONTRIBUTING.md
  • CHANGELOG.md
Python code.

⚙️ CodeRabbit configuration file

Files:

  • internal/oracle/strict.py
All code in this repository is written by an AI coding agent (Claude Code).

⚙️ CodeRabbit configuration file

Files:

  • web/content/cs/site.json
  • web/content/ko/site.json
  • web/content/fr/site.json
  • web/content/nl/site.json
  • web/content/ru/site.json
  • web/content/de/site.json
  • web/content/it/site.json
  • web/content/pl/site.json
  • web/content/th/site.json
  • web/content/id/site.json
  • README.md
  • internal/gui/text/locale/said/pl.json
  • web/content/tr/site.json
  • web/content/es/site.json
  • web/content/ro/site.json
  • internal/guard/generatorbytes_test.go
  • web/content/en/site.json
  • CONTRIBUTING.md
  • web/content/hi/site.json
  • web/content/ja/site.json
  • web/content/zh-Hans/site.json
  • web/content/uk/site.json
  • internal/gui/text/locale/said/en.json
  • web/content/ar/site.json
  • web/content/zh-Hant/site.json
  • web/content/vi/site.json
  • internal/guard/testdata/generator-golden.json
  • internal/guard/eml_test.go
  • go.mod
  • internal/format/archive/archive.go
  • web/content/pt-BR/site.json
  • internal/format/eml/header.go
  • internal/guard/parity_test.go
  • CHANGELOG.md
  • internal/oracle/mailscripts.go
  • internal/guard/emltext_test.go
  • internal/format/eml/text.go
  • internal/format/eml/eml.go
  • internal/gui/text/locale/registry/pl.json
  • internal/format/eml/inline.go
  • internal/gui/text/locale/registry/en.json
  • internal/guard/emlgo_test.go
  • internal/guard/emlparts_test.go
  • internal/format/eml/message.go
  • internal/format/eml/settings.go
  • internal/format/eml/attach.go
  • internal/oracle/strict.py
🧠 Learnings: 1
📓 Common learnings
Learnt from: CR
Repo: donislawdev/TestingFilesGenerator

Timestamp: 2026-10-13T22:07:42.151Z
Learning: Source excerpt:
# Contributing

## What a change has to satisfy

- **Every change in behaviour comes with a test that fails without it.** A green
  suite is not evidence on its own. The question to answer in the pull request
  is "which test would go red if this change were undone".
Learnt from: CR
Repo: donislawdev/TestingFilesGenerator

Timestamp: 2026-10-13T22:07:42.151Z
Learning: Source excerpt:
# Contributing

## What a change has to satisfy

- **A file is the size that was asked for, to the byte, or it is an error.**
  Never a size close to it, never a quiet rounding. A batch of ten thousand
  files is not something anybody checks by hand.
Learnt from: CR
Repo: donislawdev/TestingFilesGenerator

Timestamp: 2026-10-13T22:07:42.151Z
Learning: Source excerpt:
# Contributing

## What a change has to satisfy

- **The same recipe and the same seed produce the same bytes**, on every
  operating system. Anything that moves the bytes of a generated file is a
  breaking change, because it turns other people's test suites red. It is
  allowed, and it needs a note in the changelog and a version bump, and the
  version is bumped by the maintainer rather than in the pull request.
🪛 ast-grep (0.45.3)
internal/oracle/strict.py

[warning] 2557-2557: Regex pattern passed to re is built from a non-literal (variable, call, concatenation, or f-string) value. If that value is attacker-controlled it can introduce a malicious pattern with catastrophic backtracking (ReDoS). Use a hardcoded literal pattern, or validate/escape untrusted input with re.escape() and bound the regex complexity before compiling.
Context: re.compile(r"^(?:" + EML_WIDE_PREFIX + r")?[a-z0-9]+_\d{4,5}.[a-z0-9.]+$")
Note: [CWE-1333] Inefficient Regular Expression Complexity.

(redos-non-literal-regex-python)

[warning] 2666-2666: XPath query is request-/variable-derived; use parameterized XPath to prevent injection.
Context: EML_IMG.findall(texts[-1]["text"])
Note: [CWE-643] Improper Neutralization of Data within XPath Expressions ('XPath Injection').

(xpath-injection-python)

[warning] 2733-2733: Regex pattern passed to re is built from a non-literal (variable, call, concatenation, or f-string) value. If that value is attacker-controlled it can introduce a malicious pattern with catastrophic backtracking (ReDoS). Use a hardcoded literal pattern, or validate/escape untrusted input with re.escape() and bound the regex complexity before compiling.
Context: re.fullmatch(r"<[0-9a-f]{" + digits + r"}@example.com>", values["Message-ID"])
Note: [CWE-1333] Inefficient Regular Expression Complexity.

(redos-non-literal-regex-python)

🪛 LanguageTool
CONTRIBUTING.md

[grammar] ~25-~25: Use a hyphen to join words.
Context: ... newer, and nothing else for the command line tool.

(QB_NEW_EN_HYPHEN)

CHANGELOG.md

[style] ~113-~113: You have already used this expression in nearby sentences. Consider replacing it to add variety to your writing.
Context: ...d the HTML shows it through cid:, and beside a plain text they follow it as pictur...

(REP_BESIDES)

[grammar] ~295-~295: Use a hyphen to join words.
Context: ...d reach through its toolkit. The command line tool does not use the network and...

(QB_NEW_EN_HYPHEN)

🔇 Additional comments: 45
internal/format/archive/archive.go: 1

271-283: LGTM!

Also applies to: 307-307, 331-331, 342-349, 364-364

internal/format/eml/settings.go: 1

15-24: LGTM!

Also applies to: 39-49, 82-136, 151-178, 195-206

internal/format/eml/inline.go: 1

1-182: LGTM!

internal/format/eml/attach.go: 1

31-174: LGTM!

Also applies to: 292-359

internal/format/eml/eml.go: 1

155-191: LGTM!

Also applies to: 197-259

internal/format/eml/header.go: 1

58-158: LGTM!

internal/format/eml/message.go: 1

17-193: LGTM!

internal/format/eml/text.go: 1

26-68: LGTM!

Also applies to: 199-238

internal/guard/eml_test.go: 1

22-58: LGTM!

Also applies to: 91-94, 185-187

internal/guard/emlgo_test.go: 1

40-56: LGTM!

Also applies to: 66-108, 144-162, 197-234

internal/guard/emlparts_test.go: 1

1-192: LGTM!

internal/guard/emltext_test.go: 1

1-89: LGTM!

internal/guard/generatorbytes_test.go: 1

461-486: LGTM!

internal/guard/parity_test.go: 1

169-177: LGTM!

internal/guard/testdata/generator-golden.json: 1

464-503: LGTM!

internal/oracle/mailscripts.go: 1

55-73: LGTM!

Also applies to: 112-123

internal/oracle/strict.py: 1

2553-2563: LGTM!

Also applies to: 2574-2669, 2730-2756, 2769-2857, 2874-2942

web/content/ar/site.json: 1

273-273: LGTM!

CHANGELOG.md: 1

110-125: LGTM!

Also applies to: 291-298

README.md: 1

92-92: LGTM!

Also applies to: 622-622

internal/gui/text/locale/registry/en.json: 1

182-196: LGTM!

Also applies to: 522-526, 1032-1036, 1139-1205, 1927-1931, 2082-2086, 2262-2276, 2312-2316, 2382-2386, 2577-2581

internal/gui/text/locale/registry/pl.json: 1

38-40: LGTM!

Also applies to: 106-106, 208-208, 229-242, 387-387, 418-418, 454-464, 478-478, 517-517

internal/gui/text/locale/said/en.json: 1

526-527: LGTM!

Also applies to: 539-543, 559-563

internal/gui/text/locale/said/pl.json: 1

106-106: LGTM!

Also applies to: 109-109, 113-113

web/content/cs/site.json: 1

272-272: LGTM!

web/content/de/site.json: 1

272-272: LGTM!

web/content/en/site.json: 1

269-269: LGTM!

web/content/es/site.json: 1

272-272: LGTM!

web/content/fr/site.json: 1

272-272: LGTM!

web/content/hi/site.json: 1

272-272: LGTM!

web/content/id/site.json: 1

272-272: LGTM!

web/content/it/site.json: 1

272-272: LGTM!

web/content/ja/site.json: 1

272-272: LGTM!

web/content/ko/site.json: 1

272-272: LGTM!

web/content/nl/site.json: 1

272-272: LGTM!

web/content/pl/site.json: 1

269-269: LGTM!

web/content/pt-BR/site.json: 1

272-272: LGTM!

web/content/ro/site.json: 1

272-272: LGTM!

web/content/ru/site.json: 1

272-272: LGTM!

web/content/th/site.json: 1

272-272: LGTM!

web/content/tr/site.json: 1

272-272: LGTM!

web/content/uk/site.json: 1

272-272: LGTM!

web/content/vi/site.json: 1

272-272: LGTM!

web/content/zh-Hans/site.json: 1

272-272: LGTM!

web/content/zh-Hant/site.json: 1

272-272: LGTM!

📝 Walkthrough

The PR expands EML generation with inline pictures, nested messages, multiple recipients, additional charsets, base64 text, and unnamed files. It also updates the Go toolchain, CI tools, validation, documentation, and translations.

Changes: EML message generation and validation

Layer / File(s) Summary
Settings and nesting contracts
internal/format/archive/archive.go, internal/format/eml/settings.go, internal/format/eml/inline.go
EML settings add charset, recipient count, message depth, base64 encoding, unnamed-file style, and inline-picture options. Archive containers can allow nested content.
Child, picture, and message planning
internal/format/eml/attach.go, internal/format/eml/eml.go, internal/format/eml/inline.go
Planning handles raw nested messages and inline pictures, applies size and depth settings, and reports attachment and picture properties.
MIME composition and text output
internal/format/eml/header.go, internal/format/eml/inline.go, internal/format/eml/message.go, internal/format/eml/text.go
Message output composes related, alternative, and mixed MIME parts. Headers support multiple folded recipients. Text output supports configured charsets and base64.
Validation and test coverage
internal/guard/*, internal/oracle/mailscripts.go, internal/oracle/strict.py
Tests and oracle scripts check MIME parts, recipients, charsets, filenames, pictures, nested messages, and generated byte counts.
Settings documentation and translations
CHANGELOG.md, README.md, internal/gui/text/locale/*, web/content/*/site.json
Documentation and translations describe the added EML options and picture-format input.

Go toolchain security update

Layer / File(s) Summary
Go version and CI tool updates
.github/workflows/ci.yml, .github/workflows/dev-build.yml, .github/workflows/release.yml, go.mod, CHANGELOG.md, CONTRIBUTING.md, README.md
Build workflows and the module move to Go 1.27.2. CI updates govulncheck and staticcheck. Changelog and build instructions record the version change.

Priority: ⬆️ High

Estimated code review effort: 4 (Complex) | ~60 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant EMLSettings
  participant EMLPlan
  participant ChildPlanner
  participant MessageWriter
  EMLSettings->>EMLPlan: parsed message, charset, recipient, and picture settings
  EMLPlan->>ChildPlanner: plan attachments, nested messages, and pictures
  ChildPlanner-->>EMLPlan: planned child parts and byte totals
  EMLPlan->>MessageWriter: message layout and planned parts
  MessageWriter-->>EMLPlan: generated MIME message
Loading

Suggested labels: enhancement, security, dependencies, packaging, ui

Merge Risk: ⚪ Minimal · up to a0d16

No actionable merge-blocking issue is established; the change is ready for normal checks.

Pre-merge checks: Passed 13 · Failed 1

Failed Failed checks: 1 warning

Check name Status Explanation Resolution
Desktop Robustness Warning The new message_depth feature creates an uncancellable long planning operation. planner.forward recursively calls desc.Generator.Plan for each depth level (up to 2,000), and generator.Plan rep… Add a context-aware planning path and use it for EML recursion. Thread the run context through PlanContext, generator.Plan, planChildren, forward, and all sizing loops; check ctx.Err() between depth levels and repeated size calcul…
Passed Passed checks: 13 passed
Check name Status Explanation
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title clearly describes the main changes: the Go 1.27.2 update and the new EML features. It is specific enough for release notes and is within the approximately 140-character limit.
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Tests For Changed Behavior Passed The changed EML runtime behavior has new or updated coverage: base64 sizing and Message-ID handling, charsets, inline pictures and Content-IDs, recipients, raw nested messages and message depth, MIME …
No Secrets Or Debug Leftovers Passed The PR diff adds no CLAUDE.md, CLAUDE.local.md, AGENTS.md, .claude, or .env files. No added lines contain credentials, private URLs, local absolute paths, internal hosts/IPs, or debug output calls. Th…
No Hardcoded Ui Styling Passed The PR does not add or change GUI code. Its only internal/gui changes are four JSON locale files containing labels and messages. No XAML, Slint, Fyne, Tkinter, WPF code-behind, or UI styling literal…
No Obvious Performance Problems Passed No clear performance problem was introduced. Recipient, picture, and MIME-part processing uses linear loops. Base64 sizing uses a logarithmic search. The changed GUI files contain locale data only, an…
Safe File Parsing Passed No unsafe file-parsing behavior is introduced. The changed JSON files are static locale and manifest data; all 27 changed JSON files parse with Python json.loads. The diff adds no unsafe YAML/XML/CSV/…
System Changes Are Reversible Passed The PR does not add or change code for network filters, proxies, firewalls, system time, process hooking/injection, Windows services, registry, or drivers. The changed production code generates and pa…
Clear User-Facing Text Passed PASS — The PR adds user-facing EML labels, details, documentation, and validation text. Each new setting has a label and detail entry. Numeric settings expose ranges or size syntax through the shared …
No Resource Leaks Passed No resource leak is introduced. The changed production code uses local plans, slices, builders, and streaming writers only. Inline pictures retain generation metadata, not image bytes, and their count…
Scope, Duplication And Docs Passed The PR scope matches the title and description. The Go 1.27.2, govulncheck, and staticcheck updates are described, and the EML features, archive nesting flag, oracle changes, tests, translations, and …
Full details: Desktop Robustness

Explanation

The new message_depth feature creates an uncancellable long planning operation. planner.forward recursively calls desc.Generator.Plan for each depth level (up to 2,000), and generator.Plan repeatedly sizes and serializes the nested message. engine.PlanContext checks cancellation only after the outer generator plan returns, so the GUI Cancel and window-close paths cannot stop this work and no progress is reported during it. The GUI does prevent a second run, but that does not resolve the planning hang.

Resolution

Add a context-aware planning path and use it for EML recursion. Thread the run context through PlanContext, generator.Plan, planChildren, forward, and all sizing loops; check ctx.Err() between depth levels and repeated size calculations. Report planning progress, or impose a bounded planning cost before starting. Keep the existing GUI busy-state and double-run guard, and add a cancellation test for a deep message_depth request.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot added dependencies Pull requests that update a dependency file enhancement New feature or request packaging security ui labels Oct 13, 2026
donislawdev and others added 2 commits October 14, 2026 00:20
…ize; the changelog in ASCII

The window spelled the three labels out of their recipe keys, and inline is a word from MIME a person meeting the window does not know. The key is still shown on hover, and a guard asks every label written by hand to still belong to a declared setting.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…reads it

screens.go had grown past the file ceiling. The hand-written labels reach a translator through the registry catalogue, so the guard that asks every sentence of the text package to go through the catalogue names them, and it now reads the new file - it reads a list of files, and a file left off the list is a file it never sees.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@donislawdev
donislawdev merged commit 557d2f1 into main Oct 13, 2026
25 checks passed
@donislawdev
donislawdev deleted the build/go-1.27.2 branch October 13, 2026 23:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file enhancement New feature or request packaging security ui

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant