network.go
1 package web 2 3 import ( 4 "encoding/json" 5 "io" 6 "log" 7 "net/http" 8 9 dogeboxd "github.com/dogeorg/dogeboxd/pkg" 10 ) 11 12 func (t api) getNetwork(w http.ResponseWriter, r *http.Request) { 13 sendResponse(w, map[string]any{ 14 "success": true, 15 "networks": t.dbx.NetworkManager.GetAvailableNetworks(), 16 }) 17 } 18 19 func (t api) connectNetwork(w http.ResponseWriter, r *http.Request) { 20 nixPatch := t.nix.NewPatch(dogeboxd.NewConsoleSubLogger("internal", "set network")) 21 22 err := t.dbx.NetworkManager.TryConnect(nixPatch) 23 // Chances are we'll never actually get here, because you'll probably be disconnected 24 // from the box once (if) it changes networks, and your connection will break. 25 if err != nil { 26 log.Printf("Failed to connect to network: %+v", err) 27 sendErrorResponse(w, http.StatusInternalServerError, "Failed to connect to network") 28 return 29 } 30 31 if err := nixPatch.Apply(); err != nil { 32 log.Printf("Failed to apply nix patch: %+v", err) 33 sendErrorResponse(w, http.StatusInternalServerError, "Failed to apply nix patch") 34 return 35 } 36 37 sendResponse(w, map[string]bool{"success": true}) 38 } 39 40 func (t api) setPendingNetwork(w http.ResponseWriter, r *http.Request) { 41 body, err := io.ReadAll(r.Body) 42 if err != nil { 43 sendErrorResponse(w, http.StatusBadRequest, "Error reading request body") 44 return 45 } 46 defer r.Body.Close() 47 48 // Unmarshal the JSON into a map first to determine the network type 49 var rawNetwork map[string]interface{} 50 if err := json.Unmarshal(body, &rawNetwork); err != nil { 51 sendErrorResponse(w, http.StatusBadRequest, "Error parsing JSON") 52 return 53 } 54 55 var selectedNetwork dogeboxd.SelectedNetwork 56 57 // We need proper input validation here. 58 if _, ok := rawNetwork["interface"]; ok { 59 if _, ok := rawNetwork["ssid"]; ok { 60 var wifiNetwork dogeboxd.SelectedNetworkWifi 61 if err := json.Unmarshal(body, &wifiNetwork); err != nil { 62 http.Error(w, "Error parsing WiFi network JSON", http.StatusBadRequest) 63 return 64 } 65 selectedNetwork = wifiNetwork 66 } else { 67 var ethernetNetwork dogeboxd.SelectedNetworkEthernet 68 if err := json.Unmarshal(body, ðernetNetwork); err != nil { 69 http.Error(w, "Error parsing Ethernet network JSON", http.StatusBadRequest) 70 return 71 } 72 selectedNetwork = ethernetNetwork 73 } 74 } else { 75 http.Error(w, "Invalid network type", http.StatusBadRequest) 76 return 77 } 78 79 dbxs := t.sm.Get().Dogebox 80 81 // TODO: this shouldn't live in here. 82 if !dbxs.InitialState.HasSetNetwork { 83 dbxs.InitialState.HasSetNetwork = true 84 if err := t.sm.SetDogebox(dbxs); err != nil { 85 sendErrorResponse(w, http.StatusInternalServerError, "Failed to persist network set flag") 86 return 87 } 88 } 89 90 id := t.dbx.AddAction(dogeboxd.UpdatePendingSystemNetwork{Network: selectedNetwork}) 91 sendResponse(w, map[string]string{"id": id}) 92 } 93 94 func (t api) getSources(w http.ResponseWriter, r *http.Request) { 95 sources := t.sources.GetAllSourceConfigurations() 96 97 sendResponse(w, map[string]any{ 98 "success": true, 99 "sources": sources, 100 }) 101 }