diff --git a/internal/api/resolver_query_job.go b/internal/api/resolver_query_job.go index 0e1222445..44b6b15c4 100644 --- a/internal/api/resolver_query_job.go +++ b/internal/api/resolver_query_job.go @@ -33,15 +33,26 @@ func (r *queryResolver) FindJob(ctx context.Context, input FindJobInput) (*Job, } func jobToJobModel(j job.Job) *Job { + subTasks := make([]string, len(j.Details)) + for i, t := range j.Details { + subTasks[i] = sanitiseWebsocketString(t) + } + + var jobError *string + if j.Error != nil { + s := sanitiseWebsocketString(*j.Error) + jobError = &s + } + ret := &Job{ ID: strconv.Itoa(j.ID), Status: JobStatus(j.Status), - Description: j.Description, - SubTasks: j.Details, + Description: sanitiseWebsocketString(j.Description), + SubTasks: subTasks, StartTime: j.StartTime, EndTime: j.EndTime, AddTime: j.AddTime, - Error: j.Error, + Error: jobError, } if j.Progress != -1 { diff --git a/internal/api/resolver_subscription_logging.go b/internal/api/resolver_subscription_logging.go index 423fa88af..b4acb534c 100644 --- a/internal/api/resolver_subscription_logging.go +++ b/internal/api/resolver_subscription_logging.go @@ -2,11 +2,19 @@ package api import ( "context" + "strings" "github.com/stashapp/stash/internal/log" "github.com/stashapp/stash/internal/manager" ) +// sanitiseWebsocketString is used to ensure that any strings sent over the websocket are valid UTF-8. +// Any invalid UTF-8 sequences will be replaced with the Unicode replacement character (U+FFFD). +// Invalid UTF-8 sequences can cause the websocket connection to be closed. +func sanitiseWebsocketString(s string) string { + return strings.ToValidUTF8(s, "\uFFFD") +} + func getLogLevel(logType string) LogLevel { switch logType { case "progress": @@ -33,7 +41,7 @@ func logEntriesFromLogItems(logItems []log.LogItem) []*LogEntry { ret[i] = &LogEntry{ Time: entry.Time, Level: getLogLevel(entry.Type), - Message: entry.Message, + Message: sanitiseWebsocketString(entry.Message), } }