def get_user_msgs():
    # make sure we've the longest chain
    required_fields = ["sender", "receiver", "prikey"]
    for field in required_fields:
        if field not in request.form:
            return "Sender or Receiver not provided", 404

    sender = unquote(request.form["sender"])
    receiver = unquote(request.form["receiver"])
    prikey = request.form["prikey"]
    # print(repr(prikey))
    prikey = prikey.replace("\\n", "\n")
    # print(repr(prikey))
    try:
        key = encryption.read_private_key_string(prikey.encode("ascii"))
    except ValueError as e:
        return json.dumps({
            "length":
            0,
            "messages":
            [[2, "Decryption Error. This account is probably deleted."]],
            "peers":
            list(peers)
        })
    consensus()
    messages = []
    for block in blockchain.chain:
        # chain_data.append(block.__dict__)
        d = block.__dict__
        dt = [
            transaction for transaction in d["transactions"]
            if (transaction["sender"] == sender and transaction["receiver"] ==
                receiver) or (transaction["sender"] == receiver
                              and transaction["receiver"] == sender)
        ]
        print(dt)
        for transaction in dt:
            if transaction["sender"] == sender:
                try:
                    msg = encryption.decrypt_message(
                        bytes(transaction["message"]), key)
                    messages.append([1, msg, transaction["timestamp"]])
                except TypeError:
                    pass
            elif transaction["sender"] == receiver:
                try:
                    msg = encryption.decrypt_message(
                        bytes(transaction["message"]), key)
                    messages.append([2, msg, transaction["timestamp"]])
                except TypeError:
                    pass
    print(messages)
    return json.dumps({
        "length": len(messages),
        "messages": messages,
        "peers": list(peers)
    })
Example #2
0
def fetch_posts():
    """
    Function to fetch the chain from a blockchain node, parse the
    data and store it locally.
    """
    prikey = """
"""
    get_chain_address = "{}/chain".format(CONNECTED_NODE_ADDRESS)
    response = requests.get(get_chain_address)
    if response.status_code == 200:
        content = []
        chain = json.loads(response.content)
        for block in chain["chain"]:
            for tx in block["transactions"]:
                tx["index"] = block["index"]
                tx["hash"] = block["previous_hash"]
                tx["message"] = (encryption.decrypt_message(
                    tx["message"],
                    encryption.read_private_key_string(
                        prikey.encode("ascii")))).decode("ascii")
                content.append(tx)

        global posts
        posts = sorted(content, key=lambda k: k['timestamp'], reverse=True)
        print(posts)
Example #3
0
def find_password():
    website = website_entry.get().title()
    try:
        with open("data.json", "r") as file:
            data = json.load(file)
            email = data[website]["email"]
            password = encryption.decrypt_message(data[website]["password"])
    except (FileNotFoundError, json.decoder.JSONDecodeError):
        messagebox.showerror(title="Error", message="No data found.")
    except KeyError:
        messagebox.showerror(
            title="Error",
            message=f"No details, for the website {website}, exist.")
    else:
        messagebox.showinfo(title=website,
                            message=f"Email : {email}\nPassword : {password}")
Example #4
0
def message_receiver(name: str, sock: socket):
    """
    Handle receiving messages from server.
    :param name: message sender
    :param sock: socket
    """
    while True:
        try:
            msg_length = sock.recv(HEADER).decode(FORMAT)

            if msg_length:
                msg_length = int(msg_length)
                message = encryption.decrypt_message(sock.recv(msg_length),
                                                     KEY).decode(FORMAT)
                sender_length = int(sock.recv(HEADER).decode(FORMAT))
                sender = sock.recv(sender_length).decode(FORMAT)
                print(f"\n{sender}: {message}\nYou({name}): ", end='')
        except OSError as e:
            print(e)
            break
def get_new_received_msgs():
    # make sure we've the longest chain
    required_fields = ["sender", "receiver", "prikey", "timestamp"]
    for field in required_fields:
        if field not in request.form:
            return "Sender, Receiver, Private key or Timestamp not provided", 403

    sender = request.form["sender"]
    receiver = request.form["receiver"]
    prikey = clean_key(request.form["prikey"])
    timestamp = float(request.form["timestamp"])
    # print(repr(prikey))
    prikey = prikey.replace("\\n", "\n")
    # print(repr(prikey))
    key = encryption.read_private_key_string(prikey.encode("ascii"))
    consensus()
    messages = []
    for block in blockchain.chain:
        # chain_data.append(block.__dict__)
        d = block.__dict__
        dt = [
            transaction for transaction in d["transactions"]
            if (transaction["sender"] == receiver
                and transaction["receiver"] == sender)
        ]
        # print(dt)
        for transaction in dt:
            if transaction["timestamp"] > timestamp:
                try:
                    msg = encryption.decrypt_message(
                        bytes(transaction["message"]), key)
                    messages.append([msg, transaction["timestamp"]])
                except TypeError:
                    pass
    # print(messages)
    return json.dumps({
        "length": len(messages),
        "messages": messages,
        "peers": list(peers)
    })
Example #6
0
            conn.close()
        s.close()
        sys.exit(0)

    signal.signal(signal.SIGINT, exit_gracefully)
    signal.signal(signal.SIGTERM, exit_gracefully)

    while True:
        conn, addr = s.accept()
        conn.settimeout(10)
        try:
            received_data = conn.recv(BUFFER_SIZE)
            eprint("bank received " + str(len(received_data)) +
                   " bytes (encrypted)")
            if received_data:
                decrypted_data = encryption.decrypt_message(received_data, key)
                # eprint("bank received (decrypted): " + my_base64encode(received_data))
                if decrypted_data is None:
                    myprint("protocol_error")
                    conn.send(
                        encryption.encrypt_message(constants.FAILURE, key))
                else:
                    eprint("processing message: " + decrypted_data)
                    success = True
                    request = Request.from_string(decrypted_data)
                    if request is None:
                        success = False
                    else:
                        success = process_request(request)
                    if success:
                        eprint("processing message -> SUCCESS")
Example #7
0
def main():
    args = arguments.read_atm_arguments(sys.argv[1:])
    if args is None:
        eprint("parsing ATM arguments failed. terminating...")
        input_error_exit()
    (auth_filename, ip_address, port, card_filename, account_name, command,
     amount) = args
    if ip_address is None:
        ip_address = "127.0.0.1"
    if port is None:
        port = constants.DEFAULT_PORT
    if card_filename is None:
        card_filename = account_name + ".card"
    if auth_filename is None:
        auth_filename = "bank.auth"
    pin, key = None, None

    try:
        if command != "n":
            card_file = open(card_filename, 'r')
            pin = card_file.read()
            card_file.close()
        else:
            if os.path.isfile(card_filename):
                eprint("card file already exists:", card_filename)
                input_error_exit()
            pin = my_base64encode(encryption.create_random_key())
        auth_file = open(auth_filename, 'rb')
        key = auth_file.read()
        eprint("atm key (base64): " + base64.b64encode(key).decode("utf-8"))
        auth_file.close()
    except IOError as e:
        eprint(e)
        input_error_exit()

    request = Request.Request(account_name, pin, command, amount)

    s = socket.socket()
    s.settimeout(10)

    try:
        s.connect((ip_address, port))
        data_to_send = str(request)
        eprint("atm, sending (decrypted): " + data_to_send)
        encrypted_data_to_send = encryption.encrypt_message(data_to_send, key)
        eprint("atm, sending " + str(len(encrypted_data_to_send)) +
               " bytes, (encrypted)")
        s.send(encrypted_data_to_send)
        received_data = s.recv(BUFFER_SIZE)
        if not received_data:
            s.close()
            protocol_error_exit()
        decrypted_data = encryption.decrypt_message(received_data, key)
        if decrypted_data is None:
            s.close()
            protocol_error_exit()
        else:
            if decrypted_data == constants.FAILURE:
                eprint("received FAILURE code from bank. terminating...")
                s.close()
                input_error_exit()
            else:  # success
                eprint("received JSON result from bank")
                myprint(decrypted_data)
                if command == "n":
                    card_file = open(card_filename, 'w')
                    card_file.write(pin)
                    card_file.close()
    except Exception as e:
        eprint("socket error:", e)
        s.close()
        protocol_error_exit()