2020-11-06 17:46:35 +02:00
|
|
|
package app
|
|
|
|
|
|
|
|
import (
|
2020-12-04 17:03:09 +02:00
|
|
|
"log"
|
2020-12-07 18:04:35 +02:00
|
|
|
"time"
|
2020-12-04 17:03:09 +02:00
|
|
|
|
2020-11-06 17:46:35 +02:00
|
|
|
"github.com/google/uuid"
|
|
|
|
"github.com/mattermost/mattermost-octo-tasks/server/model"
|
|
|
|
"github.com/mattermost/mattermost-octo-tasks/server/services/auth"
|
|
|
|
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
)
|
|
|
|
|
2020-12-07 18:04:35 +02:00
|
|
|
// GetSession Get a user active session and refresh the session if is needed
|
2020-12-02 22:12:14 +02:00
|
|
|
func (a *App) GetSession(token string) (*model.Session, error) {
|
2021-01-12 20:53:48 +02:00
|
|
|
if len(token) < 1 {
|
|
|
|
return nil, errors.New("no session token")
|
|
|
|
}
|
|
|
|
|
2020-12-07 18:04:35 +02:00
|
|
|
session, err := a.store.GetSession(token, a.config.SessionExpireTime)
|
2020-12-02 22:12:14 +02:00
|
|
|
if err != nil {
|
2021-01-12 20:53:48 +02:00
|
|
|
return nil, errors.Wrap(err, "unable to get the session for the token")
|
2020-12-02 22:12:14 +02:00
|
|
|
}
|
2020-12-07 18:04:35 +02:00
|
|
|
if session.UpdateAt < (time.Now().Unix() - a.config.SessionRefreshTime) {
|
|
|
|
a.store.RefreshSession(session)
|
|
|
|
}
|
2020-12-02 22:12:14 +02:00
|
|
|
return session, nil
|
|
|
|
}
|
|
|
|
|
2021-01-14 02:56:01 +02:00
|
|
|
// GetActiveUserCount returns the number of active users
|
|
|
|
func (a *App) GetActiveUserCount() (int, error) {
|
|
|
|
return a.store.GetActiveUserCount()
|
|
|
|
}
|
|
|
|
|
2020-12-07 21:40:16 +02:00
|
|
|
// GetUser Get an existing active user by id
|
|
|
|
func (a *App) GetUser(ID string) (*model.User, error) {
|
2021-01-12 20:53:48 +02:00
|
|
|
if len(ID) < 1 {
|
|
|
|
return nil, errors.New("no user ID")
|
|
|
|
}
|
|
|
|
|
2020-12-07 21:40:16 +02:00
|
|
|
user, err := a.store.GetUserById(ID)
|
|
|
|
if err != nil {
|
2021-01-12 20:53:48 +02:00
|
|
|
return nil, errors.Wrap(err, "unable to get the session for the user")
|
2020-12-07 21:40:16 +02:00
|
|
|
}
|
|
|
|
return user, nil
|
|
|
|
}
|
|
|
|
|
2020-12-07 18:04:35 +02:00
|
|
|
// Login create a new user session if the authentication data is valid
|
2020-11-06 17:46:35 +02:00
|
|
|
func (a *App) Login(username string, email string, password string, mfaToken string) (string, error) {
|
|
|
|
var user *model.User
|
|
|
|
if username != "" {
|
|
|
|
var err error
|
|
|
|
user, err = a.store.GetUserByUsername(username)
|
|
|
|
if err != nil {
|
|
|
|
return "", errors.Wrap(err, "invalid username or password")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if user == nil && email != "" {
|
|
|
|
var err error
|
|
|
|
user, err = a.store.GetUserByEmail(email)
|
|
|
|
if err != nil {
|
|
|
|
return "", errors.Wrap(err, "invalid username or password")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if user == nil {
|
|
|
|
return "", errors.New("invalid username or password")
|
|
|
|
}
|
|
|
|
|
|
|
|
if !auth.ComparePassword(user.Password, password) {
|
2020-12-04 17:03:09 +02:00
|
|
|
log.Printf("Not valid passowrd. %s (%s)\n", password, user.Password)
|
2020-11-06 17:46:35 +02:00
|
|
|
return "", errors.New("invalid username or password")
|
|
|
|
}
|
|
|
|
|
2020-12-02 22:12:14 +02:00
|
|
|
session := model.Session{
|
|
|
|
ID: uuid.New().String(),
|
|
|
|
Token: uuid.New().String(),
|
|
|
|
UserID: user.ID,
|
|
|
|
Props: map[string]interface{}{},
|
|
|
|
}
|
|
|
|
err := a.store.CreateSession(&session)
|
|
|
|
if err != nil {
|
|
|
|
return "", errors.Wrap(err, "unable to create session")
|
|
|
|
}
|
|
|
|
|
2020-11-06 17:46:35 +02:00
|
|
|
// TODO: MFA verification
|
2020-12-02 22:12:14 +02:00
|
|
|
return session.Token, nil
|
2020-11-06 17:46:35 +02:00
|
|
|
}
|
|
|
|
|
2020-12-07 18:04:35 +02:00
|
|
|
// RegisterUser create a new user if the provided data is valid
|
2020-11-06 17:46:35 +02:00
|
|
|
func (a *App) RegisterUser(username string, email string, password string) error {
|
|
|
|
var user *model.User
|
|
|
|
if username != "" {
|
|
|
|
var err error
|
|
|
|
user, err = a.store.GetUserByUsername(username)
|
|
|
|
if err == nil && user != nil {
|
|
|
|
return errors.Wrap(err, "The username already exists")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if user == nil && email != "" {
|
|
|
|
var err error
|
|
|
|
user, err = a.store.GetUserByEmail(email)
|
|
|
|
if err == nil && user != nil {
|
|
|
|
return errors.Wrap(err, "The email already exists")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// TODO: Move this into the config
|
|
|
|
passwordSettings := auth.PasswordSettings{
|
|
|
|
MinimumLength: 6,
|
|
|
|
}
|
|
|
|
|
|
|
|
err := auth.IsPasswordValid(password, passwordSettings)
|
|
|
|
if err != nil {
|
|
|
|
return errors.Wrap(err, "Invalid password")
|
|
|
|
}
|
|
|
|
|
|
|
|
err = a.store.CreateUser(&model.User{
|
|
|
|
ID: uuid.New().String(),
|
|
|
|
Username: username,
|
|
|
|
Email: email,
|
|
|
|
Password: auth.HashPassword(password),
|
|
|
|
MfaSecret: "",
|
|
|
|
AuthService: "",
|
|
|
|
AuthData: "",
|
|
|
|
Props: map[string]interface{}{},
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return errors.Wrap(err, "Unable to create the new user")
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|