Explorar o código

added DB support

Alan Yeung %!s(int64=2) %!d(string=hai) anos
pai
achega
7d05532659
Modificáronse 4 ficheiros con 125 adicións e 11 borrados
  1. 5 0
      agi.go
  2. 1 0
      go.mod
  3. 1 0
      go.sum
  4. 118 11
      mod/agi/external.agi.go

+ 5 - 0
agi.go

@@ -74,5 +74,10 @@ func AGIInit() {
 
 	http.HandleFunc("/api/ajgi/exec", gw.HandleAgiExecutionRequestWithToken)
 
+	// external AGI related functions
+	http.HandleFunc("/api/ajgi/listExt", gw.ListExternalEndpoint)
+	http.HandleFunc("/api/ajgi/addExt", gw.AddExternalEndPoint)
+	http.HandleFunc("/api/ajgi/rmExt", gw.RemoveExternalEndPoint)
+
 	AGIGateway = gw
 }

+ 1 - 0
go.mod

@@ -50,6 +50,7 @@ require (
 	github.com/go-git/go-billy/v5 v5.3.1 // indirect
 	github.com/golang/protobuf v1.5.2 // indirect
 	github.com/golang/snappy v0.0.4 // indirect
+	github.com/google/uuid v1.3.0 // indirect
 	github.com/gopherjs/gopherjs v1.17.2 // indirect
 	github.com/gorilla/securecookie v1.1.1 // indirect
 	github.com/hashicorp/errwrap v1.1.0 // indirect

+ 1 - 0
go.sum

@@ -260,6 +260,7 @@ github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLe
 github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
 github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
 github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
 github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=

+ 118 - 11
mod/agi/external.agi.go

@@ -2,6 +2,7 @@ package agi
 
 import (
 	"encoding/json"
+	"fmt"
 	"io/ioutil"
 	"log"
 	"net/http"
@@ -9,9 +10,15 @@ import (
 	"strings"
 	"time"
 
+	"github.com/google/uuid"
 	"imuslab.com/arozos/mod/common"
 )
 
+type endpointFormat struct {
+	Username string `json:"username"`
+	Path     string `json:"path"`
+}
+
 //Handle request from EXTERNAL RESTFUL API
 func (g *Gateway) ExtAPIHandler(w http.ResponseWriter, r *http.Request) {
 	// get db
@@ -33,21 +40,15 @@ func (g *Gateway) ExtAPIHandler(w http.ResponseWriter, r *http.Request) {
 	}
 
 	// check if UUID exists in the database
-	if sysdb.KeyExists("external_agi", subpathElements[1]) {
+	// get the info from the database
+	data, isExist := g.checkIfExternalEndpointExist(subpathElements[1])
+	if !isExist {
 		common.SendErrorResponse(w, "Bad Request, invaild UUID entered")
 		return
 	}
 
-	// get the info from the database
-	var dat struct {
-		Username string `json:"username"`
-		Path     string `json:"path"`
-	}
-	jsonData := ""
-	sysdb.Read("external_agi", subpathElements[1], &jsonData)
-	json.Unmarshal([]byte(jsonData), &dat)
-	usernameFromDb := dat.Username
-	pathFromDb := dat.Path
+	usernameFromDb := data.Username
+	pathFromDb := data.Path
 
 	// get the userinfo and the realPath
 	userInfo, err := g.Option.UserHandler.GetUserInfoFromUsername(usernameFromDb)
@@ -77,3 +78,109 @@ func (g *Gateway) ExtAPIHandler(w http.ResponseWriter, r *http.Request) {
 	log.Println("[Remote AGI] IP:", r.RemoteAddr, " executed the script ", pathFromDb, "(", realPath, ")", " on behalf of", userInfo.Username, "with total duration: ", duration)
 
 }
+
+func (g *Gateway) AddExternalEndPoint(w http.ResponseWriter, r *http.Request) {
+	userInfo, _ := g.Option.UserHandler.GetUserInfoFromRequest(w, r)
+	// get db
+	sysdb := g.Option.UserHandler.GetDatabase()
+	if !sysdb.TableExists("external_agi") {
+		sysdb.NewTable("external_agi")
+	}
+	var dat endpointFormat
+
+	// uuid: [path, id]
+	path, _ := common.Mv(r, "path", false)
+	id := uuid.New().String()
+
+	dat.Path = path
+	dat.Username = userInfo.Username
+
+	jsonStr, _ := json.Marshal(dat)
+
+	sysdb.Write("external_agi", id, string(jsonStr))
+}
+
+func (g *Gateway) RemoveExternalEndPoint(w http.ResponseWriter, r *http.Request) {
+	userInfo, err := g.Option.UserHandler.GetUserInfoFromRequest(w, r)
+	if err != nil {
+		common.SendErrorResponse(w, "Bad User")
+		return
+	}
+
+	// get db
+	sysdb := g.Option.UserHandler.GetDatabase()
+	if !sysdb.TableExists("external_agi") {
+		sysdb.NewTable("external_agi")
+	}
+	// get path
+	uuid, _ := common.Mv(r, "uuid", false)
+	data, isExist := g.checkIfExternalEndpointExist(uuid)
+	if !isExist {
+		common.SendErrorResponse(w, "UUID does not exists in the database!")
+		return
+	}
+
+	if data.Username != userInfo.Username {
+		common.SendErrorResponse(w, "Bad Request, you have no permission to access this UUID entry!")
+		return
+	}
+
+	sysdb.Delete("external_agi", uuid)
+
+	common.SendOK(w)
+}
+
+func (g *Gateway) ListExternalEndpoint(w http.ResponseWriter, r *http.Request) {
+	userInfo, err := g.Option.UserHandler.GetUserInfoFromRequest(w, r)
+	if err != nil {
+		common.SendErrorResponse(w, "Bad User")
+		return
+	}
+
+	// get db
+	sysdb := g.Option.UserHandler.GetDatabase()
+	if !sysdb.TableExists("external_agi") {
+		sysdb.NewTable("external_agi")
+	}
+
+	// declare variable for return
+	dataFromDB := make(map[string]endpointFormat)
+
+	// O(n) method to do the lookup
+	entries, _ := sysdb.ListTable("external_agi")
+	for _, keypairs := range entries {
+		//Decode the string
+		var dataFromResult endpointFormat
+		result := ""
+		uuid := string(keypairs[0])
+		json.Unmarshal(keypairs[1], &result)
+		fmt.Println(result)
+		json.Unmarshal([]byte(result), &dataFromResult)
+		if dataFromResult.Username == userInfo.Username {
+			dataFromDB[uuid] = dataFromResult
+		}
+	}
+
+	returnJson, _ := json.Marshal(dataFromDB)
+
+	sendJSONResponse(w, string(returnJson))
+}
+
+func (g *Gateway) checkIfExternalEndpointExist(uuid string) (endpointFormat, bool) {
+	// get db
+	sysdb := g.Option.UserHandler.GetDatabase()
+	if !sysdb.TableExists("external_agi") {
+		sysdb.NewTable("external_agi")
+	}
+	var dat endpointFormat
+
+	if !sysdb.KeyExists("external_agi", uuid) {
+		return dat, false
+	}
+
+	jsonData := ""
+	sysdb.Read("external_agi", uuid, &jsonData)
+	json.Unmarshal([]byte(jsonData), &dat)
+
+	return dat, true
+}