script/fmt now runs golines -m 77 after gofmt, repeating golines until it changes nothing, since one pass can leave a line the next splits. script/fmt-check fails when either would change a file. script/bootstrap installs golines v0.13.0 with go install, pinned to its commit, and checks the installed version with go version -m. The tree is reformatted. The longer lines this makes are fixed by hand: nolint directives moved onto their own line above the statement, one string split, and 20 functions over funlen's 80 lines shortened or split, RunWAF and limitPercentages among them. Model: opus-5-5
This commit was merged in pull request #363.
This commit is contained in:
1 parent
63e58e326b
commit
0b23352767
118 files changed
+9447
-2670
No files matched your search
@@ -107,7 +107,12 @@ var nextcloudBodies = []nextcloudBody{
|
||||
http.MethodPut, nextcloudUsers + "/admin",
|
||||
jsonBody, `{"key":"headline","value":"%s"}`,
|
||||
},
|
||||
{http.MethodPost, "/ocs/v2.php/cloud/groups", jsonBody, `{"groupid":"%s"}`},
|
||||
{
|
||||
http.MethodPost,
|
||||
"/ocs/v2.php/cloud/groups",
|
||||
jsonBody,
|
||||
`{"groupid":"%s"}`,
|
||||
},
|
||||
{http.MethodPost, nextcloudShares, jsonBody, `{"path":"/%s"}`},
|
||||
{http.MethodPost, nextcloudShares, jsonBody, `{"shareWith":"%s"}`},
|
||||
{http.MethodPut, nextcloudShares + "/1", jsonBody, `{"label":"%s"}`},
|
||||
@@ -115,17 +120,42 @@ var nextcloudBodies = []nextcloudBody{
|
||||
http.MethodPost, "/apps/theming/ajax/updateStylesheet",
|
||||
jsonBody, `{"setting":"slogan","value":"%s"}`,
|
||||
},
|
||||
{http.MethodPost, nextcloudSave, jsonBody, `{"filePath":"/%s/Readme.md"}`},
|
||||
{http.MethodPost, "/remote.php/dav/systemtags/", jsonBody, `{"name":"%s"}`},
|
||||
{
|
||||
http.MethodPost,
|
||||
nextcloudSave,
|
||||
jsonBody,
|
||||
`{"filePath":"/%s/Readme.md"}`,
|
||||
},
|
||||
{
|
||||
http.MethodPost,
|
||||
"/remote.php/dav/systemtags/",
|
||||
jsonBody,
|
||||
`{"name":"%s"}`,
|
||||
},
|
||||
{
|
||||
nextcloudSearch, "/remote.php/dav/", xmlBody,
|
||||
`<d:searchrequest xmlns:d="DAV:"><d:basicsearch><d:where><d:like>` +
|
||||
`<d:prop><d:displayname/></d:prop><d:literal>%%s%</d:literal>` +
|
||||
`</d:like></d:where></d:basicsearch></d:searchrequest>`,
|
||||
},
|
||||
{nextcloudMkcol, nextcloudCalendars + "work", xmlBody, nextcloudNewCollection},
|
||||
{nextcloudMkcol, nextcloudAddressBooks + "team", xmlBody, nextcloudNewCollection},
|
||||
{nextcloudMkcalendar, nextcloudCalendars + "work/", xmlBody, nextcloudNewCalendar},
|
||||
{
|
||||
nextcloudMkcol,
|
||||
nextcloudCalendars + "work",
|
||||
xmlBody,
|
||||
nextcloudNewCollection,
|
||||
},
|
||||
{
|
||||
nextcloudMkcol,
|
||||
nextcloudAddressBooks + "team",
|
||||
xmlBody,
|
||||
nextcloudNewCollection,
|
||||
},
|
||||
{
|
||||
nextcloudMkcalendar,
|
||||
nextcloudCalendars + "work/",
|
||||
xmlBody,
|
||||
nextcloudNewCalendar,
|
||||
},
|
||||
}
|
||||
|
||||
// The WebDAV methods that make a calendar or an address book.
|
||||
@@ -187,7 +217,12 @@ var nextcloudDocument = nextcloudBody{
|
||||
//nolint:gochecknoglobals // a constant cannot be a list
|
||||
var nextcloudTexts = []nextcloudBody{
|
||||
nextcloudDocument,
|
||||
{http.MethodPost, "/remote.php/dav/comments/files/1", jsonBody, `{"message":"%s"}`},
|
||||
{
|
||||
http.MethodPost,
|
||||
"/remote.php/dav/comments/files/1",
|
||||
jsonBody,
|
||||
`{"message":"%s"}`,
|
||||
},
|
||||
{
|
||||
nextcloudPropPatch, "/remote.php/dav/comments/files/1/2", xmlBody,
|
||||
`<d:propertyupdate xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns">` +
|
||||
@@ -195,7 +230,12 @@ var nextcloudTexts = []nextcloudBody{
|
||||
`</d:propertyupdate>`,
|
||||
},
|
||||
{http.MethodPut, nextcloudShares + "/1", jsonBody, `{"note":"%s"}`},
|
||||
{http.MethodPost, nextcloudShares, jsonBody, `{"path":"/Notes","note":"%s"}`},
|
||||
{
|
||||
http.MethodPost,
|
||||
nextcloudShares,
|
||||
jsonBody,
|
||||
`{"path":"/Notes","note":"%s"}`,
|
||||
},
|
||||
{
|
||||
http.MethodPut, "/ocs/v1.php/apps/files_sharing/api/v1/shares/1",
|
||||
formData, "note=%s",
|
||||
@@ -223,7 +263,10 @@ const nextcloudCodeBlock = "```bash\n#!/bin/bash\nset -e\n" +
|
||||
// nextcloudBodyScore returns the request that sends value, which is not
|
||||
// escaped, in sent's body, and the score crs gives it.
|
||||
func nextcloudBodyScore(
|
||||
t *testing.T, crs *coreruleset.CoreRuleSet, sent nextcloudBody, value string,
|
||||
t *testing.T,
|
||||
crs *coreruleset.CoreRuleSet,
|
||||
sent nextcloudBody,
|
||||
value string,
|
||||
) (string, int) {
|
||||
t.Helper()
|
||||
|
||||
@@ -258,7 +301,11 @@ func nextcloudFieldScores(t *testing.T, value string) map[string]int {
|
||||
scores := map[string]int{}
|
||||
|
||||
for _, target := range nextcloudQueryFields {
|
||||
scores["GET "+target+value] = inspect(t, crs, get(target+value)).Score
|
||||
scores["GET "+target+value] = inspect(
|
||||
t,
|
||||
crs,
|
||||
get(target+value),
|
||||
).Score
|
||||
}
|
||||
|
||||
for _, sent := range nextcloudFormFields {
|
||||
@@ -350,11 +397,23 @@ func TestNextcloudPasswordFieldsPass(t *testing.T) {
|
||||
{"/apps/user_ldap/renewpassword", formData, change},
|
||||
{"/index.php/apps/user_ldap/renewpassword", formData, change},
|
||||
{"/apps/encryption/ajax/updatePrivateKeyPassword", formData, change},
|
||||
{"/index.php/apps/encryption/ajax/updatePrivateKeyPassword", formData, change},
|
||||
{
|
||||
"/index.php/apps/encryption/ajax/updatePrivateKeyPassword",
|
||||
formData,
|
||||
change,
|
||||
},
|
||||
{"/apps/encryption/ajax/changeRecoveryPassword", formData, recovery},
|
||||
{"/index.php/apps/encryption/ajax/changeRecoveryPassword", formData, recovery},
|
||||
{
|
||||
"/index.php/apps/encryption/ajax/changeRecoveryPassword",
|
||||
formData,
|
||||
recovery,
|
||||
},
|
||||
{"/apps/encryption/ajax/adminRecovery", formData, adminRecovery},
|
||||
{"/index.php/apps/encryption/ajax/adminRecovery", formData, adminRecovery},
|
||||
{
|
||||
"/index.php/apps/encryption/ajax/adminRecovery",
|
||||
formData,
|
||||
adminRecovery,
|
||||
},
|
||||
{"/login/confirm", jsonBody, password},
|
||||
{"/index.php/login/confirm", formData, password},
|
||||
{"/lostpassword/set/AbCdEf/alice", jsonBody, password},
|
||||
@@ -409,7 +468,12 @@ func TestNextcloudUserPasswordInValuePasses(t *testing.T) {
|
||||
{jsonRequest, jsonPassword("; cat /etc/passwd")},
|
||||
} {
|
||||
if got, _ := inspectBody(t, crs, sent.r, sent.body); got.Score >= threshold {
|
||||
t.Errorf("%s %.40s refused: %+v", sent.r.headers[0], sent.body, got)
|
||||
t.Errorf(
|
||||
"%s %.40s refused: %+v",
|
||||
sent.r.headers[0],
|
||||
sent.body,
|
||||
got,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -424,7 +488,12 @@ func TestNextcloudUserPasswordInValuePasses(t *testing.T) {
|
||||
{jsonRequest, `{"key":"email","value":"' OR '1'='1"}`},
|
||||
} {
|
||||
if got, _ := inspectBody(t, crs, sent.r, sent.body); got.Score < threshold {
|
||||
t.Errorf("%s %.40s let through: %+v", sent.r.headers[0], sent.body, got)
|
||||
t.Errorf(
|
||||
"%s %.40s let through: %+v",
|
||||
sent.r.headers[0],
|
||||
sent.body,
|
||||
got,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -452,7 +521,12 @@ func TestNextcloudSentencesPassInTheTexts(t *testing.T) {
|
||||
|
||||
document := "Backup steps:\n\n" + nextcloudCodeBlock
|
||||
|
||||
request, score := nextcloudBodyScore(t, readingBodies(t), nextcloudDocument, document)
|
||||
request, score := nextcloudBodyScore(
|
||||
t,
|
||||
readingBodies(t),
|
||||
nextcloudDocument,
|
||||
document,
|
||||
)
|
||||
if score >= nextcloudThreshold {
|
||||
t.Errorf("%s refused: %d", request, score)
|
||||
}
|
||||
@@ -499,7 +573,10 @@ func TestNextcloudAccountCookieSkipsTheFourRules(t *testing.T) {
|
||||
crs := atDefaults(t)
|
||||
|
||||
cookie := func(value string) request {
|
||||
return get("/apps/files/", "Cookie: nc_sameSiteCookielax=true; nc_username="+value)
|
||||
return get(
|
||||
"/apps/files/",
|
||||
"Cookie: nc_sameSiteCookielax=true; nc_username="+value,
|
||||
)
|
||||
}
|
||||
|
||||
for _, value := range hardValues {
|
||||
@@ -556,20 +633,40 @@ func TestNextcloudWebDAVMethodsAreAllowedOnlyThere(t *testing.T) {
|
||||
|
||||
// MKCALENDAR only where the calendars are.
|
||||
for _, target := range []string{nextcloudCalendars, nextcloudCalendars + "work/"} {
|
||||
wantResult(t, crs, request{nextcloudMkcalendar, target, nil}, matched())
|
||||
wantResult(
|
||||
t,
|
||||
crs,
|
||||
request{nextcloudMkcalendar, target, nil},
|
||||
matched(),
|
||||
)
|
||||
}
|
||||
|
||||
for _, target := range []string{
|
||||
nextcloudFiles, nextcloudAddressBooks, "/remote.php/dav/",
|
||||
"/x/remote.php/dav/calendars/",
|
||||
} {
|
||||
wantResult(t, crs, request{nextcloudMkcalendar, target, nil}, matched(911100))
|
||||
wantResult(
|
||||
t,
|
||||
crs,
|
||||
request{nextcloudMkcalendar, target, nil},
|
||||
matched(911100),
|
||||
)
|
||||
}
|
||||
|
||||
// PROPFIND, and no other WebDAV method, where a client asks for them.
|
||||
for _, target := range []string{"/.well-known/caldav", "/.well-known/carddav"} {
|
||||
wantResult(t, crs, request{nextcloudPropFind, target, nil}, matched())
|
||||
wantResult(t, crs, request{nextcloudMkcol, target, nil}, matched(911100))
|
||||
wantResult(
|
||||
t,
|
||||
crs,
|
||||
request{nextcloudPropFind, target, nil},
|
||||
matched(),
|
||||
)
|
||||
wantResult(
|
||||
t,
|
||||
crs,
|
||||
request{nextcloudMkcol, target, nil},
|
||||
matched(911100),
|
||||
)
|
||||
}
|
||||
|
||||
other := request{nextcloudPropFind, "/.well-known/other", nil}
|
||||
@@ -603,7 +700,12 @@ func TestNextcloudDescriptionsPassAndAttacksAreRefused(t *testing.T) {
|
||||
} {
|
||||
sent := described.sent
|
||||
|
||||
request, score := nextcloudBodyScore(t, crs, sent, described.description)
|
||||
request, score := nextcloudBodyScore(
|
||||
t,
|
||||
crs,
|
||||
sent,
|
||||
described.description,
|
||||
)
|
||||
if score >= nextcloudThreshold {
|
||||
t.Errorf("%s refused: %d", request, score)
|
||||
}
|
||||
@@ -625,7 +727,12 @@ func TestNextcloudDescriptionsPassAndAttacksAreRefused(t *testing.T) {
|
||||
// An MKCOL on the calendars' paths skips only the rules for names.
|
||||
sent.method, sent.target = nextcloudMkcol, nextcloudCalendars+"work/"
|
||||
|
||||
request, score = nextcloudBodyScore(t, crs, sent, described.description)
|
||||
request, score = nextcloudBodyScore(
|
||||
t,
|
||||
crs,
|
||||
sent,
|
||||
described.description,
|
||||
)
|
||||
if score < nextcloudThreshold {
|
||||
t.Errorf("%s let through: %d", request, score)
|
||||
}
|
||||
@@ -661,7 +768,10 @@ func TestNextcloudChangedEventsAndContactsPass(t *testing.T) {
|
||||
[]string{"Content-Type: text/plain; charset=UTF-8; charset=UTF-8"},
|
||||
},
|
||||
} {
|
||||
if got := inspect(t, crs, refused); !slices.Contains(got.RuleIDs, 920530) {
|
||||
if got := inspect(t, crs, refused); !slices.Contains(
|
||||
got.RuleIDs,
|
||||
920530,
|
||||
) {
|
||||
t.Errorf("%s %s %q let through: %+v",
|
||||
refused.method, refused.target, refused.headers, got)
|
||||
}
|
||||
@@ -702,7 +812,12 @@ func TestNextcloudUploadsAreNotReadAsFields(t *testing.T) {
|
||||
} {
|
||||
got, _ := inspectBody(t, crs, refused, upload.body)
|
||||
if got.Score < nextcloudThreshold {
|
||||
t.Errorf("%s %s let through: %+v", refused.method, refused.target, got)
|
||||
t.Errorf(
|
||||
"%s %s let through: %+v",
|
||||
refused.method,
|
||||
refused.target,
|
||||
got,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -713,7 +828,13 @@ func TestNextcloudPathTraversalIsRefusedInWebDAVPaths(t *testing.T) {
|
||||
|
||||
crs := atDefaults(t)
|
||||
|
||||
methods := []string{http.MethodGet, http.MethodPut, nextcloudPropFind, "MOVE", "LOCK"}
|
||||
methods := []string{
|
||||
http.MethodGet,
|
||||
http.MethodPut,
|
||||
nextcloudPropFind,
|
||||
"MOVE",
|
||||
"LOCK",
|
||||
}
|
||||
|
||||
for _, method := range methods {
|
||||
for _, target := range []string{
|
||||
@@ -801,7 +922,13 @@ func TestNextcloudExclusionsAreNarrow(t *testing.T) {
|
||||
|
||||
got, _ := inspectBody(t, crs, r, sent.body)
|
||||
if got.Score < nextcloudThreshold {
|
||||
t.Errorf("%s %s %s let through: %+v", sent.method, sent.target, sent.body, got)
|
||||
t.Errorf(
|
||||
"%s %s %s let through: %+v",
|
||||
sent.method,
|
||||
sent.target,
|
||||
sent.body,
|
||||
got,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user