Command line client for Write.as https://write.as/apps/cli
25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
4.1 KiB

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