server.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. FreeTrialDuration: (time.Hour * 1).Milliseconds() / 1000,
  54. })
  55. }
  56. }
  57. c.JSON(http.StatusOK, dto.ListResponse{
  58. Response: dto.NewOkResponse(),
  59. Data: dtoNodes,
  60. })
  61. }
  62. func Secret(c *gin.Context) {
  63. locker.RLock()
  64. defer locker.RUnlock()
  65. var request dto.DetailRequest
  66. if err := c.ShouldBindQuery(&request); err != nil {
  67. dto.BadRequest(c, err)
  68. return
  69. }
  70. for _, node := range nodes {
  71. if node.Ip == request.Ip {
  72. //secret, err := util.AesEncrypt([]byte(node.Secret))
  73. //if err != nil {
  74. // dto.Error(c, err)
  75. // return
  76. //}
  77. c.Header("Content-Disposition", "attachment; filename=client.ovpn")
  78. c.Data(http.StatusOK, "plain/text", []byte(node.Secret))
  79. return
  80. }
  81. }
  82. c.JSON(http.StatusNotFound, gin.H{
  83. "message": "not found ip",
  84. })
  85. }
  86. func Health(c *gin.Context) {
  87. c.JSON(http.StatusOK, gin.H{"status": "up"})
  88. }