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