diff --git a/drone/server.go b/drone/server.go index 58bfeb44f..eab5f13d1 100644 --- a/drone/server.go +++ b/drone/server.go @@ -261,6 +261,11 @@ var serverCmd = cli.Command{ Name: "stash-consumer-rsa", Usage: "stash oauth1 private key file", }, + cli.StringFlag{ + EnvVar: "DRONE_STASH_CONSUMER_RSA_STRING", + Name: "stash-consumer-rsa-string", + Usage: "stash oauth1 private key string", + }, cli.StringFlag{ EnvVar: "DRONE_STASH_GIT_USERNAME", Name: "stash-git-username", diff --git a/remote/bitbucketserver/bitbucketserver.go b/remote/bitbucketserver/bitbucketserver.go index 1da0c015f..6068e1051 100644 --- a/remote/bitbucketserver/bitbucketserver.go +++ b/remote/bitbucketserver/bitbucketserver.go @@ -27,12 +27,13 @@ const ( // Opts defines configuration options. type Opts struct { - URL string // Stash server url. - Username string // Git machine account username. - Password string // Git machine account password. - ConsumerKey string // Oauth1 consumer key. - ConsumerRSA string // Oauth1 consumer key file. - SkipVerify bool // Skip ssl verification. + URL string // Stash server url. + Username string // Git machine account username. + Password string // Git machine account password. + ConsumerKey string // Oauth1 consumer key. + ConsumerRSA string // Oauth1 consumer key file. + ConsumerRSAString string + SkipVerify bool // Skip ssl verification. } type Config struct { @@ -60,19 +61,29 @@ func New(opts Opts) (remote.Remote, error) { return nil, fmt.Errorf("Must have a git machine account password") case opts.ConsumerKey == "": return nil, fmt.Errorf("Must have a oauth1 consumer key") - case opts.ConsumerRSA == "": - return nil, fmt.Errorf("Must have a oauth1 consumer key file") } - keyFile, err := ioutil.ReadFile(opts.ConsumerRSA) - if err != nil { - return nil, err + if opts.ConsumerRSA == "" && opts.ConsumerRSAString == "" { + return nil, fmt.Errorf("must have CONSUMER_RSA_KEY set to the path of a oauth1 consumer key file or CONSUMER_RSA_KEY_STRING set to the value of a oauth1 consumer key") } - block, _ := pem.Decode(keyFile) + + var keyFileBytes []byte + if opts.ConsumerRSA != "" { + var err error + keyFileBytes, err = ioutil.ReadFile(opts.ConsumerRSA) + if err != nil { + return nil, err + } + } else { + keyFileBytes = []byte(opts.ConsumerRSAString) + } + + block, _ := pem.Decode(keyFileBytes) PrivateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes) if err != nil { return nil, err } + config.Consumer = CreateConsumer(opts.URL, opts.ConsumerKey, PrivateKey) return config, nil } @@ -154,7 +165,7 @@ func (c *Config) File(u *model.User, r *model.Repo, b *model.Build, f string) ([ } // Status is not supported by the bitbucketserver driver. -func (c *Config) Status(u *model.User,r *model.Repo,b *model.Build,link string) error { +func (c *Config) Status(u *model.User, r *model.Repo, b *model.Build, link string) error { status := internal.BuildStatus{ State: convertStatus(b.Status), Desc: convertDesc(b.Status), diff --git a/router/middleware/remote.go b/router/middleware/remote.go index 7d0d56f79..98e197037 100644 --- a/router/middleware/remote.go +++ b/router/middleware/remote.go @@ -66,12 +66,13 @@ func setupGogs(c *cli.Context) (remote.Remote, error) { // helper function to setup the Stash remote from the CLI arguments. func setupStash(c *cli.Context) (remote.Remote, error) { return bitbucketserver.New(bitbucketserver.Opts{ - URL: c.String("stash-server"), - Username: c.String("stash-git-username"), - Password: c.String("stash-git-password"), - ConsumerKey: c.String("stash-consumer-key"), - ConsumerRSA: c.String("stash-consumer-rsa"), - SkipVerify: c.Bool("stash-skip-verify"), + URL: c.String("stash-server"), + Username: c.String("stash-git-username"), + Password: c.String("stash-git-password"), + ConsumerKey: c.String("stash-consumer-key"), + ConsumerRSA: c.String("stash-consumer-rsa"), + ConsumerRSAString: c.String("stash-consumer-rsa-string"), + SkipVerify: c.Bool("stash-skip-verify"), }) }