Command line client for Write.as https://write.as/apps/cli
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
3.2 KiB

  1. package config
  2. import (
  3. "encoding/json"
  4. "io/ioutil"
  5. "path/filepath"
  6. writeas "github.com/writeas/go-writeas/v2"
  7. "github.com/writeas/writeas-cli/fileutils"
  8. "gopkg.in/urfave/cli.v1"
  9. )
  10. func LoadUser(c *cli.Context) (*writeas.AuthUser, error) {
  11. dir, err := userHostDir(c)
  12. if err != nil {
  13. return nil, err
  14. }
  15. DirMustExist(dir)
  16. username, err := CurrentUser(c)
  17. if err != nil {
  18. return nil, err
  19. }
  20. if username == "user" {
  21. username = ""
  22. }
  23. fname := filepath.Join(dir, username, "user.json")
  24. userJSON, err := ioutil.ReadFile(fname)
  25. if err != nil {
  26. if !fileutils.Exists(fname) {
  27. // Don't return a file-not-found error
  28. return nil, nil
  29. }
  30. return nil, err
  31. }
  32. // Parse JSON file
  33. u := &writeas.AuthUser{}
  34. err = json.Unmarshal(userJSON, u)
  35. if err != nil {
  36. return nil, err
  37. }
  38. return u, nil
  39. }
  40. func DeleteUser(c *cli.Context) error {
  41. dir, err := userHostDir(c)
  42. if err != nil {
  43. return err
  44. }
  45. username, err := CurrentUser(c)
  46. if err != nil {
  47. return err
  48. }
  49. if username == "user" {
  50. username = ""
  51. }
  52. // Delete user data
  53. err = fileutils.DeleteFile(filepath.Join(dir, username, "user.json"))
  54. if err != nil {
  55. return err
  56. }
  57. // Do additional cleanup in wf-cli
  58. if c.App.Name == "wf" {
  59. // Delete user dir if it's empty
  60. userEmpty, err := fileutils.IsEmpty(filepath.Join(dir, username))
  61. if err != nil {
  62. return err
  63. }
  64. if !userEmpty {
  65. return nil
  66. }
  67. err = fileutils.DeleteFile(filepath.Join(dir, username))
  68. if err != nil {
  69. return err
  70. }
  71. // Delete host dir if it's empty
  72. hostEmpty, err := fileutils.IsEmpty(dir)
  73. if err != nil {
  74. return err
  75. }
  76. if !hostEmpty {
  77. return nil
  78. }
  79. err = fileutils.DeleteFile(dir)
  80. if err != nil {
  81. return err
  82. }
  83. }
  84. return nil
  85. }
  86. func SaveUser(c *cli.Context, u *writeas.AuthUser) error {
  87. // Marshal struct into pretty-printed JSON
  88. userJSON, err := json.MarshalIndent(u, "", " ")
  89. if err != nil {
  90. return err
  91. }
  92. dir, err := userHostDir(c)
  93. if err != nil {
  94. return err
  95. }
  96. // Save file
  97. username, err := CurrentUser(c)
  98. if err != nil {
  99. return err
  100. }
  101. if username != "user" {
  102. dir = filepath.Join(dir, u.User.Username)
  103. }
  104. DirMustExist(dir)
  105. err = ioutil.WriteFile(filepath.Join(dir, "user.json"), userJSON, 0600)
  106. if err != nil {
  107. return err
  108. }
  109. return nil
  110. }
  111. // userHostDir returns the path to the user data directory with the host based
  112. // subpath if the host flag is set
  113. func userHostDir(c *cli.Context) (string, error) {
  114. dataDir := UserDataDir(c.App.ExtraInfo()["configDir"])
  115. hostDir, err := HostDirectory(c)
  116. if err != nil {
  117. return "", err
  118. }
  119. return filepath.Join(dataDir, hostDir), nil
  120. }
  121. // CurrentUser returns the username of the user taking action in the current
  122. // cli.Context.
  123. func CurrentUser(c *cli.Context) (string, error) {
  124. // Load host-level config, if host flag is set
  125. hostDir, err := userHostDir(c)
  126. if err != nil {
  127. return "", err
  128. }
  129. cfg, err := LoadConfig(hostDir)
  130. if err != nil {
  131. return "", err
  132. }
  133. if cfg.Default.User == "" {
  134. // Load app-level config
  135. cfg, err = LoadConfig(UserDataDir(c.App.ExtraInfo()["configDir"]))
  136. if err != nil {
  137. return "", err
  138. }
  139. }
  140. // Use user flag value
  141. if c.GlobalString("user") != "" {
  142. return c.GlobalString("user"), nil
  143. }
  144. return cfg.Default.User, nil
  145. }