access.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package log
  2. import (
  3. "context"
  4. "strings"
  5. "github.com/xtls/xray-core/common/serial"
  6. )
  7. type logKey int
  8. const (
  9. accessMessageKey logKey = iota
  10. )
  11. type AccessStatus string
  12. const (
  13. AccessAccepted = AccessStatus("accepted")
  14. AccessRejected = AccessStatus("rejected")
  15. )
  16. type AccessMessage struct {
  17. From interface{}
  18. To interface{}
  19. Status AccessStatus
  20. Reason interface{}
  21. Email string
  22. Detour string
  23. }
  24. func (m *AccessMessage) String() string {
  25. builder := strings.Builder{}
  26. builder.WriteString("from")
  27. builder.WriteByte(' ')
  28. builder.WriteString(serial.ToString(m.From))
  29. builder.WriteByte(' ')
  30. builder.WriteString(string(m.Status))
  31. builder.WriteByte(' ')
  32. builder.WriteString(serial.ToString(m.To))
  33. if len(m.Detour) > 0 {
  34. builder.WriteString(" [")
  35. builder.WriteString(m.Detour)
  36. builder.WriteByte(']')
  37. }
  38. if reason := serial.ToString(m.Reason); len(reason) > 0 {
  39. builder.WriteString(" ")
  40. builder.WriteString(reason)
  41. }
  42. if len(m.Email) > 0 {
  43. builder.WriteString(" email: ")
  44. builder.WriteString(m.Email)
  45. }
  46. return builder.String()
  47. }
  48. func ContextWithAccessMessage(ctx context.Context, accessMessage *AccessMessage) context.Context {
  49. return context.WithValue(ctx, accessMessageKey, accessMessage)
  50. }
  51. func AccessMessageFromContext(ctx context.Context) *AccessMessage {
  52. if accessMessage, ok := ctx.Value(accessMessageKey).(*AccessMessage); ok {
  53. return accessMessage
  54. }
  55. return nil
  56. }