Server obtain remote from glob config not from context (#540)

This commit is contained in:
6543 2021-11-26 13:01:54 +01:00 committed by GitHub
parent 8b476e7722
commit 5e6b38e0e7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 29 additions and 168 deletions

View file

@ -98,7 +98,7 @@ func run(c *cli.Context) error {
) )
} }
remote_, err := SetupRemote(c) remote_, err := setupRemote(c)
if err != nil { if err != nil {
log.Fatal().Err(err).Msg("") log.Fatal().Err(err).Msg("")
} }
@ -142,7 +142,6 @@ func run(c *cli.Context) error {
middleware.Version, middleware.Version,
middleware.Config(c), middleware.Config(c),
middleware.Store(c, store_), middleware.Store(c, store_),
middleware.Remote(remote_),
) )
var g errgroup.Group var g errgroup.Group
@ -253,6 +252,9 @@ func setupEvilGlobals(c *cli.Context, v store.Store, r remote.Remote) {
server.Config.Storage.Files = v server.Config.Storage.Files = v
server.Config.Storage.Config = v server.Config.Storage.Config = v
// remote
server.Config.Services.Remote = r
// services // services
server.Config.Services.Queue = setupQueue(c, v) server.Config.Services.Queue = setupQueue(c, v)
server.Config.Services.Logs = logging.New() server.Config.Services.Logs = logging.New()

View file

@ -175,8 +175,8 @@ func setupEnvironService(c *cli.Context, s store.Store) model.EnvironService {
return environments.Filesystem(c.StringSlice("environment")) return environments.Filesystem(c.StringSlice("environment"))
} }
// SetupRemote helper function to setup the remote from the CLI arguments. // setupRemote helper function to setup the remote from the CLI arguments.
func SetupRemote(c *cli.Context) (remote.Remote, error) { func setupRemote(c *cli.Context) (remote.Remote, error) {
switch { switch {
case c.Bool("github"): case c.Bool("github"):
return setupGithub(c) return setupGithub(c)

View file

@ -261,7 +261,7 @@ func DeleteBuild(c *gin.Context) {
func PostApproval(c *gin.Context) { func PostApproval(c *gin.Context) {
var ( var (
remote_ = remote.FromContext(c) remote_ = server.Config.Services.Remote
store_ = store.FromContext(c) store_ = store.FromContext(c)
repo = session.Repo(c) repo = session.Repo(c)
user = session.User(c) user = session.User(c)
@ -372,7 +372,7 @@ func PostApproval(c *gin.Context) {
func PostDecline(c *gin.Context) { func PostDecline(c *gin.Context) {
var ( var (
remote_ = remote.FromContext(c) remote_ = server.Config.Services.Remote
store_ = store.FromContext(c) store_ = store.FromContext(c)
repo = session.Repo(c) repo = session.Repo(c)
@ -415,7 +415,7 @@ func GetBuildQueue(c *gin.Context) {
// PostBuild restarts a build // PostBuild restarts a build
func PostBuild(c *gin.Context) { func PostBuild(c *gin.Context) {
remote_ := remote.FromContext(c) remote_ := server.Config.Services.Remote
store_ := store.FromContext(c) store_ := store.FromContext(c)
repo := session.Repo(c) repo := session.Repo(c)

View file

@ -76,7 +76,7 @@ func BlockTilQueueHasRunningItem(c *gin.Context) {
} }
func PostHook(c *gin.Context) { func PostHook(c *gin.Context) {
remote_ := remote.FromContext(c) remote_ := server.Config.Services.Remote
store_ := store.FromContext(c) store_ := store.FromContext(c)
tmpRepo, build, err := remote_.Hook(c.Request) tmpRepo, build, err := remote_.Hook(c.Request)

View file

@ -25,7 +25,6 @@ import (
"github.com/woodpecker-ci/woodpecker/server" "github.com/woodpecker-ci/woodpecker/server"
"github.com/woodpecker-ci/woodpecker/server/model" "github.com/woodpecker-ci/woodpecker/server/model"
"github.com/woodpecker-ci/woodpecker/server/remote"
"github.com/woodpecker-ci/woodpecker/server/store" "github.com/woodpecker-ci/woodpecker/server/store"
"github.com/woodpecker-ci/woodpecker/shared/httputil" "github.com/woodpecker-ci/woodpecker/shared/httputil"
"github.com/woodpecker-ci/woodpecker/shared/token" "github.com/woodpecker-ci/woodpecker/shared/token"
@ -55,7 +54,7 @@ func HandleAuth(c *gin.Context) {
// cannot, however, remember why, so need to revisit this line. // cannot, however, remember why, so need to revisit this line.
c.Writer.Header().Del("Content-Type") c.Writer.Header().Del("Content-Type")
tmpuser, err := remote.Login(c, c.Writer, c.Request) tmpuser, err := server.Config.Services.Remote.Login(c, c.Writer, c.Request)
if err != nil { if err != nil {
log.Error().Msgf("cannot authenticate user. %s", err) log.Error().Msgf("cannot authenticate user. %s", err)
c.Redirect(303, "/login?error=oauth_error") c.Redirect(303, "/login?error=oauth_error")
@ -81,7 +80,7 @@ func HandleAuth(c *gin.Context) {
// if self-registration is enabled for whitelisted organizations we need to // if self-registration is enabled for whitelisted organizations we need to
// check the user's organization membership. // check the user's organization membership.
if len(config.Orgs) != 0 { if len(config.Orgs) != 0 {
teams, terr := remote.Teams(c, tmpuser) teams, terr := server.Config.Services.Remote.Teams(c, tmpuser)
if terr != nil || !config.IsMember(teams) { if terr != nil || !config.IsMember(teams) {
log.Error().Msgf("cannot verify team membership for %s.", u.Login) log.Error().Msgf("cannot verify team membership for %s.", u.Login)
c.Redirect(303, "/login?error=access_denied") c.Redirect(303, "/login?error=access_denied")
@ -118,7 +117,7 @@ func HandleAuth(c *gin.Context) {
// if self-registration is enabled for whitelisted organizations we need to // if self-registration is enabled for whitelisted organizations we need to
// check the user's organization membership. // check the user's organization membership.
if len(config.Orgs) != 0 { if len(config.Orgs) != 0 {
teams, terr := remote.Teams(c, u) teams, terr := server.Config.Services.Remote.Teams(c, u)
if terr != nil || !config.IsMember(teams) { if terr != nil || !config.IsMember(teams) {
log.Error().Msgf("cannot verify team membership for %s.", u.Login) log.Error().Msgf("cannot verify team membership for %s.", u.Login)
c.Redirect(303, "/login?error=access_denied") c.Redirect(303, "/login?error=access_denied")
@ -166,7 +165,7 @@ func GetLoginToken(c *gin.Context) {
return return
} }
login, err := remote.Auth(c, in.Access, in.Refresh) login, err := server.Config.Services.Remote.Auth(c, in.Access, in.Refresh)
if err != nil { if err != nil {
_ = c.AbortWithError(http.StatusUnauthorized, err) _ = c.AbortWithError(http.StatusUnauthorized, err)
return return

View file

@ -26,14 +26,13 @@ import (
"github.com/woodpecker-ci/woodpecker/server" "github.com/woodpecker-ci/woodpecker/server"
"github.com/woodpecker-ci/woodpecker/server/model" "github.com/woodpecker-ci/woodpecker/server/model"
"github.com/woodpecker-ci/woodpecker/server/remote"
"github.com/woodpecker-ci/woodpecker/server/router/middleware/session" "github.com/woodpecker-ci/woodpecker/server/router/middleware/session"
"github.com/woodpecker-ci/woodpecker/server/store" "github.com/woodpecker-ci/woodpecker/server/store"
"github.com/woodpecker-ci/woodpecker/shared/token" "github.com/woodpecker-ci/woodpecker/shared/token"
) )
func PostRepo(c *gin.Context) { func PostRepo(c *gin.Context) {
remote_ := remote.FromContext(c) remote_ := server.Config.Services.Remote
store_ := store.FromContext(c) store_ := store.FromContext(c)
user := session.User(c) user := session.User(c)
repo := session.Repo(c) repo := session.Repo(c)
@ -177,7 +176,7 @@ func GetRepoPermissions(c *gin.Context) {
func GetRepoBranches(c *gin.Context) { func GetRepoBranches(c *gin.Context) {
repo := session.Repo(c) repo := session.Repo(c)
user := session.User(c) user := session.User(c)
r := remote.FromContext(c) r := server.Config.Services.Remote
branches, err := r.Branches(c, user, repo) branches, err := r.Branches(c, user, repo)
if err != nil { if err != nil {
@ -190,7 +189,7 @@ func GetRepoBranches(c *gin.Context) {
func DeleteRepo(c *gin.Context) { func DeleteRepo(c *gin.Context) {
remove, _ := strconv.ParseBool(c.Query("remove")) remove, _ := strconv.ParseBool(c.Query("remove"))
remote_ := remote.FromContext(c) remote_ := server.Config.Services.Remote
store_ := store.FromContext(c) store_ := store.FromContext(c)
repo := session.Repo(c) repo := session.Repo(c)
@ -221,7 +220,7 @@ func DeleteRepo(c *gin.Context) {
} }
func RepairRepo(c *gin.Context) { func RepairRepo(c *gin.Context) {
remote_ := remote.FromContext(c) remote_ := server.Config.Services.Remote
store_ := store.FromContext(c) store_ := store.FromContext(c)
repo := session.Repo(c) repo := session.Repo(c)
user := session.User(c) user := session.User(c)
@ -275,7 +274,7 @@ func RepairRepo(c *gin.Context) {
} }
func MoveRepo(c *gin.Context) { func MoveRepo(c *gin.Context) {
remote_ := remote.FromContext(c) remote_ := server.Config.Services.Remote
store_ := store.FromContext(c) store_ := store.FromContext(c)
repo := session.Repo(c) repo := session.Repo(c)
user := session.User(c) user := session.User(c)

View file

@ -24,8 +24,8 @@ import (
"github.com/gorilla/securecookie" "github.com/gorilla/securecookie"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/woodpecker-ci/woodpecker/server"
"github.com/woodpecker-ci/woodpecker/server/model" "github.com/woodpecker-ci/woodpecker/server/model"
"github.com/woodpecker-ci/woodpecker/server/remote"
"github.com/woodpecker-ci/woodpecker/server/router/middleware/session" "github.com/woodpecker-ci/woodpecker/server/router/middleware/session"
"github.com/woodpecker-ci/woodpecker/server/shared" "github.com/woodpecker-ci/woodpecker/server/shared"
"github.com/woodpecker-ci/woodpecker/server/store" "github.com/woodpecker-ci/woodpecker/server/store"
@ -38,7 +38,7 @@ func GetSelf(c *gin.Context) {
func GetFeed(c *gin.Context) { func GetFeed(c *gin.Context) {
store_ := store.FromContext(c) store_ := store.FromContext(c)
remote_ := remote.FromContext(c) remote_ := server.Config.Services.Remote
user := session.User(c) user := session.User(c)
latest, _ := strconv.ParseBool(c.Query("latest")) latest, _ := strconv.ParseBool(c.Query("latest"))
@ -87,7 +87,7 @@ func GetFeed(c *gin.Context) {
func GetRepos(c *gin.Context) { func GetRepos(c *gin.Context) {
store_ := store.FromContext(c) store_ := store.FromContext(c)
remote_ := remote.FromContext(c) remote_ := server.Config.Services.Remote
user := session.User(c) user := session.User(c)
all, _ := strconv.ParseBool(c.Query("all")) all, _ := strconv.ParseBool(c.Query("all"))

View file

@ -24,6 +24,7 @@ import (
"github.com/woodpecker-ci/woodpecker/server/model" "github.com/woodpecker-ci/woodpecker/server/model"
"github.com/woodpecker-ci/woodpecker/server/pubsub" "github.com/woodpecker-ci/woodpecker/server/pubsub"
"github.com/woodpecker-ci/woodpecker/server/queue" "github.com/woodpecker-ci/woodpecker/server/queue"
"github.com/woodpecker-ci/woodpecker/server/remote"
) )
var Config = struct { var Config = struct {
@ -35,6 +36,7 @@ var Config = struct {
Secrets model.SecretService Secrets model.SecretService
Registries model.RegistryService Registries model.RegistryService
Environ model.EnvironService Environ model.EnvironService
Remote remote.Remote
} }
Storage struct { Storage struct {
// Users model.UserStore // Users model.UserStore

View file

@ -1,37 +0,0 @@
// Copyright 2018 Drone.IO Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package remote
import (
"context"
)
const key = "remote"
// Setter defines a context that enables setting values.
type Setter interface {
Set(string, interface{})
}
// FromContext returns the Remote associated with this context.
func FromContext(c context.Context) Remote {
return c.Value(key).(Remote)
}
// ToContext adds the Remote to this context if it supports
// the Setter interface.
func ToContext(c Setter, r Remote) {
c.Set(key, r)
}

View file

@ -96,78 +96,3 @@ func (a ByName) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
type Refresher interface { type Refresher interface {
Refresh(context.Context, *model.User) (bool, error) Refresh(context.Context, *model.User) (bool, error)
} }
// Login authenticates the session and returns the
// remote user details.
func Login(c context.Context, w http.ResponseWriter, r *http.Request) (*model.User, error) {
return FromContext(c).Login(c, w, r)
}
// Auth authenticates the session and returns the remote user
// login for the given token and secret
func Auth(c context.Context, token, secret string) (string, error) {
return FromContext(c).Auth(c, token, secret)
}
// Teams fetches a list of team memberships from the remote system.
func Teams(c context.Context, u *model.User) ([]*model.Team, error) {
return FromContext(c).Teams(c, u)
}
// Repo fetches the named repository from the remote system.
func Repo(c context.Context, u *model.User, owner, repo string) (*model.Repo, error) {
return FromContext(c).Repo(c, u, owner, repo)
}
// Repos fetches a list of repos from the remote system.
func Repos(c context.Context, u *model.User) ([]*model.Repo, error) {
return FromContext(c).Repos(c, u)
}
// Perm fetches the named repository permissions from
// the remote system for the specified user.
func Perm(c context.Context, u *model.User, owner, repo string) (*model.Perm, error) {
return FromContext(c).Perm(c, u, owner, repo)
}
// Status sends the commit status to the remote system.
// An example would be the GitHub pull request status.
func Status(c context.Context, u *model.User, r *model.Repo, b *model.Build, link string, proc *model.Proc) error {
return FromContext(c).Status(c, u, r, b, link, proc)
}
// Netrc returns a .netrc file that can be used to clone
// private repositories from a remote system.
func Netrc(c context.Context, u *model.User, r *model.Repo) (*model.Netrc, error) {
return FromContext(c).Netrc(u, r)
}
// Activate activates a repository by creating the post-commit hook and
// adding the SSH deploy key, if applicable.
func Activate(c context.Context, u *model.User, r *model.Repo, link string) error {
return FromContext(c).Activate(c, u, r, link)
}
// Deactivate removes a repository by removing all the post-commit hooks
// which are equal to link and removing the SSH deploy key.
func Deactivate(c context.Context, u *model.User, r *model.Repo, link string) error {
return FromContext(c).Deactivate(c, u, r, link)
}
// Hook parses the post-commit hook from the Request body
// and returns the required data in a standard format.
func Hook(c context.Context, r *http.Request) (*model.Repo, *model.Build, error) {
return FromContext(c).Hook(r)
}
// Refresh refreshes an oauth token and expiration for the given
// user. It returns true if the token was refreshed, false if the
// token was not refreshed, and error if it failed to refersh.
func Refresh(c context.Context, u *model.User) (bool, error) {
remote := FromContext(c)
refresher, ok := remote.(Refresher)
if !ok {
return false, nil
}
return refresher.Refresh(c, u)
}

View file

@ -1,29 +0,0 @@
// Copyright 2018 Drone.IO Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package middleware
import (
"github.com/gin-gonic/gin"
"github.com/woodpecker-ci/woodpecker/server/remote"
)
// Remote is a middleware function that initializes the Remote and attaches to
// the context of every http.Request.
func Remote(v remote.Remote) gin.HandlerFunc {
return func(c *gin.Context) {
remote.ToContext(c, v)
}
}

View file

@ -18,12 +18,11 @@ import (
"net/http" "net/http"
"time" "time"
"github.com/gin-gonic/gin"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
"github.com/gin-gonic/gin" "github.com/woodpecker-ci/woodpecker/server"
"github.com/woodpecker-ci/woodpecker/server/model" "github.com/woodpecker-ci/woodpecker/server/model"
"github.com/woodpecker-ci/woodpecker/server/remote"
"github.com/woodpecker-ci/woodpecker/server/store" "github.com/woodpecker-ci/woodpecker/server/store"
) )
@ -98,7 +97,7 @@ func SetPerm() gin.HandlerFunc {
user.Login, repo.FullName, err) user.Login, repo.FullName, err)
} }
if time.Unix(perm.Synced, 0).Add(time.Hour).Before(time.Now()) { if time.Unix(perm.Synced, 0).Add(time.Hour).Before(time.Now()) {
perm, err = remote.FromContext(c).Perm(c, user, repo.Owner, repo.Name) perm, err = server.Config.Services.Remote.Perm(c, user, repo.Owner, repo.Name)
if err == nil { if err == nil {
log.Debug().Msgf("Synced user permission for %s %s", user.Login, repo.FullName) log.Debug().Msgf("Synced user permission for %s %s", user.Login, repo.FullName)
perm.Repo = repo.FullName perm.Repo = repo.FullName

View file

@ -21,6 +21,7 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/woodpecker-ci/woodpecker/server"
"github.com/woodpecker-ci/woodpecker/server/remote" "github.com/woodpecker-ci/woodpecker/server/remote"
"github.com/woodpecker-ci/woodpecker/server/router/middleware/session" "github.com/woodpecker-ci/woodpecker/server/router/middleware/session"
"github.com/woodpecker-ci/woodpecker/server/store" "github.com/woodpecker-ci/woodpecker/server/store"
@ -35,7 +36,7 @@ func Refresh(c *gin.Context) {
// check if the remote includes the ability to // check if the remote includes the ability to
// refresh the user token. // refresh the user token.
remote_ := remote.FromContext(c) remote_ := server.Config.Services.Remote
refresher, ok := remote_.(remote.Refresher) refresher, ok := remote_.(remote.Refresher)
if !ok { if !ok {
c.Next() c.Next()