Contains the Concourse pipeline definition for building a line-server container
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.

1230 lines
26 KiB

10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
10 years ago
  1. package main
  2. import (
  3. "bytes"
  4. "crypto/tls"
  5. "encoding/json"
  6. "fmt"
  7. "mime/multipart"
  8. "net/http"
  9. "net/http/httptest"
  10. "net/url"
  11. "os"
  12. "path"
  13. "strconv"
  14. "strings"
  15. "testing"
  16. "time"
  17. )
  18. type RespOkJSON struct {
  19. Filename string
  20. Url string
  21. Delete_Key string
  22. Expiry string
  23. Size string
  24. }
  25. type RespErrJSON struct {
  26. Error string
  27. }
  28. func TestSetup(t *testing.T) {
  29. Config.siteURL = "http://linx.example.org/"
  30. Config.filesDir = path.Join(os.TempDir(), generateBarename())
  31. Config.metaDir = Config.filesDir + "_meta"
  32. Config.maxSize = 1024 * 1024 * 1024
  33. Config.noLogs = true
  34. Config.siteName = "linx"
  35. }
  36. func TestIndex(t *testing.T) {
  37. mux := setup()
  38. w := httptest.NewRecorder()
  39. req, err := http.NewRequest("GET", "/", nil)
  40. if err != nil {
  41. t.Fatal(err)
  42. }
  43. mux.ServeHTTP(w, req)
  44. if !strings.Contains(w.Body.String(), "Click or Drop file") {
  45. t.Fatal("String 'Click or Drop file' not found in index response")
  46. }
  47. }
  48. func TestIndexStandardMaxExpiry(t *testing.T) {
  49. mux := setup()
  50. Config.maxExpiry = 60
  51. w := httptest.NewRecorder()
  52. req, err := http.NewRequest("GET", "/", nil)
  53. if err != nil {
  54. t.Fatal(err)
  55. }
  56. mux.ServeHTTP(w, req)
  57. if strings.Contains(w.Body.String(), ">1 hour</object>") {
  58. t.Fatal("String '>1 hour</object>' found in index response")
  59. }
  60. Config.maxExpiry = 0
  61. }
  62. func TestIndexWeirdMaxExpiry(t *testing.T) {
  63. mux := setup()
  64. Config.maxExpiry = 1500
  65. w := httptest.NewRecorder()
  66. req, err := http.NewRequest("GET", "/", nil)
  67. if err != nil {
  68. t.Fatal(err)
  69. }
  70. mux.ServeHTTP(w, req)
  71. if strings.Contains(w.Body.String(), ">never</object>") {
  72. t.Fatal("String '>never</object>' found in index response")
  73. }
  74. Config.maxExpiry = 0
  75. }
  76. func TestAddHeader(t *testing.T) {
  77. Config.addHeaders = []string{"Linx-Test: It works!"}
  78. mux := setup()
  79. w := httptest.NewRecorder()
  80. req, err := http.NewRequest("GET", "/", nil)
  81. if err != nil {
  82. t.Fatal(err)
  83. }
  84. mux.ServeHTTP(w, req)
  85. if w.Header().Get("Linx-Test") != "It works!" {
  86. t.Fatal("Header 'Linx-Test: It works!' not found in index response")
  87. }
  88. }
  89. func TestAuthKeys(t *testing.T) {
  90. Config.authFile = "/dev/null"
  91. redirects := []string{
  92. "/",
  93. "/paste/",
  94. }
  95. mux := setup()
  96. for _, v := range redirects {
  97. w := httptest.NewRecorder()
  98. req, err := http.NewRequest("GET", v, nil)
  99. if err != nil {
  100. t.Fatal(err)
  101. }
  102. mux.ServeHTTP(w, req)
  103. if w.Code != 303 {
  104. t.Fatalf("Status code is not 303, but %d", w.Code)
  105. }
  106. }
  107. w := httptest.NewRecorder()
  108. req, err := http.NewRequest("POST", "/paste/", nil)
  109. if err != nil {
  110. t.Fatal(err)
  111. }
  112. mux.ServeHTTP(w, req)
  113. if w.Code != 401 {
  114. t.Fatalf("Status code is not 401, but %d", w.Code)
  115. }
  116. Config.authFile = ""
  117. }
  118. func TestNotFound(t *testing.T) {
  119. mux := setup()
  120. w := httptest.NewRecorder()
  121. req, err := http.NewRequest("GET", "/url/should/not/exist", nil)
  122. if err != nil {
  123. t.Fatal(err)
  124. }
  125. mux.ServeHTTP(w, req)
  126. if w.Code != 404 {
  127. t.Fatalf("Expected 404, got %d", w.Code)
  128. }
  129. }
  130. func TestFileNotFound(t *testing.T) {
  131. mux := setup()
  132. w := httptest.NewRecorder()
  133. filename := generateBarename()
  134. req, err := http.NewRequest("GET", "/"+Config.selifPath+filename, nil)
  135. if err != nil {
  136. t.Fatal(err)
  137. }
  138. mux.ServeHTTP(w, req)
  139. if w.Code != 404 {
  140. t.Fatalf("Expected 404, got %d", w.Code)
  141. }
  142. }
  143. func TestDisplayNotFound(t *testing.T) {
  144. mux := setup()
  145. w := httptest.NewRecorder()
  146. filename := generateBarename()
  147. req, err := http.NewRequest("GET", "/"+filename, nil)
  148. if err != nil {
  149. t.Fatal(err)
  150. }
  151. mux.ServeHTTP(w, req)
  152. if w.Code != 404 {
  153. t.Fatalf("Expected 404, got %d", w.Code)
  154. }
  155. }
  156. func TestPostCodeUpload(t *testing.T) {
  157. mux := setup()
  158. w := httptest.NewRecorder()
  159. filename := generateBarename()
  160. extension := "txt"
  161. form := url.Values{}
  162. form.Add("content", "File content")
  163. form.Add("filename", filename)
  164. form.Add("extension", extension)
  165. req, err := http.NewRequest("POST", "/upload/", nil)
  166. if err != nil {
  167. t.Fatal(err)
  168. }
  169. req.PostForm = form
  170. req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  171. req.Header.Set("Referer", Config.siteURL)
  172. mux.ServeHTTP(w, req)
  173. if w.Code != 303 {
  174. t.Fatalf("Status code is not 303, but %d", w.Code)
  175. }
  176. if w.Header().Get("Location") != "/"+filename+"."+extension {
  177. t.Fatalf("Was redirected to %s instead of /%s", w.Header().Get("Location"), filename)
  178. }
  179. }
  180. func TestPostCodeUploadWhitelistedHeader(t *testing.T) {
  181. mux := setup()
  182. w := httptest.NewRecorder()
  183. filename := generateBarename()
  184. extension := "txt"
  185. form := url.Values{}
  186. form.Add("content", "File content")
  187. form.Add("filename", filename)
  188. form.Add("extension", extension)
  189. req, err := http.NewRequest("POST", "/upload/", nil)
  190. if err != nil {
  191. t.Fatal(err)
  192. }
  193. req.PostForm = form
  194. req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  195. req.Header.Set("Linx-Expiry", "0")
  196. mux.ServeHTTP(w, req)
  197. if w.Code != 303 {
  198. t.Fatalf("Status code is not 303, but %d", w.Code)
  199. }
  200. }
  201. func TestPostCodeUploadNoReferrer(t *testing.T) {
  202. mux := setup()
  203. w := httptest.NewRecorder()
  204. filename := generateBarename()
  205. extension := "txt"
  206. form := url.Values{}
  207. form.Add("content", "File content")
  208. form.Add("filename", filename)
  209. form.Add("extension", extension)
  210. req, err := http.NewRequest("POST", "/upload/", nil)
  211. if err != nil {
  212. t.Fatal(err)
  213. }
  214. req.PostForm = form
  215. req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  216. mux.ServeHTTP(w, req)
  217. if w.Code != 400 {
  218. t.Fatalf("Status code is not 400, but %d", w.Code)
  219. }
  220. }
  221. func TestPostCodeUploadBadOrigin(t *testing.T) {
  222. mux := setup()
  223. w := httptest.NewRecorder()
  224. filename := generateBarename()
  225. extension := "txt"
  226. form := url.Values{}
  227. form.Add("content", "File content")
  228. form.Add("filename", filename)
  229. form.Add("extension", extension)
  230. req, err := http.NewRequest("POST", "/upload/", nil)
  231. if err != nil {
  232. t.Fatal(err)
  233. }
  234. req.PostForm = form
  235. req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  236. req.Header.Set("Referer", Config.siteURL)
  237. req.Header.Set("Origin", "http://example.com")
  238. mux.ServeHTTP(w, req)
  239. if w.Code != 400 {
  240. t.Fatalf("Status code is not 400, but %d", w.Code)
  241. }
  242. }
  243. func TestPostCodeExpiryJSONUpload(t *testing.T) {
  244. mux := setup()
  245. w := httptest.NewRecorder()
  246. form := url.Values{}
  247. form.Add("content", "File content")
  248. form.Add("filename", "")
  249. form.Add("expires", "60")
  250. req, err := http.NewRequest("POST", "/upload/", nil)
  251. if err != nil {
  252. t.Fatal(err)
  253. }
  254. req.PostForm = form
  255. req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
  256. req.Header.Set("Accept", "application/json")
  257. req.Header.Set("Referer", Config.siteURL)
  258. req.Header.Set("Origin", strings.TrimSuffix(Config.siteURL, "/"))
  259. mux.ServeHTTP(w, req)
  260. if w.Code != 200 {
  261. t.Log(w.Body.String())
  262. t.Fatalf("Status code is not 200, but %d", w.Code)
  263. }
  264. var myjson RespOkJSON
  265. err = json.Unmarshal([]byte(w.Body.String()), &myjson)
  266. if err != nil {
  267. t.Fatal(err)
  268. }
  269. myExp, err := strconv.ParseInt(myjson.Expiry, 10, 64)
  270. if err != nil {
  271. t.Fatal(err)
  272. }
  273. curTime := time.Now().Unix()
  274. if myExp < curTime {
  275. t.Fatalf("File expiry (%d) is smaller than current time (%d)", myExp, curTime)
  276. }
  277. if myjson.Size != "12" {
  278. t.Fatalf("File size was not 12 but %s", myjson.Size)
  279. }
  280. }
  281. func TestPostUpload(t *testing.T) {
  282. mux := setup()
  283. w := httptest.NewRecorder()
  284. filename := generateBarename() + ".txt"
  285. var b bytes.Buffer
  286. mw := multipart.NewWriter(&b)
  287. fw, err := mw.CreateFormFile("file", filename)
  288. if err != nil {
  289. t.Fatal(err)
  290. }
  291. fw.Write([]byte("File content"))
  292. mw.Close()
  293. req, err := http.NewRequest("POST", "/upload/", &b)
  294. req.Header.Set("Content-Type", mw.FormDataContentType())
  295. req.Header.Set("Referer", Config.siteURL)
  296. if err != nil {
  297. t.Fatal(err)
  298. }
  299. mux.ServeHTTP(w, req)
  300. if w.Code != 303 {
  301. t.Fatalf("Status code is not 303, but %d", w.Code)
  302. }
  303. if w.Header().Get("Location") != "/"+filename {
  304. t.Fatalf("Was redirected to %s instead of /%s", w.Header().Get("Location"), filename)
  305. }
  306. }
  307. func TestPostJSONUpload(t *testing.T) {
  308. mux := setup()
  309. w := httptest.NewRecorder()
  310. filename := generateBarename() + ".txt"
  311. var b bytes.Buffer
  312. mw := multipart.NewWriter(&b)
  313. fw, err := mw.CreateFormFile("file", filename)
  314. if err != nil {
  315. t.Fatal(err)
  316. }
  317. fw.Write([]byte("File content"))
  318. mw.Close()
  319. req, err := http.NewRequest("POST", "/upload/", &b)
  320. req.Header.Set("Content-Type", mw.FormDataContentType())
  321. req.Header.Set("Accept", "application/json")
  322. req.Header.Set("Referer", Config.siteURL)
  323. if err != nil {
  324. t.Fatal(err)
  325. }
  326. mux.ServeHTTP(w, req)
  327. if w.Code != 200 {
  328. t.Log(w.Body.String())
  329. t.Fatalf("Status code is not 200, but %d", w.Code)
  330. }
  331. var myjson RespOkJSON
  332. err = json.Unmarshal([]byte(w.Body.String()), &myjson)
  333. if err != nil {
  334. t.Fatal(err)
  335. }
  336. if myjson.Filename != filename {
  337. t.Fatalf("Filename is not '%s' but '%s' ", filename, myjson.Filename)
  338. }
  339. if myjson.Expiry != "0" {
  340. t.Fatalf("File expiry is not 0 but %s", myjson.Expiry)
  341. }
  342. if myjson.Size != "12" {
  343. t.Fatalf("File size was not 12 but %s", myjson.Size)
  344. }
  345. }
  346. func TestPostJSONUploadMaxExpiry(t *testing.T) {
  347. mux := setup()
  348. Config.maxExpiry = 300
  349. // include 0 to test edge case
  350. // https://github.com/andreimarcu/linx-server/issues/111
  351. testExpiries := []string{"86400", "-150", "0"}
  352. for _, expiry := range testExpiries {
  353. w := httptest.NewRecorder()
  354. filename := generateBarename() + ".txt"
  355. var b bytes.Buffer
  356. mw := multipart.NewWriter(&b)
  357. fw, err := mw.CreateFormFile("file", filename)
  358. if err != nil {
  359. t.Fatal(err)
  360. }
  361. fw.Write([]byte("File content"))
  362. mw.Close()
  363. req, err := http.NewRequest("POST", "/upload/", &b)
  364. req.Header.Set("Content-Type", mw.FormDataContentType())
  365. req.Header.Set("Accept", "application/json")
  366. req.Header.Set("Linx-Expiry", expiry)
  367. if err != nil {
  368. t.Fatal(err)
  369. }
  370. mux.ServeHTTP(w, req)
  371. if w.Code != 200 {
  372. t.Log(w.Body.String())
  373. t.Fatalf("Status code is not 200, but %d", w.Code)
  374. }
  375. var myjson RespOkJSON
  376. err = json.Unmarshal([]byte(w.Body.String()), &myjson)
  377. if err != nil {
  378. t.Fatal(err)
  379. }
  380. myExp, err := strconv.ParseInt(myjson.Expiry, 10, 64)
  381. if err != nil {
  382. t.Fatal(err)
  383. }
  384. expected := time.Now().Add(time.Duration(Config.maxExpiry) * time.Second).Unix()
  385. if myExp != expected {
  386. t.Fatalf("File expiry is not %d but %s", expected, myjson.Expiry)
  387. }
  388. }
  389. Config.maxExpiry = 0
  390. }
  391. func TestPostExpiresJSONUpload(t *testing.T) {
  392. mux := setup()
  393. w := httptest.NewRecorder()
  394. filename := generateBarename() + ".txt"
  395. var b bytes.Buffer
  396. mw := multipart.NewWriter(&b)
  397. fw, err := mw.CreateFormFile("file", filename)
  398. if err != nil {
  399. t.Fatal(err)
  400. }
  401. fw.Write([]byte("File content"))
  402. exp, err := mw.CreateFormField("expires")
  403. if err != nil {
  404. t.Fatal(err)
  405. }
  406. exp.Write([]byte("60"))
  407. mw.Close()
  408. req, err := http.NewRequest("POST", "/upload/", &b)
  409. req.Header.Set("Content-Type", mw.FormDataContentType())
  410. req.Header.Set("Accept", "application/json")
  411. req.Header.Set("Referer", Config.siteURL)
  412. if err != nil {
  413. t.Fatal(err)
  414. }
  415. mux.ServeHTTP(w, req)
  416. if w.Code != 200 {
  417. t.Log(w.Body.String())
  418. t.Fatalf("Status code is not 200, but %d", w.Code)
  419. }
  420. var myjson RespOkJSON
  421. err = json.Unmarshal([]byte(w.Body.String()), &myjson)
  422. if err != nil {
  423. t.Fatal(err)
  424. }
  425. if myjson.Filename != filename {
  426. t.Fatalf("Filename is not '%s' but '%s' ", filename, myjson.Filename)
  427. }
  428. myExp, err := strconv.ParseInt(myjson.Expiry, 10, 64)
  429. if err != nil {
  430. t.Fatal(err)
  431. }
  432. curTime := time.Now().Unix()
  433. if myExp < curTime {
  434. t.Fatalf("File expiry (%d) is smaller than current time (%d)", myExp, curTime)
  435. }
  436. if myjson.Size != "12" {
  437. t.Fatalf("File size was not 12 but %s", myjson.Size)
  438. }
  439. }
  440. func TestPostRandomizeJSONUpload(t *testing.T) {
  441. mux := setup()
  442. w := httptest.NewRecorder()
  443. filename := generateBarename() + ".txt"
  444. var b bytes.Buffer
  445. mw := multipart.NewWriter(&b)
  446. fw, err := mw.CreateFormFile("file", filename)
  447. if err != nil {
  448. t.Fatal(err)
  449. }
  450. fw.Write([]byte("File content"))
  451. rnd, err := mw.CreateFormField("randomize")
  452. if err != nil {
  453. t.Fatal(err)
  454. }
  455. rnd.Write([]byte("true"))
  456. mw.Close()
  457. req, err := http.NewRequest("POST", "/upload/", &b)
  458. req.Header.Set("Content-Type", mw.FormDataContentType())
  459. req.Header.Set("Accept", "application/json")
  460. req.Header.Set("Referer", Config.siteURL)
  461. if err != nil {
  462. t.Fatal(err)
  463. }
  464. mux.ServeHTTP(w, req)
  465. if w.Code != 200 {
  466. t.Log(w.Body.String())
  467. t.Fatalf("Status code is not 200, but %d", w.Code)
  468. }
  469. var myjson RespOkJSON
  470. err = json.Unmarshal([]byte(w.Body.String()), &myjson)
  471. if err != nil {
  472. t.Fatal(err)
  473. }
  474. if myjson.Filename == filename {
  475. t.Fatalf("Filename (%s) is not random (%s)", filename, myjson.Filename)
  476. }
  477. if myjson.Size != "12" {
  478. t.Fatalf("File size was not 12 but %s", myjson.Size)
  479. }
  480. }
  481. func TestPostEmptyUpload(t *testing.T) {
  482. mux := setup()
  483. w := httptest.NewRecorder()
  484. filename := generateBarename() + ".txt"
  485. var b bytes.Buffer
  486. mw := multipart.NewWriter(&b)
  487. fw, err := mw.CreateFormFile("file", filename)
  488. if err != nil {
  489. t.Fatal(err)
  490. }
  491. fw.Write([]byte(""))
  492. mw.Close()
  493. req, err := http.NewRequest("POST", "/upload/", &b)
  494. req.Header.Set("Content-Type", mw.FormDataContentType())
  495. req.Header.Set("Referer", Config.siteURL)
  496. if err != nil {
  497. t.Fatal(err)
  498. }
  499. mux.ServeHTTP(w, req)
  500. if w.Code != 400 {
  501. t.Log(w.Body.String())
  502. t.Fatalf("Status code is not 400, but %d", w.Code)
  503. }
  504. }
  505. func TestPostTooLargeUpload(t *testing.T) {
  506. mux := setup()
  507. oldMaxSize := Config.maxSize
  508. Config.maxSize = 2
  509. w := httptest.NewRecorder()
  510. filename := generateBarename() + ".txt"
  511. var b bytes.Buffer
  512. mw := multipart.NewWriter(&b)
  513. fw, err := mw.CreateFormFile("file", filename)
  514. if err != nil {
  515. t.Fatal(err)
  516. }
  517. fw.Write([]byte("test content"))
  518. mw.Close()
  519. req, err := http.NewRequest("POST", "/upload/", &b)
  520. req.Header.Set("Content-Type", mw.FormDataContentType())
  521. req.Header.Set("Referer", Config.siteURL)
  522. if err != nil {
  523. t.Fatal(err)
  524. }
  525. mux.ServeHTTP(w, req)
  526. if w.Code != 400 {
  527. t.Log(w.Body.String())
  528. t.Fatalf("Status code is not 400, but %d", w.Code)
  529. }
  530. Config.maxSize = oldMaxSize
  531. }
  532. func TestPostEmptyJSONUpload(t *testing.T) {
  533. mux := setup()
  534. w := httptest.NewRecorder()
  535. filename := generateBarename() + ".txt"
  536. var b bytes.Buffer
  537. mw := multipart.NewWriter(&b)
  538. fw, err := mw.CreateFormFile("file", filename)
  539. if err != nil {
  540. t.Fatal(err)
  541. }
  542. fw.Write([]byte(""))
  543. mw.Close()
  544. req, err := http.NewRequest("POST", "/upload/", &b)
  545. req.Header.Set("Content-Type", mw.FormDataContentType())
  546. req.Header.Set("Accept", "application/json")
  547. req.Header.Set("Referer", Config.siteURL)
  548. if err != nil {
  549. t.Fatal(err)
  550. }
  551. mux.ServeHTTP(w, req)
  552. if w.Code != 400 {
  553. t.Log(w.Body.String())
  554. t.Fatalf("Status code is not 400, but %d", w.Code)
  555. }
  556. var myjson RespErrJSON
  557. err = json.Unmarshal([]byte(w.Body.String()), &myjson)
  558. if err != nil {
  559. t.Fatal(err)
  560. }
  561. if myjson.Error != "Empty file" {
  562. t.Fatal("Json 'error' was not 'Empty file' but " + myjson.Error)
  563. }
  564. }
  565. func TestPutUpload(t *testing.T) {
  566. mux := setup()
  567. w := httptest.NewRecorder()
  568. filename := generateBarename() + ".file"
  569. req, err := http.NewRequest("PUT", "/upload/"+filename, strings.NewReader("File content"))
  570. if err != nil {
  571. t.Fatal(err)
  572. }
  573. mux.ServeHTTP(w, req)
  574. if w.Body.String() != fmt.Sprintf("%s\n", Config.siteURL+filename) {
  575. t.Fatal("Response was not expected URL")
  576. }
  577. }
  578. func TestPutRandomizedUpload(t *testing.T) {
  579. mux := setup()
  580. w := httptest.NewRecorder()
  581. filename := generateBarename() + ".file"
  582. req, err := http.NewRequest("PUT", "/upload/"+filename, strings.NewReader("File content"))
  583. if err != nil {
  584. t.Fatal(err)
  585. }
  586. req.Header.Set("Linx-Randomize", "yes")
  587. mux.ServeHTTP(w, req)
  588. if w.Body.String() == Config.siteURL+filename {
  589. t.Fatal("Filename was not random")
  590. }
  591. }
  592. func TestPutNoExtensionUpload(t *testing.T) {
  593. mux := setup()
  594. w := httptest.NewRecorder()
  595. filename := generateBarename()
  596. req, err := http.NewRequest("PUT", "/upload/"+filename, strings.NewReader("File content"))
  597. if err != nil {
  598. t.Fatal(err)
  599. }
  600. req.Header.Set("Linx-Randomize", "yes")
  601. mux.ServeHTTP(w, req)
  602. if w.Body.String() == Config.siteURL+filename {
  603. t.Fatal("Filename was not random")
  604. }
  605. }
  606. func TestPutEmptyUpload(t *testing.T) {
  607. mux := setup()
  608. w := httptest.NewRecorder()
  609. filename := generateBarename() + ".file"
  610. req, err := http.NewRequest("PUT", "/upload/"+filename, strings.NewReader(""))
  611. if err != nil {
  612. t.Fatal(err)
  613. }
  614. req.Header.Set("Linx-Randomize", "yes")
  615. mux.ServeHTTP(w, req)
  616. if w.Code != 400 {
  617. t.Fatalf("Status code is not 400, but %d", w.Code)
  618. }
  619. }
  620. func TestPutTooLargeUpload(t *testing.T) {
  621. mux := setup()
  622. oldMaxSize := Config.maxSize
  623. Config.maxSize = 2
  624. w := httptest.NewRecorder()
  625. filename := generateBarename() + ".file"
  626. req, err := http.NewRequest("PUT", "/upload/"+filename, strings.NewReader("File too big"))
  627. if err != nil {
  628. t.Fatal(err)
  629. }
  630. req.Header.Set("Linx-Randomize", "yes")
  631. mux.ServeHTTP(w, req)
  632. if w.Code != 500 {
  633. t.Log(w.Body.String())
  634. t.Fatalf("Status code is not 500, but %d", w.Code)
  635. }
  636. if !strings.Contains(w.Body.String(), "request body too large") {
  637. t.Fatal("Response did not contain 'request body too large'")
  638. }
  639. Config.maxSize = oldMaxSize
  640. }
  641. func TestPutJSONUpload(t *testing.T) {
  642. var myjson RespOkJSON
  643. mux := setup()
  644. w := httptest.NewRecorder()
  645. filename := generateBarename() + ".file"
  646. req, err := http.NewRequest("PUT", "/upload/"+filename, strings.NewReader("File content"))
  647. if err != nil {
  648. t.Fatal(err)
  649. }
  650. req.Header.Set("Accept", "application/json")
  651. mux.ServeHTTP(w, req)
  652. err = json.Unmarshal([]byte(w.Body.String()), &myjson)
  653. if err != nil {
  654. t.Fatal(err)
  655. }
  656. if myjson.Filename != filename {
  657. t.Fatal("Filename was not provided one but " + myjson.Filename)
  658. }
  659. }
  660. func TestPutRandomizedJSONUpload(t *testing.T) {
  661. var myjson RespOkJSON
  662. mux := setup()
  663. w := httptest.NewRecorder()
  664. filename := generateBarename() + ".file"
  665. req, err := http.NewRequest("PUT", "/upload/"+filename, strings.NewReader("File content"))
  666. if err != nil {
  667. t.Fatal(err)
  668. }
  669. req.Header.Set("Accept", "application/json")
  670. req.Header.Set("Linx-Randomize", "yes")
  671. mux.ServeHTTP(w, req)
  672. err = json.Unmarshal([]byte(w.Body.String()), &myjson)
  673. if err != nil {
  674. t.Fatal(err)
  675. }
  676. if myjson.Filename == filename {
  677. t.Fatal("Filename was not random ")
  678. }
  679. }
  680. func TestPutExpireJSONUpload(t *testing.T) {
  681. var myjson RespOkJSON
  682. mux := setup()
  683. w := httptest.NewRecorder()
  684. filename := generateBarename() + ".file"
  685. req, err := http.NewRequest("PUT", "/upload/"+filename, strings.NewReader("File content"))
  686. if err != nil {
  687. t.Fatal(err)
  688. }
  689. req.Header.Set("Accept", "application/json")
  690. req.Header.Set("Linx-Expiry", "600")
  691. mux.ServeHTTP(w, req)
  692. err = json.Unmarshal([]byte(w.Body.String()), &myjson)
  693. if err != nil {
  694. t.Fatal(err)
  695. }
  696. expiry, err := strconv.Atoi(myjson.Expiry)
  697. if err != nil {
  698. t.Fatal("Expiry was not an integer")
  699. }
  700. if expiry < 1 {
  701. t.Fatal("Expiry was not set")
  702. }
  703. }
  704. func TestPutAndDelete(t *testing.T) {
  705. var myjson RespOkJSON
  706. mux := setup()
  707. w := httptest.NewRecorder()
  708. req, err := http.NewRequest("PUT", "/upload", strings.NewReader("File content"))
  709. if err != nil {
  710. t.Fatal(err)
  711. }
  712. req.Header.Set("Accept", "application/json")
  713. mux.ServeHTTP(w, req)
  714. err = json.Unmarshal([]byte(w.Body.String()), &myjson)
  715. if err != nil {
  716. t.Fatal(err)
  717. }
  718. // Delete it
  719. w = httptest.NewRecorder()
  720. req, err = http.NewRequest("DELETE", "/"+myjson.Filename, nil)
  721. req.Header.Set("Linx-Delete-Key", myjson.Delete_Key)
  722. mux.ServeHTTP(w, req)
  723. if w.Code != 200 {
  724. t.Fatal("Status code was not 200, but " + strconv.Itoa(w.Code))
  725. }
  726. // Make sure it's actually gone
  727. w = httptest.NewRecorder()
  728. req, err = http.NewRequest("GET", "/"+myjson.Filename, nil)
  729. mux.ServeHTTP(w, req)
  730. if w.Code != 404 {
  731. t.Fatal("Status code was not 404, but " + strconv.Itoa(w.Code))
  732. }
  733. // Make sure torrent is also gone
  734. w = httptest.NewRecorder()
  735. req, err = http.NewRequest("GET", "/"+myjson.Filename+"/torrent", nil)
  736. mux.ServeHTTP(w, req)
  737. if w.Code != 404 {
  738. t.Fatal("Status code was not 404, but " + strconv.Itoa(w.Code))
  739. }
  740. }
  741. func TestPutAndOverwrite(t *testing.T) {
  742. var myjson RespOkJSON
  743. mux := setup()
  744. w := httptest.NewRecorder()
  745. req, err := http.NewRequest("PUT", "/upload", strings.NewReader("File content"))
  746. if err != nil {
  747. t.Fatal(err)
  748. }
  749. req.Header.Set("Accept", "application/json")
  750. mux.ServeHTTP(w, req)
  751. err = json.Unmarshal([]byte(w.Body.String()), &myjson)
  752. if err != nil {
  753. t.Fatal(err)
  754. }
  755. // Overwrite it
  756. w = httptest.NewRecorder()
  757. req, err = http.NewRequest("PUT", "/upload/"+myjson.Filename, strings.NewReader("New file content"))
  758. req.Header.Set("Linx-Delete-Key", myjson.Delete_Key)
  759. mux.ServeHTTP(w, req)
  760. if w.Code != 200 {
  761. t.Fatal("Status code was not 200, but " + strconv.Itoa(w.Code))
  762. }
  763. // Make sure it's the new file
  764. w = httptest.NewRecorder()
  765. req, err = http.NewRequest("GET", "/"+Config.selifPath+myjson.Filename, nil)
  766. mux.ServeHTTP(w, req)
  767. if w.Code == 404 {
  768. t.Fatal("Status code was 404")
  769. }
  770. if w.Body.String() != "New file content" {
  771. t.Fatal("File did not contain 'New file content")
  772. }
  773. }
  774. func TestPutAndSpecificDelete(t *testing.T) {
  775. var myjson RespOkJSON
  776. mux := setup()
  777. w := httptest.NewRecorder()
  778. req, err := http.NewRequest("PUT", "/upload", strings.NewReader("File content"))
  779. if err != nil {
  780. t.Fatal(err)
  781. }
  782. req.Header.Set("Accept", "application/json")
  783. req.Header.Set("Linx-Delete-Key", "supersecret")
  784. mux.ServeHTTP(w, req)
  785. err = json.Unmarshal([]byte(w.Body.String()), &myjson)
  786. if err != nil {
  787. t.Fatal(err)
  788. }
  789. // Delete it
  790. w = httptest.NewRecorder()
  791. req, err = http.NewRequest("DELETE", "/"+myjson.Filename, nil)
  792. req.Header.Set("Linx-Delete-Key", "supersecret")
  793. mux.ServeHTTP(w, req)
  794. if w.Code != 200 {
  795. t.Fatal("Status code was not 200, but " + strconv.Itoa(w.Code))
  796. }
  797. // Make sure it's actually gone
  798. w = httptest.NewRecorder()
  799. req, err = http.NewRequest("GET", "/"+myjson.Filename, nil)
  800. mux.ServeHTTP(w, req)
  801. if w.Code != 404 {
  802. t.Fatal("Status code was not 404, but " + strconv.Itoa(w.Code))
  803. }
  804. // Make sure torrent is gone too
  805. w = httptest.NewRecorder()
  806. req, err = http.NewRequest("GET", "/"+myjson.Filename+"/torrent", nil)
  807. mux.ServeHTTP(w, req)
  808. if w.Code != 404 {
  809. t.Fatal("Status code was not 404, but " + strconv.Itoa(w.Code))
  810. }
  811. }
  812. func TestExtension(t *testing.T) {
  813. barename, extension := barePlusExt("test.jpg.gz")
  814. if barename != "testjpg" {
  815. t.Fatal("Barename was not testjpg, but " + barename)
  816. }
  817. if extension != "gz" {
  818. t.Fatal("Extension was not gz, but " + extension)
  819. }
  820. barename, extension = barePlusExt("test.tar.gz")
  821. if barename != "test" {
  822. t.Fatal("Barename was not test, but " + barename)
  823. }
  824. if extension != "tar.gz" {
  825. t.Fatal("Extension was not tar.gz, but " + extension)
  826. }
  827. }
  828. func TestInferSiteURL(t *testing.T) {
  829. oldSiteURL := Config.siteURL
  830. oldSitePath := Config.sitePath
  831. Config.siteURL = ""
  832. Config.sitePath = "/linxtest/"
  833. mux := setup()
  834. w := httptest.NewRecorder()
  835. req, err := http.NewRequest("GET", "/API/", nil)
  836. req.Host = "example.com:8080"
  837. if err != nil {
  838. t.Fatal(err)
  839. }
  840. mux.ServeHTTP(w, req)
  841. if !strings.Contains(w.Body.String(), "http://example.com:8080/upload/") {
  842. t.Fatal("Site URL not found properly embedded in response")
  843. }
  844. Config.siteURL = oldSiteURL
  845. Config.sitePath = oldSitePath
  846. }
  847. func TestInferSiteURLProxied(t *testing.T) {
  848. oldSiteURL := Config.siteURL
  849. Config.siteURL = ""
  850. mux := setup()
  851. w := httptest.NewRecorder()
  852. req, err := http.NewRequest("GET", "/API/", nil)
  853. req.Header.Add("X-Forwarded-Proto", "https")
  854. req.Host = "example.com:8080"
  855. if err != nil {
  856. t.Fatal(err)
  857. }
  858. mux.ServeHTTP(w, req)
  859. if !strings.Contains(w.Body.String(), "https://example.com:8080/upload/") {
  860. t.Fatal("Site URL not found properly embedded in response")
  861. }
  862. Config.siteURL = oldSiteURL
  863. }
  864. func TestInferSiteURLHTTPS(t *testing.T) {
  865. oldSiteURL := Config.siteURL
  866. oldCertFile := Config.certFile
  867. Config.siteURL = ""
  868. Config.certFile = "/dev/null"
  869. mux := setup()
  870. w := httptest.NewRecorder()
  871. req, err := http.NewRequest("GET", "/API/", nil)
  872. req.Host = "example.com"
  873. if err != nil {
  874. t.Fatal(err)
  875. }
  876. mux.ServeHTTP(w, req)
  877. if !strings.Contains(w.Body.String(), "https://example.com/upload/") {
  878. t.Fatal("Site URL not found properly embedded in response")
  879. }
  880. Config.siteURL = oldSiteURL
  881. Config.certFile = oldCertFile
  882. }
  883. func TestInferSiteURLHTTPSFastCGI(t *testing.T) {
  884. oldSiteURL := Config.siteURL
  885. Config.siteURL = ""
  886. mux := setup()
  887. w := httptest.NewRecorder()
  888. req, err := http.NewRequest("GET", "/API/", nil)
  889. req.Host = "example.com"
  890. req.TLS = &tls.ConnectionState{HandshakeComplete: true}
  891. if err != nil {
  892. t.Fatal(err)
  893. }
  894. mux.ServeHTTP(w, req)
  895. if !strings.Contains(w.Body.String(), "https://example.com/upload/") {
  896. t.Fatal("Site URL not found properly embedded in response")
  897. }
  898. Config.siteURL = oldSiteURL
  899. }
  900. func TestShutdown(t *testing.T) {
  901. os.RemoveAll(Config.filesDir)
  902. os.RemoveAll(Config.metaDir)
  903. }
  904. func TestPutAndGetCLI(t *testing.T) {
  905. var myjson RespOkJSON
  906. mux := setup()
  907. // upload file
  908. w := httptest.NewRecorder()
  909. req, err := http.NewRequest("PUT", "/upload", strings.NewReader("File content"))
  910. if err != nil {
  911. t.Fatal(err)
  912. }
  913. req.Header.Set("Accept", "application/json")
  914. mux.ServeHTTP(w, req)
  915. err = json.Unmarshal([]byte(w.Body.String()), &myjson)
  916. if err != nil {
  917. t.Fatal(err)
  918. }
  919. // request file without wget user agent
  920. w = httptest.NewRecorder()
  921. req, err = http.NewRequest("GET", myjson.Url, nil)
  922. if err != nil {
  923. t.Fatal(err)
  924. }
  925. mux.ServeHTTP(w, req)
  926. contentType := w.Header().Get("Content-Type")
  927. if strings.HasPrefix(contentType, "text/plain") {
  928. t.Fatalf("Didn't receive file display page but %s", contentType)
  929. }
  930. // request file with wget user agent
  931. w = httptest.NewRecorder()
  932. req, err = http.NewRequest("GET", myjson.Url, nil)
  933. req.Header.Set("User-Agent", "wget")
  934. if err != nil {
  935. t.Fatal(err)
  936. }
  937. mux.ServeHTTP(w, req)
  938. contentType = w.Header().Get("Content-Type")
  939. if !strings.HasPrefix(contentType, "text/plain") {
  940. t.Fatalf("Didn't receive file directly but %s", contentType)
  941. }
  942. }