mirror of https://github.com/interlegis/sigi.git
Vitor Choi
8 years ago
10 changed files with 123 additions and 1 deletions
@ -0,0 +1,3 @@ |
|||
from django.contrib import admin |
|||
|
|||
# Register your models here. |
@ -0,0 +1,3 @@ |
|||
from django.db import models |
|||
|
|||
# Create your models here. |
@ -0,0 +1,3 @@ |
|||
from django.test import TestCase |
|||
|
|||
# Create your tests here. |
@ -0,0 +1,10 @@ |
|||
# coding: utf-8 |
|||
from django.conf.urls import patterns, url |
|||
from django.views.generic.base import TemplateView |
|||
from . import views |
|||
|
|||
urlpatterns = patterns( |
|||
'', |
|||
url(r'^(?P<dominio>.+)$', views.whois_query), |
|||
) |
|||
|
@ -0,0 +1,86 @@ |
|||
# coding: utf-8 |
|||
from django.http import HttpResponse,HttpResponseBadRequest |
|||
from django.shortcuts import render |
|||
from django.views.decorators.csrf import csrf_exempt |
|||
|
|||
from rest_framework import status, permissions |
|||
from rest_framework.response import Response |
|||
from rest_framework.decorators import api_view, permission_classes |
|||
|
|||
import re |
|||
from urlparse import urlparse |
|||
from collections import OrderedDict |
|||
|
|||
from sigi.apps.servicos.models import * |
|||
from sigi.settings import WHOIS_WHITELIST |
|||
|
|||
class WhitelistPermission(permissions.BasePermission): |
|||
""" |
|||
Allow only whitelisted IP addresses |
|||
""" |
|||
|
|||
def has_permission(self, request, view): |
|||
ip_addr = request.META['REMOTE_ADDR'] |
|||
if ip_addr in WHOIS_WHITELIST: |
|||
return True |
|||
else: |
|||
return False |
|||
|
|||
def consulta_valida(consulta): |
|||
""" |
|||
Determina se uma consulta é válida. Além de ser um domínio válido, deve terminar em uf.leg.br |
|||
""" |
|||
|
|||
regex_dominio=r'^[a-zA-Z\d]{,63}(\.[a-zA-Z\d-]{,63})*.(ac|al|ap|am|ba|ce|df|es|go|ma|mt|ms|mg|pr|pb|pa|pe|pi|rj|rn|rs|ro|rr|sc|se|sp|to).leg.br$' |
|||
m = re.match(regex_dominio, consulta) |
|||
if m == None: |
|||
return False |
|||
|
|||
return True |
|||
|
|||
def match_url_dominio(url, dominio): |
|||
""" |
|||
Compara o url cadastrado no serviço com o domínio pesquisado. |
|||
""" |
|||
|
|||
url=urlparse(url) |
|||
if url.netloc == dominio: |
|||
return True |
|||
else: |
|||
return False |
|||
|
|||
@api_view(['GET']) |
|||
@permission_classes([WhitelistPermission]) |
|||
def whois_query(request, dominio): |
|||
""" |
|||
Consulta a base do SIGI por um domínio e retorna um dicionário. |
|||
""" |
|||
|
|||
if not consulta_valida(dominio): |
|||
return Response({'detail':'406 Not Acceptable'}, status=status.HTTP_406_NOT_ACCEPTABLE) |
|||
|
|||
servicos = Servico.objects.filter(tipo_servico__sigla='LEGBR', url__contains=dominio) |
|||
resposta_dic = OrderedDict() |
|||
|
|||
for s in servicos: |
|||
# valida se pegamos o dominio correto, a busca pode retornar mais de |
|||
# um registro. ex. municipio.mg.leg.br / novomunicipio.mg.leg.br |
|||
# não sei se existe algum caso, mas é possível no algoritmo. |
|||
if not match_url_dominio(s.url, dominio): |
|||
next |
|||
|
|||
resposta_dic['_encoding'] = 'utf-8' |
|||
resposta_dic['domain'] = urlparse(s.url).netloc |
|||
resposta_dic['owner'] = "%s - %s " % (s.casa_legislativa.nome, s.casa_legislativa.municipio.uf.sigla) |
|||
resposta_dic['cnpj'] = s.casa_legislativa.cnpj |
|||
resposta_dic['created'] = unicode(s.data_ativacao) |
|||
resposta_dic['modified'] = unicode(s.data_alteracao) |
|||
resposta_dic['tech-name'] = s.contato_tecnico.nome |
|||
resposta_dic['tech-email'] = s.contato_tecnico.email |
|||
resposta_dic['tech-modified'] = unicode(s.contato_tecnico.ult_alteracao) |
|||
resposta_dic['admin-name'] = s.contato_administrativo.nome |
|||
resposta_dic['admin-email'] = s.contato_administrativo.email |
|||
resposta_dic['admin-modified'] = unicode(s.contato_administrativo.ult_alteracao) |
|||
|
|||
return Response(resposta_dic, status=status.HTTP_200_OK) |
|||
|
Loading…
Reference in new issue