134 lines
2.4 KiB
Go
134 lines
2.4 KiB
Go
// Copyright (C) 2023 Marius Schellenberger
|
|
|
|
package ssh
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"flag"
|
|
"fmt"
|
|
"os"
|
|
"text/tabwriter"
|
|
|
|
apiclient "git.giftfish.de/ston1th/keyctl/pkg/api/client"
|
|
clientv1 "git.giftfish.de/ston1th/keyctl/pkg/api/v1/client"
|
|
"git.giftfish.de/ston1th/keyctl/pkg/core"
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
var fs = flag.NewFlagSet("", flag.ExitOnError)
|
|
|
|
func exit(err error) {
|
|
fmt.Fprintf(os.Stderr, "%s\n", err)
|
|
os.Exit(1)
|
|
}
|
|
|
|
func Run(arg string) {
|
|
ctx := context.Background()
|
|
switch arg {
|
|
case "approve":
|
|
id, err := idFlags("access id")
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
c := client()
|
|
err = c.AcceptAccess(ctx, id)
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
case "reject":
|
|
id, err := idFlags("access id")
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
c := client()
|
|
err = c.RejectAccess(ctx, id)
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
case "login":
|
|
endpoint, err := loginFlags()
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
opts, err := apiclient.ClientOptionsFromConfig(
|
|
apiclient.Config{Endpoint: endpoint},
|
|
)
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
c := client(opts...)
|
|
host, err := os.Hostname()
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
// TODO: fix me (user)
|
|
ok, err := c.Access(ctx, host, "user")
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
if ok {
|
|
unix.Exec("/bin/bash", []string{"bash"}, os.Environ()) // does not return
|
|
}
|
|
case "req":
|
|
c := client()
|
|
access, err := c.GetAccess(ctx)
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
print(access)
|
|
}
|
|
os.Exit(0)
|
|
}
|
|
|
|
func client(opts ...apiclient.ClientOption) (c *clientv1.Client) {
|
|
var err error
|
|
if opts == nil {
|
|
opts, err = apiclient.ClientOptionsFromEnv()
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
}
|
|
apic := apiclient.NewClient(opts...)
|
|
//if socket, ok := apic.IsUnix(); ok {
|
|
// err = unveil(socket)
|
|
// if err != nil {
|
|
// exit(err)
|
|
// }
|
|
//}
|
|
c, err = clientv1.NewClient(apic)
|
|
if err != nil {
|
|
exit(err)
|
|
}
|
|
return
|
|
}
|
|
|
|
func print(tw core.TableWriter) {
|
|
if tw.Len() == 0 {
|
|
return
|
|
}
|
|
w := tabwriter.NewWriter(os.Stdout, 1, 0, 1, ' ', tabwriter.Debug)
|
|
fmt.Fprintln(w, tw.Fields())
|
|
for _, v := range tw.Values() {
|
|
fmt.Fprintln(w, v)
|
|
}
|
|
w.Flush()
|
|
}
|
|
|
|
func idFlags(desc string) (id string, err error) {
|
|
fs.StringVar(&id, "id", "", desc)
|
|
fs.Parse(os.Args[3:])
|
|
if id == "" {
|
|
err = errors.New("missing flag: id")
|
|
}
|
|
return
|
|
}
|
|
|
|
func loginFlags() (endpoint string, err error) {
|
|
fs.StringVar(&endpoint, "endpoint", "", "keyctl endpoint")
|
|
fs.Parse(os.Args[3:])
|
|
if endpoint == "" {
|
|
err = errors.New("missing flag: endpoint")
|
|
}
|
|
return
|
|
}
|