fix: resolve nil pointer dereference in interaction on TLS request

This commit is contained in:
2025-12-06 00:01:25 +07:00
parent af951b8fa7
commit 368cc0b3e3
4 changed files with 34 additions and 8 deletions

23
docker-compose.yaml Normal file
View File

@ -0,0 +1,23 @@
services:
tunnlpls:
image: git.fossy.my.id/bagas/tunnl_please:staging
ports:
- 80:80
- 2200:2200
volumes:
- ./certs:/certs
# - /etc/letsencrypt/live/sgp.tunnl.live/fullchain.pem:/certs/fullchain.pem
# - /etc/letsencrypt/live/sgp.tunnl.live/privkey.pem:/certs/privkey.pem
labels:
- "com.centurylinklabs.watchtower.enable=true"
environment:
domain: sgp.tunnl.live
port: 2200
tls_enabled: true
tls_redirect: true
cert_loc: /certs/localhost.direct.SS.crt
key_loc: /certs/localhost.direct.SS.key
ssh_private_key: /certs/id_rsa
cors_list: https://tunnl.live
ALLOWED_PORTS: 10000-50000
restart: always

View File

@ -11,11 +11,13 @@ import (
"regexp" "regexp"
"strings" "strings"
"tunnel_pls/session" "tunnel_pls/session"
"tunnel_pls/session/interaction"
"tunnel_pls/types" "tunnel_pls/types"
"tunnel_pls/utils" "tunnel_pls/utils"
) )
type Interaction interface {
SendMessage(message string)
}
type CustomWriter struct { type CustomWriter struct {
RemoteAddr net.Addr RemoteAddr net.Addr
writer io.Writer writer io.Writer
@ -24,13 +26,13 @@ type CustomWriter struct {
buf []byte buf []byte
respHeader *ResponseHeaderFactory respHeader *ResponseHeaderFactory
reqHeader *RequestHeaderFactory reqHeader *RequestHeaderFactory
interaction interaction.Controller interaction Interaction
respMW []ResponseMiddleware respMW []ResponseMiddleware
reqStartMW []RequestMiddleware reqStartMW []RequestMiddleware
reqEndMW []RequestMiddleware reqEndMW []RequestMiddleware
} }
func (cw *CustomWriter) SetInteraction(interaction interaction.Controller) { func (cw *CustomWriter) SetInteraction(interaction Interaction) {
cw.interaction = interaction cw.interaction = interaction
} }
@ -176,7 +178,7 @@ func (cw *CustomWriter) Write(p []byte) (int, error) {
return n, nil return n, nil
} }
func (cw *CustomWriter) AddInteraction(interaction *interaction.Interaction) { func (cw *CustomWriter) AddInteraction(interaction Interaction) {
cw.interaction = interaction cw.interaction = interaction
} }

View File

@ -112,7 +112,7 @@ func HandlerTLS(conn net.Conn) {
return return
} }
cw := NewCustomWriter(conn, dstReader, conn.RemoteAddr()) cw := NewCustomWriter(conn, dstReader, conn.RemoteAddr())
cw.SetInteraction(sshSession.Interaction)
forwardRequest(cw, reqhf, sshSession) forwardRequest(cw, reqhf, sshSession)
return return
} }

View File

@ -4,7 +4,6 @@ import (
"fmt" "fmt"
"net" "net"
"time" "time"
"tunnel_pls/session/interaction"
) )
type RequestMiddleware interface { type RequestMiddleware interface {
@ -29,20 +28,22 @@ func (h *TunnelFingerprint) HandleResponse(header *ResponseHeaderFactory, body [
} }
type RequestLogger struct { type RequestLogger struct {
interaction interaction.Controller interaction Interaction
remoteAddr net.Addr remoteAddr net.Addr
} }
func NewRequestLogger(interaction interaction.Controller, remoteAddr net.Addr) *RequestLogger { func NewRequestLogger(interaction Interaction, remoteAddr net.Addr) *RequestLogger {
return &RequestLogger{ return &RequestLogger{
interaction: interaction, interaction: interaction,
remoteAddr: remoteAddr, remoteAddr: remoteAddr,
} }
} }
func (rl *RequestLogger) HandleRequest(header *RequestHeaderFactory) error { func (rl *RequestLogger) HandleRequest(header *RequestHeaderFactory) error {
rl.interaction.SendMessage(fmt.Sprintf("\033[32m%s %s -> %s %s \033[0m\r\n", time.Now().UTC().Format(time.RFC3339), rl.remoteAddr.String(), header.Method, header.Path)) rl.interaction.SendMessage(fmt.Sprintf("\033[32m%s %s -> %s %s \033[0m\r\n", time.Now().UTC().Format(time.RFC3339), rl.remoteAddr.String(), header.Method, header.Path))
return nil return nil
} }
func (rl *RequestLogger) HandleResponse(header *ResponseHeaderFactory, body []byte) error { return nil } func (rl *RequestLogger) HandleResponse(header *ResponseHeaderFactory, body []byte) error { return nil }
//TODO: Implement caching atau enggak //TODO: Implement caching atau enggak