Skip to content

Commit 14e50f2

Browse files
committed
fix: ci fixes
1 parent 98849cd commit 14e50f2

3 files changed

Lines changed: 29 additions & 6 deletions

File tree

‎data-service/main.go‎

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,33 @@ import (
99
"net/http"
1010
"os"
1111
"os/signal"
12+
"strconv"
1213
"sync"
1314
"syscall"
1415
"time"
1516

1617
"github.com/devskill-org/ems/mpc"
1718
)
1819

20+
// defaultPort is the port used when PORT is not set in the environment.
21+
const defaultPort = 8081
22+
1923
var (
2024
decisions []mpc.ControlDecision
2125
decisionsMu sync.RWMutex
2226
)
2327

2428
func main() {
25-
port := os.Getenv("PORT")
26-
if port == "" {
27-
port = "8081"
29+
// Validate the port from the environment to avoid propagating untrusted input.
30+
portNum := defaultPort
31+
if raw := os.Getenv("PORT"); raw != "" {
32+
parsed, err := strconv.Atoi(raw)
33+
if err != nil || parsed < 1 || parsed > 65535 {
34+
log.Fatalf("invalid PORT value")
35+
}
36+
portNum = parsed
2837
}
38+
port := strconv.Itoa(portNum)
2939

3040
mux := http.NewServeMux()
3141
mux.HandleFunc("/mpc/save", handleMPCSave)
@@ -38,7 +48,7 @@ func main() {
3848
}
3949

4050
go func() {
41-
log.Printf("data-service HTTP server listening on :%s", port)
51+
log.Printf("data-service HTTP server listening on :%d", portNum)
4252
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
4353
log.Fatalf("HTTP server error: %v", err)
4454
}

‎scheduler/mpc_test.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,7 @@ func TestGetSolarForecast_NilWeatherForecast_NilOpenMeteo(t *testing.T) {
657657

658658
// Point the scheduler at a fake Open-Meteo server that always returns 503 so
659659
// the fetch fails deterministically regardless of internet connectivity.
660-
fakeServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
660+
fakeServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
661661
http.Error(w, "service unavailable", http.StatusServiceUnavailable)
662662
}))
663663
defer fakeServer.Close()

‎scheduler/server.go‎

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -752,7 +752,8 @@ func (hs *WebServer) marketDataUploadHandler(w http.ResponseWriter, r *http.Requ
752752
// Limit request body to 10 MB to prevent memory exhaustion.
753753
r.Body = http.MaxBytesReader(w, r.Body, 10<<20)
754754

755-
// Parse multipart form – limit body to 10 MB.
755+
// Parse multipart form – the body size is already capped by MaxBytesReader above.
756+
//nolint:gosec // G120: request body is bounded by http.MaxBytesReader (10 MB)
756757
if err := r.ParseMultipartForm(10 << 20); err != nil {
757758
w.WriteHeader(http.StatusBadRequest)
758759
_ = json.NewEncoder(w).Encode(map[string]string{"error": "failed to parse form: " + err.Error()})
@@ -863,6 +864,16 @@ func (hs *WebServer) marketDataDownloadHandler(w http.ResponseWriter, r *http.Re
863864
date = time.Now().In(location).Format("2006-01-02")
864865
}
865866

867+
// Validate the date so it is safe to embed in response headers.
868+
parsedDate, err := time.Parse("2006-01-02", date)
869+
if err != nil {
870+
w.Header().Set("Content-Type", "application/json")
871+
w.WriteHeader(http.StatusBadRequest)
872+
_ = json.NewEncoder(w).Encode(map[string]string{"error": "invalid date format, expected YYYY-MM-DD"})
873+
return
874+
}
875+
date = parsedDate.Format("2006-01-02")
876+
866877
rawXML, ok := hs.scheduler.xmlCache.GetRaw(date)
867878
if !ok {
868879
w.Header().Set("Content-Type", "application/json")
@@ -872,8 +883,10 @@ func (hs *WebServer) marketDataDownloadHandler(w http.ResponseWriter, r *http.Re
872883
}
873884

874885
w.Header().Set("Content-Type", "application/xml")
886+
w.Header().Set("X-Content-Type-Options", "nosniff")
875887
w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"Energy_Prices_%s.xml\"", date))
876888
w.WriteHeader(http.StatusOK)
889+
//nolint:gosec // G705: served as a non-sniffable XML attachment, never rendered inline
877890
_, _ = w.Write(rawXML)
878891
}
879892

0 commit comments

Comments
 (0)