Full Mattermost server source with integrated Community Enterprise features. Includes vendor directory for offline/air-gapped builds. Structure: - enterprise-impl/: Enterprise feature implementations - enterprise-community/: Init files that register implementations - enterprise/: Bridge imports (community_imports.go) - vendor/: All dependencies for offline builds Build (online): go build ./cmd/mattermost Build (offline/air-gapped): go build -mod=vendor ./cmd/mattermost 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
111 lines
3.2 KiB
Go
111 lines
3.2 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package teams
|
|
|
|
import (
|
|
"slices"
|
|
"strings"
|
|
|
|
"github.com/mattermost/mattermost/server/public/model"
|
|
)
|
|
|
|
// By default the list will be (not necessarily in this order):
|
|
//
|
|
// ['town-square', 'off-topic']
|
|
//
|
|
// However, if TeamSettings.ExperimentalDefaultChannels contains a list of channels then that list will replace
|
|
// 'off-topic' and be included in the return results in addition to 'town-square'. For example:
|
|
//
|
|
// ['town-square', 'game-of-thrones', 'wow']
|
|
func (ts *TeamService) DefaultChannelNames() []string {
|
|
names := []string{"town-square"}
|
|
|
|
if len(ts.config().TeamSettings.ExperimentalDefaultChannels) == 0 {
|
|
names = append(names, "off-topic")
|
|
} else {
|
|
seenChannels := map[string]bool{"town-square": true}
|
|
for _, channelName := range ts.config().TeamSettings.ExperimentalDefaultChannels {
|
|
if !seenChannels[channelName] {
|
|
names = append(names, channelName)
|
|
seenChannels[channelName] = true
|
|
}
|
|
}
|
|
}
|
|
|
|
return names
|
|
}
|
|
|
|
func IsEmailAddressAllowed(email string, allowedDomains []string) bool {
|
|
for _, restriction := range allowedDomains {
|
|
domains := normalizeDomains(restriction)
|
|
if len(domains) <= 0 {
|
|
continue
|
|
}
|
|
matched := false
|
|
for _, d := range domains {
|
|
if strings.HasSuffix(email, "@"+d) {
|
|
matched = true
|
|
break
|
|
}
|
|
}
|
|
if !matched {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func (ts *TeamService) IsTeamEmailAllowed(user *model.User, team *model.Team) bool {
|
|
if user.IsBot {
|
|
return true
|
|
}
|
|
email := strings.ToLower(user.Email)
|
|
allowedDomains := ts.GetAllowedDomains(user, team)
|
|
return IsEmailAddressAllowed(email, allowedDomains)
|
|
}
|
|
|
|
func (ts *TeamService) GetAllowedDomains(user *model.User, team *model.Team) []string {
|
|
if user.IsGuest() {
|
|
return []string{*ts.config().GuestAccountsSettings.RestrictCreationToDomains}
|
|
}
|
|
// First check per team allowedDomains, then app wide restrictions
|
|
return []string{team.AllowedDomains, *ts.config().TeamSettings.RestrictCreationToDomains}
|
|
}
|
|
|
|
func (ts *TeamService) checkValidDomains(team *model.Team) error {
|
|
validDomains := normalizeDomains(*ts.config().TeamSettings.RestrictCreationToDomains)
|
|
if len(validDomains) > 0 {
|
|
for _, domain := range normalizeDomains(team.AllowedDomains) {
|
|
matched := slices.Contains(validDomains, domain)
|
|
if !matched {
|
|
return &DomainError{Domain: domain}
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func normalizeDomains(domains string) []string {
|
|
// commas and @ signs are optional
|
|
// can be in the form of "@corp.mattermost.com, mattermost.com mattermost.org" -> corp.mattermost.com mattermost.com mattermost.org
|
|
return strings.Fields(strings.TrimSpace(strings.ToLower(strings.Replace(strings.Replace(domains, "@", " ", -1), ",", " ", -1))))
|
|
}
|
|
|
|
// UserIsInAdminRoleGroup returns true at least one of the user's groups are configured to set the members as
|
|
// admins in the given syncable.
|
|
func (ts *TeamService) userIsInAdminRoleGroup(userID, syncableID string, syncableType model.GroupSyncableType) (bool, error) {
|
|
groupIDs, err := ts.groupStore.AdminRoleGroupsForSyncableMember(userID, syncableID, syncableType)
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
|
|
if len(groupIDs) == 0 {
|
|
return false, nil
|
|
}
|
|
|
|
return true, nil
|
|
}
|