def handle_registration(sender, computer, request_data, msg_data, **kwargs): try: company = Company.objects.get(account_name=msg_data['account_name']) except Company.DoesNotExist: return [{'type':'registration', 'info':'unknown-account'}] if msg_data['registration_password'] != company.registration_password: return [{'type':'registration', 'info':'unknown-account'}] comp = Computer() comp.hostname = msg_data['hostname'] comp.company = company comp.computer_title = msg_data['computer_title'] comp.secure_id = ''.join([choice(CHARS) for i in range(1600)]) comp.insecure_id = str(uuid.uuid4()) comp.client_accepted_types_hash = \ hash_types(request_data['client-accepted-types']).encode('hex') comp.save() comp.tags.set(*parse_tags(msg_data['tags'])) return [{'type':'set-id', 'id':comp.secure_id, 'insecure-id':comp.insecure_id}]
def save_model(self, request, obj, form, change): plugins = [i.identifier for i in form.cleaned_data['activated_plugins']] plugins.sort() obj.activated_plugins_hash = hash_types(plugins).encode('hex') obj.save()
def message_system(request): secure_id = request.META.get('HTTP_X_COMPUTER_ID') data = loads(request.raw_post_data) received_msgs = data.pop('messages', []) if len(received_msgs) != data['total-messages']: raise return_msgs = [] computer = company = None # Get company and computer objects if we do have a secure_id if secure_id: try: computer = Computer.objects.select_related('company')\ .get(secure_id=secure_id) company = computer.company if not all((computer.next_client_sequence, computer.next_server_sequence)): computer.next_client_sequence = data['sequence'] computer.next_server_sequence = data['next-expected-sequence'] computer.save() except Computer.DoesNotExist: return render_messages([{'type': 'unkown-id'}]) # Special case registration, as we could get a request with nothing, # and without accepting register, we'll never get a registration. if computer is not None and computer.confirmed: accepted_types = company.activated_plugins.values_list( 'identifier', flat=True).order_by('identifier') accepted_types_hash = company.activated_plugins_hash.decode('hex') else: accepted_types = ['register'] accepted_types_hash = hash_types(['register']) # Check if sequence numbers match if computer is not None and computer.confirmed and \ ((data['sequence'] != computer.next_client_sequence) or (data['next-expected-sequence'] != computer.next_server_sequence)): raise # Determine whether we need to notify the client about new/delete types if data.get('accepted-types') != accepted_types_hash: return_msgs.append({ 'type': 'accepted-types', 'types': list(accepted_types) }) for msg in received_msgs: if computer is None and msg['type'] != 'register': continue message_logger.debug('Received message with data:\n%s' % pformat(msg)) ret_ = message_available.send(sender=MessageType(msg['type']), computer=computer, request_data=data, msg_data=msg) ret = itertools.chain(*map(operator.itemgetter(1), ret_)) return_msgs.extend(ret) messages = Message.objects.filter(computer=computer) if computer is not None: if messages.count(): for msg in messages: return_msgs.append(simplejson.loads(msg.message)) messages.delete() computer.next_client_sequence += data['total-messages'] computer.next_server_sequence += len(return_msgs) # prevent sending of unneeded data Computer.objects.filter(pk=computer.pk).update( next_client_sequence = \ F('next_client_sequence') + data['total-messages'], next_server_sequence = \ F('next_server_sequence') + len(return_msgs)) return render_messages(return_msgs, computer=computer)
def message_system(request): secure_id = request.META.get("HTTP_X_COMPUTER_ID") data = loads(request.raw_post_data) received_msgs = data.pop("messages", []) if len(received_msgs) != data["total-messages"]: raise return_msgs = [] computer = company = None # Get company and computer objects if we do have a secure_id if secure_id: try: computer = Computer.objects.select_related("company").get(secure_id=secure_id) company = computer.company if not all((computer.next_client_sequence, computer.next_server_sequence)): computer.next_client_sequence = data["sequence"] computer.next_server_sequence = data["next-expected-sequence"] computer.save() except Computer.DoesNotExist: return render_messages([{"type": "unkown-id"}]) # Special case registration, as we could get a request with nothing, # and without accepting register, we'll never get a registration. if computer is not None and computer.confirmed: accepted_types = company.activated_plugins.values_list("identifier", flat=True).order_by("identifier") accepted_types_hash = company.activated_plugins_hash.decode("hex") else: accepted_types = ["register"] accepted_types_hash = hash_types(["register"]) # Check if sequence numbers match if ( computer is not None and computer.confirmed and ( (data["sequence"] != computer.next_client_sequence) or (data["next-expected-sequence"] != computer.next_server_sequence) ) ): raise # Determine whether we need to notify the client about new/delete types if data.get("accepted-types") != accepted_types_hash: return_msgs.append({"type": "accepted-types", "types": list(accepted_types)}) for msg in received_msgs: if computer is None and msg["type"] != "register": continue message_logger.debug("Received message with data:\n%s" % pformat(msg)) ret_ = message_available.send( sender=MessageType(msg["type"]), computer=computer, request_data=data, msg_data=msg ) ret = itertools.chain(*map(operator.itemgetter(1), ret_)) return_msgs.extend(ret) messages = Message.objects.filter(computer=computer) if computer is not None: if messages.count(): for msg in messages: return_msgs.append(simplejson.loads(msg.message)) messages.delete() computer.next_client_sequence += data["total-messages"] computer.next_server_sequence += len(return_msgs) # prevent sending of unneeded data Computer.objects.filter(pk=computer.pk).update( next_client_sequence=F("next_client_sequence") + data["total-messages"], next_server_sequence=F("next_server_sequence") + len(return_msgs), ) return render_messages(return_msgs, computer=computer)