Skip to content
Snippets Groups Projects
Verified Commit 7a924c7e authored by Jonas Röger's avatar Jonas Röger
Browse files

Load Service Desk rate limit params from config

parent 7addc835
No related branches found
No related tags found
No related merge requests found
Pipeline #1910 passed with warnings
......@@ -8,13 +8,15 @@ import (
"net/smtp"
)
var (
ServiceDeskDomain = "example.com"
ServiceDeskUser = "noreply"
ServiceDeskPort = 25 // server to server smtp port
ServiceDeskEnabled = false
RateLimitInterval float64 = 180 // 3 Minutes
RateLimitReports = 2 // 2 Reports during interval before beeing rate limited
/* Defaults */
BRServiceDeskDomain = "example.com"
BRServiceDeskUser = "noreply"
BRServiceDeskPort = 25 // server to server smtp port
BRServiceDeskEnabled = false
BRRateLimitInterval float64 = 180 // 3 Minutes
BRRateLimitReports = 2 // 2 Reports during interval before beeing rate limited
userAccess map[string]access = make(map[string]access)
)
......@@ -35,12 +37,12 @@ func BRIsUserRateLimited(u *User) bool {
}
/* Ok if no critical ammount of records */
if len(record.lastAccess) < RateLimitReports {
if len(record.lastAccess) < BRRateLimitReports {
return false
}
/* Check if earliest record is in interval, then block */
if time.Since(record.lastAccess[0]).Seconds() < RateLimitInterval {
if time.Since(record.lastAccess[0]).Seconds() < BRRateLimitInterval {
return true
}
......@@ -59,7 +61,7 @@ func registerUserAccess(u *User) {
lastBlock: time.Time{},
lastAccess: []time.Time{time.Now()},
}
} else if len(record.lastAccess) < RateLimitReports {
} else if len(record.lastAccess) < BRRateLimitReports {
/* No critical ammount of records */
record.lastAccess = append(record.lastAccess, time.Now())
} else if !BRIsUserRateLimited(u) {
......@@ -74,16 +76,16 @@ func registerUserAccess(u *User) {
* Send bugreport
*/
func BRDispatchBugreport(u *User, subject string, content string) error {
if !ServiceDeskEnabled {
if !BRServiceDeskEnabled {
return errors.New("Service Desk is disabled")
}
recipient := ServiceDeskUser + "@" + ServiceDeskDomain
recipient := BRServiceDeskUser + "@" + BRServiceDeskDomain
recipients := []string{recipient}
formatContent := fmt.Sprintf("From: %s\nSubject: %s\n\n%s", u.Name, subject, content)
err := smtp.SendMail(ServiceDeskDomain+":"+strconv.Itoa(ServiceDeskPort),
err := smtp.SendMail(BRServiceDeskDomain+":"+strconv.Itoa(BRServiceDeskPort),
nil, u.Name, recipients, []byte(formatContent))
if err == nil {
registerUserAccess(u)
......
......@@ -427,6 +427,8 @@ func Server() error {
ChallengeInfoDir: "../challenges/info/",
SSHHost: "ctf.foss-ag.de",
ServiceDeskMail: "-", // service desk disabled
ServiceDeskRateLimitReports: BRRateLimitReports,
ServiceDeskRateLimitInterval: BRRateLimitInterval,
}
configBytes, _ := json.MarshalIndent(config, "", "\t")
_ = ioutil.WriteFile("config.json", configBytes, os.FileMode(0600))
......@@ -452,32 +454,35 @@ func Server() error {
// setup servicedesk vars
if config.ServiceDeskMail == "-" {
ServiceDeskEnabled = false
BRServiceDeskEnabled = false
} else {
ServiceDeskEnabled = true
BRServiceDeskEnabled = true
split := strings.Split(config.ServiceDeskMail, ":")
if len(split) > 1 {
port, err := strconv.Atoi(split[1])
if err != nil {
log.Printf("Config: ServiceDeskMail bad format: %s", err)
ServiceDeskEnabled = false
BRServiceDeskEnabled = false
} else {
ServiceDeskPort = port
BRServiceDeskPort = port
}
}
split = strings.Split(split[0], "@")
if len(split) < 2 {
log.Printf("Config: ServiceDeskMail bad format: %s", "bad address")
ServiceDeskEnabled = false
log.Printf("Config: BRServiceDeskMail bad format: %s", "bad address")
BRServiceDeskEnabled = false
} else {
ServiceDeskDomain = split[1]
ServiceDeskUser = split[0]
BRServiceDeskDomain = split[1]
BRServiceDeskUser = split[0]
}
}
if ServiceDeskEnabled {
fmt.Printf("ServiceDesk running at %s@%s:%d\n",
ServiceDeskUser, ServiceDeskDomain, ServiceDeskPort)
BRRateLimitReports = config.ServiceDeskRateLimitReports
BRRateLimitInterval = config.ServiceDeskRateLimitInterval
if BRServiceDeskEnabled {
fmt.Printf("ServiceDesk running at %s@%s:%d (Max %dR/%.02fs)\n",
BRServiceDeskUser, BRServiceDeskDomain, BRServiceDeskPort,
BRRateLimitReports, BRRateLimitInterval)
} else {
fmt.Println("ServiceDesk disabled")
}
......
......@@ -46,6 +46,8 @@ type Config struct {
ChallengeInfoDir string `json:"challinfodir"`
SSHHost string `json:"sshhost"`
ServiceDeskMail string `json:"servicedeskmailwithport"`
ServiceDeskRateLimitInterval float64 `servicedeskratelimitinterval` // See bugreport.go
ServiceDeskRateLimitReports int `servicedeskratelimitreports` // See bugreport.go
}
// User, was ist das wohl
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment