97) -> werkzeug.Response | None:
98
99
100 redis_client = redisdb.client()
101
102 if network.is_link_local and not cfg['botdetection.ip_limit.filter_link_local']:
103 logger.debug("network %s is link-local -> not monitored by ip_limit method", network.compressed)
104 return None
105
106 if request.args.get('format', 'html') != 'html':
107 c = incr_sliding_window(redis_client, 'ip_limit.API_WINDOW:' + network.compressed, API_WINDOW)
108 if c > API_MAX:
109 return too_many_requests(network, "too many request in API_WINDOW")
110
111 if cfg['botdetection.ip_limit.link_token']:
112
113 suspicious = link_token.is_suspicious(network, request, True)
114
115 if not suspicious:
116
117 drop_counter(redis_client, 'ip_limit.SUSPICIOUS_IP_WINDOW' + network.compressed)
118 return None
119
120
121 c = incr_sliding_window(
122 redis_client, 'ip_limit.SUSPICIOUS_IP_WINDOW' + network.compressed, SUSPICIOUS_IP_WINDOW
123 )
124 if c > SUSPICIOUS_IP_MAX:
125 logger.error("BLOCK: too many request from %s in SUSPICIOUS_IP_WINDOW (redirect to /)", network)
126 response = flask.redirect(flask.url_for('index'), code=302)
127 response.headers["Cache-Control"] = "no-store, max-age=0"
128 return response
129
130 c = incr_sliding_window(redis_client, 'ip_limit.BURST_WINDOW' + network.compressed, BURST_WINDOW)
131 if c > BURST_MAX_SUSPICIOUS:
132 return too_many_requests(network, "too many request in BURST_WINDOW (BURST_MAX_SUSPICIOUS)")
133
134 c = incr_sliding_window(redis_client, 'ip_limit.LONG_WINDOW' + network.compressed, LONG_WINDOW)
135 if c > LONG_MAX_SUSPICIOUS:
136 return too_many_requests(network, "too many request in LONG_WINDOW (LONG_MAX_SUSPICIOUS)")
137
138 return None
139
140
141 c = incr_sliding_window(redis_client, 'ip_limit.BURST_WINDOW' + network.compressed, BURST_WINDOW)
142 if c > BURST_MAX:
143 return too_many_requests(network, "too many request in BURST_WINDOW (BURST_MAX)")
144
145 c = incr_sliding_window(redis_client, 'ip_limit.LONG_WINDOW' + network.compressed, LONG_WINDOW)
146 if c > LONG_MAX:
147 return too_many_requests(network, "too many request in LONG_WINDOW (LONG_MAX)")
148
149 return None