A python library for peer-to-peer networking
Project description
Public API
Constants
- __version__: A string containing the major, minor, and patch release number.
- version_info: A tuple version of the above
- protocol_version: A string containing the major and minor release number. This refers to the underlying protocol
- node_policy_version: A string containing the build number associated with this version. This refers to the node and its policies.
- uses_RSA: This value says whether it is using the underlying rsa module. If None, it means neither rsa nor any of its fallbacks could be imported. Currently False means it relies on PyCrypto, and True means it relies on rsa.
- if uses_RSA is not None
- decryption_error: The error a call to decrypt will throw if decryption of a given ciphertext fails
- verification_error: The error a call to verify will throw if verification of a given signature fails
Methods
- if uses_RSA is not None
- newkeys(keysize): Returns a tuple containing an RSA public and private key. The private key is guarunteed to work wherever a public key does. Format: (public_key, private_key)
- encrypt(msg, key): Given a bytes plaintext and a public_key, returns an encrypted bytes
- decrypt(msg, key): Given a bytes ciphertext and a private_key, either returns a decrypted bytes or throws decryption_error
- sign(msg, key, hashop): Given a bytes, a private_key, and a hashop (["MD5", "SHA-1", "SHA-256", "SHA-384", "SHA-512"]), returns a signed bytes
- verify(msg, sig, key): Given a bytes message, a bytes signautre, and a public_key, either returns True or throws verification_error
Classes
- mesh_socket
- if uses_RSA is not None: secure_socket
File-wise API
base.py
This is used mostly for inheriting common functions with mesh.py and the planned chord.py
Constants
- version: A string containing the major, minor, and patch release number. This version refers to the underlying protocol.
- protocol_version: A string containing the major and minor release number. This refers to the underlying protocol
- node_policy_version: A string containing the build number associated with this version. This refers to the node and its policies.
- user_salt: A uuid4 which is generated uniquely in each running instance
- compression: A list of the compression methods your instance supports
- default_protocol: The default protocol definition. This uses an empty string as the subnet and PKCS1_v1.5 encryption, as supplied by net.py (in alpha releases this will use Plaintext)
- base_58: The characterspace of base_58, ordered from least to greatest value
Methods
- to_base_58(i): Takes an int (or long) and returns its corresponding base_58 string (type: bytes)
- from_base_58(string): Takes a base_58 string (or bytes) and returns its corresponding integer (type: int, long)
- getUTC(): Returns the current unix time in UTC (type: int)
- compress(msg, method): Shortcut method for compression (type: bytes)
- decompress(msg, method): Shortcut method for decompression (type: bytes)
- get_lan_ip(): Returns either your current local IP, or "127.0.0.1"
Classes
flags
This class is used as a namespace to store the various protocol defined flags.
- broadcast
- bz2
- compression
- gzip
- handshake
- lzma
- peers
- waterfall
- resend
- response
- renegotiate
- request
- whisper
pathfinding_message
This class is used internally to deal with packet parsing from a socket level. If you find yourself calling this as a user, something’s gone wrong.
Constructor
pathfinding_message(protocol, msg_type, sender, payload, compressions=None) pathfinding_message.feed_string(protocol, string, sizeless=False, compressions=None)
- protocol: The protocol this message uses
- msg_type: The chief flag this message uses, to broadcast intent
- sender: The SHA384-based sender ID
- payload: A list of additional packets to send
- compressions: A list of possible compression methods used/to use
- string: The raw message to parse
- sizeless: An indicator as to whether this message contains the length header
Constants
- protocol: The protocol this message is sent under
- msg_type: The main flag of the message (ie: ['broadcast', 'waterfall', 'whisper', 'renegotiate'])
- sender: The sender id of this message
- time: An int of the message’s timestamp
- compression: The list of compression methods this message may be under
- compression_fail: A debug property which is triggered if you give compression methods, but the message fed from feed_string is actually in plaintext
Properties
- payload: Returns the message’s payload
- compression_used: Returns the compression method used
- time_58: Returns the timestamp in base_58
- id: Returns the message’s id
- len: Returns the messages length header
- packets: Returns a list of the packets in this message, excluding the length header
- string: Returns a string version of the message, including the length header
- __non_len_string: Returns the string of this message without the size header
Methods
- __len__(): Returns the length of this message excluding the length header
Class Methods:
- feed_string(ptorocol, string, sizeless=False, compressions=None):
Given a protocol, a string or bytes, process
this into a pathfinding_message. If compressions are enabled, you
must provide a list of possible methods. If the size header is
not included, you must specify this with sizeless=True. Possible
errors:
- AttributeError: Fed a non-string, non-bytes argument
- AssertionError: Initial size header is incorrect
- Exception: Unrecognized compression method fed in compressions
- struct.error: Packet headers are incorrect OR unrecognized compression
- IndexError: See struct.error
- sanitize_string(string, sizeless=False): Given an str or
bytes, returns a bytes object with no size header. Possible
errors:
- AttributeError: Fed a non-string, non-bytes argument
- AssertionError: Initial size header is incorrect
- decompress_string(string, compressions=None): Given a bytes
object and list of possible compression methods, returns a
decompressed version and a bool indicating if decompression
failed. If decompression occurs, this will always return bytes.
If not, it will return whatever you pass in. Decompression failure is
defined as it being unable to decompress despite a list of possible
methods being provided. Possible errors:
- Exception: Unrecognized compression method fed in compressions
- process_string(string): Given a bytes, return a list of
its contained packets. Possible errors:
- IndexError: Packet headers are incorrect OR not fed plaintext
- struct.error: See IndexError OR fed non-bytes object
message
This class is returned to the user when a non-automated message is received. It contains sufficient information to parse a message or reply to it.
Constructor
message(msg, server)
- msg: This contains the pathfinding_message you received
- server: The base_socket which received the message
Constants
- msg: This contains the pathfinding_message you received
- server: The base_socket which received the message
Properties
- time: The UTC Unix time at which the message was sent
- sender: The original sender’s ID
- protocol: The protocol you received this under
- packets: Returns a list of the packets received, with the first item being the subflag
- id: Returns the SHA384-based message id
Methods
- reply(*args): Sends a whisper to the original sender with the arguments being each packet after that. If you are not connected, it uses the request/response mechanism to try making a connection
protocol
This class inherits most of its methods from a namedtuple. This means that each of the properties in the constructor can be accessed by name or index. Mostly you’ll be doing this by name.
Constructor
protocol(subnet, encryption)
Constants
- subnet: A flag to allow people with the same package version to operate different networks
- encryption: Defines the encryption standard used on the socket
Properties
- id: Returns the SHA256-based protocol id
base_socket
Variables
- debug_level: The verbosity of the socket with debug prints
- routing_table: The current dict of peers in format {id: connection}
- awaiting_ids: A list of connections awaiting a handshake
- queue: A deque of recently received messages
- daemon: This node’s base_daemon object
Properties
- outgoing: A list of ids for outgoing connections
- incoming: A list of ids for incoming connections
- status: Returns "Nominal" or base_socket.daemon.exceptions if there are Exceptions collected
base_daemon
Constructor
base_daemon(addr, port, server, prot=default_protocol)
- addr: The address it should bind its incoming connection to
- port: The port it should bind its incoming connection to
- server: This daemon’s base_socket
- prot: This daemon’s protocol
Variables
- protocol: This daemon’s protocol object
- server: A pointer to this daemon’s base_socket
- sock: This daemon’s socket object
- alive: A checker to shutdown the daemon. If False, its thread will stop running eventually.
- exceptions: A list of unhandled Exceptions raised in mainloop
- daemon: A Thread which runs through mainloop
Methods
- __print__(*args, level=None): Prints debug information if level >= server.debug_level
base_connection
Constructor
base_connection(sock, server, prot=default_protocol, outgoing=False)
- sock: A socket.socket
- server: This node’s base_socket
- prot: This node’s protocol
- outgoing: Whether or not this node is an outgoing connection
Variables:
- sock: This connection’s socket object
- server: A pointer to this connection’s base_socket object
- protocol: This connection’s protocol object
- outgoing: A bool that states whether this connection is outgoing
- buffer: A list of recently received characters
- id: This node’s SHA384-based id
- time: The time at which this node last received data
- addr: This node’s outward-facing address
- compression: A list of this node’s supported compression methods
- last_sent: A copy of the most recently sent whisper or broadcast
- expected: The number of bytes expected in the next message
- active: A bool which says whether the next message is a size header, or a message (True if message)
Methods
- fileno(): Returns sock’s file number
- collect_incoming_data(data): Adds new data to the buffer
- find_terminator(): Determines if a message has been fully received (name is a relic of when this had an end_of_tx flag)
- __print__(*args, level=None): Prints debug information if level >= server.debug_level
mesh.py
Note: This inherits a lot from base.py, and imported values will not be listed here, for brevity’s sake.
Constants
- compression: A list of the compression methods your instance supports
- max_outgoing: The (rough) maximum number of outgoing connections your node will maintain
- default_protocol: The default protocol definition. This uses 'mesh' as the subnet and PKCS1_v1.5 encryption, as supplied by net.py (in alpha releases this will use Plaintext)
Classes
mesh_socket
This peer-to-peer socket is the main purpose behind this library. It maintains a connection to a mesh network. Details on how it works specifically are outlined here, but the basics are outlined below.
It also inherits all the attributes of base_socket, though they are also outlined here
Constructor
mesh_socket(addr, port, prot=default_protocol, out_addr=None, debug_level=0)
- addr: The address you’d like to bind to
- port: The port you’d like to bind to
- prot: The protocol you’d like to use
- out_addr: Your outward-facing address, if that is different from (addr, port)
- debug_level: The verbosity at which this and its associated mesh_daemon prints debug information
Variables
- protocol: A protocol object which contains the subnet flag and the encryption method
- debug_level: The verbosity of the socket with debug prints
- routing_table: The current dict of peers in format {id: connection}
- awaiting_ids: A list of connections awaiting a handshake
- outgoing: A list of ids for outgoing connections
- incoming: A list of ids for incoming connections
- requests: A dict of the requests this node has made in format {request_id: delayed_message_contents}
- waterfalls: A deque of metadata for recently received messages
- queue: A deque of recently received messages
- out_addr: A tuple which contains the outward facing address and port
- id: This node’s SHA384-based id
- daemon: This node’s mesh_daemon object
Methods
- connect(addr, port, id=None): Connect to another mesh_socket (and assigns id if specified)
- send(*args, type='broadcast'): Send a message to your peers with each argument as a packet
- recv(quantity=1): Receive messages; If quantity != 1, returns a list of messages, otherwise returns one
- handle_request(msg): Allows the daemon to parse subflag-level actions
- waterfall(msg): Waterfalls a message to your peers
mesh_daemon
This inherits all the attributes of base_daemon, though they are also outlined here
Constructor
mesh_daemon(addr, port, server, prot=default_protocol)
- addr: The address it should bind its incoming connection to
- port: The port it should bind its incoming connection to
- server: This daemon’s mesh_socket
- prot: This daemon’s protocol
Variables
- protocol: This daemon’s protocol object
- server: A pointer to this daemon’s mesh_socket
- sock: This daemon’s socket object
- alive: A checker to shutdown the daemon. If False, its thread will stop running eventually.
- exceptions: A list of unhandled Exceptions raised in mainloop
- daemon: A Thread which runs through mainloop
Methods
- mainloop(): The method through which daemon parses. This runs as long as alive is True, and alternately calls the collect_incoming_data methods of mesh_connections and handle_accept.
- handle_accept(): Deals with incoming connections
- disconnect(handler): Closes a given mesh_connection and removes its information from server
- __print__(*args, level=None): Prints debug information if level >= server.debug_level
mesh_connection
This inherits all the attributes of base_connection, though they are also outlined here
Constructor
base_connection(sock, server, prot=default_protocol, outgoing=False)
- sock: A socket.socket
- server: This node’s mesh_socket
- prot: This node’s protocol
- outgoing: Whether or not this node is an outgoing connection
Variables:
- sock: This connection’s socket object
- server: A pointer to this connection’s mesh_socket object
- protocol: This connection’s protocol object
- outgoing: A bool that states whether this connection is outgoing
- buffer: A list of recently received characters
- id: This node’s SHA384-based id
- time: The time at which this node last received data
- addr: This node’s outward-facing address
- compression: A list of this node’s supported compression methods
- last_sent: A copy of the most recently sent whisper or broadcast
- expected: The number of bytes expected in the next message
- active: A bool which says whether the next message is a size header, or a message (True if message)
Methods
- fileno(): Returns sock’s file number
- collect_incoming_data(data): Adds new data to the buffer
- find_terminator(): Determines if a message has been fully received (name is a relic of when this had an end_of_tx flag)
- found_terminator(): Deals with any data received when find_terminator returns True
- send(msg_type, *args, id=server.id, time=base.getUTC()): Sends a message via sock
- __print__(*args, level=None): Prints debug information if level >= server.debug_level
net.py
Constants
- uses_RSA: Defines whether you’re using the rsa module
- decryption_error: The Exception this module catches when decryption fails
- verification_error: The Exception this module catches when signature verification fails
- key_request: The message used to request a peer’s key
- size_request: The message used to request a peer’s keysize
Methods
- newkeys(keysize): Returns a tuple containing an RSA public and private key. The private key is guarunteed to work wherever a public key does. Format: (public_key, private_key)
- encrypt(msg, key): Given a bytes plaintext and a public_key, returns an encrypted bytes
- decrypt(msg, key): Given a bytes ciphertext and a private_key, either returns a decrypted bytes or throws decryption_error
- sign(msg, key, hashop): Given a bytes, a private_key, and a hashop (["MD5", "SHA-1", "SHA-256", "SHA-384", "SHA-512"]), returns a signed bytes
- verify(msg, sig, key): Given a bytes message, a bytes signautre, and a public_key, either returns True or throws verification_error
- public_key(n, e): Returns a public key object
Classes
secure_socket
This is a socket through which all information is encrypted with RSA. It behaves like a socket.socket, with a few caveats.
- There is a character limit on a single send call. Mind you, this is ~133 GiB at its most restrictive, but it exists.
- You don’t need to specify how many bytes to read. If you don’t, it will return a single message. If you do, it will return up to that size, but (like a socket.socket) is not guarunteed to. It keeps an internal buffer, and if you request more than this buffer, it will only return up to that buffer. It will not look for more information. This latter part is a possible improvement to make.
- If there is data in its internal buffer, and no data is set to be received, select.select will not report it as available to read.
Constructor
secure_socket(sock_family=socket.AF_INET, sock_type=socket.SOCK_STREAM, proto=0, fileno=None, keysize=1024, silent=False)
- sock_family: Equivalent to the family argument on a socket.socket
- sock_type: Equivalent to the type argument on a socket.socket
- proto: Equivalent to the proto argument on a socket.socket
- fileno: Equivalent to the fileno argument on a python3 socket.socket, or the _sock argument on a python2 socket.socket
- keysize: The RSA keysize you wish to generate. If PyCrypto is the underlying library, it will only accept it if keysize % 256 != 0 and keysize >= 1024. The object itself will reject any value not in range(354, 8197). Higher than this will raise a warning, lower a ValueError
- silent: This will suppress the prints from handshaking
Variables
- family: Inherited from socket.socket
- type: Inherited from socket.socket
- proto: Inherited from socket.socket
- keysize: The keysize you specified while constructing
- pub: Your public key
- priv: Your private key
- recv_charlimit: The maximum number of characters you can receive in a single message (guarunteed >85899345640)
- peer_keysize: Your peer’s keysize (or None if you are not connected)
- key: Your peer’s key (or None if you are not connected)
- send_charlimit: The maximum number of characters you can send in a single message (guarunteed >85899345640, or None if not connected)
Methods
- connect(ip): Attempts to connect to the given address
- bind(ip): Binds to the given ip address (inherited from socket.socket)
- listen(i): Allow the given number of incoming connections to queue
- accept(): Returns a connection and address
- close(): Closes the connection
- dup(): Returns a copy of the socket
- settimeout(i): Sets the socket timeout; blocks if a handshake is occurring
- send(msg): Sends an encrypted message, with an encrypted signature; blocks if a handshake is occurring
- recv(size=None): Receives a message. If a size is given, returns that number of characters. Blocks if no message is available, or raises socket.timeout if not received within the assigned timeout; blocks completely if a handshake is occurring
- sign(msg, hashop='best'): Returns a signature of the given text; If you define a hashop, it will use that. Otherwise it uses the largest available. Valid ops are ['SHA-512', 'SHA-384', 'SHA-256', 'SHA-1', 'MD5']
- verify(msg, sig, key=None): Returns whether the signature is valid. If a key is not specified, defaults to its own key
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Filename, size | File type | Python version | Upload date | Hashes |
---|---|---|---|---|
Filename, size py2p-0.2.136-py2.7.egg (49.0 kB) | File type Egg | Python version 2.7 | Upload date | Hashes View |
Filename, size py2p-0.2.136-py2.py3-none-any.whl (21.5 kB) | File type Wheel | Python version py2.py3 | Upload date | Hashes View |
Filename, size py2p-0.2.136.tar.gz (17.1 kB) | File type Source | Python version None | Upload date | Hashes View |
Filename, size py2p-0.2.136.zip (21.7 kB) | File type Source | Python version None | Upload date | Hashes View |
Hashes for py2p-0.2.136-py2.py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ee2ed3fe32e01d1ea24391f0c4b37d1443736979b5f579cba708b4d6a223b695 |
|
MD5 | cb29e171eea51d7d42f6813cd68ad7c8 |
|
BLAKE2-256 | fa62be10258ae58f96ee8730733a41276a3da9b702dbdd79c724204ff4e98411 |