diff --git a/lib/jekyll/site.rb b/lib/jekyll/site.rb index b4b40442..b9a82ef2 100644 --- a/lib/jekyll/site.rb +++ b/lib/jekyll/site.rb @@ -159,7 +159,7 @@ module Jekyll if File.directory?(f_abs) next if self.dest.sub(/\/$/, '') == f_abs read_directories(f_rel) - elsif !File.symlink?(f_abs) + else first3 = File.open(f_abs) { |fd| fd.read(3) } if first3 == "---" # file appears to have a YAML header so process it as a page diff --git a/test/source/symlink-test/symlinked-dir b/test/source/symlink-test/symlinked-dir new file mode 120000 index 00000000..d2d7c52c --- /dev/null +++ b/test/source/symlink-test/symlinked-dir @@ -0,0 +1 @@ +../css \ No newline at end of file diff --git a/test/source/symlink-test/symlinked-file b/test/source/symlink-test/symlinked-file new file mode 120000 index 00000000..79c5d6f0 --- /dev/null +++ b/test/source/symlink-test/symlinked-file @@ -0,0 +1 @@ +../index.html \ No newline at end of file diff --git a/test/test_site.rb b/test/test_site.rb index 6934596f..42643b13 100644 --- a/test/test_site.rb +++ b/test/test_site.rb @@ -217,6 +217,28 @@ class TestSite < Test::Unit::TestCase assert_equal files, @site.filter_entries(files) end + should "not include symlinks in safe mode" do + stub(Jekyll).configuration do + Jekyll::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'safe' => true}) + end + site = Site.new(Jekyll.configuration) + + site.read_directories("symlink-test") + assert_equal [], site.pages + assert_equal [], site.static_files + end + + should "include symlinks in unsafe mode" do + stub(Jekyll).configuration do + Jekyll::DEFAULTS.merge({'source' => source_dir, 'destination' => dest_dir, 'safe' => false}) + end + site = Site.new(Jekyll.configuration) + + site.read_directories("symlink-test") + assert_not_equal [], site.pages + assert_not_equal [], site.static_files + end + context 'error handling' do should "raise if destination is included in source" do stub(Jekyll).configuration do