forwardproxy.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package forwardproxy
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "log"
  7. "net/http"
  8. "strconv"
  9. "time"
  10. "imuslab.com/zoraxy/mod/database"
  11. "imuslab.com/zoraxy/mod/forwardproxy/cproxy"
  12. "imuslab.com/zoraxy/mod/info/logger"
  13. "imuslab.com/zoraxy/mod/utils"
  14. )
  15. type ZrFilter struct {
  16. //To be implemented
  17. }
  18. type Handler struct {
  19. server *http.Server
  20. handler *http.Handler
  21. running bool
  22. db *database.Database
  23. logger *logger.Logger
  24. Port int
  25. }
  26. func NewForwardProxy(sysdb *database.Database, port int, logger *logger.Logger) *Handler {
  27. thisFilter := ZrFilter{}
  28. handler := cproxy.New(cproxy.Options.Filter(thisFilter))
  29. return &Handler{
  30. db: sysdb,
  31. server: nil,
  32. handler: &handler,
  33. running: false,
  34. logger: logger,
  35. Port: port,
  36. }
  37. }
  38. // Start the forward proxy
  39. func (h *Handler) Start() error {
  40. if h.running {
  41. return errors.New("forward proxy already running")
  42. }
  43. server := &http.Server{Addr: ":" + strconv.Itoa(h.Port), Handler: *h.handler}
  44. h.server = server
  45. go func() {
  46. if err := server.ListenAndServe(); err != nil {
  47. if err != nil {
  48. log.Println(err.Error())
  49. }
  50. }
  51. }()
  52. h.running = true
  53. return nil
  54. }
  55. // Stop the forward proxy
  56. func (h *Handler) Stop() error {
  57. if h.running && h.server != nil {
  58. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  59. defer cancel()
  60. if err := h.server.Shutdown(ctx); err != nil {
  61. return err
  62. }
  63. h.running = false
  64. h.server = nil
  65. }
  66. return nil
  67. }
  68. // Update the port number of the forward proxy
  69. func (h *Handler) UpdatePort(newPort int) error {
  70. h.Stop()
  71. h.Port = newPort
  72. return h.Start()
  73. }
  74. func (it ZrFilter) IsAuthorized(w http.ResponseWriter, r *http.Request) bool {
  75. return true
  76. }
  77. // Handle port change of the forward proxy
  78. func (h *Handler) HandlePort(w http.ResponseWriter, r *http.Request) {
  79. port, err := utils.PostInt(r, "port")
  80. if err != nil {
  81. js, _ := json.Marshal(h.Port)
  82. utils.SendJSONResponse(w, string(js))
  83. } else {
  84. //Update the port
  85. err = h.UpdatePort(port)
  86. if err != nil {
  87. utils.SendErrorResponse(w, err.Error())
  88. return
  89. }
  90. h.logger.PrintAndLog("Forward Proxy", "HTTP Forward Proxy port updated to :"+strconv.Itoa(h.Port), nil)
  91. h.db.Write("fwdproxy", "port", port)
  92. utils.SendOK(w)
  93. }
  94. }
  95. // Handle power toggle of the forward proxys
  96. func (h *Handler) HandleToogle(w http.ResponseWriter, r *http.Request) {
  97. enabled, err := utils.PostBool(r, "enable")
  98. if err != nil {
  99. //Get the current state of the forward proxy
  100. js, _ := json.Marshal(h.running)
  101. utils.SendJSONResponse(w, string(js))
  102. } else {
  103. if enabled {
  104. err = h.Start()
  105. if err != nil {
  106. h.logger.PrintAndLog("Forward Proxy", "Unable to start forward proxy server", err)
  107. utils.SendErrorResponse(w, err.Error())
  108. return
  109. }
  110. h.logger.PrintAndLog("Forward Proxy", "HTTP Forward Proxy Started, listening on :"+strconv.Itoa(h.Port), nil)
  111. } else {
  112. err = h.Stop()
  113. if err != nil {
  114. h.logger.PrintAndLog("Forward Proxy", "Unable to stop forward proxy server", err)
  115. utils.SendErrorResponse(w, err.Error())
  116. return
  117. }
  118. h.logger.PrintAndLog("Forward Proxy", "HTTP Forward Proxy Stopped", nil)
  119. }
  120. h.db.Write("fwdproxy", "enabled", enabled)
  121. utils.SendOK(w)
  122. }
  123. }