1package settings
2
3import (
4 "fmt"
5 "strconv"
6
7 "github.com/charmbracelet/soft-serve/cmd"
8 "github.com/charmbracelet/soft-serve/pkg/access"
9 "github.com/charmbracelet/soft-serve/pkg/backend"
10 "github.com/spf13/cobra"
11)
12
13var (
14 // Command returns a command that manages server settings.
15 Command = &cobra.Command{
16 Use: "settings",
17 Short: "Manage server settings",
18 PersistentPreRunE: cmd.InitBackendContext,
19 PersistentPostRunE: cmd.CloseDBContext,
20 }
21)
22
23func init() {
24 Command.AddCommand(
25 &cobra.Command{
26 Use: "allow-keyless [true|false]",
27 Short: "Set or get allow keyless access to repositories",
28 Args: cobra.RangeArgs(0, 1),
29 RunE: func(cmd *cobra.Command, args []string) error {
30 ctx := cmd.Context()
31 be := backend.FromContext(ctx)
32 switch len(args) {
33 case 0:
34 cmd.Println(be.AllowKeyless(ctx))
35 case 1:
36 v, _ := strconv.ParseBool(args[0])
37 if err := be.SetAllowKeyless(ctx, v); err != nil {
38 return err
39 }
40 }
41
42 return nil
43 },
44 },
45 )
46
47 als := []string{
48 access.NoAccess.String(),
49 access.ReadOnlyAccess.String(),
50 access.ReadWriteAccess.String(),
51 access.AdminAccess.String(),
52 }
53 Command.AddCommand(
54 &cobra.Command{
55 Use: "anon-access [ACCESS_LEVEL]",
56 Short: "Set or get the default access level for anonymous users",
57 Args: cobra.RangeArgs(0, 1),
58 ValidArgs: als,
59 RunE: func(cmd *cobra.Command, args []string) error {
60 ctx := cmd.Context()
61 be := backend.FromContext(ctx)
62 switch len(args) {
63 case 0:
64 cmd.Println(be.AnonAccess(ctx))
65 case 1:
66 al := access.ParseAccessLevel(args[0])
67 if al < 0 {
68 return fmt.Errorf("invalid access level: %s. Please choose one of the following: %s", args[0], als)
69 }
70 if err := be.SetAnonAccess(ctx, al); err != nil {
71 return err
72 }
73 }
74
75 return nil
76 },
77 },
78 )
79}