Exemplo n.º 1
0
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}]
Exemplo n.º 2
0
 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()
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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)