diff --git a/.vscode/launch.json b/.vscode/launch.json index d134001..45b0c56 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,20 +1,20 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Launch Package", - "type": "go", - "request": "launch", - "mode": "auto", - "program": "${workspaceFolder}", - "env": { - "HOST_IP": "127.0.0.1", - "UPNP_PATH": "test.upnp", - "CONFIG_PATH": "config.json" - } - } - ] +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Launch Package", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}", + "env": { + "HOST_IP": "127.0.0.1", + "UPNP_PATH": "test.upnp", + "CONFIG_PATH": "config.json" + } + } + ] } \ No newline at end of file diff --git a/mail/mail.go b/mail/mail.go index f23b8a3..de3060d 100644 --- a/mail/mail.go +++ b/mail/mail.go @@ -1,87 +1,87 @@ -package mail - -import ( - "crypto/tls" - "fmt" - "net/mail" - "net/smtp" - - "acooldomain.co/backend/models" -) - -const EMAIL_SERVER_ENV_VAR = "EMAIL_SERVER" -const FROM_EMAIL_ENV_VAR = "FROM_EMAIL" - -var auth *smtp.Auth -var mailConfig *models.EmailConfig - -func InitializeClient(config models.EmailConfig) error { - simpleAuth := smtp.PlainAuth("", config.Username, config.Password, config.Server) - auth = &simpleAuth - mailConfig = &config - return nil -} - -func SendMail( - recipient string, - subject string, - content string, -) error { - if auth == nil { - return fmt.Errorf("mail not initialized") - } - if mailConfig == nil { - return fmt.Errorf("mail not initialized") - } - from := mail.Address{Name: "", Address: mailConfig.FromEmail} - to := mail.Address{Name: "", Address: recipient} - - headers := make(map[string]string) - headers["From"] = from.String() - headers["To"] = to.String() - headers["Subject"] = subject - - message := "" - for k, v := range headers { - message += fmt.Sprintf("%s: %s\r\n", k, v) - } - message += "\r\n" + content - - conn, err := tls.Dial("tcp", mailConfig.Server+":465", &tls.Config{ServerName: mailConfig.Server}) - if err != nil { - return err - } - - client, err := smtp.NewClient(conn, mailConfig.Server) - if err != nil { - return err - } - - if err = client.Auth(*auth); err != nil { - return err - } - - if err = client.Mail(mailConfig.FromEmail); err != nil { - return err - } - - if err = client.Rcpt(recipient); err != nil { - return err - } - - writer, err := client.Data() - if err != nil { - return err - } - - _, err = writer.Write([]byte(message)) - if err != nil { - return err - } - - if err = writer.Close(); err != nil { - return err - } - - return client.Quit() -} +package mail + +import ( + "crypto/tls" + "fmt" + "net/mail" + "net/smtp" + + "acooldomain.co/backend/models" +) + +const EMAIL_SERVER_ENV_VAR = "EMAIL_SERVER" +const FROM_EMAIL_ENV_VAR = "FROM_EMAIL" + +var auth *smtp.Auth +var mailConfig *models.EmailConfig + +func InitializeClient(config models.EmailConfig) error { + simpleAuth := smtp.PlainAuth("", config.Username, config.Password, config.Server) + auth = &simpleAuth + mailConfig = &config + return nil +} + +func SendMail( + recipient string, + subject string, + content string, +) error { + if auth == nil { + return fmt.Errorf("mail not initialized") + } + if mailConfig == nil { + return fmt.Errorf("mail not initialized") + } + from := mail.Address{Name: "", Address: mailConfig.FromEmail} + to := mail.Address{Name: "", Address: recipient} + + headers := make(map[string]string) + headers["From"] = from.String() + headers["To"] = to.String() + headers["Subject"] = subject + + message := "" + for k, v := range headers { + message += fmt.Sprintf("%s: %s\r\n", k, v) + } + message += "\r\n" + content + + conn, err := tls.Dial("tcp", mailConfig.Server+":465", &tls.Config{ServerName: mailConfig.Server}) + if err != nil { + return err + } + + client, err := smtp.NewClient(conn, mailConfig.Server) + if err != nil { + return err + } + + if err = client.Auth(*auth); err != nil { + return err + } + + if err = client.Mail(mailConfig.FromEmail); err != nil { + return err + } + + if err = client.Rcpt(recipient); err != nil { + return err + } + + writer, err := client.Data() + if err != nil { + return err + } + + _, err = writer.Write([]byte(message)) + if err != nil { + return err + } + + if err = writer.Close(); err != nil { + return err + } + + return client.Quit() +} diff --git a/models/config.go b/models/config.go index ffd5426..1feb802 100644 --- a/models/config.go +++ b/models/config.go @@ -1,14 +1,14 @@ -package models - -type EmailConfig struct { - FromEmail string - Username string - Password string - Server string -} - -type GlobalConfig struct { - Email EmailConfig - Key string - Algorithm string -} +package models + +type EmailConfig struct { + FromEmail string + Username string + Password string + Server string +} + +type GlobalConfig struct { + Email EmailConfig + Key string + Algorithm string +} diff --git a/servers/browsers.go b/servers/browsers.go index e242297..8142b35 100644 --- a/servers/browsers.go +++ b/servers/browsers.go @@ -1,116 +1,116 @@ -package servers - -import ( - "context" - "encoding/json" - "fmt" - - "acooldomain.co/backend/auth" - "acooldomain.co/backend/models" - "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/filters" - "github.com/docker/docker/api/types/volume" - "github.com/docker/docker/client" - "github.com/gin-gonic/gin" - "go.mongodb.org/mongo-driver/mongo" -) - -func (con Connection) getBrowserInfo(volume volume.Volume) (*models.FileBrowserInfo, error) { - serverInfo, err := con.getServerInfo(volume) - 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", volume.Name))), - }) - 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: container.ID[:12] + "." + DOMAIN, - }, nil - -} - -func (con Connection) GetBrowsers(ctx *gin.Context) { - volumes, err := con.dockerClient.VolumeList( - context.TODO(), - volume.ListOptions{ - Filters: filters.NewArgs(filters.Arg("label", "type=GAME")), - }, - ) - if err != nil { - ctx.AbortWithError(500, err) - } - - var servers []models.FileBrowserInfo - - for _, volume := range volumes.Volumes { - browserInfo, err := con.getBrowserInfo(*volume) - if err != nil { - ctx.AbortWithError(500, err) - } - if browserInfo == nil { - continue - } - - servers = append(servers, *browserInfo) - } - - if err != nil { - ctx.AbortWithError(500, err) - } - - ctx.JSON(200, servers) -} - -func (con Connection) StopBrowser(ctx *gin.Context) { - serverId := ctx.Param("server_id") - containersList, err := con.dockerClient.ContainerList(context.TODO(), container.ListOptions{ - Filters: filters.NewArgs(filters.Arg("label", "volume_id="+serverId), filters.Arg("label", "type=FILE_BROWSER")), - }) - if err != nil { - ctx.AbortWithError(500, err) - return - } - if len(containersList) == 0 { - ctx.Status(200) - return - } - - for _, containerData := range containersList { - con.dockerClient.ContainerStop(context.TODO(), containerData.ID, container.StopOptions{}) - } - ctx.Status(200) -} - -func LoadBrowsersGroup(group *gin.RouterGroup, mongo_client *mongo.Client, config models.GlobalConfig) { - apiClient, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) - if err != nil { - panic(err) - } - defer apiClient.Close() - - connection := Connection{databaseConnection: mongo_client, dockerClient: apiClient} - group.GET("/", auth.AuthorizedTo(0), connection.GetBrowsers) - group.POST("/:server_id/stop", auth.AuthorizedTo(models.Browse, connection.serverAuthorized(models.Browse)), connection.StopBrowser) -} +package servers + +import ( + "context" + "encoding/json" + "fmt" + + "acooldomain.co/backend/auth" + "acooldomain.co/backend/models" + "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/filters" + "github.com/docker/docker/api/types/volume" + "github.com/docker/docker/client" + "github.com/gin-gonic/gin" + "go.mongodb.org/mongo-driver/mongo" +) + +func (con Connection) getBrowserInfo(volume volume.Volume) (*models.FileBrowserInfo, error) { + serverInfo, err := con.getServerInfo(volume) + 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", volume.Name))), + }) + 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: container.ID[:12] + "." + DOMAIN, + }, nil + +} + +func (con Connection) GetBrowsers(ctx *gin.Context) { + volumes, err := con.dockerClient.VolumeList( + context.TODO(), + volume.ListOptions{ + Filters: filters.NewArgs(filters.Arg("label", "type=GAME")), + }, + ) + if err != nil { + ctx.AbortWithError(500, err) + } + + var servers []models.FileBrowserInfo + + for _, volume := range volumes.Volumes { + browserInfo, err := con.getBrowserInfo(*volume) + if err != nil { + ctx.AbortWithError(500, err) + } + if browserInfo == nil { + continue + } + + servers = append(servers, *browserInfo) + } + + if err != nil { + ctx.AbortWithError(500, err) + } + + ctx.JSON(200, servers) +} + +func (con Connection) StopBrowser(ctx *gin.Context) { + serverId := ctx.Param("server_id") + containersList, err := con.dockerClient.ContainerList(context.TODO(), container.ListOptions{ + Filters: filters.NewArgs(filters.Arg("label", "volume_id="+serverId), filters.Arg("label", "type=FILE_BROWSER")), + }) + if err != nil { + ctx.AbortWithError(500, err) + return + } + if len(containersList) == 0 { + ctx.Status(200) + return + } + + for _, containerData := range containersList { + con.dockerClient.ContainerStop(context.TODO(), containerData.ID, container.StopOptions{}) + } + ctx.Status(200) +} + +func LoadBrowsersGroup(group *gin.RouterGroup, mongo_client *mongo.Client, config models.GlobalConfig) { + apiClient, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + if err != nil { + panic(err) + } + defer apiClient.Close() + + connection := Connection{databaseConnection: mongo_client, dockerClient: apiClient} + group.GET("/", auth.AuthorizedTo(0), connection.GetBrowsers) + group.POST("/:server_id/stop", auth.AuthorizedTo(models.Browse, connection.serverAuthorized(models.Browse)), connection.StopBrowser) +}