| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 | package mainimport (	"encoding/json"	"log"	"net/http"	"strings"	wifi "imuslab.com/arozos/mod/network/wifi"	prout "imuslab.com/arozos/mod/prouter")/*	Network WiFi Module	This module handle wifi connections and scanning on the devices that support wpa_supplicant like the Raspberry Pi	Require service launch with Dbus (Work well on stock Raspberry Pi OS)*/var (	wifiManager *wifi.WiFiManager)func WiFiInit() {	//Start the Wifi Manager	wifiManager = wifi.NewWiFiManager(sysdb, sudo_mode, *wpa_supplicant_path, *wan_interface_name)	//Only activate script on linux and if hardware management is enabled	router := prout.NewModuleRouter(prout.RouterOption{		ModuleName:  "System Setting",		AdminOnly:   true,		UserHandler: userHandler,		DeniedHandler: func(w http.ResponseWriter, r *http.Request) {			sendErrorResponse(w, "Permission Denied")		},	})	//Allow hardware management. Generate the endpoint for WiFi Control	if *allow_hardware_management {		//Register endpoints		router.HandleFunc("/system/network/scanWifi", network_wifi_handleScan)		router.HandleFunc("/system/network/connectWifi", network_wifi_handleConnect)		router.HandleFunc("/system/network/removeWifi", network_wifi_handleWiFiRemove)		router.HandleFunc("/system/network/wifiinfo", network_wifi_handleWiFiInfo)		//Sudo mode only for wifi toggle		if sudo_mode {			router.HandleFunc("/system/network/power", network_wifi_handleWiFiPower)		}		//Register WiFi Settings if system have WiFi interface		wlanInterfaces, _ := wifiManager.GetWirelessInterfaces()		if len(wlanInterfaces) > 0 {			//Contain at least 1 wireless interface Register System Settings			registerSetting(settingModule{				Name:     "WiFi Info",				Desc:     "Current Connected WiFi Information",				IconPath: "SystemAO/network/img/WiFi.png",				Group:    "Network",				StartDir: "SystemAO/network/wifiinfo.html",			})			registerSetting(settingModule{				Name:         "WiFi Settings",				Desc:         "Setup WiFi Conenctions",				IconPath:     "SystemAO/network/img/WiFi.png",				Group:        "Network",				StartDir:     "SystemAO/network/wifi.html",				RequireAdmin: true,			})		}	}}func network_wifi_handleWiFiPower(w http.ResponseWriter, r *http.Request) {	//Require admin permission to scan and connect wifi	user, err := userHandler.GetUserInfoFromRequest(w, r)	if err != nil {		sendErrorResponse(w, "Internal Server Error")		return	}	if !user.IsAdmin() {		sendErrorResponse(w, "Permission Denied")		return	}	status, _ := mv(r, "status", true)	if status == "" {		//Show current power status		infs, err := wifiManager.GetWirelessInterfaces()		if err != nil {			sendErrorResponse(w, err.Error())			return		}		type WlanInterfaceStatus struct {			Name    string			Running bool		}		results := []WlanInterfaceStatus{}		for _, inf := range infs {			status, _ := wifiManager.GetInterfacePowerStatuts(strings.TrimSpace(inf))			results = append(results, WlanInterfaceStatus{				Name:    inf,				Running: status,			})		}		js, _ := json.Marshal(results);		sendJSONResponse(w, string(js))	} else {		//Change current power status		wlaninterface, err := mv(r, "interface", true)		if err != nil {			sendErrorResponse(w, "Invalid interface")			return		}		if status == "on" {			err := wifiManager.SetInterfacePower(wlaninterface, true)			if err != nil {				sendErrorResponse(w, err.Error())			} else {				sendOK(w)			}		} else if status == "off" {			err := wifiManager.SetInterfacePower(wlaninterface, false)			if err != nil {				sendErrorResponse(w, err.Error())			} else {				sendOK(w)			}		} else {			sendErrorResponse(w, "Invalid status")		}	}}func network_wifi_handleScan(w http.ResponseWriter, r *http.Request) {	//Require admin permission to scan and connect wifi	user, err := userHandler.GetUserInfoFromRequest(w, r)	if err != nil {		sendErrorResponse(w, "Internal Server Error")		return	}	if !user.IsAdmin() {		sendErrorResponse(w, "Permission Denied")		return	}	//Get a list of current on system wireless interface	wirelessInterfaces, err := wifiManager.GetWirelessInterfaces()	if err != nil {		sendErrorResponse(w, err.Error())		return	}	if len(wirelessInterfaces) == 0 {		//No wireless interface		sendErrorResponse(w, "Wireless Interface Not Found")		return	}	//Get the first ethernet interface and use it to scan nearby wifi	scannedWiFiInfo, err := wifiManager.ScanNearbyWiFi(wirelessInterfaces[0])	if err != nil {		sendErrorResponse(w, err.Error())		return	}	jsonString, _ := json.Marshal(scannedWiFiInfo)	sendJSONResponse(w, string(jsonString))}func network_wifi_handleConnect(w http.ResponseWriter, r *http.Request) {	user, err := userHandler.GetUserInfoFromRequest(w, r)	if err != nil {		sendErrorResponse(w, "Internal Server Error")		return	}	//Get information from client and create a new network config file	if !user.IsAdmin() {		sendErrorResponse(w, "Permission denied")		return	}	ssid, err := mv(r, "ESSID", true)	if err != nil {		sendErrorResponse(w, "ESSID not given")		return	}	connType, _ := mv(r, "ConnType", true)	password, _ := mv(r, "pwd", true)	log.Println("WiFi Switch Request Received. Genering Network Configuration...")	identity, err := mv(r, "identity", true)	if err != nil {		identity = ""	}	result, err := wifiManager.ConnectWiFi(ssid, password, connType, identity)	if err != nil {		sendErrorResponse(w, err.Error())		return	}	jsonString, err := json.Marshal(result)	if err != nil {		sendErrorResponse(w, err.Error())		return	}	sendJSONResponse(w, string(jsonString))	log.Println("WiFi Connected")}func network_wifi_handleWiFiRemove(w http.ResponseWriter, r *http.Request) {	//Require admin permission to scan and connect wifi	user, err := userHandler.GetUserInfoFromRequest(w, r)	if err != nil {		sendErrorResponse(w, "Internal Server Error")		return	}	if !user.IsAdmin() {		sendErrorResponse(w, "Permission Denied")		return	}	//Get ESSID from post request	ESSID, err := mv(r, "ESSID", true)	if err != nil {		sendErrorResponse(w, "ESSID not given")		return	}	err = wifiManager.RemoveWifi(ESSID)	if err != nil {		sendErrorResponse(w, err.Error())	}	sendOK(w)}func network_wifi_handleWiFiInfo(w http.ResponseWriter, r *http.Request) {	//Get and return the current conencted WiFi Information	_, err := authAgent.GetUserName(w, r)	if err != nil {		sendErrorResponse(w, "User not logged in")		return	}	ESSID, interfaceName, err := wifiManager.GetConnectedWiFi()	if err != nil {		sendErrorResponse(w, "Failed to retrieve WiFi Information")		return	}	jsonString, _ := json.Marshal(map[string]string{		"ESSID":     ESSID,		"Interface": interfaceName,	})	sendJSONResponse(w, string(jsonString))}
 |