Exemple #1
0
def get_messages(partner):

    # Check for new info
    check_db()
    all_messages = get_mail_db(current_user.name, partner)

    message_js = []

    groupnames = names_n_group(current_user.name)[1]
    members = []
    partner_id = ""
    if partner in groupnames:
        members = get_members(partner)

    partner_id = get_id(partner)

    for mess in all_messages:

        direction = "sent" if mess.sender == current_user.name else "replies"

        sender_id = get_id(mess.sender, string=True)
        message = {"sender": sender_id,
                   "recipient": mess.recipient,
                   "content": mess.content,
                   "time": mess.time.time().strftime("%H:%M:%S"),
                   "direction": direction,
                   "imgURL": url_for('tree_bp.static',
                                     filename='/imag/' + mess.sender + '.png')}
        message_js += [message]

    return {'messages': message_js, 'members': members, 'id': partner_id}
Exemple #2
0
def sendmessage():
    data = request.json     # Get the data (sender, recipient, message)
    check_db()
    names, groupnames = names_n_group(current_user.name)
    sender, recipient = data['sender'], secure_filename(data['recipient'])
    data['destination'] = recipient

    # We make a copy for ourself
    new_message = Message(owner=sender,
                          sender=sender,
                          content=data['content'],
                          time=datetime.now(),
                          recipient=recipient)
    add_db(new_message, 'Message')

    # Key is different if it's a group message
    # or 2-party message
    if recipient in groupnames:
        key = get_key_aes(sender, recipient)
    elif recipient in names:
        key, dico = P2Psecret(sender, recipient, 'sender')
        data['info_otk'] = repr(dico)
    else:
        raise Exception("Problem : the recipient name : {}".format(recipient))

    # Ciphertext
    encrypted_data = encrypt_aes(data['content'], str(key))
    data['content'] = repr(encrypted_data)

    headers = {'x-access-tokens': get_token(current_user.name)}
    requests.post(server_address + "/mailbox", json=data, headers=headers)

    return jsonify(answer="Génial")
Exemple #3
0
def new_conversation():

    check_db()
    lastmails = get_last_messages(current_user.name)
    partners = list(lastmails.keys())
    names, groupnames = names_n_group(current_user.name)
    names.remove(current_user.name)
    print('names = ', names)

    other_partners = [name for name in names if name not in partners]
    partners_id = [Party.query.filter_by(target=partner)
                              .first().user_id for partner in other_partners]
    others = dict(zip(partners_id, other_partners))
    return render_template('new_conversation.html',
                           others=others, partners_id=partners_id)
Exemple #4
0
def settings(partner):
    members_id, not_members_id = {}, {}
    names, groupnames = names_n_group(current_user.name)
    check_db()
    if partner in groupnames:
        members = get_members(partner)
        not_members = [name for name in names if name not in members]
        for not_member in not_members:
            not_members_id[not_member] = get_id(not_member, string=True)
        for member in members:
            members_id[member] = get_id(member, string=True)
    return render_template('settings.html',
                           partner=partner,
                           notmembersid=not_members_id,
                           members=members,
                           notmembers=not_members,
                           membersid=members_id)
Exemple #5
0
def remove_member():
    # It is important to be up to date before removing a member
    # in order to be sure we get the correct keys
    check_db()

    data = request.json

    # Intels for the already existing members, so that they
    # get the tree into the server, and adapt theirs
    groupname = data['groupname']
    members = get_members(groupname)
    headers = {'x-access-tokens': get_token(current_user.name)}

    group = get_group(groupname)

    for member in members:
        dico = {'groupname': groupname, 'member': data['member']}

        intel = {
            'sender': current_user.name,
            'content': json.dumps(dico),
            'recipient': member,
            'type': 'remove_member',
            'groupname': groupname
        }

        requests.post(server_address + "/intels/" + member,
                      json=intel,
                      headers=headers)

    members = get_members(groupname)
    if data['member'] in members:
        members.remove(data['member'])
        group.members = ','.join(members)
        db.session.commit()

    return "User removed !", 200
Exemple #6
0
def messenger():
    check_db()
    groupnames = names_n_group(current_user.name)[1]
    lastmails = get_last_messages(current_user.name)
    print('lastmails = ', lastmails)
    my_id = 'user_' + str(get_id(current_user.name))
    message_js = []
    for partner in lastmails:
        mail = lastmails[partner]

        partner_id = get_id(partner, string=True)

        try:
            if mail.sender == current_user.name:
                direction = "sent"
            else:
                direction = "received"

            message = {"sender": mail.sender,
                       "recipient": mail.recipient,
                       "content": mail.content,
                       "time": mail.time.time().strftime("%H:%M:%S"),
                       "direction": direction,
                       "imgURL": url_for('tree_bp.static',
                                         filename='imag/' + partner_id
                                                          + '.png'),
                       "partner": partner}

            partner_id = get_id(partner, string=True)

            message_js += [message]
        except Exception:
            raise ValueError("Error")

    return render_template('messenger.html', lastmails=message_js,
                           current=my_id, groupnames=groupnames)
Exemple #7
0
def add_member():
    check_db()

    data = request.json
    groupname, new_member = data['groupname'], data['newmember']

    # Get the tree, add a node and get the node
    tree = read_tree(groupname)
    add_node(tree, new_member)
    newnode = get_node(tree, new_member)

    # We take a random OTK private key, with the corresponding index
    private_otk = get_otk(current_user.name)
    ind_private_otk = private_otk.serverID

    # Creation of the shared key (leaf key) and we put it in the leaf attribute
    headers = {'x-access-tokens': get_token(current_user.name)}
    public_otk = requests.get(server_address + "/getOTK/" + new_member + "/" +
                              str(-1),
                              headers=headers).json()
    otkeys = {
        'privateOTK': str(ind_private_otk),
        'publicOTK': public_otk['publOTK']
    }
    compute_leaf_keys(newnode, current_user.name, newnode.value, otkeys,
                      'initiator')

    # Update the key pairs
    fill_nodes(tree, newnode.path)

    members = get_members(groupname)
    pks = get_pk_path(tree, newnode)
    publicKeys = get_all_pk(tree)

    dico = {'groupname': groupname, 'publicKeys': pks, 'newmember': new_member}

    # Intels for the already existing members
    headers = {'x-access-tokens': get_token(current_user.name)}
    for member in members:
        intel = {
            'sender': current_user.name,
            'content': repr(dico),
            'recipient': member,
            'type': data['type'],
            'groupname': groupname
        }
        requests.post(server_address + "/intels/" + member,
                      json=intel,
                      headers=headers)

    # We make a copy not to erase our tree
    central_tree = deepcopy(tree)
    clear_leaves(central_tree, get_all_value(central_tree))

    # Intel for the new member only,
    # so that they create its tree
    dico = {
        'info_otk': {
            'creatorOTK': SIKE_compute_pk(private_otk.privateOTK, 'initiator'),
            'partnerOTK': public_otk['indexOTK']
        },
        'groupname': groupname,
        'members': ','.join(get_value_leaves(tree)),
        'publicKeys': repr(publicKeys)
    }
    intel = {
        'sender': current_user.name,
        'content': repr(dico),
        'recipient': new_member,
        'type': 'creation',
        'groupname': groupname
    }

    headers = {'x-access-tokens': get_token(current_user.name)}
    requests.post(server_address + "/intels/" + new_member,
                  json=intel,
                  headers=headers)

    # Add the new member to the list of members
    group = get_group(groupname)
    group.members = group.members + "," + new_member
    db.session.commit()

    return "Done", 200