DestroyRegion extends BaseCommand { @Override public void cmdExecute(final Message clientMessage, final ServerConnection serverConnection, final SecurityService securityService, long start) throws IOException, InterruptedException { Part regionNamePart = null, callbackArgPart = null; String regionName = null; Object callbackArg = null; Part eventPart = null; StringBuilder errMessage = new StringBuilder(); CacheServerStats stats = serverConnection.getCacheServerStats(); serverConnection.setAsTrue(REQUIRES_RESPONSE); { long oldStart = start; start = DistributionStats.getStatTime(); stats.incReadDestroyRegionRequestTime(start - oldStart); } regionNamePart = clientMessage.getPart(0); eventPart = clientMessage.getPart(1); if (clientMessage.getNumberOfParts() > 2) { callbackArgPart = clientMessage.getPart(2); try { callbackArg = callbackArgPart.getObject(); } catch (DistributedSystemDisconnectedException se) { if (logger.isDebugEnabled()) { logger.debug( "{} ignoring message of type {} from client {} because shutdown occurred during message processing.", serverConnection.getName(), MessageType.getString(clientMessage.getMessageType()), serverConnection.getProxyID()); } serverConnection.setFlagProcessMessagesAsFalse(); serverConnection.setClientDisconnectedException(se); return; } catch (Exception e) { writeException(clientMessage, e, false, serverConnection); serverConnection.setAsTrue(RESPONDED); return; } } regionName = regionNamePart.getCachedString(); if (logger.isDebugEnabled()) { logger.debug("{}: Received destroy region request ({} bytes) from {} for region {}", serverConnection.getName(), clientMessage.getPayloadLength(), serverConnection.getSocketString(), regionName); } if (regionName == null) { logger.warn("{}: The input region name for the destroy region request is null", serverConnection.getName()); errMessage.append( "The input region name for the destroy region request is null."); writeErrorResponse(clientMessage, MessageType.DESTROY_REGION_DATA_ERROR, errMessage.toString(), serverConnection); serverConnection.setAsTrue(RESPONDED); return; } LocalRegion region = (LocalRegion) serverConnection.getCache().getRegion(regionName); if (region == null) { String reason = "Region was not found during destroy region request"; writeRegionDestroyedEx(clientMessage, regionName, reason, serverConnection); serverConnection.setAsTrue(RESPONDED); return; } ByteBuffer eventIdPartsBuffer = ByteBuffer.wrap(eventPart.getSerializedForm()); long threadId = EventID.readEventIdPartsFromOptmizedByteArray(eventIdPartsBuffer); long sequenceId = EventID.readEventIdPartsFromOptmizedByteArray(eventIdPartsBuffer); EventID eventId = new EventID(serverConnection.getEventMemberIDByteArray(), threadId, sequenceId); try { securityService.authorize(Resource.DATA, Operation.MANAGE); AuthorizeRequest authzRequest = serverConnection.getAuthzRequest(); if (authzRequest != null) { RegionDestroyOperationContext destroyContext = authzRequest.destroyRegionAuthorize(regionName, callbackArg); callbackArg = destroyContext.getCallbackArg(); } region.basicBridgeDestroyRegion(callbackArg, serverConnection.getProxyID(), true , eventId); } catch (DistributedSystemDisconnectedException e) { if (serverConnection.getCachedRegionHelper().getCache().getCancelCriterion() .cancelInProgress() != null) { if (logger.isDebugEnabled()) { logger.debug( "{} ignoring message of type {} from client {} because shutdown occurred during message processing.", serverConnection.getName(), MessageType.getString(clientMessage.getMessageType()), serverConnection.getProxyID()); } serverConnection.setFlagProcessMessagesAsFalse(); serverConnection.setClientDisconnectedException(e); } else { writeException(clientMessage, e, false, serverConnection); serverConnection.setAsTrue(RESPONDED); } return; } catch (Exception e) { checkForInterrupt(serverConnection, e); writeException(clientMessage, e, false, serverConnection); serverConnection.setAsTrue(RESPONDED); return; } { long oldStart = start; start = DistributionStats.getStatTime(); stats.incProcessDestroyRegionTime(start - oldStart); } writeReply(clientMessage, serverConnection); serverConnection.setAsTrue(RESPONDED); if (logger.isDebugEnabled()) { logger.debug("{}: Sent destroy region response for region {}", serverConnection.getName(), regionName); } stats.incWriteDestroyRegionResponseTime(DistributionStats.getStatTime() - start); }  static Command getCommand(); @Override void cmdExecute(final Message clientMessage, final ServerConnection serverConnection,
      final SecurityService securityService, long start);  }
@Test public void noSecurityShouldSucceed() throws Exception { when(this.securityService.isClientSecurityRequired()).thenReturn(false); this.destroyRegion.cmdExecute(this.message, this.serverConnection, this.securityService, 0); verify(this.securityService).authorize(Resource.DATA, Operation.MANAGE); verify(this.responseMessage).send(this.serverConnection); }
@Test public void integratedSecurityShouldSucceedIfAuthorized() throws Exception { when(this.securityService.isClientSecurityRequired()).thenReturn(true); when(this.securityService.isIntegratedSecurity()).thenReturn(true); this.destroyRegion.cmdExecute(this.message, this.serverConnection, this.securityService, 0); verify(this.securityService).authorize(Resource.DATA, Operation.MANAGE); verify(this.responseMessage).send(this.serverConnection); }
@Test public void integratedSecurityShouldFailIfNotAuthorized() throws Exception { when(this.securityService.isClientSecurityRequired()).thenReturn(true); when(this.securityService.isIntegratedSecurity()).thenReturn(true); doThrow(new NotAuthorizedException("")).when(this.securityService).authorize(Resource.DATA, Operation.MANAGE); this.destroyRegion.cmdExecute(this.message, this.serverConnection, this.securityService, 0); verify(this.errorResponseMessage).send(this.serverConnection); }
@Test public void oldSecurityShouldSucceedIfAuthorized() throws Exception { when(this.securityService.isClientSecurityRequired()).thenReturn(true); when(this.securityService.isIntegratedSecurity()).thenReturn(false); this.destroyRegion.cmdExecute(this.message, this.serverConnection, this.securityService, 0); verify(this.authzRequest).destroyRegionAuthorize(eq(REGION_NAME), eq(CALLBACK_ARG)); verify(this.responseMessage).send(this.serverConnection); }
@Test public void oldSecurityShouldFailIfNotAuthorized() throws Exception { when(this.securityService.isClientSecurityRequired()).thenReturn(true); when(this.securityService.isIntegratedSecurity()).thenReturn(false); doThrow(new NotAuthorizedException("")).when(this.authzRequest) .destroyRegionAuthorize(eq(REGION_NAME), eq(CALLBACK_ARG)); this.destroyRegion.cmdExecute(this.message, this.serverConnection, this.securityService, 0); verify(this.authzRequest).destroyRegionAuthorize(eq(REGION_NAME), eq(CALLBACK_ARG)); verify(this.errorResponseMessage).send(this.serverConnection); }