Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ Simply clone this repo.
byte[] data = ...
String encoded = Multibase.encode(Multibase.Base.Base58BTC, data);
byte[] decoded = Multibase.decode(encoded);
boolean isValid = Multibase.isValid(encoded);
```

## Dependency
Expand Down
34 changes: 30 additions & 4 deletions src/main/java/io/ipfs/multibase/Multibase.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.ipfs.multibase;

import java.util.Map;
import java.util.Optional;
import java.util.TreeMap;

import io.ipfs.multibase.binary.Base32;
Expand Down Expand Up @@ -45,14 +46,21 @@ public enum Base {
lookup.put(b.prefix, b);
}

public static Base lookup(String data) {
private static Optional<Base> lookupOptional(String data) {
if (data == null || data.isEmpty())
return Optional.empty();
String p = Character.toString(data.codePointAt(0));
Base base = lookup.get(p);
if (base != null)
return base;
return Optional.of(base);
if (data.startsWith(Base256Emoji.prefix))
return Base256Emoji;
throw new IllegalArgumentException("Unknown Multibase type: " + p);
return Optional.of(Base256Emoji);
return Optional.empty();
}

public static Base lookup(String data) {
return lookupOptional(data)
.orElseThrow(() -> new IllegalArgumentException("Unknown Multibase type: " + data));
}
}

Expand Down Expand Up @@ -154,4 +162,22 @@ private static String safeSubstringFromIndexOne(String data) {
int charIndex = data.offsetByCodePoints(0, 1);
return data.substring(charIndex);
}

/**
* Check if the given data has a valid multibase prefix.
*
* <p>
* Please note that "having a valid prefix" is NOT the same as "being an
* entirely valid multibase string"; even if <tt>true</tt>, it's still entirely
* possible for {@link #decode(String)} to throw an
* <tt>IllegalArgumentException</tt>, if prefix is valid, but the following
* data is not.
*
* @param data Multibase string to check.
* @return true if the data has a valid multibase prefix, false otherwise; but
* see above.
*/
public static boolean hasValidPrefix(String data) {
return Base.lookupOptional(data).isPresent();
}
}
14 changes: 14 additions & 0 deletions src/test/java/io/ipfs/multibase/MultibaseBadInputsTest.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package io.ipfs.multibase;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;

import java.util.Arrays;
Expand Down Expand Up @@ -29,4 +30,17 @@ public void badInputTest(String input) {
});
}

public static Collection<String> invalidPrefix() {
return Arrays.asList(
"2", // '2' is not a valid encoding marker
"", // Empty string is not a valid multibase
"🫕🚀" // This not a valid Emoji Multibase (note how it's inverted)
);
}

@MethodSource("invalidPrefix")
@ParameterizedTest(name = "{index}: \"{0}\"")
public void invalidPrefix(String input) {
assertFalse(Multibase.hasValidPrefix(input));
}
}
7 changes: 7 additions & 0 deletions src/test/java/io/ipfs/multibase/MultibaseTest.java
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class MultibaseTest {

Expand Down Expand Up @@ -67,6 +68,12 @@ public void testDecode(Multibase.Base base, byte[] raw, String encoded) {
assertArrayEquals(raw, output, String.format("Expected %s, but got %s", bytesToHex(raw), bytesToHex(output)));
}

@MethodSource("data")
@ParameterizedTest(name = "{index}: {0}, {2}")
public void testHasValidPrefix(Multibase.Base base, byte[] raw, String encoded) {
assertTrue(Multibase.hasValidPrefix(encoded));
}

//Copied from https://stackoverflow.com/a/140861
private static byte[] hexToBytes(String s) {
int len = s.length();
Expand Down