2022-05-23 01:05:50 +00:00
|
|
|
package prox5
|
2021-09-18 10:38:22 +00:00
|
|
|
|
|
|
|
import (
|
2022-06-26 02:11:01 +00:00
|
|
|
"fmt"
|
2022-07-25 06:23:12 +00:00
|
|
|
"strings"
|
2021-09-18 10:38:22 +00:00
|
|
|
"sync"
|
2022-08-28 13:12:48 +00:00
|
|
|
"sync/atomic"
|
|
|
|
|
|
|
|
"git.tcp.direct/kayos/prox5/internal/pools"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
debugStatus *uint32
|
|
|
|
debugHardLock = &sync.RWMutex{}
|
2021-09-18 10:38:22 +00:00
|
|
|
)
|
|
|
|
|
2022-06-26 02:11:01 +00:00
|
|
|
func init() {
|
2022-08-28 13:12:48 +00:00
|
|
|
dd := debugDisabled
|
|
|
|
debugStatus = &dd
|
2022-06-26 02:11:01 +00:00
|
|
|
}
|
|
|
|
|
2022-08-28 13:12:48 +00:00
|
|
|
const (
|
|
|
|
debugEnabled uint32 = iota
|
|
|
|
debugDisabled
|
2021-09-18 10:38:22 +00:00
|
|
|
)
|
|
|
|
|
2022-08-28 13:12:48 +00:00
|
|
|
type SocksLogger struct {
|
|
|
|
parent *ProxyEngine
|
|
|
|
}
|
|
|
|
|
|
|
|
// Printf is used to handle socks server logging.
|
|
|
|
func (s SocksLogger) Printf(format string, a ...interface{}) {
|
|
|
|
buf := pools.CopABuffer.Get().(*strings.Builder)
|
|
|
|
buf.WriteString(fmt.Sprintf(format, a...))
|
|
|
|
s.parent.dbgPrint(buf)
|
2021-09-18 10:38:22 +00:00
|
|
|
}
|
|
|
|
|
2022-06-26 02:11:01 +00:00
|
|
|
type basicPrinter struct{}
|
|
|
|
|
2022-08-31 18:38:44 +00:00
|
|
|
func (b *basicPrinter) Print(str string) {
|
2022-06-28 02:27:52 +00:00
|
|
|
println("[prox5] " + str)
|
2022-06-26 02:11:01 +00:00
|
|
|
}
|
|
|
|
|
2022-08-31 18:38:44 +00:00
|
|
|
func (b *basicPrinter) Printf(format string, items ...any) {
|
2022-06-26 02:11:01 +00:00
|
|
|
println(fmt.Sprintf("prox5: "+format, items))
|
|
|
|
}
|
2022-05-23 01:20:40 +00:00
|
|
|
|
2022-06-26 02:11:01 +00:00
|
|
|
// DebugEnabled returns the current state of our debug switch.
|
2022-06-26 02:51:42 +00:00
|
|
|
func (pe *ProxyEngine) DebugEnabled() bool {
|
2022-08-28 13:12:48 +00:00
|
|
|
debugHardLock.RLock()
|
|
|
|
defer debugHardLock.RUnlock()
|
|
|
|
return atomic.CompareAndSwapUint32(debugStatus, debugEnabled, debugEnabled)
|
2021-09-18 10:38:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// EnableDebug enables printing of verbose messages during operation
|
2022-06-26 02:51:42 +00:00
|
|
|
func (pe *ProxyEngine) EnableDebug() {
|
2022-08-28 13:12:48 +00:00
|
|
|
atomic.StoreUint32(debugStatus, debugEnabled)
|
2021-09-18 10:38:22 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// DisableDebug enables printing of verbose messages during operation.
|
|
|
|
// WARNING: if you are using a DebugChannel, you must read all of the messages in the channel's cache or this will block.
|
2022-06-26 02:51:42 +00:00
|
|
|
func (pe *ProxyEngine) DisableDebug() {
|
2022-08-28 13:12:48 +00:00
|
|
|
atomic.StoreUint32(debugStatus, debugDisabled)
|
2021-09-18 10:38:22 +00:00
|
|
|
}
|
|
|
|
|
2022-07-25 06:23:12 +00:00
|
|
|
func simpleString(s string) *strings.Builder {
|
2022-08-28 13:12:48 +00:00
|
|
|
buf := pools.CopABuffer.Get().(*strings.Builder)
|
2022-07-25 06:23:12 +00:00
|
|
|
buf.WriteString(s)
|
|
|
|
return buf
|
2021-09-18 10:38:22 +00:00
|
|
|
}
|
|
|
|
|
2022-07-25 06:23:12 +00:00
|
|
|
func (pe *ProxyEngine) dbgPrint(builder *strings.Builder) {
|
2022-08-28 13:12:48 +00:00
|
|
|
defer pools.DiscardBuffer(builder)
|
|
|
|
if !pe.DebugEnabled() {
|
2021-09-18 10:38:22 +00:00
|
|
|
return
|
|
|
|
}
|
2022-08-28 13:12:48 +00:00
|
|
|
pe.DebugLogger.Print(builder.String())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pe *ProxyEngine) msgUnableToReach(socksString, target string, err error) {
|
|
|
|
if !pe.DebugEnabled() {
|
2022-06-26 02:51:42 +00:00
|
|
|
return
|
|
|
|
}
|
2022-08-28 13:12:48 +00:00
|
|
|
buf := pools.CopABuffer.Get().(*strings.Builder)
|
|
|
|
buf.WriteString("unable to reach ")
|
|
|
|
if pe.swampopt.redact {
|
|
|
|
buf.WriteString("[redacted]")
|
|
|
|
} else {
|
|
|
|
buf.WriteString(target)
|
2021-09-18 10:38:22 +00:00
|
|
|
}
|
2022-08-28 13:12:48 +00:00
|
|
|
buf.WriteString(" with ")
|
2022-07-25 07:14:26 +00:00
|
|
|
buf.WriteString(socksString)
|
2022-08-28 13:12:48 +00:00
|
|
|
if !pe.swampopt.redact {
|
|
|
|
buf.WriteString(": ")
|
|
|
|
buf.WriteString(err.Error())
|
|
|
|
}
|
2022-07-25 07:14:26 +00:00
|
|
|
buf.WriteString(", cycling...")
|
|
|
|
pe.dbgPrint(buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pe *ProxyEngine) msgUsingProxy(socksString string) {
|
2022-08-28 13:12:48 +00:00
|
|
|
if !pe.DebugEnabled() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
buf := pools.CopABuffer.Get().(*strings.Builder)
|
2022-07-25 07:14:26 +00:00
|
|
|
buf.WriteString("MysteryDialer using socks: ")
|
|
|
|
buf.WriteString(socksString)
|
|
|
|
pe.dbgPrint(buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pe *ProxyEngine) msgFailedMiddleware(socksString string) {
|
2022-08-28 13:12:48 +00:00
|
|
|
if !pe.DebugEnabled() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
buf := pools.CopABuffer.Get().(*strings.Builder)
|
2022-07-25 07:14:26 +00:00
|
|
|
buf.WriteString("failed middleware check, ")
|
|
|
|
buf.WriteString(socksString)
|
|
|
|
buf.WriteString(", cycling...")
|
|
|
|
pe.dbgPrint(buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pe *ProxyEngine) msgTry(socksString string) {
|
2022-08-28 13:12:48 +00:00
|
|
|
if !pe.DebugEnabled() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
buf := pools.CopABuffer.Get().(*strings.Builder)
|
2022-07-25 07:14:26 +00:00
|
|
|
buf.WriteString("try dial with: ")
|
|
|
|
buf.WriteString(socksString)
|
|
|
|
pe.dbgPrint(buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pe *ProxyEngine) msgCantGetLock(socksString string, putback bool) {
|
2022-08-28 13:12:48 +00:00
|
|
|
if !pe.DebugEnabled() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
buf := pools.CopABuffer.Get().(*strings.Builder)
|
2022-07-25 07:14:26 +00:00
|
|
|
buf.WriteString("can't get lock for ")
|
|
|
|
buf.WriteString(socksString)
|
|
|
|
if putback {
|
|
|
|
buf.WriteString(", putting back in queue")
|
|
|
|
}
|
|
|
|
pe.dbgPrint(buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pe *ProxyEngine) msgGotLock(socksString string) {
|
2022-08-28 13:12:48 +00:00
|
|
|
if !pe.DebugEnabled() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
buf := pools.CopABuffer.Get().(*strings.Builder)
|
2022-07-25 07:14:26 +00:00
|
|
|
buf.WriteString("got lock for ")
|
|
|
|
buf.WriteString(socksString)
|
|
|
|
pe.dbgPrint(buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pe *ProxyEngine) msgChecked(sock *Proxy, success bool) {
|
2022-08-28 13:12:48 +00:00
|
|
|
if !pe.DebugEnabled() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
buf := pools.CopABuffer.Get().(*strings.Builder)
|
2022-07-25 07:14:26 +00:00
|
|
|
if success {
|
|
|
|
buf.WriteString("verified ")
|
|
|
|
buf.WriteString(sock.Endpoint)
|
2022-08-28 13:12:48 +00:00
|
|
|
if sock.proto != ProtoHTTP {
|
|
|
|
buf.WriteString(" as SOCKS")
|
|
|
|
} else {
|
|
|
|
buf.WriteString(" as HTTP proxy")
|
|
|
|
pe.dbgPrint(buf)
|
|
|
|
return
|
|
|
|
}
|
2022-07-25 07:14:26 +00:00
|
|
|
buf.WriteString(getProtoStr(sock.proto))
|
|
|
|
pe.dbgPrint(buf)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
buf.WriteString("failed to verify: ")
|
|
|
|
buf.WriteString(sock.Endpoint)
|
|
|
|
pe.dbgPrint(buf)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (pe *ProxyEngine) msgBadProxRate(sock *Proxy) {
|
2022-08-28 13:12:48 +00:00
|
|
|
if !pe.DebugEnabled() {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
buf := pools.CopABuffer.Get().(*strings.Builder)
|
2022-07-25 07:14:26 +00:00
|
|
|
buf.WriteString("badProx ratelimited: ")
|
|
|
|
buf.WriteString(sock.Endpoint)
|
|
|
|
pe.dbgPrint(buf)
|
|
|
|
}
|