gitextract_lb0oskn5/ ├── .github/ │ └── workflows/ │ └── ci.yml ├── .gitignore ├── .mvn/ │ └── wrapper/ │ └── maven-wrapper.properties ├── Dockerfile-cli ├── Dockerfile-eureka ├── Dockerfile-gateway ├── Dockerfile-net-proxy ├── Dockerfile-server ├── Dockerfile-ssl-service ├── Dockerfile-web ├── LICENSE ├── README.md ├── cli/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── tech/ │ │ └── amak/ │ │ └── portbuddy/ │ │ └── cli/ │ │ ├── PortBuddy.java │ │ ├── config/ │ │ │ └── ConfigurationService.java │ │ ├── tunnel/ │ │ │ ├── HttpTunnelClient.java │ │ │ └── NetTunnelClient.java │ │ ├── ui/ │ │ │ ├── ConsoleUi.java │ │ │ ├── HttpLogSink.java │ │ │ └── NetTrafficSink.java │ │ └── utils/ │ │ ├── HttpUtils.java │ │ └── JsonUtils.java │ └── resources/ │ ├── META-INF/ │ │ └── native-image/ │ │ └── tech.amak/ │ │ └── port-buddy-cli/ │ │ ├── reflect-config.json │ │ └── resource-config.json │ ├── application-dev.yml │ ├── application.yml │ └── logback.xml ├── common/ │ ├── pom.xml │ └── src/ │ └── main/ │ └── java/ │ └── tech/ │ └── amak/ │ └── portbuddy/ │ └── common/ │ ├── ClientConfig.java │ ├── Plan.java │ ├── TunnelType.java │ ├── dto/ │ │ ├── DnsInstructionsEmailRequest.java │ │ ├── ExposeRequest.java │ │ ├── ExposeResponse.java │ │ ├── auth/ │ │ │ ├── RegisterRequest.java │ │ │ ├── RegisterResponse.java │ │ │ ├── TokenExchangeRequest.java │ │ │ └── TokenExchangeResponse.java │ │ └── jwks/ │ │ ├── JwkKey.java │ │ └── JwksResponse.java │ ├── tunnel/ │ │ ├── BinaryWsFrame.java │ │ ├── ControlMessage.java │ │ ├── HttpTunnelMessage.java │ │ ├── MessageEnvelope.java │ │ └── WsTunnelMessage.java │ └── utils/ │ └── IdUtils.java ├── docker-compose.yml ├── entrypoint-cli-native.sh ├── entrypoint-web.sh ├── entrypoint.sh ├── eureka/ │ ├── HELP.md │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── tech/ │ │ │ └── amak/ │ │ │ └── portbuddy/ │ │ │ └── eureka/ │ │ │ ├── EurekaApplication.java │ │ │ └── security/ │ │ │ └── SecurityConfig.java │ │ └── resources/ │ │ └── application.yml │ └── test/ │ └── java/ │ └── tech/ │ └── amak/ │ └── portbuddy/ │ └── eureka/ │ └── EurekaApplicationTests.java ├── gateway/ │ ├── HELP.md │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── tech/ │ │ │ └── amak/ │ │ │ └── portbuddy/ │ │ │ └── gateway/ │ │ │ ├── ApiGatewayApplication.java │ │ │ ├── client/ │ │ │ │ └── SslServiceClient.java │ │ │ ├── config/ │ │ │ │ ├── AppProperties.java │ │ │ │ ├── GlobalExceptionHandler.java │ │ │ │ ├── LoadBalancerClientsConfig.java │ │ │ │ ├── NetProxyLoadBalancerConfiguration.java │ │ │ │ ├── PortBuddyServerLoadBalancerConfiguration.java │ │ │ │ ├── SslServerConfig.java │ │ │ │ └── WebClientConfig.java │ │ │ ├── dto/ │ │ │ │ └── CertificateResponse.java │ │ │ ├── filter/ │ │ │ │ └── PortBuddyRewritePathGatewayFilterFactory.java │ │ │ ├── loadbalancer/ │ │ │ │ ├── NetProxyPublicHostLoadBalancer.java │ │ │ │ └── PortBuddySubdomainLoadBalancer.java │ │ │ ├── security/ │ │ │ │ ├── GatewayJwtConfig.java │ │ │ │ └── GatewaySecurityConfig.java │ │ │ └── ssl/ │ │ │ ├── DynamicSslProvider.java │ │ │ └── SniSslContextMapping.java │ │ └── resources/ │ │ └── application.yml │ └── test/ │ └── java/ │ └── tech/ │ └── amak/ │ ├── gateway/ │ │ └── ApiGatewayApplicationTests.java │ └── portbuddy/ │ └── gateway/ │ ├── config/ │ │ └── SslServerConfigTest.java │ └── ssl/ │ └── DynamicSslProviderTest.java ├── lombok.config ├── mvnw ├── mvnw.cmd ├── net-proxy/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── tech/ │ │ │ └── amak/ │ │ │ └── portbuddy/ │ │ │ └── netproxy/ │ │ │ ├── NetProxyApplication.java │ │ │ ├── config/ │ │ │ │ ├── AppProperties.java │ │ │ │ ├── JwtConfig.java │ │ │ │ └── WebSocketConfig.java │ │ │ ├── security/ │ │ │ │ └── SecurityConfig.java │ │ │ ├── tunnel/ │ │ │ │ ├── NetTunnelRegistry.java │ │ │ │ └── NetTunnelWebSocketHandler.java │ │ │ └── web/ │ │ │ └── NetProxyController.java │ │ └── resources/ │ │ └── application.yml │ └── test/ │ └── java/ │ └── tech/ │ └── amak/ │ └── portbuddy/ │ └── netproxy/ │ └── tunnel/ │ ├── NetTunnelLeakVerificationTest.java │ ├── NetTunnelOrphanCleanupTest.java │ ├── NetTunnelRegistryConcurrencyTest.java │ ├── NetTunnelRegistryTest.java │ └── NetTunnelUdpEvictionTest.java ├── pom.xml ├── server/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── tech/ │ │ │ └── amak/ │ │ │ └── portbuddy/ │ │ │ └── server/ │ │ │ ├── ServerApplication.java │ │ │ ├── client/ │ │ │ │ ├── NetProxyClient.java │ │ │ │ └── SslServiceClient.java │ │ │ ├── config/ │ │ │ │ ├── AppProperties.java │ │ │ │ ├── SchedulingConfig.java │ │ │ │ ├── ThreatFoxProperties.java │ │ │ │ └── TunnelsProperties.java │ │ │ ├── db/ │ │ │ │ ├── entity/ │ │ │ │ │ ├── AccountEntity.java │ │ │ │ │ ├── ApiKeyEntity.java │ │ │ │ │ ├── DomainEntity.java │ │ │ │ │ ├── InvitationEntity.java │ │ │ │ │ ├── PasswordResetTokenEntity.java │ │ │ │ │ ├── PortReservationEntity.java │ │ │ │ │ ├── Role.java │ │ │ │ │ ├── StripeEventEntity.java │ │ │ │ │ ├── TunnelEntity.java │ │ │ │ │ ├── TunnelStatus.java │ │ │ │ │ ├── UserAccountEntity.java │ │ │ │ │ └── UserEntity.java │ │ │ │ └── repo/ │ │ │ │ ├── AccountRepository.java │ │ │ │ ├── ApiKeyRepository.java │ │ │ │ ├── DomainRepository.java │ │ │ │ ├── InvitationRepository.java │ │ │ │ ├── PasswordResetTokenRepository.java │ │ │ │ ├── PortReservationRepository.java │ │ │ │ ├── StripeEventRepository.java │ │ │ │ ├── TunnelRepository.java │ │ │ │ ├── UserAccountRepository.java │ │ │ │ └── UserRepository.java │ │ │ ├── mail/ │ │ │ │ ├── EmailService.java │ │ │ │ ├── UserCreatedEvent.java │ │ │ │ └── WelcomeEmailService.java │ │ │ ├── security/ │ │ │ │ ├── ApiTokenAuthFilter.java │ │ │ │ ├── JwtConfig.java │ │ │ │ ├── JwtService.java │ │ │ │ ├── Oauth2SuccessHandler.java │ │ │ │ ├── RsaKeyProvider.java │ │ │ │ ├── SecurityConfig.java │ │ │ │ └── ThreatBlockedException.java │ │ │ ├── service/ │ │ │ │ ├── ApiTokenService.java │ │ │ │ ├── DomainService.java │ │ │ │ ├── PaymentCleanupService.java │ │ │ │ ├── PortReservationService.java │ │ │ │ ├── ProxyDiscoveryService.java │ │ │ │ ├── StaleTunnelsReaper.java │ │ │ │ ├── StripeService.java │ │ │ │ ├── StripeWebhookService.java │ │ │ │ ├── TeamService.java │ │ │ │ ├── TunnelService.java │ │ │ │ ├── threatfox/ │ │ │ │ │ ├── ThreatFoxClient.java │ │ │ │ │ ├── ThreatFoxIoc.java │ │ │ │ │ ├── ThreatFoxRequest.java │ │ │ │ │ ├── ThreatFoxResponse.java │ │ │ │ │ └── ThreatFoxService.java │ │ │ │ └── user/ │ │ │ │ ├── MissingEmailException.java │ │ │ │ ├── PasswordResetService.java │ │ │ │ └── UserProvisioningService.java │ │ │ ├── tunnel/ │ │ │ │ ├── PermissiveSubprotocolHandshakeHandler.java │ │ │ │ ├── PublicWebSocketProxyHandler.java │ │ │ │ ├── TunnelRegistry.java │ │ │ │ ├── TunnelWebSocketHandler.java │ │ │ │ └── WebSocketConfig.java │ │ │ └── web/ │ │ │ ├── AuthController.java │ │ │ ├── DomainsController.java │ │ │ ├── ExposeController.java │ │ │ ├── IngressController.java │ │ │ ├── IngressResolveController.java │ │ │ ├── InternalDomainController.java │ │ │ ├── InternalEmailController.java │ │ │ ├── JwksController.java │ │ │ ├── PaymentController.java │ │ │ ├── PortsController.java │ │ │ ├── StripeWebhookController.java │ │ │ ├── TeamController.java │ │ │ ├── TokensController.java │ │ │ ├── TunnelStatusController.java │ │ │ ├── TunnelsController.java │ │ │ ├── UsersController.java │ │ │ ├── admin/ │ │ │ │ ├── AdminAccountController.java │ │ │ │ ├── AdminSystemController.java │ │ │ │ ├── AdminTunnelController.java │ │ │ │ ├── AdminUserController.java │ │ │ │ └── dto/ │ │ │ │ ├── AdminAccountRow.java │ │ │ │ ├── AdminStatsRow.java │ │ │ │ ├── AdminTunnelRow.java │ │ │ │ ├── AdminUserRow.java │ │ │ │ └── SystemStatsResponse.java │ │ │ ├── advice/ │ │ │ │ └── GlobalExceptionHandler.java │ │ │ └── dto/ │ │ │ ├── DomainDto.java │ │ │ ├── LoginRequest.java │ │ │ ├── PasswordResetConfirm.java │ │ │ ├── PasswordResetRequest.java │ │ │ ├── PortRangeDto.java │ │ │ ├── PortReservationDto.java │ │ │ ├── PortReservationUpdateRequest.java │ │ │ ├── SetPasscodeRequest.java │ │ │ ├── UpdateCustomDomainRequest.java │ │ │ └── UpdateDomainRequest.java │ │ └── resources/ │ │ ├── application.yml │ │ ├── db/ │ │ │ └── migration/ │ │ │ ├── V10__link_http_tunnels_to_domain.sql │ │ │ ├── V11__add_deleted_column_to_domains.sql │ │ │ ├── V12__drop_tunnel_id_from_tunnels.sql │ │ │ ├── V13__password_reset_tokens.sql │ │ │ ├── V14__port_reservations.sql │ │ │ ├── V15__add_user_to_port_reservations.sql │ │ │ ├── V16__add_port_reservation_to_tunnels.sql │ │ │ ├── V17__soft_delete_port_reservations.sql │ │ │ ├── V18__add_passcode_to_domains.sql │ │ │ ├── V19__add_temp_passcode_to_tunnels.sql │ │ │ ├── V1__accounts_and_users.sql │ │ │ ├── V20__add_custom_domain_to_domains.sql │ │ │ ├── V21__add_roles_to_users.sql │ │ │ ├── V22__update_plans.sql │ │ │ ├── V23__add_stripe_fields.sql │ │ │ ├── V24__create_stripe_events_table.sql │ │ │ ├── V25__create_invitations_table.sql │ │ │ ├── V26__many_to_many_users_accounts.sql │ │ │ ├── V27__add_ssl_active_to_domains.sql │ │ │ ├── V28__add_blocked_to_accounts.sql │ │ │ ├── V29__add_name_to_port_reservations.sql │ │ │ ├── V2__api_keys.sql │ │ │ ├── V30__unique_port_reservation_name.sql │ │ │ ├── V31__lowercase_domains.sql │ │ │ ├── V3__tunnels.sql │ │ │ ├── V4__shedlock_and_heartbeat_indexes.sql │ │ │ ├── V5__add_password_and_admin.sql │ │ │ ├── V6__create_domains_table.sql │ │ │ ├── V7__link_tunnels_to_account.sql │ │ │ ├── V8__add_user_id_to_tunnels.sql │ │ │ └── V9__link_api_keys_to_account.sql │ │ ├── keys/ │ │ │ ├── dev_jwt.pem │ │ │ └── dev_jwt.pub │ │ └── templates/ │ │ └── email/ │ │ ├── base.html │ │ ├── dns-instructions.html │ │ ├── password-reset-success.html │ │ ├── password-reset.html │ │ ├── payment-failed.html │ │ ├── plan-changed.html │ │ ├── subscription-canceled.html │ │ ├── subscription-success.html │ │ ├── team-invite.html │ │ └── welcome.html │ └── test/ │ └── java/ │ └── tech/ │ └── amak/ │ └── portbuddy/ │ └── server/ │ ├── security/ │ │ └── Oauth2SuccessHandlerTest.java │ ├── service/ │ │ ├── DomainServiceTest.java │ │ ├── PaymentCleanupServiceTest.java │ │ ├── PortReservationServiceTest.java │ │ ├── StaleTunnelsReaperTest.java │ │ └── TunnelServiceTest.java │ ├── tunnel/ │ │ └── TunnelRegistryLeakTest.java │ ├── user/ │ │ └── PasswordResetServiceTest.java │ └── web/ │ ├── AuthControllerTest.java │ ├── IngressControllerTest.java │ ├── PaymentControllerTest.java │ ├── StripeWebhookControllerTest.java │ ├── TeamControllerTest.java │ ├── TokensControllerTest.java │ ├── UsersControllerTest.java │ └── admin/ │ └── AdminAccountControllerTest.java ├── ssl-service/ │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── tech/ │ │ │ └── amak/ │ │ │ └── portbuddy/ │ │ │ └── sslservice/ │ │ │ ├── SslServiceApplication.java │ │ │ ├── client/ │ │ │ │ └── ServerClient.java │ │ │ ├── config/ │ │ │ │ ├── AppProperties.java │ │ │ │ ├── AsyncConfig.java │ │ │ │ ├── JpaAuditingConfig.java │ │ │ │ ├── RestConfig.java │ │ │ │ └── SchedulingConfig.java │ │ │ ├── domain/ │ │ │ │ ├── CertificateEntity.java │ │ │ │ ├── CertificateJobEntity.java │ │ │ │ ├── CertificateJobStatus.java │ │ │ │ └── CertificateStatus.java │ │ │ ├── repo/ │ │ │ │ ├── CertificateJobRepository.java │ │ │ │ └── CertificateRepository.java │ │ │ ├── security/ │ │ │ │ └── SecurityConfig.java │ │ │ ├── service/ │ │ │ │ ├── AcmeAccountService.java │ │ │ │ ├── AcmeCertificateService.java │ │ │ │ ├── AcmeClientService.java │ │ │ │ ├── CertificateStorageService.java │ │ │ │ ├── DnsResolverService.java │ │ │ │ ├── EmailService.java │ │ │ │ ├── RenewalScheduler.java │ │ │ │ ├── RetryExecutor.java │ │ │ │ ├── TransientErrorClassifier.java │ │ │ │ └── impl/ │ │ │ │ ├── ServerEmailService.java │ │ │ │ └── SimpleDnsResolverService.java │ │ │ ├── web/ │ │ │ │ ├── CertificatesController.java │ │ │ │ ├── ChallengeController.java │ │ │ │ ├── InternalController.java │ │ │ │ ├── JobsController.java │ │ │ │ └── dto/ │ │ │ │ ├── CreateCertificateRequest.java │ │ │ │ ├── CreateManagedCertificateRequest.java │ │ │ │ └── CreateRootDomainRequest.java │ │ │ └── work/ │ │ │ └── ChallengeTokenStore.java │ │ └── resources/ │ │ ├── application.yml │ │ └── db/ │ │ └── migration/ │ │ ├── V1__init.sql │ │ ├── V2__shedlock_table.sql │ │ └── V3__add_full_chain_path.sql │ └── test/ │ ├── java/ │ │ └── tech/ │ │ └── amak/ │ │ └── portbuddy/ │ │ └── sslservice/ │ │ └── service/ │ │ └── CertificateRenewalServiceTest.java │ └── resources/ │ └── application-test.yml └── web/ ├── index.html ├── package.json ├── pom.xml ├── postcss.config.js ├── public/ │ ├── install.ps1 │ ├── install.sh │ ├── pages/ │ │ ├── contacts.html │ │ ├── docs/ │ │ │ └── guides/ │ │ │ ├── hytale-server.html │ │ │ └── minecraft-server.html │ │ ├── docs.html │ │ ├── index.html │ │ ├── install.html │ │ ├── privacy.html │ │ └── terms.html │ ├── robots.txt │ ├── setup-portbuddy-service.ps1 │ ├── setup-portbuddy-service.sh │ ├── site.webmanifest │ └── sitemap.xml ├── src/ │ ├── App.tsx │ ├── auth/ │ │ └── AuthContext.tsx │ ├── components/ │ │ ├── AppLayout.tsx │ │ ├── CodeBlock.tsx │ │ ├── LoadingContext.tsx │ │ ├── Modal.tsx │ │ ├── PageHeader.tsx │ │ ├── PlanComparison.tsx │ │ ├── ProgressBar.tsx │ │ └── ProtectedRoute.tsx │ ├── index.css │ ├── lib/ │ │ ├── api.ts │ │ └── utils.ts │ ├── main.tsx │ └── pages/ │ ├── AcceptInvite.tsx │ ├── Contacts.tsx │ ├── ForgotPassword.tsx │ ├── Installation.tsx │ ├── Landing.tsx │ ├── Login.tsx │ ├── NotFound.tsx │ ├── Passcode.tsx │ ├── Privacy.tsx │ ├── Register.tsx │ ├── ResetPassword.tsx │ ├── ServerError.tsx │ ├── Terms.tsx │ ├── app/ │ │ ├── AdminAccounts.tsx │ │ ├── AdminPanel.tsx │ │ ├── AdminTunnels.tsx │ │ ├── AdminUsers.tsx │ │ ├── Billing.tsx │ │ ├── BillingCancel.tsx │ │ ├── BillingSuccess.tsx │ │ ├── Domains.tsx │ │ ├── Ports.tsx │ │ ├── Profile.tsx │ │ ├── Settings.tsx │ │ ├── Team.tsx │ │ ├── Tokens.tsx │ │ └── Tunnels.tsx │ └── docs/ │ ├── DocsLayout.tsx │ ├── DocsOverview.tsx │ └── guides/ │ ├── HytaleGuide.tsx │ └── MinecraftGuide.tsx ├── tailwind.config.js ├── tsconfig.json └── vite.config.ts