/ pkg / web / network.go
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, &ethernetNetwork); 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  }