github.com/keybase/client/go@v0.0.0-20241007131713-f10651d043c8/kbfs/kbpagesconfig/cmd_per_path.go (about)

     1  // Copyright 2018 Keybase Inc. All rights reserved.
     2  // Use of this source code is governed by a BSD
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"fmt"
     9  	"os"
    10  	"text/tabwriter"
    11  
    12  	"github.com/urfave/cli"
    13  )
    14  
    15  var perPathClearCmd = cli.Command{
    16  	Name:      "clear",
    17  	Usage:     "clear the PerPathConfig for the given path(s)",
    18  	UsageText: "clear <path> [path ...]",
    19  	Action: func(c *cli.Context) {
    20  		if len(c.Args()) < 1 {
    21  			fmt.Fprintln(os.Stderr, "need at least 1 arg")
    22  			os.Exit(1)
    23  		}
    24  		editor, err := newKBPConfigEditor(c.GlobalString("dir"))
    25  		if err != nil {
    26  			fmt.Fprintf(os.Stderr,
    27  				"creating config editor error: %v\n", err)
    28  			os.Exit(1)
    29  		}
    30  		for _, p := range c.Args() {
    31  			editor.clearPerPathConfig(p)
    32  		}
    33  		if err := editor.confirmAndWrite(); err != nil {
    34  			fmt.Fprintf(os.Stderr, "writing new config error: %v\n", err)
    35  			os.Exit(1)
    36  		}
    37  	},
    38  }
    39  
    40  var perPathUnsetUserPermissionsCmd = cli.Command{
    41  	Name: "unset-user",
    42  	Usage: "remove a user from the PerPathConfig(s) additional " +
    43  		"permissions of the given path(s). This essentially reverts the " +
    44  		"user's effective permission back to anonymous.",
    45  	UsageText: "unset-user <username> <path> [path ...]",
    46  	Action: func(c *cli.Context) {
    47  		if len(c.Args()) < 2 {
    48  			fmt.Fprintln(os.Stderr, "need at least 2 args")
    49  			os.Exit(1)
    50  		}
    51  		editor, err := newKBPConfigEditor(c.GlobalString("dir"))
    52  		if err != nil {
    53  			fmt.Fprintf(os.Stderr,
    54  				"creating config editor error: %v\n", err)
    55  			os.Exit(1)
    56  		}
    57  		for _, p := range c.Args()[1:] {
    58  			editor.removeUserPermissionsFromPerPathConfig(c.Args()[0], p)
    59  		}
    60  		if err := editor.confirmAndWrite(); err != nil {
    61  			fmt.Fprintf(os.Stderr, "writing new config error: %v\n", err)
    62  			os.Exit(1)
    63  		}
    64  	},
    65  }
    66  
    67  var perPathGetPermissionCmd = cli.Command{
    68  	Name:      "get-permission",
    69  	Usage:     "get permissions for a user on the given path(s)",
    70  	UsageText: "get-permission <username> <path> [path ...]",
    71  	Action: func(c *cli.Context) {
    72  		if len(c.Args()) < 2 {
    73  			fmt.Fprintln(os.Stderr, "need at least 2 args")
    74  			os.Exit(1)
    75  		}
    76  		editor, err := newKBPConfigEditor(c.GlobalString("dir"))
    77  		if err != nil {
    78  			fmt.Fprintf(os.Stderr,
    79  				"creating config editor error: %v\n", err)
    80  			os.Exit(1)
    81  		}
    82  		writer := tabwriter.NewWriter(os.Stdout, 0, 4, 1, '\t', 0)
    83  		fmt.Fprintln(writer, "read\tlist\tpath")
    84  		for _, p := range c.Args()[1:] {
    85  			read, list, err := editor.getUserPermissionsOnPath(c.Args()[0], p)
    86  			if err != nil {
    87  				fmt.Fprintf(os.Stderr, "getting permissions for "+
    88  					"%q on %q error: %v\n", c.Args()[0], p, err)
    89  				os.Exit(1)
    90  			}
    91  			fmt.Fprintf(writer, "%t\t%t\t%s\n", read, list, p)
    92  		}
    93  		if err := writer.Flush(); err != nil {
    94  			fmt.Fprintf(os.Stderr, "flushing tabwriter error: %v\n", err)
    95  			os.Exit(1)
    96  		}
    97  	},
    98  }
    99  
   100  var perPathSetPermissionDefaultCmd = cli.Command{
   101  	Name: "default",
   102  	Usage: "set default permission(s) that all users are granted, " +
   103  		"for the given path(s)",
   104  	UsageText: "default <read|list|read,list> <path> [path ...]",
   105  	Action: func(c *cli.Context) {
   106  		if len(c.Args()) < 2 {
   107  			fmt.Fprintln(os.Stderr, "need at least 2 args")
   108  			os.Exit(1)
   109  		}
   110  		editor, err := newKBPConfigEditor(c.GlobalString("dir"))
   111  		if err != nil {
   112  			fmt.Fprintf(os.Stderr,
   113  				"creating config editor error: %v\n", err)
   114  			os.Exit(1)
   115  		}
   116  		for _, p := range c.Args()[1:] {
   117  			err := editor.setAnonymousPermission(c.Args()[0], p)
   118  			if err != nil {
   119  				fmt.Fprintf(os.Stderr,
   120  					"setting anonymous permission %q on %q error: %v\n",
   121  					c.Args()[0], p, err)
   122  				os.Exit(1)
   123  			}
   124  		}
   125  		if err := editor.confirmAndWrite(); err != nil {
   126  			fmt.Fprintf(os.Stderr, "writing new config error: %v\n", err)
   127  			os.Exit(1)
   128  		}
   129  	},
   130  }
   131  
   132  var perPathSetPermissionAdditionalCmd = cli.Command{
   133  	Name: "additional",
   134  	Usage: "set additional permission(s) that <username> are granted on " +
   135  		"top of default ones on the given path(s) ",
   136  	UsageText: "additional <username> <read|list|read,list> <path> [path ...]",
   137  	Action: func(c *cli.Context) {
   138  		if len(c.Args()) < 3 {
   139  			fmt.Fprintln(os.Stderr, "need at least 3 args")
   140  			os.Exit(1)
   141  		}
   142  		editor, err := newKBPConfigEditor(c.GlobalString("dir"))
   143  		if err != nil {
   144  			fmt.Fprintf(os.Stderr,
   145  				"creating config editor error: %v\n", err)
   146  			os.Exit(1)
   147  		}
   148  		for _, p := range c.Args()[2:] {
   149  			err := editor.setAdditionalPermission(c.Args()[0], c.Args()[1], p)
   150  			if err != nil {
   151  				fmt.Fprintf(os.Stderr,
   152  					"setting additional permission(s) %q for username "+
   153  						"%q on %q error: %v\n",
   154  					c.Args()[1], c.Args()[0], p, err)
   155  				os.Exit(1)
   156  			}
   157  		}
   158  		if err := editor.confirmAndWrite(); err != nil {
   159  			fmt.Fprintf(os.Stderr, "writing new config error: %v\n", err)
   160  			os.Exit(1)
   161  		}
   162  	},
   163  }
   164  
   165  var perPathSetPermissionCmd = cli.Command{
   166  	Name:      "set-permission",
   167  	Usage:     "set default or additional permissions on path(s)",
   168  	UsageText: "set-permission <default|additional> [args]",
   169  	Subcommands: []cli.Command{
   170  		perPathSetPermissionDefaultCmd,
   171  		perPathSetPermissionAdditionalCmd,
   172  	},
   173  }
   174  
   175  // This isn't supported by kbpagesd at this time.
   176  const customPagesEnabled = false
   177  
   178  func getPerPathSetCmdUsageText() string {
   179  	customPage := ""
   180  	if customPagesEnabled {
   181  		customPage = "\n   set <403|404> <path_relative_to_site_root> <path> [path ...]"
   182  	}
   183  	return "set Access-Control-Allow-Origin <''|'*'> <path> [path ...]" + customPage
   184  }
   185  
   186  var perPathSetCmd = cli.Command{
   187  	Name:      "set",
   188  	Usage:     "configure a parameter on path(s)",
   189  	UsageText: getPerPathSetCmdUsageText(),
   190  	Action: func(c *cli.Context) {
   191  		if len(c.Args()) < 3 {
   192  			fmt.Fprintln(os.Stderr, "need at least 3 args")
   193  			os.Exit(1)
   194  		}
   195  		editor, err := newKBPConfigEditor(c.GlobalString("dir"))
   196  		if err != nil {
   197  			fmt.Fprintf(os.Stderr,
   198  				"creating config editor error: %v\n", err)
   199  			os.Exit(1)
   200  		}
   201  		switch {
   202  		case c.Args()[0] == "Access-Control-Allow-Origin":
   203  			for _, p := range c.Args()[2:] {
   204  				err := editor.setAccessControlAllowOrigin(p, c.Args()[1])
   205  				if err != nil {
   206  					fmt.Fprintf(os.Stderr,
   207  						"setting Access-Control-Allow-Origin %q on %q error: %v\n",
   208  						c.Args()[1], p, err)
   209  					os.Exit(1)
   210  				}
   211  			}
   212  		case customPagesEnabled && c.Args()[0] == "403":
   213  			for _, p := range c.Args()[2:] {
   214  				err := editor.set403(p, c.Args()[1])
   215  				if err != nil {
   216  					fmt.Fprintf(os.Stderr,
   217  						"setting custom 403 page %q on %q error: %v\n",
   218  						c.Args()[1], p, err)
   219  					os.Exit(1)
   220  				}
   221  			}
   222  		case customPagesEnabled && c.Args()[0] == "404":
   223  			for _, p := range c.Args()[2:] {
   224  				err := editor.set404(p, c.Args()[1])
   225  				if err != nil {
   226  					fmt.Fprintf(os.Stderr,
   227  						"setting custom 404 page %q on %q error: %v\n",
   228  						c.Args()[1], p, err)
   229  					os.Exit(1)
   230  				}
   231  			}
   232  		default:
   233  			fmt.Fprintf(os.Stderr, "unknown parameter: %s\n", c.Args()[0])
   234  			os.Exit(1)
   235  		}
   236  		if err := editor.confirmAndWrite(); err != nil {
   237  			fmt.Fprintf(os.Stderr, "writing new config error: %v\n", err)
   238  			os.Exit(1)
   239  		}
   240  	},
   241  }
   242  
   243  var perPathCmd = cli.Command{
   244  	Name:      "per-path",
   245  	Usage:     "make changes to the 'per_path_configs' section of the config",
   246  	UsageText: "per-path <set|clear|remove|get> [args]",
   247  	Subcommands: []cli.Command{
   248  		perPathSetPermissionCmd,
   249  		perPathClearCmd,
   250  		perPathUnsetUserPermissionsCmd,
   251  		perPathGetPermissionCmd,
   252  		perPathSetCmd,
   253  	},
   254  }