Skip to content

Commit f05c9fd

Browse files
authored
Merge pull request #78 from fluxcd/generate-deploy-keys-in-tests
2 parents b4e8085 + bb50cae commit f05c9fd

File tree

3 files changed

+162
-3
lines changed

3 files changed

+162
-3
lines changed

gitlab/integration_test.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838
"github.com/xanzy/go-gitlab"
3939

4040
"github.com/fluxcd/go-git-providers/gitprovider"
41+
testutils "github.com/fluxcd/go-git-providers/gitprovider/testutils"
4142
)
4243

4344
const (
@@ -526,10 +527,15 @@ var _ = Describe("GitLab Provider", func() {
526527
Expect(err).ToNot(HaveOccurred())
527528
Expect(len(keys)).To(Equal(0))
528529

530+
rsaGen := testutils.NewRSAGenerator(256)
531+
keyPair1, err := rsaGen.Generate()
532+
Expect(err).ToNot(HaveOccurred())
533+
pubKey := keyPair1.PublicKey
534+
529535
readOnly := false
530536
testDeployKeyInfo := gitprovider.DeployKeyInfo{
531537
Name: testDeployKeyName,
532-
Key: []byte("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8f94nlLYm+pFUCE0BSpNGrcGtxVbqNcsrg54wzbbazHadP4JpMQzjGjIJZI9q+gK+nCiU6KqDsm55fyPb8dkDjXcp/3soYlBS9fLkuh0v2LlLfM9AnqShQVM1CKFs8VzDEnwMfhIx3XR1JJJfGEyu36GzAgHv3bSGYMi5MyPT16yCg9427RwaokV1+9MTXdjCS1OOrhMqCwgHcHhBCdY/st9k2l1OLXW40IJ4fHT9QTyGQvp4UZE6xylJxJdJEnK/YDloW1HpL+U63lxUl+ME8abmpFdenBiysC/FBhKb7b6rmnxSbw9DbAVdXaB9knJ21EjdEWtRV75wVfONwUFL user@host"),
538+
Key: pubKey,
533539
ReadOnly: &readOnly,
534540
}
535541
_, err = orgRepo.DeployKeys().Create(ctx, testDeployKeyInfo)
@@ -544,7 +550,8 @@ var _ = Describe("GitLab Provider", func() {
544550
getKey, err := orgRepo.DeployKeys().Get(ctx, testDeployKeyName)
545551
Expect(err).ToNot(HaveOccurred())
546552

547-
Expect(getKey.Get().Key).To(Equal(testDeployKeyInfo.Key))
553+
deployKeyStr := string(testDeployKeyInfo.Key)
554+
Expect(string(getKey.Get().Key)).To(Equal(strings.TrimSuffix(deployKeyStr, "\n")))
548555
Expect(getKey.Get().Name).To(Equal(testDeployKeyInfo.Name))
549556

550557
Expect(getKey.Set(getKey.Get())).ToNot(HaveOccurred())
@@ -556,7 +563,12 @@ var _ = Describe("GitLab Provider", func() {
556563
title := "new-title"
557564
req := getKey.Get()
558565
req.Name = title
559-
req.Key = []byte("ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDVkrF2RW7z8kG6K530zOCiVdGBfYErh+cYch1d48/ZpPYd45h9oG6E6qtkc6WD9/6WOV3RWNqeePTnxPfD2oEr6Lzh1lPazBmcWFvexct0q3+9XbR4Ir0h43gjjxtzyeaDHpKNFpupKDOA+iVTuewOARpqqaHpASW8PQrCCaCG/g9p8dK7vLKJXegEY+TIXJFLM5PWRR2SJZCsifyJytDeKxcUw9lGCXi/Bq5ce+xpZIUpv8TXmB5MYwNZSM5eEQcpsG2/obKWC0iN73PoC5IH0UaAiVrJzLbg2U8SZJGZOSPNu/KQugiXmJHRkgmu1J6TfyqRRccru+RpxFEbvC1d user@node")
566+
567+
keyPair2, err := rsaGen.Generate()
568+
Expect(err).ToNot(HaveOccurred())
569+
anotherPubKey := keyPair2.PublicKey
570+
req.Key = anotherPubKey
571+
560572
Expect(getKey.Set(req)).ToNot(HaveOccurred())
561573
actionTaken, err = getKey.Reconcile(ctx)
562574
// Expect the update to succeed, and modify the state

gitprovider/testutils/key_pair.go

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
/*
2+
Copyright 2020 The Flux authors
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package testutils
18+
19+
import (
20+
"crypto/ecdsa"
21+
"crypto/ed25519"
22+
"crypto/elliptic"
23+
"crypto/rand"
24+
"crypto/rsa"
25+
"crypto/x509"
26+
"encoding/pem"
27+
28+
"golang.org/x/crypto/ssh"
29+
)
30+
31+
// KeyPair holds the public and private key PEM block bytes.
32+
type KeyPair struct {
33+
PublicKey []byte
34+
PrivateKey []byte
35+
}
36+
37+
type KeyPairGenerator interface {
38+
Generate() (*KeyPair, error)
39+
}
40+
41+
type RSAGenerator struct {
42+
bits int
43+
}
44+
45+
func NewRSAGenerator(bits int) KeyPairGenerator {
46+
return &RSAGenerator{bits}
47+
}
48+
49+
func (g *RSAGenerator) Generate() (*KeyPair, error) {
50+
pk, err := rsa.GenerateKey(rand.Reader, g.bits)
51+
if err != nil {
52+
return nil, err
53+
}
54+
err = pk.Validate()
55+
if err != nil {
56+
return nil, err
57+
}
58+
pub, err := generatePublicKey(&pk.PublicKey)
59+
if err != nil {
60+
return nil, err
61+
}
62+
priv, err := encodePrivateKeyToPEM(pk)
63+
if err != nil {
64+
return nil, err
65+
}
66+
return &KeyPair{
67+
PublicKey: pub,
68+
PrivateKey: priv,
69+
}, nil
70+
}
71+
72+
type ECDSAGenerator struct {
73+
c elliptic.Curve
74+
}
75+
76+
func NewECDSAGenerator(c elliptic.Curve) KeyPairGenerator {
77+
return &ECDSAGenerator{c}
78+
}
79+
80+
func (g *ECDSAGenerator) Generate() (*KeyPair, error) {
81+
pk, err := ecdsa.GenerateKey(g.c, rand.Reader)
82+
if err != nil {
83+
return nil, err
84+
}
85+
pub, err := generatePublicKey(&pk.PublicKey)
86+
if err != nil {
87+
return nil, err
88+
}
89+
priv, err := encodePrivateKeyToPEM(pk)
90+
if err != nil {
91+
return nil, err
92+
}
93+
return &KeyPair{
94+
PublicKey: pub,
95+
PrivateKey: priv,
96+
}, nil
97+
}
98+
99+
type Ed25519Generator struct{}
100+
101+
func NewEd25519Generator() KeyPairGenerator {
102+
return &Ed25519Generator{}
103+
}
104+
105+
func (g *Ed25519Generator) Generate() (*KeyPair, error) {
106+
pk, pv, err := ed25519.GenerateKey(rand.Reader)
107+
if err != nil {
108+
return nil, err
109+
}
110+
pub, err := generatePublicKey(pk)
111+
if err != nil {
112+
return nil, err
113+
}
114+
priv, err := encodePrivateKeyToPEM(pv)
115+
if err != nil {
116+
return nil, err
117+
}
118+
return &KeyPair{
119+
PublicKey: pub,
120+
PrivateKey: priv,
121+
}, nil
122+
}
123+
124+
func generatePublicKey(pk interface{}) ([]byte, error) {
125+
b, err := ssh.NewPublicKey(pk)
126+
if err != nil {
127+
return nil, err
128+
}
129+
k := ssh.MarshalAuthorizedKey(b)
130+
return k, nil
131+
}
132+
133+
// encodePrivateKeyToPEM encodes the given private key to a PEM block.
134+
// The encoded format is PKCS#8 for universal support of the most
135+
// common key types (rsa, ecdsa, ed25519).
136+
func encodePrivateKeyToPEM(pk interface{}) ([]byte, error) {
137+
b, err := x509.MarshalPKCS8PrivateKey(pk)
138+
if err != nil {
139+
return nil, err
140+
}
141+
block := pem.Block{
142+
Type: "PRIVATE KEY",
143+
Bytes: b,
144+
}
145+
return pem.EncodeToMemory(&block), nil
146+
}

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ require (
1010
github.com/onsi/ginkgo v1.14.0
1111
github.com/onsi/gomega v1.10.1
1212
github.com/xanzy/go-gitlab v0.33.0
13+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2
1314
golang.org/x/oauth2 v0.0.0-20181106182150-f42d05182288
1415
)

0 commit comments

Comments
 (0)