diff --git a/cmd/drone-server/server.go b/cmd/drone-server/server.go index 21cb99f53..3e200239c 100644 --- a/cmd/drone-server/server.go +++ b/cmd/drone-server/server.go @@ -619,6 +619,7 @@ func setupEvilGlobals(c *cli.Context, v store.Store, r remote.Remote) { droneserver.Config.Services.Secrets = setupSecretService(c, v) droneserver.Config.Services.Senders = sender.New(v, v) droneserver.Config.Services.Environ = setupEnvironService(c, v) + droneserver.Config.Services.Limiter = setupLimiter(c, v) if endpoint := c.String("gating-service"); endpoint != "" { droneserver.Config.Services.Senders = sender.NewRemote(endpoint) diff --git a/cmd/drone-server/setup.go b/cmd/drone-server/setup.go index d621d9f7d..a10d66c44 100644 --- a/cmd/drone-server/setup.go +++ b/cmd/drone-server/setup.go @@ -46,6 +46,10 @@ func setupEnvironService(c *cli.Context, s store.Store) model.EnvironService { return nil } +func setupLimiter(c *cli.Context, s store.Store) model.Limiter { + return new(model.NoLimit) +} + func setupPubsub(c *cli.Context) {} func setupStream(c *cli.Context) {} func setupGatingService(c *cli.Context) {} diff --git a/server/hook.go b/server/hook.go index dbe7673de..ba81fc4c9 100644 --- a/server/hook.go +++ b/server/hook.go @@ -197,6 +197,11 @@ func PostHook(c *gin.Context) { } } + if err = Config.Services.Limiter.LimitBuild(user, repo, build); err != nil { + c.String(403, "Build blocked by limiter") + return + } + build.Trim() err = store.CreateBuild(c, build, build.Procs...) if err != nil { diff --git a/server/login.go b/server/login.go index e72ca9d4a..0a41ff395 100644 --- a/server/login.go +++ b/server/login.go @@ -81,6 +81,11 @@ func HandleAuth(c *gin.Context) { ), } + if err = Config.Services.Limiter.LimitUser(u); err != nil { + c.String(403, "User activation blocked by limiter") + return + } + // insert the user into the database if err := store.CreateUser(c, u); err != nil { logrus.Errorf("cannot insert %s. %s", u.Login, err) diff --git a/server/repo.go b/server/repo.go index b02eef57f..42e95c340 100644 --- a/server/repo.go +++ b/server/repo.go @@ -27,6 +27,11 @@ func PostRepo(c *gin.Context) { return } + if err := Config.Services.Limiter.LimitRepo(user, repo); err != nil { + c.String(403, "Repository activation blocked by limiter") + return + } + repo.IsActive = true repo.UserID = user.ID if !repo.AllowPush && !repo.AllowPull && !repo.AllowDeploy && !repo.AllowTag { diff --git a/server/rpc.go b/server/rpc.go index ef09069f5..2fcd3737d 100644 --- a/server/rpc.go +++ b/server/rpc.go @@ -41,6 +41,7 @@ var Config = struct { Secrets model.SecretService Registries model.RegistryService Environ model.EnvironService + Limiter model.Limiter } Storage struct { // Users model.UserStore