server.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package server
  2. import (
  3. "be-vpn/internal/dto"
  4. "be-vpn/internal/model"
  5. "github.com/gin-gonic/gin"
  6. "log"
  7. "net/http"
  8. "sync"
  9. "time"
  10. )
  11. var nodes = make([]*model.Node, 0)
  12. var locker = sync.RWMutex{}
  13. func Register(c *gin.Context) {
  14. locker.Lock()
  15. defer locker.Unlock()
  16. var request dto.RegisterRequest
  17. if err := c.ShouldBindJSON(&request); err != nil {
  18. dto.BadRequest(c, err)
  19. return
  20. }
  21. for _, node := range nodes {
  22. if node.Ip == request.Ip {
  23. node.Ip = request.Ip
  24. node.Secret = request.Secret
  25. node.CountryCode = request.CountryCode
  26. node.LastUpdateTime = time.Now()
  27. c.JSON(http.StatusOK, dto.RegisterResponse{
  28. Response: dto.NewOkResponse(),
  29. Data: dto.RegisterResult{
  30. Success: true,
  31. },
  32. })
  33. return
  34. }
  35. }
  36. node := &model.Node{
  37. Ip: request.Ip,
  38. Secret: request.Secret,
  39. LastUpdateTime: time.Now(),
  40. }
  41. nodes = append(nodes, node)
  42. log.Printf("update nodes: %+v", nodes)
  43. }
  44. func List(c *gin.Context) {
  45. locker.RLock()
  46. defer locker.RUnlock()
  47. dtoNodes := make([]dto.Node, 0)
  48. for _, node := range nodes {
  49. if node.LastUpdateTime.Add(10 * time.Second).After(time.Now()) {
  50. dtoNodes = append(dtoNodes, dto.Node{
  51. Ip: node.Ip,
  52. CountryCode: node.CountryCode,
  53. })
  54. }
  55. }
  56. c.JSON(http.StatusOK, dto.ListResponse{
  57. Response: dto.NewOkResponse(),
  58. Data: dto.ListResult{
  59. Nodes: dtoNodes,
  60. FreeTrialDuration: (time.Hour * 1).Milliseconds() / 1000,
  61. },
  62. })
  63. }
  64. func Secret(c *gin.Context) {
  65. locker.RLock()
  66. defer locker.RUnlock()
  67. var request dto.DetailRequest
  68. if err := c.ShouldBindQuery(&request); err != nil {
  69. dto.BadRequest(c, err)
  70. return
  71. }
  72. for _, node := range nodes {
  73. if node.Ip == request.Ip {
  74. //secret, err := util.AesEncrypt([]byte(node.Secret))
  75. //if err != nil {
  76. // dto.Error(c, err)
  77. // return
  78. //}
  79. c.Header("Content-Disposition", "attachment; filename=client.ovpn")
  80. c.Data(http.StatusOK, "plain/text", []byte(node.Secret))
  81. return
  82. }
  83. }
  84. c.JSON(http.StatusNotFound, gin.H{
  85. "message": "not found ip",
  86. })
  87. }
  88. func Health(c *gin.Context) {
  89. c.JSON(http.StatusOK, gin.H{"status": "up"})
  90. }