Search in sources :

Example 6 with DeletionInfoPacket

use of i2p.bote.packet.dht.DeletionInfoPacket in project i2p.i2p-bote by i2p.

the class EmailPacketFolder method storeAndCreateDeleteRequest.

@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;
}
Also used : EmailPacketDeleteRequest(i2p.bote.packet.dht.EmailPacketDeleteRequest) DeletionInfoPacket(i2p.bote.packet.dht.DeletionInfoPacket) DeletionRecord(i2p.bote.packet.dht.DeletionRecord) EncryptedEmailPacket(i2p.bote.packet.dht.EncryptedEmailPacket) Hash(net.i2p.data.Hash) DeleteRequest(i2p.bote.packet.dht.DeleteRequest) EmailPacketDeleteRequest(i2p.bote.packet.dht.EmailPacketDeleteRequest)

Example 7 with DeletionInfoPacket

use of i2p.bote.packet.dht.DeletionInfoPacket in project i2p.i2p-bote by i2p.

the class KademliaDHT method packetReceived.

// PacketListener implementation
@Override
public void packetReceived(CommunicationPacket packet, Destination sender, long receiveTime) {
    if (packet instanceof FindClosePeersPacket)
        sendPeerList((FindClosePeersPacket) packet, sender);
    else if (packet instanceof StoreRequest) {
        DhtStorablePacket packetToStore = ((StoreRequest) packet).getPacketToStore();
        storeLocally(packetToStore, sender);
    } else if (packet instanceof RetrieveRequest) {
        RetrieveRequest retrieveRequest = (RetrieveRequest) packet;
        DhtStorageHandler storageHandler = storageHandlers.get(retrieveRequest.getDataType());
        if (storageHandler != null) {
            DhtStorablePacket storedPacket = storageHandler.retrieve(retrieveRequest.getKey());
            // if requested packet found, send it to the requester
            Collection<ResponsePacket> response = ResponsePacket.create(storedPacket, StatusCode.OK, retrieveRequest.getPacketId());
            if (storedPacket != null)
                log.debug("Packet found for retrieve request: [" + retrieveRequest + "], replying to sender: [" + Util.toBase32(sender) + "]");
            else
                log.debug("No matching packet found for retrieve request: [" + retrieveRequest + "]");
            sendQueue.send(response, sender);
        } else
            log.warn("No storage handler found for type " + packet.getClass().getSimpleName() + ".");
    } else if (packet instanceof DeleteRequest) {
        DeleteRequest delRequest = (DeleteRequest) packet;
        DhtStorageHandler storageHandler = storageHandlers.get(delRequest.getDataType());
        if (storageHandler instanceof DeletionAwareDhtFolder<?>)
            ((DeletionAwareDhtFolder<?>) storageHandler).process(delRequest);
    } else if (packet instanceof DeletionQuery) {
        DhtStorageHandler storageHandler = storageHandlers.get(EncryptedEmailPacket.class);
        if (storageHandler instanceof DeletionAwareDhtFolder) {
            Hash dhtKey = ((DeletionQuery) packet).getDhtKey();
            UniqueId delAuthorization = ((DeletionAwareDhtFolder<?>) storageHandler).getDeleteAuthorization(dhtKey);
            // If we know the Delete Authorization for the DHT key, send it to the peer
            if (delAuthorization != null) {
                DeletionInfoPacket delInfo = new DeletionInfoPacket();
                delInfo.put(dhtKey, delAuthorization);
                Collection<ResponsePacket> response = ResponsePacket.create(delInfo, StatusCode.OK, packet.getPacketId());
                sendQueue.send(response, sender);
            }
        }
    }
    // bucketManager is not registered as a PacketListener, so notify it here
    bucketManager.packetReceived(packet, sender, receiveTime);
}
Also used : DhtStorablePacket(i2p.bote.packet.dht.DhtStorablePacket) RetrieveRequest(i2p.bote.packet.dht.RetrieveRequest) UniqueId(i2p.bote.UniqueId) StoreRequest(i2p.bote.packet.dht.StoreRequest) Hash(net.i2p.data.Hash) FindClosePeersPacket(i2p.bote.packet.dht.FindClosePeersPacket) DeletionAwareDhtFolder(i2p.bote.folder.DeletionAwareDhtFolder) DeletionQuery(i2p.bote.packet.dht.DeletionQuery) DeletionInfoPacket(i2p.bote.packet.dht.DeletionInfoPacket) ResponsePacket(i2p.bote.packet.ResponsePacket) DhtStorageHandler(i2p.bote.network.DhtStorageHandler) DeleteRequest(i2p.bote.packet.dht.DeleteRequest)

Example 8 with DeletionInfoPacket

use of i2p.bote.packet.dht.DeletionInfoPacket in project i2p.i2p-bote by i2p.

the class EmailPacketFolderTest method testProcessDeleteRequest.

/**
 * Tests creation of delete records when processing {@link EmailPacketDeleteRequest}s,
 * and matching them against email packets.
 */
@Test
public void testProcessDeleteRequest() throws GeneralSecurityException, InvalidCipherTextException, MalformedPacketException, PasswordException {
    // create two packets whose base64 DHT keys start with the same two characters
    byte[] emailPkt1Data = Base64.decode("RQTAJHelC-wnxq-OUAnfgqgN84zTCimrfUKw7AgDPHblcwAAAADUk24QY3EPEzk0UmB5PYQxwnEVIWGZkWJ-5ERh30l95QMA0gIs-itszDaiCa4ucekxDL6pZCVMTnI~S0nBx2FQ5Fl4-T50bNojkgJiQZNFB-vwQ4ChB~hxYIomMtbN6tiNDVwYRKjeZHbL3MAffKcwxwF3iPMl8aLLBaU6LxQ~3r7tgTiccHE39Ozm88~Hrf7H-5hWXzTXwm7j1pNJA7hc-wCL3BwngRl8KUsqsII2-PTMI34-a3RfpzMf2cKlY0NVayoW1UxC4dLvtSz-HoLYPMGIMf5zQghPS2PuZaRAKa5oa3PdYJrhvNXCJWpYCL~FynwShQ==");
    byte[] emailPkt2Data = Base64.decode("RQTAJPXENHAvW18uRITLC8n~D0Npd0RwI1e~9IR8QN~BSwAAAAAD9RT-PXacKIest9~E2SzsR5dAlaoh-ZZVcFNcsQbGQwECkgCFnuT5N210f4SbS4pjPeh~hk9hvpEGCEXzOmPfSEeSWhrE5oiQuJI6fet1zrwZfbA6Iqvl-PoLgv5nKU~I7Nlu1f9UXuve2cvQOmTGDlHdzpwd3nTyJCR2bqG4SFPlnaDpa7yDOmH~e8LKBw1YTYSHSyVun7XuijyCcWGKRbSm3tFU382JSSqUQ2APwbHPtPG6akYO5iSq7XMvlBSyLsDHM5wDbaptxEUmnW20x3fVsK-0BNsIXFK-JJVQ12NApVanGaOsyDRh8l-geRWBcYpX7J~RI1A3ZKRBRJj2wgBc6TdAG0-jiI4OfpKZMr2NZ-ugg2-phU9OgY5ZbtBZjlbtADDYlxT~GHvXkCQLwRg4fsxTk9HoshfoWea-4RE1YmwRT96uKRy0SjcUduOPCsI6nEwm1p-5lzGFzcVTTXZyARRzRrhvtAJw616o3RoAj7vGHY~1POJ26m3UBUIXjh2fA7b5HTFARw9VfZYuz9zzT7UjtuPVIgBu-HyX5zBgSrCDhykGqggaVbURCaS2B6BZt8ikU0ponchHkVZzqX2UeT4T1Pd3fyc1fXp1xVInrYWUZvjSoBcJaiqlhvTMMsjzLbiG~a~HoJz67Dvl6GGtcBad1hjhSzwKN9vLpM-sFMqDCBDHDssVZEXk5EXQYltUZVvfaFJYimDfdiM~F23x0Wz2tM5LQXJ86-nn7d5DA-CspMg1xqkAr1iMkgYacOL~2u2PL1ImI1SMZGmY839ekgQlr1gWWU1evQQTUdHH6Bszs0vSW6wymbSTziJopMqv86f2y6SHDEq8qZzYdKhAFQbjFtvNwn7gEJqlhzzI1bO8zjG3xZTiaCpSrmE98L8PZhEIfXvN3PUADSuzsbHmuHQ=");
    EncryptedEmailPacket emailPacket1 = new EncryptedEmailPacket(emailPkt1Data);
    EncryptedEmailPacket emailPacket2 = new EncryptedEmailPacket(emailPkt2Data);
    // matches emailPkt1Data
    UniqueId delAuthKey1 = new UniqueId("nJlsaGZb1k6OFze1fUsHEF0osP5Wv9Rgta8EwHl8Te8=");
    // matches emailPkt2Data
    UniqueId delAuthKey2 = new UniqueId("ImXwDy7HZq7pyjGwxpYmlwaKAWoQlUl2fdrBK~mTt0g=");
    String prefix1 = emailPacket1.getDhtKey().toBase64().substring(0, 2);
    String prefix2 = emailPacket2.getDhtKey().toBase64().substring(0, 2);
    assertEquals("Error setting up test packets: prefixes of DHT keys differ", prefix1, prefix2);
    assertFalse("Error setting up test packets: DHT keys should be different", emailPacket1.getDhtKey().equals(emailPacket2.getDhtKey()));
    // add two packets and delete them via delete requests
    packetFolder.store(emailPacket1);
    assertEquals("Folder should have exactly one element!", 1, packetFolder.getElements().size());
    packetFolder.store(emailPacket2);
    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());
    // verify that there is one deletion file containing two entries
    File[] files = packetFolder.getStorageDirectory().listFiles();
    assertEquals(1, files.length);
    assertTrue(files[0].getName().startsWith("DEL_"));
    DataPacket dataPacket = DataPacket.createPacket(files[0]);
    assertTrue(dataPacket instanceof DeletionInfoPacket);
    DeletionInfoPacket delInfoPacket = (DeletionInfoPacket) dataPacket;
    Iterator<DeletionRecord> delPacketIterator = delInfoPacket.iterator();
    assertTrue("DeletionInfoPacket has no elements!", delPacketIterator.hasNext());
    delPacketIterator.next();
    assertTrue("DeletionInfoPacket has less than one element!", delPacketIterator.hasNext());
    delPacketIterator.next();
    assertFalse("DeletionInfoPacket has more than two elements!", delPacketIterator.hasNext());
    // verify that the two deletion records match the DHT keys and auth keys of the deleted packets
    DeleteRequest newDelRequest1 = packetFolder.storeAndCreateDeleteRequest(emailPacket1);
    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);
}
Also used : EmailPacketDeleteRequest(i2p.bote.packet.dht.EmailPacketDeleteRequest) UniqueId(i2p.bote.UniqueId) DeletionInfoPacket(i2p.bote.packet.dht.DeletionInfoPacket) DeletionRecord(i2p.bote.packet.dht.DeletionRecord) EncryptedEmailPacket(i2p.bote.packet.dht.EncryptedEmailPacket) DataPacket(i2p.bote.packet.DataPacket) File(java.io.File) DeleteRequest(i2p.bote.packet.dht.DeleteRequest) EmailPacketDeleteRequest(i2p.bote.packet.dht.EmailPacketDeleteRequest) Test(org.junit.Test)

Aggregations

DeletionInfoPacket (i2p.bote.packet.dht.DeletionInfoPacket)8 DeletionRecord (i2p.bote.packet.dht.DeletionRecord)6 DeleteRequest (i2p.bote.packet.dht.DeleteRequest)4 UniqueId (i2p.bote.UniqueId)3 DataPacket (i2p.bote.packet.DataPacket)3 DhtStorablePacket (i2p.bote.packet.dht.DhtStorablePacket)3 EncryptedEmailPacket (i2p.bote.packet.dht.EncryptedEmailPacket)3 Hash (net.i2p.data.Hash)3 DeletionAwareDhtFolder (i2p.bote.folder.DeletionAwareDhtFolder)2 DhtStorageHandler (i2p.bote.network.DhtStorageHandler)2 DeletionQuery (i2p.bote.packet.dht.DeletionQuery)2 EmailPacketDeleteRequest (i2p.bote.packet.dht.EmailPacketDeleteRequest)2 IndexPacket (i2p.bote.packet.dht.IndexPacket)2 IndexPacketDeleteRequest (i2p.bote.packet.dht.IndexPacketDeleteRequest)2 File (java.io.File)2 Test (org.junit.Test)2 PacketBatch (i2p.bote.network.PacketBatch)1 ResponsePacket (i2p.bote.packet.ResponsePacket)1 FindClosePeersPacket (i2p.bote.packet.dht.FindClosePeersPacket)1 IndexPacketEntry (i2p.bote.packet.dht.IndexPacketEntry)1