def new_message_request(data):
    """Verifies that the given dict represents a valid message."""
    success = True
    errors = []
    dkeys = data.keys()
    req_keys = ['receiver_id', 'sender_id', 'receiver_key_id', 'sender_key_id',
            'message', 'signature']

    # First thing is to ensure that the keys in the given data dict match the
    # expected keys exactly.
    if set(dkeys) != set(req_keys):
        success = False
        errors.append({
            'type': 'FATAL',
            'cause':
            "Keys in request (%s) do not match required keys (%s)." % \
                    (str(dkeys), str(req_keys))})
    else:
        # Helper function to verify subset of keys are uuids.
        success = merge_errors(success, errors, keys_are_uuids(data,
            req_keys[:4]))
        if success:
            # All uuid fields are valid.
            for k in req_keys[:2]:
                if not model.user_exists(data[k]):
                    success = False
                    errors.append({
                        'type': 'FATAL',
                        'cause': "The user (%s) does not exist." % data[k]})
            if success:
                # All users are valid
                for k in req_keys[2:4]:
                    # Check that given keys exist
                    user_key_id = data[k]
                    key = model.get_key(user_key_id)
                    if not key:
                        success = False
                        errors.append({
                            'type': 'FATAL',
                            'cause': "Invalid key_id (%s)." % (user_key_id)})
                    elif key['user_id'] != data[k[:-6] + 'id']:
                        success = False
                        errors.append({
                            'type': 'FATAL',
                            'cause': ("Key's user_id ({0}) does not match " \
                                "given user_id ({1}).").format(key['user_id'],
                                    data[k[:-6] + 'id'])})
                if success:
                    if not science.verify_message(data['message'],
                            data['signature'],
                            model.get_key(
                                data['sender_key_id'])['key']):
                        success = False
                        errors.append({
                            'type': 'FATAL',
                            'cause': ("Given key ({0}) could not verify " \
                                "signature.").format(key['key'])})

    return (success, errors)
Esempio n. 2
0
def get_messages(user_id):
    """Get's messages for the specified user."""
    result = {
            'success': True,
            'messages': []}
    if model.user_exists(UUID(user_id)):
        # Get messages for the specified user_id
        msgs = model.get_messages(UUID(user_id))
        result['messages'] = [x for x in msgs]
    else:
        result['success'] = False
    return result