@Override public DeleteRequest storeAndCreateDeleteRequest(DhtStorablePacket packetToStore) { if (!(packetToStore instanceof EncryptedEmailPacket)) throw new IllegalArgumentException("Invalid packet type: " + packetToStore.getClass().getSimpleName() + "; this folder only stores packets of type " + EncryptedEmailPacket.class.getSimpleName() + "."); DeleteRequest delRequest = null; // read the deletion info file for the email packet's DHT key Hash dhtKey = packetToStore.getDhtKey(); String delFileName = getDeletionFileName(dhtKey); DeletionInfoPacket delInfo = createDelInfoPacket(delFileName); if (delInfo != null) { DeletionRecord delRecord = delInfo.getEntry(dhtKey); if (delRecord != null) delRequest = new EmailPacketDeleteRequest(delRecord.dhtKey, delRecord.delAuthorization); } else // if the DHT key has not been recorded as deleted, store the email packet store(packetToStore); return delRequest; } }
public EmailPacketDeleteRequest(byte[] data) { super(data); ByteBuffer buffer = ByteBuffer.wrap(data, HEADER_LENGTH, data.length-HEADER_LENGTH); dhtKey = readHash(buffer); authorization = new UniqueId(buffer); if (buffer.hasRemaining()) log.debug("Email Packet Delete Request has " + buffer.remaining() + " extra bytes."); }
@Test public void toByteArrayAndBack() { byte[] arrayA = delRequest.toByteArray(); byte[] arrayB; arrayB = new EmailPacketDeleteRequest(arrayA).toByteArray(); assertArrayEquals("The two arrays differ!", arrayA, arrayB); } }
assertEquals("Folder should have two elements!", 2, packetFolder.getElements().size()); EmailPacketDeleteRequest delRequest1 = new EmailPacketDeleteRequest(emailPacket1.getDhtKey(), delAuthKey1); packetFolder.process(delRequest1); assertEquals("Folder should have exactly one element!", 1, packetFolder.getElements().size()); EmailPacketDeleteRequest delRequest2 = new EmailPacketDeleteRequest(emailPacket2.getDhtKey(), delAuthKey2); packetFolder.process(delRequest2); assertEquals("Folder should be empty!", 0, packetFolder.getElements().size()); assertTrue(newDelRequest1 instanceof EmailPacketDeleteRequest); EmailPacketDeleteRequest newEmailPacketDelRequest1 = (EmailPacketDeleteRequest)newDelRequest1; assertEquals(newEmailPacketDelRequest1.getDhtKey(), emailPacket1.getDhtKey()); assertEquals(newEmailPacketDelRequest1.getAuthorization(), delAuthKey1); DeleteRequest newDelRequest2 = packetFolder.storeAndCreateDeleteRequest(emailPacket2); assertTrue(newDelRequest2 instanceof EmailPacketDeleteRequest); EmailPacketDeleteRequest newEmailPacketDelRequest2 = (EmailPacketDeleteRequest)newDelRequest2; assertEquals(newEmailPacketDelRequest2.getDhtKey(), emailPacket2.getDhtKey()); assertEquals(newEmailPacketDelRequest2.getAuthorization(), delAuthKey2);
/** * Deletes email packets. * @param delRequest An instance of {@link EmailPacketDeleteRequest} */ @Override public synchronized void process(DeleteRequest delRequest) { log.debug("Processing delete request: " + delRequest); if (!(delRequest instanceof EmailPacketDeleteRequest)) log.error("Invalid type of delete request for EmailPacketFolder: " + delRequest.getClass()); EmailPacketDeleteRequest emailPacketDelRequest = (EmailPacketDeleteRequest)delRequest; // see if the packet exists Hash dhtKey = emailPacketDelRequest.getDhtKey(); DhtStorablePacket storedPacket = retrieve(dhtKey); if (storedPacket instanceof EncryptedEmailPacket) { // verify Hash verificationHash = ((EncryptedEmailPacket)storedPacket).getDeleteVerificationHash(); UniqueId delAuthorization = emailPacketDelRequest.getAuthorization(); boolean valid = Util.isDeleteAuthorizationValid(verificationHash, delAuthorization); if (valid) delete(dhtKey, delAuthorization); else log.debug("Invalid Delete Authorization in EmailPacketDeleteRequest. Should be: <" + verificationHash.toBase64() + ">"); } else if (storedPacket != null) log.debug("EncryptedEmailPacket expected for DHT key <" + dhtKey + ">, found " + storedPacket.getClass().getSimpleName()); }
@Override public byte[] toByteArray() { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { writeHeader(outputStream); outputStream.write(dhtKey.toByteArray()); outputStream.write(authorization.toByteArray()); } catch (IOException e) { log.error("Can't write to ByteArrayOutputStream.", e); } return outputStream.toByteArray(); }
@Before public void setUp() throws Exception { Hash dhtKey = new Hash(new byte[] {-48, 78, 66, 58, -79, 87, 38, -103, -60, -27, 108, 55, 117, 37, -99, 93, -23, -102, -83, 20, 44, -80, 65, 89, -68, -73, 69, 51, 115, 79, 24, 127}); byte[] packetIdBytes = new byte[] {120, 120, -8, -88, 21, 126, 46, -61, 18, -101, 15, 53, 20, -44, -112, 42, 86, -117, 30, -96, -66, 33, 71, -55, -102, -78, 78, -82, -105, 66, -116, 43}; UniqueId deleteAuthorization = new UniqueId(packetIdBytes, 0); delRequest = new EmailPacketDeleteRequest(dhtKey, deleteAuthorization); }
/** * Sends an Email Packet Delete Request to a peer. If the peer is the local node, * the Email Packet is deleted directly. * @param dhtKey The DHT key of the email packet that is to be deleted * @param delAuthorization The delete authorization key for the email packet * @param peer */ private void sendDeleteRequest(Hash dhtKey, UniqueId delAuthorization, Destination peer) { EmailPacketDeleteRequest request = new EmailPacketDeleteRequest(dhtKey, delAuthorization); if (localDestination.equals(peer)) { log.debug("Handling email packet delete request locally. DHT key: " + dhtKey); emailPacketFolder.process(request); } else { log.debug("Sending an EmailPacketDeleteRequest for DHT key " + dhtKey + " to " + Util.toBase32(peer)); sendQueue.send(request, peer); } } }
/** Tests processing of one valid and one invalid {@link EmailPacketDeleteRequest}. */ @Test public void testPacketReceived() throws PasswordException { packetFolder.store(emailPacket); assertEquals(1, packetFolder.getElements().size()); EmailPacketDeleteRequest delRequest; // send an invalid delete request byte[] delAuthBytes = unencryptedPacket.getDeleteAuthorization().toByteArray().clone(); delAuthBytes[5] ^= 1; UniqueId invalidAuthorization = new UniqueId(delAuthBytes, 0); delRequest = new EmailPacketDeleteRequest(emailPacket.getDhtKey(), invalidAuthorization); packetFolder.packetReceived(delRequest, sender, System.currentTimeMillis()); assertEquals(1, packetFolder.getElements().size()); // send a valid delete request delRequest = new EmailPacketDeleteRequest(emailPacket.getDhtKey(), unencryptedPacket.getDeleteAuthorization()); packetFolder.packetReceived(delRequest, sender, System.currentTimeMillis()); assertEquals(0, packetFolder.getElements().size()); }