Author: toad Date: 2007-07-10 14:57:36 +0000 (Tue, 10 Jul 2007) New Revision: 14015
Modified: trunk/freenet/src/freenet/client/async/USKProxyCompletionCallback.java trunk/freenet/src/freenet/keys/USK.java Log: When redirecting, don't clobber original USK Modified: trunk/freenet/src/freenet/client/async/USKProxyCompletionCallback.java =================================================================== --- trunk/freenet/src/freenet/client/async/USKProxyCompletionCallback.java 2007-07-10 12:05:28 UTC (rev 14014) +++ trunk/freenet/src/freenet/client/async/USKProxyCompletionCallback.java 2007-07-10 14:57:36 UTC (rev 14015) @@ -3,8 +3,11 @@ * http://www.gnu.org/ for further details of the GPL. */ package freenet.client.async; +import java.util.Arrays; + import freenet.client.FetchException; import freenet.client.FetchResult; +import freenet.keys.FreenetURI; import freenet.keys.USK; public class USKProxyCompletionCallback implements GetCompletionCallback { @@ -25,6 +28,11 @@ } public void onFailure(FetchException e, ClientGetState state) { + FreenetURI uri = e.newURI; + if(uri != null) { + uri = usk.turnMySSKIntoUSK(uri); + e.newURI = uri; + } cb.onFailure(e, state); } Modified: trunk/freenet/src/freenet/keys/USK.java =================================================================== --- trunk/freenet/src/freenet/keys/USK.java 2007-07-10 12:05:28 UTC (rev 14014) +++ trunk/freenet/src/freenet/keys/USK.java 2007-07-10 14:57:36 UTC (rev 14015) @@ -139,4 +139,27 @@ public String toString() { return super.toString()+ ':' +getURI(); } + + public FreenetURI turnMySSKIntoUSK(FreenetURI uri) { + if(uri.getKeyType().equals("SSK") && + Arrays.equals(uri.getRoutingKey(), pubKeyHash) && + Arrays.equals(uri.getCryptoKey(), cryptoKey) && + Arrays.equals(uri.getExtra(), ClientSSK.getExtraBytes(cryptoAlgorithm)) && + uri.getDocName() != null && + uri.getDocName().startsWith(siteName)) { + String doc = uri.getDocName(); + doc = doc.substring(siteName.length()); + if(doc.length() < 2 || doc.charAt(0) != '-') return uri; + long edition; + try { + edition = Long.parseLong(doc); + } catch (NumberFormatException e) { + Logger.normal(this, "Trying to turn SSK back into USK: "+uri+" doc="+doc+" caught "+e, e); + return uri; + } + if(!doc.equals(Long.toString(edition))) return uri; + return new FreenetURI("USK", siteName, uri.getAllMetaStrings(), pubKeyHash, cryptoKey, ClientSSK.getExtraBytes(cryptoAlgorithm), edition); + } + return uri; + } }
