[pull] master from mattermost:master - #953
Merged
Merged
Conversation
…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>
* 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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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 : )