socks5_check_access_handle.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package socks5
  2. import (
  3. "context"
  4. "errors"
  5. "github.com/cnlh/nps/core"
  6. "net"
  7. )
  8. type CheckAccess struct {
  9. clientConn net.Conn
  10. clientUsername string
  11. clientPassword string
  12. configUsername string
  13. configPassword string
  14. }
  15. func (check *CheckAccess) GetConfigName() *core.NpsConfigs {
  16. c := core.NewNpsConfigs("socks5_simple_access_check", "need check the permission simply")
  17. c.Add("socks5_simple_access_username", "simple auth username")
  18. c.Add("socks5_simple_access_password", "simple auth password")
  19. return c
  20. }
  21. func (check *CheckAccess) GetStage() core.Stage {
  22. return core.STAGE_RUN
  23. }
  24. func (check *CheckAccess) Start(ctx context.Context, config map[string]string) error {
  25. return nil
  26. }
  27. func (check *CheckAccess) Run(ctx context.Context, config map[string]string) error {
  28. clientCtxConn := ctx.Value(core.CLIENT_CONNECTION)
  29. if clientCtxConn == nil {
  30. return core.CLIENT_CONNECTION_NOT_EXIST
  31. }
  32. check.clientConn = clientCtxConn.(net.Conn)
  33. check.configUsername = config["socks5_access_username"]
  34. check.configPassword = config["socks5_access_password"]
  35. return nil
  36. }
  37. func (check *CheckAccess) End(ctx context.Context, config map[string]string) error {
  38. return nil
  39. }
  40. func (check *CheckAccess) checkAuth(configUserName, configPassword string) error {
  41. if check.clientUsername == configUserName && check.clientPassword == configPassword {
  42. _, err := check.clientConn.Write([]byte{userAuthVersion, authSuccess})
  43. return err
  44. } else {
  45. _, err := check.clientConn.Write([]byte{userAuthVersion, authFailure})
  46. if err != nil {
  47. return err
  48. }
  49. return errors.New("auth check error,username or password does not match")
  50. }
  51. }