|
@@ -9,6 +9,7 @@ import (
|
|
|
"heckel.io/ntfy/util"
|
|
"heckel.io/ntfy/util"
|
|
|
"log"
|
|
"log"
|
|
|
"math"
|
|
"math"
|
|
|
|
|
+ "net"
|
|
|
"strings"
|
|
"strings"
|
|
|
"time"
|
|
"time"
|
|
|
)
|
|
)
|
|
@@ -45,6 +46,7 @@ var flagsServe = []cli.Flag{
|
|
|
altsrc.NewStringFlag(&cli.StringFlag{Name: "visitor-attachment-daily-bandwidth-limit", EnvVars: []string{"NTFY_VISITOR_ATTACHMENT_DAILY_BANDWIDTH_LIMIT"}, Value: "500M", Usage: "total daily attachment download/upload bandwidth limit per visitor"}),
|
|
altsrc.NewStringFlag(&cli.StringFlag{Name: "visitor-attachment-daily-bandwidth-limit", EnvVars: []string{"NTFY_VISITOR_ATTACHMENT_DAILY_BANDWIDTH_LIMIT"}, Value: "500M", Usage: "total daily attachment download/upload bandwidth limit per visitor"}),
|
|
|
altsrc.NewIntFlag(&cli.IntFlag{Name: "visitor-request-limit-burst", EnvVars: []string{"NTFY_VISITOR_REQUEST_LIMIT_BURST"}, Value: server.DefaultVisitorRequestLimitBurst, Usage: "initial limit of requests per visitor"}),
|
|
altsrc.NewIntFlag(&cli.IntFlag{Name: "visitor-request-limit-burst", EnvVars: []string{"NTFY_VISITOR_REQUEST_LIMIT_BURST"}, Value: server.DefaultVisitorRequestLimitBurst, Usage: "initial limit of requests per visitor"}),
|
|
|
altsrc.NewDurationFlag(&cli.DurationFlag{Name: "visitor-request-limit-replenish", EnvVars: []string{"NTFY_VISITOR_REQUEST_LIMIT_REPLENISH"}, Value: server.DefaultVisitorRequestLimitReplenish, Usage: "interval at which burst limit is replenished (one per x)"}),
|
|
altsrc.NewDurationFlag(&cli.DurationFlag{Name: "visitor-request-limit-replenish", EnvVars: []string{"NTFY_VISITOR_REQUEST_LIMIT_REPLENISH"}, Value: server.DefaultVisitorRequestLimitReplenish, Usage: "interval at which burst limit is replenished (one per x)"}),
|
|
|
|
|
+ altsrc.NewStringFlag(&cli.StringFlag{Name: "visitor-request-limit-exempt-hosts", EnvVars: []string{"NTFY_VISITOR_REQUEST_LIMIT_EXEMPT_HOSTS"}, Value: "", Usage: "hostnames and/or IP addresses of hosts that will be exempt from the visitor request limit"}),
|
|
|
altsrc.NewIntFlag(&cli.IntFlag{Name: "visitor-email-limit-burst", EnvVars: []string{"NTFY_VISITOR_EMAIL_LIMIT_BURST"}, Value: server.DefaultVisitorEmailLimitBurst, Usage: "initial limit of e-mails per visitor"}),
|
|
altsrc.NewIntFlag(&cli.IntFlag{Name: "visitor-email-limit-burst", EnvVars: []string{"NTFY_VISITOR_EMAIL_LIMIT_BURST"}, Value: server.DefaultVisitorEmailLimitBurst, Usage: "initial limit of e-mails per visitor"}),
|
|
|
altsrc.NewDurationFlag(&cli.DurationFlag{Name: "visitor-email-limit-replenish", EnvVars: []string{"NTFY_VISITOR_EMAIL_LIMIT_REPLENISH"}, Value: server.DefaultVisitorEmailLimitReplenish, Usage: "interval at which burst limit is replenished (one per x)"}),
|
|
altsrc.NewDurationFlag(&cli.DurationFlag{Name: "visitor-email-limit-replenish", EnvVars: []string{"NTFY_VISITOR_EMAIL_LIMIT_REPLENISH"}, Value: server.DefaultVisitorEmailLimitReplenish, Usage: "interval at which burst limit is replenished (one per x)"}),
|
|
|
altsrc.NewBoolFlag(&cli.BoolFlag{Name: "behind-proxy", Aliases: []string{"P"}, EnvVars: []string{"NTFY_BEHIND_PROXY"}, Value: false, Usage: "if set, use X-Forwarded-For header to determine visitor IP address (for rate limiting)"}),
|
|
altsrc.NewBoolFlag(&cli.BoolFlag{Name: "behind-proxy", Aliases: []string{"P"}, EnvVars: []string{"NTFY_BEHIND_PROXY"}, Value: false, Usage: "if set, use X-Forwarded-For header to determine visitor IP address (for rate limiting)"}),
|
|
@@ -104,6 +106,7 @@ func execServe(c *cli.Context) error {
|
|
|
visitorAttachmentDailyBandwidthLimitStr := c.String("visitor-attachment-daily-bandwidth-limit")
|
|
visitorAttachmentDailyBandwidthLimitStr := c.String("visitor-attachment-daily-bandwidth-limit")
|
|
|
visitorRequestLimitBurst := c.Int("visitor-request-limit-burst")
|
|
visitorRequestLimitBurst := c.Int("visitor-request-limit-burst")
|
|
|
visitorRequestLimitReplenish := c.Duration("visitor-request-limit-replenish")
|
|
visitorRequestLimitReplenish := c.Duration("visitor-request-limit-replenish")
|
|
|
|
|
+ visitorRequestLimitExemptHosts := util.SplitNoEmpty(c.String("visitor-request-limit-exempt-hosts"), ",")
|
|
|
visitorEmailLimitBurst := c.Int("visitor-email-limit-burst")
|
|
visitorEmailLimitBurst := c.Int("visitor-email-limit-burst")
|
|
|
visitorEmailLimitReplenish := c.Duration("visitor-email-limit-replenish")
|
|
visitorEmailLimitReplenish := c.Duration("visitor-email-limit-replenish")
|
|
|
behindProxy := c.Bool("behind-proxy")
|
|
behindProxy := c.Bool("behind-proxy")
|
|
@@ -164,6 +167,19 @@ func execServe(c *cli.Context) error {
|
|
|
return fmt.Errorf("config option visitor-attachment-daily-bandwidth-limit must be lower than %d", math.MaxInt)
|
|
return fmt.Errorf("config option visitor-attachment-daily-bandwidth-limit must be lower than %d", math.MaxInt)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Resolve hosts
|
|
|
|
|
+ visitorRequestLimitExemptIPs := make([]string, 0)
|
|
|
|
|
+ for _, host := range visitorRequestLimitExemptHosts {
|
|
|
|
|
+ ips, err := net.LookupIP(host)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ log.Printf("cannot resolve host %s: %s, ignoring visitor request exemption", host, err.Error())
|
|
|
|
|
+ continue
|
|
|
|
|
+ }
|
|
|
|
|
+ for _, ip := range ips {
|
|
|
|
|
+ visitorRequestLimitExemptIPs = append(visitorRequestLimitExemptIPs, ip.String())
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// Run server
|
|
// Run server
|
|
|
conf := server.NewConfig()
|
|
conf := server.NewConfig()
|
|
|
conf.BaseURL = baseURL
|
|
conf.BaseURL = baseURL
|
|
@@ -197,6 +213,7 @@ func execServe(c *cli.Context) error {
|
|
|
conf.VisitorAttachmentDailyBandwidthLimit = int(visitorAttachmentDailyBandwidthLimit)
|
|
conf.VisitorAttachmentDailyBandwidthLimit = int(visitorAttachmentDailyBandwidthLimit)
|
|
|
conf.VisitorRequestLimitBurst = visitorRequestLimitBurst
|
|
conf.VisitorRequestLimitBurst = visitorRequestLimitBurst
|
|
|
conf.VisitorRequestLimitReplenish = visitorRequestLimitReplenish
|
|
conf.VisitorRequestLimitReplenish = visitorRequestLimitReplenish
|
|
|
|
|
+ conf.VisitorRequestExemptIPAddrs = visitorRequestLimitExemptIPs
|
|
|
conf.VisitorEmailLimitBurst = visitorEmailLimitBurst
|
|
conf.VisitorEmailLimitBurst = visitorEmailLimitBurst
|
|
|
conf.VisitorEmailLimitReplenish = visitorEmailLimitReplenish
|
|
conf.VisitorEmailLimitReplenish = visitorEmailLimitReplenish
|
|
|
conf.BehindProxy = behindProxy
|
|
conf.BehindProxy = behindProxy
|