2015-09-24 22:08:08 +02:00
|
|
|
import time
|
2019-01-20 19:07:16 +01:00
|
|
|
import socket
|
2015-09-24 22:08:08 +02:00
|
|
|
import gevent
|
|
|
|
|
|
|
|
import pytest
|
2018-03-14 22:21:45 +01:00
|
|
|
import mock
|
2015-09-24 22:08:08 +02:00
|
|
|
|
|
|
|
from Crypt import CryptConnection
|
|
|
|
from Connection import ConnectionServer
|
2018-03-14 22:21:45 +01:00
|
|
|
from Config import config
|
2015-09-24 22:08:08 +02:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.usefixtures("resetSettings")
|
|
|
|
class TestConnection:
|
2019-01-20 19:07:16 +01:00
|
|
|
def testIpv6(self, file_server6):
|
|
|
|
assert ":" in file_server6.ip
|
|
|
|
|
|
|
|
client = ConnectionServer(file_server6.ip, 1545)
|
|
|
|
connection = client.getConnection(file_server6.ip, 1544)
|
|
|
|
|
|
|
|
assert connection.ping()
|
|
|
|
|
|
|
|
# Close connection
|
|
|
|
connection.close()
|
|
|
|
client.stop()
|
|
|
|
time.sleep(0.01)
|
|
|
|
assert len(file_server6.connections) == 0
|
|
|
|
|
|
|
|
# Should not able to reach on ipv4 ip
|
|
|
|
with pytest.raises(socket.error) as err:
|
|
|
|
client = ConnectionServer("127.0.0.1", 1545)
|
|
|
|
connection = client.getConnection("127.0.0.1", 1544)
|
|
|
|
|
2015-09-24 22:08:08 +02:00
|
|
|
def testSslConnection(self, file_server):
|
2019-01-20 19:07:16 +01:00
|
|
|
client = ConnectionServer(file_server.ip, 1545)
|
2015-09-24 22:08:08 +02:00
|
|
|
assert file_server != client
|
|
|
|
|
|
|
|
# Connect to myself
|
2018-03-14 22:21:45 +01:00
|
|
|
with mock.patch('Config.config.ip_local', return_value=[]): # SSL not used for local ips
|
2019-01-20 19:07:16 +01:00
|
|
|
connection = client.getConnection(file_server.ip, 1544)
|
2018-03-14 22:21:45 +01:00
|
|
|
|
2015-09-24 22:08:08 +02:00
|
|
|
assert len(file_server.connections) == 1
|
|
|
|
assert connection.handshake
|
|
|
|
assert connection.crypt
|
|
|
|
|
2019-01-20 19:07:16 +01:00
|
|
|
|
2015-09-24 22:08:08 +02:00
|
|
|
# Close connection
|
|
|
|
connection.close()
|
|
|
|
client.stop()
|
|
|
|
time.sleep(0.01)
|
|
|
|
assert len(file_server.connections) == 0
|
|
|
|
|
|
|
|
def testRawConnection(self, file_server):
|
2019-01-20 19:07:16 +01:00
|
|
|
client = ConnectionServer(file_server.ip, 1545)
|
2015-09-24 22:08:08 +02:00
|
|
|
assert file_server != client
|
|
|
|
|
|
|
|
# Remove all supported crypto
|
|
|
|
crypt_supported_bk = CryptConnection.manager.crypt_supported
|
|
|
|
CryptConnection.manager.crypt_supported = []
|
|
|
|
|
2018-03-14 22:21:45 +01:00
|
|
|
with mock.patch('Config.config.ip_local', return_value=[]): # SSL not used for local ips
|
2019-01-20 19:07:16 +01:00
|
|
|
connection = client.getConnection(file_server.ip, 1544)
|
2015-09-24 22:08:08 +02:00
|
|
|
assert len(file_server.connections) == 1
|
|
|
|
assert not connection.crypt
|
|
|
|
|
|
|
|
# Close connection
|
|
|
|
connection.close()
|
|
|
|
client.stop()
|
|
|
|
time.sleep(0.01)
|
|
|
|
assert len(file_server.connections) == 0
|
|
|
|
|
|
|
|
# Reset supported crypts
|
|
|
|
CryptConnection.manager.crypt_supported = crypt_supported_bk
|
|
|
|
|
|
|
|
def testPing(self, file_server, site):
|
2019-01-20 19:07:16 +01:00
|
|
|
client = ConnectionServer(file_server.ip, 1545)
|
|
|
|
connection = client.getConnection(file_server.ip, 1544)
|
2015-09-24 22:08:08 +02:00
|
|
|
|
|
|
|
assert connection.ping()
|
|
|
|
|
|
|
|
connection.close()
|
|
|
|
client.stop()
|
|
|
|
|
|
|
|
def testGetConnection(self, file_server):
|
2019-01-20 19:07:16 +01:00
|
|
|
client = ConnectionServer(file_server.ip, 1545)
|
|
|
|
connection = client.getConnection(file_server.ip, 1544)
|
2015-09-24 22:08:08 +02:00
|
|
|
|
|
|
|
# Get connection by ip/port
|
2019-01-20 19:07:16 +01:00
|
|
|
connection2 = client.getConnection(file_server.ip, 1544)
|
2015-09-24 22:08:08 +02:00
|
|
|
assert connection == connection2
|
|
|
|
|
|
|
|
# Get connection by peerid
|
2019-01-20 19:07:16 +01:00
|
|
|
assert not client.getConnection(file_server.ip, 1544, peer_id="notexists", create=False)
|
|
|
|
connection2 = client.getConnection(file_server.ip, 1544, peer_id=connection.handshake["peer_id"], create=False)
|
2015-09-24 22:08:08 +02:00
|
|
|
assert connection2 == connection
|
|
|
|
|
|
|
|
connection.close()
|
|
|
|
client.stop()
|
|
|
|
|
|
|
|
def testFloodProtection(self, file_server):
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
whitelist = file_server.whitelist # Save for reset
|
|
|
|
file_server.whitelist = [] # Disable 127.0.0.1 whitelist
|
2019-01-20 19:07:16 +01:00
|
|
|
client = ConnectionServer(file_server.ip, 1545)
|
2015-09-24 22:08:08 +02:00
|
|
|
|
2016-01-05 20:18:17 +01:00
|
|
|
# Only allow 6 connection in 1 minute
|
|
|
|
for reconnect in range(6):
|
2019-01-20 19:07:16 +01:00
|
|
|
connection = client.getConnection(file_server.ip, 1544)
|
2016-01-05 20:18:17 +01:00
|
|
|
assert connection.handshake
|
|
|
|
connection.close()
|
2015-09-24 22:08:08 +02:00
|
|
|
|
2016-01-05 20:18:17 +01:00
|
|
|
# The 7. one will timeout
|
2015-09-24 22:08:08 +02:00
|
|
|
with pytest.raises(gevent.Timeout):
|
|
|
|
with gevent.Timeout(0.1):
|
2019-01-20 19:07:16 +01:00
|
|
|
connection = client.getConnection(file_server.ip, 1544)
|
Version 0.3.5, Rev830, Full Tor mode support with hidden services, Onion stats in Sidebar, GeoDB download fix using Tor, Gray out disabled sites in Stats page, Tor hidden service status in stat page, Benchmark sha256, Skyts tracker out expodie in, 2 new tracker using ZeroNet protocol, Keep SSL cert option between restarts, SSL Certificate pinning support for connections, Site lock support for connections, Certificate pinned connections using implicit SSL, Flood protection whitelist support, Foreign keys support for DB layer, Not support for SQL query helper, 0 length file get bugfix, Pex onion address support, Faster port testing, Faster uPnP port opening, Need connections more often on owned sites, Delay ZeroHello startup message if port check or Tor manager not ready yet, Use lockfiles to avoid double start, Save original socket on proxy monkey patching to get ability to connect localhost directly, Handle atomic write errors, Broken gevent https workaround helper, Rsa crypt functions, Plugin to Bootstrap using ZeroNet protocol
2016-01-05 00:20:52 +01:00
|
|
|
|
|
|
|
# Reset whitelist
|
|
|
|
file_server.whitelist = whitelist
|