Commit Graph

18214 Commits

Author SHA1 Message Date
Scott Bishel
e0f3713bdf
MM-56929- Dont allow guests to be set via team API (#26286)
* dont allow guests to be set via team API

* comment out invalid test

* Update import_functions_test.go

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-03-04 09:48:11 -07:00
Weblate (bot)
f8253439b8
Translations update from Mattermost Weblate (#26380) 2024-03-04 12:32:40 -04:00
Muzakir Shah
98726b9d22
changed helper text to control-label class (#25969)
* changed helper text to control-label class

* removed the help-text class

* added "helping-text" className

* Updated helping-text color

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-03-02 23:08:29 +05:00
unified-ci-app[bot]
86f6a3c937
Update latest minor version to 9.7.0 (#26364)
Automatic Merge
2024-03-01 19:21:10 +01:00
Ben Schumacher
02379b17ca
Implement plugin KV store in memory (#26244) 2024-03-01 12:12:52 +01:00
Agniva De Sarker
f9861b8666
MM-56987: Improve cache API (#26298)
This is in preparation to make the codebase
ready to use Redis. In Redis, iterating all
the keys at once is an expensive operation.
It is recommended to work on batches of keys.

Remove the Len method as it was unused.

I tried to repurpose the Keys method to iterate
on keys rather than returning all keys at once, but
it has other complicacies because the code calls
other cache functions on those keys, so to handle
the LRU cache properly, it becomes slightly more
painful.

For now, we keep it like this and rather collect
all keys from Redis and then return.

https://mattermost.atlassian.net/browse/MM-56987

```release-note
NONE
```
2024-03-01 09:46:09 +05:30
Ayush Thakur
75e32051c4
Bump prepackage Github plugin version to 2.2.0 (#26218)
Co-authored-by: Michael Kochell <6913320+mickmister@users.noreply.github.com>
Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-29 18:45:53 -05:00
Devin Binnie
893c44fe85
[MM-56757] Expand NotificationsLog to include websocket and email, adding much more varied logging across the entire process (#26273)
* [MM-56757] Expand NotificationsLog to include websocket and email, adding much more varied logging across the entire process

* Rework the status/notify prop calls

* Avoid some repetition in the logging calls

* Fix one log

* Wrap error

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-29 12:33:05 -05:00
Alejandro García Montoro
2690e1322a
Update dependencies (#26324)
* make update-dependencies

* cd public; go get -u ./...; go mod tidy
2024-02-29 13:19:43 +01:00
bewing
96e5e17d13
Set batched notification email timestamps to user TZ (#26121)
* refactor: migrate getFormattedPostTime to utils

Move app.getFormattedPostTime to utils and export along with its struct

* Set batch notification post times to user TZ

* default useMilitaryTime to false in batched email

If there is an error reading the user's preference for useMilitaryTime,
default to false, as that should be the default value if the user never
sets it.

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-29 12:42:34 +01:00
Agniva De Sarker
c9fc6297f3
MM-56877: Reduce usages of SessionHasPermissionToChannelByPost (#26239)
1. For file endpoints, a recent optimization added the ChannelID column
to be part of the fileinfo table. Therefore, we can skip the postID
and directly use the channelID.
2. For post endpoints, we reorder the sequence of calls such that
we get the channelID first, and use it to check the permission of the channel
rather than query the long way around by joining with the posts table
in the permissions query.

  The benefit is that SessionHasPermissionToChannel is cache-backed.
So in the happy path, we save a DB call. Because GetSinglePost anyways
needed to be called.
And in the bad path, we replace it with a more efficient call. Because
SessionHasPermissionToChannel is cache-backed, so effectively we
are replacing SessionHasPermissionToChannelByPost with GetSinglePost.
3. And then for the calls that don't have the channelID available,
we change the implementation itself to get the channelID by querying
the posts table first, and then calling SessionHasPermissionToChannel.
This creates the happy path as mentioned earlier.

While here, we also do some other optimizations:
4. Pre-populate the channelID while saving the reaction, so that
we don't need to query the posts table for every single reaction save.
5. Remove unnecessary goroutine spawning for publishing reaction events,
because anyways those are asynchronous.

https://mattermost.atlassian.net/browse/MM-56877

```release-note
NONE
```

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-29 09:34:55 +05:30
Nick Misasi
9e99280a40
[CLD-7046] Ability to disable self hosted server-side requests to CWS (#26070)
* Add 'Disable' config to CloudSettings to prevent the CWS backend from making calls to the Customer Portal

* Add custom error when disabled

* Make Disable setting cloud_restrictable

* Return 422 instead of 400

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-28 11:53:19 -05:00
Nick Misasi
9ffec5eab6
[CLD-7029] Add a new system console page for configuring custom export FileSettings (#26034)
* Add a new system console page for configuring custom export FileSettings

* Remove NONE option for ExportDriverName dropdown

* Fix tests

* Fix i18n

* Update webapp/channels/src/components/admin_console/admin_definition.tsx

Co-authored-by: Ben Schumacher <ben.schumacher@mattermost.com>

* PR Feedback

* Fix formatting

* gofmt

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
Co-authored-by: Ben Schumacher <ben.schumacher@mattermost.com>
2024-02-28 16:06:17 +00:00
Alejandro García Montoro
344c5a7528
MM-56781: Use correct error in doInviteRemote (#26304)
* Use correct error in doInviteRemote

A Sentry crash report identified this nil pointer dereference:
https://mattermost-mr.sentry.io/issues/4930233067/events/eae438652c7b4335be2bbe19c977f680

Interestingly, the stack trace shows the actual crash happening in the
function deferred above this line, which makes sense, given that it's
accessing the returned value, which is now nil as well. However, the
origin of the crash is here, since it's using the previous appErr, which
at this point is ensured to be nil, instead of the error returned by
InviteRemoteToChannel. This makes the returned value that should have
been generated by responsef to no longer exist.

* Test inviting a remote to a channel shared with us

* Improve error when InviteRemoteToChannel fails

* Clarify that channel has remoteID

Co-authored-by: Doug Lauder <wiggin77@warpmail.net>

* gofmt

---------

Co-authored-by: Doug Lauder <wiggin77@warpmail.net>
2024-02-28 14:00:41 +00:00
Ben Schumacher
6dbdfbbcb4
[MM-19869] Remove unused SAML code (#26133) 2024-02-28 13:40:53 +01:00
Antonis Stamatiou
cafcc2ac06
feat: Upgrade github actions for node20 (#26318) 2024-02-28 10:55:04 +02:00
Antonis Stamatiou
61578f7e21
feat: Remove prepackaged plugins from unsupported mattermost server OS (#26310) 2024-02-28 09:09:37 +02:00
Harshil Sharma
6e6deaccf8
marked some missed file APIs (#26279)
* marked some missed file APIs

* Added file handler flag to shared c hannel attachment API
2024-02-27 20:09:16 -06:00
Scott Bishel
b0015c5a5d
MM-56090 Group Search fix (#26128)
* make group search on modal and invite to work like group mentions

* update tests for better coverage

* change it back to startsWith

* update test

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-27 17:40:45 -07:00
Ben Schumacher
18f7c3775a
[MM-56890] Expose allocs and mutex pprof profiling data (#26243) 2024-02-27 13:59:42 +01:00
Alejandro García Montoro
994e437f2a
MM-56780: Ensure p.Integration is not nil (#26301)
* Ensure p.Integration is not nil

A Sentry crash report showed that the check
    p.Integration.URL != input.integration.URL
was dereferencing a nil pointer. At that point in the code,
input.Integration is known to be non-nil, but we still need to check
whether the original, p.Integration, is.

Crash report: https://mattermost-mr.sentry.io/issues/4918263046/events/5738b67edcee4c9c883d40f7d26563a6

* Test nil original integration and both nil
2024-02-27 13:52:52 +01:00
Asaad Mahmood
a65de52c90
MM-56965 - Updating header icon value (#26284) 2024-02-27 16:56:21 +05:00
Syed Ali Abbas Zaidi
590b75e9fc
[MM-56842] Convert ./components/status_icon.tsx from Class Component to Function Component (#26257)
Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-27 10:13:38 +01:00
Syed Ali Abbas Zaidi
a19e999c11
[MM-56845] Convert ./components/suggestion/suggestion_date.tsx from Class Component to Function Component (#26236)
Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-27 10:08:49 +01:00
Alejandro García Montoro
fac1245143
Fix "doesn't exists" typo (#26307) 2024-02-27 08:13:12 +05:30
soham
f1a37e06bc
Fix multiple timer issue in CopyButton by using useRef (#26285)
* Fix multiple timer issue in CopyButton by using useRef
This commit resolves a bug where rapidly clicking the Copy button in the CopyButton component would initiate multiple overlapping timers, leading to unpredictable copy state toggling. By utilizing useRef, we now ensure a single timer instance is managed and cleared appropriately, stabilizing the copy functionality.

* Remove null assignment to timerRef.current before setting new timeout

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-26 16:51:27 -05:00
goooov
d788ece25d
[MM-56661] Fix: When deleting a draft you have to move your cursor away from the card and back to activate the buttons (#26170)
* [MM-56661] fix: hover logic changed to onMouseOver

* fix: updated snapshots

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-26 16:48:05 -05:00
Harrison Healey
0d2053aa5c
MM-56985 Remove babel-plugin-lodash (#26295) 2024-02-26 16:47:26 -05:00
Syed Ali Abbas Zaidi
48117fb21f
[MM-56850] Convert ./components/modal_controller/modal_controller.tsx from Class Component to Function Component (#26259)
* [MM-56850] Convert `./components/modal_controller/modal_controller.tsx` from Class Component to Function Component

* fix: failing type check
2024-02-26 16:04:36 -05:00
Matthew Birtch
782f81d22f
fix thread icon size and color (#26288) 2024-02-26 21:23:23 +05:30
Weblate (bot)
0e8640afeb
Translations update from Mattermost Weblate (#26300)
* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/

* Deleted translation using Weblate (Bengali)

* Deleted translation using Weblate (Filipino)

* Deleted translation using Weblate (Frisian)

* Deleted translation using Weblate (Icelandic)

* Deleted translation using Weblate (Kazakh)

* Deleted translation using Weblate (Kazakh (latin))

* Deleted translation using Weblate (Latin)

* Deleted translation using Weblate (Latvian)

* Deleted translation using Weblate (Pirate (pr))

* Translated using Weblate (Dutch)

Currently translated at 99.3% (2592 of 2608 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/nl/

* Translated using Weblate (Hungarian)

Currently translated at 90.2% (2353 of 2608 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/hu/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (5946 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/ja/

* Translated using Weblate (Dutch)

Currently translated at 100.0% (2608 of 2608 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/nl/

* Translated using Weblate (Polish)

Currently translated at 100.0% (2608 of 2608 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/pl/

* Translated using Weblate (Dutch)

Currently translated at 98.9% (5885 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nl/

* Translated using Weblate (Czech)

Currently translated at 92.6% (5510 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/cs/

* Translated using Weblate (Croatian)

Currently translated at 34.7% (2067 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/hr/

* Translated using Weblate (Dutch)

Currently translated at 99.2% (5900 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nl/

* Translated using Weblate (Swedish)

Currently translated at 96.1% (5715 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/sv/

* Translated using Weblate (Russian)

Currently translated at 100.0% (2608 of 2608 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/ru/

* Translated using Weblate (Dutch)

Currently translated at 99.3% (5910 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nl/

* Translated using Weblate (Russian)

Currently translated at 97.2% (5785 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/ru/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (2608 of 2608 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/ja/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (2608 of 2608 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/zh_Hans/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (5946 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/ja/

* Translated using Weblate (Dutch)

Currently translated at 99.7% (5931 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nl/

* Translated using Weblate (Czech)

Currently translated at 92.9% (5529 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/cs/

* Translated using Weblate (Dutch)

Currently translated at 99.9% (5945 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/nl/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (2608 of 2608 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/zh_Hans/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 99.8% (5935 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/zh_Hans/

* Translated using Weblate (Polish)

Currently translated at 97.3% (5787 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pl/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 99.9% (5945 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/zh_Hans/

* Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (5946 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/zh_Hans/

* Translated using Weblate (Polish)

Currently translated at 97.6% (5808 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pl/

* Translated using Weblate (Polish)

Currently translated at 98.0% (5828 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pl/

* Translated using Weblate (Spanish)

Currently translated at 80.9% (4812 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/es/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (2608 of 2608 strings)

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/en_AU/

* Translated using Weblate (English (Australia))

Currently translated at 100.0% (5946 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/en_AU/

* Translated using Weblate (Japanese)

Currently translated at 100.0% (5946 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/ja/

* Translated using Weblate (Polish)

Currently translated at 98.6% (5863 of 5946 strings)

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/pl/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/server
Translate-URL: https://translate.mattermost.com/projects/mattermost/server/

* Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Translation: Mattermost/webapp
Translate-URL: https://translate.mattermost.com/projects/mattermost/webapp/

---------

Co-authored-by: Tom De Moor <tom@controlaltdieliet.be>
Co-authored-by: Csaba Tóth <csaba.toth@odootech.hu>
Co-authored-by: kaakaa <stooner.hoe@gmail.com>
Co-authored-by: master7 <marcin.karkosz@rajska.info>
Co-authored-by: Martin Joneš <m.jones@7group.cz>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: MArtin Johnson <martinjohnson@bahnhof.se>
Co-authored-by: Konstantin <eleferen@gmail.com>
Co-authored-by: Sharuru <mave@foxmail.com>
Co-authored-by: ThrRip <coding@thrrip.space>
Co-authored-by: Angel Mendez Cano <amendez1988@gmail.com>
Co-authored-by: Matthew Williams <Matthew.Williams@outlook.com.au>
Co-authored-by: R Oyanagi <rOt779kVceSgL@users.noreply.translate.mattermost.com>
2024-02-26 11:46:17 -04:00
Nick Misasi
a85ebd3f49
Don't email licensed/internal customers about Cloud Renewals (#26268) 2024-02-26 10:07:48 -05:00
Ben Schumacher
1c0dcda801
[MM-56400] Allow mmctl to download a Support Packet using --local mode (#25836) 2024-02-26 07:55:54 +01:00
Maria A Nunez
e9b9d4ff60
Deprecate admin advisor (#26045)
* Deprecate admin advisor

* Webapp portion

* More webapp deprecation

* More cleanup

* Linting

* emoved metric ack dialog from annoucenemet bar

* Cleanued up uninsed i18n strings

* Updated test

* fixed types

* Updating server test

* Updated i18n

* Updated cypress test:

* Updated cypress test:

---------

Co-authored-by: harshil Sharma <harshilsharma63@gmail.com>
2024-02-26 09:05:00 +05:30
Aswath S
dc8fc773dc
MM-55733 add request context to Channelstore.Save method (#26141) 2024-02-24 13:08:51 +01:00
Agniva De Sarker
401de9b321
MM-56925: Fix unnecessary cache invalidation of pinned post count (#26264)
invalidateCacheForChannelPosts invalidated the pinned post count
and the lastPostTime cache.

But not all endpoints actually pins or unpins the post. That's only
possible via the UpdatePost or PatchPost methods. Therefore, we remove
the unnecessary cache invalidation.

This is also important because this gets called for every single
channel load, and every new post would invalidate this cache.

https://mattermost.atlassian.net/browse/MM-56925
```release-note
NONE
```
2024-02-24 11:55:20 +05:30
Ben Cooke
1ae96cefad
[MM-56901] Exclude selectors that have less than 5 calls from telemetry (#26246)
* exclude selectors from telemetry that have less than 5 calls
---------
Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-23 13:11:25 -05:00
John Landells
01a3e0d182
Update users.yaml (#26167)
Added a note regarding the "last_activity_at" field
2024-02-23 15:31:56 +05:30
Christopher Speller
729950ef03
Restrict post metadata to allow for potentially unsafe links (#26098)
* Restrict post metadata to allow for potentially unsafe links

* Enhance tests to test tests.

* Restrict prop to only be active if set to 'true'

* Adress feedback.

* Fix existing test using invalid permalink.

* Fix more tests
2024-02-22 13:31:24 -08:00
Nick Misasi
45750dbfc6
Fix flaky IP Filtering test (#26283) 2024-02-22 11:50:57 -05:00
Agniva De Sarker
64504b80e6
TRY 2: MM-56201, MM-56280: Suppress typing and emoji events (#26282)
* Revert "Revert "MM-56201, MM-56280: Suppress typing and emoji events (#25794)…"

This reverts commit 6808a1c733.

* Remove bad ff merge

```release-note
NONE
```
2024-02-22 21:25:34 +05:30
Agniva De Sarker
6808a1c733
Revert "MM-56201, MM-56280: Suppress typing and emoji events (#25794)" (#26281)
This reverts commit f5ee5463e4.
2024-02-22 19:56:56 +05:30
Ben Schumacher
726d7494b6
[MM-56889] Add PositionAttribute to LDAP test data (#26242) 2024-02-22 12:28:55 +01:00
Agniva De Sarker
c4432a5234
Remove unnecessary cache invalidation for channel (#26256)
```release-note
NONE
```
2024-02-22 10:01:17 +05:30
Agniva De Sarker
f5ee5463e4
MM-56201, MM-56280: Suppress typing and emoji events (#25794)
We do not send the typing event when the originating
channel is not the active channel or active channel thread.

https://mattermost.atlassian.net/browse/MM-56201

```release-note
NONE
```

Co-authored-by: harshil Sharma <harshilsharma63@gmail.com>
Co-authored-by: Harrison Healey <harrisonmhealey@gmail.com>
2024-02-22 08:36:24 +05:30
Doug Lauder
38bbf04e48
Metrics for shared channels (#26199)
* add metrics definitions for shared channels
2024-02-21 17:21:35 -05:00
Scott Bishel
f90b3d4141
MM-56822 Update logic around permissions and sanitization (#26227)
* update logic around permissions and sanitization

* add test

* add comments

* fix test

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-21 15:19:11 -07:00
Nick Misasi
01e1eebc07
[CLD-6430] Remove telemetry check from true_up_review (#26073)
* Remove telemetry check from true_up_review

* Fix bug

* Fix linter

* fix tests
2024-02-21 09:50:47 -05:00
Harshil Sharma
521844fed5
API handler opts modifier (#26148)
* POC for API handler opts modifier

* Made upload POSt api a  file upload API

* Specified file upload local API

* Specified file upload local API

* Specified file upload API

* Simplified handler params

* Added basic security checks

* Fixed i18n

* used type for API handler options

* Removed limited reader from util deserializers (#26263)
2024-02-21 12:13:50 +00:00
Asaad Mahmood
ecb09de6c7
MM-53814 - Updating contrast for accessibility (#24381)
* Updating contrast for accessiblity

* Updating accessbility

* Updating accessiblity for icons

* Updating header icons

* Updating text opacity

* Updating icons and text

* Updating sidebar left

* Upadating icon in system console

* Updating global header

* Updating channel list

* Updating tests and fixing conflicts

* Updating filter css

* Updating css

* Updating epehemeral message contrast

* Updating icon with 64 opacity

* Updating test

* Updating confirm license removal csss

* Updating unintended files

---------

Co-authored-by: Mattermost Build <build@mattermost.com>
2024-02-21 15:54:18 +05:00