fixed api stuff

This commit is contained in:
ACoolName 2024-05-22 19:57:02 +03:00
parent a6a63805e4
commit 106b7326f2
6 changed files with 82 additions and 28 deletions

View File

@ -81,7 +81,7 @@ func AuthorizedTo(requiredPermissions models.Permission, overwriters ...func(*gi
} }
if claims, ok := token.Claims.(*AuthClaims); ok && token.Valid { if claims, ok := token.Claims.(*AuthClaims); ok && token.Valid {
ctx.Set("claims", claims) ctx.Set("claims", claims)
if requiredPermissions&claims.Permissions != requiredPermissions && models.Admin&claims.Permissions != models.Admin { if (requiredPermissions&claims.Permissions != requiredPermissions) && (models.Admin&claims.Permissions != models.Admin) {
for _, overwrite := range overwriters { for _, overwrite := range overwriters {
if overwrite(ctx) { if overwrite(ctx) {
return return

View File

@ -51,6 +51,7 @@ func main() {
auth.LoadGroup(router.Group("/auth"), client, config) auth.LoadGroup(router.Group("/auth"), client, config)
servers.LoadGroup(router.Group("/servers"), client, config) servers.LoadGroup(router.Group("/servers"), client, config)
servers.LoadBrowsersGroup(router.Group("/browsers"), client, config) servers.LoadBrowsersGroup(router.Group("/browsers"), client, config)
servers.LoadeImagesGroup(router.Group("/images"), client, config)
router.Run("127.0.0.1:8080") router.Run("127.0.0.1:8080")
} }

View File

@ -46,7 +46,42 @@ func (con Connection) getBrowserInfo(volume volume.Volume) (*models.FileBrowserI
Id: container.ID, Id: container.ID,
OwnerId: browserInfo.OwnerId, OwnerId: browserInfo.OwnerId,
ConnectedTo: *serverInfo, ConnectedTo: *serverInfo,
Url: container.ID[:12] + "." + DOMAIN, Url: serverInfo.Id[:12] + "." + DOMAIN,
}, nil
}
func (con Connection) getBrowserInfoFromServerId(serverId string) (*models.FileBrowserInfo, error) {
serverInfo, err := con.getServerInfoFromId(serverId)
if err != nil {
return nil, err
}
containers, err := con.dockerClient.ContainerList(context.TODO(), container.ListOptions{
All: true,
Filters: filters.NewArgs(filters.Arg("label", "type=FILE_BROWSER"), filters.Arg("label", fmt.Sprintf("volume_id=%s", serverInfo.Id))),
})
if err != nil || len(containers) == 0 {
return nil, nil
}
container := containers[0]
jsonData, err := json.Marshal(container.Labels)
if err != nil {
return nil, err
}
var browserInfo ContainerLabels
err = json.Unmarshal(jsonData, &browserInfo)
if err != nil {
return nil, err
}
return &models.FileBrowserInfo{
Id: container.ID,
OwnerId: browserInfo.OwnerId,
ConnectedTo: *serverInfo,
Url: serverInfo.Id[:12] + "." + DOMAIN,
}, nil }, nil
} }
@ -62,7 +97,7 @@ func (con Connection) GetBrowsers(ctx *gin.Context) {
ctx.AbortWithError(500, err) ctx.AbortWithError(500, err)
} }
var servers []models.FileBrowserInfo var servers []models.FileBrowserInfo = make([]models.FileBrowserInfo, 0, len(volumes.Volumes))
for _, volume := range volumes.Volumes { for _, volume := range volumes.Volumes {
browserInfo, err := con.getBrowserInfo(*volume) browserInfo, err := con.getBrowserInfo(*volume)

View File

@ -2,10 +2,12 @@ package servers
import ( import (
"context" "context"
"fmt"
"strings" "strings"
"acooldomain.co/backend/auth" "acooldomain.co/backend/auth"
"acooldomain.co/backend/models" "acooldomain.co/backend/models"
"github.com/docker/docker/api/types/filters"
"github.com/docker/docker/api/types/image" "github.com/docker/docker/api/types/image"
"github.com/docker/docker/client" "github.com/docker/docker/client"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@ -13,9 +15,10 @@ import (
) )
type ImageData struct { type ImageData struct {
Id string Id string
Name string Name string
Version string Version string
DisplayName string
} }
func convertImageToImageData(imageSummary image.Summary) ImageData { func convertImageToImageData(imageSummary image.Summary) ImageData {
@ -23,13 +26,14 @@ func convertImageToImageData(imageSummary image.Summary) ImageData {
splitImageId := strings.Split(imageId, ":") splitImageId := strings.Split(imageId, ":")
imageName, imageVersion := splitImageId[0], splitImageId[1] imageName, imageVersion := splitImageId[0], splitImageId[1]
return ImageData{ return ImageData{
Id: imageId, Id: imageId,
Name: imageName, Name: imageName,
Version: imageVersion, Version: imageVersion,
DisplayName: fmt.Sprintf("%s %s", imageName, imageVersion),
} }
} }
func (con Connection) GetImages(c *gin.Context) { func (con Connection) GetImages(c *gin.Context) {
images, err := con.dockerClient.ImageList(context.TODO(), image.ListOptions{Filters: filters.NewArgs(filters.NewArg("label", "type=GAME"))}) images, err := con.dockerClient.ImageList(context.TODO(), image.ListOptions{Filters: filters.NewArgs(filters.Arg("label", "type=GAME"))})
if err != nil { if err != nil {
c.AbortWithError(500, err) c.AbortWithError(500, err)
return return
@ -50,5 +54,5 @@ func LoadeImagesGroup(group *gin.RouterGroup, mongo_client *mongo.Client, config
defer apiClient.Close() defer apiClient.Close()
connection := Connection{databaseConnection: mongo_client, dockerClient: apiClient} connection := Connection{databaseConnection: mongo_client, dockerClient: apiClient}
group.GET("/", auth.AuthorizedTo(0), connection.GetBrowsers) group.GET("/", auth.AuthorizedTo(0), connection.GetImages)
} }

View File

@ -220,6 +220,7 @@ func (con Connection) CreateServer(ctx *gin.Context) {
VolumeId: volumeResponse.Name, VolumeId: volumeResponse.Name,
DefaultPorts: request.DefaultPorts, DefaultPorts: request.DefaultPorts,
DefaultCommand: request.DefaultCommand, DefaultCommand: request.DefaultCommand,
Nickname: request.Nickname,
}) })
ctx.JSON(200, volumeResponse.Name) ctx.JSON(200, volumeResponse.Name)
@ -297,8 +298,12 @@ func (con Connection) StartServer(ctx *gin.Context) {
portMapping[nat.Port(fmt.Sprintf("%d/%s", portCouple.Source.Number, portCouple.Source.Protocol))] = []nat.PortBinding{{HostIP: "0.0.0.0", HostPort: fmt.Sprint(portCouple.Destination.Number)}} portMapping[nat.Port(fmt.Sprintf("%d/%s", portCouple.Source.Number, portCouple.Source.Protocol))] = []nat.PortBinding{{HostIP: "0.0.0.0", HostPort: fmt.Sprint(portCouple.Destination.Number)}}
} }
} }
command := request.Command
if command == "" {
command = serverInfo.DefaultCommand
}
words, err := shellwords.Split(request.Command) words, err := shellwords.Split(command)
if err != nil { if err != nil {
ctx.AbortWithError(500, err) ctx.AbortWithError(500, err)
return return
@ -391,7 +396,7 @@ func (con Connection) GetServers(ctx *gin.Context) {
if err != nil { if err != nil {
ctx.AbortWithError(500, err) ctx.AbortWithError(500, err)
} }
var servers []models.ServerInfo var servers []models.ServerInfo = make([]models.ServerInfo, 0, len(volumes.Volumes))
for _, volume := range volumes.Volumes { for _, volume := range volumes.Volumes {
serverInfo, err := con.getServerInfo(*volume) serverInfo, err := con.getServerInfo(*volume)
if err != nil { if err != nil {
@ -435,8 +440,7 @@ func (con Connection) DeleteServer(ctx *gin.Context) {
} }
for _, containerInstance := range containers { for _, containerInstance := range containers {
con.dockerClient.ContainerStop(context.TODO(), containerInstance.ID, container.StopOptions{}) err := con.dockerClient.ContainerRemove(context.TODO(), containerInstance.ID, container.RemoveOptions{Force: true})
err := con.dockerClient.ContainerRemove(context.TODO(), containerInstance.ID, container.RemoveOptions{Force: true, RemoveLinks: true})
if err != nil { if err != nil {
ctx.AbortWithError(500, err) ctx.AbortWithError(500, err)
return return
@ -462,7 +466,7 @@ func (con Connection) RunCommand(ctx *gin.Context) {
serverId := ctx.Param("server_id") serverId := ctx.Param("server_id")
log.Print("Writing command \"", request.Command, "\"") log.Print("Writing command \"", request.Command, "\"")
containers, err := con.dockerClient.ContainerList(context.TODO(), container.ListOptions{Filters: filters.NewArgs(filters.Arg("label", "volume_id="+serverId))}) containers, err := con.dockerClient.ContainerList(context.TODO(), container.ListOptions{Filters: filters.NewArgs(filters.Arg("label", "volume_id="+serverId), filters.Arg("label", "type=GAME"))})
if err != nil { if err != nil {
ctx.AbortWithError(500, err) ctx.AbortWithError(500, err)
return return
@ -470,11 +474,11 @@ func (con Connection) RunCommand(ctx *gin.Context) {
for _, containerData := range containers { for _, containerData := range containers {
hijacked, err := con.dockerClient.ContainerAttach(context.TODO(), containerData.ID, container.AttachOptions{Stream: true, Stdin: true}) hijacked, err := con.dockerClient.ContainerAttach(context.TODO(), containerData.ID, container.AttachOptions{Stream: true, Stdin: true})
defer func() { hijacked.Close(); hijacked.CloseWrite() }()
if err != nil { if err != nil {
ctx.AbortWithError(500, err) ctx.AbortWithError(500, err)
return return
} }
defer func() { hijacked.Close(); hijacked.CloseWrite() }()
number, err := hijacked.Conn.Write([]byte(request.Command + "\n")) number, err := hijacked.Conn.Write([]byte(request.Command + "\n"))
log.Print("Wrote ", number, " bytes") log.Print("Wrote ", number, " bytes")
if err != nil { if err != nil {
@ -684,14 +688,14 @@ func (con Connection) BrowseServer(ctx *gin.Context) {
return return
} }
containers, err := con.dockerClient.ContainerList(context.TODO(), container.ListOptions{Filters: filters.NewArgs(filters.Arg("label", "type=FILE_BROWSER"), filters.Arg("label", "volume_id="+serverInfo.Id))}) browserInfo, err := con.getBrowserInfoFromServerId(serverInfo.Id)
if err != nil { if err != nil {
ctx.AbortWithError(500, err) ctx.AbortWithError(500, err)
return return
} }
if len(containers) > 0 { if browserInfo != nil {
ctx.JSON(200, "OK") ctx.JSON(200, browserInfo.Url)
return return
} }
@ -725,7 +729,17 @@ func (con Connection) BrowseServer(ctx *gin.Context) {
return return
} }
ctx.JSON(200, "OK") browserInfo, err = con.getBrowserInfoFromServerId(serverInfo.Id)
if err != nil {
ctx.AbortWithError(500, err)
return
}
if browserInfo == nil {
ctx.AbortWithError(500, fmt.Errorf("failed to open browser for server %s", serverInfo.Id))
return
}
ctx.JSON(200, browserInfo.Url)
} }
func (con Connection) serverAuthorized(permissions models.Permission) func(*gin.Context) bool { func (con Connection) serverAuthorized(permissions models.Permission) func(*gin.Context) bool {

View File

@ -18,12 +18,18 @@ type Connection struct {
connection *mongo.Client connection *mongo.Client
} }
type UserResponse struct {
Username string
Permissions models.Permission
Email string
}
func (con Connection) GetUsers(c *gin.Context) { func (con Connection) GetUsers(c *gin.Context) {
users, err := con.connection.Database("Backend").Collection("Users").Find(context.TODO(), bson.D{}) users, err := con.connection.Database("Backend").Collection("Users").Find(context.TODO(), bson.D{})
if err != nil { if err != nil {
panic(err) panic(err)
} }
var response []models.User var response []UserResponse
err = users.All(context.TODO(), &response) err = users.All(context.TODO(), &response)
@ -34,12 +40,6 @@ func (con Connection) GetUsers(c *gin.Context) {
c.IndentedJSON(http.StatusOK, response) c.IndentedJSON(http.StatusOK, response)
} }
type UserResponse struct {
Username string
Permissions models.Permission
Email string
}
func (con Connection) GetUser(c *gin.Context) { func (con Connection) GetUser(c *gin.Context) {
claims, exists := c.Get("claims") claims, exists := c.Get("claims")
if !exists { if !exists {