diff --git a/apps/addressbook/java/src/net/i2p/addressbook/AddressBook.java b/apps/addressbook/java/src/net/i2p/addressbook/AddressBook.java index 4a124e4886..40eeff5901 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/AddressBook.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/AddressBook.java @@ -159,8 +159,13 @@ class AddressBook { * @since 0.8.7 */ public Iterator> iterator() { - if (this.subFile != null) - return new ConfigIterator(this.subFile); + if (this.subFile != null) { + try { + return new ConfigIterator(this.subFile); + } catch (IOException ioe) { + return new ConfigIterator(); + } + } return this.addresses.entrySet().iterator(); } diff --git a/apps/addressbook/java/src/net/i2p/addressbook/ConfigIterator.java b/apps/addressbook/java/src/net/i2p/addressbook/ConfigIterator.java index 955363eafd..8b01fb854b 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/ConfigIterator.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/ConfigIterator.java @@ -54,11 +54,9 @@ class ConfigIterator implements Iterator> { /** * An iterator over the key/value pairs in the file. */ - public ConfigIterator(File file) { - try { + public ConfigIterator(File file) throws IOException { FileInputStream fileStream = new FileInputStream(file); - input = new BufferedReader(new InputStreamReader(fileStream)); - } catch (IOException ioe) {} + input = new BufferedReader(new InputStreamReader(fileStream, "UTF-8")); } public boolean hasNext() { diff --git a/apps/addressbook/java/src/net/i2p/addressbook/ConfigParser.java b/apps/addressbook/java/src/net/i2p/addressbook/ConfigParser.java index 5fda529402..e2cd8ab2a0 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/ConfigParser.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/ConfigParser.java @@ -116,7 +116,7 @@ class ConfigParser { public static Map parse(File file) throws IOException { FileInputStream fileStream = new FileInputStream(file); BufferedReader input = new BufferedReader(new InputStreamReader( - fileStream)); + fileStream, "UTF-8")); Map rv = parse(input); try { fileStream.close(); @@ -205,7 +205,7 @@ class ConfigParser { public static List parseSubscriptions(File file) throws IOException { FileInputStream fileStream = new FileInputStream(file); BufferedReader input = new BufferedReader(new InputStreamReader( - fileStream)); + fileStream, "UTF-8")); List rv = parseSubscriptions(input); try { fileStream.close(); diff --git a/apps/addressbook/java/src/net/i2p/addressbook/Log.java b/apps/addressbook/java/src/net/i2p/addressbook/Log.java index d0f01904f9..a87af2537f 100644 --- a/apps/addressbook/java/src/net/i2p/addressbook/Log.java +++ b/apps/addressbook/java/src/net/i2p/addressbook/Log.java @@ -23,8 +23,9 @@ package net.i2p.addressbook; import java.io.BufferedWriter; import java.io.File; -import java.io.FileWriter; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStreamWriter; import java.util.Date; /** @@ -56,8 +57,8 @@ class Log { public void append(String entry) { BufferedWriter bw = null; try { - bw = new BufferedWriter(new FileWriter(this.file, - true)); + bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(this.file, + true), "UTF-8")); String timestamp = new Date().toString(); bw.write(timestamp + " -- " + entry); bw.newLine(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java index 0664065fb5..4fd943c896 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java +++ b/apps/i2psnark/java/src/org/klomp/snark/bencode/BEValue.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import net.i2p.data.Base64; +import net.i2p.data.DataHelper; /** * Holds different types that a bencoded byte array can represent. @@ -208,7 +209,7 @@ public class BEValue } else if (bin) { buf.append(bs.length).append(" bytes: ").append(Base64.encode(bs)); } else { - buf.append('"').append(new String(bs)).append('"'); + buf.append('"').append(DataHelper.getUTF8(bs)).append('"'); } valueString = buf.toString(); } else diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java index 25f7fcf680..83fbb6d0a6 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java @@ -15,6 +15,7 @@ import java.util.Locale; import net.i2p.I2PAppContext; import net.i2p.data.ByteArray; +import net.i2p.data.DataHelper; import net.i2p.util.ByteCache; import net.i2p.util.Log; @@ -145,7 +146,7 @@ class HTTPResponseOutputStream extends FilterOutputStream { for (int i = 0; i < _headerBuffer.getValid(); i++) { if (isNL(_headerBuffer.getData()[i])) { if (lastEnd == -1) { - responseLine = new String(_headerBuffer.getData(), 0, i+1); // includes NL + responseLine = DataHelper.getUTF8(_headerBuffer.getData(), 0, i+1); // includes NL responseLine = filterResponseLine(responseLine); responseLine = (responseLine.trim() + "\r\n"); if (_log.shouldLog(Log.INFO)) @@ -158,12 +159,12 @@ class HTTPResponseOutputStream extends FilterOutputStream { int valLen = i-(j+1); if ( (keyLen <= 0) || (valLen < 0) ) throw new IOException("Invalid header @ " + j); - String key = new String(_headerBuffer.getData(), lastEnd+1, keyLen); + String key = DataHelper.getUTF8(_headerBuffer.getData(), lastEnd+1, keyLen); String val = null; if (valLen == 0) val = ""; else - val = new String(_headerBuffer.getData(), j+2, valLen).trim(); + val = DataHelper.getUTF8(_headerBuffer.getData(), j+2, valLen).trim(); if (_log.shouldLog(Log.INFO)) _log.info("Response header [" + key + "] = [" + val + "]"); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java index 02c5c3b0ed..5fff2c1eb3 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS5Server.java @@ -24,6 +24,7 @@ import net.i2p.I2PException; import net.i2p.client.streaming.I2PSocket; import net.i2p.client.streaming.I2PSocketOptions; import net.i2p.data.DataFormatException; +import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.i2ptunnel.I2PTunnelHTTPClientBase; import net.i2p.i2ptunnel.I2PTunnel; @@ -226,7 +227,7 @@ public class SOCKS5Server extends SOCKSServer { } byte addr[] = new byte[addrLen]; in.readFully(addr); - connHostName = new String(addr); + connHostName = DataHelper.getUTF8(addr); } _log.debug("DOMAINNAME address type in request: " + connHostName); break; diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSHeader.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSHeader.java index e2e7edc729..9b8a2c6f43 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSHeader.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKSHeader.java @@ -1,6 +1,7 @@ package net.i2p.i2ptunnel.socks; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; import net.i2p.data.Destination; /** @@ -65,7 +66,7 @@ public class SOCKSHeader { int namelen = (this.header[4] & 0xff); byte[] nameBytes = new byte[namelen]; System.arraycopy(nameBytes, 0, this.header, 5, namelen); - return new String(nameBytes); + return DataHelper.getUTF8(nameBytes); } public Destination getDestination() { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHelper.java index 8c147fcdd5..cf0a5be4bf 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigKeyringHelper.java @@ -1,20 +1,19 @@ package net.i2p.router.web; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.OutputStreamWriter; +import java.io.StringWriter; public class ConfigKeyringHelper extends HelperBase { public ConfigKeyringHelper() {} public String getSummary() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(4*1024); + StringWriter sw = new StringWriter(4*1024); try { - _context.keyRing().renderStatusHTML(new OutputStreamWriter(baos)); + _context.keyRing().renderStatusHTML(sw); } catch (IOException ioe) { ioe.printStackTrace(); } - return new String(baos.toByteArray()); + return sw.toString(); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHelper.java index 9db6722b44..fe532d470d 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigPeerHelper.java @@ -1,20 +1,19 @@ package net.i2p.router.web; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.OutputStreamWriter; +import java.io.StringWriter; public class ConfigPeerHelper extends HelperBase { public ConfigPeerHelper() {} public String getBlocklistSummary() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(4*1024); + StringWriter sw = new StringWriter(4*1024); try { - _context.blocklist().renderStatusHTML(new OutputStreamWriter(baos)); + _context.blocklist().renderStatusHTML(sw); } catch (IOException ioe) { ioe.printStackTrace(); } - return new String(baos.toByteArray()); + return sw.toString(); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java index e270bf7ffc..e6dc09a201 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java @@ -1,8 +1,7 @@ package net.i2p.router.web; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.OutputStreamWriter; +import java.io.StringWriter; import java.io.Serializable; import java.io.Writer; import java.util.ArrayList; @@ -25,9 +24,9 @@ public class JobQueueHelper extends HelperBase { renderStatusHTML(_out); return ""; } else { - ByteArrayOutputStream baos = new ByteArrayOutputStream(32*1024); - renderStatusHTML(new OutputStreamWriter(baos)); - return new String(baos.toByteArray()); + StringWriter sw = new StringWriter(32*1024); + renderStatusHTML(sw); + return sw.toString(); } } catch (IOException ioe) { ioe.printStackTrace(); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/TunnelHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/TunnelHelper.java index db64f77c25..c462c75d39 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/TunnelHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/TunnelHelper.java @@ -1,8 +1,7 @@ package net.i2p.router.web; -import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.OutputStreamWriter; +import java.io.StringWriter; public class TunnelHelper extends HelperBase { @@ -15,9 +14,9 @@ public class TunnelHelper extends HelperBase { renderer.renderStatusHTML(_out); return ""; } else { - ByteArrayOutputStream baos = new ByteArrayOutputStream(32*1024); - renderer.renderStatusHTML(new OutputStreamWriter(baos)); - return new String(baos.toByteArray()); + StringWriter sw = new StringWriter(32*1024); + renderer.renderStatusHTML(sw); + return sw.toString(); } } catch (IOException ioe) { ioe.printStackTrace(); diff --git a/apps/sam/java/src/net/i2p/sam/client/SAMReader.java b/apps/sam/java/src/net/i2p/sam/client/SAMReader.java index 0421a64580..f393949017 100644 --- a/apps/sam/java/src/net/i2p/sam/client/SAMReader.java +++ b/apps/sam/java/src/net/i2p/sam/client/SAMReader.java @@ -94,7 +94,7 @@ public class SAMReader { _log.error("Error reading from SAM", ioe); } - String line = new String(baos.toByteArray()); + String line = DataHelper.getUTF8(baos.toByteArray()); baos.reset(); if (line == null) { diff --git a/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java b/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java index a0d82d777e..2ce8b3b02f 100644 --- a/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java +++ b/apps/sam/java/src/net/i2p/sam/client/SAMStreamSend.java @@ -180,7 +180,7 @@ public class SAMStreamSend { byte dest[] = new byte[1024]; int read = DataHelper.read(fin, dest); - _remoteDestination = new String(dest, 0, read); + _remoteDestination = DataHelper.getUTF8(dest, 0, read); synchronized (_remotePeers) { _connectionId = _remotePeers.size() + 1; _remotePeers.put(Integer.valueOf(_connectionId), Sender.this); diff --git a/apps/susimail/src/src/i2p/susi/util/ReadBuffer.java b/apps/susimail/src/src/i2p/susi/util/ReadBuffer.java index 32d54c77e4..fb65e33a16 100644 --- a/apps/susimail/src/src/i2p/susi/util/ReadBuffer.java +++ b/apps/susimail/src/src/i2p/susi/util/ReadBuffer.java @@ -23,6 +23,8 @@ */ package i2p.susi.util; +import net.i2p.data.DataHelper; + /** * @author susi */ @@ -39,6 +41,6 @@ public class ReadBuffer { public String toString() { - return content != null ? new String( content, offset, length ) : ""; + return content != null ? DataHelper.getUTF8(content, offset, length) : ""; } } diff --git a/build.xml b/build.xml index a3c344f3f3..8b2ef50856 100644 --- a/build.xml +++ b/build.xml @@ -1735,6 +1735,7 @@ + diff --git a/core/java/src/net/i2p/crypto/eddsa/EdDSAPrivateKey.java b/core/java/src/net/i2p/crypto/eddsa/EdDSAPrivateKey.java index d3945976aa..4136b321a7 100644 --- a/core/java/src/net/i2p/crypto/eddsa/EdDSAPrivateKey.java +++ b/core/java/src/net/i2p/crypto/eddsa/EdDSAPrivateKey.java @@ -15,12 +15,12 @@ import net.i2p.crypto.eddsa.spec.EdDSAPrivateKeySpec; */ public class EdDSAPrivateKey implements EdDSAKey, PrivateKey { private static final long serialVersionUID = 23495873459878957L; - private transient final byte[] seed; - private transient final byte[] h; - private transient final byte[] a; - private transient final GroupElement A; - private transient final byte[] Abyte; - private transient final EdDSAParameterSpec edDsaSpec; + private final byte[] seed; + private final byte[] h; + private final byte[] a; + private final GroupElement A; + private final byte[] Abyte; + private final EdDSAParameterSpec edDsaSpec; public EdDSAPrivateKey(EdDSAPrivateKeySpec spec) { this.seed = spec.getSeed(); diff --git a/core/java/src/net/i2p/data/Base32.java b/core/java/src/net/i2p/data/Base32.java index 4ca506b883..8270aa9328 100644 --- a/core/java/src/net/i2p/data/Base32.java +++ b/core/java/src/net/i2p/data/Base32.java @@ -101,8 +101,8 @@ public class Base32 { } private static byte[] read(InputStream in) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); - byte buf[] = new byte[4096]; + ByteArrayOutputStream baos = new ByteArrayOutputStream(64); + byte buf[] = new byte[64]; while (true) { int read = in.read(buf); if (read < 0) break; @@ -118,7 +118,7 @@ public class Base32 { } private static void decode(InputStream in, OutputStream out) throws IOException { - byte decoded[] = decode(new String(read(in))); + byte decoded[] = decode(DataHelper.getUTF8(read(in))); if (decoded == null) { System.out.println("FAIL"); return; @@ -199,7 +199,7 @@ public class Base32 { byte[] b = decode(s); if (b == null) return null; - return new String(b); + return DataHelper.getUTF8(b); } /** diff --git a/core/java/src/net/i2p/data/Base64.java b/core/java/src/net/i2p/data/Base64.java index 2633c1b691..3babe10ee1 100644 --- a/core/java/src/net/i2p/data/Base64.java +++ b/core/java/src/net/i2p/data/Base64.java @@ -246,8 +246,8 @@ public class Base64 { } private static byte[] read(InputStream in) throws IOException { - ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); - byte buf[] = new byte[4096]; + ByteArrayOutputStream baos = new ByteArrayOutputStream(1024); + byte buf[] = new byte[1024]; while (true) { int read = in.read(buf); if (read < 0) break; @@ -263,7 +263,7 @@ public class Base64 { } private static void decode(InputStream in, OutputStream out) throws IOException { - byte decoded[] = decode(new String(read(in))); + byte decoded[] = decode(DataHelper.getUTF8(read(in))); if (decoded == null) throw new IOException("Invalid base 64 string"); out.write(decoded); diff --git a/core/java/src/net/i2p/data/Certificate.java b/core/java/src/net/i2p/data/Certificate.java index 0f79b9d53c..fdc343a63e 100644 --- a/core/java/src/net/i2p/data/Certificate.java +++ b/core/java/src/net/i2p/data/Certificate.java @@ -262,7 +262,7 @@ public class Certificate extends DataStructureImpl { } else { buf.append(" payload size: ").append(_payload.length); if (getCertificateType() == CERTIFICATE_TYPE_HASHCASH) { - buf.append(" Stamp: ").append(new String(_payload)); + buf.append(" Stamp: ").append(DataHelper.getUTF8(_payload)); } else if (getCertificateType() == CERTIFICATE_TYPE_SIGNED && _payload.length == CERTIFICATE_LENGTH_SIGNED_WITH_HASH) { buf.append(" Signed by hash: ").append(Base64.encode(_payload, Signature.SIGNATURE_BYTES, Hash.HASH_LENGTH)); } else { diff --git a/core/java/src/net/i2p/data/DataHelper.java b/core/java/src/net/i2p/data/DataHelper.java index 750d53edea..f35a6ddb63 100644 --- a/core/java/src/net/i2p/data/DataHelper.java +++ b/core/java/src/net/i2p/data/DataHelper.java @@ -1864,7 +1864,6 @@ public class DataHelper { * * @return null if orig is null * @throws RuntimeException - * @deprecated unused */ public static String getUTF8(byte orig[], int offset, int len) { if (orig == null) return null; diff --git a/core/java/src/net/i2p/data/VerifiedDestination.java b/core/java/src/net/i2p/data/VerifiedDestination.java index dee86800da..1123f64998 100644 --- a/core/java/src/net/i2p/data/VerifiedDestination.java +++ b/core/java/src/net/i2p/data/VerifiedDestination.java @@ -87,7 +87,7 @@ public class VerifiedDestination extends Destination { * zeros and see if it meets our minimum effort. */ protected boolean verifyHashCashCert() { - String hcs = new String(_certificate.getPayload()); + String hcs = DataHelper.getUTF8(_certificate.getPayload()); int end1 = 0; for (int i = 0; i < 3; i++) { end1 = 1 + hcs.indexOf(':', end1); diff --git a/core/java/src/net/i2p/util/LogRecordFormatter.java b/core/java/src/net/i2p/util/LogRecordFormatter.java index d46a6ec766..4f367defe9 100644 --- a/core/java/src/net/i2p/util/LogRecordFormatter.java +++ b/core/java/src/net/i2p/util/LogRecordFormatter.java @@ -9,12 +9,13 @@ package net.i2p.util; * */ -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; +import java.io.StringWriter; import java.util.Date; import net.i2p.I2PAppContext; +import net.i2p.data.DataHelper; /** * Render a log record according to the log manager's settings @@ -71,16 +72,11 @@ class LogRecordFormatter { } buf.append(NL); if (rec.getThrowable() != null) { - ByteArrayOutputStream baos = new ByteArrayOutputStream(512); - PrintWriter pw = new PrintWriter(baos, true); + StringWriter sw = new StringWriter(512); + PrintWriter pw = new PrintWriter(sw, true); rec.getThrowable().printStackTrace(pw); - try { - pw.flush(); - baos.flush(); - } catch (IOException ioe) { // nop - } - byte tb[] = baos.toByteArray(); - buf.append(new String(tb)); + sw.flush(); + buf.append(sw.toString()); } return buf.toString(); } diff --git a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java index 3830db6d40..d930cac9bf 100644 --- a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java +++ b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java @@ -572,7 +572,7 @@ public class Reseeder { System.err.println("Reseed got no router infos from " + seedURL); return 0; } - String content = new String(contentRaw); + String content = DataHelper.getUTF8(contentRaw); // This isn't really URLs, but Base64 hashes // but they may include % encoding Set urls = new HashSet(1024); diff --git a/router/java/src/net/i2p/router/time/NtpMessage.java b/router/java/src/net/i2p/router/time/NtpMessage.java index a2d530e7ce..ea02cce5f8 100644 --- a/router/java/src/net/i2p/router/time/NtpMessage.java +++ b/router/java/src/net/i2p/router/time/NtpMessage.java @@ -442,7 +442,13 @@ class NtpMessage { // or stratum-1 (primary) servers, this is a four-character ASCII // string, left justified and zero padded to 32 bits. if(stratum==0 || stratum==1) { - return new String(ref); + StringBuilder buf = new StringBuilder(4); + for (int i = 0; i < 4; i++) { + if (ref[i] == 0) + break; + buf.append((char) (ref[i] & 0xff)); + } + return buf.toString(); } // In NTP Version 3 secondary servers, this is the 32-bit IPv4