2019-02-19 23:56:41 +00:00
|
|
|
// Copyright 2019 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 main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/drone/drone/cmd/drone-server/config"
|
|
|
|
"github.com/drone/go-login/login"
|
|
|
|
"github.com/drone/go-login/login/bitbucket"
|
2019-03-08 18:38:20 +00:00
|
|
|
"github.com/drone/go-login/login/gitea"
|
2021-11-25 15:35:02 +00:00
|
|
|
"github.com/drone/go-login/login/gitee"
|
2019-02-19 23:56:41 +00:00
|
|
|
"github.com/drone/go-login/login/github"
|
|
|
|
"github.com/drone/go-login/login/gitlab"
|
|
|
|
"github.com/drone/go-login/login/gogs"
|
|
|
|
"github.com/drone/go-login/login/stash"
|
|
|
|
"github.com/drone/go-scm/scm/transport/oauth2"
|
2020-02-14 08:08:08 +00:00
|
|
|
"strings"
|
2019-02-19 23:56:41 +00:00
|
|
|
|
|
|
|
"github.com/google/wire"
|
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
)
|
|
|
|
|
|
|
|
// wire set for loading the authenticator.
|
|
|
|
var loginSet = wire.NewSet(
|
|
|
|
provideLogin,
|
|
|
|
provideRefresher,
|
|
|
|
)
|
|
|
|
|
|
|
|
// provideLogin is a Wire provider function that returns an
|
2019-04-16 01:55:38 +00:00
|
|
|
// authenticator based on the environment configuration.
|
2019-02-19 23:56:41 +00:00
|
|
|
func provideLogin(config config.Config) login.Middleware {
|
|
|
|
switch {
|
|
|
|
case config.Bitbucket.ClientID != "":
|
|
|
|
return provideBitbucketLogin(config)
|
|
|
|
case config.Github.ClientID != "":
|
|
|
|
return provideGithubLogin(config)
|
2021-11-25 15:35:02 +00:00
|
|
|
case config.Gitee.ClientID != "":
|
|
|
|
return provideGiteeLogin(config)
|
2019-02-19 23:56:41 +00:00
|
|
|
case config.Gitea.Server != "":
|
|
|
|
return provideGiteaLogin(config)
|
|
|
|
case config.GitLab.ClientID != "":
|
|
|
|
return provideGitlabLogin(config)
|
|
|
|
case config.Gogs.Server != "":
|
|
|
|
return provideGogsLogin(config)
|
|
|
|
case config.Stash.ConsumerKey != "":
|
|
|
|
return provideStashLogin(config)
|
|
|
|
}
|
|
|
|
logrus.Fatalln("main: source code management system not configured")
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
// provideBitbucketLogin is a Wire provider function that
|
2019-04-16 01:55:38 +00:00
|
|
|
// returns a Bitbucket Cloud authenticator based on the
|
2019-02-19 23:56:41 +00:00
|
|
|
// environment configuration.
|
|
|
|
func provideBitbucketLogin(config config.Config) login.Middleware {
|
|
|
|
if config.Bitbucket.ClientID == "" {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &bitbucket.Config{
|
|
|
|
ClientID: config.Bitbucket.ClientID,
|
|
|
|
ClientSecret: config.Bitbucket.ClientSecret,
|
|
|
|
RedirectURL: config.Server.Addr + "/login",
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// provideGithubLogin is a Wire provider function that returns
|
2019-04-16 01:55:38 +00:00
|
|
|
// a GitHub authenticator based on the environment configuration.
|
2019-02-19 23:56:41 +00:00
|
|
|
func provideGithubLogin(config config.Config) login.Middleware {
|
|
|
|
if config.Github.ClientID == "" {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &github.Config{
|
|
|
|
ClientID: config.Github.ClientID,
|
|
|
|
ClientSecret: config.Github.ClientSecret,
|
|
|
|
Scope: config.Github.Scope,
|
|
|
|
Server: config.Github.Server,
|
|
|
|
Client: defaultClient(config.Github.SkipVerify),
|
|
|
|
Logger: logrus.StandardLogger(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-11-25 15:35:02 +00:00
|
|
|
// provideGiteeLogin is a Wire provider function that returns
|
|
|
|
// a Gitee authenticator based on the environment configuration.
|
|
|
|
func provideGiteeLogin(config config.Config) login.Middleware {
|
|
|
|
if config.Gitee.ClientID == "" {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
redirectURL := config.Gitee.RedirectURL
|
|
|
|
if redirectURL == "" {
|
|
|
|
redirectURL = config.Server.Addr + "/login"
|
|
|
|
}
|
|
|
|
return &gitee.Config{
|
|
|
|
ClientID: config.Gitee.ClientID,
|
|
|
|
ClientSecret: config.Gitee.ClientSecret,
|
|
|
|
RedirectURL: redirectURL,
|
|
|
|
Server: config.Gitee.Server,
|
|
|
|
Scope: config.Gitee.Scope,
|
|
|
|
Client: defaultClient(config.Gitee.SkipVerify),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-19 23:56:41 +00:00
|
|
|
// provideGiteaLogin is a Wire provider function that returns
|
2019-04-16 01:55:38 +00:00
|
|
|
// a Gitea authenticator based on the environment configuration.
|
2019-02-19 23:56:41 +00:00
|
|
|
func provideGiteaLogin(config config.Config) login.Middleware {
|
|
|
|
if config.Gitea.Server == "" {
|
|
|
|
return nil
|
|
|
|
}
|
2021-12-19 12:45:19 +00:00
|
|
|
return &gitea.Config{
|
2019-06-05 21:36:10 +00:00
|
|
|
ClientID: config.Gitea.ClientID,
|
|
|
|
ClientSecret: config.Gitea.ClientSecret,
|
|
|
|
Server: config.Gitea.Server,
|
|
|
|
Client: defaultClient(config.Gitea.SkipVerify),
|
|
|
|
Logger: logrus.StandardLogger(),
|
|
|
|
RedirectURL: config.Server.Addr + "/login",
|
|
|
|
Scope: config.Gitea.Scope,
|
2019-02-19 23:56:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// provideGitlabLogin is a Wire provider function that returns
|
2019-04-16 01:55:38 +00:00
|
|
|
// a GitLab authenticator based on the environment configuration.
|
2019-02-19 23:56:41 +00:00
|
|
|
func provideGitlabLogin(config config.Config) login.Middleware {
|
|
|
|
if config.GitLab.ClientID == "" {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &gitlab.Config{
|
|
|
|
ClientID: config.GitLab.ClientID,
|
|
|
|
ClientSecret: config.GitLab.ClientSecret,
|
|
|
|
RedirectURL: config.Server.Addr + "/login",
|
|
|
|
Server: config.GitLab.Server,
|
|
|
|
Client: defaultClient(config.GitLab.SkipVerify),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// provideGogsLogin is a Wire provider function that returns
|
2019-04-16 01:55:38 +00:00
|
|
|
// a Gogs authenticator based on the environment configuration.
|
2019-02-19 23:56:41 +00:00
|
|
|
func provideGogsLogin(config config.Config) login.Middleware {
|
|
|
|
if config.Gogs.Server == "" {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
return &gogs.Config{
|
|
|
|
Label: "drone",
|
|
|
|
Login: "/login/form",
|
|
|
|
Server: config.Gogs.Server,
|
|
|
|
Client: defaultClient(config.Gogs.SkipVerify),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// provideStashLogin is a Wire provider function that returns
|
2019-04-16 01:55:38 +00:00
|
|
|
// a Stash authenticator based on the environment configuration.
|
2019-02-19 23:56:41 +00:00
|
|
|
func provideStashLogin(config config.Config) login.Middleware {
|
|
|
|
if config.Stash.ConsumerKey == "" {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
privateKey, err := stash.ParsePrivateKeyFile(config.Stash.PrivateKey)
|
|
|
|
if err != nil {
|
|
|
|
logrus.WithError(err).
|
|
|
|
Fatalln("main: cannot parse Private Key file")
|
|
|
|
}
|
|
|
|
return &stash.Config{
|
|
|
|
Address: config.Stash.Server,
|
|
|
|
ConsumerKey: config.Stash.ConsumerKey,
|
|
|
|
ConsumerSecret: config.Stash.ConsumerSecret,
|
|
|
|
PrivateKey: privateKey,
|
|
|
|
CallbackURL: config.Server.Addr + "/login",
|
|
|
|
Client: defaultClient(config.Stash.SkipVerify),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// provideRefresher is a Wire provider function that returns
|
2019-04-22 23:52:37 +00:00
|
|
|
// an oauth token refresher for Bitbucket and Gitea
|
2019-02-19 23:56:41 +00:00
|
|
|
func provideRefresher(config config.Config) *oauth2.Refresher {
|
2019-04-22 23:36:47 +00:00
|
|
|
switch {
|
|
|
|
case config.Bitbucket.ClientID != "":
|
2019-02-19 23:56:41 +00:00
|
|
|
return &oauth2.Refresher{
|
|
|
|
ClientID: config.Bitbucket.ClientID,
|
|
|
|
ClientSecret: config.Bitbucket.ClientSecret,
|
|
|
|
Endpoint: "https://bitbucket.org/site/oauth2/access_token",
|
|
|
|
Source: oauth2.ContextTokenSource(),
|
2019-11-10 10:06:18 +00:00
|
|
|
Client: defaultClient(config.Bitbucket.SkipVerify),
|
2019-02-19 23:56:41 +00:00
|
|
|
}
|
2019-04-22 23:50:31 +00:00
|
|
|
case config.Gitea.ClientID != "":
|
2019-04-22 20:54:25 +00:00
|
|
|
return &oauth2.Refresher{
|
|
|
|
ClientID: config.Gitea.ClientID,
|
|
|
|
ClientSecret: config.Gitea.ClientSecret,
|
2020-02-14 08:01:48 +00:00
|
|
|
Endpoint: strings.TrimSuffix(config.Gitea.Server, "/") + "/login/oauth/access_token",
|
2019-04-22 20:54:25 +00:00
|
|
|
Source: oauth2.ContextTokenSource(),
|
2019-11-10 10:06:18 +00:00
|
|
|
Client: defaultClient(config.Gitea.SkipVerify),
|
2019-04-22 20:54:25 +00:00
|
|
|
}
|
2022-06-14 09:46:35 +00:00
|
|
|
case config.GitLab.ClientID != "":
|
|
|
|
return &oauth2.Refresher{
|
|
|
|
ClientID: config.GitLab.ClientID,
|
|
|
|
ClientSecret: config.GitLab.ClientSecret,
|
|
|
|
Endpoint: strings.TrimSuffix(config.GitLab.Server, "/") + "/oauth/token",
|
|
|
|
Source: oauth2.ContextTokenSource(),
|
|
|
|
Client: defaultClient(config.GitLab.SkipVerify),
|
|
|
|
}
|
2021-12-19 12:45:19 +00:00
|
|
|
case config.Gitee.ClientID != "":
|
|
|
|
return &oauth2.Refresher{
|
|
|
|
ClientID: config.Gitee.ClientID,
|
|
|
|
ClientSecret: config.Gitee.ClientSecret,
|
|
|
|
Endpoint: strings.TrimSuffix(config.Gitee.Server, "/") + "/oauth/token",
|
|
|
|
Source: oauth2.ContextTokenSource(),
|
|
|
|
Client: defaultClient(config.Gitee.SkipVerify),
|
|
|
|
}
|
|
|
|
|
2019-04-22 20:54:25 +00:00
|
|
|
}
|
2019-02-19 23:56:41 +00:00
|
|
|
return nil
|
|
|
|
}
|