@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; } }
@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); } } }
@Test public void toByteArrayAndBack() { byte[] arrayA = delRequest.toByteArray(); byte[] arrayB; arrayB = new EmailPacketDeleteRequest(arrayA).toByteArray(); assertArrayEquals("The two arrays differ!", arrayA, arrayB); } }
/** 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()); }
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());