diff --git a/core/src/main/java/com/muwire/core/Constants.java b/core/src/main/java/com/muwire/core/Constants.java index 5e92f6ef..4c1ce2ad 100644 --- a/core/src/main/java/com/muwire/core/Constants.java +++ b/core/src/main/java/com/muwire/core/Constants.java @@ -4,6 +4,7 @@ import net.i2p.crypto.SigType; public class Constants { public static final byte PERSONA_VERSION = (byte)1; + public static final String INVALID_NICKNAME_CHARS = "'\"();<>=@$%"; public static final byte FILE_CERT_VERSION = (byte)2; public static final int CHAT_VERSION = 1; diff --git a/core/src/main/java/com/muwire/core/InvalidNicknameException.java b/core/src/main/java/com/muwire/core/InvalidNicknameException.java new file mode 100644 index 00000000..d1c275fc --- /dev/null +++ b/core/src/main/java/com/muwire/core/InvalidNicknameException.java @@ -0,0 +1,25 @@ +package com.muwire.core; + +public class InvalidNicknameException extends Exception { + + public InvalidNicknameException() { + } + + public InvalidNicknameException(String message) { + super(message); + } + + public InvalidNicknameException(Throwable cause) { + super(cause); + } + + public InvalidNicknameException(String message, Throwable cause) { + super(message, cause); + } + + public InvalidNicknameException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + +} diff --git a/core/src/main/java/com/muwire/core/Persona.java b/core/src/main/java/com/muwire/core/Persona.java index 54d9bdb2..03a5f5a9 100644 --- a/core/src/main/java/com/muwire/core/Persona.java +++ b/core/src/main/java/com/muwire/core/Persona.java @@ -7,6 +7,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import com.muwire.core.util.DataUtil; + import net.i2p.crypto.DSAEngine; import net.i2p.data.Base64; import net.i2p.data.DataFormatException; @@ -25,12 +27,15 @@ public class Persona { private volatile String base64; private volatile byte[] payload; - public Persona(InputStream personaStream) throws IOException, DataFormatException, InvalidSignatureException { + public Persona(InputStream personaStream) throws IOException, DataFormatException, InvalidSignatureException, InvalidNicknameException { version = (byte) (personaStream.read() & 0xFF); if (version != Constants.PERSONA_VERSION) throw new IOException("Unknown version "+version); name = new Name(personaStream); + if (!DataUtil.isValidName(name.name)) + throw new InvalidNicknameException(name.name + " is not a valid nickname"); + destination = Destination.create(personaStream); sig = new byte[SIG_LEN]; DataInputStream dis = new DataInputStream(personaStream); @@ -38,7 +43,7 @@ public class Persona { if (!verify(version, name, destination, sig)) throw new InvalidSignatureException(getHumanReadableName() + " didn't verify"); } - + private static boolean verify(byte version, Name name, Destination destination, byte [] sig) throws IOException, DataFormatException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); diff --git a/core/src/main/java/com/muwire/core/util/DataUtil.java b/core/src/main/java/com/muwire/core/util/DataUtil.java index 9371d697..bdd2a77b 100644 --- a/core/src/main/java/com/muwire/core/util/DataUtil.java +++ b/core/src/main/java/com/muwire/core/util/DataUtil.java @@ -216,4 +216,11 @@ public class DataUtil { Signature sig = DSAEngine.getInstance().sign(payload, spk); return sig.getData(); } + + public static boolean isValidName(String name) { + for (int i = 0; i < Constants.INVALID_NICKNAME_CHARS.length(); i++) + if (name.indexOf(Constants.INVALID_NICKNAME_CHARS.charAt(i)) >= 0) + return false; + return true; + } } diff --git a/gui/griffon-app/lifecycle/Ready.groovy b/gui/griffon-app/lifecycle/Ready.groovy index 311cdbfb..90130fa8 100644 --- a/gui/griffon-app/lifecycle/Ready.groovy +++ b/gui/griffon-app/lifecycle/Ready.groovy @@ -6,10 +6,12 @@ import net.i2p.util.SystemVersion import org.codehaus.griffon.runtime.core.AbstractLifecycleHandler +import com.muwire.core.Constants import com.muwire.core.Core import com.muwire.core.MuWireSettings import com.muwire.core.UILoadedEvent import com.muwire.core.files.FileSharedEvent +import com.muwire.core.util.DataUtil import javax.annotation.Nonnull import javax.inject.Inject @@ -116,8 +118,8 @@ class Ready extends AbstractLifecycleHandler { JOptionPane.WARNING_MESSAGE) continue } - if (nickname.contains("@")) { - JOptionPane.showMessageDialog(null, "Nickname cannot contain @, choose another", + if (!DataUtil.isValidName(nickname)) { + JOptionPane.showMessageDialog(null, "Nickname cannot contain any of ${Constants.INVALID_NICKNAME_CHARS} choose another", "Select another nickname", JOptionPane.WARNING_MESSAGE) continue }