mirror of https://github.com/portainer/portainer
* feat(authtication): Rename all usernames to lowercase * feat(authentication): Remove database migration (#3580) * feat(authentication): Make UserByUsername compare usernames case-insensitively (#3580) * feat(authentication): validate new username case-insensitively (#3580) Co-authored-by: Simon Meng <simon.meng@portainer.io>pull/4841/head
parent
46dec01fe3
commit
24b1894a84
|
@ -4,6 +4,7 @@ import (
|
||||||
"github.com/portainer/portainer/api"
|
"github.com/portainer/portainer/api"
|
||||||
"github.com/portainer/portainer/api/bolt/errors"
|
"github.com/portainer/portainer/api/bolt/errors"
|
||||||
"github.com/portainer/portainer/api/bolt/internal"
|
"github.com/portainer/portainer/api/bolt/internal"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/boltdb/bolt"
|
"github.com/boltdb/bolt"
|
||||||
)
|
)
|
||||||
|
@ -47,6 +48,8 @@ func (service *Service) User(ID portainer.UserID) (*portainer.User, error) {
|
||||||
func (service *Service) UserByUsername(username string) (*portainer.User, error) {
|
func (service *Service) UserByUsername(username string) (*portainer.User, error) {
|
||||||
var user *portainer.User
|
var user *portainer.User
|
||||||
|
|
||||||
|
username = strings.ToLower(username)
|
||||||
|
|
||||||
err := service.db.View(func(tx *bolt.Tx) error {
|
err := service.db.View(func(tx *bolt.Tx) error {
|
||||||
bucket := tx.Bucket([]byte(BucketName))
|
bucket := tx.Bucket([]byte(BucketName))
|
||||||
cursor := bucket.Cursor()
|
cursor := bucket.Cursor()
|
||||||
|
@ -58,7 +61,7 @@ func (service *Service) UserByUsername(username string) (*portainer.User, error)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if u.Username == username {
|
if strings.ToLower(u.Username) == username {
|
||||||
user = &u
|
user = &u
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
@ -123,6 +126,7 @@ func (service *Service) UsersByRole(role portainer.UserRole) ([]portainer.User,
|
||||||
// UpdateUser saves a user.
|
// UpdateUser saves a user.
|
||||||
func (service *Service) UpdateUser(ID portainer.UserID, user *portainer.User) error {
|
func (service *Service) UpdateUser(ID portainer.UserID, user *portainer.User) error {
|
||||||
identifier := internal.Itob(int(ID))
|
identifier := internal.Itob(int(ID))
|
||||||
|
user.Username = strings.ToLower(user.Username)
|
||||||
return internal.UpdateObject(service.db, BucketName, identifier, user)
|
return internal.UpdateObject(service.db, BucketName, identifier, user)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,6 +137,7 @@ func (service *Service) CreateUser(user *portainer.User) error {
|
||||||
|
|
||||||
id, _ := bucket.NextSequence()
|
id, _ := bucket.NextSequence()
|
||||||
user.ID = portainer.UserID(id)
|
user.ID = portainer.UserID(id)
|
||||||
|
user.Username = strings.ToLower(user.Username)
|
||||||
|
|
||||||
data, err := internal.MarshalObject(user)
|
data, err := internal.MarshalObject(user)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -29,7 +29,7 @@ angular.module('portainer.app').controller('UsersController', [
|
||||||
$scope.checkUsernameValidity = function () {
|
$scope.checkUsernameValidity = function () {
|
||||||
var valid = true;
|
var valid = true;
|
||||||
for (var i = 0; i < $scope.users.length; i++) {
|
for (var i = 0; i < $scope.users.length; i++) {
|
||||||
if ($scope.formValues.Username === $scope.users[i].Username) {
|
if ($scope.formValues.Username.toLocaleLowerCase() === $scope.users[i].Username.toLocaleLowerCase()) {
|
||||||
valid = false;
|
valid = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue