Author: toad
Date: 2008-03-19 15:37:17 +0000 (Wed, 19 Mar 2008)
New Revision: 18600

Modified:
   trunk/freenet/src/freenet/node/RequestSender.java
Log:
Accept the new messages when fetching an offered key also.

Modified: trunk/freenet/src/freenet/node/RequestSender.java
===================================================================
--- trunk/freenet/src/freenet/node/RequestSender.java   2008-03-19 15:32:19 UTC 
(rev 18599)
+++ trunk/freenet/src/freenet/node/RequestSender.java   2008-03-19 15:37:17 UTC 
(rev 18600)
@@ -366,6 +366,63 @@
                                offers.deleteLastOffer();
                                        continue;
                                }
+                       } else if(reply.getSpec() == 
DMT.FNPSSKDataFoundHeaders) {
+                               headers = ((ShortBuffer) 
reply.getObject(DMT.BLOCK_HEADERS)).getData();
+                               // Wait for the data
+                               MessageFilter mfData = 
MessageFilter.create().setSource(pn).setField(DMT.UID, 
uid).setTimeout(GET_OFFER_TIMEOUT).setType(DMT.FNPSSKDataFoundData);
+                               Message dataMessage;
+                               try {
+                                               dataMessage = 
node.usm.waitFor(mfData, this);
+                                       } catch (DisconnectedException e) {
+                                               if(logMINOR)
+                                                       Logger.minor(this, 
"Disconnected: "+pn+" getting data for offer for "+key);
+                                               offers.deleteLastOffer();
+                                               continue;
+                                       }
+                                       if(dataMessage == null) {
+                                       Logger.error(this, "Got headers but not 
data from "+pn+" for offer for "+key);
+                                       offers.deleteLastOffer();
+                                       continue;
+                                       }
+                                       sskData = ((ShortBuffer) 
dataMessage.getObject(DMT.DATA)).getData();
+                               MessageFilter mfPK = 
MessageFilter.create().setSource(pn).setField(DMT.UID, 
uid).setTimeout(GET_OFFER_TIMEOUT).setType(DMT.FNPSSKPubKey);
+                               Message pk;
+                                       try {
+                                               pk = node.usm.waitFor(mfPK, 
this);
+                                       } catch (DisconnectedException e) {
+                                               if(logMINOR)
+                                                       Logger.minor(this, 
"Disconnected: "+pn+" getting pubkey for offer for "+key);
+                                               offers.deleteLastOffer();
+                                               continue;
+                                       }
+                               if(pk == null) {
+                                       Logger.error(this, "Got data but not 
pubkey from "+pn+" for offer for "+key);
+                                       offers.deleteLastOffer();
+                                       continue;
+                               }
+                               try {
+                                               pubKey = 
DSAPublicKey.create(((ShortBuffer)pk.getObject(DMT.PUBKEY_AS_BYTES)).getData());
+                                       } catch (CryptFormatException e) {
+                                               Logger.error(this, "Bogus 
pubkey from "+pn+" for offer for "+key+" : "+e, e);
+                                       offers.deleteLastOffer();
+                                               continue;
+                                       }
+                                       
+                               try {
+                                               
((NodeSSK)key).setPubKey(pubKey);
+                                       } catch (SSKVerifyException e) {
+                                               Logger.error(this, "Bogus SSK 
data from "+pn+" for offer for "+key+" : "+e, e);
+                                       offers.deleteLastOffer();
+                                               continue;
+                                       }
+                               
+                               if(finishSSKFromGetOffer(pn)) {
+                                       if(logMINOR) Logger.minor(this, 
"Successfully fetched SSK from offer from "+pn+" for "+key);
+                                       return;
+                               } else {
+                               offers.deleteLastOffer();
+                                       continue;
+                               }
                        }
                }
                // RejectedOverload is possible - but we need to include it in 
the statistics.


Reply via email to