|
10 | 10 | import org.slf4j.LoggerFactory; |
11 | 11 | import org.springframework.stereotype.Service; |
12 | 12 |
|
13 | | -import java.security.GeneralSecurityException; |
14 | 13 | import java.util.Optional; |
15 | 14 |
|
16 | 15 | /** |
@@ -47,7 +46,20 @@ public WebhookProjectResolver( |
47 | 46 | public Optional<Project> findProjectByExternalRepo(EVcsProvider provider, String externalRepoId) { |
48 | 47 | log.debug("Looking up project for provider={}, externalRepoId={}", provider, externalRepoId); |
49 | 48 |
|
50 | | - return bindingRepository.findByProviderAndExternalRepoIdWithDetails(provider, externalRepoId) |
| 49 | + // Primary lookup by UUID-based external repo ID |
| 50 | + Optional<Project> result = bindingRepository.findByProviderAndExternalRepoIdWithDetails(provider, externalRepoId) |
| 51 | + .flatMap(binding -> { |
| 52 | + Long projectId = binding.getProject().getId(); |
| 53 | + return projectRepository.findByIdWithFullDetails(projectId); |
| 54 | + }); |
| 55 | + |
| 56 | + if (result.isPresent()) { |
| 57 | + return result; |
| 58 | + } |
| 59 | + |
| 60 | + // Fallback: try slug-based lookup for older bindings that stored slug as externalRepoId |
| 61 | + log.debug("UUID lookup failed, trying slug-based fallback for provider={}, repoId={}", provider, externalRepoId); |
| 62 | + return bindingRepository.findByProviderAndExternalRepoSlugWithDetails(provider, externalRepoId) |
51 | 63 | .flatMap(binding -> { |
52 | 64 | Long projectId = binding.getProject().getId(); |
53 | 65 | return projectRepository.findByIdWithFullDetails(projectId); |
@@ -77,12 +89,17 @@ public boolean validateWebhookAuth(Project project, String authToken) { |
77 | 89 | if (project.getAuthToken() == null || authToken == null) { |
78 | 90 | return false; |
79 | 91 | } |
| 92 | + String storedToken = project.getAuthToken(); |
| 93 | + |
| 94 | + // Try decrypting first (new encrypted tokens) |
80 | 95 | try { |
81 | | - String decryptedToken = tokenEncryptionService.decrypt(project.getAuthToken()); |
| 96 | + String decryptedToken = tokenEncryptionService.decrypt(storedToken); |
82 | 97 | return decryptedToken.equals(authToken); |
83 | | - } catch (GeneralSecurityException e) { |
84 | | - log.error("Failed to decrypt auth token for project {}", project.getId(), e); |
85 | | - return false; |
| 98 | + } catch (Exception e) { |
| 99 | + // Decryption failed — token is likely stored as plaintext (legacy). |
| 100 | + // Fall back to direct comparison. |
| 101 | + log.debug("Token decryption failed for project {} — trying plaintext comparison", project.getId()); |
| 102 | + return storedToken.equals(authToken); |
86 | 103 | } |
87 | 104 | } |
88 | 105 |
|
|
0 commit comments