From df02ca73fb04fedfcdb81ade26ffff2cfd5d93c4 Mon Sep 17 00:00:00 2001 From: Roland Date: Thu, 29 Dec 2011 17:32:35 +0100 Subject: [PATCH] check validity of path elements (actor names), see #1567 --- .../scala/akka/actor/LocalActorRefProviderSpec.scala | 9 +++++++++ akka-actor/src/main/scala/akka/actor/ActorCell.scala | 9 +++++++-- akka-actor/src/main/scala/akka/actor/ActorPath.scala | 2 ++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala b/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala index 2414a173cf..629fb814c4 100644 --- a/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala +++ b/akka-actor-tests/src/test/scala/akka/actor/LocalActorRefProviderSpec.scala @@ -54,5 +54,14 @@ class LocalActorRefProviderSpec extends AkkaSpec { } } + "throw suitable exceptions for malformed actor names" in { + intercept[InvalidActorNameException](system.actorOf(Props.empty, null)).getMessage.contains("null") must be(true) + intercept[InvalidActorNameException](system.actorOf(Props.empty, "")).getMessage.contains("empty") must be(true) + intercept[InvalidActorNameException](system.actorOf(Props.empty, "$hallo")).getMessage.contains("conform") must be(true) + intercept[InvalidActorNameException](system.actorOf(Props.empty, "a%")).getMessage.contains("conform") must be(true) + intercept[InvalidActorNameException](system.actorOf(Props.empty, "a?")).getMessage.contains("conform") must be(true) + intercept[InvalidActorNameException](system.actorOf(Props.empty, "üß")).getMessage.contains("conform") must be(true) + } + } } diff --git a/akka-actor/src/main/scala/akka/actor/ActorCell.scala b/akka-actor/src/main/scala/akka/actor/ActorCell.scala index 6a532136b4..f213afd987 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorCell.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorCell.scala @@ -222,8 +222,13 @@ private[akka] class ActorCell( def actorOf(props: Props): ActorRef = _actorOf(props, randomName()) def actorOf(props: Props, name: String): ActorRef = { - if (name == null || name == "" || name.charAt(0) == '$') - throw new InvalidActorNameException("actor name must not be null, empty or start with $") + import ActorPath.ElementRegex + name match { + case null ⇒ throw new InvalidActorNameException("actor name must not be null") + case "" ⇒ throw new InvalidActorNameException("actor name must not be empty") + case ElementRegex() ⇒ // this is fine + case _ ⇒ throw new InvalidActorNameException("illegal actor name '" + name + "', must conform to " + ElementRegex) + } if (childrenRefs contains name) throw new InvalidActorNameException("actor name " + name + " is not unique!") _actorOf(props, name) diff --git a/akka-actor/src/main/scala/akka/actor/ActorPath.scala b/akka-actor/src/main/scala/akka/actor/ActorPath.scala index 399011fd7a..1bd6c9fa98 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorPath.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorPath.scala @@ -15,6 +15,8 @@ object ActorPath { } rec(s.length, Nil) } + + val ElementRegex = """[-\w:@&=+,.!~*'_;][-\w:@&=+,.!~*'$_;]*""".r } /**