Skip to content

Commit e32e7e2

Browse files
authored
Merge pull request #24617 from hashicorp/alisdair/provider-installer-signature-verification
internal: Verify provider signatures on install
2 parents 92d6a30 + a5b3d49 commit e32e7e2

16 files changed

+1222
-66
lines changed

command/init.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,17 @@ func (c *InitCommand) getProviders(earlyConfig *earlyconfig.Config, state *state
508508
fmt.Sprintf("Error while installing %s v%s: %s.", provider.ForDisplay(), version, err),
509509
))
510510
},
511+
FetchPackageSuccess: func(provider addrs.Provider, version getproviders.Version, localDir string, authResult *getproviders.PackageAuthenticationResult) {
512+
var warning string
513+
if authResult != nil {
514+
warning = authResult.Warning
515+
}
516+
if warning != "" {
517+
warning = c.Colorize().Color(fmt.Sprintf("\n [reset][yellow]Warning: %s[reset]", warning))
518+
}
519+
520+
c.Ui.Info(fmt.Sprintf("- Installed %s v%s (%s)%s", provider.ForDisplay(), version, authResult, warning))
521+
},
511522
}
512523

513524
mode := providercache.InstallNewProvidersOnly

command/init_test.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -945,6 +945,10 @@ func TestInit_providerSource(t *testing.T) {
945945
t.Errorf("wrong version selections after upgrade\n%s", diff)
946946
}
947947

948+
outputStr := ui.OutputWriter.String()
949+
if want := "Installed hashicorp/test v1.2.3 (verified checksum)"; !strings.Contains(outputStr, want) {
950+
t.Fatalf("unexpected output: %s\nexpected to include %q", outputStr, want)
951+
}
948952
}
949953

950954
func TestInit_getUpgradePlugins(t *testing.T) {
@@ -1101,7 +1105,7 @@ func TestInit_getProviderMissing(t *testing.T) {
11011105

11021106
args := []string{}
11031107
if code := c.Run(args); code == 0 {
1104-
t.Fatalf("expceted error, got output: \n%s", ui.OutputWriter.String())
1108+
t.Fatalf("expected error, got output: \n%s", ui.OutputWriter.String())
11051109
}
11061110

11071111
if !strings.Contains(ui.ErrorWriter.String(), "no available releases match") {
@@ -1619,7 +1623,7 @@ func installFakeProviderPackagesElsewhere(t *testing.T, cacheDir *providercache.
16191623
if err != nil {
16201624
t.Fatalf("failed to prepare fake package for %s %s: %s", name, versionStr, err)
16211625
}
1622-
err = cacheDir.InstallPackage(context.Background(), meta)
1626+
_, err = cacheDir.InstallPackage(context.Background(), meta)
16231627
if err != nil {
16241628
t.Fatalf("failed to install fake package for %s %s: %s", name, versionStr, err)
16251629
}

internal/getproviders/mock_source.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ package getproviders
22

33
import (
44
"archive/zip"
5+
"crypto/sha256"
56
"fmt"
7+
"io"
68
"io/ioutil"
79
"os"
810

@@ -168,6 +170,14 @@ func FakeInstallablePackageMeta(provider addrs.Provider, version Version, target
168170
return PackageMeta{}, close, fmt.Errorf("failed to close the mock zip file: %s", err)
169171
}
170172

173+
// Compute the SHA256 checksum of the generated file, to allow package
174+
// authentication code to be exercised.
175+
f.Seek(0, io.SeekStart)
176+
h := sha256.New()
177+
io.Copy(h, f)
178+
checksum := [32]byte{}
179+
h.Sum(checksum[:0])
180+
171181
meta := PackageMeta{
172182
Provider: provider,
173183
Version: version,
@@ -181,6 +191,8 @@ func FakeInstallablePackageMeta(provider addrs.Provider, version Version, target
181191
// (At the time of writing, no caller actually does that, but who
182192
// knows what the future holds?)
183193
Filename: fmt.Sprintf("terraform-provider-%s_%s_%s.zip", provider.Type, version.String(), target.String()),
194+
195+
Authentication: NewArchiveChecksumAuthentication(checksum),
184196
}
185197
return meta, close, nil
186198
}

0 commit comments

Comments
 (0)