summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/puppet/parser/scope.rb4
-rwxr-xr-xtest/language/scope.rb17
2 files changed, 21 insertions, 0 deletions
diff --git a/lib/puppet/parser/scope.rb b/lib/puppet/parser/scope.rb
index 27de8ffd8..7239feb17 100644
--- a/lib/puppet/parser/scope.rb
+++ b/lib/puppet/parser/scope.rb
@@ -631,6 +631,10 @@ module Puppet::Parser
# hash. We store the object ID, not class name, so that we
# can support multiple unrelated classes with the same name.
def setclass(id, name)
+ unless name =~ /^[a-z]\w*$/
+ raise Puppet::ParseError, "Invalid class name '%s'" % name
+ end
+
if self.topscope?
@classtable[id] = name
else
diff --git a/test/language/scope.rb b/test/language/scope.rb
index 06d244543..48689cd2e 100755
--- a/test/language/scope.rb
+++ b/test/language/scope.rb
@@ -546,4 +546,21 @@ class TestScope < Test::Unit::TestCase
assert_equal("root", obj["owner"], "Owner did not take")
assert_equal("755", obj["mode"], "Mode did not take")
end
+
+ def test_validclassnames
+ scope = Puppet::Parser::Scope.new()
+
+ ["a-class", "a class", "Class", "a.class"].each do |bad|
+ assert_raise(Puppet::ParseError, "Incorrectly allowed %s" % bad.inspect) do
+ scope.setclass(object_id, bad)
+ end
+ end
+
+ ["a_class", "class", "yayNess"].each do |good|
+ assert_nothing_raised("Incorrectly banned %s" % good.inspect) do
+ scope.setclass(object_id, good)
+ end
+ end
+
+ end
end