tasks.go 2.4 KB

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