65 Commits

Author SHA1 Message Date
e75926bcc6 docs: show CI/CD status badge and mascot in README
SonarQube Scan / SonarQube Trigger (push) Successful in 3m27s
SonarQube Scan / SonarQube Trigger (pull_request) Successful in 3m59s
2026-01-27 16:16:32 +07:00
b9ec59efb6 test(interaction): add unit tests for interaction behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 3m53s
2026-01-27 15:39:45 +07:00
02d869fa11 refactor(dockerfile): split long ldflags line
SonarQube Scan / SonarQube Trigger (push) Successful in 3m33s
2026-01-27 14:22:17 +07:00
d167508a55 refactor(interaction): reduce cognitive complexity and centralize color constants
SonarQube Scan / SonarQube Trigger (push) Successful in 3m49s
2026-01-27 13:43:31 +07:00
7f4f448b47 fix: ensure proper buffer reuse with pointer handling in sync.Pool
SonarQube Scan / SonarQube Trigger (push) Successful in 2m26s
2026-01-26 19:50:34 +07:00
a9d98213ce test: check and handle error for testing
SonarQube Scan / SonarQube Trigger (push) Successful in 3m35s
2026-01-26 19:45:27 +07:00
48b680110a ci: add project source and test path for sonarqube
SonarQube Scan / SonarQube Trigger (push) Successful in 3m42s
2026-01-26 18:13:03 +07:00
bb32f25954 test(forwarder): add unit tests for forwarder behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 2m20s
2026-01-26 11:58:56 +07:00
4410c9b993 chore(tests): migrate to Testify for mocking and assertions
SonarQube Scan / SonarQube Trigger (push) Successful in 2m36s
2026-01-26 11:56:58 +07:00
f1d20905d0 refactor(forwarder): remove CreateForwardedTCPIPPayload method
SonarQube Scan / SonarQube Trigger (push) Successful in 2m32s
- OpenForwardedChannel now privately calls CreateForwardedTCPIPPayload
- Removed an unused function
2026-01-25 20:49:12 +07:00
21b551a66d feat(http): add http header size limit for initial request
SonarQube Scan / SonarQube Trigger (push) Successful in 2m18s
2026-01-25 18:47:54 +07:00
05bf9d6045 refactor(header): NewRequest to accept only []byte
SonarQube Scan / SonarQube Trigger (push) Failing after 54s
2026-01-25 18:45:08 +07:00
5cd3c201f2 test(config): add test for keyloc and header size
SonarQube Scan / SonarQube Trigger (push) Failing after 56s
2026-01-25 18:17:37 +07:00
9cdce24030 test(stream): migrate mocking to testify
SonarQube Scan / SonarQube Trigger (push) Successful in 2m21s
2026-01-25 18:14:29 +07:00
8b44e4db4e refactor: remove duplicate channel management helpers from HTTP handler
SonarQube Scan / SonarQube Trigger (push) Successful in 2m12s
2026-01-25 13:47:57 +07:00
2b488a5ab5 refactor: remove custom parsing functions and use ssh.Marshal/ssh.Unmarshal for serialization
SonarQube Scan / SonarQube Trigger (push) Successful in 2m14s
2026-01-25 12:21:25 +07:00
e59fea6604 test(server): add unit test for handleConnection
SonarQube Scan / SonarQube Trigger (push) Successful in 2m18s
2026-01-24 23:47:51 +07:00
d5f7ebf597 test(lifecycle): add unit tests for lifecycle behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 2m15s
2026-01-24 20:28:30 +07:00
0f5d00f79a test(slug): add unit tests for slug behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 2m10s
2026-01-24 19:16:31 +07:00
f0ab62a753 fix: properly initialize tlsStoragePath in config load
SonarQube Scan / SonarQube Trigger (push) Successful in 2m31s
2026-01-24 17:59:11 +07:00
752bacfe98 fix: correct buffer pool usage to avoid type assertion error
SonarQube Scan / SonarQube Trigger (push) Successful in 2m28s
2026-01-24 17:50:22 +07:00
9c857f6148 refactor(transport): reduce cognitive complexity and clean up public API
SonarQube Scan / SonarQube Trigger (push) Successful in 2m29s
2026-01-24 17:41:41 +07:00
42c428c83d test(bootstrap): add unit tests for initial bootstrap behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 2m30s
2026-01-24 16:15:30 +07:00
1171b18340 refactor: decouple application startup logic from main
SonarQube Scan / SonarQube Trigger (push) Successful in 2m18s
2026-01-24 00:21:40 +07:00
3d43396f3e fix: corrected defer usage to pass buffer pointer
SonarQube Scan / SonarQube Trigger (push) Successful in 2m24s
2026-01-23 20:31:27 +07:00
90423d675c fix: remove unnecessary use of fmt.Sprintf
SonarQube Scan / SonarQube Trigger (push) Successful in 2m34s
2026-01-23 20:28:11 +07:00
b7d6f2bae2 fix: handle error return values for privateKeyFile.Close and pubKeyFile.Close
SonarQube Scan / SonarQube Trigger (push) Has been cancelled
2026-01-23 20:27:20 +07:00
8e8d9eaf39 chore: remove unused headerBuf variable
SonarQube Scan / SonarQube Trigger (push) Successful in 2m13s
2026-01-23 20:05:40 +07:00
636f17cabf ci: sonarqube add linting
SonarQube Scan / SonarQube Trigger (push) Successful in 2m14s
2026-01-23 19:58:09 +07:00
761ee3f099 test(session): add unit tests for session behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m51s
2026-01-23 19:03:01 +07:00
169bc2358c refactor(session): reduce function parameters
SonarQube Scan / SonarQube Trigger (push) Successful in 1m55s
2026-01-23 15:58:50 +07:00
e522ffa44f test(version): add unit tests for version behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m45s
2026-01-23 15:41:00 +07:00
6e6b251a7b test(client): add unit tests for grpc client behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m54s
2026-01-23 15:27:20 +07:00
24ea464c7a fix(client): reduce cognitive complexity and fix typo (go:S3776)
SonarQube Scan / SonarQube Trigger (push) Successful in 1m51s
2026-01-23 14:57:06 +07:00
4334dfe9b4 test(key): add unit tests for key behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 2m1s
2026-01-23 14:17:18 +07:00
dbaf5f4e60 ci: update SonarQube action configuration
SonarQube Scan / SonarQube Trigger (push) Successful in 1m41s
2026-01-23 13:38:50 +07:00
5bed32bda3 test(server): add unit tests for server startup behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m49s
2026-01-22 21:58:25 +07:00
6d57dfa34c test(config): add unit tests for config behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m35s
2026-01-22 21:24:58 +07:00
7159300fa2 test(stream): add unit tests for stream behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m39s
- Fix duplicating EOF error when closing SSH connection
- Add new SessionStatusCLOSED type
2026-01-22 21:04:05 +07:00
d7e1f3fa63 test(header): add unit tests for header behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m39s
2026-01-22 19:47:31 +07:00
8d5e1b970a update: exclude local test coverage
SonarQube Scan / SonarQube Trigger (push) Has been cancelled
2026-01-22 19:46:47 +07:00
b0249c45ae test(transport): add unit tests for transport behavior using Testify
SonarQube Scan / SonarQube Trigger (push) Successful in 1m51s
2026-01-22 19:22:35 +07:00
9d03f5507f test(random): add unit tests for random behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m37s
- Added unit tests to cover random string generation and error handling.
- Introduced Random interface and random struct for better abstraction.
- Updated server, session, and interaction packages to require Random interface for dependency injection.
2026-01-22 13:28:10 +07:00
ae31e573b5 test(port): add unit tests for port behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m35s
2026-01-22 12:39:46 +07:00
a350692e81 test(middleware): add unit tests for middleware behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 1m30s
- remove redundant check on registry.Update and check if slug exist before locking the mutex
- Update SonarQube action to not use Go cache when setting up Go
2026-01-22 12:34:24 +07:00
5a7aa1ecb7 ci: automate Go tests and Sonar coverage reporting
SonarQube Scan / SonarQube Trigger (push) Successful in 10m48s
2026-01-22 01:29:29 +07:00
ed11a0b801 test(registry): add unit tests for registry behavior
SonarQube Scan / SonarQube Trigger (push) Successful in 47s
2026-01-22 00:47:53 +07:00
634c8321ef refactor(registry): define reusable constant errors
SonarQube Scan / SonarQube Trigger (push) Successful in 52s
SonarQube Scan / SonarQube Trigger (pull_request) Successful in 46s
- Introduced package-level error variables in registry to replace repeated fmt.Errorf calls
- Added errors like ErrSessionNotFound, ErrSlugInUse, ErrInvalidSlug, ErrForbiddenSlug, ErrSlugChangeNotAllowed, and ErrSlugUnchanged
2026-01-22 00:39:28 +07:00
9f4c24a3f3 refactor(lifecycle): reorder resource closing and simplify Close()
SonarQube Scan / SonarQube Trigger (push) Successful in 53s
- Close channel and connection first, then remove session
- Close forwarded port and forwarder at the end for TCP tunnels
- Aggregate all errors using errors.Join instead of failing early
2026-01-21 21:59:59 +07:00
1408b80917 ci: add sonarqube scan
SonarQube Scan / SonarQube Trigger (push) Successful in 48s
2026-01-21 21:24:57 +07:00
2bc20dd991 refactor(config): centralize env loading and enforce typed access
- Centralize environment variable loading in config.MustLoad
- Parse and validate all env vars once at initialization
- Make config fields private and read-only
- Remove public Getenv usage in favor of typed accessors
- Improve validation and initialization order
- Normalize enum naming to be idiomatic and avoid constant collisions
2026-01-21 19:43:19 +07:00
1e12373359 chore(restructure): reorganize project layout
Docker Build and Push / build-and-push-branches (push) Has been skipped
Docker Build and Push / build-and-push-tags (push) Successful in 13m1s
- Reorganize internal packages and overall project structure
- Update imports and wiring to match the new layout
- Separate HTTP parsing and streaming from the server package
- Separate middleware from the server package
- Separate session registry from the session package
- Move HTTP, HTTPS, and TCP servers to the transport package
- Session package no longer starts the TCP server directly
- Server package no longer starts HTTP/HTTPS servers on initialization
- Forwarder no longer handles accepting TCP requests
- Move session details to the types package
- HTTP/HTTPS initialization is now the responsibility of main
2026-01-21 14:06:46 +07:00
9a4539cc02 refactor(httpheader): extract header parsing into dedicated package
Docker Build and Push / build-and-push-tags (push) Has been skipped
Docker Build and Push / build-and-push-branches (push) Successful in 11m19s
Moved HTTP header parsing and building logic from server package to internal/httpheader
2026-01-20 21:15:34 +07:00
e3ead4d52f refactor: optimize header parsing and remove factory naming
Docker Build and Push / build-and-push-tags (push) Has been skipped
Docker Build and Push / build-and-push-branches (push) Successful in 11m20s
- Remove factory naming
- Use direct byte indexing instead of bytes.TrimRight
- Extract parseStartLine and setRemainingHeaders helpers
2026-01-20 20:56:08 +07:00
aa1a465178 refactor(forwarder): improve connection handling and cleanup
Docker Build and Push / build-and-push-tags (push) Has been skipped
Docker Build and Push / build-and-push-branches (push) Has been cancelled
- Extract copyAndClose method for bidirectional data transfe
- Add closeWriter helper for graceful connection shutdown
- Add handleIncomingConnection helper
- Add openForwardedChannel helper
2026-01-20 19:01:15 +07:00
27f49879af refactor(server): enhance HTTP handler modularity and fix resource leak
Docker Build and Push / build-and-push-tags (push) Has been skipped
Docker Build and Push / build-and-push-branches (push) Successful in 11m43s
- Rename customWriter struct to httpWriter for clarity
- Add closeWriter field to properly close write side of connections
- Update all cw variable references to hw
- Merge handlerTLS into handler function to reduce code duplication
- Extract handler into smaller, focused methods
- Split Read/Write/forwardRequest into composable functions

Fixes resource leak where connections weren't properly closed on the
write side, matching the forwarder's CloseWrite() pattern.
2026-01-19 22:41:04 +07:00
adb0264bb5 refactor(session): simplify Start() and unify forwarding logic
- Extract helper functions from Start() for better code organization
- Eliminate duplication with finalizeForwarding() method
- Consolidate denial logic into denyForwardingRequest()
- Update all handler methods to return errors instead of logging internally
- Improve error handling consistency across all operations
2026-01-19 15:53:16 +07:00
8fb19af5a6 fix: resolve copy goroutine deadlock on early connection close
- Add proper CloseWrite handling to signal EOF to other goroutine
- Ensure both copy goroutines terminate when either side closes
- Prevent goroutine leaks for SSH forwarded-tcpip channels:
    - Use select with default when sending result to resultChan
    - Close unused SSH channels and discard requests if main goroutine has already timed out
2026-01-19 00:20:28 +07:00
41fdb5639c Merge pull request 'refactor: explicit initialization and dependency injection' (#70) from staging into main
Docker Build and Push / build-and-push-tags (push) Has been skipped
Docker Build and Push / build-and-push-branches (push) Successful in 9m49s
Reviewed-on: #70
2026-01-18 21:46:59 +07:00
44d224f491 refactor: explicit initialization and dependency injection
Docker Build and Push / build-and-push-branches (push) Has been skipped
Docker Build and Push / build-and-push-tags (push) Successful in 10m10s
- Replace init() with config.Load() function when loading env variables
- Inject portRegistry into session, server, and lifecycle structs
- Inject sessionRegistry directly into interaction and lifecycle
- Remove SetSessionRegistry function and global port variables
- Pass ssh.Conn directly to forwarder constructor instead of lifecycle interface
- Pass user and closeFunc callback to interaction constructor instead of lifecycle interface
- Eliminate circular dependencies between lifecycle, forwarder, and interaction
- Remove setter methods (SetLifecycle) from forwarder and interaction interfaces
2026-01-18 21:20:05 +07:00
9be0328e24 Merge pull request 'staging' (#69) from staging into main
Docker Build and Push / build-and-push-tags (push) Has been skipped
Docker Build and Push / build-and-push-branches (push) Successful in 9m30s
Reviewed-on: #69
2026-01-17 19:15:40 +07:00
2b9bca65d5 refactor(interaction): separate view and update logic into modular files
Docker Build and Push / build-and-push-branches (push) Has been skipped
Docker Build and Push / build-and-push-tags (push) Successful in 11m44s
- Extract slug editing logic to slug.go (slugView/slugUpdate)
- Extract commands menu logic to commands.go (commandsView/commandsUpdate)
- Extract coming soon modal to coming_soon.go (comingSoonView/comingSoonUpdate)
- Extract main dashboard logic to dashboard.go (dashboardView/dashboardUpdate)
- Create model.go for shared model struct and helper functions
- Replace math/rand with crypto/rand for random subdomain generation
- Remove legacy TLS cipher suite configuration
2026-01-17 17:33:10 +07:00
6587dc0f39 refactor(interaction): separate view and update logic into modular files
- Extract slug editing logic to slug.go (slugView/slugUpdate)
- Extract commands menu logic to commands.go (commandsView/commandsUpdate)
- Extract coming soon modal to coming_soon.go (comingSoonView/comingSoonUpdate)
- Extract main dashboard logic to dashboard.go (dashboardView/dashboardUpdate)
- Create model.go for shared model struct and helper functions
- Replace math/rand with crypto/rand for random subdomain generation
- Remove legacy TLS cipher suite configuration
2026-01-17 17:30:21 +07:00
f421781f44 Merge pull request 'refactor: convert structs to interfaces and rename accessors' (#68) from staging into main
Docker Build and Push / build-and-push-tags (push) Has been skipped
Docker Build and Push / build-and-push-branches (push) Successful in 10m34s
Reviewed-on: #68
2026-01-16 16:41:22 +07:00
1a04af8873 Merge branch 'main' into staging
Docker Build and Push / build-and-push-branches (push) Successful in 11m35s
Docker Build and Push / build-and-push-tags (push) Has been skipped
2026-01-16 16:28:39 +07:00

Diff Content Not Available