diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java index 6fffe6dde..87b6b5d90 100644 --- a/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java +++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressBean.java @@ -24,6 +24,7 @@ package i2p.susi.dns; +import java.net.IDN; import java.util.Date; import java.util.Properties; @@ -36,6 +37,19 @@ public class AddressBean { private final String name, destination; private Properties props; + /** available as of Java 6 */ + static final boolean haveIDN; + + static { + boolean h; + try { + Class.forName("java.net.IDN", false, ClassLoader.getSystemClassLoader()); + h = true; + } catch (ClassNotFoundException cnfe) { + h = false; + } + haveIDN = h; + } public AddressBean(String name, String destination) { @@ -48,11 +62,34 @@ public class AddressBean return destination; } + /** + * The ASCII (Punycode) name + */ public String getName() { return name; } + /** + * The Unicode name, translated from Punycode + * @since 0.8.6 + */ + public String getDisplayName() + { + if (haveIDN) + return IDN.toUnicode(name); + return name; + } + + /** + * Is the ASCII name Punycode-encoded? + * @since 0.8.6 + */ + public boolean isIDN() + { + return haveIDN && !IDN.toUnicode(name).equals(name); + } + /** @since 0.8.6 */ public String getB32() { diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressByNameSorter.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressByNameSorter.java index 6421f23a9..54902f239 100644 --- a/apps/susidns/src/java/src/i2p/susi/dns/AddressByNameSorter.java +++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressByNameSorter.java @@ -36,6 +36,6 @@ public class AddressByNameSorter implements Comparator if( b == null ) return -1; - return a.getName().compareToIgnoreCase(b.getName()); + return a.getDisplayName().compareToIgnoreCase(b.getDisplayName()); } } diff --git a/apps/susidns/src/java/src/i2p/susi/dns/NamingServiceBean.java b/apps/susidns/src/java/src/i2p/susi/dns/NamingServiceBean.java index b5a7c48e1..cabdb0f53 100644 --- a/apps/susidns/src/java/src/i2p/susi/dns/NamingServiceBean.java +++ b/apps/susidns/src/java/src/i2p/susi/dns/NamingServiceBean.java @@ -22,6 +22,7 @@ package i2p.susi.dns; +import java.net.IDN; import java.util.Arrays; import java.util.Comparator; import java.util.Iterator; @@ -222,9 +223,15 @@ public class NamingServiceBean extends AddressbookBean message = _("Host name {0} is already in addressbook with a different destination. Click \"Replace\" to overwrite.", hostname); } else { try { + String host = hostname; + if (AddressBean.haveIDN) { + try { + host = IDN.toASCII(hostname, IDN.ALLOW_UNASSIGNED); + } catch (IllegalArgumentException iae) {} + } Destination dest = new Destination(destination); nsOptions.setProperty("s", _("Manually added via SusiDNS")); - boolean success = getNamingService().put(hostname, dest, nsOptions); + boolean success = getNamingService().put(host, dest, nsOptions); if (success) { changed = true; if (oldDest == null) diff --git a/apps/susidns/src/jsp/addressbook.jsp b/apps/susidns/src/jsp/addressbook.jsp index 1292e9009..b1d90b566 100644 --- a/apps/susidns/src/jsp/addressbook.jsp +++ b/apps/susidns/src/jsp/addressbook.jsp @@ -150,7 +150,7 @@ ${book.loadBookMessages} "> -${addr.name} +${addr.displayName} (b32) (<%=intl._("details")%>) diff --git a/apps/susidns/src/jsp/details.jsp b/apps/susidns/src/jsp/details.jsp index fc03a75cb..8dbebc5a2 100644 --- a/apps/susidns/src/jsp/details.jsp +++ b/apps/susidns/src/jsp/details.jsp @@ -82,8 +82,17 @@ + + +<% + if (addr.isIDN()) { +%> + +<% + } +%>
<%=intl._("Host Name")%><%=addr.getDisplayName()%>
<%=intl._("Punycode Name")%> <%=addr.getName()%>
<%=intl._("Base 32 Address")%> <%=b32%>