diff --git a/server/AyaNova/ControllerHelpers/ApiServerState.cs b/server/AyaNova/ControllerHelpers/ApiServerState.cs index cbaf0038..11070f71 100644 --- a/server/AyaNova/ControllerHelpers/ApiServerState.cs +++ b/server/AyaNova/ControllerHelpers/ApiServerState.cs @@ -19,11 +19,11 @@ namespace AyaNova.Api.ControllerHelpers { ///Unknown state, used for parsing UNKNOWN = 0, - ///No access for anyone API completely locked down + ///No access for anyone API completely locked down. Not set by user but rather by internal server operations like importing or backup. Closed = 1, - ///Access only to API Operations routes + ///Access only to API Operations routes. Can be set by Ops user OpsOnly = 2, - ///Open for all users (default) + ///Open for all users (default). Can be set by Ops user Open = 3 } diff --git a/server/AyaNova/Controllers/ServerStateController.cs b/server/AyaNova/Controllers/ServerStateController.cs index b231cd66..d912141e 100644 --- a/server/AyaNova/Controllers/ServerStateController.cs +++ b/server/AyaNova/Controllers/ServerStateController.cs @@ -62,27 +62,22 @@ namespace AyaNova.Api.Controllers [Authorize] public async Task PostServerState([FromBody] ServerStateModel state) { - if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.ServerState)) - { - return StatusCode(403, new ApiNotAuthorizedResponse()); - } + if (serverState.IsClosed)//no state change allowed when closed + return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - if (serverState.IsSystemLocked)//no state change allowed when system locked, must correct the problem first - { - return StatusCode(503, new ApiErrorResponse(ApiErrorCode.API_CLOSED, null, serverState.Reason)); - } + if (!Authorized.HasModifyRole(HttpContext.Items, AyaType.ServerState)) + return StatusCode(403, new ApiNotAuthorizedResponse()); if (!ModelState.IsValid) - { return BadRequest(new ApiErrorResponse(ModelState)); - } ApiServerState.ServerState desiredState; - if (!Enum.TryParse(state.ServerState, true, out desiredState)) - { - return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_INVALID_VALUE, null, "Invalid state - must be one of \"Closing\", \"Closed\", \"OpsOnly\" or \"Open\"")); - } + return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_INVALID_VALUE, null, "Invalid state - must be one of \"OpsOnly\" or \"Open\"")); + + //don't allow a server to be set to closed, that's for internal ops only + if (desiredState == ApiServerState.ServerState.Closed) + return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_INVALID_VALUE, null, "Invalid state - must be one of \"OpsOnly\" or \"Open\"")); log.LogInformation($"ServerState change request by user {UserNameFromContext.Name(HttpContext.Items)} from current state of \"{serverState.GetState().ToString()}\" to \"{desiredState.ToString()}\""); @@ -101,7 +96,7 @@ namespace AyaNova.Api.Controllers public class ServerStateModel { /// - /// One of "Closed", "OpsOnly" or "Open" + /// "OpsOnly" or "Open" /// /// [Required] diff --git a/server/AyaNova/resource/de.json b/server/AyaNova/resource/de.json index ede6f3c7..16d51a49 100644 --- a/server/AyaNova/resource/de.json +++ b/server/AyaNova/resource/de.json @@ -1635,5 +1635,8 @@ "ErrorPickListQueryInvalid":"Abfrage ungültig - Klicken Sie auf das Hilfesymbol, um weitere Informationen zu erhalten", "UserInterfaceSettings":"Benutzeroberfläche", "PickListTemplates":"Wählen Sie Listenvorlagen aus", - "ResetToDefault":"Auf Standard zurücksetzen" + "ResetToDefault":"Auf Standard zurücksetzen", + "ServerState":"Serverstatus", + "ServerStateOpen":"Öffnen", + "ServerStateOps":"Nur Systembetrieb" } diff --git a/server/AyaNova/resource/en.json b/server/AyaNova/resource/en.json index 8b38fb23..c2517296 100644 --- a/server/AyaNova/resource/en.json +++ b/server/AyaNova/resource/en.json @@ -1636,7 +1636,10 @@ "ErrorPickListQueryInvalid":"Query not valid - click help icon to learn more", "UserInterfaceSettings":"User interface", "PickListTemplates":"Select list templates", - "ResetToDefault":"Reset to default" + "ResetToDefault":"Reset to default", + "ServerState":"Server state", + "ServerStateOpen":"Open", + "ServerStateOps":"Server operations only" diff --git a/server/AyaNova/resource/es.json b/server/AyaNova/resource/es.json index 8f254e9a..fa55dede 100644 --- a/server/AyaNova/resource/es.json +++ b/server/AyaNova/resource/es.json @@ -1635,7 +1635,10 @@ "ErrorPickListQueryInvalid":"Consulta no válida: haga clic en el icono de ayuda para obtener más información", "UserInterfaceSettings":"Interfaz de usuario", "PickListTemplates":"Seleccionar plantillas de lista", - "ResetToDefault":"Restablecen a los predeterminados" + "ResetToDefault":"Restablecen a los predeterminados", + "ServerState":"Estado del servidor", + "ServerStateOpen":"Abrir", + "ServerStateOps":"Solo operaciones del sistema" } \ No newline at end of file diff --git a/server/AyaNova/resource/fr.json b/server/AyaNova/resource/fr.json index ea2a1720..b038ba5b 100644 --- a/server/AyaNova/resource/fr.json +++ b/server/AyaNova/resource/fr.json @@ -1633,5 +1633,8 @@ "ErrorPickListQueryInvalid": "Requête non valide - cliquez sur l'icône d'aide pour en savoir plus", "UserInterfaceSettings": "Interface utilisateur", "PickListTemplates": "Sélectionner des modèles de liste", - "ResetToDefault": "Rétablir la valeur par défaut" + "ResetToDefault": "Rétablir la valeur par défaut", + "ServerState":"État du serveur", + "ServerStateOpen":"Ouvrir", + "ServerStateOps":"Opérations système uniquement" } \ No newline at end of file