Command line client for Write.as https://write.as/apps/cli
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

139 rader
4.1 KiB

  1. package main
  2. import (
  3. "fmt"
  4. "os"
  5. "path/filepath"
  6. "strings"
  7. "github.com/writeas/writeas-cli/api"
  8. "github.com/writeas/writeas-cli/commands"
  9. "github.com/writeas/writeas-cli/config"
  10. "github.com/writeas/writeas-cli/executable"
  11. "github.com/writeas/writeas-cli/log"
  12. cli "gopkg.in/urfave/cli.v1"
  13. )
  14. func requireAuth(f cli.ActionFunc, action string) cli.ActionFunc {
  15. return func(c *cli.Context) error {
  16. // check for logged in users when host is provided without user
  17. if c.GlobalIsSet("host") && !c.GlobalIsSet("user") {
  18. // multiple users should display a list
  19. if num, users, err := usersLoggedIn(c); num > 1 && err == nil {
  20. return cli.NewExitError(fmt.Sprintf("Multiple logged in users, please use '-u' or '-user' to specify one of:\n%s", strings.Join(users, ", ")), 1)
  21. } else if num == 1 && err == nil {
  22. // single user found for host should be set as user flag so LoadUser can
  23. // succeed, and notify the client
  24. if err := c.GlobalSet("user", users[0]); err != nil {
  25. return cli.NewExitError(fmt.Sprintf("Failed to set user flag for only logged in user at host %s: %v", users[0], err), 1)
  26. }
  27. log.Info(c, "Host specified without user flag, using logged in user: %s\n", users[0])
  28. } else if err != nil {
  29. return cli.NewExitError(fmt.Sprintf("Failed to check for logged in users: %v", err), 1)
  30. }
  31. }
  32. u, err := config.LoadUser(c)
  33. if err != nil {
  34. return cli.NewExitError(fmt.Sprintf("Couldn't load user: %v", err), 1)
  35. }
  36. if u == nil {
  37. return cli.NewExitError("You must be authenticated to "+action+".\nLog in first with: "+executable.Name()+" auth <username>", 1)
  38. }
  39. return f(c)
  40. }
  41. }
  42. // usersLoggedIn checks for logged in users for the set host flag
  43. // it returns the number of users and a slice of usernames
  44. func usersLoggedIn(c *cli.Context) (int, []string, error) {
  45. path, err := config.UserHostDir(c)
  46. if err != nil {
  47. return 0, nil, err
  48. }
  49. dir, err := os.Open(path)
  50. if err != nil {
  51. return 0, nil, err
  52. }
  53. contents, err := dir.Readdir(0)
  54. if err != nil {
  55. return 0, nil, err
  56. }
  57. var names []string
  58. for _, file := range contents {
  59. if file.IsDir() {
  60. // stat user.json
  61. if _, err := os.Stat(filepath.Join(path, file.Name(), "user.json")); err == nil {
  62. names = append(names, file.Name())
  63. }
  64. }
  65. }
  66. return len(names), names, nil
  67. }
  68. func cmdAuth(c *cli.Context) error {
  69. err := commands.CmdAuth(c)
  70. if err != nil {
  71. return err
  72. }
  73. // Get the username from the command, just like commands.CmdAuth does
  74. username := c.Args().Get(0)
  75. // Update config if this is user's first auth
  76. cfg, err := config.LoadConfig(config.UserDataDir(c.App.ExtraInfo()["configDir"]))
  77. if err != nil {
  78. log.Errorln("Not saving config. Unable to load config: %s", err)
  79. return err
  80. }
  81. if cfg.Default.Host == "" && cfg.Default.User == "" {
  82. // This is user's first auth, so save defaults
  83. cfg.Default.Host = api.HostURL(c)
  84. cfg.Default.User = username
  85. err = config.SaveConfig(config.UserDataDir(c.App.ExtraInfo()["configDir"]), cfg)
  86. if err != nil {
  87. log.Errorln("Not saving config. Unable to save config: %s", err)
  88. return err
  89. }
  90. fmt.Printf("Set %s on %s as default account.\n", username, c.GlobalString("host"))
  91. }
  92. return nil
  93. }
  94. func cmdLogOut(c *cli.Context) error {
  95. err := commands.CmdLogOut(c)
  96. if err != nil {
  97. return err
  98. }
  99. // Remove this from config if it's the default account
  100. cfg, err := config.LoadConfig(config.UserDataDir(c.App.ExtraInfo()["configDir"]))
  101. if err != nil {
  102. log.Errorln("Not updating config. Unable to load: %s", err)
  103. return err
  104. }
  105. username, err := config.CurrentUser(c)
  106. if err != nil {
  107. log.Errorln("Not updating config. Unable to load current user: %s", err)
  108. return err
  109. }
  110. reqHost := api.HostURL(c)
  111. if reqHost == "" {
  112. // No --host given, so we're using the default host
  113. reqHost = cfg.Default.Host
  114. }
  115. if cfg.Default.Host == reqHost && cfg.Default.User == username {
  116. // We're logging out of default username + host, so remove from config file
  117. cfg.Default.Host = ""
  118. cfg.Default.User = ""
  119. err = config.SaveConfig(config.UserDataDir(c.App.ExtraInfo()["configDir"]), cfg)
  120. if err != nil {
  121. log.Errorln("Not updating config. Unable to save config: %s", err)
  122. return err
  123. }
  124. }
  125. return nil
  126. }