Skip to content

Commit 3faba84

Browse files
Fix recibo proposição e adiciona rate limiter em matéria e norma
1 parent bda00ac commit 3faba84

File tree

11 files changed

+51
-24
lines changed

11 files changed

+51
-24
lines changed

.dockerignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,10 @@ bower
1212
.travis.yml
1313
.env
1414
.idea
15+
.DS_Store
16+
.coveragerc
17+
*.swp
18+
.coveragerc
19+
.drone.yml
20+
.github
21+
release.sh

docker/config/nginx/sapl.conf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ upstream sapl_server {
77
server {
88

99
listen 80;
10-
server_name sapl.test;
10+
server_name sapl.prod;
1111

1212
client_max_body_size 4G;
1313

docker/startup_scripts/gunicorn.conf.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@
5252
keepalive = 10
5353
backlog = 2048
5454
max_requests = MAX_REQUESTS
55-
max_requests_jitter = 100
55+
max_requests_jitter = 200
56+
worker_max_memory_per_child = 300 * 1024 * 1024 # 300 MB cap
5657

5758
# Environment (same as exporting before running)
5859
raw_env = [

docker/startup_scripts/start.sh

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,16 @@ IFS=$'\n\t'
44

55
APP_DIR="/var/interlegis/sapl"
66
DATA_DIR="/var/interlegis/sapl/data"
7-
MEDIA_DIR="/var/interlegis/sapl/media"
87
RUN_DIR="/var/interlegis/sapl/run"
98

109
ENV_FILE="$APP_DIR/.env"
1110
SECRET_FILE="$DATA_DIR/secret.key"
1211

1312
chown -R root:nginx "$RUN_DIR" || true
14-
chown -R root:nginx "$MEDIA_DIR" || true
1513
chmod -R g+rwX "$RUN_DIR" || true
16-
chmod -R g+rwX "$MEDIA_DIR" || true
1714

1815
# setgid bit on our writable trees (not data/)
19-
find "$RUN_DIR" "$MEDIA_DIR" -type d -exec chmod g+s {} + 2>/dev/null || true
16+
find "$RUN_DIR" -type d -exec chmod g+s {} + 2>/dev/null || true
2017

2118
log() { printf '[%s] %s\n' "$(date -Is)" "$*"; }
2219
err() { printf '[%s] ERROR: %s\n' "$(date -Is)" "$*" >&2; }

requirements/requirements.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ pytz==2019.3
2222
python-magic==0.4.15
2323
unipath==1.1
2424
Pillow==10.3.0
25-
rlPyCairo==0.3.0
26-
reportlab==4.2.0
25+
reportlab==3.6.13
2726
WeasyPrint==66
2827
trml2pdf==0.6
2928
gunicorn==23.0.0

sapl/base/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ def get(self, request, *args, **kwargs):
6868

6969

7070
@method_decorator(ratelimit(key=lambda group, request: get_client_ip(request),
71-
rate='20/m',
71+
rate='10/m',
7272
method=ratelimit.UNSAFE,
7373
block=True), name='dispatch')
7474
class LoginSapl(views.LoginView):

sapl/materia/views.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,16 @@
2424
from django.template import loader
2525
from django.urls import reverse
2626
from django.utils import formats, timezone
27-
from django.utils.encoding import force_text
2827
from django.utils.translation import ugettext_lazy as _
2928
from django.views.generic import CreateView, ListView, TemplateView, UpdateView
3029
from django.views.generic.base import RedirectView
3130
from django.views.generic.edit import FormView
3231
from django_filters.views import FilterView
3332
import weasyprint
3433

34+
from ratelimit.decorators import ratelimit
35+
from django.utils.decorators import method_decorator
36+
3537
import sapl
3638
from sapl.base.email_utils import do_envia_email_confirmacao
3739
from sapl.base.models import Autor, CasaLegislativa, AppConfig as BaseAppConfig
@@ -1459,6 +1461,7 @@ def get_initial(self):
14591461

14601462
return initial
14611463

1464+
@method_decorator(ratelimit(key='ip', rate='10/m', block=True), name='dispatch')
14621465
class ListView(MasterDetailCrud.ListView):
14631466

14641467
def get_queryset(self):
@@ -1531,6 +1534,7 @@ def delete(self, request, *args, **kwargs):
15311534

15321535
return HttpResponseRedirect(url)
15331536

1537+
@method_decorator(ratelimit(key='ip', rate='10/m', block=True), name='dispatch')
15341538
class DetailView(MasterDetailCrud.DetailView):
15351539

15361540
template_name = "materia/tramitacao_detail.html"
@@ -1908,6 +1912,7 @@ class DeleteView(Crud.DeleteView):
19081912
def get_success_url(self):
19091913
return self.search_url
19101914

1915+
@method_decorator(ratelimit(key='ip', rate='10/m', block=True), name='dispatch')
19111916
class DetailView(Crud.DetailView):
19121917

19131918
layout_key = 'MateriaLegislativaDetail'
@@ -1920,6 +1925,7 @@ def get_context_data(self, **kwargs):
19201925
pk=self.kwargs['pk'])
19211926
return context
19221927

1928+
@method_decorator(ratelimit(key='ip', rate='10/m', block=True), name='dispatch')
19231929
class ListView(Crud.ListView, RedirectView):
19241930

19251931
def get_redirect_url(self, *args, **kwargs):
@@ -2040,6 +2046,7 @@ def get(self, request, *args, **kwargs):
20402046
return HttpResponseRedirect(self.get_success_url())
20412047

20422048

2049+
@method_decorator(ratelimit(key='ip', rate='10/m', block=True), name='dispatch')
20432050
class MateriaLegislativaPesquisaView(MultiFormatOutputMixin, FilterView):
20442051
model = MateriaLegislativa
20452052
filterset_class = MateriaLegislativaFilterSet

sapl/norma/views.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@
1919
from django_filters.views import FilterView
2020
import weasyprint
2121

22+
from ratelimit.decorators import ratelimit
23+
from django.utils.decorators import method_decorator
24+
2225
from sapl import settings
2326
import sapl
2427
from sapl.base.models import AppConfig
@@ -147,6 +150,7 @@ class DetailView(MasterDetailCrud.DetailView):
147150
layout_key = 'NormaRelacionadaDetail'
148151

149152

153+
@method_decorator(ratelimit(key='ip', rate='10/m', block=True), name='dispatch')
150154
class NormaPesquisaView(MultiFormatOutputMixin, FilterView):
151155
model = NormaJuridica
152156
filterset_class = NormaFilterSet
@@ -232,6 +236,7 @@ def get_initial(self):
232236
initial['ano'] = self.object.ano
233237
return initial
234238

239+
@method_decorator(ratelimit(key='ip', rate='10/m', block=True), name='dispatch')
235240
class DetailView(MasterDetailCrud.DetailView):
236241
form_class = AnexoNormaJuridicaForm
237242
layout_key = 'AnexoNormaJuridica'
@@ -280,6 +285,7 @@ def search_url(self):
280285
namespace = self.model._meta.app_config.name
281286
return reverse('%s:%s' % (namespace, 'norma_pesquisa'))
282287

288+
@method_decorator(ratelimit(key='ip', rate='10/m', block=True), name='dispatch')
283289
class DetailView(Crud.DetailView):
284290
def get(self, request, *args, **kwargs):
285291
estatisticas_acesso_normas = AppConfig.objects.first().estatisticas_acesso_normas
@@ -337,6 +343,7 @@ def get_initial(self):
337343

338344
layout_key = 'NormaJuridicaCreate'
339345

346+
@method_decorator(ratelimit(key='ip', rate='10/m', block=True), name='dispatch')
340347
class ListView(Crud.ListView):
341348

342349
def get(self, request, *args, **kwargs):

sapl/sessao/views.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
from django_filters.views import FilterView
2929
import pytz
3030

31+
from ratelimit.decorators import ratelimit
32+
from django.utils.decorators import method_decorator
33+
3134
from sapl.base.models import AppConfig as AppsAppConfig
3235
from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux,
3336
MasterDetailCrud,
@@ -3794,6 +3797,7 @@ def get_context_data(self, **kwargs):
37943797
return context
37953798

37963799

3800+
@method_decorator(ratelimit(key='ip', rate='10/m', block=True), name='dispatch')
37973801
class PautaSessaoView(TemplateView):
37983802
model = SessaoPlenaria
37993803
template_name = "sessao/pauta_inexistente.html"
@@ -3809,6 +3813,7 @@ def get(self, request, *args, **kwargs):
38093813
reverse('sapl.sessao:pauta_sessao_detail', kwargs={'pk': sessao.pk}))
38103814

38113815

3816+
@method_decorator(ratelimit(key='ip', rate='10/m', block=True), name='dispatch')
38123817
class PautaSessaoDetailView(PautaMultiFormatOutputMixin, DetailView):
38133818
template_name = "sessao/pauta_sessao_detail.html"
38143819
model = SessaoPlenaria

sapl/utils.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -419,21 +419,25 @@ def get_base_url(request):
419419
return "{0}://{1}".format(protocol, current_domain)
420420

421421

422-
def create_barcode(value, width=170, height=50):
423-
'''
424-
creates a base64 encoded barcode PNG image
425-
'''
422+
def create_barcode(value, width=170, height=50, dpi=72):
423+
"""
424+
creates a base64 encoded barcode PNG image
425+
"""
426426
from base64 import b64encode
427427
from reportlab.graphics.barcode import createBarcodeDrawing
428+
428429
value_bytes = bytes(value, "ascii")
429-
barcode = createBarcodeDrawing('Code128',
430-
value=value_bytes,
431-
barWidth=width,
432-
height=height,
433-
fontSize=2,
434-
humanReadable=True)
435-
data = b64encode(barcode.asString('png'))
436-
return data.decode('utf-8')
430+
barcode = createBarcodeDrawing(
431+
'Code128',
432+
value=value_bytes,
433+
barWidth=width,
434+
height=height,
435+
fontSize=2,
436+
humanReadable=True
437+
)
438+
# Lower DPI prevents Cairo surface from blowing up
439+
png_bytes = barcode.asString("png", dpi=dpi)
440+
return b64encode(png_bytes).decode("utf-8")
437441

438442

439443
YES_NO_CHOICES = [(True, _('Sim')), (False, _('Não'))]

0 commit comments

Comments
 (0)