forked from forgejo/forgejo
[GITEA] Optionally allow anyone to edit Wikis
This is largely based on gitea#6312 by @ashimokawa, with updates and
fixes by myself, and incorporates the review feedback given in that pull
request, and more.
What this patch does is add a new "default_permissions" column to the
`repo_units` table (defaulting to read permission), adjusts the
permission checking code to take this into consideration, and then
exposes a setting that lets a repo administrator enable any user on a
Forgejo instance to edit the repo's wiki (effectively giving the wiki
unit of the repo "write" permissions by default).
By default, wikis will remain restricted to collaborators, but with the
new setting exposed, they can be turned into globally editable wikis.
Fixes Codeberg/Community#28.
Signed-off-by: Gergely Nagy <forgejo@gergo.csillger.hu>
(cherry picked from commit 4b74439922
)
This commit is contained in:
parent
874ef1978d
commit
337cf62c10
10 changed files with 164 additions and 10 deletions
|
@ -4,12 +4,16 @@
|
|||
package integration
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"testing"
|
||||
|
||||
auth_model "code.gitea.io/gitea/models/auth"
|
||||
repo_model "code.gitea.io/gitea/models/repo"
|
||||
unit_model "code.gitea.io/gitea/models/unit"
|
||||
"code.gitea.io/gitea/models/unittest"
|
||||
api "code.gitea.io/gitea/modules/structs"
|
||||
"code.gitea.io/gitea/tests"
|
||||
|
||||
|
@ -209,6 +213,53 @@ func TestAPIEditWikiPage(t *testing.T) {
|
|||
MakeRequest(t, req, http.StatusOK)
|
||||
}
|
||||
|
||||
func TestAPIEditOtherWikiPage(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
|
||||
// (drive-by-user) user, session, and token for a drive-by wiki editor
|
||||
username := "drive-by-user"
|
||||
req := NewRequestWithValues(t, "POST", "/user/sign_up", map[string]string{
|
||||
"user_name": username,
|
||||
"email": "drive-by@example.com",
|
||||
"password": "examplePassword!1",
|
||||
"retype": "examplePassword!1",
|
||||
})
|
||||
MakeRequest(t, req, http.StatusSeeOther)
|
||||
session := loginUserWithPassword(t, username, "examplePassword!1")
|
||||
token := getTokenForLoggedInUser(t, session, auth_model.AccessTokenScopeWriteRepository)
|
||||
|
||||
// (user2) user for the user whose wiki we're going to edit (as drive-by-user)
|
||||
otherUsername := "user2"
|
||||
|
||||
// Creating a new Wiki page on user2's repo as user1 fails
|
||||
testCreateWiki := func(expectedStatusCode int) {
|
||||
urlStr := fmt.Sprintf("/api/v1/repos/%s/%s/wiki/new?token=%s", otherUsername, "repo1", token)
|
||||
req := NewRequestWithJSON(t, "POST", urlStr, &api.CreateWikiPageOptions{
|
||||
Title: "Globally Edited Page",
|
||||
ContentBase64: base64.StdEncoding.EncodeToString([]byte("Wiki page content for API unit tests")),
|
||||
Message: "",
|
||||
})
|
||||
session.MakeRequest(t, req, expectedStatusCode)
|
||||
}
|
||||
testCreateWiki(http.StatusForbidden)
|
||||
|
||||
// Update the repo settings for user2's repo to enable globally writeable wiki
|
||||
ctx := context.Background()
|
||||
repo := unittest.AssertExistsAndLoadBean(t, &repo_model.Repository{ID: 1})
|
||||
var units []repo_model.RepoUnit
|
||||
units = append(units, repo_model.RepoUnit{
|
||||
RepoID: repo.ID,
|
||||
Type: unit_model.TypeWiki,
|
||||
Config: new(repo_model.UnitConfig),
|
||||
DefaultPermissions: repo_model.UnitAccessModeWrite,
|
||||
})
|
||||
err := repo_model.UpdateRepositoryUnits(ctx, repo, units, nil)
|
||||
assert.NoError(t, err)
|
||||
|
||||
// Creating a new Wiki page on user2's repo works now
|
||||
testCreateWiki(http.StatusCreated)
|
||||
}
|
||||
|
||||
func TestAPIListPageRevisions(t *testing.T) {
|
||||
defer tests.PrepareTestEnv(t)()
|
||||
username := "user2"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue