Skip to content

[pull] master from mattermost:master - #953

Merged
pull[bot] merged 8 commits into
code:masterfrom
mattermost:master
Sep 1, 2026
Merged

[pull] master from mattermost:master#953
pull[bot] merged 8 commits into
code:masterfrom
mattermost:master

Conversation

@pull

@pull pull Bot commented Sep 1, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

esarafianou and others added 8 commits September 1, 2026 11:38
…mages, and TOC duplicates (#38180)

* [Docs Revamp Feedback] Fix admonition styling, card grid, oversized images, and TOC duplicates

Restyle callouts to match the compact admonition treatment used in the
deployment docs (Archivo Black at 12px with wide tracking was hard to
read), cap CardGrid to a responsive 2x2 layout instead of squeezing four
cards into one row on narrower screens, cap authored content images to a
reading-friendly max size so diagrams like the Calls deployment
architecture no longer render at full source resolution, and de-duplicate
Administration/End User Guide sidebar entries by folding each root hub
page into its matching category's landing link. Also reorders the
Administration Guide's top-level sections into task order (Configure,
Comply, Onboard, Manage, Upgrade, Scale).

Co-authored-by: Cursor <cursoragent@cursor.com>

* Trim overly verbose comments from docs site UX fixes

Cuts the explanatory comments added in the previous commit down to the
essential rationale, dropping restated context already covered by
variable/function names.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Drop unhelpful Sphinx reference from a new comment

Co-authored-by: Cursor <cursoragent@cursor.com>

* Match hub-page target categories by label instead of directory

Configure/Comply/Onboard/Manage/Upgrade/Scale and the End User Guide
sub-categories have no index file, so their label is always the plain
humanized directory name — matching on that label directly is simpler
than deriving a directory name from a doc id, and it's the same text
already visible in the sidebar.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Exclude images with an explicit height from the content-image size cap

Co-authored-by: Cursor <cursoragent@cursor.com>

* Replace hub-page sidebar-folding logic with physical index-page moves

Root-level hub pages (Compliance with Mattermost, Upgrade Mattermost,
Cloud Workspace Management, Messaging Collaboration, Customize your
preferences, Project and Task Management, Workflow Automation) were
siblings of the directories they duplicated, so the generator needed
custom code to fold them into their category's landing page. Move each
into its target directory as a *-index.mdx (matching the convention
already used by security-guide-index.mdx etc.), so the existing
findIndexFile auto-detection handles it — no custom folding logic
needed. Cloud Workspace Management uses the ADMIN_MANAGE_GROUPS
`landing` field for the same reason, since it's a virtual sub-group
with no matching filesystem directory.

sidebar_label frontmatter (now read for category labels too, not just
doc labels) keeps the short sidebar names (Comply, Upgrade, ...)
independent of each landing page's own on-page title.

Updates internal links, PDF book manifests, and adds redirects for the
moved page URLs.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Trim remaining comments referencing prior implementation state

Comments should describe the current code, not the diff from what it
replaced.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix typos and a broken Sphinx-era mobile-playbooks link

"Learm" -> "Learn" in the mobile compliance policies link text,
"repetative" -> "repetitive" in the AI Agents description, and replace
the interact-with-playbooks "Playbooks on the go" link (a dead
sphinx-tabs anchor URL) with the current mobile section on the
work-with-runs page.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Point the SRE persona page at Deployment Architecture, not the orphaned Reference Architecture stub

Reference Architecture's index page was intentionally dropped from the
sidebar during an earlier restructuring, so this card sent readers to
a page with no navigation. Deployment Architecture is the interactive
builder that now covers the same "size your deployment" job and is a
real sidebar entry.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Order End User Guide sidebar categories explicitly

Access, Collaborate, Workflow Automation, Project Management, AI
Agents, Preferences — same manual-order pattern already used for the
Administration Guide root categories, instead of filesystem/alphabetical
order.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix broken tables left over from RST-to-MDX migration

Several settings, keyboard-shortcut, and reference tables across the
docs still had unconverted RST grid-table markup, mm-kbd:/mm-subst:
substitution artifacts, or literal pipe-delimited cell text instead of
proper HTML table structure. Rebuilt each as clean thead/tbody markup
with <kbd> elements and useBaseUrl-based icons where needed.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix invisible inline UI icons in dark mode

className="theme-icon", used throughout the docs to inline small UI
glyphs (product-switcher waffle icon, formatting icons, etc.) next to
text, had no CSS anywhere in the site. Icons rendered unsized and, since
most are flat black glyphs baked into an <img> (which can't inherit
currentColor the way inline SVG can), were nearly invisible against a
dark background in dark mode. Size/align them consistently and invert
the flat black ones in dark mode, excluding icons that carry their own
brand color (checkmark, ack button, presence/status PNGs).

Co-authored-by: Cursor <cursoragent@cursor.com>

* docs: restore the Attention callout lost in the RST-to-MDX migration

Sphinx had both `attention` and `important` admonitions; the migration
flattened them into <Important>, so breaking changes and critical fixes
in the changelogs render with the same marigold styling as ordinary
asides. Reintroduce Attention as its own kind, ranked above Important,
and convert the changelog blocks that were Attention in the RST source.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Give integrations more room for descriptive dialog titles; the
previous 24-character limit was not tied to any DB column or
documented API constraint.

Co-authored-by: Mattermost Build <build@mattermost.com>
* Add plugin upload overwrite review

Co-authored-by: Ben Schumacher <hanzei@users.noreply.github.com>

* Simplify plugin upload conflict metadata

Co-authored-by: Ben Schumacher <hanzei@users.noreply.github.com>

* Fix plugin overwrite review style order

Co-authored-by: Ben Schumacher <hanzei@users.noreply.github.com>

* Update plugin upgrade e2e overwrite flow

Co-authored-by: Ben Schumacher <hanzei@users.noreply.github.com>

* Simplify plugin overwrite review details

Co-authored-by: Ben Schumacher <hanzei@users.noreply.github.com>

* Move plugin overwrite review back to modal

Co-authored-by: Ben Schumacher <hanzei@users.noreply.github.com>

* Clarify plugin upgrade overwrite copy

Co-authored-by: Ben Schumacher <hanzei@users.noreply.github.com>

* [MM-70279] Drop hedged "appears to" wording from plugin upload overwrite copy

The upgrade/downgrade version_direction is a deterministic strict-semver
comparison, so state it directly instead of hedging with "appears to".
The unknown case (parsing failed) keeps its hedged copy.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* [MM-70279] Remove "Overwriting will reinstall it." from plugin upload copy

Full uninstall/reinstall is an implementation detail of how overwrite
works, not something admins need to be told to make a decision.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* [MM-70279] Update e2e test for revised plugin upload overwrite copy

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* Apply suggestions from code review

Co-authored-by: Matthew Birtch <mattbirtch@gmail.com>

* Deliver plugin install conflict details to the client in production

The "Review plugin overwrite" dialog reads the conflict payload from
AppError.detailed_error, but handleContextError wipes that field whenever
ServiceSettings.EnableDeveloper is false. That is the default and the case
on virtually every real server, so the direction-aware dialog never had
data to render and always fell through to its "unknown" branch.

Add AppError.ExposeDetailedError, a json:"-" behaviour flag in the mould of
SkipTranslation, and honour it in WipeDetailed. Opting in exposes only the
caller-authored DetailedError; the wrapped error is still discarded, so an
internal database or filesystem error can never ride along. Hardened mode
clears the opt-in before sanitizing, keeping its "no details on a 5xx"
contract intact for any future caller.

Shrink PluginInstallConflict to the metadata the dialog actually renders.
It previously carried two whole manifests, which also describe settings
schemas and server executable paths -- not something to hand the browser
on a failed upload.

Add tests that pin the behaviour with EnableDeveloper disabled, which is
what the original change lacked.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

* Address review nits on plugin overwrite dialog

Move pluginInstallConflictVersionDirection into the model package since it
only operates on model.Manifest and existing model constants. Extract the
overwrite review modal into its own component. Drop the redundant
overwrite_review.cancel translation string, letting ConfirmModal fall back
to its existing default as it did before this feature.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* Fix mmctl e2e test for plugin install conflict error format

The install-without-force test compared against the full multierror
string, which broke once installExtractedPlugin started appending
JSON conflict details to the error message.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* Remove orphaned admin.plugin.upload i18n key

The overwrite modal was replaced by PluginUploadOverwriteReviewModal
during the master merge, leaving this key unreferenced.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* Carry plugin conflict metadata in AppError.Props instead of DetailedError

Per review feedback, replace the ExposeDetailedError escape hatch with a
general-purpose Props field on AppError, mirroring the Props fields on Users
and Posts. DetailedError keeps its original meaning (internal, wiped when
developer mode is off); Props is caller-authored, always returned to clients,
and holds only flat strings safe for any client to see. Hardened mode scrubs
Props along with the rest of a sanitized 5xx.

The plugin upload id conflict now sets its metadata as AppError.Props and the
overwrite review modal reads error.props instead of parsing detailed_error.

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

* Use renamed EnableHardenedMode config field in Props test

master renamed ServiceSettings.ExperimentalEnableHardenedMode to EnableHardenedMode
(keeping the old field deprecated). After merging master, handleContextError reads
the new field, so the test must set it too; setting the deprecated field no longer
flips the active value.

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

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: Ben Schumacher <hanzei@users.noreply.github.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Co-authored-by: Matthew Birtch <mattbirtch@gmail.com>
TestCopyEmojiImages used a hardcoded ../exported_emoji_test path that
resolves to a shared /tmp/exported_emoji_test directory for all parallel
tests in the package. Concurrent TestExportCustomEmoji cleanup could
remove that directory or leave it behind, causing mkdir/file-exists and
missing-file assertion flakes under ENABLE_FULLY_PARALLEL_TESTS.

Scope fixture paths with t.TempDir() per test and drop the unnecessary
shared-directory cleanup in TestExportCustomEmoji (exportFiles=false).

Tests-only change. Verified with `go test -run '^TestCopyEmojiImages$' -race
-count=100` locally.

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: mattermost-code <matty-code@mattermost.com>
…37917)

* [MM-70213] Allow custom URI schemes in DCR redirect URI validation

The DCR redirect URI allowlist and client registration validation only
permitted http:// and https:// schemes, which blocked desktop OAuth
clients that use custom URI schemes (e.g. cursor://). Introduce
IsValidDCRRedirectURI, which accepts any absolute URI with a scheme and
host, and use it for both allowlist pattern validation and client
registration redirect URI validation. Opaque URIs without a host (e.g.
javascript:, data:) remain rejected.

Co-authored-by: mattermost-code <matty-code@mattermost.com>

* [MM-70213] Note custom URI scheme support in DCR allowlist help text

Update the DCR Redirect URI Allowlist admin console help text to mention
that custom URI schemes used by desktop OAuth clients are supported in
addition to http and https.

Co-authored-by: mattermost-code <matty-code@mattermost.com>

* [MM-70213] Expand DCR redirect URI validation test coverage

Add coverage for control-character rejection, whitespace inputs, invalid
pattern/candidate glob paths, query wildcard matching, whitespace
allowlist entry skipping, and query-required-but-absent matching.

Co-authored-by: mattermost-code <matty-code@mattermost.com>

* [MM-70213] Reject dangerous schemes in DCR redirect URIs

Authority-form URIs like javascript://host/... parse with a scheme and
host, so the previous host check alone accepted them as OAuth redirect
targets. Reject javascript/data/vbscript/file/blob/about case-insensitively
while preserving custom desktop schemes.

Co-authored-by: mattermost-code <matty-code@mattermost.com>

* [MM-70213] Accept custom scheme callbacks for DCR-registered OAuth apps

DCR client registration maps redirect URIs to OAuthApp.CallbackUrls, but
OAuthApp.IsValid still validated every callback with IsValidHTTPURL, so a
custom-scheme redirect URI (e.g. cursor://) passed ClientRegistrationRequest
validation and the allowlist check yet failed at SaveApp. Dynamically
registered apps now validate callbacks with IsValidDCRRedirectURI; manually
created OAuth apps remain restricted to http/https.

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: mattermost-code <matty-code@mattermost.com>
…tions (#38024)

* [MM-57554][MM-57555] Graduate email batching buffer size and interval

Move EmailSettings.EmailBatchingBufferSize and EmailSettings.EmailBatchingInterval
out of System Console > Experimental > Features and into Site Configuration >
Notifications, immediately after Enable Email Batching so the batching controls
read as one group.

The config keys, defaults and server-side semantics are unchanged. The access
struct tags move from experimental_features to site_notifications so the settings
are governed by sysconsole_read/write_site_notifications, and the settings now
inherit the same gating as Enable Email Batching: disabled without email
notifications, without email batching, in High Availability mode or without a
Site URL, and hidden on Cloud where email batching itself isn't exposed.

The i18n ids move from admin.experimental.* to the Notifications page convention,
and the documentation entries move from the experimental configuration settings
page to the site configuration settings page.

* [MM-57819] Graduate use channel name in email notifications

Move EmailSettings.UseChannelInEmailNotifications out of System Console >
Experimental > Features and into Site Configuration > Notifications, next to
Email Notification Contents since both shape email notification content.

The config key, default and server-side semantics are unchanged. The access
struct tag moves from experimental_features to site_notifications so the setting
is governed by sysconsole_read/write_site_notifications, the i18n ids move to the
Notifications page convention, and the documentation entry moves from the
experimental configuration settings page to the site configuration settings page.

* [MM-57554] Correct email batching queue-full documentation

Immediate sends happen when the receiving buffer is full, not when
queue size is compared to the batching interval. Point admins at
increasing EmailBatchingBufferSize instead of decreasing the interval.

Co-authored-by: mattermost-code <matty-code@mattermost.com>

* [MM-57554] Cover graduated notification settings in admin console search

Assert unique terms for Email Batching Buffer Size and Use Channel Name
in Email Notifications so the index test does not pass from the pre-
existing Enable Email Batching label alone.

Co-authored-by: mattermost-code <matty-code@mattermost.com>

* [MM-57554] Point experimental docs jq example at a remaining setting

EmailBatchingBufferSize moved to Site Configuration > Notifications, so
the experimental page's config.json lookup example now uses
LinkMetadataTimeoutMilliseconds.

Co-authored-by: mattermost-code <matty-code@mattermost.com>

* [MM-57554] Drop redundant email batching isDisabled conditions

The graduated Email Batching Buffer Size and Interval settings repeated
the parent Enable Email Batching bool's own conditions. Depend on the
parent alone, as enforced by @mattermost/no-redundant-admin-config-deps.

* Trigger CI after removing paired enterprise branch

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
Co-authored-by: mattermost-code <matty-code@mattermost.com>
* MM-68613: raise post message size limit to 1MB

* Read MaxPostSize from client config in E2E specs

MaxPostSize is a computed value only present in the client config, not the admin config, so request the old-format client config.
@pull pull Bot locked and limited conversation to collaborators Sep 1, 2026
@pull pull Bot added the ⤵️ pull label Sep 1, 2026
@pull
pull Bot merged commit 3e3f8c7 into code:master Sep 1, 2026
9 of 10 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants