Skip to content
This repository was archived by the owner on Jun 27, 2025. It is now read-only.

Commit ed68879

Browse files
committed
Add support for encrypted private key
This PR adds support for prompting the user for their SSH key password if they are using an encrypted private key. Testing was performed locally. Signed-off-by: Michael L. Young <[email protected]> resolves #28
1 parent cd9ebd1 commit ed68879

File tree

4 files changed

+25
-2
lines changed

4 files changed

+25
-2
lines changed

cmd/srpmproc/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ var (
3535
sourceRpmGitName string
3636
sshKeyLocation string
3737
sshUser string
38+
sshAskKeyPassword bool
3839
upstreamPrefix string
3940
version int
4041
storageAddr string
@@ -80,6 +81,7 @@ func mn(_ *cobra.Command, _ []string) {
8081
RpmPrefix: rpmPrefix,
8182
SshKeyLocation: sshKeyLocation,
8283
SshUser: sshUser,
84+
SshKeyPassword: sshAskKeyPassword,
8385
ManualCommits: manualCommits,
8486
UpstreamPrefix: upstreamPrefix,
8587
GitCommitterName: gitCommitterName,
@@ -130,6 +132,7 @@ func main() {
130132
root.Flags().StringVar(&sourceRpmGitName, "source-rpm-git-name", "", "Actual git repo name of package if name is different from source-rpm value")
131133
root.Flags().StringVar(&sshKeyLocation, "ssh-key-location", "", "Location of the SSH key to use to authenticate against upstream")
132134
root.Flags().StringVar(&sshUser, "ssh-user", "git", "SSH User")
135+
root.Flags().BoolVar(&sshAskKeyPassword, "ssh-key-password", false, "If enabled, prompt for ssh key password")
133136
root.Flags().StringVar(&gitCommitterName, "git-committer-name", "rockyautomation", "Name of committer")
134137
root.Flags().StringVar(&gitCommitterEmail, "git-committer-email", "[email protected]", "Email of committer")
135138
root.Flags().StringVar(&modulePrefix, "module-prefix", "https://git.centos.org/modules", "Where to retrieve modules if exists. Only used when source-rpm is a git repo")

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ require (
7272
golang.org/x/net v0.27.0 // indirect
7373
golang.org/x/oauth2 v0.21.0 // indirect
7474
golang.org/x/sync v0.7.0 // indirect
75-
golang.org/x/sys v0.22.0 // indirect
75+
golang.org/x/sys v0.27.0 // indirect
76+
golang.org/x/term v0.26.0
7677
golang.org/x/text v0.16.0 // indirect
7778
golang.org/x/time v0.5.0 // indirect
7879
golang.org/x/tools v0.23.0 // indirect

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,8 @@ golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
511511
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
512512
golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
513513
golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
514+
golang.org/x/sys v0.27.0 h1:wBqf8DvsY9Y/2P8gAfPDEYNuS30J4lPHJxXSb/nJZ+s=
515+
golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
514516
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
515517
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
516518
golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
@@ -519,6 +521,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
519521
golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw=
520522
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
521523
golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk=
524+
golang.org/x/term v0.26.0 h1:WEQa6V3Gja/BhNxg540hBip/kkaYtRg3cxg4oXSw4AU=
525+
golang.org/x/term v0.26.0/go.mod h1:Si5m1o57C5nBNQo5z1iq+XDijt21BDBDp2bK0QI8e3E=
522526
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
523527
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
524528
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=

pkg/srpmproc/process.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import (
3131
"os/user"
3232
"path/filepath"
3333
"strings"
34+
"syscall"
3435
"time"
3536

3637
"github.com/go-git/go-billy/v5"
@@ -55,6 +56,7 @@ import (
5556
"github.com/go-git/go-git/v5/plumbing/object"
5657
"github.com/go-git/go-git/v5/storage/memory"
5758
"github.com/rocky-linux/srpmproc/pkg/data"
59+
"golang.org/x/term"
5860
)
5961

6062
const (
@@ -79,6 +81,7 @@ type ProcessDataRequest struct {
7981
RpmPrefix string
8082
SshKeyLocation string
8183
SshUser string
84+
SshKeyPassword bool
8285
HttpUsername string
8386
HttpPassword string
8487
ManualCommits string
@@ -267,8 +270,20 @@ func NewProcessData(req *ProcessDataRequest) (*data.ProcessData, error) {
267270
Password: req.HttpPassword,
268271
}
269272
} else {
273+
var sshPassword string = ""
274+
if req.SshKeyPassword {
275+
276+
fmt.Print("Enter SSH key password: ")
277+
sshBytePassword, err := term.ReadPassword(int(syscall.Stdin))
278+
if err != nil {
279+
return nil, fmt.Errorf("could not read password for ssh key: %v", err)
280+
}
281+
282+
sshPassword = string(sshBytePassword)
283+
}
284+
270285
// create ssh key authenticator
271-
authenticator, err = ssh.NewPublicKeysFromFile(req.SshUser, lastKeyLocation, "")
286+
authenticator, err = ssh.NewPublicKeysFromFile(req.SshUser, lastKeyLocation, sshPassword)
272287
}
273288
if err != nil {
274289
return nil, fmt.Errorf("could not get git authenticator: %v", err)

0 commit comments

Comments
 (0)