* MM-48186: Add a new API endpoint to add a user to their default GroupChannels and GroupTeams.
* MM-48186: Removed unrelated lint fixes.
* MM-48186: Removed variable from previous iteration.
* MM-48186: Adds translation.
* MM-48186: Not upgrading golang.org/x/text in this pr.
* MM-48186: Validate user ID and auth service.
* MM-48186: Use user id from struct.
* MM-48186: Added basic client test.
* MM-48186: Adds empty translation.
* MM-48186: Added translations.
Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
Creating the post in a separate goroutine would create a race condition
because that method also calls GetChannel. This can cause a bug
if the cache was wiped before the the other goroutine would get
a chance to update the cache. And if that happens, then
it would populate the cache with the old value.
Pseudo-code
```
func deleteChannel() {
go func() {
getFromCache()
}()
updateDB()
wipeCache() // a
}
func getFromCache() {
err := checkCache()
if err == ErrNotFound {
getFromDB() // x
updateCache() // y
}
}
func Test() {
deleteChannel()
getFromCache()
}
```
If the sequence of events happen like
- x
- a
- y
Then the getFromCache() call later will get the wrong
value from cache.
The fix is to make the call synchronous.
https://mattermost.atlassian.net/browse/MM-47465
Special thanks to @noxer for finding the root cause.
```release-note
NONE
```
* Parse and reconstruct URI, instead of using string concatenation
* Rename parse error, add test
Co-authored-by: Mattermod <mattermod@users.noreply.github.com>
* Extend Plugin API
* Use Error, NoError in tests
* Address suggestions
* Simplify code
* Add new line
* Add featureflag and GetCollectionMetadataByIds hook
* Add enter at the end of file
* make build-templates
* Fix test
* Fix GetCollectionMetadataByIds ret type
* Add GetTopicMetadataByIds hook
* Add log
* Extract i18n
* Add experimental notice on hooks
* Update model/feature_flags.go
* Swap user to userId
* Change userId to userID
Co-authored-by: Jesse Hallam <jesse.hallam@gmail.com>
* MM-46275 Unify various targets for building web app
* MM-46275/MM-46979 Add logic to package boards product static files in CI
* Add error meessage when Boards files can't be found during packaging
* Remove a couple unneeded lines from release.mk
* Decrease size of machine used for setup-focalboard-product
* Revert "Add error meessage when Boards files can't be found during packaging"
This reverts commit f4f46ade0ac4c1ec5525d9b2eae959e13b9aec42.
* Revert "Revert "Add error meessage when Boards files can't be found during packaging""
This reverts commit a0e6420b19c5af0b5ff4706b6abaf8e56f8b3495.
* Fix unrelated email templates
* Skip flaky test
* MM-47250: Add new system console section
We add a new section in system console
for products.
```release-note
Added a new section in system console
for products. For now, it only contains
boards specific settings.
```
* fix unit tests
```release-note
NONE
```
* change comment
```release-note
NONE
```
We were applying a white background to transparent images
and converting them to jpegs. This was to make text be legible
behind a black preview background.
However, this has led to a poor user experience, as users rarely
download the full image but always click on previews. Therefore,
we need the previews to remain as pngs.
To fix this, we just re-encode them as pngs instead of jpgs.
```release-note
NONE
```
* add from_integration prop to oauth posts to:
- oauth app posts
- plugin posts
- slash command responses
- incoming webhook posts
* tests
* include check for bot posts
* use from_plugin and from_oauth_app props
* fix test
* avoid counting top channel posts for posts made by plugins and oauth apps
The core mistake was that the webconn doesn't really go out of scope
once the connection disconnects. It is kept in the webhub connIndex
to be reconnected if the user connects again. This was the new
behavior as part of reliable websockets.
Therefore, it was a mistake to return the session to the pool
once the connection drops. Because the connection would still
recieve events from the web_hub.
And once you release the session, another login might acquire the
session and set some props, while the web_hub might still try
to send events to it, which will cause a read of the map prop.
The following test case illustrates such a race. It is very
hard to trigger it organically, hence I artificially wrote
the code.
The right fix is to release the session only when the connection
is stale and gets deleted from the conn index. The PR has been
load tested in `-race` mode just for extra sanity check.
```go
func TestHubSessionRace(t *testing.T) {
th := Setup(t).InitBasic()
defer th.TearDown()
s := httptest.NewServer(dummyWebsocketHandler(t))
defer s.Close()
th.Server.HubStart()
wc1 := registerDummyWebConn(t, th.App, s.Listener.Addr(), th.BasicUser.Id)
defer wc1.Close()
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
token := wc1.GetSessionToken()
// Return to pool after *WebConn.Pump finishes
wc1.App.Srv().userService.ReturnSessionToPool(wc1.GetSession())
// A new HTTP requests acquires a session which gets it from the pool
sess, _ := wc1.App.GetSession(token)
// Login happens which sets some session properties
sess.AddProp(model.SessionPropPlatform, "chrome")
}()
go func() {
defer wg.Done()
// Called from *WebConn.shouldSendEvent
t.Log("session: ", wc1.GetSession().Props[model.SessionPropIsGuest] == "true")
}()
wg.Wait()
}
```
https://mattermost.atlassian.net/browse/MM-46604
```release-note
NONE
```