1
0

tasks.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package repo
  2. import (
  3. "net/http"
  4. "gopkg.in/macaron.v1"
  5. log "unknwon.dev/clog/v2"
  6. "gogs.io/gogs/internal/cryptoutil"
  7. "gogs.io/gogs/internal/database"
  8. )
  9. func TriggerTask(c *macaron.Context) {
  10. branch := c.Query("branch")
  11. pusherID := c.QueryInt64("pusher")
  12. secret := c.Query("secret")
  13. if branch == "" || pusherID <= 0 || secret == "" {
  14. c.Error(http.StatusBadRequest, "Incomplete branch, pusher or secret")
  15. return
  16. }
  17. username := c.Params(":username")
  18. reponame := c.Params(":reponame")
  19. owner, err := database.Handle.Users().GetByUsername(c.Req.Context(), username)
  20. if err != nil {
  21. if database.IsErrUserNotExist(err) {
  22. c.Error(http.StatusBadRequest, "Owner does not exist")
  23. } else {
  24. c.Status(http.StatusInternalServerError)
  25. log.Error("Failed to get user [name: %s]: %v", username, err)
  26. }
  27. return
  28. }
  29. // 🚨 SECURITY: No need to check existence of the repository if the client
  30. // can't even get the valid secret. Mostly likely not a legitimate request.
  31. if secret != cryptoutil.MD5(owner.Salt) {
  32. c.Error(http.StatusBadRequest, "Invalid secret")
  33. return
  34. }
  35. repo, err := database.Handle.Repositories().GetByName(c.Req.Context(), owner.ID, reponame)
  36. if err != nil {
  37. if database.IsErrRepoNotExist(err) {
  38. c.Error(http.StatusBadRequest, "Repository does not exist")
  39. } else {
  40. c.Status(http.StatusInternalServerError)
  41. log.Error("Failed to get repository [owner_id: %d, name: %s]: %v", owner.ID, reponame, err)
  42. }
  43. return
  44. }
  45. pusher, err := database.Handle.Users().GetByID(c.Req.Context(), pusherID)
  46. if err != nil {
  47. if database.IsErrUserNotExist(err) {
  48. c.Error(http.StatusBadRequest, "Pusher does not exist")
  49. } else {
  50. c.Status(http.StatusInternalServerError)
  51. log.Error("Failed to get user [id: %d]: %v", pusherID, err)
  52. }
  53. return
  54. }
  55. log.Trace("TriggerTask: %s/%s@%s by %q", owner.Name, repo.Name, branch, pusher.Name)
  56. go database.HookQueue.Add(repo.ID)
  57. go database.AddTestPullRequestTask(pusher, repo.ID, branch, true)
  58. c.Status(http.StatusAccepted)
  59. }