server.go 2.2 KB

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