Provide command line variables for initializing an admin user. Previously to get admin access on a fresh install I had to create a user in the web interface (to make sure the password hash/salt is properly setup) then manually change the role in the database to 'admin' using a postgresql client. This was a pain in the ass, and I think there really needs to be an easy way to create the admin user on the initial deployment. This solution fixes this, and adds documentation to the README file on how to use those variables.

This commit is contained in:
endangered 2019-11-25 06:58:44 +09:30
parent defaa2ae0b
commit f836f40f89
5 changed files with 62 additions and 2 deletions

View file

@ -45,6 +45,37 @@ func (db *pgDB) AddUser(name string, pass string) error {
return db.AddRawUser(name, hpass, salt, "")
}
func (db *pgDB) SetAdminUser(name string, pass string) error {
if !validAdminUserName(name) {
return errors.New("Invalid admin user name. Username needs to have at least 3 characters and can only be letters, numbers, '-', '_' and '.'.")
}
num, err := db.sql.Model(&User{}).Where("lower(username) = lower(?)", name).Count()
if err != nil {
log.Error("Error on database checking user ", name, ": ", err)
return errors.New("An error happen on the database")
}
if num != 0 {
err := db.SetRole(name, "admin")
if err != nil {
log.Error("Error updating admin user ", name, ": ", err)
return errors.New("Error updating admin user")
}
return db.SetPassword(name, pass)
}
hpass, salt, err := hashPass(pass)
if err != nil {
log.Error("Error hashing password: ", err)
return errors.New("An error happen storing the password")
}
return db.AddRawUser(name, hpass, salt, "admin")
}
func (db *pgDB) AddRawUser(name string, hpass []byte, salt []byte, role string) error {
u := User{
Username: name,
@ -120,13 +151,20 @@ func (db *pgDB) getUser(name string) (User, error) {
return user, err
}
func validUserName(name string) bool {
func validAdminUserName(name string) bool {
if len(name) < 3 {
return false
}
if !alphaNumeric(name) {
return false
}
return true
}
func validUserName(name string) bool {
if !validAdminUserName(name) {
return false
}
switch name {
case "", "admin", "webmaster", "postmaster", "info", "root", "news", "trantor", "librarian", "library", "imperial":
return false