Command line client for Write.as https://write.as/apps/cli
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

199 líneas
6.0 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. } else if !c.GlobalIsSet("host") && !c.GlobalIsSet("user") {
  32. // check for global configured pair host/user
  33. cfg, err := config.LoadConfig(config.UserDataDir(c.App.ExtraInfo()["configDir"]))
  34. if err != nil {
  35. return cli.NewExitError(fmt.Sprintf("Failed to load config from file: %v", err), 1)
  36. // set flags if found
  37. }
  38. // set flags if both were found in config
  39. if cfg.Default.Host != "" && cfg.Default.User != "" {
  40. err = c.GlobalSet("host", cfg.Default.Host)
  41. if err != nil {
  42. return cli.NewExitError(fmt.Sprintf("Failed to set host from global config: %v", err), 1)
  43. }
  44. err = c.GlobalSet("user", cfg.Default.User)
  45. if err != nil {
  46. return cli.NewExitError(fmt.Sprintf("Failed to set user from global config: %v", err), 1)
  47. }
  48. } else {
  49. num, err := totalUsersLoggedIn(c)
  50. if err != nil {
  51. return cli.NewExitError(fmt.Sprintf("Failed to check for logged in users: %v", err), 1)
  52. } else if num > 0 {
  53. return cli.NewExitError("You are authenticated, but have no default user/host set. Supply -user and -host flags.", 1)
  54. }
  55. }
  56. }
  57. u, err := config.LoadUser(c)
  58. if err != nil {
  59. return cli.NewExitError(fmt.Sprintf("Couldn't load user: %v", err), 1)
  60. }
  61. if u == nil {
  62. return cli.NewExitError("You must be authenticated to "+action+".\nLog in first with: "+executable.Name()+" auth <username>", 1)
  63. }
  64. return f(c)
  65. }
  66. }
  67. // usersLoggedIn checks for logged in users for the set host flag
  68. // it returns the number of users and a slice of usernames
  69. func usersLoggedIn(c *cli.Context) (int, []string, error) {
  70. path, err := config.UserHostDir(c)
  71. if err != nil {
  72. return 0, nil, err
  73. }
  74. dir, err := os.Open(path)
  75. if err != nil {
  76. return 0, nil, err
  77. }
  78. contents, err := dir.Readdir(0)
  79. if err != nil {
  80. return 0, nil, err
  81. }
  82. var names []string
  83. for _, file := range contents {
  84. if file.IsDir() {
  85. // stat user.json
  86. if _, err := os.Stat(filepath.Join(path, file.Name(), "user.json")); err == nil {
  87. names = append(names, file.Name())
  88. }
  89. }
  90. }
  91. return len(names), names, nil
  92. }
  93. // totalUsersLoggedIn checks for logged in users for any host
  94. // it returns the number of users and an error if any
  95. func totalUsersLoggedIn(c *cli.Context) (int, error) {
  96. path := config.UserDataDir(c.App.ExtraInfo()["configDir"])
  97. dir, err := os.Open(path)
  98. if err != nil {
  99. return 0, err
  100. }
  101. contents, err := dir.Readdir(0)
  102. if err != nil {
  103. return 0, err
  104. }
  105. count := 0
  106. for _, file := range contents {
  107. if file.IsDir() {
  108. subDir, err := os.Open(filepath.Join(path, file.Name()))
  109. if err != nil {
  110. return 0, err
  111. }
  112. subContents, err := subDir.Readdir(0)
  113. if err != nil {
  114. return 0, err
  115. }
  116. for _, subFile := range subContents {
  117. if subFile.IsDir() {
  118. if _, err := os.Stat(filepath.Join(path, file.Name(), subFile.Name(), "user.json")); err == nil {
  119. count++
  120. }
  121. }
  122. }
  123. }
  124. }
  125. return count, nil
  126. }
  127. func cmdAuth(c *cli.Context) error {
  128. err := commands.CmdAuth(c)
  129. if err != nil {
  130. return err
  131. }
  132. // Get the username from the command, just like commands.CmdAuth does
  133. username := c.Args().Get(0)
  134. // Update config if this is user's first auth
  135. cfg, err := config.LoadConfig(config.UserDataDir(c.App.ExtraInfo()["configDir"]))
  136. if err != nil {
  137. log.Errorln("Not saving config. Unable to load config: %s", err)
  138. return err
  139. }
  140. if cfg.Default.Host == "" && cfg.Default.User == "" {
  141. // This is user's first auth, so save defaults
  142. cfg.Default.Host = api.HostURL(c)
  143. cfg.Default.User = username
  144. err = config.SaveConfig(config.UserDataDir(c.App.ExtraInfo()["configDir"]), cfg)
  145. if err != nil {
  146. log.Errorln("Not saving config. Unable to save config: %s", err)
  147. return err
  148. }
  149. fmt.Printf("Set %s on %s as default account.\n", username, c.GlobalString("host"))
  150. }
  151. return nil
  152. }
  153. func cmdLogOut(c *cli.Context) error {
  154. err := commands.CmdLogOut(c)
  155. if err != nil {
  156. return err
  157. }
  158. // Remove this from config if it's the default account
  159. cfg, err := config.LoadConfig(config.UserDataDir(c.App.ExtraInfo()["configDir"]))
  160. if err != nil {
  161. log.Errorln("Not updating config. Unable to load: %s", err)
  162. return err
  163. }
  164. username, err := config.CurrentUser(c)
  165. if err != nil {
  166. log.Errorln("Not updating config. Unable to load current user: %s", err)
  167. return err
  168. }
  169. reqHost := api.HostURL(c)
  170. if reqHost == "" {
  171. // No --host given, so we're using the default host
  172. reqHost = cfg.Default.Host
  173. }
  174. if cfg.Default.Host == reqHost && cfg.Default.User == username {
  175. // We're logging out of default username + host, so remove from config file
  176. cfg.Default.Host = ""
  177. cfg.Default.User = ""
  178. err = config.SaveConfig(config.UserDataDir(c.App.ExtraInfo()["configDir"]), cfg)
  179. if err != nil {
  180. log.Errorln("Not updating config. Unable to save config: %s", err)
  181. return err
  182. }
  183. }
  184. return nil
  185. }