manager.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. // Copyright 2017 fatedier, fatedier@gmail.com
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package server
  15. import (
  16. "fmt"
  17. "io"
  18. "sync"
  19. frpNet "github.com/fatedier/frp/utils/net"
  20. "github.com/fatedier/frp/utils/util"
  21. frpIo "github.com/fatedier/golib/io"
  22. )
  23. type ControlManager struct {
  24. // controls indexed by run id
  25. ctlsByRunId map[string]*Control
  26. mu sync.RWMutex
  27. }
  28. func NewControlManager() *ControlManager {
  29. return &ControlManager{
  30. ctlsByRunId: make(map[string]*Control),
  31. }
  32. }
  33. func (cm *ControlManager) Add(runId string, ctl *Control) (oldCtl *Control) {
  34. cm.mu.Lock()
  35. defer cm.mu.Unlock()
  36. oldCtl, ok := cm.ctlsByRunId[runId]
  37. if ok {
  38. oldCtl.Replaced(ctl)
  39. }
  40. cm.ctlsByRunId[runId] = ctl
  41. return
  42. }
  43. func (cm *ControlManager) Del(runId string) {
  44. cm.mu.Lock()
  45. defer cm.mu.Unlock()
  46. delete(cm.ctlsByRunId, runId)
  47. }
  48. func (cm *ControlManager) GetById(runId string) (ctl *Control, ok bool) {
  49. cm.mu.RLock()
  50. defer cm.mu.RUnlock()
  51. ctl, ok = cm.ctlsByRunId[runId]
  52. return
  53. }
  54. type ProxyManager struct {
  55. // proxies indexed by proxy name
  56. pxys map[string]Proxy
  57. mu sync.RWMutex
  58. }
  59. func NewProxyManager() *ProxyManager {
  60. return &ProxyManager{
  61. pxys: make(map[string]Proxy),
  62. }
  63. }
  64. func (pm *ProxyManager) Add(name string, pxy Proxy) error {
  65. pm.mu.Lock()
  66. defer pm.mu.Unlock()
  67. if _, ok := pm.pxys[name]; ok {
  68. return fmt.Errorf("proxy name [%s] is already in use", name)
  69. }
  70. pm.pxys[name] = pxy
  71. return nil
  72. }
  73. func (pm *ProxyManager) Del(name string) {
  74. pm.mu.Lock()
  75. defer pm.mu.Unlock()
  76. delete(pm.pxys, name)
  77. }
  78. func (pm *ProxyManager) GetByName(name string) (pxy Proxy, ok bool) {
  79. pm.mu.RLock()
  80. defer pm.mu.RUnlock()
  81. pxy, ok = pm.pxys[name]
  82. return
  83. }
  84. // Manager for visitor listeners.
  85. type VisitorManager struct {
  86. visitorListeners map[string]*frpNet.CustomListener
  87. skMap map[string]string
  88. mu sync.RWMutex
  89. }
  90. func NewVisitorManager() *VisitorManager {
  91. return &VisitorManager{
  92. visitorListeners: make(map[string]*frpNet.CustomListener),
  93. skMap: make(map[string]string),
  94. }
  95. }
  96. func (vm *VisitorManager) Listen(name string, sk string) (l *frpNet.CustomListener, err error) {
  97. vm.mu.Lock()
  98. defer vm.mu.Unlock()
  99. if _, ok := vm.visitorListeners[name]; ok {
  100. err = fmt.Errorf("custom listener for [%s] is repeated", name)
  101. return
  102. }
  103. l = frpNet.NewCustomListener()
  104. vm.visitorListeners[name] = l
  105. vm.skMap[name] = sk
  106. return
  107. }
  108. func (vm *VisitorManager) NewConn(name string, conn frpNet.Conn, timestamp int64, signKey string,
  109. useEncryption bool, useCompression bool) (err error) {
  110. vm.mu.RLock()
  111. defer vm.mu.RUnlock()
  112. if l, ok := vm.visitorListeners[name]; ok {
  113. var sk string
  114. if sk = vm.skMap[name]; util.GetAuthKey(sk, timestamp) != signKey {
  115. err = fmt.Errorf("visitor connection of [%s] auth failed", name)
  116. return
  117. }
  118. var rwc io.ReadWriteCloser = conn
  119. if useEncryption {
  120. if rwc, err = frpIo.WithEncryption(rwc, []byte(sk)); err != nil {
  121. err = fmt.Errorf("create encryption connection failed: %v", err)
  122. return
  123. }
  124. }
  125. if useCompression {
  126. rwc = frpIo.WithCompression(rwc)
  127. }
  128. err = l.PutConn(frpNet.WrapReadWriteCloserToConn(rwc, conn))
  129. } else {
  130. err = fmt.Errorf("custom listener for [%s] doesn't exist", name)
  131. return
  132. }
  133. return
  134. }
  135. func (vm *VisitorManager) CloseListener(name string) {
  136. vm.mu.Lock()
  137. defer vm.mu.Unlock()
  138. delete(vm.visitorListeners, name)
  139. delete(vm.skMap, name)
  140. }