SYMBOL INDEX (992 symbols across 246 files) FILE: cli/src/main/java/tech/amak/portbuddy/cli/PortBuddy.java class PortBuddy (line 48) | @Slf4j method main (line 71) | public static void main(final String[] args) { method execute (line 83) | public int execute(final String[] args) { method printHelp (line 149) | private void printHelp() { method printVersion (line 172) | private void printVersion() { method init (line 176) | private int init(final String apiToken) { method expose (line 187) | private int expose() { method callExposeTunnel (line 327) | private ExposeResponse callExposeTunnel(final String baseUrl, final St... method exchangeApiTokenForJwt (line 366) | private String exchangeApiTokenForJwt(final String baseUrl, final Stri... method resolveCliVersion (line 403) | private String resolveCliVersion() { method ensureAuthenticated (line 412) | private boolean ensureAuthenticated(final ClientConfig config) { method registerUser (line 449) | private String registerUser(final String baseUrl, method parseHostPort (line 487) | private HostPort parseHostPort(final String arg) { class HostPort (line 574) | private static final class HostPort { method HostPort (line 579) | private HostPort(final String host, final int port, final String sch... FILE: cli/src/main/java/tech/amak/portbuddy/cli/config/ConfigurationService.java class ConfigurationService (line 36) | @Slf4j method ConfigurationService (line 50) | private ConfigurationService() { method configureLogging (line 61) | private void configureLogging() { method loadConfig (line 75) | private void loadConfig() throws IOException { method loadToken (line 98) | private void loadToken() throws IOException { method getConfig (line 108) | public ClientConfig getConfig() { method isDev (line 112) | public boolean isDev() { method saveApiToken (line 126) | public void saveApiToken(final String token) throws IOException { FILE: cli/src/main/java/tech/amak/portbuddy/cli/tunnel/HttpTunnelClient.java class HttpTunnelClient (line 55) | @Slf4j method createHttpClient (line 74) | private static OkHttpClient createHttpClient() { method createLocalHttpClient (line 87) | private static OkHttpClient createLocalHttpClient() { method runBlocking (line 137) | public void runBlocking() { method close (line 195) | public void close() { method toWebSocketUrl (line 221) | private String toWebSocketUrl(final String base, final String path) { class Listener (line 233) | private class Listener extends WebSocketListener { method onOpen (line 234) | @Override method onMessage (line 259) | @Override method onClosed (line 311) | @Override method onFailure (line 329) | @Override method handleWsFromServer (line 348) | private void handleWsFromServer(final WsTunnelMessage message) { class LocalWsListener (line 402) | @RequiredArgsConstructor method onOpen (line 407) | @Override method onMessage (line 419) | @Override method onMessage (line 432) | @Override method onClosed (line 445) | @Override method onFailure (line 460) | @Override method handleRequest (line 466) | private HttpTunnelMessage handleRequest(final HttpTunnelMessage reques... method buildErrorMessage (line 553) | private static HttpTunnelMessage buildErrorMessage(final String id, fi... method buildBody (line 565) | private RequestBody buildBody(final String method, final String bodyB6... method methodSupportsBody (line 579) | private boolean methodSupportsBody(final String method) { method extractHeaders (line 589) | private Map> extractHeaders(final Response respon... FILE: cli/src/main/java/tech/amak/portbuddy/cli/tunnel/NetTunnelClient.java class NetTunnelClient (line 58) | @Slf4j method runBlocking (line 110) | public void runBlocking() { method close (line 176) | public void close() { method close (line 201) | private void close(final LocalTcp localTcp) { method close (line 211) | private void close(final LocalUdp localUdp) { method toWebSocketUrl (line 221) | private String toWebSocketUrl(final String httpUri, final String path) { class Listener (line 234) | private class Listener extends WebSocketListener { method onOpen (line 235) | @Override method onMessage (line 287) | @Override method onMessage (line 316) | @Override method onClosed (line 369) | @Override method onFailure (line 388) | @Override method reportClosedSafe (line 408) | private void reportClosedSafe() { method handleControl (line 418) | private void handleControl(final WsTunnelMessage message) throws Excep... method pumpLocalToProxy (line 509) | private void pumpLocalToProxy(final LocalTcp local) { class LocalTcp (line 540) | private static class LocalTcp { method LocalTcp (line 546) | LocalTcp(final String connectionId, final Socket sock) throws Except... class LocalUdp (line 554) | private static class LocalUdp { method LocalUdp (line 558) | LocalUdp(final String connectionId, final DatagramSocket sock) { method pumpUdpLocalToProxy (line 564) | private void pumpUdpLocalToProxy(final LocalUdp local) { method postStatus (line 586) | private void postStatus(final String path) throws Exception { FILE: cli/src/main/java/tech/amak/portbuddy/cli/ui/ConsoleUi.java class ConsoleUi (line 40) | @Slf4j method promptForUserRegistration (line 73) | public static RegisterRequest promptForUserRegistration() throws IOExc... method isValidEmail (line 92) | private static boolean isValidEmail(final String email) { method buildTerminal (line 96) | private static Terminal buildTerminal() throws IOException { method start (line 122) | public void start() { method waitForExit (line 168) | public void waitForExit() { method stop (line 187) | public void stop() { method onHttpLog (line 201) | @Override method onBytesIn (line 211) | @Override method onBytesOut (line 216) | @Override method renderLoop (line 221) | private void renderLoop() { method clear (line 238) | private void clear() { method render (line 247) | private void render() { method safe (line 270) | private String safe(final String value) { FILE: cli/src/main/java/tech/amak/portbuddy/cli/ui/HttpLogSink.java type HttpLogSink (line 17) | public interface HttpLogSink { method onHttpLog (line 18) | void onHttpLog(final String method, final String url, final int status); FILE: cli/src/main/java/tech/amak/portbuddy/cli/ui/NetTrafficSink.java type NetTrafficSink (line 17) | public interface NetTrafficSink { method onBytesIn (line 19) | void onBytesIn(final long bytes); method onBytesOut (line 21) | void onBytesOut(final long bytes); FILE: cli/src/main/java/tech/amak/portbuddy/cli/utils/HttpUtils.java class HttpUtils (line 28) | @Slf4j method createClient (line 38) | public static OkHttpClient createClient() { method configureInsecureSsl (line 52) | public static void configureInsecureSsl(final OkHttpClient.Builder bui... FILE: cli/src/main/java/tech/amak/portbuddy/cli/utils/JsonUtils.java class JsonUtils (line 23) | @NoArgsConstructor(access = AccessLevel.PRIVATE) FILE: common/src/main/java/tech/amak/portbuddy/common/ClientConfig.java class ClientConfig (line 22) | @Data FILE: common/src/main/java/tech/amak/portbuddy/common/Plan.java type Plan (line 18) | public enum Plan { FILE: common/src/main/java/tech/amak/portbuddy/common/TunnelType.java type TunnelType (line 20) | public enum TunnelType { method from (line 34) | public static TunnelType from(final String mode) { FILE: common/src/main/java/tech/amak/portbuddy/common/dto/DnsInstructionsEmailRequest.java class DnsInstructionsEmailRequest (line 26) | @Data FILE: common/src/main/java/tech/amak/portbuddy/common/dto/auth/RegisterRequest.java class RegisterRequest (line 24) | @Data FILE: common/src/main/java/tech/amak/portbuddy/common/dto/auth/RegisterResponse.java class RegisterResponse (line 24) | @Data FILE: common/src/main/java/tech/amak/portbuddy/common/dto/auth/TokenExchangeRequest.java class TokenExchangeRequest (line 24) | @Data FILE: common/src/main/java/tech/amak/portbuddy/common/dto/auth/TokenExchangeResponse.java class TokenExchangeResponse (line 24) | @Data FILE: common/src/main/java/tech/amak/portbuddy/common/dto/jwks/JwkKey.java class JwkKey (line 24) | @Data FILE: common/src/main/java/tech/amak/portbuddy/common/dto/jwks/JwksResponse.java class JwksResponse (line 26) | @Data FILE: common/src/main/java/tech/amak/portbuddy/common/tunnel/BinaryWsFrame.java class BinaryWsFrame (line 27) | public final class BinaryWsFrame { method BinaryWsFrame (line 29) | private BinaryWsFrame() { method encodeToByteBuffer (line 43) | public static ByteBuffer encodeToByteBuffer(final String connectionId, method encodeToArray (line 69) | public static byte[] encodeToArray(final String connectionId, method decode (line 91) | public static Decoded decode(final ByteBuffer buffer) { method decode (line 118) | public static Decoded decode(final byte[] frameBytes) { FILE: common/src/main/java/tech/amak/portbuddy/common/tunnel/ControlMessage.java class ControlMessage (line 25) | @Data type Type (line 41) | public enum Type { FILE: common/src/main/java/tech/amak/portbuddy/common/tunnel/HttpTunnelMessage.java class HttpTunnelMessage (line 29) | @Data type Type (line 85) | public enum Type { FILE: common/src/main/java/tech/amak/portbuddy/common/tunnel/MessageEnvelope.java class MessageEnvelope (line 26) | @Data FILE: common/src/main/java/tech/amak/portbuddy/common/tunnel/WsTunnelMessage.java class WsTunnelMessage (line 27) | @Data type Type (line 76) | public enum Type { FILE: common/src/main/java/tech/amak/portbuddy/common/utils/IdUtils.java class IdUtils (line 20) | public class IdUtils { method IdUtils (line 22) | private IdUtils() { method extractTunnelId (line 33) | public static UUID extractTunnelId(final URI uri) { method parseUuid (line 55) | public static UUID parseUuid(final String id) { FILE: eureka/src/main/java/tech/amak/portbuddy/eureka/EurekaApplication.java class EurekaApplication (line 22) | @SpringBootApplication method main (line 27) | public static void main(final String[] args) { FILE: eureka/src/main/java/tech/amak/portbuddy/eureka/security/SecurityConfig.java class SecurityConfig (line 26) | @Configuration method apiSecurityFilterChain (line 31) | @Bean FILE: eureka/src/test/java/tech/amak/portbuddy/eureka/EurekaApplicationTests.java class EurekaApplicationTests (line 20) | @SpringBootTest method contextLoads (line 23) | @Test FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/ApiGatewayApplication.java class ApiGatewayApplication (line 21) | @SpringBootApplication method main (line 25) | public static void main(final String[] args) { FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/client/SslServiceClient.java class SslServiceClient (line 26) | @Service method SslServiceClient (line 40) | public SslServiceClient(final WebClient.Builder loadBalancedWebClientB... method getCertificate (line 52) | public Mono getCertificate(final String domain) { FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/config/GlobalExceptionHandler.java class GlobalExceptionHandler (line 31) | @ControllerAdvice method handleIllegalArgumentException (line 38) | @ExceptionHandler(ResponseStatusException.class) method handleGenericException (line 52) | @ExceptionHandler(Exception.class) FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/config/LoadBalancerClientsConfig.java class LoadBalancerClientsConfig (line 24) | @Configuration FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/config/NetProxyLoadBalancerConfiguration.java class NetProxyLoadBalancerConfiguration (line 27) | @Slf4j method reactorServiceInstanceLoadBalancer (line 30) | @Bean FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/config/PortBuddyServerLoadBalancerConfiguration.java class PortBuddyServerLoadBalancerConfiguration (line 27) | @Slf4j method reactorServiceInstanceLoadBalancer (line 30) | @Bean FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/config/SslServerConfig.java class SslServerConfig (line 37) | @Configuration method sslCustomizer (line 53) | @Bean method startHttpServer (line 95) | @PostConstruct method stopHttpServer (line 137) | @PreDestroy FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/config/WebClientConfig.java class WebClientConfig (line 22) | @Configuration method loadBalancedWebClientBuilder (line 25) | @Bean FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/filter/PortBuddyRewritePathGatewayFilterFactory.java class PortBuddyRewritePathGatewayFilterFactory (line 33) | @Component method apply (line 36) | @Override FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/loadbalancer/NetProxyPublicHostLoadBalancer.java class NetProxyPublicHostLoadBalancer (line 44) | public class NetProxyPublicHostLoadBalancer implements ReactorServiceIns... method NetProxyPublicHostLoadBalancer (line 58) | public NetProxyPublicHostLoadBalancer(final ObjectProvider i... method extractRequestedPublicHost (line 105) | private String extractRequestedPublicHost(final Request request) { FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/loadbalancer/PortBuddySubdomainLoadBalancer.java class PortBuddySubdomainLoadBalancer (line 44) | public class PortBuddySubdomainLoadBalancer implements ReactorServiceIns... method PortBuddySubdomainLoadBalancer (line 57) | public PortBuddySubdomainLoadBalancer(final ObjectProvider findOwningInstance(final List checkInstance(final ServiceInstance inst... method extractHost (line 123) | private String extractHost(final Request request) { method isCustomDomain (line 140) | private boolean isCustomDomain(final String host) { method extractSubdomain (line 146) | private String extractSubdomain(final String host) { FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/security/GatewayJwtConfig.java class GatewayJwtConfig (line 29) | @Configuration method reactiveJwtDecoder (line 36) | @Bean FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/security/GatewaySecurityConfig.java class GatewaySecurityConfig (line 29) | @Configuration method springSecurityFilterChain (line 33) | @Bean method corsConfigurationSource (line 65) | @Bean FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/ssl/DynamicSslProvider.java class DynamicSslProvider (line 40) | @Service method DynamicSslProvider (line 57) | public DynamicSslProvider(final SslServiceClient sslServiceClient, fin... method releaseSslContext (line 77) | private void releaseSslContext(final Object context, final String key) { method shutdown (line 87) | @PreDestroy method createFallbackSslContext (line 97) | private SslContext createFallbackSslContext() { method getSslContext (line 132) | public Mono getSslContext(final String hostname) { method loadSslContext (line 141) | private Mono loadSslContext(final String hostname) { FILE: gateway/src/main/java/tech/amak/portbuddy/gateway/ssl/SniSslContextMapping.java class SniSslContextMapping (line 26) | @Component method map (line 33) | @Override FILE: gateway/src/test/java/tech/amak/gateway/ApiGatewayApplicationTests.java class ApiGatewayApplicationTests (line 24) | @SpringBootTest( method contextLoads (line 33) | @Test FILE: gateway/src/test/java/tech/amak/portbuddy/gateway/config/SslServerConfigTest.java class SslServerConfigTest (line 40) | class SslServerConfigTest { method shouldInvokeDynamicSslProviderOnSniHandshake (line 42) | @Test FILE: gateway/src/test/java/tech/amak/portbuddy/gateway/ssl/DynamicSslProviderTest.java class DynamicSslProviderTest (line 38) | @ExtendWith(MockitoExtension.class) method setUp (line 55) | @BeforeEach method shouldReturnFallbackWhenCertificateNotFound (line 63) | @Test method shouldReturnFallbackWhenHostnameIsNull (line 75) | @Test method shouldLoadSslContextFromFile (line 84) | @Test FILE: net-proxy/src/main/java/tech/amak/portbuddy/netproxy/NetProxyApplication.java class NetProxyApplication (line 25) | @Slf4j method main (line 30) | static void main(final String[] args) { method onStart (line 34) | @Bean FILE: net-proxy/src/main/java/tech/amak/portbuddy/netproxy/config/JwtConfig.java class JwtConfig (line 32) | @Configuration method loadBalancedRestTemplate (line 38) | @Bean method jwtDecoder (line 50) | @Bean FILE: net-proxy/src/main/java/tech/amak/portbuddy/netproxy/config/WebSocketConfig.java class WebSocketConfig (line 27) | @Configuration method registerWebSocketHandlers (line 35) | @Override method websocketContainer (line 45) | @Bean FILE: net-proxy/src/main/java/tech/amak/portbuddy/netproxy/security/SecurityConfig.java class SecurityConfig (line 32) | @Configuration method apiSecurityFilterChain (line 39) | @Bean method otherSecurityFilterChain (line 61) | @Bean method jwtAuthenticationConverter (line 74) | @Bean FILE: net-proxy/src/main/java/tech/amak/portbuddy/netproxy/tunnel/NetTunnelRegistry.java class NetTunnelRegistry (line 55) | @Slf4j method NetTunnelRegistry (line 108) | public NetTunnelRegistry(final ObjectMapper mapper, final AppPropertie... method shutdown (line 117) | @PreDestroy method cleanupOrphanedTunnels (line 143) | private void cleanupOrphanedTunnels() { method closeTunnelUsingPort (line 174) | private void closeTunnelUsingPort(final int port) { method expose (line 195) | public ExposedPort expose(final UUID tunnelId, final TunnelType tunnel... method exposeTcp (line 213) | private ExposedPort exposeTcp(final UUID tunnelId, final Integer desir... method exposeUdp (line 245) | private ExposedPort exposeUdp(final UUID tunnelId, final int desiredPo... method attachSession (line 283) | public void attachSession(final UUID tunnelId, final WebSocketSession ... method getSession (line 307) | public WebSocketSession getSession(final UUID tunnelId) { method detachSession (line 318) | public void detachSession(final WebSocketSession session) { method closeTunnel (line 334) | public void closeTunnel(final UUID tunnelId) { method acceptLoop (line 390) | private void acceptLoop(final Tunnel tunnel) { method handleNewConnection (line 408) | private void handleNewConnection(final Tunnel tunnel, final Socket soc... method pumpFromPublic (line 455) | private void pumpFromPublic(final Tunnel tunnel, final Connection conn... method startsWith (line 500) | private boolean startsWith(final byte[] buffer, final int bytesRead, f... method udpReceiveLoop (line 512) | private void udpReceiveLoop(final Tunnel tunnel) { method onClientOpenOk (line 534) | public void onClientOpenOk(final UUID tunnelId, final String connectio... method onClientBinary (line 563) | public void onClientBinary(final UUID tunnelId, final String connectio... method onClientBinaryBytes (line 589) | public void onClientBinaryBytes(final UUID tunnelId, final String conn... method onClientClose (line 635) | public void onClientClose(final UUID tunnelId, final String connection... method sendOpen (line 651) | private boolean sendOpen(final Tunnel tunnel, final String connId) { method sendToClient (line 658) | private boolean sendToClient(final Tunnel tunnel, final WsTunnelMessag... method sendBinaryToClient (line 670) | private boolean sendBinaryToClient(final Tunnel tunnel, class ExposedPort (line 688) | @Data class Tunnel (line 693) | @Data method removeEldestEntry (line 705) | @Override method Tunnel (line 712) | Tunnel(final UUID tunnelId) { class Connection (line 717) | @Data method Connection (line 727) | Connection(final String connectionId, method setCleanupTask (line 737) | void setCleanupTask(final ScheduledFuture cleanupTask) { method close (line 744) | void close() { FILE: net-proxy/src/main/java/tech/amak/portbuddy/netproxy/tunnel/NetTunnelWebSocketHandler.java class NetTunnelWebSocketHandler (line 41) | @Slf4j method afterConnectionEstablished (line 50) | @Override method handleTextMessage (line 108) | @Override method handleBinaryMessage (line 143) | @Override method afterConnectionClosed (line 155) | @Override method extractTunnelId (line 170) | private UUID extractTunnelId(final WebSocketSession session) { method parseQueryParams (line 174) | private Map parseQueryParams(final URI uri) { FILE: net-proxy/src/main/java/tech/amak/portbuddy/netproxy/web/NetProxyController.java class NetProxyController (line 31) | @RestController method expose (line 39) | @PostMapping("/expose") method close (line 54) | @PostMapping("/close") FILE: net-proxy/src/test/java/tech/amak/portbuddy/netproxy/tunnel/NetTunnelLeakVerificationTest.java class NetTunnelLeakVerificationTest (line 46) | class NetTunnelLeakVerificationTest { method testConnectionCleanupOnSendFailure (line 61) | @Test method testExecutorShutdown (line 106) | @Test FILE: net-proxy/src/test/java/tech/amak/portbuddy/netproxy/tunnel/NetTunnelOrphanCleanupTest.java class NetTunnelOrphanCleanupTest (line 32) | class NetTunnelOrphanCleanupTest { method testOrphanedTunnelCleanup (line 47) | @Test FILE: net-proxy/src/test/java/tech/amak/portbuddy/netproxy/tunnel/NetTunnelRegistryConcurrencyTest.java class NetTunnelRegistryConcurrencyTest (line 38) | @Slf4j method testManyConcurrentConnections (line 54) | @Test FILE: net-proxy/src/test/java/tech/amak/portbuddy/netproxy/tunnel/NetTunnelRegistryTest.java class NetTunnelRegistryTest (line 40) | class NetTunnelRegistryTest { method testBlockHttpOnTcpTunnel (line 55) | @Test method testAllowNonHttpOnTcpTunnel (line 97) | @Test method testAllowPostgresSslRequest (line 120) | @Test method testConnectionWithNoDataSentInitially (line 145) | @Test FILE: net-proxy/src/test/java/tech/amak/portbuddy/netproxy/tunnel/NetTunnelUdpEvictionTest.java class NetTunnelUdpEvictionTest (line 47) | class NetTunnelUdpEvictionTest { method testUdpRemoteLruEviction (line 62) | @Test FILE: server/src/main/java/tech/amak/portbuddy/server/ServerApplication.java class ServerApplication (line 23) | @SpringBootApplication method main (line 29) | public static void main(final String[] args) { FILE: server/src/main/java/tech/amak/portbuddy/server/client/NetProxyClient.java type NetProxyClient (line 31) | @FeignClient( method exposePort (line 37) | @PostMapping("/api/net-proxy/expose") method closeTunnel (line 42) | @PostMapping("/api/net-proxy/close") class Configuration (line 45) | class Configuration { method authorizationHeaderForwarder (line 47) | @Bean FILE: server/src/main/java/tech/amak/portbuddy/server/client/SslServiceClient.java type SslServiceClient (line 28) | @FeignClient( method submitJob (line 34) | @PostMapping("/api/certificates/jobs") class Configuration (line 39) | class Configuration { method authorizationHeaderForwarder (line 41) | @Bean FILE: server/src/main/java/tech/amak/portbuddy/server/config/AppProperties.java method subdomainHost (line 55) | public String subdomainHost() { FILE: server/src/main/java/tech/amak/portbuddy/server/config/SchedulingConfig.java class SchedulingConfig (line 27) | @Configuration method lockProvider (line 32) | @Bean FILE: server/src/main/java/tech/amak/portbuddy/server/config/TunnelsProperties.java class TunnelsProperties (line 26) | @Getter FILE: server/src/main/java/tech/amak/portbuddy/server/db/entity/AccountEntity.java class AccountEntity (line 38) | @Getter FILE: server/src/main/java/tech/amak/portbuddy/server/db/entity/ApiKeyEntity.java class ApiKeyEntity (line 30) | @Getter FILE: server/src/main/java/tech/amak/portbuddy/server/db/entity/DomainEntity.java class DomainEntity (line 38) | @Getter method toLowerCase (line 84) | @PrePersist FILE: server/src/main/java/tech/amak/portbuddy/server/db/entity/InvitationEntity.java class InvitationEntity (line 33) | @Getter FILE: server/src/main/java/tech/amak/portbuddy/server/db/entity/PasswordResetTokenEntity.java class PasswordResetTokenEntity (line 33) | @Getter FILE: server/src/main/java/tech/amak/portbuddy/server/db/entity/PortReservationEntity.java class PortReservationEntity (line 36) | @Getter FILE: server/src/main/java/tech/amak/portbuddy/server/db/entity/Role.java type Role (line 20) | public enum Role { FILE: server/src/main/java/tech/amak/portbuddy/server/db/entity/StripeEventEntity.java class StripeEventEntity (line 27) | @Getter FILE: server/src/main/java/tech/amak/portbuddy/server/db/entity/TunnelEntity.java class TunnelEntity (line 37) | @Getter FILE: server/src/main/java/tech/amak/portbuddy/server/db/entity/TunnelStatus.java type TunnelStatus (line 18) | public enum TunnelStatus { FILE: server/src/main/java/tech/amak/portbuddy/server/db/entity/UserAccountEntity.java class UserAccountEntity (line 44) | @Getter method UserAccountEntity (line 88) | public UserAccountEntity(final UserEntity user, final AccountEntity ac... method getEmail (line 101) | public String getEmail() { method getFirstName (line 110) | public String getFirstName() { method getLastName (line 119) | public String getLastName() { class UserAccountId (line 123) | @Getter FILE: server/src/main/java/tech/amak/portbuddy/server/db/entity/UserEntity.java class UserEntity (line 34) | @Getter FILE: server/src/main/java/tech/amak/portbuddy/server/db/repo/AccountRepository.java type AccountRepository (line 30) | public interface AccountRepository extends JpaRepository findByStripeCustomerId(String stripeCustomerId); method findBySubscriptionStatusNotActiveAndUpdatedAtBefore (line 33) | @Query("SELECT a FROM AccountEntity a WHERE a.subscriptionStatus <> 'a... method findAdminAccounts (line 36) | @Query(value = """ method findDailyStats (line 54) | @Query(value = """ FILE: server/src/main/java/tech/amak/portbuddy/server/db/repo/ApiKeyRepository.java type ApiKeyRepository (line 25) | public interface ApiKeyRepository extends JpaRepository findAllByUserId(UUID userId); method findAllByAccountId (line 29) | List findAllByAccountId(UUID accountId); method findByIdAndUserId (line 31) | Optional findByIdAndUserId(UUID id, UUID userId); method findByIdAndAccountId (line 33) | Optional findByIdAndAccountId(UUID id, UUID accountId); method findByTokenHashAndRevokedFalse (line 35) | Optional findByTokenHashAndRevokedFalse(String tokenHash); FILE: server/src/main/java/tech/amak/portbuddy/server/db/repo/DomainRepository.java type DomainRepository (line 29) | @Repository method existsBySubdomain (line 31) | boolean existsBySubdomain(String subdomain); method existsBySubdomainGlobal (line 33) | @Query(value = "SELECT count(*) > 0 FROM domains WHERE subdomain = LOW... method findAllByAccount (line 36) | List findAllByAccount(AccountEntity account); method findByAccountAndSubdomain (line 38) | Optional findByAccountAndSubdomain(AccountEntity account... method findByIdAndAccount (line 40) | Optional findByIdAndAccount(UUID id, AccountEntity accou... method findBySubdomain (line 42) | Optional findBySubdomain(String subdomain); method findByCustomDomain (line 44) | Optional findByCustomDomain(String customDomain); method countByAccount (line 46) | long countByAccount(AccountEntity account); method countByAccountAndCustomDomainIsNotNull (line 48) | long countByAccountAndCustomDomainIsNotNull(AccountEntity account); FILE: server/src/main/java/tech/amak/portbuddy/server/db/repo/InvitationRepository.java type InvitationRepository (line 26) | public interface InvitationRepository extends JpaRepository findByToken(String token); method findAllByAccountAndAcceptedAtIsNull (line 30) | List findAllByAccountAndAcceptedAtIsNull(AccountEnti... method findByAccountAndEmailAndAcceptedAtIsNull (line 32) | Optional findByAccountAndEmailAndAcceptedAtIsNull(Ac... FILE: server/src/main/java/tech/amak/portbuddy/server/db/repo/PasswordResetTokenRepository.java type PasswordResetTokenRepository (line 25) | public interface PasswordResetTokenRepository extends JpaRepository findByToken(String token); method deleteByUser (line 28) | void deleteByUser(UserEntity user); FILE: server/src/main/java/tech/amak/portbuddy/server/db/repo/PortReservationRepository.java type PortReservationRepository (line 28) | public interface PortReservationRepository extends JpaRepository findAllByAccount(AccountEntity account); method findByIdAndAccount (line 32) | Optional findByIdAndAccount(UUID id, AccountEnt... method existsByPublicHostAndPublicPort (line 34) | boolean existsByPublicHostAndPublicPort(String publicHost, Integer pub... method countByPublicHost (line 36) | long countByPublicHost(String publicHost); method findMaxPortByHost (line 38) | @Query("select max(pr.publicPort) from PortReservationEntity pr where ... method findByAccountAndPublicHostAndPublicPort (line 41) | Optional findByAccountAndPublicHostAndPublicPor... method findAllByAccountAndPublicPort (line 45) | List findAllByAccountAndPublicPort(AccountEntit... method existsByAccountAndName (line 47) | boolean existsByAccountAndName(AccountEntity account, String name); method findByAccountAndNameIgnoreCase (line 49) | Optional findByAccountAndNameIgnoreCase(Account... method findMinimalFreePort (line 55) | @Query(value = """ FILE: server/src/main/java/tech/amak/portbuddy/server/db/repo/StripeEventRepository.java type StripeEventRepository (line 21) | public interface StripeEventRepository extends JpaRepository findFirstByAccountIdAndLocalHostAndLocalPortAnd... method findUsedTunnel (line 46) | default Optional findUsedTunnel(final UUID accountId, method findAllByAccountId (line 53) | Page findAllByAccountId(UUID accountId, Pageable pageable); method existsByPortReservationAndStatusNot (line 55) | boolean existsByPortReservationAndStatusNot(PortReservationEntity port... method findFirstByAccountIdAndLocalHostAndLocalPortAndPortReservationIsNotNullOrderByCreatedAtDesc (line 57) | Optional findFirstByAccountIdAndLocalHostAndLocalPortAnd... method pageByAccountOrderByLastHeartbeatDescNullsLast (line 60) | @Query(value = """ method countByAccountIdAndStatusIn (line 70) | long countByAccountIdAndStatusIn(UUID accountId, List st... method findByAccountIdAndStatusInOrderByLastHeartbeatAtAscCreatedAtAsc (line 72) | List findByAccountIdAndStatusInOrderByLastHeartbeatAtAsc... method countByStatusIn (line 75) | long countByStatusIn(List statuses); method closeStaleConnected (line 84) | @Modifying(clearAutomatically = true, flushAutomatically = true) method findAdminActiveTunnels (line 94) | @Query(value = """ FILE: server/src/main/java/tech/amak/portbuddy/server/db/repo/UserAccountRepository.java type UserAccountRepository (line 27) | public interface UserAccountRepository extends JpaRepository findAllByUserId(UUID userId); method findLatestUsedByUserId (line 31) | @Query(""" method findByUserIdAndAccountId (line 40) | @Query(""" FILE: server/src/main/java/tech/amak/portbuddy/server/db/repo/UserRepository.java type UserRepository (line 30) | public interface UserRepository extends JpaRepository { method findById (line 32) | @EntityGraph(attributePaths = "accounts") method findByAuthProviderAndExternalId (line 36) | Optional findByAuthProviderAndExternalId(String authProvid... method findByEmailIgnoreCase (line 38) | Optional findByEmailIgnoreCase(String email); method findAllByAccount (line 40) | @Query("SELECT ua.user FROM UserAccountEntity ua WHERE ua.account = :a... method findAdminUsers (line 43) | @Query(value = """ FILE: server/src/main/java/tech/amak/portbuddy/server/mail/EmailService.java class EmailService (line 37) | @Service method sendTemplate (line 54) | @Async FILE: server/src/main/java/tech/amak/portbuddy/server/mail/WelcomeEmailService.java class WelcomeEmailService (line 30) | @Service method onUserCreated (line 43) | @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT) method buildFullName (line 78) | private static String buildFullName(final String firstName, final Stri... FILE: server/src/main/java/tech/amak/portbuddy/server/security/ApiTokenAuthFilter.java class ApiTokenAuthFilter (line 49) | @Component method doFilterInternal (line 56) | @Override FILE: server/src/main/java/tech/amak/portbuddy/server/security/JwtConfig.java class JwtConfig (line 36) | @Configuration method jwkSource (line 43) | @Bean method jwtEncoder (line 48) | @Bean method jwtDecoder (line 53) | @Bean FILE: server/src/main/java/tech/amak/portbuddy/server/security/JwtService.java class JwtService (line 35) | @Service method createToken (line 54) | public String createToken(final Map claims, final Stri... method createToken (line 68) | public String createToken(final Map claims, final Stri... method resolveUserId (line 91) | public static UUID resolveUserId(final Jwt jwt) { method resolveAccountId (line 101) | public static UUID resolveAccountId(final Jwt jwt) { FILE: server/src/main/java/tech/amak/portbuddy/server/security/Oauth2SuccessHandler.java class Oauth2SuccessHandler (line 41) | @Component method Oauth2SuccessHandler (line 75) | public Oauth2SuccessHandler(final JwtService jwtService, method onAuthenticationSuccess (line 87) | @Override method resolveProvider (line 162) | private static String resolveProvider(final Authentication authenticat... method fetchGithubEmail (line 169) | private String fetchGithubEmail(final Authentication authentication) { method asNullableString (line 208) | private static String asNullableString(final Map attrs... method provisionOrRedirectOnMissingEmail (line 213) | private UserProvisioningService.ProvisionedUser provisionOrRedirectOnM... FILE: server/src/main/java/tech/amak/portbuddy/server/security/RsaKeyProvider.java class RsaKeyProvider (line 44) | @Component method RsaKeyProvider (line 67) | public RsaKeyProvider(final AppProperties properties) { method jwkSource (line 105) | public JWKSource jwkSource() { method parsePublicKey (line 109) | private static RSAPublicKey parsePublicKey(final String pem) throws Ex... method parsePrivateKey (line 116) | private static RSAPrivateKey parsePrivateKey(final String pem) throws ... method stripPemHeaders (line 123) | private static String stripPemHeaders(final String pem, final String t... FILE: server/src/main/java/tech/amak/portbuddy/server/security/SecurityConfig.java class SecurityConfig (line 39) | @Configuration method apiSecurityFilterChain (line 48) | @Bean method webSecurityFilterChain (line 82) | @Bean method passwordEncoder (line 103) | @Bean method jwtAuthenticationConverter (line 108) | @Bean FILE: server/src/main/java/tech/amak/portbuddy/server/security/ThreatBlockedException.java class ThreatBlockedException (line 17) | public class ThreatBlockedException extends SecurityException { method ThreatBlockedException (line 19) | public ThreatBlockedException(final String message) { FILE: server/src/main/java/tech/amak/portbuddy/server/service/ApiTokenService.java class ApiTokenService (line 37) | @Service method ApiTokenService (line 44) | public ApiTokenService(final ApiKeyRepository apiKeyRepository) { method createToken (line 56) | @Transactional method listTokens (line 77) | @Transactional(readOnly = true) method revoke (line 92) | @Transactional method validateAndGetUserId (line 112) | @Transactional method validateAndGetApiKey (line 131) | @Transactional method generateRawToken (line 150) | private String generateRawToken() { method sha256 (line 156) | private String sha256(final String val) { method toInstant (line 175) | private static Instant toInstant(final OffsetDateTime odt) { FILE: server/src/main/java/tech/amak/portbuddy/server/service/DomainService.java class DomainService (line 45) | @Service method getDomains (line 61) | @Transactional(readOnly = true) method createDomain (line 76) | @Transactional method assignRandomDomain (line 100) | @Transactional method updateDomain (line 118) | @Transactional method deleteDomain (line 148) | @Transactional method setPasscode (line 170) | @Transactional method clearPasscode (line 193) | @Transactional method updateCustomDomain (line 209) | @Transactional method deleteCustomDomain (line 230) | @Transactional method verifyCname (line 249) | @Transactional method checkCname (line 283) | private boolean checkCname(final String domain, final String expectedT... method markSslActive (line 317) | @Transactional method resolveDomain (line 343) | @Transactional(readOnly = true) method isTunnelConnected (line 391) | private boolean isTunnelConnected(final DomainEntity domain) { method isTunnelActive (line 395) | private boolean isTunnelActive(final DomainEntity domain) { method generateRandomSubdomain (line 399) | private String generateRandomSubdomain() { FILE: server/src/main/java/tech/amak/portbuddy/server/service/PaymentCleanupService.java class PaymentCleanupService (line 33) | @Service method cleanupFailedPayments (line 45) | @Scheduled( FILE: server/src/main/java/tech/amak/portbuddy/server/service/PortReservationService.java class PortReservationService (line 36) | @Service method getReservations (line 48) | @Transactional(readOnly = true) method createReservation (line 61) | @Transactional method computeNextPort (line 115) | private Integer computeNextPort(final String host, final int min, fina... method deleteReservation (line 126) | @Transactional method resolveForNetExpose (line 145) | @Transactional method isReservationInUse (line 215) | private boolean isReservationInUse(final PortReservationEntity reserva... method updateReservation (line 222) | @Transactional FILE: server/src/main/java/tech/amak/portbuddy/server/service/ProxyDiscoveryService.java class ProxyDiscoveryService (line 28) | @Service method listPublicHosts (line 45) | public List listPublicHosts() { method firstNonBlank (line 69) | private String firstNonBlank(final String... values) { FILE: server/src/main/java/tech/amak/portbuddy/server/service/StaleTunnelsReaper.java class StaleTunnelsReaper (line 33) | @Service method closeStaleTunnels (line 45) | @Scheduled( FILE: server/src/main/java/tech/amak/portbuddy/server/service/StripeService.java class StripeService (line 37) | @Slf4j method StripeService (line 43) | public StripeService(final AppProperties properties) { method createCheckoutSession (line 57) | public String createCheckoutSession(final AccountEntity account, final... method createCheckoutSession (line 113) | public String createCheckoutSession(final AccountEntity account, final... method cancelSubscription (line 123) | public void cancelSubscription(final String subscriptionId) throws Str... method cancelSubscription (line 138) | public void cancelSubscription(final AccountEntity account) throws Str... method createPortalSession (line 149) | public String createPortalSession(final AccountEntity account) throws ... method updateExtraTunnels (line 169) | public void updateExtraTunnels(final AccountEntity account, final int ... method getOrCreateCustomer (line 221) | private String getOrCreateCustomer(final AccountEntity account) throws... FILE: server/src/main/java/tech/amak/portbuddy/server/service/StripeWebhookService.java class StripeWebhookService (line 26) | @Service method constructEvent (line 37) | public Event constructEvent(final String payload, final String sigHead... FILE: server/src/main/java/tech/amak/portbuddy/server/service/TeamService.java class TeamService (line 44) | @Service method getMembers (line 61) | public List getMembers(final AccountEntity account) { method getPendingInvitations (line 71) | public List getPendingInvitations(final AccountEntit... method inviteMember (line 83) | @Transactional method removeMember (line 123) | @Transactional method cancelInvitation (line 141) | @Transactional method acceptInvitation (line 159) | @Transactional method switchAccount (line 193) | @Transactional method resendInvitation (line 210) | @Transactional method sendInvitationEmail (line 230) | private void sendInvitationEmail(final InvitationEntity invitation) { FILE: server/src/main/java/tech/amak/portbuddy/server/service/TunnelService.java class TunnelService (line 42) | @Service method createHttpTunnel (line 68) | @Transactional method createNetTunnel (line 89) | @Transactional method checkSubscriptionStatus (line 98) | private void checkSubscriptionStatus(final AccountEntity account) { method checkTunnelLimit (line 117) | private void checkTunnelLimit(final AccountEntity account) { method calculateTunnelLimit (line 136) | public int calculateTunnelLimit(final AccountEntity account) { method enforceTunnelLimit (line 150) | @Transactional method closeAllTunnels (line 161) | @Transactional method closeExcessTunnels (line 166) | private void closeExcessTunnels(final AccountEntity account, final int... method createTunnel (line 195) | private TunnelEntity createTunnel(final UUID accountId, method updateTunnelPublicConnection (line 242) | @Transactional method assignReservation (line 256) | @Transactional method findByTunnelId (line 273) | public Optional findByTunnelId(final UUID tunnelId) { method setTempPasscodeHash (line 281) | @Transactional method getTempPasscodeHash (line 292) | public Optional getTempPasscodeHash(final UUID tunnelId) { method markConnected (line 305) | @Transactional method heartbeat (line 325) | @Transactional method markClosed (line 344) | @Transactional FILE: server/src/main/java/tech/amak/portbuddy/server/service/threatfox/ThreatFoxClient.java type ThreatFoxClient (line 27) | @FeignClient( method fetchIoc (line 35) | @PostMapping("/api/v1/") class Configuration (line 38) | @RequiredArgsConstructor method authorizationHeaderForwarder (line 44) | @Bean FILE: server/src/main/java/tech/amak/portbuddy/server/service/threatfox/ThreatFoxService.java class ThreatFoxService (line 30) | @Slf4j method fetchData (line 59) | @Scheduled( method process (line 72) | private void process(final ThreatFoxResponse response) { method isRelevantType (line 87) | private boolean isRelevantType(final String type) { method normalize (line 91) | private String normalize(final ThreatFoxIoc ioc) { method normalize (line 98) | private String normalize(final String ioc) { method extractDomain (line 105) | private String extractDomain(final String url) { method isBlacklisted (line 112) | private boolean isBlacklisted(final String target) { method checkThreat (line 129) | public void checkThreat(final String host, final int port) { FILE: server/src/main/java/tech/amak/portbuddy/server/service/user/MissingEmailException.java class MissingEmailException (line 20) | public class MissingEmailException extends RuntimeException { method MissingEmailException (line 22) | public MissingEmailException(final String message) { FILE: server/src/main/java/tech/amak/portbuddy/server/service/user/PasswordResetService.java class PasswordResetService (line 35) | @Service method requestReset (line 51) | @Transactional method generateResetPasswordLink (line 85) | @Transactional method validateToken (line 109) | @Transactional(readOnly = true) method resetPassword (line 125) | @Transactional FILE: server/src/main/java/tech/amak/portbuddy/server/service/user/UserProvisioningService.java class UserProvisioningService (line 44) | @Service method createLocalUser (line 64) | @Transactional method provision (line 144) | @Transactional method defaultAccountName (line 269) | private static String defaultAccountName(final String firstName, final... method normalizeEmail (line 282) | private static String normalizeEmail(final String email) { method determineRoles (line 290) | private Set determineRoles(final boolean isAccountOwner) { FILE: server/src/main/java/tech/amak/portbuddy/server/tunnel/PermissiveSubprotocolHandshakeHandler.java class PermissiveSubprotocolHandshakeHandler (line 28) | public class PermissiveSubprotocolHandshakeHandler extends DefaultHandsh... method selectProtocol (line 30) | @Override FILE: server/src/main/java/tech/amak/portbuddy/server/tunnel/PublicWebSocketProxyHandler.java class PublicWebSocketProxyHandler (line 43) | @Slf4j method afterConnectionEstablished (line 53) | @Override method handleTextMessage (line 111) | @Override method handleBinaryMessage (line 124) | @Override method afterConnectionClosed (line 137) | @Override method extractSubdomain (line 151) | private String extractSubdomain(final WebSocketSession session) { method firstNonBlank (line 214) | private static String firstNonBlank(final String a, final String b) { method normalizePublicPath (line 229) | private static String normalizePublicPath(final String subdomain, fina... method collectForwardedHandshakeHeaders (line 256) | private Map collectForwardedHandshakeHeaders(final Web... FILE: server/src/main/java/tech/amak/portbuddy/server/tunnel/TunnelRegistry.java class TunnelRegistry (line 44) | @Slf4j method register (line 63) | public boolean register(final TunnelEntity tunnelEntity, final WebSock... method register (line 80) | private Tunnel register(final String subdomain, final UUID tunnelId, f... method getBySubdomain (line 88) | public Tunnel getBySubdomain(final String subdomain) { method getByTunnelId (line 92) | public Tunnel getByTunnelId(final UUID tunnelId) { method forwardRequest (line 106) | public CompletableFuture forwardRequest(final Strin... method onResponse (line 150) | public void onResponse(final UUID tunnelId, final HttpTunnelMessage re... method sendWsToClient (line 170) | public void sendWsToClient(final UUID tunnelId, final WsTunnelMessage ... method registerBrowserWs (line 192) | public void registerBrowserWs(final UUID tunnelId, method unregisterBrowserWs (line 213) | public Ids unregisterBrowserWs(final WebSocketSession browserSession) { method findIdsByBrowserSession (line 232) | public Ids findIdsByBrowserSession(final WebSocketSession browserSessi... method getBrowserSession (line 252) | public WebSocketSession getBrowserSession(final UUID tunnelId, final S... method closeTunnel (line 265) | public void closeTunnel(final UUID tunnelId) { class Ids (line 306) | @Data class Tunnel (line 313) | @RequiredArgsConstructor method subdomain (line 328) | public String subdomain() { method tunnelId (line 332) | public UUID tunnelId() { method accountId (line 336) | public UUID accountId() { method session (line 340) | public WebSocketSession session() { method pending (line 344) | public Map> pending() { method isOpen (line 348) | public boolean isOpen() { method browserByConnection (line 352) | public Map browserByConnection() { method browserReverse (line 356) | public Map browserReverse() { FILE: server/src/main/java/tech/amak/portbuddy/server/tunnel/TunnelWebSocketHandler.java class TunnelWebSocketHandler (line 38) | @Slf4j method afterConnectionEstablished (line 47) | @Override method closeWebsocket (line 64) | private void closeWebsocket(final WebSocketSession session, method handleTextMessage (line 74) | @Override method handleWsFromClient (line 111) | private void handleWsFromClient(final UUID tunnelId, final WsTunnelMes... method afterConnectionClosed (line 136) | @Override method extractTunnelId (line 147) | private UUID extractTunnelId(final WebSocketSession session) { FILE: server/src/main/java/tech/amak/portbuddy/server/tunnel/WebSocketConfig.java class WebSocketConfig (line 27) | @Configuration method registerWebSocketHandlers (line 36) | @Override method websocketContainer (line 54) | @Bean FILE: server/src/main/java/tech/amak/portbuddy/server/web/AuthController.java class AuthController (line 49) | @RestController method tokenExchange (line 68) | @PostMapping("/token-exchange") method isCliVersionSupported (line 100) | private boolean isCliVersionSupported(final String clientVersion, fina... method compareVersions (line 109) | private int compareVersions(final String v1, final String v2) { method parseIntSafe (line 123) | private int parseIntSafe(final String part) { method register (line 134) | @PostMapping("/register") method login (line 161) | @PostMapping("/login") method requestPasswordReset (line 203) | @PostMapping("/password-reset/request") method validateResetToken (line 215) | @GetMapping("/password-reset/validate") method confirmPasswordReset (line 229) | @PostMapping("/password-reset/confirm") FILE: server/src/main/java/tech/amak/portbuddy/server/web/DomainsController.java class DomainsController (line 48) | @RestController method list (line 62) | @GetMapping method create (line 77) | @PostMapping method update (line 85) | @PutMapping("/{id}") method delete (line 93) | @DeleteMapping("/{id}") method setPasscode (line 110) | @PutMapping("/{id}/passcode") method deletePasscode (line 124) | @DeleteMapping("/{id}/passcode") method updateCustomDomain (line 140) | @PutMapping("/{id}/custom-domain") method deleteCustomDomain (line 154) | @DeleteMapping("/{id}/custom-domain") method verifyCname (line 169) | @PostMapping("/{id}/verify-cname") method getAccount (line 177) | private AccountEntity getAccount(final Jwt jwt) { method toDto (line 189) | private static DomainDto toDto(final DomainEntity domain) { FILE: server/src/main/java/tech/amak/portbuddy/server/web/ExposeController.java class ExposeController (line 45) | @RestController method exposeHttp (line 69) | @PostMapping("/http") method exposeNet (line 113) | @PostMapping("/net") method extractApiKeyId (line 148) | private String extractApiKeyId(final Jwt jwt) { method validateUser (line 153) | private ValidatedUser validateUser(final Jwt jwt) { FILE: server/src/main/java/tech/amak/portbuddy/server/web/IngressController.java class IngressController (line 60) | @Slf4j method ingressPathBased (line 89) | @RequestMapping("/_/{subdomain:.+}/**") method ingressCustomDomainPathBased (line 109) | @RequestMapping("/_custom/{customDomain:.+}/**") method forwardViaTunnel (line 128) | private void forwardViaTunnel(final String subdomain, method isAuthorized (line 262) | private boolean isAuthorized(final String subdomain, method matches (line 296) | private boolean matches(final String raw, final String hash) { method findCookie (line 307) | private Optional findCookie(final HttpServletRequest request, ... method issueCookie (line 314) | private void issueCookie(final HttpServletResponse response, final Str... FILE: server/src/main/java/tech/amak/portbuddy/server/web/IngressResolveController.java class IngressResolveController (line 36) | @RestController method resolveOwner (line 51) | @GetMapping("/resolve/{subdomain}") method resolveCustomOwner (line 66) | @GetMapping("/resolve-custom/{domain}") method isSubscriptionActive (line 79) | private boolean isSubscriptionActive(final TunnelRegistry.Tunnel tunne... FILE: server/src/main/java/tech/amak/portbuddy/server/web/InternalDomainController.java class InternalDomainController (line 29) | @RestController method markSslActive (line 41) | @PostMapping("/ssl-active") FILE: server/src/main/java/tech/amak/portbuddy/server/web/InternalEmailController.java class InternalEmailController (line 34) | @RestController method sendDnsInstructions (line 48) | @PostMapping("/dns-instructions") FILE: server/src/main/java/tech/amak/portbuddy/server/web/JwksController.java class JwksController (line 35) | @RestController method jwks (line 51) | @GetMapping(value = "/.well-known/jwks.json", produces = MediaType.APP... FILE: server/src/main/java/tech/amak/portbuddy/server/web/PaymentController.java class PaymentController (line 41) | @Slf4j method createCheckoutSession (line 60) | @Transactional method createPortalSession (line 79) | @Transactional method cancelSubscription (line 95) | @Transactional class CheckoutRequest (line 110) | @Data class SessionResponse (line 115) | @Data FILE: server/src/main/java/tech/amak/portbuddy/server/web/PortsController.java class PortsController (line 46) | @RestController method list (line 62) | @GetMapping method create (line 77) | @PostMapping method delete (line 97) | @DeleteMapping("/{id}") method update (line 112) | @PutMapping("/{id}") method hosts (line 131) | @GetMapping("/hosts") method hostRange (line 139) | @GetMapping("/hosts/{host}/range") method getAccount (line 146) | private AccountEntity getAccount(final Jwt jwt) { method toDto (line 157) | private static PortReservationDto toDto(final PortReservationEntity e) { FILE: server/src/main/java/tech/amak/portbuddy/server/web/StripeWebhookController.java class StripeWebhookController (line 49) | @Slf4j method handleStripeWebhook (line 70) | @Transactional method handleCheckoutSessionCompleted (line 145) | private void handleCheckoutSessionCompleted(final Event event) { method sendSubscriptionSuccessEmail (line 198) | private void sendSubscriptionSuccessEmail(final AccountEntity account) { method handleSubscriptionEvent (line 218) | private void handleSubscriptionEvent(final Event event) { method handleInvoicePaymentFailed (line 297) | private void handleInvoicePaymentFailed(final Event event) { FILE: server/src/main/java/tech/amak/portbuddy/server/web/TeamController.java class TeamController (line 48) | @RestController method getMembers (line 65) | @GetMapping("/members") method getInvitations (line 79) | @GetMapping("/invitations") method inviteMember (line 95) | @PostMapping("/invitations") method cancelInvitation (line 105) | @DeleteMapping("/invitations/{id}") method resendInvitation (line 114) | @PostMapping("/invitations/{id}/resend") method removeMember (line 129) | @DeleteMapping("/members/{userId}") method acceptInvitation (line 139) | @PostMapping("/accept") method getAccount (line 147) | private AccountEntity getAccount(final Jwt jwt) { method getUser (line 153) | private UserEntity getUser(final Jwt jwt) { method toMemberDto (line 159) | private MemberDto toMemberDto(final UserEntity user, final AccountEnti... method toInvitationDto (line 173) | private InvitationDto toInvitationDto(final InvitationEntity invitatio... class MemberDto (line 183) | @Data class InvitationDto (line 195) | @Data class InviteRequest (line 205) | @Data FILE: server/src/main/java/tech/amak/portbuddy/server/web/TokensController.java class TokensController (line 41) | @RestController method list (line 56) | @GetMapping method create (line 69) | @PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE) method revoke (line 88) | @DeleteMapping("/{id}") class CreateTokenRequest (line 95) | @Data FILE: server/src/main/java/tech/amak/portbuddy/server/web/TunnelStatusController.java class TunnelStatusController (line 34) | @RestController method connected (line 45) | @PostMapping(path = "/{tunnelId}/connected") method heartbeat (line 54) | @PostMapping(path = "/{tunnelId}/heartbeat") method closed (line 62) | @PostMapping(path = "/{tunnelId}/closed") FILE: server/src/main/java/tech/amak/portbuddy/server/web/TunnelsController.java class TunnelsController (line 37) | @RestController method page (line 52) | @GetMapping method toView (line 61) | private static TunnelView toView(final TunnelEntity tunnel) { FILE: server/src/main/java/tech/amak/portbuddy/server/web/UsersController.java class UsersController (line 59) | @RestController method details (line 79) | @GetMapping("/details") method updateProfile (line 108) | @PatchMapping(path = "/profile", consumes = MediaType.APPLICATION_JSON... method updateAccount (line 140) | @PatchMapping(path = "/account", consumes = MediaType.APPLICATION_JSON... method updateExtraTunnels (line 165) | @PatchMapping(path = "/account/tunnels", consumes = MediaType.APPLICAT... method getAccounts (line 226) | @Transactional method switchAccount (line 248) | @Transactional method toAccountDto (line 276) | private AccountDto toAccountDto(final AccountEntity account) { method resolveUser (line 291) | private UserEntity resolveUser(final Jwt jwt) { method resolveUserAccount (line 297) | private UserAccountEntity resolveUserAccount(final Jwt jwt) { method normalizeNullable (line 304) | private static String normalizeNullable(final String value) { class UserDetailsResponse (line 312) | @Data class UserDto (line 318) | @Data class AccountDto (line 328) | @Data class UpdateProfileRequest (line 342) | @Data class UpdateAccountRequest (line 348) | @Data class UpdateTunnelsRequest (line 353) | @Data class UserAccountDto (line 358) | @Data FILE: server/src/main/java/tech/amak/portbuddy/server/web/admin/AdminAccountController.java class AdminAccountController (line 37) | @RestController method listAccounts (line 52) | @GetMapping method blockAccount (line 65) | @PostMapping("/{accountId}/block") method unblockAccount (line 83) | @PostMapping("/{accountId}/unblock") FILE: server/src/main/java/tech/amak/portbuddy/server/web/admin/AdminSystemController.java class AdminSystemController (line 36) | @RestController method getSystemStats (line 51) | @GetMapping("/stats") method getDailyStats (line 66) | @GetMapping("/stats/daily") FILE: server/src/main/java/tech/amak/portbuddy/server/web/admin/AdminTunnelController.java class AdminTunnelController (line 37) | @RestController method listActiveTunnels (line 52) | @GetMapping method closeTunnel (line 64) | @PostMapping("/{tunnelId}/close") FILE: server/src/main/java/tech/amak/portbuddy/server/web/admin/AdminUserController.java class AdminUserController (line 30) | @RestController method listUsers (line 45) | @GetMapping FILE: server/src/main/java/tech/amak/portbuddy/server/web/advice/GlobalExceptionHandler.java class GlobalExceptionHandler (line 26) | @Slf4j method handleResponseStatusException (line 30) | @ExceptionHandler(ResponseStatusException.class) method handleIllegalArgumentException (line 36) | @ExceptionHandler(IllegalArgumentException.class) method handleGlobalException (line 42) | @ExceptionHandler(Exception.class) FILE: server/src/main/resources/db/migration/V10__link_http_tunnels_to_domain.sql type idx_tunnels_domain_id (line 5) | CREATE INDEX idx_tunnels_domain_id ON tunnels(domain_id) FILE: server/src/main/resources/db/migration/V13__password_reset_tokens.sql type password_reset_tokens (line 5) | CREATE TABLE password_reset_tokens ( type idx_password_reset_tokens_token (line 13) | CREATE INDEX idx_password_reset_tokens_token ON password_reset_tokens(to... FILE: server/src/main/resources/db/migration/V14__port_reservations.sql type port_reservations (line 1) | CREATE TABLE port_reservations ( type idx_port_reservations_account_id (line 11) | CREATE INDEX idx_port_reservations_account_id ON port_reservations(accou... type idx_port_reservations_public_host (line 12) | CREATE INDEX idx_port_reservations_public_host ON port_reservations(publ... FILE: server/src/main/resources/db/migration/V15__add_user_to_port_reservations.sql type idx_port_reservations_user_id (line 6) | CREATE INDEX IF NOT EXISTS idx_port_reservations_user_id ON port_reserva... FILE: server/src/main/resources/db/migration/V16__add_port_reservation_to_tunnels.sql type idx_tunnels_port_reservation_id (line 9) | CREATE INDEX IF NOT EXISTS idx_tunnels_port_reservation_id ON tunnels (p... FILE: server/src/main/resources/db/migration/V17__soft_delete_port_reservations.sql type uq_port_reservations_host_port_active (line 21) | CREATE UNIQUE INDEX IF NOT EXISTS uq_port_reservations_host_port_active FILE: server/src/main/resources/db/migration/V1__accounts_and_users.sql type accounts (line 2) | CREATE TABLE IF NOT EXISTS accounts ( type users (line 10) | CREATE TABLE IF NOT EXISTS users ( type idx_users_account_id (line 24) | CREATE INDEX IF NOT EXISTS idx_users_account_id ON users(account_id) type idx_users_email (line 25) | CREATE UNIQUE INDEX IF NOT EXISTS idx_users_email ON users(email) FILE: server/src/main/resources/db/migration/V20__add_custom_domain_to_domains.sql type idx_domains_custom_domain (line 7) | CREATE INDEX idx_domains_custom_domain ON domains(custom_domain) FILE: server/src/main/resources/db/migration/V24__create_stripe_events_table.sql type stripe_events (line 5) | CREATE TABLE stripe_events ( FILE: server/src/main/resources/db/migration/V25__create_invitations_table.sql type invitations (line 5) | CREATE TABLE invitations ( type idx_invitations_account_id (line 16) | CREATE INDEX idx_invitations_account_id ON invitations(account_id) type idx_invitations_token (line 17) | CREATE INDEX idx_invitations_token ON invitations(token) type idx_invitations_email (line 18) | CREATE INDEX idx_invitations_email ON invitations(email) FILE: server/src/main/resources/db/migration/V26__many_to_many_users_accounts.sql type user_accounts (line 6) | CREATE TABLE IF NOT EXISTS user_accounts ( type idx_user_accounts_user_id (line 25) | CREATE INDEX IF NOT EXISTS idx_user_accounts_user_id ON user_accounts(us... type idx_user_accounts_account_id (line 26) | CREATE INDEX IF NOT EXISTS idx_user_accounts_account_id ON user_accounts... FILE: server/src/main/resources/db/migration/V2__api_keys.sql type api_keys (line 2) | CREATE TABLE IF NOT EXISTS api_keys ( type idx_api_keys_user_id (line 13) | CREATE INDEX IF NOT EXISTS idx_api_keys_user_id ON api_keys(user_id) type idx_api_keys_created_at (line 14) | CREATE INDEX IF NOT EXISTS idx_api_keys_created_at ON api_keys(created_at) FILE: server/src/main/resources/db/migration/V30__unique_port_reservation_name.sql type idx_port_reservations_account_id_name_unique (line 18) | CREATE UNIQUE INDEX idx_port_reservations_account_id_name_unique FILE: server/src/main/resources/db/migration/V3__tunnels.sql type tunnels (line 2) | CREATE TABLE IF NOT EXISTS tunnels ( type idx_tunnels_user_id (line 24) | CREATE INDEX IF NOT EXISTS idx_tunnels_user_id ON tunnels(user_id) type idx_tunnels_api_key_id (line 25) | CREATE INDEX IF NOT EXISTS idx_tunnels_api_key_id ON tunnels(api_key_id) type idx_tunnels_status (line 26) | CREATE INDEX IF NOT EXISTS idx_tunnels_status ON tunnels(status) type idx_tunnels_created_at (line 27) | CREATE INDEX IF NOT EXISTS idx_tunnels_created_at ON tunnels(created_at) FILE: server/src/main/resources/db/migration/V4__shedlock_and_heartbeat_indexes.sql type shedlock (line 2) | CREATE TABLE shedlock type idx_tunnels_status_last_heartbeat (line 12) | CREATE INDEX IF NOT EXISTS idx_tunnels_status_last_heartbeat ON tunnels ... FILE: server/src/main/resources/db/migration/V6__create_domains_table.sql type domains (line 1) | CREATE TABLE domains ( type idx_domains_account_id (line 10) | CREATE INDEX idx_domains_account_id ON domains(account_id) FILE: server/src/main/resources/db/migration/V7__link_tunnels_to_account.sql type idx_tunnels_account_id (line 12) | CREATE INDEX idx_tunnels_account_id ON tunnels(account_id) FILE: server/src/main/resources/db/migration/V8__add_user_id_to_tunnels.sql type idx_tunnels_user_id (line 10) | CREATE INDEX idx_tunnels_user_id ON tunnels(user_id) FILE: server/src/main/resources/db/migration/V9__link_api_keys_to_account.sql type idx_api_keys_account_id (line 12) | CREATE INDEX idx_api_keys_account_id ON api_keys(account_id) FILE: server/src/test/java/tech/amak/portbuddy/server/security/Oauth2SuccessHandlerTest.java class Oauth2SuccessHandlerTest (line 51) | @ExtendWith(MockitoExtension.class) method setUp (line 75) | @BeforeEach method onAuthenticationSuccess_WithEmail_ShouldProvisionAndRedirect (line 91) | @Test method onAuthenticationSuccess_MissingEmailGithub_ShouldFetchEmail (line 113) | @Test method onAuthenticationSuccess_MissingEmailNotGithub_ShouldRedirectWithError (line 157) | @Test FILE: server/src/test/java/tech/amak/portbuddy/server/service/DomainServiceTest.java class DomainServiceTest (line 49) | @ExtendWith(MockitoExtension.class) method setUp (line 68) | @BeforeEach method createDomain_Success (line 101) | @Test method createDomain_RetryOnCollision (line 115) | @Test method updateDomain_Success (line 130) | @Test method updateDomain_ActiveTunnel (line 149) | @Test method deleteDomain_Success (line 162) | @Test method deleteCustomDomain_Success (line 177) | @Test FILE: server/src/test/java/tech/amak/portbuddy/server/service/PaymentCleanupServiceTest.java class PaymentCleanupServiceTest (line 37) | @ExtendWith(MockitoExtension.class) method setUp (line 51) | @BeforeEach method cleanupFailedPayments_FindsAccounts_FreezesTunnels (line 57) | @Test method cleanupFailedPayments_NoAccounts_DoesNothing (line 74) | @Test FILE: server/src/test/java/tech/amak/portbuddy/server/service/PortReservationServiceTest.java class PortReservationServiceTest (line 39) | @ExtendWith(MockitoExtension.class) method setUp (line 55) | @BeforeEach method resolveForNetExpose_ExplicitHostPort_Success (line 64) | @Test method resolveForNetExpose_ExplicitName_Success (line 83) | @Test method resolveForNetExpose_ExplicitPortOnly_MultipleFound_TakesFirst (line 99) | @Test method resolveForNetExpose_ExplicitPortOnly_NotFound_ThrowsException (line 122) | @Test method updateReservation_DuplicateName_ThrowsException (line 134) | @Test method updateReservation_SameName_Success (line 148) | @Test FILE: server/src/test/java/tech/amak/portbuddy/server/service/StaleTunnelsReaperTest.java class StaleTunnelsReaperTest (line 47) | class StaleTunnelsReaperTest { method shouldCloseTunnelsInRegistryWhenReaped (line 49) | @Test FILE: server/src/test/java/tech/amak/portbuddy/server/service/TunnelServiceTest.java class TunnelServiceTest (line 51) | @ExtendWith(MockitoExtension.class) method setUp (line 66) | @BeforeEach method checkTunnelLimit_ActiveSubscription_Success (line 85) | @Test method checkTunnelLimit_InactiveSubscription_ThrowsException (line 92) | @Test method markConnected_InactiveSubscription_ThrowsException (line 99) | @Test method heartbeat_InactiveSubscription_ThrowsException (line 114) | @Test method checkTunnelLimit_LimitReached_ThrowsException (line 129) | @Test method enforceTunnelLimit_ExceedsLimit_ClosesExcessTunnels (line 141) | @Test method checkTunnelLimit_ProPlanNoSubscription_Success (line 167) | @Test method checkTunnelLimit_ProPlanWithExtraNoSubscription_ThrowsException (line 178) | @Test method checkTunnelLimit_TeamPlanNoSubscription_ThrowsException (line 188) | @Test method createRequest (line 197) | private ExposeRequest createRequest() { FILE: server/src/test/java/tech/amak/portbuddy/server/tunnel/TunnelRegistryLeakTest.java class TunnelRegistryLeakTest (line 31) | class TunnelRegistryLeakTest { method shouldCloseBrowserSessionsWhenTunnelIsClosed (line 33) | @Test method shouldCleanupPendingRequestsOnTimeout (line 72) | @Test method shouldCleanupBrowserReverseMapWhenUnregistered (line 108) | @Test FILE: server/src/test/java/tech/amak/portbuddy/server/user/PasswordResetServiceTest.java class PasswordResetServiceTest (line 46) | @ExtendWith(MockitoExtension.class) method requestReset_shouldGenerateTokenAndSendEmail_whenUserExists (line 58) | @Test method requestReset_shouldDoNothing_whenUserDoesNotExist (line 76) | @Test method validateToken_shouldReturnTrue_whenTokenIsValid (line 87) | @Test method validateToken_shouldReturnFalse_whenTokenIsExpired (line 99) | @Test method resetPassword_shouldUpdatePassword_whenTokenIsValid (line 111) | @Test method resetPassword_shouldThrow_whenTokenIsExpired (line 135) | @Test FILE: server/src/test/java/tech/amak/portbuddy/server/web/AuthControllerTest.java class AuthControllerTest (line 57) | @WebMvcTest(AuthController.class) method register_shouldReturnApiKey (line 94) | @Test method register_shouldReturnError_whenMissingFields (line 115) | @Test method requestPasswordReset_shouldReturnNoContent (line 128) | @Test method tokenExchange_shouldReturnJwt (line 138) | @Test method login_shouldReturnJwt (line 165) | @Test method confirmPasswordReset_shouldReturnNoContent (line 196) | @Test FILE: server/src/test/java/tech/amak/portbuddy/server/web/IngressControllerTest.java class IngressControllerTest (line 49) | @WebMvcTest(IngressController.class) method setUp (line 77) | @BeforeEach method forwardViaTunnel_shouldRejectLargeRequest (line 86) | @Test method forwardViaTunnel_shouldAcceptSmallRequest (line 112) | @Test FILE: server/src/test/java/tech/amak/portbuddy/server/web/PaymentControllerTest.java class PaymentControllerTest (line 54) | @WebMvcTest(PaymentController.class) method setUp (line 88) | @BeforeEach method createCheckoutSession_WithAccountAdmin_ShouldSucceed (line 122) | @Test method createPortalSession_WithAdmin_ShouldSucceed (line 136) | @Test method cancelSubscription_shouldUpdateAccount (line 145) | @Test method createJwt (line 169) | private Jwt createJwt(final List roles) { FILE: server/src/test/java/tech/amak/portbuddy/server/web/StripeWebhookControllerTest.java class StripeWebhookControllerTest (line 61) | @WebMvcTest(StripeWebhookController.class) method setUp (line 95) | @BeforeEach method handleInvoicePaymentFailed_shouldSendEmail (line 105) | @Test method handleSubscriptionDeleted_shouldSendEmail (line 152) | @Test method handleCheckoutSessionCompleted_withOldSubscription_shouldCancelOldSubscription (line 203) | @Test method handleSubscriptionDeleted_forOldSubscription_shouldNotCancelAccount (line 253) | @Test FILE: server/src/test/java/tech/amak/portbuddy/server/web/TeamControllerTest.java class TeamControllerTest (line 65) | @WebMvcTest(TeamController.class) method setUp (line 103) | @BeforeEach method getMembers_ShouldReturnList (line 142) | @Test method getInvitations_ShouldReturnList (line 155) | @Test method inviteMember_ShouldCreateInvitation (line 172) | @Test method cancelInvitation_ShouldCallService (line 194) | @Test method resendInvitation_ShouldCallService (line 205) | @Test method removeMember_ShouldCallService (line 216) | @Test method removeMember_ShouldReturnBadRequest_WhenRemovingSelf (line 227) | @Test method getMembers_ShouldThrowException_WhenAccountIdClaimIsMissing (line 237) | @Test method removeMember_ShouldCallService_WhenAdmin (line 249) | @Test method createJwt (line 266) | private org.springframework.security.oauth2.jwt.Jwt createJwt() { FILE: server/src/test/java/tech/amak/portbuddy/server/web/TokensControllerTest.java class TokensControllerTest (line 34) | @WebMvcTest(TokensController.class) method revoke_shouldReturnNoContent (line 47) | @Test FILE: server/src/test/java/tech/amak/portbuddy/server/web/UsersControllerTest.java class UsersControllerTest (line 64) | @WebMvcTest(UsersController.class) method setUp (line 114) | @BeforeEach method updateExtraTunnels_withoutSubscription_shouldReturnCheckoutUrl (line 164) | @Test method updateExtraTunnels_withSubscription_shouldUpdateStripe (line 183) | @Test method updateExtraTunnels_proPlan_zeroExtra_withSubscription_shouldCancelSubscription (line 202) | @Test method createJwt (line 223) | private Jwt createJwt(final List roles) { FILE: server/src/test/java/tech/amak/portbuddy/server/web/admin/AdminAccountControllerTest.java class AdminAccountControllerTest (line 38) | @ExtendWith(MockitoExtension.class) method setUp (line 52) | @BeforeEach method blockAccount_shouldSetBlockedTrueAndSaveAndCloseTunnels (line 57) | @Test FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/SslServiceApplication.java class SslServiceApplication (line 22) | @SpringBootApplication method main (line 32) | public static void main(final String[] args) { FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/client/ServerClient.java type ServerClient (line 24) | @FeignClient(name = "port-buddy-server") method sendDnsInstructions (line 27) | @PostMapping("/api/internal/email/dns-instructions") method markSslActive (line 30) | @PostMapping("/api/internal/domains/ssl-active") FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/config/AsyncConfig.java class AsyncConfig (line 20) | @Configuration FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/config/JpaAuditingConfig.java class JpaAuditingConfig (line 29) | @Configuration method auditorAware (line 33) | @Bean method dateTimeProvider (line 41) | @Bean FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/config/RestConfig.java class RestConfig (line 22) | @Configuration method loadBalancedRestTemplate (line 30) | @Bean FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/config/SchedulingConfig.java class SchedulingConfig (line 31) | @Configuration method lockProvider (line 42) | @Bean FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/domain/CertificateEntity.java class CertificateEntity (line 39) | @Data FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/domain/CertificateJobEntity.java class CertificateJobEntity (line 37) | @Getter FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/domain/CertificateJobStatus.java type CertificateJobStatus (line 20) | public enum CertificateJobStatus { FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/domain/CertificateStatus.java type CertificateStatus (line 20) | public enum CertificateStatus { FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/repo/CertificateJobRepository.java type CertificateJobRepository (line 25) | public interface CertificateJobRepository extends JpaRepository findByDomain(String domain); method findByDomainIgnoreCase (line 42) | Optional findByDomainIgnoreCase(String domain); method findAllByManagedTrue (line 49) | List findAllByManagedTrue(); method findAllByManagedTrueAndExpiresAtBefore (line 57) | List findAllByManagedTrueAndExpiresAtBefore(OffsetD... FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/security/SecurityConfig.java class SecurityConfig (line 36) | @Configuration method securityFilterChain (line 51) | @Bean method jwtDecoder (line 80) | @Bean method jwtAuthenticationConverter (line 98) | @Bean FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/service/AcmeAccountService.java class AcmeAccountService (line 35) | @Service method loadAccountKeyPair (line 54) | public KeyPair loadAccountKeyPair() { FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/service/AcmeCertificateService.java class AcmeCertificateService (line 68) | @Service method submitJob (line 94) | @Transactional method processJobAsync (line 138) | @Async method performAcmeHttp01Issuance (line 172) | private void performAcmeHttp01Issuance(final CertificateJobEntity job)... method performAcmeDns01Initiate (line 296) | private void performAcmeDns01Initiate(final CertificateJobEntity job) ... method confirmDnsAndContinue (line 369) | @Transactional method pollAuthorizationValidWithRetry (line 503) | private void pollAuthorizationValidWithRetry(final Authorization auth,... method pollOrderValidWithRetry (line 528) | private void pollOrderValidWithRetry(final Order order, final int maxS... method buildCsrDer (line 552) | private byte[] buildCsrDer(final List domains, final KeyPair k... method buildCsrDer (line 574) | private byte[] buildCsrDer(final String domain, final KeyPair keyPair) method toPem (line 579) | private String toPem(final X509Certificate cert) { method updateJobMessage (line 589) | private void updateJobMessage(final CertificateJobEntity job, final St... FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/service/AcmeClientService.java class AcmeClientService (line 34) | @Service method newSession (line 45) | public Session newSession() { method loginOrRegister (line 57) | public Account loginOrRegister(final Session session, final KeyPair ke... method bindOrder (line 87) | public Order bindOrder(final Session session, FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/service/CertificateStorageService.java class CertificateStorageService (line 36) | @Service method generateRsaKeyPair (line 47) | public KeyPair generateRsaKeyPair() { method writePrivateKeyPem (line 64) | public Path writePrivateKeyPem(final String domain, final KeyPair keyP... method writeChainPem (line 78) | public Path writeChainPem(final String domain, final String chainPem) { method writeCertPem (line 92) | public Path writeCertPem(final String domain, final String certPem) { method writeFullChainPem (line 106) | public Path writeFullChainPem(final String domain, final String fullCh... method resolveBaseDir (line 113) | private Path resolveBaseDir() { method writePem (line 130) | private void writePem(final Path file, final Object pemObject) { method writeString (line 142) | private void writeString(final Path file, final String content) { method safe (line 150) | private String safe(final String domain) { FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/service/DnsResolverService.java type DnsResolverService (line 20) | public interface DnsResolverService { method isTxtRecordVisible (line 30) | boolean isTxtRecordVisible(String fqdn, String expectedValue); FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/service/EmailService.java type EmailService (line 26) | public interface EmailService { method sendDnsInstructions (line 35) | void sendDnsInstructions(CertificateJobEntity job, List T callWithRetry(final String stepName, final Callable ac... method jitterRandom (line 77) | private long jitterRandom(final long jitter) { FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/service/TransientErrorClassifier.java class TransientErrorClassifier (line 32) | @UtilityClass method isTransient (line 41) | public static boolean isTransient(final Exception e) { FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/service/impl/ServerEmailService.java class ServerEmailService (line 33) | @Service method sendDnsInstructions (line 40) | @Override FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/service/impl/SimpleDnsResolverService.java class SimpleDnsResolverService (line 32) | @Service method isTxtRecordVisible (line 36) | @Override FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/web/CertificatesController.java class CertificatesController (line 40) | @RestController method createCertificate (line 55) | @PostMapping method getCertificateByDomain (line 71) | @GetMapping("/{domain}") method listCertificates (line 83) | @GetMapping method createManagedCertificate (line 95) | @PostMapping("/managed") method listManagedCertificates (line 117) | @GetMapping("/managed") FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/web/ChallengeController.java class ChallengeController (line 29) | @RestController method getChallengeToken (line 41) | @GetMapping(value = "/.well-known/acme-challenge/{token}", produces = ... FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/web/InternalController.java class InternalController (line 31) | @RestController method getCertificateByDomain (line 45) | @GetMapping("/{domain}") method confirmDns (line 58) | @PostMapping("/jobs/{id}/confirm-dns") FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/web/JobsController.java class JobsController (line 34) | @RestController method submitJob (line 50) | @PostMapping method getJob (line 64) | @GetMapping("/{id}") method listJobs (line 75) | @GetMapping method confirmDns (line 86) | @PostMapping("/{id}/confirm-dns") FILE: ssl-service/src/main/java/tech/amak/portbuddy/sslservice/work/ChallengeTokenStore.java class ChallengeTokenStore (line 24) | @Component method putToken (line 35) | public void putToken(final String token, final String content) { method getTokenContent (line 45) | public String getTokenContent(final String token) { method removeToken (line 54) | public void removeToken(final String token) { FILE: ssl-service/src/main/resources/db/migration/V1__init.sql type ssl_certificates (line 7) | CREATE TABLE IF NOT EXISTS ssl_certificates ( type ssl_certificate_jobs (line 25) | CREATE TABLE IF NOT EXISTS ssl_certificate_jobs ( type idx_ssl_certificate_jobs_domain (line 44) | CREATE INDEX IF NOT EXISTS idx_ssl_certificate_jobs_domain ON ssl_certif... FILE: ssl-service/src/main/resources/db/migration/V2__shedlock_table.sql type shedlock (line 6) | CREATE TABLE IF NOT EXISTS shedlock FILE: ssl-service/src/test/java/tech/amak/portbuddy/sslservice/service/CertificateRenewalServiceTest.java class CertificateRenewalServiceTest (line 39) | @ExtendWith(MockitoExtension.class) method checkAndRenewCertificates_ShouldTriggerRenewalForExpiringCerts (line 54) | @Test method checkAndRenewCertificates_NoExpiringCerts_ShouldDoNothing (line 73) | @Test FILE: web/src/App.tsx function ScrollToTop (line 42) | function ScrollToTop() { function ScrollToHash (line 50) | function ScrollToHash() { function App (line 71) | function App() { FILE: web/src/auth/AuthContext.tsx type User (line 5) | type User = { constant ACCOUNT_NAME_CLAIM (line 22) | const ACCOUNT_NAME_CLAIM = 'aname' constant ACCOUNT_ID_CLAIM (line 23) | const ACCOUNT_ID_CLAIM = 'aid' type AuthState (line 25) | type AuthState = { constant APP_ORIGIN (line 39) | const APP_ORIGIN = window.location.origin constant OAUTH_REDIRECT_URI (line 40) | const OAUTH_REDIRECT_URI = `${APP_ORIGIN}/auth/callback` function storeTokenFromUrlIfPresent (line 42) | function storeTokenFromUrlIfPresent(): string | null { function AuthProvider (line 65) | function AuthProvider({ children }: { children: React.ReactNode }) { function useAuth (line 212) | function useAuth(): AuthState { FILE: web/src/components/AppLayout.tsx type UserAccount (line 22) | type UserAccount = { function AppLayout (line 30) | function AppLayout() { type IconType (line 204) | type IconType = ComponentType> function SideLink (line 206) | function SideLink({ to, label, end = false, Icon, onClick }: { to: strin... function HeaderTitle (line 226) | function HeaderTitle() { FILE: web/src/components/CodeBlock.tsx function CodeBlock (line 16) | function CodeBlock({ code }: { code: string }) { FILE: web/src/components/LoadingContext.tsx type LoadingContextType (line 7) | interface LoadingContextType { FILE: web/src/components/Modal.tsx type ModalProps (line 5) | interface ModalProps { function Modal (line 12) | function Modal({ isOpen, onClose, title, children }: ModalProps) { type ConfirmModalProps (line 64) | interface ConfirmModalProps { function ConfirmModal (line 75) | function ConfirmModal({ type AlertModalProps (line 115) | interface AlertModalProps { function AlertModal (line 122) | function AlertModal({ isOpen, onClose, title, message }: AlertModalProps) { FILE: web/src/components/PageHeader.tsx type PageHeaderContextValue (line 3) | type PageHeaderContextValue = { function PageHeaderProvider (line 10) | function PageHeaderProvider({ children }: PropsWithChildren) { function usePageHeader (line 25) | function usePageHeader() { function usePageTitle (line 31) | function usePageTitle(title: string) { FILE: web/src/components/PlanComparison.tsx function PlanComparison (line 24) | function PlanComparison() { FILE: web/src/components/ProtectedRoute.tsx function ProtectedRoute (line 5) | function ProtectedRoute({ children, role }: { children: React.ReactNode,... FILE: web/src/lib/api.ts function setLoadingCallbacks (line 7) | function setLoadingCallbacks(start: () => void, stop: () => void) { function startLoading (line 12) | function startLoading() { function stopLoading (line 16) | function stopLoading() { constant API_BASE (line 20) | const API_BASE: string = (() => { function getToken (line 29) | function getToken(): string | null { function redirectToLogin (line 37) | function redirectToLogin(withFrom: boolean = true): void { function withAuth (line 65) | function withAuth(init?: RequestInit, skipToken: boolean = false): Reque... function apiJson (line 81) | async function apiJson(path: string, init?: RequestInit, option... function apiRaw (line 137) | async function apiRaw(path: string, init?: RequestInit): Promise