| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 | package controllerimport (	//	"fmt"	// "github.com/davecgh/go-spew/spew"	"errors"	"context"	"encoding/json"	"net/http"	"time"	"github.com/gorilla/mux"	"github.com/gravitl/netmaker/functions"	"github.com/gravitl/netmaker/serverctl"	"github.com/gravitl/netmaker/servercfg"	"github.com/gravitl/netmaker/models"	"github.com/gravitl/netmaker/mongoconn"	"golang.zx2c4.com/wireguard/wgctrl/wgtypes")func intClientHandlers(r *mux.Router) {	r.HandleFunc("/api/intclient/{clientid}", securityCheck(http.HandlerFunc(getIntClient))).Methods("GET")	r.HandleFunc("/api/intclients", securityCheck(http.HandlerFunc(getAllIntClients))).Methods("GET")        r.HandleFunc("/api/intclients/deleteall", securityCheck(http.HandlerFunc(deleteAllIntClients))).Methods("DELETE")        r.HandleFunc("/api/intclient/{clientid}", securityCheck(http.HandlerFunc(updateIntClient))).Methods("PUT")	r.HandleFunc("/api/intclient/register", http.HandlerFunc(registerIntClient)).Methods("POST")	r.HandleFunc("/api/intclient/{clientid}", http.HandlerFunc(deleteIntClient)).Methods("DELETE")}func getAllIntClients(w http.ResponseWriter, r *http.Request) {        w.Header().Set("Content-Type", "application/json")        clients, err := functions.GetAllIntClients()        if err != nil {                returnErrorResponse(w, r, formatError(err, "internal"))                return        }        //Return all the extclients in JSON format        w.WriteHeader(http.StatusOK)        json.NewEncoder(w).Encode(clients)}func deleteAllIntClients(w http.ResponseWriter, r *http.Request) {        w.Header().Set("Content-Type", "application/json")        err := functions.DeleteAllIntClients()        if err != nil {                returnErrorResponse(w, r, formatError(err, "internal"))                return        }        w.WriteHeader(http.StatusOK)}func deleteIntClient(w http.ResponseWriter, r *http.Request) {        w.Header().Set("Content-Type", "application/json")        // get params        var params = mux.Vars(r)        success, err := DeleteIntClient(params["clientid"])        if err != nil {                returnErrorResponse(w, r, formatError(err, "internal"))                return        } else if !success {                err = errors.New("Could not delete intclient " + params["clientid"])                returnErrorResponse(w, r, formatError(err, "internal"))                return        }        returnSuccessResponse(w, r, params["clientid"]+" deleted.")}func getIntClient(w http.ResponseWriter, r *http.Request) {        w.Header().Set("Content-Type", "application/json")        var params = mux.Vars(r)	client, err := GetIntClient(params["clientid"])        if err != nil {                returnErrorResponse(w, r, formatError(err, "internal"))                return        }        w.WriteHeader(http.StatusOK)        json.NewEncoder(w).Encode(client)}func updateIntClient(w http.ResponseWriter, r *http.Request) {        w.Header().Set("Content-Type", "application/json")        var errorResponse = models.ErrorResponse{                Code: http.StatusInternalServerError, Message: "W1R3: It's not you it's me.",        }        var clientreq models.IntClient        //get node from body of request        err := json.NewDecoder(r.Body).Decode(&clientreq)        if err != nil {                returnErrorResponse(w, r, formatError(err, "internal"))                return        }        if servercfg.IsRegisterKeyRequired() {                validKey := functions.IsKeyValidGlobal(clientreq.AccessKey)                if !validKey {                                errorResponse = models.ErrorResponse{                                        Code: http.StatusUnauthorized, Message: "W1R3: Key invalid, or none provided.",                                }                                returnErrorResponse(w, r, errorResponse)                                return                }        }        client, err := RegisterIntClient(clientreq)        if err != nil {                returnErrorResponse(w, r, formatError(err, "internal"))                return        }        w.WriteHeader(http.StatusOK)        json.NewEncoder(w).Encode(client)}func RegisterIntClient(client models.IntClient) (models.IntClient, error) {	if client.PrivateKey == "" {		privateKey, err := wgtypes.GeneratePrivateKey()		if err != nil {			return client, err		}		client.PrivateKey = privateKey.String()		client.PublicKey = privateKey.PublicKey().String()	}	if client.Address == "" {		newAddress, err := functions.UniqueAddress(client.Network)		if err != nil {			return client, err		}		if newAddress == "" {			return client, errors.New("Could not find an address.")		}		client.Address = newAddress	}        if client.Network == "" { client.Network = "comms" }	server, err := serverctl.GetServerWGConf()        //spew.Dump(server)	if err != nil {                return client, err        }	client.ServerPublicEndpoint = server.ServerPublicEndpoint        client.ServerAPIPort = server.ServerAPIPort        client.ServerPrivateAddress = server.ServerPrivateAddress        client.ServerWGPort = server.ServerWGPort        client.ServerGRPCPort = server.ServerGRPCPort        client.ServerKey = server.ServerKey        if client.ClientID == "" {                clientid := StringWithCharset(7, charset)                clientname := "client-" + clientid                client.ClientID = clientname        }	//spew.Dump(client)	collection := mongoconn.Client.Database("netmaker").Collection("intclients")	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)	// insert our network into the network table	_, err = collection.InsertOne(ctx, client)	defer cancel()	if err != nil {		return client, err	}	err = serverctl.ReconfigureServerWireGuard()	return client, err}func registerIntClient(w http.ResponseWriter, r *http.Request) {        w.Header().Set("Content-Type", "application/json")        var errorResponse = models.ErrorResponse{                Code: http.StatusInternalServerError, Message: "W1R3: It's not you it's me.",        }        var clientreq models.IntClient        //get node from body of request        err := json.NewDecoder(r.Body).Decode(&clientreq)        if err != nil {                returnErrorResponse(w, r, formatError(err, "internal"))                return        }        if servercfg.IsRegisterKeyRequired() {                validKey := functions.IsKeyValidGlobal(clientreq.AccessKey)                if !validKey {                                errorResponse = models.ErrorResponse{                                        Code: http.StatusUnauthorized, Message: "W1R3: Key invalid, or none provided.",                                }                                returnErrorResponse(w, r, errorResponse)                                return                }        }        client, err := RegisterIntClient(clientreq)        if err != nil {                returnErrorResponse(w, r, formatError(err, "internal"))                return        }        w.WriteHeader(http.StatusOK)        json.NewEncoder(w).Encode(client)}
 |