Skip to content

Commit a8e0ca9

Browse files
committed
hugofs: Make sure that non-project module mounts are local paths
Fixes #14069
1 parent 559a029 commit a8e0ca9

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

‎hugofs/hugofs_integration_test.go‎

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// Copyright 2025 The Hugo Authors. All rights reserved.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
// http://www.apache.org/licenses/LICENSE-2.0
7+
//
8+
// Unless required by applicable law or agreed to in writing, software
9+
// distributed under the License is distributed on an "AS IS" BASIS,
10+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11+
// See the License for the specific language governing permissions and
12+
// limitations under the License.
13+
14+
package hugofs_test
15+
16+
import (
17+
"testing"
18+
19+
qt "github.com/frankban/quicktest"
20+
21+
"github.com/gohugoio/hugo/hugolib"
22+
)
23+
24+
func TestMountRestrictTheme(t *testing.T) {
25+
files := `
26+
-- hugo.toml --
27+
disableKinds = ["taxonomy", "term", "rss"]
28+
theme = "mytheme"
29+
[[module.mounts]]
30+
source = '../file2.txt'
31+
target = 'assets/file2.txt'
32+
-- themes/mytheme/hugo.toml --
33+
[[module.mounts]]
34+
source = '../../file1.txt'
35+
target = 'assets/file1.txt'
36+
-- file1.txt --
37+
file1
38+
-- file2.txt --
39+
file2
40+
-- layouts/all.html --
41+
All.
42+
`
43+
b, err := hugolib.TestE(t, files)
44+
b.Assert(err, qt.IsNotNil)
45+
b.Assert(err.Error(), qt.Contains, "mount source must be a local path for modules/themes")
46+
}

‎modules/collect.go‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -710,7 +710,10 @@ func (c *collector) normalizeMounts(owner *moduleAdapter, mounts []Mount) ([]Mou
710710
mnt.Target = filepath.Clean(mnt.Target)
711711
var sourceDir string
712712

713-
if owner.projectMod && filepath.IsAbs(mnt.Source) {
713+
if !owner.projectMod && !filepath.IsLocal(mnt.Source) {
714+
return nil, fmt.Errorf("%s: %q: mount source must be a local path for modules/themes", errMsg, mnt.Source)
715+
}
716+
if filepath.IsAbs(mnt.Source) {
714717
// Abs paths in the main project is allowed.
715718
sourceDir = mnt.Source
716719
} else {

0 commit comments

Comments
 (0)