github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/app/slashcommands/auto_users.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package slashcommands
     5  
     6  import (
     7  	"errors"
     8  	"net/http"
     9  
    10  	"github.com/mattermost/mattermost-server/v5/app"
    11  	"github.com/mattermost/mattermost-server/v5/model"
    12  	"github.com/mattermost/mattermost-server/v5/store"
    13  	"github.com/mattermost/mattermost-server/v5/utils"
    14  )
    15  
    16  type AutoUserCreator struct {
    17  	app          *app.App
    18  	client       *model.Client4
    19  	team         *model.Team
    20  	EmailLength  utils.Range
    21  	EmailCharset string
    22  	NameLength   utils.Range
    23  	NameCharset  string
    24  	Fuzzy        bool
    25  }
    26  
    27  func NewAutoUserCreator(a *app.App, client *model.Client4, team *model.Team) *AutoUserCreator {
    28  	return &AutoUserCreator{
    29  		app:          a,
    30  		client:       client,
    31  		team:         team,
    32  		EmailLength:  UserEmailLen,
    33  		EmailCharset: utils.LOWERCASE,
    34  		NameLength:   UserNameLen,
    35  		NameCharset:  utils.LOWERCASE,
    36  		Fuzzy:        false,
    37  	}
    38  }
    39  
    40  // Basic test team and user so you always know one
    41  func CreateBasicUser(a *app.App, client *model.Client4) *model.AppError {
    42  	found, _ := client.TeamExists(BTestTeamName, "")
    43  	if found {
    44  		return nil
    45  	}
    46  
    47  	newteam := &model.Team{DisplayName: BTestTeamDisplayName, Name: BTestTeamName, Email: BTestTeamEmail, Type: BTestTeamType}
    48  	basicteam, resp := client.CreateTeam(newteam)
    49  	if resp.Error != nil {
    50  		return resp.Error
    51  	}
    52  	newuser := &model.User{Email: BTestUserEmail, Nickname: BTestUserName, Password: BTestUserPassword}
    53  	ruser, resp := client.CreateUser(newuser)
    54  	if resp.Error != nil {
    55  		return resp.Error
    56  	}
    57  	_, err := a.Srv().Store.User().VerifyEmail(ruser.Id, ruser.Email)
    58  	if err != nil {
    59  		return model.NewAppError("CreateBasicUser", "app.user.verify_email.app_error", nil, err.Error(), http.StatusInternalServerError)
    60  	}
    61  	if _, nErr := a.Srv().Store.Team().SaveMember(&model.TeamMember{TeamId: basicteam.Id, UserId: ruser.Id}, *a.Config().TeamSettings.MaxUsersPerTeam); nErr != nil {
    62  		var appErr *model.AppError
    63  		var conflictErr *store.ErrConflict
    64  		var limitExceededErr *store.ErrLimitExceeded
    65  		switch {
    66  		case errors.As(nErr, &appErr): // in case we haven't converted to plain error.
    67  			return appErr
    68  		case errors.As(nErr, &conflictErr):
    69  			return model.NewAppError("CreateBasicUser", "app.create_basic_user.save_member.conflict.app_error", nil, nErr.Error(), http.StatusBadRequest)
    70  		case errors.As(nErr, &limitExceededErr):
    71  			return model.NewAppError("CreateBasicUser", "app.create_basic_user.save_member.max_accounts.app_error", nil, nErr.Error(), http.StatusBadRequest)
    72  		default: // last fallback in case it doesn't map to an existing app error.
    73  			return model.NewAppError("CreateBasicUser", "app.create_basic_user.save_member.app_error", nil, nErr.Error(), http.StatusInternalServerError)
    74  		}
    75  	}
    76  
    77  	return nil
    78  }
    79  
    80  func (cfg *AutoUserCreator) createRandomUser() (*model.User, error) {
    81  	var userEmail string
    82  	var userName string
    83  	if cfg.Fuzzy {
    84  		userEmail = "success+" + model.NewId() + "@simulator.amazonses.com"
    85  		userName = utils.FuzzName()
    86  	} else {
    87  		userEmail = "success+" + model.NewId() + "@simulator.amazonses.com"
    88  		userName = utils.RandomName(cfg.NameLength, cfg.NameCharset)
    89  	}
    90  
    91  	user := &model.User{
    92  		Email:    userEmail,
    93  		Nickname: userName,
    94  		Password: UserPassword}
    95  
    96  	ruser, appErr := cfg.app.CreateUserWithInviteId(user, cfg.team.InviteId, "")
    97  	if appErr != nil {
    98  		return nil, appErr
    99  	}
   100  
   101  	status := &model.Status{UserId: ruser.Id, Status: model.STATUS_ONLINE, Manual: false, LastActivityAt: model.GetMillis(), ActiveChannel: ""}
   102  	if err := cfg.app.Srv().Store.Status().SaveOrUpdate(status); err != nil {
   103  		return nil, err
   104  	}
   105  
   106  	// We need to cheat to verify the user's email
   107  	_, err := cfg.app.Srv().Store.User().VerifyEmail(ruser.Id, ruser.Email)
   108  	if err != nil {
   109  		return nil, err
   110  	}
   111  
   112  	return ruser, nil
   113  }
   114  
   115  func (cfg *AutoUserCreator) CreateTestUsers(num utils.Range) ([]*model.User, error) {
   116  	numUsers := utils.RandIntFromRange(num)
   117  	users := make([]*model.User, numUsers)
   118  
   119  	for i := 0; i < numUsers; i++ {
   120  		var err error
   121  		users[i], err = cfg.createRandomUser()
   122  		if err != nil {
   123  			return nil, err
   124  		}
   125  	}
   126  
   127  	return users, nil
   128  }