alerts_test.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. package apiserver
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "io/ioutil"
  6. "net/http"
  7. "net/http/httptest"
  8. "strings"
  9. "testing"
  10. "time"
  11. "github.com/crowdsecurity/crowdsec/pkg/models"
  12. "github.com/gin-gonic/gin"
  13. log "github.com/sirupsen/logrus"
  14. "github.com/stretchr/testify/assert"
  15. )
  16. func InitMachineTest() (*gin.Engine, models.WatcherAuthResponse, error) {
  17. router, err := NewAPITest()
  18. if err != nil {
  19. return nil, models.WatcherAuthResponse{}, fmt.Errorf("unable to run local API: %s", err)
  20. }
  21. body, err := CreateTestMachine(router)
  22. if err != nil {
  23. return nil, models.WatcherAuthResponse{}, fmt.Errorf("%s", err.Error())
  24. }
  25. err = ValidateMachine("test")
  26. if err != nil {
  27. log.Fatalln(err.Error())
  28. }
  29. w := httptest.NewRecorder()
  30. req, _ := http.NewRequest("POST", "/v1/watchers/login", strings.NewReader(body))
  31. req.Header.Add("User-Agent", UserAgent)
  32. router.ServeHTTP(w, req)
  33. loginResp := models.WatcherAuthResponse{}
  34. err = json.NewDecoder(w.Body).Decode(&loginResp)
  35. if err != nil {
  36. log.Fatalln(err.Error())
  37. }
  38. return router, loginResp, nil
  39. }
  40. func TestSimulatedAlert(t *testing.T) {
  41. router, loginResp, err := InitMachineTest()
  42. if err != nil {
  43. log.Fatalln(err.Error())
  44. }
  45. alertContentBytes, err := ioutil.ReadFile("./tests/alert_minibulk+simul.json")
  46. if err != nil {
  47. log.Fatal(err)
  48. }
  49. alertContent := string(alertContentBytes)
  50. w := httptest.NewRecorder()
  51. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  52. req.Header.Add("User-Agent", UserAgent)
  53. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  54. router.ServeHTTP(w, req)
  55. //exclude decision in simulation mode
  56. w = httptest.NewRecorder()
  57. req, _ = http.NewRequest("GET", "/v1/alerts?simulated=false", strings.NewReader(alertContent))
  58. req.Header.Add("User-Agent", UserAgent)
  59. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  60. router.ServeHTTP(w, req)
  61. assert.Equal(t, 200, w.Code)
  62. assert.Contains(t, w.Body.String(), `"message":"Ip 91.121.79.178 performed crowdsecurity/ssh-bf (6 events over `)
  63. assert.NotContains(t, w.Body.String(), `"message":"Ip 91.121.79.179 performed crowdsecurity/ssh-bf (6 events over `)
  64. //include decision in simulation mode
  65. w = httptest.NewRecorder()
  66. req, _ = http.NewRequest("GET", "/v1/alerts?simulated=true", strings.NewReader(alertContent))
  67. req.Header.Add("User-Agent", UserAgent)
  68. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  69. router.ServeHTTP(w, req)
  70. assert.Equal(t, 200, w.Code)
  71. assert.Contains(t, w.Body.String(), `"message":"Ip 91.121.79.178 performed crowdsecurity/ssh-bf (6 events over `)
  72. assert.Contains(t, w.Body.String(), `"message":"Ip 91.121.79.179 performed crowdsecurity/ssh-bf (6 events over `)
  73. }
  74. func TestCreateAlert(t *testing.T) {
  75. router, loginResp, err := InitMachineTest()
  76. if err != nil {
  77. log.Fatalln(err.Error())
  78. }
  79. // Create Alert with invalid format
  80. w := httptest.NewRecorder()
  81. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader("test"))
  82. req.Header.Add("User-Agent", UserAgent)
  83. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  84. router.ServeHTTP(w, req)
  85. assert.Equal(t, 400, w.Code)
  86. assert.Equal(t, "{\"message\":\"invalid character 'e' in literal true (expecting 'r')\"}", w.Body.String())
  87. // Create Alert with invalid input
  88. alertContentBytes, err := ioutil.ReadFile("./tests/invalidAlert_sample.json")
  89. if err != nil {
  90. log.Fatal(err)
  91. }
  92. alertContent := string(alertContentBytes)
  93. w = httptest.NewRecorder()
  94. req, _ = http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  95. req.Header.Add("User-Agent", UserAgent)
  96. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  97. router.ServeHTTP(w, req)
  98. assert.Equal(t, 500, w.Code)
  99. assert.Equal(t, "{\"message\":\"validation failure list:\\nscenario in body is required\\nscenario_hash in body is required\\nscenario_version in body is required\\nsimulated in body is required\\nsource in body is required\"}", w.Body.String())
  100. // Create Valid Alert
  101. alertContentBytes, err = ioutil.ReadFile("./tests/alert_sample.json")
  102. if err != nil {
  103. log.Fatal(err)
  104. }
  105. alertContent = string(alertContentBytes)
  106. w = httptest.NewRecorder()
  107. req, _ = http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  108. req.Header.Add("User-Agent", UserAgent)
  109. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  110. router.ServeHTTP(w, req)
  111. assert.Equal(t, 201, w.Code)
  112. assert.Equal(t, "[\"1\"]", w.Body.String())
  113. }
  114. func TestAlertListFilters(t *testing.T) {
  115. router, loginResp, err := InitMachineTest()
  116. if err != nil {
  117. log.Fatalln(err.Error())
  118. }
  119. alertContentBytes, err := ioutil.ReadFile("./tests/alert_ssh-bf.json")
  120. if err != nil {
  121. log.Fatal(err)
  122. }
  123. alerts := make([]*models.Alert, 0)
  124. if err := json.Unmarshal(alertContentBytes, &alerts); err != nil {
  125. log.Fatal(err)
  126. }
  127. for _, alert := range alerts {
  128. *alert.StartAt = time.Now().Format(time.RFC3339)
  129. *alert.StopAt = time.Now().Format(time.RFC3339)
  130. }
  131. alertContent, err := json.Marshal(alerts)
  132. if err != nil {
  133. log.Fatal(err)
  134. }
  135. //create one alert
  136. w := httptest.NewRecorder()
  137. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader(string(alertContent)))
  138. req.Header.Add("User-Agent", UserAgent)
  139. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  140. router.ServeHTTP(w, req)
  141. //bad filter
  142. w = httptest.NewRecorder()
  143. req, _ = http.NewRequest("GET", "/v1/alerts?test=test", strings.NewReader(string(alertContent)))
  144. req.Header.Add("User-Agent", UserAgent)
  145. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  146. router.ServeHTTP(w, req)
  147. assert.Equal(t, 500, w.Code)
  148. assert.Equal(t, "{\"message\":\"Filter parameter 'test' is unknown (=test): invalid filter\"}", w.Body.String())
  149. //get without filters
  150. w = httptest.NewRecorder()
  151. req, _ = http.NewRequest("GET", "/v1/alerts", nil)
  152. req.Header.Add("User-Agent", UserAgent)
  153. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  154. router.ServeHTTP(w, req)
  155. assert.Equal(t, 200, w.Code)
  156. //check alert and decision
  157. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  158. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"start_ip":1534676931,"type":"ban","value":"91.121.79.195"`)
  159. //test decision_type filter (ok)
  160. w = httptest.NewRecorder()
  161. req, _ = http.NewRequest("GET", "/v1/alerts?decision_type=ban", nil)
  162. req.Header.Add("User-Agent", UserAgent)
  163. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  164. router.ServeHTTP(w, req)
  165. assert.Equal(t, 200, w.Code)
  166. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  167. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"start_ip":1534676931,"type":"ban","value":"91.121.79.195"`)
  168. //test decision_type filter (bad value)
  169. w = httptest.NewRecorder()
  170. req, _ = http.NewRequest("GET", "/v1/alerts?decision_type=ratata", nil)
  171. req.Header.Add("User-Agent", UserAgent)
  172. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  173. router.ServeHTTP(w, req)
  174. assert.Equal(t, 200, w.Code)
  175. assert.Equal(t, "null", w.Body.String())
  176. //test scope (ok)
  177. w = httptest.NewRecorder()
  178. req, _ = http.NewRequest("GET", "/v1/alerts?scope=Ip", nil)
  179. req.Header.Add("User-Agent", UserAgent)
  180. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  181. router.ServeHTTP(w, req)
  182. assert.Equal(t, 200, w.Code)
  183. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  184. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"start_ip":1534676931,"type":"ban","value":"91.121.79.195"`)
  185. //test scope (bad value)
  186. w = httptest.NewRecorder()
  187. req, _ = http.NewRequest("GET", "/v1/alerts?scope=rarara", nil)
  188. req.Header.Add("User-Agent", UserAgent)
  189. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  190. router.ServeHTTP(w, req)
  191. assert.Equal(t, 200, w.Code)
  192. assert.Equal(t, "null", w.Body.String())
  193. //test scenario (ok)
  194. w = httptest.NewRecorder()
  195. req, _ = http.NewRequest("GET", "/v1/alerts?scenario=crowdsecurity/ssh-bf", nil)
  196. req.Header.Add("User-Agent", UserAgent)
  197. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  198. router.ServeHTTP(w, req)
  199. assert.Equal(t, 200, w.Code)
  200. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  201. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"start_ip":1534676931,"type":"ban","value":"91.121.79.195"`)
  202. //test scenario (bad value)
  203. w = httptest.NewRecorder()
  204. req, _ = http.NewRequest("GET", "/v1/alerts?scenario=crowdsecurity/nope", nil)
  205. req.Header.Add("User-Agent", UserAgent)
  206. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  207. router.ServeHTTP(w, req)
  208. assert.Equal(t, 200, w.Code)
  209. assert.Equal(t, "null", w.Body.String())
  210. //test ip (ok)
  211. w = httptest.NewRecorder()
  212. req, _ = http.NewRequest("GET", "/v1/alerts?ip=91.121.79.195", nil)
  213. req.Header.Add("User-Agent", UserAgent)
  214. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  215. router.ServeHTTP(w, req)
  216. assert.Equal(t, 200, w.Code)
  217. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  218. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"start_ip":1534676931,"type":"ban","value":"91.121.79.195"`)
  219. //test ip (bad value)
  220. w = httptest.NewRecorder()
  221. req, _ = http.NewRequest("GET", "/v1/alerts?ip=99.122.77.195", nil)
  222. req.Header.Add("User-Agent", UserAgent)
  223. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  224. router.ServeHTTP(w, req)
  225. assert.Equal(t, 200, w.Code)
  226. assert.Equal(t, "null", w.Body.String())
  227. //test ip (invalid value)
  228. w = httptest.NewRecorder()
  229. req, _ = http.NewRequest("GET", "/v1/alerts?ip=gruueq", nil)
  230. req.Header.Add("User-Agent", UserAgent)
  231. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  232. router.ServeHTTP(w, req)
  233. assert.Equal(t, 500, w.Code)
  234. assert.Equal(t, `{"message":"unable to parse 'gruueq': %!s(\u003cnil\u003e): invalid ip address / range"}`, w.Body.String())
  235. //test range (ok)
  236. w = httptest.NewRecorder()
  237. req, _ = http.NewRequest("GET", "/v1/alerts?range=91.121.79.0/24", nil)
  238. req.Header.Add("User-Agent", UserAgent)
  239. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  240. router.ServeHTTP(w, req)
  241. assert.Equal(t, 200, w.Code)
  242. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  243. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"start_ip":1534676931,"type":"ban","value":"91.121.79.195"`)
  244. //test range
  245. w = httptest.NewRecorder()
  246. req, _ = http.NewRequest("GET", "/v1/alerts?range=99.122.77.0/24", nil)
  247. req.Header.Add("User-Agent", UserAgent)
  248. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  249. router.ServeHTTP(w, req)
  250. assert.Equal(t, 200, w.Code)
  251. assert.Equal(t, "null", w.Body.String())
  252. //test range (invalid value)
  253. w = httptest.NewRecorder()
  254. req, _ = http.NewRequest("GET", "/v1/alerts?range=ratata", nil)
  255. req.Header.Add("User-Agent", UserAgent)
  256. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  257. router.ServeHTTP(w, req)
  258. assert.Equal(t, 500, w.Code)
  259. assert.Equal(t, `{"message":"unable to convert 'ratata' to int interval: 'ratata' is not a valid CIDR: invalid ip address / range"}`, w.Body.String())
  260. //test since (ok)
  261. w = httptest.NewRecorder()
  262. req, _ = http.NewRequest("GET", "/v1/alerts?since=1h", nil)
  263. req.Header.Add("User-Agent", UserAgent)
  264. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  265. router.ServeHTTP(w, req)
  266. assert.Equal(t, 200, w.Code)
  267. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  268. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"start_ip":1534676931,"type":"ban","value":"91.121.79.195"`)
  269. //test since (ok but yelds no results)
  270. w = httptest.NewRecorder()
  271. req, _ = http.NewRequest("GET", "/v1/alerts?since=1ns", nil)
  272. req.Header.Add("User-Agent", UserAgent)
  273. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  274. router.ServeHTTP(w, req)
  275. assert.Equal(t, 200, w.Code)
  276. assert.Equal(t, "null", w.Body.String())
  277. //test since (invalid value)
  278. w = httptest.NewRecorder()
  279. req, _ = http.NewRequest("GET", "/v1/alerts?since=1zuzu", nil)
  280. req.Header.Add("User-Agent", UserAgent)
  281. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  282. router.ServeHTTP(w, req)
  283. assert.Equal(t, 500, w.Code)
  284. assert.Contains(t, w.Body.String(), `{"message":"while parsing duration: time: unknown unit`)
  285. //test until (ok)
  286. w = httptest.NewRecorder()
  287. req, _ = http.NewRequest("GET", "/v1/alerts?until=1ns", nil)
  288. req.Header.Add("User-Agent", UserAgent)
  289. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  290. router.ServeHTTP(w, req)
  291. assert.Equal(t, 200, w.Code)
  292. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  293. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"start_ip":1534676931,"type":"ban","value":"91.121.79.195"`)
  294. //test until (ok but no return)
  295. w = httptest.NewRecorder()
  296. req, _ = http.NewRequest("GET", "/v1/alerts?until=1m", nil)
  297. req.Header.Add("User-Agent", UserAgent)
  298. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  299. router.ServeHTTP(w, req)
  300. assert.Equal(t, 200, w.Code)
  301. assert.Equal(t, "null", w.Body.String())
  302. //test until (invalid value)
  303. w = httptest.NewRecorder()
  304. req, _ = http.NewRequest("GET", "/v1/alerts?until=1zuzu", nil)
  305. req.Header.Add("User-Agent", UserAgent)
  306. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  307. router.ServeHTTP(w, req)
  308. assert.Equal(t, 500, w.Code)
  309. assert.Contains(t, w.Body.String(), `{"message":"while parsing duration: time: unknown unit`)
  310. //test simulated (ok)
  311. w = httptest.NewRecorder()
  312. req, _ = http.NewRequest("GET", "/v1/alerts?simulated=true", nil)
  313. req.Header.Add("User-Agent", UserAgent)
  314. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  315. router.ServeHTTP(w, req)
  316. assert.Equal(t, 200, w.Code)
  317. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  318. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"start_ip":1534676931,"type":"ban","value":"91.121.79.195"`)
  319. //test simulated (ok)
  320. w = httptest.NewRecorder()
  321. req, _ = http.NewRequest("GET", "/v1/alerts?simulated=false", nil)
  322. req.Header.Add("User-Agent", UserAgent)
  323. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  324. router.ServeHTTP(w, req)
  325. assert.Equal(t, 200, w.Code)
  326. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  327. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"start_ip":1534676931,"type":"ban","value":"91.121.79.195"`)
  328. //test has active decision
  329. w = httptest.NewRecorder()
  330. req, _ = http.NewRequest("GET", "/v1/alerts?has_active_decision=true", nil)
  331. req.Header.Add("User-Agent", UserAgent)
  332. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  333. router.ServeHTTP(w, req)
  334. assert.Equal(t, 200, w.Code)
  335. assert.Contains(t, w.Body.String(), "Ip 91.121.79.195 performed 'crowdsecurity/ssh-bf' (6 events over ")
  336. assert.Contains(t, w.Body.String(), `scope":"Ip","simulated":false,"start_ip":1534676931,"type":"ban","value":"91.121.79.195"`)
  337. //test has active decision
  338. w = httptest.NewRecorder()
  339. req, _ = http.NewRequest("GET", "/v1/alerts?has_active_decision=false", nil)
  340. req.Header.Add("User-Agent", UserAgent)
  341. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  342. router.ServeHTTP(w, req)
  343. assert.Equal(t, 200, w.Code)
  344. assert.Equal(t, "null", w.Body.String())
  345. //test has active decision (invalid value)
  346. w = httptest.NewRecorder()
  347. req, _ = http.NewRequest("GET", "/v1/alerts?has_active_decision=ratatqata", nil)
  348. req.Header.Add("User-Agent", UserAgent)
  349. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  350. router.ServeHTTP(w, req)
  351. assert.Equal(t, 500, w.Code)
  352. assert.Equal(t, `{"message":"'ratatqata' is not a boolean: strconv.ParseBool: parsing \"ratatqata\": invalid syntax: unable to parse type"}`, w.Body.String())
  353. }
  354. func TestAlertBulkInsert(t *testing.T) {
  355. router, loginResp, err := InitMachineTest()
  356. if err != nil {
  357. log.Fatalln(err.Error())
  358. }
  359. //insert a bulk of 20 alerts to trigger bulk insert
  360. alertContentBytes, err := ioutil.ReadFile("./tests/alert_bulk.json")
  361. if err != nil {
  362. log.Fatal(err)
  363. }
  364. alertContent := string(alertContentBytes)
  365. w := httptest.NewRecorder()
  366. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  367. req.Header.Add("User-Agent", UserAgent)
  368. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  369. router.ServeHTTP(w, req)
  370. w = httptest.NewRecorder()
  371. req, _ = http.NewRequest("GET", "/v1/alerts", strings.NewReader(alertContent))
  372. req.Header.Add("User-Agent", UserAgent)
  373. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  374. router.ServeHTTP(w, req)
  375. assert.Equal(t, 200, w.Code)
  376. }
  377. func TestListAlert(t *testing.T) {
  378. router, loginResp, err := InitMachineTest()
  379. if err != nil {
  380. log.Fatalln(err.Error())
  381. }
  382. alertContentBytes, err := ioutil.ReadFile("./tests/alert_sample.json")
  383. if err != nil {
  384. log.Fatal(err)
  385. }
  386. alertContent := string(alertContentBytes)
  387. w := httptest.NewRecorder()
  388. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  389. req.Header.Add("User-Agent", UserAgent)
  390. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  391. router.ServeHTTP(w, req)
  392. // List Alert with invalid filter
  393. w = httptest.NewRecorder()
  394. req, _ = http.NewRequest("GET", "/v1/alerts?test=test", nil)
  395. req.Header.Add("User-Agent", UserAgent)
  396. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  397. router.ServeHTTP(w, req)
  398. assert.Equal(t, 500, w.Code)
  399. assert.Equal(t, "{\"message\":\"Filter parameter 'test' is unknown (=test): invalid filter\"}", w.Body.String())
  400. // List Alert
  401. w = httptest.NewRecorder()
  402. req, _ = http.NewRequest("GET", "/v1/alerts", nil)
  403. req.Header.Add("User-Agent", UserAgent)
  404. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  405. router.ServeHTTP(w, req)
  406. assert.Equal(t, 200, w.Code)
  407. assert.Contains(t, w.Body.String(), "crowdsecurity/test")
  408. }
  409. func TestCreateAlertErrors(t *testing.T) {
  410. router, loginResp, err := InitMachineTest()
  411. if err != nil {
  412. log.Fatalln(err.Error())
  413. }
  414. alertContentBytes, err := ioutil.ReadFile("./tests/alert_sample.json")
  415. if err != nil {
  416. log.Fatal(err)
  417. }
  418. alertContent := string(alertContentBytes)
  419. //test invalid bearer
  420. w := httptest.NewRecorder()
  421. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  422. req.Header.Add("User-Agent", UserAgent)
  423. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", "ratata"))
  424. router.ServeHTTP(w, req)
  425. assert.Equal(t, 401, w.Code)
  426. //test invalid bearer
  427. w = httptest.NewRecorder()
  428. req, _ = http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  429. req.Header.Add("User-Agent", UserAgent)
  430. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token+"s"))
  431. router.ServeHTTP(w, req)
  432. assert.Equal(t, 401, w.Code)
  433. }
  434. func TestDeleteAlert(t *testing.T) {
  435. router, loginResp, err := InitMachineTest()
  436. if err != nil {
  437. log.Fatalln(err.Error())
  438. }
  439. alertContentBytes, err := ioutil.ReadFile("./tests/alert_sample.json")
  440. if err != nil {
  441. log.Fatal(err)
  442. }
  443. alertContent := string(alertContentBytes)
  444. w := httptest.NewRecorder()
  445. req, _ := http.NewRequest("POST", "/v1/alerts", strings.NewReader(alertContent))
  446. req.Header.Add("User-Agent", UserAgent)
  447. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  448. router.ServeHTTP(w, req)
  449. // Fail Delete Alert
  450. w = httptest.NewRecorder()
  451. req, _ = http.NewRequest("DELETE", "/v1/alerts", strings.NewReader(""))
  452. req.Header.Add("User-Agent", UserAgent)
  453. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  454. req.RemoteAddr = "127.0.0.2:4242"
  455. router.ServeHTTP(w, req)
  456. assert.Equal(t, 403, w.Code)
  457. assert.Equal(t, `{"message":"access forbidden from this IP (127.0.0.2)"}`, w.Body.String())
  458. // Delete Alert
  459. w = httptest.NewRecorder()
  460. req, _ = http.NewRequest("DELETE", "/v1/alerts", strings.NewReader(""))
  461. req.Header.Add("User-Agent", UserAgent)
  462. req.Header.Add("Authorization", fmt.Sprintf("Bearer %s", loginResp.Token))
  463. req.RemoteAddr = "127.0.0.1:4242"
  464. router.ServeHTTP(w, req)
  465. assert.Equal(t, 200, w.Code)
  466. assert.Equal(t, `{"nbDeleted":"1"}`, w.Body.String())
  467. }