mirror of
https://github.com/go-gitea/gitea
synced 2025-07-22 18:28:37 +00:00
Substitute variables in path names of template repos too (#25294)
### Summary Extend the template variable substitution to replace file paths. This can be helpful for setting up log files & directories that should match the repository name. ### PR Changes - Move files matching glob pattern when setting up repos from template - For security, added ~escaping~ sanitization for cross-platform support and to prevent directory traversal (thanks @silverwind for the reference) - Added unit testing for escaping function - Fixed the integration tests for repo template generation by passing the repo_template_id - Updated the integration testfiles to add some variable substitution & assert the outputs I had to fix the existing repo template integration test and extend it to add a check for variable substitutions. Example: 
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
x<01><>AJ<41>0<10>a<EFBFBD>9<EFBFBD>\@Ij2<6A><32>C<EFBFBD>w<>"<22><>h<EFBFBD>i<EFBFBD><69><08>q<DEB7><71><EFBFBD>~<7E>{_<0C> <1F><10><><EFBFBD>+c<>)M<><4D><EFBFBD>*rȉSD&<26><>M<EFBFBD><4D>*<2A>l<06>pm*<2A><04>5fE_<45>P<EFBFBD>8<EFBFBD><38><EFBFBD>D<EFBFBD>QC<51>ɕa<1F>o?<3F><>+\><3E><><EFBFBD>f۸<66><DBB8><EFBFBD><EFBFBD>O<EFBFBD><4F>HH9G"x<><78>{w<><77>;<3B><>8
|
||||
i<EFBFBD>s<EFBFBD><EFBFBD><1A><><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD>9<>/<2F>
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +1 @@
|
||||
aacbdfe9e1c4b47f60abe81849045fa4e96f1d75
|
||||
2a83b349fa234131fc5db6f2a0498d3f4d3d6038
|
||||
|
@@ -7,16 +7,18 @@ import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"code.gitea.io/gitea/models/unittest"
|
||||
user_model "code.gitea.io/gitea/models/user"
|
||||
"code.gitea.io/gitea/modules/setting"
|
||||
"code.gitea.io/gitea/tests"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func testRepoGenerate(t *testing.T, session *TestSession, templateOwnerName, templateRepoName, generateOwnerName, generateRepoName string) *httptest.ResponseRecorder {
|
||||
func testRepoGenerate(t *testing.T, session *TestSession, templateID, templateOwnerName, templateRepoName, generateOwnerName, generateRepoName string) *httptest.ResponseRecorder {
|
||||
generateOwner := unittest.AssertExistsAndLoadBean(t, &user_model.User{Name: generateOwnerName})
|
||||
|
||||
// Step0: check the existence of the generated repo
|
||||
@@ -41,16 +43,38 @@ func testRepoGenerate(t *testing.T, session *TestSession, templateOwnerName, tem
|
||||
_, exists = htmlDoc.doc.Find(fmt.Sprintf(".owner.dropdown .item[data-value=\"%d\"]", generateOwner.ID)).Attr("data-value")
|
||||
assert.True(t, exists, fmt.Sprintf("Generate owner '%s' is not present in select box", generateOwnerName))
|
||||
req = NewRequestWithValues(t, "POST", link, map[string]string{
|
||||
"_csrf": htmlDoc.GetCSRF(),
|
||||
"uid": fmt.Sprintf("%d", generateOwner.ID),
|
||||
"repo_name": generateRepoName,
|
||||
"git_content": "true",
|
||||
"_csrf": htmlDoc.GetCSRF(),
|
||||
"uid": fmt.Sprintf("%d", generateOwner.ID),
|
||||
"repo_name": generateRepoName,
|
||||
"repo_template": templateID,
|
||||
"git_content": "true",
|
||||
})
|
||||
session.MakeRequest(t, req, http.StatusSeeOther)
|
||||
|
||||
// Step4: check the existence of the generated repo
|
||||
req = NewRequestf(t, "GET", "/%s/%s", generateOwnerName, generateRepoName)
|
||||
session.MakeRequest(t, req, http.StatusOK)
|
||||
|
||||
// Step5: check substituted values in Readme
|
||||
req = NewRequestf(t, "GET", "/%s/%s/raw/branch/master/README.md", generateOwnerName, generateRepoName)
|
||||
resp = session.MakeRequest(t, req, http.StatusOK)
|
||||
body := fmt.Sprintf(`# %s Readme
|
||||
Owner: %s
|
||||
Link: /%s/%s
|
||||
Clone URL: %s%s/%s.git`,
|
||||
generateRepoName,
|
||||
strings.ToUpper(generateOwnerName),
|
||||
generateOwnerName,
|
||||
generateRepoName,
|
||||
setting.AppURL,
|
||||
generateOwnerName,
|
||||
generateRepoName)
|
||||
assert.Equal(t, body, resp.Body.String())
|
||||
|
||||
// Step6: check substituted values in substituted file path ${REPO_NAME}
|
||||
req = NewRequestf(t, "GET", "/%s/%s/raw/branch/master/%s.log", generateOwnerName, generateRepoName, generateRepoName)
|
||||
resp = session.MakeRequest(t, req, http.StatusOK)
|
||||
assert.Equal(t, generateRepoName, resp.Body.String())
|
||||
|
||||
return resp
|
||||
}
|
||||
@@ -58,11 +82,11 @@ func testRepoGenerate(t *testing.T, session *TestSession, templateOwnerName, tem
|
||||
func TestRepoGenerate(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
session := loginUser(t, "user1")
|
||||
testRepoGenerate(t, session, "user27", "template1", "user1", "generated1")
|
||||
testRepoGenerate(t, session, "44", "user27", "template1", "user1", "generated1")
|
||||
}
|
||||
|
||||
func TestRepoGenerateToOrg(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
session := loginUser(t, "user2")
|
||||
testRepoGenerate(t, session, "user27", "template1", "user2", "generated2")
|
||||
testRepoGenerate(t, session, "44", "user27", "template1", "user2", "generated2")
|
||||
}
|
||||
|
Reference in New Issue
Block a user