aboutsummaryrefslogtreecommitdiff
path: root/tools/ssh-key-to-forge/main.go
diff options
context:
space:
mode:
authorFranck Cuny <franck@fcuny.net>2022-10-03 08:38:56 -0700
committerFranck Cuny <franck@fcuny.net>2022-10-03 08:38:56 -0700
commit6b13654b54eb61b82bd6a854d652a08b08eebe9e (patch)
tree3c7e9c23b490975a16fd222619aba4ebc5c5e5ac /tools/ssh-key-to-forge/main.go
parentfeat(home/packages): install gh-ssh-keys (diff)
downloadinfra-6b13654b54eb61b82bd6a854d652a08b08eebe9e.tar.gz
ref(tools/ssh-key-to-forge): replaced by gh-ssh-keys
See https://github.com/fcuny/gh-ssh-keys
Diffstat (limited to 'tools/ssh-key-to-forge/main.go')
-rw-r--r--tools/ssh-key-to-forge/main.go115
1 files changed, 0 insertions, 115 deletions
diff --git a/tools/ssh-key-to-forge/main.go b/tools/ssh-key-to-forge/main.go
deleted file mode 100644
index efea398..0000000
--- a/tools/ssh-key-to-forge/main.go
+++ /dev/null
@@ -1,115 +0,0 @@
-package main
-
-import (
- "context"
- "encoding/base64"
- "flag"
- "fmt"
- "io/ioutil"
- "log"
- "os"
- "path/filepath"
- "strings"
-
- "github.com/google/go-github/github"
- "github.com/tcnksm/go-gitconfig"
- "golang.org/x/crypto/ssh"
- "golang.org/x/oauth2"
-)
-
-var (
- defaultPublicKeyPath = filepath.Join(os.Getenv("HOME"), ".ssh", "id_rsa.pub")
-)
-
-func main() {
- sshkey := flag.String("ssh-key", defaultPublicKeyPath, "Path to the ssh public key to upload")
-
- flag.Parse()
-
- keyContent, keyTitle, err := readPublicKey(sshkey)
- if err != nil {
- log.Fatal(err)
- }
-
- keyToGitHub(keyContent, keyTitle)
-}
-
-// readPublicKey reads the public key, ensure it's in the proper
-// format to prevent sending incorrect data, and returns the content
-// of the key (the whole content) and the last field of the key that
-// will be used as the title.
-func readPublicKey(sshkey *string) (string, string, error) {
- // first, let's ensure it's a public key, so we don't upload
- // something incorrect.
- data, err := ioutil.ReadFile(*sshkey)
- if err != nil {
- return "", "", fmt.Errorf("failed to open %s: %v", *sshkey, err)
- }
-
- // we only want the content of the key to be parsed, not all the fields
- fields := strings.Fields(string(data))
- if len(fields) < 2 {
- return "", "", fmt.Errorf("not enough fields in public key %s (%d)", *sshkey, len(fields))
- }
-
- raw, err := base64.StdEncoding.DecodeString(fields[1])
- if err != nil {
- return "", "", fmt.Errorf("failed to read the second field in the public key %s: %v", *sshkey, err)
- }
- _, err = ssh.ParsePublicKey(raw)
- if err != nil {
- return "", "", fmt.Errorf("%s is not a valid public key: %v", *sshkey, err)
- }
-
- return strings.TrimSuffix(string(data), "\n"), fields[2], nil
-}
-
-// If the key does not exists already on GitHub, upload it, using the
-// signature (last part of the key) as the title.
-func keyToGitHub(keyContent, keyTitle string) {
- user, err := gitconfig.Global("github.user")
- if err != nil {
- fmt.Fprintf(os.Stderr, "github: failed to get the username: %v", err)
- return
- }
-
- token, err := gitconfig.Global("github.tokensshtoforge")
- if err != nil {
- fmt.Fprintf(os.Stderr, "github: failed to get the token: %v", err)
- return
- }
-
- ctx := context.Background()
- ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token})
- tc := oauth2.NewClient(ctx, ts)
-
- client := github.NewClient(tc)
-
- keys, _, err := client.Users.ListKeys(ctx, user, nil)
- if err != nil {
- fmt.Fprintf(os.Stderr, "github: failed to get the list of existing keys: %v", err)
- return
- }
-
- skip := false
- for _, k := range keys {
- ghKey := *k.Key + " " + keyTitle
- c := strings.Compare(ghKey, keyContent)
- if c == 0 {
- skip = true
- break
- }
- }
-
- if !skip {
- key := github.Key{
- Key: &keyContent,
- Title: &keyTitle,
- }
- _, _, err := client.Users.CreateKey(ctx, &key)
- if err != nil {
- fmt.Fprintf(os.Stderr, "github: failed to upload the ssh public key: %+v", err)
- return
- }
- }
-}