auth.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package client
  2. /*
  3. Functions for reading and writing the auth token from the user's
  4. home directory.
  5. */
  6. import (
  7. "io/ioutil"
  8. "ngrok/log"
  9. "os"
  10. "os/user"
  11. "path"
  12. "sync"
  13. )
  14. var (
  15. once sync.Once
  16. currentAuthToken string
  17. authTokenFile string
  18. )
  19. func initAuth() {
  20. user, err := user.Current()
  21. // user.Current() does not work on linux when cross compilling because
  22. // it requires CGO; use os.Getenv("HOME") hack until we compile natively
  23. homeDir := os.Getenv("HOME")
  24. if err != nil {
  25. log.Warn("Failed to get user's home directory: %s", err.Error())
  26. } else {
  27. homeDir = user.HomeDir
  28. }
  29. authTokenFile = path.Join(homeDir, ".ngrok")
  30. log.Debug("Reading auth token from file %s", authTokenFile)
  31. tokenBytes, err := ioutil.ReadFile(authTokenFile)
  32. if err == nil {
  33. currentAuthToken = string(tokenBytes)
  34. } else {
  35. log.Warn("Failed to read ~/.ngrok for auth token: %s", err.Error())
  36. }
  37. }
  38. // Load the auth token from file
  39. func LoadAuthToken() string {
  40. once.Do(initAuth)
  41. return currentAuthToken
  42. }
  43. // Save the auth token to file
  44. func SaveAuthToken(token string) {
  45. if token == "" || token == LoadAuthToken() || authTokenFile == "" {
  46. return
  47. }
  48. perms := os.FileMode(0644)
  49. err := ioutil.WriteFile(authTokenFile, []byte(token), perms)
  50. if err != nil {
  51. log.Warn("Failed to write auth token to file %s: %v", authTokenFile, err.Error())
  52. }
  53. }