auth_service_test.go 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. package apiclient
  2. import (
  3. "bytes"
  4. "context"
  5. "fmt"
  6. "net/http"
  7. "net/url"
  8. "testing"
  9. "github.com/crowdsecurity/crowdsec/pkg/cwversion"
  10. "github.com/crowdsecurity/crowdsec/pkg/models"
  11. log "github.com/sirupsen/logrus"
  12. "github.com/stretchr/testify/assert"
  13. )
  14. func TestWatcherAuth(t *testing.T) {
  15. log.SetLevel(log.DebugLevel)
  16. mux, urlx, teardown := setup()
  17. defer teardown()
  18. //body: models.WatcherRegistrationRequest{MachineID: &config.MachineID, Password: &config.Password}
  19. mux.HandleFunc("/watchers/login", func(w http.ResponseWriter, r *http.Request) {
  20. testMethod(t, r, "POST")
  21. buf := new(bytes.Buffer)
  22. _, _ = buf.ReadFrom(r.Body)
  23. newStr := buf.String()
  24. log.Printf("--> %s", newStr)
  25. if newStr == `{"machine_id":"test_login","password":"test_password","scenarios":["crowdsecurity/test"]}
  26. ` {
  27. log.Printf("ok cool")
  28. w.WriteHeader(http.StatusOK)
  29. fmt.Fprintf(w, `{"code":200,"expire":"2029-11-30T14:14:24+01:00","token":"toto"}`)
  30. } else {
  31. w.WriteHeader(http.StatusForbidden)
  32. log.Printf("badbad")
  33. fmt.Fprintf(w, `{"message":"access forbidden"}`)
  34. }
  35. })
  36. log.Printf("URL is %s", urlx)
  37. apiURL, err := url.Parse(urlx + "/")
  38. if err != nil {
  39. log.Fatalf("parsing api url: %s", apiURL)
  40. }
  41. //ok auth
  42. mycfg := &Config{
  43. MachineID: "test_login",
  44. Password: "test_password",
  45. UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
  46. URL: apiURL,
  47. VersionPrefix: "v1",
  48. Scenarios: []string{"crowdsecurity/test"},
  49. }
  50. client, err := NewClient(mycfg)
  51. if err != nil {
  52. log.Fatalf("new api client: %s", err)
  53. }
  54. _, err = client.Auth.AuthenticateWatcher(context.Background(), models.WatcherAuthRequest{
  55. MachineID: &mycfg.MachineID,
  56. Password: &mycfg.Password,
  57. Scenarios: mycfg.Scenarios,
  58. })
  59. if err != nil {
  60. t.Fatalf("unexpect auth err 0: %s", err)
  61. }
  62. //bad auth
  63. mycfg = &Config{
  64. MachineID: "BADtest_login",
  65. Password: "BADtest_password",
  66. UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
  67. URL: apiURL,
  68. VersionPrefix: "v1",
  69. Scenarios: []string{"crowdsecurity/test"},
  70. }
  71. client, err = NewClient(mycfg)
  72. if err != nil {
  73. log.Fatalf("new api client: %s", err)
  74. }
  75. _, err = client.Auth.AuthenticateWatcher(context.Background(), models.WatcherAuthRequest{
  76. MachineID: &mycfg.MachineID,
  77. Password: &mycfg.Password,
  78. })
  79. assert.Contains(t, err.Error(), "API error: access forbidden")
  80. }
  81. func TestWatcherRegister(t *testing.T) {
  82. log.SetLevel(log.DebugLevel)
  83. mux, urlx, teardown := setup()
  84. defer teardown()
  85. //body: models.WatcherRegistrationRequest{MachineID: &config.MachineID, Password: &config.Password}
  86. mux.HandleFunc("/watchers", func(w http.ResponseWriter, r *http.Request) {
  87. testMethod(t, r, "POST")
  88. buf := new(bytes.Buffer)
  89. _, _ = buf.ReadFrom(r.Body)
  90. newStr := buf.String()
  91. assert.Equal(t, newStr, `{"machine_id":"test_login","password":"test_password"}
  92. `)
  93. w.WriteHeader(http.StatusOK)
  94. })
  95. log.Printf("URL is %s", urlx)
  96. apiURL, err := url.Parse(urlx + "/")
  97. if err != nil {
  98. log.Fatalf("parsing api url: %s", apiURL)
  99. }
  100. client, err := RegisterClient(&Config{
  101. MachineID: "test_login",
  102. Password: "test_password",
  103. UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
  104. URL: apiURL,
  105. VersionPrefix: "v1",
  106. }, &http.Client{})
  107. if err != nil {
  108. t.Fatalf("while registering client : %s", err)
  109. }
  110. log.Printf("->%T", client)
  111. }
  112. func TestWatcherUnregister(t *testing.T) {
  113. log.SetLevel(log.DebugLevel)
  114. mux, urlx, teardown := setup()
  115. defer teardown()
  116. //body: models.WatcherRegistrationRequest{MachineID: &config.MachineID, Password: &config.Password}
  117. mux.HandleFunc("/watchers", func(w http.ResponseWriter, r *http.Request) {
  118. testMethod(t, r, "DELETE")
  119. assert.Equal(t, r.ContentLength, int64(0))
  120. w.WriteHeader(http.StatusOK)
  121. })
  122. mux.HandleFunc("/watchers/login", func(w http.ResponseWriter, r *http.Request) {
  123. testMethod(t, r, "POST")
  124. buf := new(bytes.Buffer)
  125. _, _ = buf.ReadFrom(r.Body)
  126. newStr := buf.String()
  127. if newStr == `{"machine_id":"test_login","password":"test_password","scenarios":["crowdsecurity/test"]}
  128. ` {
  129. w.WriteHeader(http.StatusOK)
  130. fmt.Fprintf(w, `{"code":200,"expire":"2029-11-30T14:14:24+01:00","token":"toto"}`)
  131. } else {
  132. w.WriteHeader(http.StatusForbidden)
  133. fmt.Fprintf(w, `{"message":"access forbidden"}`)
  134. }
  135. })
  136. log.Printf("URL is %s", urlx)
  137. apiURL, err := url.Parse(urlx + "/")
  138. if err != nil {
  139. log.Fatalf("parsing api url: %s", apiURL)
  140. }
  141. mycfg := &Config{
  142. MachineID: "test_login",
  143. Password: "test_password",
  144. UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
  145. URL: apiURL,
  146. VersionPrefix: "v1",
  147. Scenarios: []string{"crowdsecurity/test"},
  148. }
  149. client, err := NewClient(mycfg)
  150. if err != nil {
  151. log.Fatalf("new api client: %s", err)
  152. }
  153. _, err = client.Auth.UnregisterWatcher(context.Background())
  154. if err != nil {
  155. t.Fatalf("while registering client : %s", err)
  156. }
  157. log.Printf("->%T", client)
  158. }
  159. func TestWatcherEnroll(t *testing.T) {
  160. log.SetLevel(log.DebugLevel)
  161. mux, urlx, teardown := setup()
  162. defer teardown()
  163. mux.HandleFunc("/watchers/enroll", func(w http.ResponseWriter, r *http.Request) {
  164. testMethod(t, r, "POST")
  165. buf := new(bytes.Buffer)
  166. _, _ = buf.ReadFrom(r.Body)
  167. newStr := buf.String()
  168. log.Debugf("body -> %s", newStr)
  169. if newStr == `{"attachment_key":"goodkey","name":"","tags":[],"overwrite":false}
  170. ` {
  171. log.Print("good key")
  172. w.WriteHeader(http.StatusOK)
  173. fmt.Fprintf(w, `{"statusCode": 200, "message": "OK"}`)
  174. } else {
  175. log.Print("bad key")
  176. w.WriteHeader(http.StatusForbidden)
  177. fmt.Fprintf(w, `{"message":"the attachment key provided is not valid"}`)
  178. }
  179. })
  180. mux.HandleFunc("/watchers/login", func(w http.ResponseWriter, r *http.Request) {
  181. testMethod(t, r, "POST")
  182. w.WriteHeader(http.StatusOK)
  183. fmt.Fprintf(w, `{"code":200,"expire":"2029-11-30T14:14:24+01:00","token":"toto"}`)
  184. })
  185. log.Printf("URL is %s", urlx)
  186. apiURL, err := url.Parse(urlx + "/")
  187. if err != nil {
  188. log.Fatalf("parsing api url: %s", apiURL)
  189. }
  190. mycfg := &Config{
  191. MachineID: "test_login",
  192. Password: "test_password",
  193. UserAgent: fmt.Sprintf("crowdsec/%s", cwversion.VersionStr()),
  194. URL: apiURL,
  195. VersionPrefix: "v1",
  196. Scenarios: []string{"crowdsecurity/test"},
  197. }
  198. client, err := NewClient(mycfg)
  199. if err != nil {
  200. log.Fatalf("new api client: %s", err)
  201. }
  202. _, err = client.Auth.EnrollWatcher(context.Background(), "goodkey", "", []string{}, false)
  203. if err != nil {
  204. t.Fatalf("unexpect enroll err: %s", err)
  205. }
  206. _, err = client.Auth.EnrollWatcher(context.Background(), "badkey", "", []string{}, false)
  207. assert.Contains(t, err.Error(), "the attachment key provided is not valid")
  208. }