| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 | package controllerimport (	//	"fmt"	// "github.com/davecgh/go-spew/spew"	"encoding/json"	"errors"	"net/http"	"github.com/gorilla/mux"	"github.com/gravitl/netmaker/database"	"github.com/gravitl/netmaker/functions"	"github.com/gravitl/netmaker/models"	"github.com/gravitl/netmaker/servercfg"	"github.com/gravitl/netmaker/serverctl"	"golang.zx2c4.com/wireguard/wgctrl/wgtypes")func intClientHandlers(r *mux.Router) {	r.HandleFunc("/api/intclient/{clientid}", securityCheck(false, http.HandlerFunc(getIntClient))).Methods("GET")	r.HandleFunc("/api/intclients", securityCheck(false, http.HandlerFunc(getAllIntClients))).Methods("GET")	r.HandleFunc("/api/intclients/deleteall", securityCheck(false, http.HandlerFunc(deleteAllIntClients))).Methods("DELETE")	r.HandleFunc("/api/intclient/{clientid}", securityCheck(false, 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	}	data, err := json.Marshal(&client)	if err != nil {		return client, err	}	if err = database.Insert(client.ClientID, string(data), database.INT_CLIENTS_TABLE_NAME); 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)}
 |