Files
GitOcean-Old/internal/app/cli_auth.go
T
2026-06-08 13:34:53 -05:00

105 lines
2.8 KiB
Go

package app
import (
"context"
"errors"
"flag"
"fmt"
"net/http"
"os"
"os/exec"
"strings"
"time"
)
func cliRegister(args []string) error {
fs := flag.NewFlagSet("register", flag.ExitOnError)
server := fs.String("server", envServer(), "server URL")
if err := fs.Parse(args); err != nil {
return err
}
email := prompt("Email: ")
username := prompt("Username: ")
password := prompt("Password: ")
var out User
if err := apiRequest(context.Background(), *server, http.MethodPost, "/api/register", "", map[string]string{"email": email, "username": username, "password": password}, &out); err != nil {
return err
}
fmt.Printf("Registered %s <%s>\n", out.Username, out.Email)
if out.IsAdmin {
fmt.Println("This is the first user, so it is an admin account.")
}
return nil
}
func cliLogin(args []string) error {
fs := flag.NewFlagSet("login", flag.ExitOnError)
server := fs.String("server", envServer(), "server URL")
if err := fs.Parse(args); err != nil {
return err
}
login := prompt("Email or username: ")
password := prompt("Password: ")
var out struct {
User User `json:"user"`
Token string `json:"token"`
ExpiresAt time.Time `json:"expires_at"`
}
if err := apiRequest(context.Background(), *server, http.MethodPost, "/api/login", "", map[string]string{"login": login, "password": password}, &out); err != nil {
return err
}
cfg := Config{Server: strings.TrimRight(*server, "/"), Username: out.User.Username, Token: out.Token, ExpiresAt: out.ExpiresAt}
if err := saveConfig(cfg); err != nil {
return err
}
approveGitCredential(cfg)
fmt.Printf("logged in as %s; token expires %s\n", cfg.Username, cfg.ExpiresAt.Format(time.RFC3339))
return nil
}
func cliLogout(args []string) error {
cfg, err := loadConfig()
if err != nil {
return err
}
_ = apiRequest(context.Background(), cfg.Server, http.MethodPost, "/api/logout", cfg.Token, nil, nil)
_ = os.Remove(configPath())
fmt.Println("logged out")
return nil
}
func cliWhoami(args []string) error {
cfg, err := loadConfig()
if err != nil {
return err
}
var user User
if err := apiRequest(context.Background(), cfg.Server, http.MethodGet, "/api/me", cfg.Token, nil, &user); err != nil {
return err
}
fmt.Printf("Username: %s\n", user.Username)
fmt.Printf("Email: %s\n", user.Email)
fmt.Printf("Admin: %v\n", user.IsAdmin)
return nil
}
func cliClone(args []string) error {
if len(args) != 1 {
return errors.New("usage: gitocean clone OWNER/REPO")
}
server := envServer()
if cfg, err := loadConfig(); err == nil && cfg.Server != "" {
server = cfg.Server
}
owner, repo, err := splitOwnerRepo(args[0])
if err != nil {
return err
}
remote := fmt.Sprintf("%s/%s/%s.git", strings.TrimRight(server, "/"), owner, repo)
cmd := exec.Command("git", "clone", remote)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin
return cmd.Run()
}