chore(go): move a couple more handlers to use generated types. For #3778

This commit is contained in:
Gabe Kangas
2025-01-18 16:24:35 -08:00
parent 6abbf8f50c
commit b3947ef7ea
2 changed files with 61 additions and 51 deletions

View File

@@ -110,18 +110,13 @@ func GetIPAddressBans(w http.ResponseWriter, r *http.Request) {
// UpdateUserEnabled enable or disable a single user by ID. // UpdateUserEnabled enable or disable a single user by ID.
func UpdateUserEnabled(w http.ResponseWriter, r *http.Request) { func UpdateUserEnabled(w http.ResponseWriter, r *http.Request) {
type blockUserRequest struct {
UserID string `json:"userId"`
Enabled bool `json:"enabled"`
}
if r.Method != http.MethodPost { if r.Method != http.MethodPost {
webutils.WriteSimpleResponse(w, false, r.Method+" not supported") webutils.WriteSimpleResponse(w, false, r.Method+" not supported")
return return
} }
decoder := json.NewDecoder(r.Body) decoder := json.NewDecoder(r.Body)
var request blockUserRequest var request generated.UpdateUserEnabledJSONBody
if err := decoder.Decode(&request); err != nil { if err := decoder.Decode(&request); err != nil {
log.Errorln(err) log.Errorln(err)
@@ -129,66 +124,72 @@ func UpdateUserEnabled(w http.ResponseWriter, r *http.Request) {
return return
} }
if request.UserID == "" { if request.UserId == nil || *request.UserId == "" || request.Enabled == nil {
webutils.WriteSimpleResponse(w, false, "must provide userId") webutils.WriteSimpleResponse(w, false, "must provide userId and enabled state")
return return
} }
userRepository := userrepository.Get() if err := updateUserStatus(request); err != nil {
// Disable/enable the user
if err := userRepository.SetEnabled(request.UserID, request.Enabled); err != nil {
log.Errorln("error changing user enabled status", err)
webutils.WriteSimpleResponse(w, false, err.Error()) webutils.WriteSimpleResponse(w, false, err.Error())
return return
} }
// Hide/show the user's chat messages if disabling. if !*request.Enabled {
// Leave hidden messages hidden to be safe. if err := handleUserDisabling(*request.UserId); err != nil {
if !request.Enabled {
if err := chat.SetMessageVisibilityForUserID(request.UserID, request.Enabled); err != nil {
log.Errorln("error changing user messages visibility", err)
webutils.WriteSimpleResponse(w, false, err.Error()) webutils.WriteSimpleResponse(w, false, err.Error())
return return
} }
} }
// Forcefully disconnect the user from the chat webutils.WriteSimpleResponse(w, true, fmt.Sprintf("%s enabled: %t", *request.UserId, *request.Enabled))
if !request.Enabled { }
clients, err := chat.GetClientsForUser(request.UserID)
if len(clients) == 0 { func updateUserStatus(request generated.UpdateUserEnabledJSONBody) error {
// Nothing to do userRepository := userrepository.Get()
return if err := userRepository.SetEnabled(*request.UserId, *request.Enabled); err != nil {
log.Errorln("error changing user enabled status", err)
return err
}
if !*request.Enabled {
if err := chat.SetMessageVisibilityForUserID(*request.UserId, *request.Enabled); err != nil {
log.Errorln("error changing user messages visibility", err)
return err
} }
}
return nil
}
if err != nil { func handleUserDisabling(userID string) error {
log.Errorln("error fetching clients for user: ", err) clients, err := chat.GetClientsForUser(userID)
webutils.WriteSimpleResponse(w, false, err.Error()) if len(clients) == 0 {
return return nil
} }
chat.DisconnectClients(clients) if err != nil {
disconnectedUser := userRepository.GetUserByID(request.UserID) log.Errorln("error fetching clients for user: ", err)
_ = chat.SendSystemAction(fmt.Sprintf("**%s** has been removed from chat.", disconnectedUser.DisplayName), true) return err
}
localIP4Address := "127.0.0.1" chat.DisconnectClients(clients)
localIP6Address := "::1" userRepository := userrepository.Get()
disconnectedUser := userRepository.GetUserByID(userID)
_ = chat.SendSystemAction(fmt.Sprintf("**%s** has been removed from chat.", disconnectedUser.DisplayName), true)
// Ban this user's IP address. localIP4Address := "127.0.0.1"
authRepository := authrepository.Get() localIP6Address := "::1"
for _, client := range clients { authRepository := authrepository.Get()
ipAddress := client.IPAddress for _, client := range clients {
if ipAddress != localIP4Address && ipAddress != localIP6Address { ipAddress := client.IPAddress
reason := fmt.Sprintf("Banning of %s", disconnectedUser.DisplayName) if ipAddress != localIP4Address && ipAddress != localIP6Address {
if err := authRepository.BanIPAddress(ipAddress, reason); err != nil { reason := fmt.Sprintf("Banning of %s", disconnectedUser.DisplayName)
log.Errorln("error banning IP address: ", err) if err := authRepository.BanIPAddress(ipAddress, reason); err != nil {
} log.Errorln("error banning IP address: ", err)
} }
} }
} }
return nil
webutils.WriteSimpleResponse(w, true, fmt.Sprintf("%s enabled: %t", request.UserID, request.Enabled))
} }
// GetDisabledUsers will return all the disabled users. // GetDisabledUsers will return all the disabled users.
@@ -282,13 +283,19 @@ func SendSystemMessageToConnectedClient(integration models.ExternalAPIUser, w ht
return return
} }
var message events.SystemMessageEvent // var message events.SystemMessageEvent
var message generated.SendSystemMessageJSONRequestBody
if err := json.NewDecoder(r.Body).Decode(&message); err != nil { if err := json.NewDecoder(r.Body).Decode(&message); err != nil {
webutils.InternalErrorHandler(w, err) webutils.InternalErrorHandler(w, err)
return return
} }
chat.SendSystemMessageToClient(uint(clientIDNumeric), message.Body) if message.Body == nil {
webutils.WriteSimpleResponse(w, false, "no message body provided")
return
}
chat.SendSystemMessageToClient(uint(clientIDNumeric), *message.Body)
webutils.WriteSimpleResponse(w, true, "sent") webutils.WriteSimpleResponse(w, true, "sent")
} }

View File

@@ -11,6 +11,7 @@ import (
"github.com/owncast/owncast/models" "github.com/owncast/owncast/models"
"github.com/owncast/owncast/persistence/configrepository" "github.com/owncast/owncast/persistence/configrepository"
"github.com/owncast/owncast/persistence/userrepository" "github.com/owncast/owncast/persistence/userrepository"
"github.com/owncast/owncast/webserver/handlers/generated"
webutils "github.com/owncast/owncast/webserver/utils" webutils "github.com/owncast/owncast/webserver/utils"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@@ -51,18 +52,20 @@ func RegisterFediverseOTPRequest(u models.User, w http.ResponseWriter, r *http.R
// VerifyFediverseOTPRequest verifies the given OTP code for the given access token. // VerifyFediverseOTPRequest verifies the given OTP code for the given access token.
func VerifyFediverseOTPRequest(w http.ResponseWriter, r *http.Request) { func VerifyFediverseOTPRequest(w http.ResponseWriter, r *http.Request) {
type request struct { var req generated.VerifyFediverseOTPRequestJSONBody
Code string `json:"code"`
if req.Code == nil {
webutils.WriteSimpleResponse(w, false, "Could not decode request: code is required")
return
} }
var req request
decoder := json.NewDecoder(r.Body) decoder := json.NewDecoder(r.Body)
if err := decoder.Decode(&req); err != nil { if err := decoder.Decode(&req); err != nil {
webutils.WriteSimpleResponse(w, false, "Could not decode request: "+err.Error()) webutils.WriteSimpleResponse(w, false, "Could not decode request: "+err.Error())
return return
} }
accessToken := r.URL.Query().Get("accessToken") accessToken := r.URL.Query().Get("accessToken")
valid, authRegistration := fediverseauth.ValidateFediverseOTP(accessToken, req.Code) valid, authRegistration := fediverseauth.ValidateFediverseOTP(accessToken, *req.Code)
if !valid { if !valid {
w.WriteHeader(http.StatusForbidden) w.WriteHeader(http.StatusForbidden)
return return