From 7e272228ccfa87172d2f1486dd906ce18b8c3482 Mon Sep 17 00:00:00 2001 From: Akkadius Date: Sun, 16 Jun 2024 23:43:12 -0500 Subject: [PATCH] [Release] 4.9.0 --- CHANGELOG.md | 9 ++++++ boot/wire_gen.go | 6 ++-- .../src/components/modals/AppUpdateModal.vue | 4 +++ .../src/views/connections/Connections.vue | 2 +- .../src/views/connections/UserConnections.vue | 3 +- frontend/src/views/user/UserManagement.vue | 4 +++ internal/auditlog/user_event.go | 13 +++++++- internal/env/app.go | 4 +++ internal/eqemuserver/controller.go | 30 +++++++++++++++++++ .../controllers/connections_controller.go | 21 +++++-------- internal/spire/init.go | 14 +++++++++ internal/user/controller.go | 5 ++++ package.json | 2 +- 13 files changed, 97 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2606c1d9f..d0abda8af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ +## [4.9.0] 6/16/2024 + +* **Local Users** Fix issue where a locally created user may not get associated to the default database connection synchronized from the `eqemu_config.json` file. This would cause the user to not be able to log in to Spire Admin. +* **Local Users** Add information banner that explains to operators to go to the `/connections` page to manage user permissions after user creation. +* **Database Connections** Fix issue where the database connection would not display if a user had bad injected database connections. +* **Database Connections** Fix issue where deleted users would display in the database connections page. +* **Audit Logging** Add audit logging to most eqemu server administrative actions. This means if you have Discord webhooks set up for audit logging, you will now see these actions in your Discord channel. +* **Discord Webhook** Fix issue where the webhook would not update if it was empty + ## [4.8.8] 6/16/2024 **Updating** Potential fixes for certain windows users during automatic updating. diff --git a/boot/wire_gen.go b/boot/wire_gen.go index 984c3392e..246a345c8 100644 --- a/boot/wire_gen.go +++ b/boot/wire_gen.go @@ -1,6 +1,6 @@ // Code generated by Wire. DO NOT EDIT. -//go:generate go run github.com/google/wire/cmd/wire +//go:generate go run -mod=mod github.com/google/wire/cmd/wire //go:build !wireinject // +build !wireinject @@ -107,7 +107,8 @@ func InitializeApplication() (App, error) { updater := eqemuserver.NewUpdater(resolver, appLogger, config, settings, pathManagement, unzipper) clientManager := websocket.NewClientManager(appLogger) launcher := eqemuserver.NewLauncher(appLogger, config, settings, pathManagement, eqemuserverClient, clientManager) - eqemuserverController := eqemuserver.NewController(resolver, eqemuserverClient, config, pathManagement, settings, updater, launcher) + userEvent := auditlog.NewUserEvent(resolver, cache) + eqemuserverController := eqemuserver.NewController(resolver, eqemuserverClient, config, pathManagement, settings, updater, launcher, userEvent) publicController := eqemuserver.NewPublicController(resolver, eqemuserverClient, config, pathManagement, settings, updater) eqemuserverconfigController := eqemuserverconfig.NewController(config) backupController := backup.NewController(mysql, pathManagement) @@ -115,7 +116,6 @@ func InitializeApplication() (App, error) { websocketController := websocket.NewController(pathManagement, handler, clientManager, appLogger) systemController := system.NewController() bootAppControllerGroups := provideControllers(helloWorldController, controller, meController, analyticsController, connectionsController, questapiController, appController, queryController, clientfilesController, staticMapController, eqemuanalyticsController, authedController, eqemuchangelogController, assetsController, permissionsController, userController, settingsController, eqemuserverController, publicController, eqemuserverconfigController, backupController, websocketController, systemController) - userEvent := auditlog.NewUserEvent(resolver, cache) aaAbilityController := crudcontrollers.NewAaAbilityController(resolver, userEvent) aaRankController := crudcontrollers.NewAaRankController(resolver, userEvent) aaRankEffectController := crudcontrollers.NewAaRankEffectController(resolver, userEvent) diff --git a/frontend/src/components/modals/AppUpdateModal.vue b/frontend/src/components/modals/AppUpdateModal.vue index bd21ac3a0..82d8ffec1 100644 --- a/frontend/src/components/modals/AppUpdateModal.vue +++ b/frontend/src/components/modals/AppUpdateModal.vue @@ -52,6 +52,8 @@
Spire has been updated, waiting for Spire to restart to reload the page. +

+ If you are not running Spire under a process manager or akk-stack, you will need to restart it manually.
@@ -69,6 +71,7 @@ Skip Update @@ -76,6 +79,7 @@ Update diff --git a/frontend/src/views/connections/Connections.vue b/frontend/src/views/connections/Connections.vue index a47173cb7..1ca2ba519 100644 --- a/frontend/src/views/connections/Connections.vue +++ b/frontend/src/views/connections/Connections.vue @@ -343,7 +343,7 @@ export default { // user defined const r = await SpireApi.v1().get('/connections') if (r.data && r.data.data) { - this.connections = r.data.data + this.connections = r.data.data.filter(c => c.database_connection.id > 0) let isDefaultActive = true for (const c of r.data.data) { diff --git a/frontend/src/views/connections/UserConnections.vue b/frontend/src/views/connections/UserConnections.vue index 373cd8a7b..7227da7f1 100644 --- a/frontend/src/views/connections/UserConnections.vue +++ b/frontend/src/views/connections/UserConnections.vue @@ -108,7 +108,8 @@
diff --git a/frontend/src/views/user/UserManagement.vue b/frontend/src/views/user/UserManagement.vue index e675cfea8..20874f472 100644 --- a/frontend/src/views/user/UserManagement.vue +++ b/frontend/src/views/user/UserManagement.vue @@ -26,6 +26,10 @@
+ +
0 { + a.userevent.LogUserEvent(c, auditlog.EventServerStop, fmt.Sprintf("Server will stop in [%v] minutes", remainingMinutes)) + } else { + a.userevent.LogUserEvent(c, auditlog.EventServerStop, "Server stopped") + } + err = a.launcher.Stop() if err != nil { return c.JSON( @@ -1125,6 +1145,14 @@ func (a *Controller) serverRestart(c echo.Context) error { a.launcher.SetStopTypeRestarting() a.launcher.SetStopTimer(stop.Timer) + timeToStop := time.Now().Add(time.Duration(stop.Timer) * time.Second) + remainingMinutes := timeToStop.Sub(time.Now()).Round(time.Minute).Minutes() + if stop.Timer > 0 { + a.userevent.LogUserEvent(c, auditlog.EventServerRestart, fmt.Sprintf("Server will restart in [%v] minutes", remainingMinutes)) + } else { + a.userevent.LogUserEvent(c, auditlog.EventServerRestart, "Server restarted") + } + err = a.launcher.Restart() if err != nil { return c.JSON( @@ -1148,6 +1176,8 @@ func (a *Controller) serverStopCancel(c echo.Context) error { ) } + a.userevent.LogUserEvent(c, auditlog.EventServerCancelRestart, "Server stop/restart cancelled") + return c.JSON( http.StatusOK, echo.Map{"message": "Server stop cancelled successfully"}, diff --git a/internal/http/controllers/connections_controller.go b/internal/http/controllers/connections_controller.go index 8f75bc991..179e10071 100644 --- a/internal/http/controllers/connections_controller.go +++ b/internal/http/controllers/connections_controller.go @@ -652,22 +652,17 @@ func (cc *ConnectionsController) setDiscordWebhook(c echo.Context) error { ) } - if len(webhookUrl.WebhookUrl) > 0 { - conn.DiscordWebhookUrl = webhookUrl.WebhookUrl - _ = cc.db.GetSpireDb(). - Model(&conn). - Where("created_by = ? and id = ?", ctx.ID, connectionId). - Update("discord_webhook_url", webhookUrl.WebhookUrl) + conn.DiscordWebhookUrl = webhookUrl.WebhookUrl + _ = cc.db.GetSpireDb(). + Model(&conn). + Where("created_by = ? and id = ?", ctx.ID, connectionId). + Update("discord_webhook_url", webhookUrl.WebhookUrl) - return c.JSON( - http.StatusOK, - "Webhook updated successfully!", - ) - } + cc.db.PurgeUserDbCache(ctx.ID) return c.JSON( - http.StatusInternalServerError, - echo.Map{"error": "Failed to update discord webhook"}, + http.StatusOK, + "Webhook updated successfully!", ) } diff --git a/internal/spire/init.go b/internal/spire/init.go index 77683a1ae..d88d6f5ed 100644 --- a/internal/spire/init.go +++ b/internal/spire/init.go @@ -54,6 +54,11 @@ func NewInit( spireuser: spireuser, } + i.logger.Debug(). + Any("env", env.GetAppEnv()). + Any("env.IsAppEnvLocal()", env.IsAppEnvLocal()). + Msg("Init") + if env.IsAppEnvLocal() { i.Init() } @@ -70,6 +75,11 @@ func (o *Init) Init() { o.settings.LoadSettings() o.isInitialized = o.CheckIfAppInitialized() + o.logger.Debug(). + Any("o.isInitialized", o.isInitialized). + Any("o.settings", o.settings.settings). + Msg("Init") + // if we've set the app up initially but new settings have been added // let's automatically run them // otherwise these settings get populated when a user first sets up their @@ -82,6 +92,8 @@ func (o *Init) Init() { var adminUser models.User o.connections.SpireDbNoLog().Where("is_admin = 1").First(&adminUser) + o.logger.Debug().Any("adminUser", adminUser).Msg("o.isInitialized") + o.SyncDbName() if adminUser.ID > 0 { @@ -208,6 +220,8 @@ func (o *Init) CreateDefaultDatabaseConnectionFromConfig(user models.User) error } } + o.logger.Debug().Any("c", c).Msg("Connection exists, updating...") + db.Save(&c) return nil diff --git a/internal/user/controller.go b/internal/user/controller.go index 71a7a2bd5..52eecbebe 100644 --- a/internal/user/controller.go +++ b/internal/user/controller.go @@ -101,6 +101,11 @@ func (a *Controller) create(c echo.Context) error { uc.UserId = newUser.ID uc.Active = 1 uc.ServerDatabaseConnectionId = 1 + var conn models.ServerDatabaseConnection + a.db.GetSpireDb().First(&conn) + if conn.ID > 0 { + uc.ServerDatabaseConnectionId = conn.ID + } uc.CreatedBy = u.ID err = a.db.GetSpireDb().Create(&uc).Error if err != nil { diff --git a/package.json b/package.json index 08f8f6413..6bf8713c3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "spire", - "version": "4.8.8", + "version": "4.9.0", "repository": { "type": "git", "url": "https://github.com/Akkadius/spire.git"