diff --git a/front/src/AppNavBar.vue b/front/src/AppNavBar.vue index bbae086..0bc1a3d 100644 --- a/front/src/AppNavBar.vue +++ b/front/src/AppNavBar.vue @@ -21,13 +21,13 @@ const appInfo = ref(null); const appInfoErr = ref(null); - async function logInIfDemoMode(demoMode) { + async function logInIfDemoMode(demoMode, demoUsername) { if (!demoMode) { return; } const demouser = ref({ - username: "demo", + username: demoUsername, password: "" }); const res = await postLogin(demouser) @@ -37,7 +37,7 @@ onMounted(() => { getAppInfo(appInfo, appInfoErr) - .then(() => logInIfDemoMode(appInfo.value.demoMode)); + .then(() => logInIfDemoMode(appInfo.value.demoMode, appInfo.value.demoUsername)); }) diff --git a/internal/config/config.go b/internal/config/config.go index 38bfe51..792582b 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -20,7 +20,8 @@ type Config struct { Limit int `toml:"limit" default:"100" comment:"A single API call will return at most this number of records."` InventaireUrl string `toml:"inventaire-url" default:"https://inventaire.io" comment:"An inventaire.io instance URL."` DisableRegistration bool `toml:"disable-registration" default:"false" comment:"Disable new account creation."` - DemoMode bool `toml:"demo-mode" default:"false" comment:"Activate demo mode: anyone connecting to the instance will be logged in as user 'demo'"` + DemoMode bool `toml:"demo-mode" default:"false" comment:"Activate demo mode: anyone connecting to the instance will be logged in as a single user."` + DemoUsername string `toml:"demo-username" default:"demo" comment:"Name of the single user used for the demo."` AddUser UserListAsStrings `toml:"add-user" short:"a" comment:"Add an user on startup following htpasswd bcrypt format, example: [\"demo:$2y$10$UHR2646SZo2W.Rhna7bn5eWNLXWJZ/Sa3oLd9RlxlXs57Bwp6isOS\",\"user:$2y$10$3WYUp.VDpzJRywtrxO1s/uWfUIKpTE4yh5B1d2RCef3hvczYbEWTC\"]"` } @@ -46,6 +47,7 @@ func defaultConfig() Config { InventaireUrl: "https://inventaire.io", DisableRegistration: false, DemoMode: false, + DemoUsername: "demo", AddUser: []string{}, } } diff --git a/internal/createuser/createuser.go b/internal/createuser/createuser.go index 3a3e9fc..8938f8e 100644 --- a/internal/createuser/createuser.go +++ b/internal/createuser/createuser.go @@ -4,6 +4,7 @@ import ( "errors" "fmt" "net/http" + "slices" "strings" "git.artlef.fr/PersonalLibraryManager/internal/config" @@ -53,6 +54,11 @@ func CreateDefaultUsers(db *gorm.DB, config *config.Config) error { usernames = append(usernames, splittedString[0]) usersPasswordMap[splittedString[0]] = splittedString[1] } + if !slices.Contains(usernames, config.DemoUsername) { + usernames = append(usernames, config.DemoUsername) + usersPasswordMap[config.DemoUsername] = "" + + } var existingUsers []model.User err := db.Where("name IN ?", usernames).Find(&existingUsers).Error diff --git a/internal/dto/out.go b/internal/dto/out.go index 28381a1..adc0443 100644 --- a/internal/dto/out.go +++ b/internal/dto/out.go @@ -1,8 +1,9 @@ package dto type AppInfo struct { - RegistrationDisabled bool `json:"registrationDisabled"` - DemoMode bool `json:"demoMode"` + RegistrationDisabled bool `json:"registrationDisabled"` + DemoMode bool `json:"demoMode"` + DemoUsername string `json:"demoUsername"` } type BookGet struct { diff --git a/internal/routes/appinfo.go b/internal/routes/appinfo.go index e91c8ab..c7c255c 100644 --- a/internal/routes/appinfo.go +++ b/internal/routes/appinfo.go @@ -11,5 +11,6 @@ func GetAppInfo(ac appcontext.AppContext) { ac.C.JSON(http.StatusOK, dto.AppInfo{ RegistrationDisabled: ac.Config.DisableRegistration, DemoMode: ac.Config.DemoMode, + DemoUsername: ac.Config.DemoUsername, }) } diff --git a/internal/routes/userlogin.go b/internal/routes/userlogin.go index 14b297b..7de83dd 100644 --- a/internal/routes/userlogin.go +++ b/internal/routes/userlogin.go @@ -34,7 +34,7 @@ func PostLoginHandler(ac appcontext.AppContext) { } username = user.Username } else { - username = "demo" + username = ac.Config.DemoUsername } var jwtToken string