Compare commits

...

21 Commits

Author SHA1 Message Date
b484981017 Merge pull request 'staging' (#35) from staging into main
All checks were successful
Docker Build and Push / build-and-push (push) Successful in 4m22s
Reviewed-on: #35
2025-12-09 16:40:44 +00:00
102c975388 Merge branch 'staging' of https://git.fossy.my.id/bagas/tunnel-please into staging
All checks were successful
Docker Build and Push / build-and-push (push) Successful in 4m17s
2025-12-09 23:40:06 +07:00
ad034ef681 fix: resolve random SSH disconnections caused by 'unexpected bytes remain' errors 2025-12-09 23:39:22 +07:00
aceecfd14c Merge pull request 'Update LICENSE.md' (#34) from staging into main
All checks were successful
Docker Build and Push / build-and-push (push) Successful in 6m44s
Reviewed-on: #34
2025-12-08 16:03:33 +00:00
1de7155771 Merge pull request 'fix: prevent race condition when channel is used before being set' (#33) from staging into main
All checks were successful
Docker Build and Push / build-and-push (push) Successful in 3m46s
Reviewed-on: #33
2025-12-08 15:47:01 +00:00
79d77497a0 Merge pull request 'update: readme' (#32) from staging into main
All checks were successful
Docker Build and Push / build-and-push (push) Successful in 6m22s
Reviewed-on: #32
2025-12-08 14:13:23 +00:00
20b90c1727 Merge pull request 'Update .gitea/workflows/build.yml' (#31) from staging into main
All checks were successful
Docker Build and Push / build-and-push (push) Successful in 5m9s
Reviewed-on: #31
2025-12-08 13:37:07 +00:00
a1e920f6b5 Merge pull request 'refactor: remove magic numbers and replace with named constants' (#30) from staging into main
All checks were successful
Docker Build and Push / build-and-push (push) Successful in 6m10s
Reviewed-on: bagas/tunnl_please#30
2025-12-08 12:46:56 +00:00
b5045409cb Merge pull request 'feat: add droping conn command' (#29) from staging into main
All checks were successful
Docker Build and Push / build-and-push (push) Successful in 4m30s
Reviewed-on: bagas/tunnl_please#29
2025-12-07 09:30:47 +00:00
33e6ad08d7 Merge pull request 'staging' (#28) from staging into main
All checks were successful
Docker Build and Push / build-and-push (push) Successful in 6m0s
Reviewed-on: bagas/tunnl_please#28
2025-12-06 16:47:20 +00:00
fd513d7bc9 Merge pull request 'refactor: instantiate new session object once forwarding is approved' (#27) from staging into main
All checks were successful
Docker Build and Push / build-and-push (push) Successful in 6m2s
Reviewed-on: bagas/tunnl_please#27
2025-12-06 16:14:22 +00:00
73e7df6a3b Merge pull request 'fix: correct read/write handling in CustomWriter' (#26) from staging into main
All checks were successful
Docker Build and Push / build-and-push (push) Successful in 5m14s
Reviewed-on: bagas/tunnl_please#26
2025-12-06 15:20:11 +00:00
d2c5b2a4db Merge pull request 'staging' (#25) from staging into main
All checks were successful
Docker Build and Push / build-and-push (push) Successful in 4m21s
Reviewed-on: bagas/tunnl_please#25
2025-12-05 17:09:59 +00:00
cad22cd25a Merge pull request 'refactor: change to gitea action' (#21) from staging into main
All checks were successful
Docker Build and Push / build-and-push (push) Successful in 4m19s
Reviewed-on: bagas/tunnl_please#21
2025-12-03 14:21:50 +00:00
0cb02f5220 Merge pull request 'refactor: remove profiling' (#20) from staging into main
Some checks failed
Docker Build and Push / build-and-push (push) Has been cancelled
Reviewed-on: bagas/tunnl_please#20
2025-12-03 14:20:52 +00:00
7bee2f2c9b Merge pull request 'staging' (#19) from staging into main
Some checks failed
Docker Build and Push / build-and-push (push) Failing after 2s
Reviewed-on: bagas/tunnl_please#19
2025-12-03 14:18:20 +00:00
54069ad305 Merge pull request 'fix: http forwarding stuck' (#9) from staging into main
Some checks failed
Docker Build and Push / build-and-push (push) Failing after 3s
Reviewed-on: bagas/tunnl_please#9
2025-11-28 12:36:00 +00:00
5bf618aa32 Merge pull request 'fix: logic error in port checking' (#8) from staging into main
Some checks failed
Docker Build and Push / build-and-push (push) Has been cancelled
Reviewed-on: bagas/tunnl_please#8
2025-11-28 10:34:28 +00:00
34041a9fe6 Merge pull request 'refactor: handle error' (#7) from staging into main
Some checks failed
Docker Build and Push / build-and-push (push) Has been cancelled
Reviewed-on: bagas/tunnl_please#7
2025-11-28 09:57:47 +00:00
c6d64aff3a Merge pull request 'refactor: separate session responsibilities and inject dependencies' (#6) from staging into main
Some checks failed
Docker Build and Push / build-and-push (push) Has been cancelled
Reviewed-on: bagas/tunnl_please#6
2025-11-28 06:30:09 +00:00
2e5a4e0b71 Merge pull request 'fix: close connection on TCP/IP request timeout' (#5) from staging into main
Some checks failed
Docker Build and Push / build-and-push (push) Has been cancelled
Reviewed-on: bagas/tunnl_please#5
2025-11-27 16:04:55 +00:00
2 changed files with 15 additions and 44 deletions

View File

@ -11,7 +11,6 @@ import (
"regexp"
"strings"
"tunnel_pls/session"
"tunnel_pls/types"
"tunnel_pls/utils"
)
@ -30,7 +29,6 @@ type CustomWriter struct {
respMW []ResponseMiddleware
reqStartMW []RequestMiddleware
reqEndMW []RequestMiddleware
overflow []byte
}
func (cw *CustomWriter) SetInteraction(interaction Interaction) {
@ -38,14 +36,6 @@ func (cw *CustomWriter) SetInteraction(interaction Interaction) {
}
func (cw *CustomWriter) Read(p []byte) (int, error) {
if len(cw.overflow) > 0 {
n := copy(p, cw.overflow)
cw.overflow = cw.overflow[n:]
if len(cw.overflow) == 0 {
cw.overflow = nil
}
return n, nil
}
tmp := make([]byte, len(p))
read, err := cw.reader.Read(tmp)
if read == 0 && err != nil {
@ -99,12 +89,6 @@ func (cw *CustomWriter) Read(p []byte) (int, error) {
n := copy(p, combined)
if n > len(p) {
cw.overflow = make([]byte, len(combined)-n)
copy(cw.overflow, combined[n:])
log.Printf("output buffer too small (%d vs %d)", len(p), n)
}
return n, nil
}
@ -118,7 +102,7 @@ func NewCustomWriter(writer io.Writer, reader io.Reader, remoteAddr net.Addr) *C
}
}
var DELIMITER = []byte{0x0D, 0x0A, 0x0D, 0x0A} // HTTP HEADER DELIMITER `\r\n\r\n`
var DELIMITER = []byte{0x0D, 0x0A, 0x0D, 0x0A}
var requestLine = regexp.MustCompile(`^(GET|POST|PUT|DELETE|HEAD|OPTIONS|PATCH|TRACE|CONNECT) \S+ HTTP/\d\.\d$`)
var responseLine = regexp.MustCompile(`^HTTP/\d\.\d \d{3} .+`)
@ -143,8 +127,8 @@ func isHTTPHeader(buf []byte) bool {
}
func (cw *CustomWriter) Write(p []byte) (int, error) {
if len(p) == len(types.BadGatewayResponse) && bytes.Equal(p, types.BadGatewayResponse) {
return cw.writer.Write(p)
if cw.respHeader != nil && len(cw.buf) == 0 && len(p) >= 5 && string(p[0:5]) == "HTTP/" {
cw.respHeader = nil
}
if cw.respHeader != nil {
@ -166,9 +150,12 @@ func (cw *CustomWriter) Write(p []byte) (int, error) {
body := cw.buf[idx+len(DELIMITER):]
if !isHTTPHeader(header) {
n, err := cw.writer.Write(cw.buf)
_, err := cw.writer.Write(cw.buf)
cw.buf = nil
return n, err
if err != nil {
return 0, err
}
return len(p), nil
}
resphf := NewResponseHeaderFactory(header)
@ -323,20 +310,12 @@ func forwardRequest(cw *CustomWriter, initialRequest *RequestHeaderFactory, sshS
}
}
}()
_, err = channel.Write(initialRequest.Finalize())
if err != nil {
log.Printf("Failed to forward request: %v", err)
return
}
//TODO: Implement wrapper func buat add/remove middleware
fingerprintMiddleware := NewTunnelFingerprint()
loggerMiddleware := NewRequestLogger(cw.interaction, cw.RemoteAddr)
forwardedForMiddleware := NewForwardedFor(cw.RemoteAddr)
cw.respMW = append(cw.respMW, fingerprintMiddleware)
cw.reqStartMW = append(cw.reqStartMW, loggerMiddleware)
cw.reqStartMW = append(cw.reqStartMW, forwardedForMiddleware)
//TODO: Tambah req Middleware
cw.reqEndMW = nil
cw.reqHeader = initialRequest
@ -348,6 +327,12 @@ func forwardRequest(cw *CustomWriter, initialRequest *RequestHeaderFactory, sshS
}
}
_, err = channel.Write(initialRequest.Finalize())
if err != nil {
log.Printf("Failed to forward request: %v", err)
return
}
sshSession.Forwarder.HandleConnection(cw, channel, cw.RemoteAddr)
return
}

View File

@ -1,9 +1,7 @@
package server
import (
"fmt"
"net"
"time"
)
type RequestMiddleware interface {
@ -30,18 +28,6 @@ type RequestLogger struct {
remoteAddr net.Addr
}
func NewRequestLogger(interaction Interaction, remoteAddr net.Addr) *RequestLogger {
return &RequestLogger{
interaction: interaction,
remoteAddr: remoteAddr,
}
}
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))
return nil
}
type ForwardedFor struct {
addr net.Addr
}