def check_votes(self, min_ratio=0.6): ''' Check if this entity received sufficient positive votes. ''' root_servers = Server.all() ratio = votes.filter(is_positive=True).count() / float(root_servers.count()) if ratio >= min_ratio: self.is_active = True self.save() Queue.broadcast('request_entity', entity=self)
def process_request(self, request): request.server = Server.self() request.is_secured = False # Read potential headers content_encryption = request.META.get('HTTP_CONTENT_ENCRYPTION', None) server_fqdn = request.META.get('HTTP_SERVER_FQDN', None) # Got them if content_encryption and server_fqdn: print 'content_encryption', content_encryption print 'server_fqdn', server_fqdn # Lookup server try: request.client = Server.objects.get(fqdn=server_fqdn, is_active=True) except Server.DoesNotExist: return HttpResponseForbidden('Server not found.') # Chunked RSA-encrypted POST request if content_encryption.lower() == 'rsa-chunked': if request.method == 'POST': chunks = request.POST.get('chunks', '') # Decrypt POST-data if chunks and chunks.isdigit(): chunks = int(chunks) own_key = request.server._private_key his_key = request.client._public_key try: post_decrypted = [] for chunk in xrange(0, chunks): own = request.POST.get('his%d' % (chunk,)).decode('base64') his = request.POST.get('own%d' % (chunk,)).decode('base64') post_decrypted.append(request.server.decrypt(request.client, his, own, his_key, own_key)) except RSAError, e: return HttpResponseBadRequest('Content decryption failed: %r.' % (e, )) except Exception: # for base64 decode return HttpResponseBadRequest('Content decoding failed.') request.POST = QueryDict(''.join(post_decrypted), request._encoding) request.is_secured = True del post_decrypted else: return HttpResponseBadRequest('Content decoding failed.')
def list_roots(request): return JsonResponse(roots=Server.get_roots())
def pubkey(request): return HttpResponse(Server.self().key_public, content_type='text/plain')