|
36 | 36 | import java.util.ArrayList; |
37 | 37 | import java.util.List; |
38 | 38 | import java.util.Map; |
| 39 | +import java.util.Optional; |
39 | 40 |
|
40 | 41 | import static access.SwaggerOpenIdConfig.API_TOKENS_SCHEME_NAME; |
41 | 42 | import static access.SwaggerOpenIdConfig.OPEN_ID_SCHEME_NAME; |
|
46 | 47 | @Transactional |
47 | 48 | @SecurityRequirement(name = OPEN_ID_SCHEME_NAME, scopes = {"openid"}) |
48 | 49 | @SecurityRequirement(name = API_TOKENS_SCHEME_NAME) |
| 50 | +@SuppressWarnings("unchecked") |
49 | 51 | public class IdentityProviderController implements UserAccessRights { |
50 | 52 |
|
51 | 53 | private static final Log LOG = LogFactory.getLog(IdentityProviderController.class); |
@@ -169,7 +171,8 @@ public ResponseEntity<Map<String, Object>> connect(User user, @RequestBody @Vali |
169 | 171 | jiraKey)), |
170 | 172 | true, |
171 | 173 | PathUpdateType.ADDITION, |
172 | | - RequestType.LinkRequest); |
| 174 | + RequestType.LinkRequest, |
| 175 | + jiraKey); |
173 | 176 | manage.createChangeRequest(Environment.PROD, changeRequest); |
174 | 177 |
|
175 | 178 | return ResponseEntity.status(HttpStatus.CREATED).body( |
@@ -223,11 +226,47 @@ public ResponseEntity<Map<String, Object>> disconnect(User user, @RequestBody @V |
223 | 226 | jiraKey)), |
224 | 227 | true, |
225 | 228 | PathUpdateType.REMOVAL, |
226 | | - RequestType.UnlinkRequest); |
| 229 | + RequestType.UnlinkRequest, |
| 230 | + jiraKey); |
227 | 231 | manage.createChangeRequest(Environment.PROD, changeRequest); |
228 | 232 |
|
229 | 233 | return ResponseEntity.status(HttpStatus.CREATED).body( |
230 | 234 | Map.of("status", HttpStatus.CREATED.value(), "jiraKey", jiraKey)); |
231 | 235 | } |
232 | 236 |
|
| 237 | + @PutMapping({"/cancel-connection-request"}) |
| 238 | + public ResponseEntity<Map<String, Object>> cancelConnectionRequest(User user, @RequestBody @Validated ConnectionRequest connectionRequest) { |
| 239 | + LOG.debug("/cancelConnectionRequest SP to IdP request by " + user.getEmail()); |
| 240 | + |
| 241 | + user = reinitializeUser(user, userRepository); |
| 242 | + |
| 243 | + String idpManageIdentifier = connectionRequest.getIdpManageIdentifier(); |
| 244 | + Organization organization = organizationRepository.findByManageIdentifier(idpManageIdentifier) |
| 245 | + .orElseThrow(() -> new NotFoundException("Organization with manageIdentifier not found: " + idpManageIdentifier)); |
| 246 | + |
| 247 | + Map<String, Object> serviceProvider = manage.providerById(connectionRequest.getEntityType(), |
| 248 | + connectionRequest.getApplicationManageIdentifier(), Environment.PROD); |
| 249 | + |
| 250 | + confirmOrganizationMembership(user, organization, Authority.ADMIN); |
| 251 | + Map<String, Object> identityProvider = manage.providerById(EntityType.saml20_idp, idpManageIdentifier, Environment.PROD); |
| 252 | + |
| 253 | + List<Map<String, Object>> changeRequests = manage.getChangeRequestsIdentityProvider(identityProvider); |
| 254 | + String serviceProviderEntityID = getEntityID(serviceProvider); |
| 255 | + List<Map<String, Object>> openChangeRequests = changeRequests.stream() |
| 256 | + .filter(changeRequest -> |
| 257 | + EntityType.saml20_idp.name().equals(changeRequest.get("type")) && |
| 258 | + PathUpdateType.ADDITION.name().equalsIgnoreCase((String) changeRequest.get("pathUpdateType")) && |
| 259 | + RequestType.LinkRequest.name().equalsIgnoreCase((String) changeRequest.get("requestType")) && |
| 260 | + serviceProviderEntityID.equals(((Map<String, Map<String, String>>) |
| 261 | + changeRequest.getOrDefault("pathUpdates", Map.of())) |
| 262 | + .getOrDefault("allowedEntities", Map.of()).get("name"))) |
| 263 | + .toList(); |
| 264 | + //First delete all manage change request - this is most likely to succeed |
| 265 | + openChangeRequests.forEach(changeRequest -> manage.rejectChangeRequest(Environment.PROD, new ChangeRequest(changeRequest))); |
| 266 | + //Then update all Jira comments, this API is not so stable |
| 267 | + String comment = "Ticket can be closed by request of the requestor"; |
| 268 | + openChangeRequests.forEach(changeRequest -> jiraClient.comment((String) changeRequest.get("ticketKey"), comment)); |
| 269 | + |
| 270 | + return Results.okResult(); |
| 271 | + } |
233 | 272 | } |
0 commit comments