package thaw.fcp; import thaw.core.Logger; /** * would be better called "FreenetKeyHelper" ... but too late :p */ public class FreenetURIHelper { private FreenetURIHelper() { } /** * Quick test to see if the string could be a key * only check the head, not the content (this property is used in FetchPlugin, * please keep it) */ public static boolean isAKey(String key) { if (key == null) return false; if (key.startsWith("CHK@") || key.startsWith("SSK@") || key.startsWith("USK@")) { return (key.length() > 20); } return key.startsWith("KSK@"); } private final static String[] TEST_GOOD_KEYS = { "CHK@mmHr8ldkPL-ByTdAKL~IMua0z9nJ~dLnzoRIbbOaf2w,ORl1uXUYnutIayK~0Js5r6dnOBTYerm17OsxFq7jwpo,AAIC--8/Thaw-0.7.10.jar", "USK@p-uFAWUomLm37MCQLu3r67-B8e6yF1kS4q2v0liM1Vk,h0MWqM~lF0Bec-AIv445PLn06ams9-RFbnwO6Cm2Snc,AQACAAE/Thaw/7/Thaw.frdx", "KSK@gpl", "SSK@FoNrbtiJCeRUIorP01Vx5~Pn0aVp4tMeesVKObwbKXE,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQECAAE/" }; private final static String[] TEST_BASIC_BAD_KEYS = { "CHK@mmH/Toto.jar", "BLEH" }; private static boolean testIsAKey() { System.out.println("=> isAKey()"); for (int i = 0 ; i < TEST_GOOD_KEYS.length ; i++) { System.out.print("==> Good key "+Integer.toString(i)+" : "); if (!isAKey(TEST_GOOD_KEYS[i])) { System.out.println("FAILED"); System.out.println("Failed on: "+TEST_GOOD_KEYS[i]); return false; } System.out.println("Ok"); } for (int i = 0 ; i < TEST_BASIC_BAD_KEYS.length ; i++) { System.out.print("==> Bad key "+Integer.toString(i)+" : "); if (isAKey(TEST_BASIC_BAD_KEYS[i])) { System.out.println("FAILED"); System.out.println("Failed on: "+TEST_BASIC_BAD_KEYS[i]); return false; } System.out.println("Ok"); } return true; } public static String cleanURI(String uri) { if (uri == null) return uri; uri = uri.trim(); uri = uri.replaceFirst("^http://[^/]+/+(freenet:)*",""); try { uri = java.net.URLDecoder.decode(uri, "UTF-8"); } catch (final java.io.UnsupportedEncodingException e) { Logger.warning(new FreenetURIHelper(), "UnsupportedEncodingException (UTF-8): "+e.toString()); } if (!isAKey(uri)) { Logger.notice(new FreenetURIHelper(), "Not a valid key: "+uri); return null; } return uri; } private final static String[][] TEST_CLEANABLE_KEYS = { /* { unclean key, expected result } */ { "CHK%40mmHr8ldkPL-ByTdAKL~IMua0z9nJ~dLnzoRIbbOaf2w,ORl1uXUYnutIayK~0Js5r6dnOBTYerm17OsxFq7jwpo,AAIC--8/Thaw-0.7.10.jar", "CHK@mmHr8ldkPL-ByTdAKL~IMua0z9nJ~dLnzoRIbbOaf2w,ORl1uXUYnutIayK~0Js5r6dnOBTYerm17OsxFq7jwpo,AAIC--8/Thaw-0.7.10.jar" }, { "http://127.0.0.1:8888/CHK%40mmHr8ldkPL-ByTdAKL~IMua0z9nJ~dLnzoRIbbOaf2w,ORl1uXUYnutIayK~0Js5r6dnOBTYerm17OsxFq7jwpo,AAIC--8/Thaw-0.7.10.jar", "CHK@mmHr8ldkPL-ByTdAKL~IMua0z9nJ~dLnzoRIbbOaf2w,ORl1uXUYnutIayK~0Js5r6dnOBTYerm17OsxFq7jwpo,AAIC--8/Thaw-0.7.10.jar" }, { "http://192.168.100.1:8888/CHK%40mmHr8ldkPL-ByTdAKL~IMua0z9nJ~dLnzoRIbbOaf2w,ORl1uXUYnutIayK~0Js5r6dnOBTYerm17OsxFq7jwpo,AAIC--8/Thaw-0.7.10.jar", "CHK@mmHr8ldkPL-ByTdAKL~IMua0z9nJ~dLnzoRIbbOaf2w,ORl1uXUYnutIayK~0Js5r6dnOBTYerm17OsxFq7jwpo,AAIC--8/Thaw-0.7.10.jar" }, { "http://192.168.100.1:1234/CHK%40mmHr8ldkPL-ByTdAKL~IMua0z9nJ~dLnzoRIbbOaf2w,ORl1uXUYnutIayK~0Js5r6dnOBTYerm17OsxFq7jwpo,AAIC--8/Thaw-0.7.10.jar", "CHK@mmHr8ldkPL-ByTdAKL~IMua0z9nJ~dLnzoRIbbOaf2w,ORl1uXUYnutIayK~0Js5r6dnOBTYerm17OsxFq7jwpo,AAIC--8/Thaw-0.7.10.jar" } }; private static boolean testCleanURI() { System.out.println("=> cleanURI()"); for (int i = 0; i < TEST_CLEANABLE_KEYS.length ; i++) { System.out.print("==> Clean "+Integer.toString(i)+": "); String cleaned = cleanURI(TEST_CLEANABLE_KEYS[i][0]); if (!TEST_CLEANABLE_KEYS[i][1].equals(cleaned)) { System.out.println("FAILED"); System.out.println("Failed on: "+TEST_CLEANABLE_KEYS[i][0]); System.out.println("Got : "+cleaned); return false; } System.out.println("Ok"); } return true; } public static String getFilenameFromKey(final String key) { String filename = null; final String cutcut[]; if (key == null) return null; if (key.startsWith("KSK")) { filename = key.substring(4); } else { cutcut = key.split("/"); if (key.startsWith("CHK")) { if (cutcut.length >= 2) filename = cutcut[1]; } else if (key.startsWith("SSK")) { filename = cutcut[cutcut.length-1]; } else if (key.startsWith("USK")) { if (cutcut.length >= 4 || cutcut.length == 2) filename = cutcut[cutcut.length-1]; else if (cutcut.length == 3) filename = cutcut[cutcut.length-2]; } } if (filename != null) { try { filename = java.net.URLDecoder.decode(filename, "UTF-8"); } catch (final java.io.UnsupportedEncodingException e) { Logger.warning(filename, "UnsupportedEncodingException (UTF-8): "+e.toString()); } } return filename; } public final static String[][] TEST_FILENAMED_KEYS = { { /* 0 */ "CHK@mmHr8ldkPL-ByTdAKL~IMua0z9nJ~dLnzoRIbbOaf2w,ORl1uXUYnutIayK~0Js5r6dnOBTYerm17OsxFq7jwpo,AAIC--8/Thaw-0.7.10.jar", "Thaw-0.7.10.jar" }, { /* 1 */ "CHK@mmHr8ldkPL-ByTdAKL~IMua0z9nJ~dLnzoRIbbOaf2w,ORl1uXUYnutIayK~0Js5r6dnOBTYerm17OsxFq7jwpo,AAIC--8/", null }, { /* 2 * / /* the '/' at the end was removed */ "CHK@mmHr8ldkPL-ByTdAKL~IMua0z9nJ~dLnzoRIbbOaf2w,ORl1uXUYnutIayK~0Js5r6dnOBTYerm17OsxFq7jwpo,AAIC--8", null }, { /* 3 */ "USK%4061m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly%20writable%20index/44/Publicly%20writable%20index.frdx", "Publicly writable index.frdx" }, { /* 4 */ "USK%4061m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly%20writable%20index/44", "Publicly writable index" }, { /* 5 */ "KSK@gpl.txt", "gpl.txt" }, { /* 6 */ "SSK@FoNrbtiJCeRUIorP01Vx5~Pn0aVp4tMeesVKObwbKXE,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQECAAE/toto-5/toto.frdx", "toto.frdx" }, { /* 7 */ "SSK@FoNrbtiJCeRUIorP01Vx5~Pn0aVp4tMeesVKObwbKXE,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQECAAE/toto-5/", "toto-5" /* yes, it's the wanted behavior */ } }; private static boolean testGetFilenameFromKey() { System.out.println("=> getFilenameFromKey()"); for (int i = 0; i < TEST_FILENAMED_KEYS.length ; i++) { System.out.print("==> getFilenameFromKey "+Integer.toString(i)+": "); String filename = getFilenameFromKey(TEST_FILENAMED_KEYS[i][0]); if ( (TEST_FILENAMED_KEYS[i][1] == null && filename != null) || (TEST_FILENAMED_KEYS[i][1] != null && !TEST_FILENAMED_KEYS[i][1].equals(filename)) ) { System.out.println("FAILED"); System.out.println("Failed on: "+TEST_FILENAMED_KEYS[i][0]); System.out.println("Got : "+filename); return false; } System.out.println("Ok"); } return true; } public static String convertSSKtoUSK(String SSK) { if ((SSK == null) || SSK.startsWith("USK@")) return SSK; SSK = SSK.replaceFirst("SSK@", "USK@"); final String[] split = SSK.split("/"); SSK = ""; for (int i = 0 ; i < split.length ; i++) { switch (i) { case(0): SSK = split[i]; break; case(1): final String subsplit[] = split[i].split("-"); SSK = SSK + "/"; for (int j = 0 ; j < subsplit.length-1 ; j++) { if (j == 0) SSK = SSK + subsplit[j]; else SSK = SSK + "-" + subsplit[j]; } SSK = SSK + "/" + subsplit[subsplit.length-1]; break; default: SSK = SSK + "/" + split[i]; } } return SSK; } private final static String[][] TEST_SSK_TO_USK = { { "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly%20writable%20index-44/Publicly writable index.frdx", "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly%20writable%20index/44/Publicly writable index.frdx" } }; private static boolean testConvertSSKtoUSK() { System.out.println("=> convertSSKtoUSK()"); for (int i = 0; i < TEST_SSK_TO_USK.length ; i++) { System.out.print("==> convert "+Integer.toString(i)+": "); String usk = convertSSKtoUSK(TEST_SSK_TO_USK[i][0]); if ( (TEST_SSK_TO_USK[i][1] == null && usk != null) || (TEST_SSK_TO_USK[i][1] != null && !TEST_SSK_TO_USK[i][1].equals(usk)) ) { System.out.println("FAILED"); System.out.println("Failed on: "+TEST_SSK_TO_USK[i][0]); System.out.println("Got : "+usk); return false; } System.out.println("Ok"); } return true; } private static String abs(final String val) { try { final java.math.BigDecimal bd = new java.math.BigDecimal(val); return bd.abs().toString(); } catch(final java.lang.NumberFormatException e) { Logger.warning(new FreenetURIHelper(), "NumberFormatException while parsing '"+val+"'"); return "0"; } } public static String convertUSKtoSSK(String USK) { if ((USK == null) || USK.startsWith("SSK@")) return USK; USK = USK.replaceFirst("USK@", "SSK@"); final String[] split = USK.split("/"); USK = ""; for (int i = 0 ; i < split.length ; i++) { switch (i) { case(0): USK = split[i]; break; case(2): USK += "-" + FreenetURIHelper.abs(split[i]); break; default: USK += "/" + split[i]; break; } } return USK; } private final static String[][] TEST_USK_TO_SSK = { { "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly%20writable%20index/44/Publicly writable index.frdx", "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly%20writable%20index-44/Publicly writable index.frdx" }, { "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly%20writable%20index/-44/Publicly writable index.frdx", "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly%20writable%20index-44/Publicly writable index.frdx" } }; private static boolean testConvertUSKtoSSK() { System.out.println("=> convertSSKtoUSK()"); for (int i = 0; i < TEST_USK_TO_SSK.length ; i++) { System.out.print("==> convert "+Integer.toString(i)+": "); String ssk = convertUSKtoSSK(TEST_USK_TO_SSK[i][0]); if ( (TEST_USK_TO_SSK[i][1] == null && ssk != null) || (TEST_USK_TO_SSK[i][1] != null && !TEST_USK_TO_SSK[i][1].equals(ssk)) ) { System.out.println("FAILED"); System.out.println("Failed on: "+TEST_USK_TO_SSK[i][0]); System.out.println("Got : "+ssk); return false; } System.out.println("Ok"); } return true; } public static String getPublicInsertionSSK(String key) { key = FreenetURIHelper.convertUSKtoSSK(key); final String split[] = key.split("/"); key = ""; for (int i = 0 ; i < split.length-1 ; i++) { if (i == 0) key = key + split[i]; else key = key + "/" + split[i]; } return key; } private static String changeRev(final String revStr, final int rev, final int offset) { if (offset == 0) return Integer.toString(rev); return Integer.toString(Integer.parseInt(revStr) + offset); } /** * @param offset if == 0, then rev is changed according to the given offset */ public static String changeSSKRevision(String key, final int rev, final int offset) { if (key == null) return null; final String[] split = key.split("/"); key = ""; for (int i = 0 ; i < split.length ; i++) { switch(i) { case(0): key = key + split[i]; break; case(1): final String[] subsplit = split[i].split("-"); for (int j = 0 ; j < subsplit.length-1 ; j++) { if (j == 0) key = key + "/" + subsplit[j]; else key = key + "-" + subsplit[j]; } key = key + "-" + FreenetURIHelper.changeRev(subsplit[subsplit.length-1], rev, offset); break; default: key = key + "/" + split[i]; } } return key; } public static String changeUSKRevision(String key, int rev, int offset) { if (key == null) return null; final String[] split = key.split("/"); key = ""; for (int i = 0 ; i < split.length ; i++) { switch(i) { case(0): key = key + split[i]; break; case(2): key = key + "/" + FreenetURIHelper.changeRev(split[2], rev, offset); break; default: key = key + "/" + split[i]; } } return key; } private static final String[][] TEST_CHANGE_SSK_REV = { { "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-44/Publicly writable index.frdx", "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-40/Publicly writable index.frdx" }, { "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-44/Publicly writable index.frdx", "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-48/Publicly writable index.frdx" }, { "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-44/Publicly writable index.frdx", "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-12/Publicly writable index.frdx" }, { "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-44/Publicly writable index.frdx", "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-0/Publicly writable index.frdx" } }; private static final String[][] TEST_CHANGE_USK_REV = { { "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index/44/Publicly writable index.frdx", "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index/40/Publicly writable index.frdx" }, { /* yep, it's the expected behavior */ "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index/-44/Publicly writable index.frdx", /* rev += 4 */ "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index/-40/Publicly writable index.frdx" }, { "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index/44/Publicly writable index.frdx", "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index/12/Publicly writable index.frdx" }, { "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index/44/Publicly writable index.frdx", "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index/0/Publicly writable index.frdx" } }; private static final int[][] TEST_CHANGE_REV = { /* { rev, offset } */ { 0, -4 }, { 0, 4 }, { 12, 0}, { 0, 0} }; private static boolean testRevisionChange(boolean ssk, String[][] TEST_SET) { if (ssk) System.out.println("=> changeSSKRevision()"); else System.out.println("=> changeUSKRevision()"); for (int i = 0 ; i < TEST_CHANGE_REV.length ; i++) { System.out.print("==> Key "+Integer.toString(i)+": "); String result = (ssk ? changeSSKRevision(TEST_SET[i][0], TEST_CHANGE_REV[i][0], TEST_CHANGE_REV[i][1]) : changeUSKRevision(TEST_SET[i][0], TEST_CHANGE_REV[i][0], TEST_CHANGE_REV[i][1])); if (!TEST_SET[i][1].equals(result)) { System.out.println("FAILED"); System.out.println("Failed on : "+TEST_SET[i][0]); System.out.println("Get : "+result); System.out.println("Expected : "+TEST_SET[i][1]); return false; } System.out.println("Ok"); } return true; } public static int getUSKRevision(final String key) { String[] split; if (key == null) return -1; split = key.split("/"); if (split.length < 3) return -1; try { return Integer.parseInt(split[2]); } catch(NumberFormatException e) { Logger.warning(new FreenetURIHelper(), "Unable to parse '"+key +"'"); return -1; } } private final static String[] TEST_USK_REV = { "USK@p-uFAWUomLm37MCQLu3r67-B8e6yF1kS4q2v0liM1Vk,h0MWqM~lF0Bec-AIv445PLn06ams9-RFbnwO6Cm2Snc,AQACAAE/Thaw/7/Thaw.frdx", "USK%4061m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly%20writable%20index/44/Publicly%20writable%20index.frdx", "USK%4061m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly%20writable%20index/-44/Publicly%20writable%20index.frdx" }; private final static int[] TEST_USK_REV_RESULTS = { 7, 44, -44 }; private static boolean testGetUSKRevision() { System.out.println("=> getUSKRevision()"); for (int i = 0; i < TEST_USK_REV.length ; i++) { System.out.print("==> Key "+Integer.toString(i) + " : "); int result = getUSKRevision(TEST_USK_REV[i]); if (result != TEST_USK_REV_RESULTS[i]) { System.out.println("FAILED"); System.out.println("Returned: "+Integer.toString(result)); return false; } System.out.println("Ok"); } return true; } /** * will lower the case ! * will return the begining of the key. */ public static String getComparablePart(String key) { if (key == null) return null; if (key.startsWith("KSK@")) { return key.toLowerCase(); } if (key.length() <= 70) return key.toLowerCase(); return key.substring(0, 70).toLowerCase(); } /** * this process is not costless. * Ignore the revisions * @return true if they match */ public static boolean compareKeys(String keyA, String keyB) { if (keyA == keyB) return true; if (keyA == null || keyB == null) { Logger.notice(new FreenetURIHelper(), "compareKeys : null argument ?!"); return false; } keyA = cleanURI(keyA); keyB = cleanURI(keyB); if (keyA.startsWith("USK@")) keyA = convertUSKtoSSK(keyA); if (keyB.startsWith("USK@")) keyB = convertUSKtoSSK(keyB); if (!keyA.substring(0, 3).equals(keyB.substring(0, 3))) { Logger.notice(new FreenetURIHelper(), "Not the same kind of key : "+ keyA.substring(0, 3) + " vs " + keyB.substring(0, 3)); return false; } if (keyA.startsWith("CHK@")) { return getComparablePart(keyA).equals(getComparablePart(keyB)); } if (keyA.startsWith("SSK@")) { keyA = changeSSKRevision(keyA, 0, 0); keyB = changeSSKRevision(keyB, 0, 0); String[] splitA = keyA.split("/"); String[] splitB = keyB.split("/"); if (splitA.length != splitB.length) { /* we shorten the keys because one has less elements than the other */ keyA = splitA[0]+splitA[1]; keyB = splitB[0]+splitB[1]; } keyA = keyA.replaceAll(".frdx", ".xml"); /* we consider .frdx equivalent to .xml */ keyB = keyB.replaceAll(".frdx", ".xml"); /* we consider .frdx equivalent to .xml */ } if ( keyA.equals(keyB) ) return true; return false; } private final static String[][] TEST_COMPARE_KEYS = { { "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-40/Publicly writable index.frdx", "SSK@p-uFAWUomLm37MCQLu3r67-B8e6yF1kS4q2v0liM1Vk,h0MWqM~lF0Bec-AIv445PLn06ams9-RFbnwO6Cm2Snc,AQACAAE/Thaw/7/Thaw.frdx" }, { "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-40/Publicly writable index.frdx", "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-40/Publicly writable index.frdx" }, { "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-40/Publicly writable index.frdx", "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index/-3/Publicly writable index.frdx" }, { "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-40/Publicly writable index.frdx", "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly%20writable%20index/-3/Publicly%20writable%20index.frdx" }, { "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-40/Publicly writable index.frdx", "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly%20writable%20index/-3" }, { "SSK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly writable index-40/Publicly writable index.frdx", "USK@61m2WMJEA9pyQQQ-hjGN8lIM2xToNJHyacJ8ZPB9JCQ,5aEPJBhwIV~HpGIG8YTpKSB39WCGgd0BUNWZ012745Y,AQACAAE/Publicly%20writable%20index/-3/pouet.txt" } }; private final static boolean[] TEST_COMPARE_KEYS_RESULTS = { false, true, true, true, true/* yes it's a wanted behavior because of the indexes */, false }; private static boolean testCompareKeys() { System.out.println("=> compareKeys"); for (int i = 0; i < TEST_COMPARE_KEYS.length ; i++) { System.out.print("==> Key "+Integer.toString(i) + " : "); boolean result = compareKeys(TEST_COMPARE_KEYS[i][0], TEST_COMPARE_KEYS[i][1]); if (result != TEST_COMPARE_KEYS_RESULTS[i]) { System.out.println("FAILED"); System.out.println("Failed on :"); System.out.println(TEST_COMPARE_KEYS[i][0]); System.out.println(TEST_COMPARE_KEYS[i][1]); System.out.println("Returned: "+Boolean.toString(result)); return false; } System.out.println("Ok"); } return true; } public static boolean isObsolete(String key) { if (key.startsWith("KSK")) return false; if (key.startsWith("SSK") || key.startsWith("USK")) { if (key.indexOf("AQABAAE") > 0) return true; return false; } if (key.startsWith("CHK")) { if (key.indexOf(",AAE") > 0) return true; return false; } return true; } public static void main(String[] args) { System.out.println("FreenetURIHelper tests:"); if (!testIsAKey() || !testCleanURI() || !testGetFilenameFromKey() || !testConvertSSKtoUSK() || !testConvertUSKtoSSK() || !testRevisionChange(true, TEST_CHANGE_SSK_REV) || !testRevisionChange(false, TEST_CHANGE_USK_REV) || !testGetUSKRevision() || !testCompareKeys()) { System.out.println("FAILURE"); return; } System.out.println("Tests successful"); } }