Browse Source

auto update script executed

Toby Chui 1 year ago
parent
commit
f5d0bad7f8

+ 1 - 0
api.go

@@ -86,6 +86,7 @@ func initAPIs() {
 	authRouter.HandleFunc("/api/gan/network/name", ganManager.HandleNetworkNaming)
 	authRouter.HandleFunc("/api/gan/network/setRange", ganManager.HandleSetRanges)
 	authRouter.HandleFunc("/api/gan/members/list", ganManager.HandleMemberList)
+	authRouter.HandleFunc("/api/gan/members/ip", ganManager.HandleMemberIP)
 	authRouter.HandleFunc("/api/gan/members/authorize", ganManager.HandleMemberAuthorization)
 	authRouter.HandleFunc("/api/gan/members/delete", ganManager.HandleMemberDelete)
 

+ 57 - 1
mod/ganserv/handlers.go

@@ -266,18 +266,74 @@ func (m *NetworkManager) HandleMemberAuthorization(w http.ResponseWriter, r *htt
 
 //Handle Delete or Add IP for a member in a network
 func (m *NetworkManager) HandleMemberIP(w http.ResponseWriter, r *http.Request) {
+	netid, err := utils.PostPara(r, "netid")
+	if err != nil {
+		utils.SendErrorResponse(w, "net id not set")
+		return
+	}
+
+	memberid, err := utils.PostPara(r, "memid")
+	if err != nil {
+		utils.SendErrorResponse(w, "memid not set")
+		return
+	}
+
 	opr, err := utils.PostPara(r, "opr")
 	if err != nil {
 		utils.SendErrorResponse(w, "opr not defined")
 		return
 	}
 
+	targetip, _ := utils.PostPara(r, "ip")
+
+	memberInfo, err := m.getNetworkMemberInfo(netid, memberid)
+	if err != nil {
+		utils.SendErrorResponse(w, err.Error())
+		return
+	}
+
 	if opr == "add" {
+		if targetip == "" {
+			utils.SendErrorResponse(w, "ip not set")
+			return
+		}
+
+		if !isValidIPAddr(targetip) {
+			utils.SendErrorResponse(w, "ip address not valid")
+			return
+		}
+
+		newIpList := append(memberInfo.IPAssignments, targetip)
+		err = m.setAssignedIps(netid, memberid, newIpList)
+		if err != nil {
+			utils.SendErrorResponse(w, err.Error())
+			return
+		}
+		utils.SendOK(w)
 
 	} else if opr == "del" {
+		if targetip == "" {
+			utils.SendErrorResponse(w, "ip not set")
+			return
+		}
 
-	} else if opr == "get" {
+		//Delete user ip from the list
+		newIpList := []string{}
+		for _, thisIp := range memberInfo.IPAssignments {
+			if thisIp != targetip {
+				newIpList = append(newIpList, thisIp)
+			}
+		}
 
+		err = m.setAssignedIps(netid, memberid, newIpList)
+		if err != nil {
+			utils.SendErrorResponse(w, err.Error())
+			return
+		}
+		utils.SendOK(w)
+	} else if opr == "get" {
+		js, _ := json.Marshal(memberInfo.IPAssignments)
+		utils.SendJSONResponse(w, string(js))
 	} else {
 		utils.SendErrorResponse(w, "unsupported opr type: "+opr)
 	}

+ 16 - 48
mod/ganserv/utils.go

@@ -1,10 +1,7 @@
 package ganserv
 
 import (
-	"fmt"
-	"math/rand"
 	"net"
-	"time"
 )
 
 //Generate all ip address from a CIDR
@@ -31,57 +28,28 @@ func inc(ip net.IP) {
 	}
 }
 
-//Validate if a network struct is correct
-func validateNetwork(n *Network) error {
-	// Check if UID is a valid 16 char random ASCII string
-	if len(n.UID) != 16 {
-		return fmt.Errorf("UID must be 16 characters long")
-	}
-	for _, r := range n.UID {
-		if r < '0' || ('9' < r && r < 'A') || ('Z' < r && r < 'a') || r > 'z' {
-			return fmt.Errorf("UID must be a 16 char random ASCII string")
-		}
-	}
-
-	// Check if Name is ASCII only
-	if !isASCII(n.Name) {
-		return fmt.Errorf("Name must be ASCII only")
-	}
-
-	// Check if Subnet is valid
-	if n.CIDR == "" {
-		return fmt.Errorf("Subnet is not set")
-	}
-	_, _, err := net.ParseCIDR(n.CIDR)
-	if err != nil {
-		//This is not a valid CIDR
-		return fmt.Errorf("CIDR is not valid")
+func isValidIPAddr(ipAddr string) bool {
+	ip := net.ParseIP(ipAddr)
+	if ip == nil {
+		return false
 	}
 
-	return nil
-}
-
-//Check if a string is ascii
-func isASCII(s string) bool {
-	for _, r := range s {
-		if r > 127 {
-			return false
-		}
-	}
 	return true
 }
 
-//Generate a new random network ID
-func newNetworkID() string {
-	rand.Seed(time.Now().UnixNano())
-
-	const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
-	const length = 16
+func ipWithinCIDR(ipAddr string, cidr string) bool {
+	// Parse the CIDR string
+	_, ipNet, err := net.ParseCIDR(cidr)
+	if err != nil {
+		return false
+	}
 
-	var result string
-	for i := 0; i < length; i++ {
-		result += string(chars[rand.Intn(len(chars))])
+	// Parse the IP address
+	ip := net.ParseIP(ipAddr)
+	if ip == nil {
+		return false
 	}
 
-	return result
+	// Check if the IP address is in the CIDR range
+	return ipNet.Contains(ip)
 }

+ 36 - 2
mod/ganserv/zerotier.go

@@ -98,9 +98,9 @@ type MemberInfo struct {
 	CreationTime                 int64         `json:"creationTime"`
 	ID                           string        `json:"id"`
 	Identity                     string        `json:"identity"`
-	IPAssignments                []interface{} `json:"ipAssignments"`
+	IPAssignments                []string      `json:"ipAssignments"`
 	LastAuthorizedCredential     interface{}   `json:"lastAuthorizedCredential"`
-	LastAuthorizedCredentialType interface{}   `json:"lastAuthorizedCredentialType"`
+	LastAuthorizedCredentialType string        `json:"lastAuthorizedCredentialType"`
 	LastAuthorizedTime           int           `json:"lastAuthorizedTime"`
 	LastDeauthorizedTime         int           `json:"lastDeauthorizedTime"`
 	NoAutoAssignIps              bool          `json:"noAutoAssignIps"`
@@ -379,6 +379,40 @@ func (m *NetworkManager) configureNetwork(networkID string, ipRangeStart string,
 	return nil
 }
 
+func (m *NetworkManager) setAssignedIps(networkID string, memid string, newIps []string) error {
+	url := "http://localhost:" + strconv.Itoa(m.apiPort) + "/controller/network/" + networkID + "/member/" + memid
+	data := map[string]interface{}{
+		"ipAssignments": newIps,
+	}
+
+	payload, err := json.Marshal(data)
+	if err != nil {
+		return err
+	}
+
+	req, err := http.NewRequest("POST", url, bytes.NewBuffer(payload))
+	if err != nil {
+		return err
+	}
+
+	req.Header.Set("Content-Type", "application/json")
+	req.Header.Set("X-ZT1-AUTH", m.authToken)
+
+	client := &http.Client{}
+	resp, err := client.Do(req)
+	if err != nil {
+		return err
+	}
+
+	defer resp.Body.Close()
+	// Print the response status code
+	if resp.StatusCode != 200 {
+		return errors.New("network error. status code: " + strconv.Itoa(resp.StatusCode))
+	}
+
+	return nil
+}
+
 func (m *NetworkManager) setNetworkNameAndDescription(netid string, name string, desc string) error {
 	// Convert string to rune slice
 	r := []rune(name)

BIN
tmp/GeoLite2-Country.mmdb


+ 67 - 3
web/components/gandetails.html

@@ -279,7 +279,71 @@
 
     //Handle delete IP from memeber
     function deleteIpFromMemeber(memberid, ip){
-        alert(ip);
+        $.ajax({
+            url: "/api/gan/members/ip",
+            metohd: "POST",
+            data: {
+                netid: currentGANetID, 
+                memid: memberid,
+                opr: "del",
+                ip: ip,
+            },
+            success: function(data){
+                if (data.error != undefined){
+                    msgbox(data.error, false, 5000);
+                }else{
+                    msgbox("IP removed from member " + memberid)
+                }
+                renderMemeberTable();
+            }
+        });
+    }
+
+    function addIpToMemeberFromInput(memberid, newip){
+        function isValidIPv4Address(address) {
+            // Split the address into its 4 components
+            const parts = address.split('.');
+            
+            // Check that there are 4 components
+            if (parts.length !== 4) {
+                return false;
+            }
+            
+            // Check that each component is a number between 0 and 255
+            for (let i = 0; i < 4; i++) {
+                const part = parseInt(parts[i], 10);
+                if (isNaN(part) || part < 0 || part > 255) {
+                return false;
+                }
+            }
+            
+            // The address is valid
+            return true;
+        }
+
+        if (!isValidIPv4Address(newip)){
+            msgbox(newip + " is not a valid IPv4 address", false, 5000)
+            return
+        }
+
+        $.ajax({
+            url: "/api/gan/members/ip",
+            metohd: "POST",
+            data: {
+                netid: currentGANetID, 
+                memid: memberid,
+                opr: "add",
+                ip: newip,
+            },
+            success: function(data){
+                if (data.error != undefined){
+                    msgbox(data.error, false, 5000);
+                }else{
+                    msgbox("IP added to member " + memberid)
+                }
+                renderMemeberTable();
+            }
+        })
     }
 
     //Member table populate
@@ -346,8 +410,8 @@
                     row.append($('<td>').text(""));
                     row.append($('<td>').html(`${assignedIp}
                         <div class="ui action mini fluid input">
-                            <input type="text" placeholder="Search...">
-                            <button class="ui basic icon button">
+                            <input type="text" placeholder="IPv4" onchange="$(this).val($(this).val().trim());">
+                            <button onclick="addIpToMemeberFromInput('${member.address}',$(this).parent().find('input').val());" class="ui basic icon button">
                                 <i class="add icon"></i>
                             </button>
                         </div>`));

+ 0 - 2
web/components/status.html

@@ -271,8 +271,6 @@
 
     function getDailySummary(){
         $.get("/api/stats/summary?fast=true", function(data){
-            console.log(data);
-            
             $("#summaryTotalCount").text(abbreviateNumber(data.TotalRequest));
             $("#summarySuccCount").text(abbreviateNumber(data.ValidRequest));
             $("#summaryErrCount").text(abbreviateNumber(data.ErrorRequest));