diff options
author | Rene Ladan <rene@FreeBSD.org> | 2024-04-01 11:45:30 +0000 |
---|---|---|
committer | Rene Ladan <rene@FreeBSD.org> | 2024-04-01 11:45:30 +0000 |
commit | cfbd02100e95487d3a283fdbcedceee203e9a034 (patch) | |
tree | 110ad897c6a3390e634e8d8e821fca78b2a1381f | |
parent | 33331210d0da9ed9626ce21d6529f6a5567225b0 (diff) | |
download | ports-cfbd02100e95487d3a283fdbcedceee203e9a034.tar.gz ports-cfbd02100e95487d3a283fdbcedceee203e9a034.zip |
net-p2p/py-vertex: Remove expired port
2024-03-31 net-p2p/py-vertex: Abandoned project since 7 years back
-rw-r--r-- | MOVED | 1 | ||||
-rw-r--r-- | net-p2p/Makefile | 1 | ||||
-rw-r--r-- | net-p2p/py-vertex/Makefile | 28 | ||||
-rw-r--r-- | net-p2p/py-vertex/distinfo | 2 | ||||
-rw-r--r-- | net-p2p/py-vertex/files/patch-2to3 | 519 | ||||
-rw-r--r-- | net-p2p/py-vertex/pkg-descr | 16 |
6 files changed, 1 insertions, 566 deletions
@@ -3122,3 +3122,4 @@ security/py-nassl||2024-04-01|Has expired: It does not support OpenSSL 3.0+ devel/cil||2024-04-01|Has expired: Unmaintained upstream due to lack of time irc/infobot||2024-04-01|Has expired: Abandonware, outdated version and last upstream release in 2008 devel/py-mox3||2024-04-01|Has expired: Upstream no longer active and repository has been archived. See also: https://lists.openstack.org/pipermail/openstack-discuss/2020-June/015518.html +net-p2p/py-vertex||2024-04-01|Has expired: Abandoned project since 7 years back diff --git a/net-p2p/Makefile b/net-p2p/Makefile index 8b437a83c5d1..35eec1bd9aac 100644 --- a/net-p2p/Makefile +++ b/net-p2p/Makefile @@ -78,7 +78,6 @@ SUBDIR += py-nicotine-plus SUBDIR += py-transmission-rpc SUBDIR += py-tremc - SUBDIR += py-vertex SUBDIR += pyln-bolt7 SUBDIR += pyln-client SUBDIR += pyln-proto diff --git a/net-p2p/py-vertex/Makefile b/net-p2p/py-vertex/Makefile deleted file mode 100644 index 9325d438e1d8..000000000000 --- a/net-p2p/py-vertex/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -PORTNAME= vertex -PORTVERSION= 0.3.1 -PORTREVISION= 3 -CATEGORIES= net-p2p python -MASTER_SITES= PYPI -PKGNAMEPREFIX= ${PYTHON_PKGNAMEPREFIX} -DISTNAME= Vertex-${PORTVERSION} - -MAINTAINER= sunpoet@FreeBSD.org -COMMENT= Implementation of Q2Q protocol -WWW= https://launchpad.net/divmod - -LICENSE= MIT -LICENSE_FILE= ${WRKSRC}/LICENSE - -DEPRECATED= Abandoned project since 7 years back -EXPIRATION_DATE=2024-03-31 - -RUN_DEPENDS= ${PYTHON_PKGNAMEPREFIX}epsilon>=0:devel/py-epsilon@${PY_FLAVOR} \ - ${PYTHON_PKGNAMEPREFIX}openssl>=0,1:security/py-openssl@${PY_FLAVOR} \ - ${PYTHON_PKGNAMEPREFIX}twisted>=0:devel/py-twisted@${PY_FLAVOR} - -USES= python -USE_PYTHON= autoplist concurrent distutils - -NO_ARCH= yes - -.include <bsd.port.mk> diff --git a/net-p2p/py-vertex/distinfo b/net-p2p/py-vertex/distinfo deleted file mode 100644 index faf3254b5caf..000000000000 --- a/net-p2p/py-vertex/distinfo +++ /dev/null @@ -1,2 +0,0 @@ -SHA256 (Vertex-0.3.1.tar.gz) = 2a81a33bb21392ae2c068399d6a720c6c5fef8b3591528ba7300749d1a054c43 -SIZE (Vertex-0.3.1.tar.gz) = 89909 diff --git a/net-p2p/py-vertex/files/patch-2to3 b/net-p2p/py-vertex/files/patch-2to3 deleted file mode 100644 index 6f04ad175c56..000000000000 --- a/net-p2p/py-vertex/files/patch-2to3 +++ /dev/null @@ -1,519 +0,0 @@ ---- vertex/gtk2hack.py.orig 2013-08-05 02:42:24 UTC -+++ vertex/gtk2hack.py -@@ -15,7 +15,7 @@ class _NullCb: - self.name = name - - def __call__(self, *a, **kw): -- print 'No callback provided for', self.name, a, kw -+ print('No callback provided for', self.name, a, kw) - - class _SignalAttacher: - def __init__(self, original): -@@ -100,19 +100,19 @@ class AcceptConnectionDialog: - - def acceptConnectionEvt(self, evt): - self.done = True -- print "YES" -+ print("YES") - self.d.callback(1) -- print "WHAT" -+ print("WHAT") - self.window.destroy() - - def rejectConnectionEvt(self, evt): -- print "DSTRY" -+ print("DSTRY") - if not self.done: -- print "DIE!" -+ print("DIE!") - from twisted.python import failure - self.d.errback(failure.Failure(KeyError("Connection rejected by user"))) - else: -- print "OK" -+ print("OK") - - from twisted.internet.protocol import ServerFactory - from twisted.internet.protocol import Protocol -@@ -120,10 +120,10 @@ from twisted.internet.protocol import Protocol - class VertexDemoProtocol(Protocol): - - def connectionMade(self): -- print 'CONN MADE' -+ print('CONN MADE') - - def dataReceived(self, data): -- print 'HOLY SHNIKIES', data -+ print('HOLY SHNIKIES', data) - - class VertexFactory(ServerFactory): - protocol = VertexDemoProtocol -@@ -151,7 +151,7 @@ class BuddyItem: - self.plug.loadedBuddies[q2qaddress] = self - - def initiateFileTransfer(self, evt): -- print 'Initiate transfer with ' + self.alias + self.q2qaddress -+ print('Initiate transfer with ' + self.alias + self.q2qaddress) - - def addToMenu(self): - self.plug.section.append(self.menuItem) -@@ -170,7 +170,7 @@ class PlugEntry: - self.xml = gtk.glade.XML(GLADE_FILE, "notification_popup") - - def register(self, section): -- print 'REGISTER' -+ print('REGISTER') - self.section = section - - workingdir = FilePath(os.path.expanduser("~/.vertex")) -@@ -197,11 +197,11 @@ class PlugEntry: - self.buildContactMenu() - - def clearContactMenu(self): -- for bud in self.loadedBuddies.values(): -+ for bud in list(self.loadedBuddies.values()): - bud.removeFromMenu() - - def buildContactMenu(self): -- l = self.loadedBuddies.values() -+ l = list(self.loadedBuddies.values()) - l.sort(key=lambda x: x.alias) - l.reverse() - for bud in l: ---- vertex/ptcp.py.orig 2013-08-05 02:42:24 UTC -+++ vertex/ptcp.py -@@ -17,7 +17,7 @@ from vertex import tcpdfa - from vertex.statemachine import StateError - - --genConnID = itertools.count(8).next -+genConnID = itertools.count(8).__next__ - - MAX_PSEUDO_PORT = (2 ** 16) - -@@ -818,7 +818,9 @@ class PTCPConnection(tcpdfa.TCP): - class PTCPAddress(object): - # garbage - -- def __init__(self, (host, port), (pseudoHostPort, pseudoPeerPort)): -+ def __init__(self, xxx_todo_changeme, xxx_todo_changeme1): -+ (host, port) = xxx_todo_changeme -+ (pseudoHostPort, pseudoPeerPort) = xxx_todo_changeme1 - self.host = host - self.port = port - self.pseudoHostPort = pseudoHostPort -@@ -945,7 +947,7 @@ class PTCP(protocol.DatagramProtocol): - stop notifications, sending hail-mary final FIN packets (which may not - reach the other end, but nevertheless can be useful) when possible. - """ -- for conn in self._connections.values(): -+ for conn in list(self._connections.values()): - conn.immediateShutdown() - assert not self._connections - -@@ -994,11 +996,11 @@ class PTCP(protocol.DatagramProtocol): - stb=True, - destination=addr)) - except GarbageDataError: -- print "garbage data!", pkt -- except ChecksumMismatchError, cme: -- print "bad checksum", pkt, cme -- print repr(pkt.data) -- print hex(pkt.checksum), hex(pkt.computeChecksum()) -+ print("garbage data!", pkt) -+ except ChecksumMismatchError as cme: -+ print("bad checksum", pkt, cme) -+ print(repr(pkt.data)) -+ print(hex(pkt.checksum), hex(pkt.computeChecksum())) - else: - self.packetReceived(pkt) - ---- vertex/q2q.py.orig 2015-03-05 04:12:41 UTC -+++ vertex/q2q.py -@@ -373,7 +373,7 @@ class TCPMethod: - def attempt(self, *a): - return [self.attemptFactory(self, *a)] - --connectionCounter = itertools.count().next -+connectionCounter = itertools.count().__next__ - connectionCounter() - - class VirtualConnectionAttempt(AbstractConnectionAttempt): -@@ -441,7 +441,7 @@ class _PTCPConnectionAttemptPress(AbstractConnectionAt - if not self.cancelled: - self.q2qproto.service.dispatcher.unbindPort(self.newPort) - else: -- print 'totally wacky, [press] cancelled twice!' -+ print('totally wacky, [press] cancelled twice!') - AbstractConnectionAttempt.cancel(self) - - class PTCPMethod(TCPMethod): -@@ -498,7 +498,7 @@ class RPTCPConnectionAttempt(AbstractConnectionAttempt - if not self.cancelled: - self.q2qproto.service.dispatcher.unbindPort(self.newPort) - else: -- print 'totally wacky, [rptcp] cancelled twice!' -+ print('totally wacky, [rptcp] cancelled twice!') - AbstractConnectionAttempt.cancel(self) - - -@@ -866,7 +866,7 @@ class Q2Q(AMP, subproducer.SuperProducer): - log.msg("removing remote listener for %r" % (key,)) - self.service.listeningClients[key].remove(value) - self.listeningClient = [] -- for xport in self.connections.values(): -+ for xport in list(self.connections.values()): - safely(xport.connectionLost, reason) - for observer in self.connectionObservers: - safely(observer) -@@ -1349,7 +1349,7 @@ class Q2Q(AMP, subproducer.SuperProducer): - - subj = certificate_request.getSubject() - -- sk = subj.keys() -+ sk = list(subj.keys()) - if 'commonName' not in sk: - raise BadCertificateRequest( - "Certificate requested with bad subject: %s" % (sk,)) -@@ -1926,7 +1926,7 @@ class DefaultQ2QAvatar: - - def signCertificateRequest(self, certificateRequest, - domainCert, suggestedSerial): -- keyz = certificateRequest.getSubject().keys() -+ keyz = list(certificateRequest.getSubject().keys()) - if keyz != ['commonName']: - raise BadCertificateRequest( - "Don't know how to verify fields other than CN: " + -@@ -2034,7 +2034,7 @@ class _pemmap(object): - def file(self, name, mode): - try: - return file(os.path.join(self.pathname, name)+'.pem', mode) -- except IOError, ioe: -+ except IOError as ioe: - raise KeyError(name, ioe) - - def __setitem__(self, key, cert): -@@ -2054,21 +2054,21 @@ class _pemmap(object): - yield key, value - - def items(self): -- return list(self.iteritems()) -+ return list(self.items()) - - def iterkeys(self): -- for k, v in self.iteritems(): -+ for k, v in self.items(): - yield k - - def keys(self): -- return list(self.iterkeys()) -+ return list(self.keys()) - - def itervalues(self): -- for k, v in self.iteritems(): -+ for k, v in self.items(): - yield v - - def values(self): -- return list(self.itervalues()) -+ return list(self.values()) - - - -@@ -2149,7 +2149,8 @@ class PTCPConnectionDispatcher(object): - self.factory = factory - self._ports = {} - -- def seedNAT(self, (host, port), sourcePort=0, conditional=True): -+ def seedNAT(self, xxx_todo_changeme, sourcePort=0, conditional=True): -+ (host, port) = xxx_todo_changeme - if sourcePort not in self._ports: - if sourcePort != 0: - if conditional: -@@ -2183,8 +2184,8 @@ class PTCPConnectionDispatcher(object): - return proto.connect(factory, host, port) - - def iterconnections(self): -- for (p, proto) in self._ports.itervalues(): -- for c in p.protocol._connections.itervalues(): -+ for (p, proto) in self._ports.values(): -+ for c in p.protocol._connections.values(): - if c.protocol is not None: - yield c.protocol - else: -@@ -2193,8 +2194,8 @@ class PTCPConnectionDispatcher(object): - - def killAllConnections(self): - dl = [] -- for p, proto in self._ports.itervalues(): -- for c in p.protocol._connections.itervalues(): -+ for p, proto in self._ports.values(): -+ for c in p.protocol._connections.values(): - c._stopRetransmitting() - dl.append(defer.maybeDeferred(p.stopListening)) - self._ports = {} -@@ -2227,8 +2228,8 @@ class Q2QService(service.MultiService, protocol.Server - not. For testing purposes only. - """ - return itertools.chain( -- self.appConnectionCache.cachedConnections.itervalues(), -- self.secureConnectionCache.cachedConnections.itervalues(), -+ iter(self.appConnectionCache.cachedConnections.values()), -+ iter(self.secureConnectionCache.cachedConnections.values()), - iter(self.subConnections), - (self.dispatcher or ()) and self.dispatcher.iterconnections()) - -@@ -2328,7 +2329,7 @@ class Q2QService(service.MultiService, protocol.Server - def _secured(proto): - lfm = self.localFactoriesMapping - def startup(listenResult): -- for protocol, factory in protocolsToFactories.iteritems(): -+ for protocol, factory in protocolsToFactories.items(): - key = (fromAddress, protocol) - if key not in lfm: - lfm[key] = [] -@@ -2336,7 +2337,7 @@ class Q2QService(service.MultiService, protocol.Server - factory.doStart() - - def shutdown(): -- for protocol, factory in protocolsToFactories.iteritems(): -+ for protocol, factory in protocolsToFactories.items(): - lfm[fromAddress, protocol].remove( - (factory, serverDescription)) - factory.doStop() -@@ -2353,7 +2354,7 @@ class Q2QService(service.MultiService, protocol.Server - - def _gotPubUDPPort(publicAddress): - self._publicUDPAddress = publicAddress -- return proto.listen(fromAddress, protocolsToFactories.keys(), -+ return proto.listen(fromAddress, list(protocolsToFactories.keys()), - serverDescription).addCallback(startup) - pubUDPDeferred.addCallback(_gotPubUDPPort) - return pubUDPDeferred -@@ -2501,7 +2502,7 @@ class Q2QService(service.MultiService, protocol.Server - - def stopService(self): - dl = [] -- for cwait, delayed in self.inboundConnections.itervalues(): -+ for cwait, delayed in self.inboundConnections.values(): - delayed.cancel() - self.inboundConnections.clear() - if self.q2qPort is not None: ---- vertex/q2qclient.py.orig 2015-03-05 02:53:34 UTC -+++ vertex/q2qclient.py -@@ -24,7 +24,7 @@ class Q2QAuthorize(Options): - self.password = password - - def reportNoCertificate(self, error): -- print "No certificate retrieved:", error.getErrorMessage(), "(see ~/.q2q-client-log for details)" -+ print("No certificate retrieved:", error.getErrorMessage(), "(see ~/.q2q-client-log for details)") - log.err(error) - return None - -@@ -115,7 +115,7 @@ class FileSender(protocol.Protocol): - self.transport.loseConnection() - - def dataReceived(self, data): -- print "WTF THE CLIENT IS GETTING DATA", repr(data) -+ print("WTF THE CLIENT IS GETTING DATA", repr(data)) - - def registerProducer(self, producer, streaming): - self.transport.registerProducer(producer, streaming) -@@ -166,9 +166,9 @@ class ClientQ2QService(q2q.Q2QService): - *a, **kw) - - def getDefaultFrom(self, default=None): -- i = self.certificateStorage.localStore.iterkeys() -+ i = iter(self.certificateStorage.localStore.keys()) - try: -- return i.next() -+ return next(i) - except StopIteration: - return default - -@@ -244,7 +244,7 @@ class Q2QReceive(Options): - def pr(x): - return x - def stopit(err): -- print "Couldn't Register for File Transfer:", err.getErrorMessage() -+ print("Couldn't Register for File Transfer:", err.getErrorMessage()) - log.err(err) - reactor.stop() - serv.listenQ2Q(self.parent.getFrom(), -@@ -276,13 +276,13 @@ class TextNexusUI(sigma.BaseNexusUI): - self.call.start(5) - - def report(self): -- print 'Transloads:', len(self.transloads) -+ print('Transloads:', len(self.transloads)) - for transloadui in self.transloads: -- print '---', transloadui.name, '---' -- print transloadui.bits.percent() -- for peer, mask in transloadui.masks.items(): -- print peer, mask.percent() -- print 'end report' -+ print('---', transloadui.name, '---') -+ print(transloadui.bits.percent()) -+ for peer, mask in list(transloadui.masks.items()): -+ print(peer, mask.percent()) -+ print('end report') - - class Q2QSigma(Options): - -@@ -346,7 +346,7 @@ class Q2QRegister(Options): - svc = self.parent.getService() - - def showit(x): -- print "%s: %s" % (x.value.__class__, x.getErrorMessage()) -+ print("%s: %s" % (x.value.__class__, x.getErrorMessage())) - - enregister(svc, newAddress, self.password).addErrback( - showit).addBoth(lambda nothing: reactor.stop()) ---- vertex/q2qstandalone.py.orig 2015-03-05 02:53:34 UTC -+++ vertex/q2qstandalone.py -@@ -41,7 +41,8 @@ class _usermap: - def __init__(self, path): - self.path = path - -- def __setitem__(self, (domain, username), password): -+ def __setitem__(self, xxx_todo_changeme, password): -+ (domain, username) = xxx_todo_changeme - domainpath = os.path.join(self.path, domain) - if not os.path.exists(domainpath): - os.makedirs(domainpath) -@@ -53,7 +54,8 @@ class _usermap: - password=password.encode('hex')).serialize()) - f.close() - -- def get(self, (domain, username)): -+ def get(self, xxx_todo_changeme1): -+ (domain, username) = xxx_todo_changeme1 - domainpath = os.path.join(self.path, domain) - if os.path.exists(domainpath): - filepath = os.path.join(domainpath, username+".info") -@@ -70,7 +72,7 @@ class DirectoryCertificateAndUserStore(q2q.DirectoryCe - try: - return q2q.DirectoryCertificateStore.getPrivateCertificate(self, domain) - except KeyError: -- if len(self.localStore.keys()) > 10: -+ if len(list(self.localStore.keys())) > 10: - # avoid DoS; nobody is going to need autocreated certs for more - # than 10 domains - raise ---- vertex/test/helpers.py.orig 2015-03-05 02:53:34 UTC -+++ vertex/test/helpers.py -@@ -63,17 +63,17 @@ class FakeQ2QService: - if pump.flush(debug): - result = True - if debug: -- print 'iteration finished. continuing?', result -+ print('iteration finished. continuing?', result) - c = self.calls - self.calls = [] - for s, f, a, k in c: - if debug: -- print 'timed event', s, f, a, k -+ print('timed event', s, f, a, k) - f(*a,**k) - return result - - def listenQ2Q(self, fromAddress, protocolsToFactories, serverDescription): -- for pname, pfact in protocolsToFactories.items(): -+ for pname, pfact in list(protocolsToFactories.items()): - self.listeners[fromAddress, pname] = pfact, serverDescription - return defer.succeed(None) - -@@ -90,7 +90,7 @@ class FakeQ2QService: - - listener, description = self.listeners.get((toAddress, protocolName)) - if listener is None: -- print 'void listener', fromAddress, toAddress, self.listeners, self.listener -+ print('void listener', fromAddress, toAddress, self.listeners, self.listener) - reason = Failure(KeyError()) - protocolFactory.clientConnectionFailed(None, reason) - return defer.fail(reason) ---- vertex/test/test_dependencyservice.py.orig 2013-08-05 02:42:24 UTC -+++ vertex/test/test_dependencyservice.py -@@ -35,10 +35,10 @@ class TestDependencyService(unittest.TestCase): - args = dict(one={}, two={}, three={}) - - one = One(**args) -- self.assert_(one.initialized == ['ONE', 'THREE', 'TWO']) -+ self.assertTrue(one.initialized == ['ONE', 'THREE', 'TWO']) - - two = Two(**args) -- self.assert_(two.initialized == ['ONE', 'TWO', 'THREE']) -+ self.assertTrue(two.initialized == ['ONE', 'TWO', 'THREE']) - - - def test_circularDepends(self): -@@ -52,7 +52,7 @@ class TestDependencyService(unittest.TestCase): - except depserv.StartupError: - pass - else: -- raise unittest.FailTest, 'circular dependencies did not raise an error' -+ raise unittest.FailTest('circular dependencies did not raise an error') - - - def test_requiredWithDependency(self): -@@ -66,4 +66,4 @@ class TestDependencyService(unittest.TestCase): - except depserv.StartupError: - pass - else: -- raise unittest.FailTest, 'unsatisfied dependencies did not raise an error' -+ raise unittest.FailTest('unsatisfied dependencies did not raise an error') ---- vertex/test/test_ptcp.py.orig 2015-03-05 04:12:41 UTC -+++ vertex/test/test_ptcp.py -@@ -48,8 +48,8 @@ class TestProtocol(protocol.Protocol): - bytes = ''.join(self.buffer) - if not self._waiting[1].startswith(bytes): - x = len(os.path.commonprefix([bytes, self._waiting[1]])) -- print x -- print 'it goes wrong starting with', repr(bytes[x:x+100]), repr(self._waiting[1][x:x+100]) -+ print(x) -+ print('it goes wrong starting with', repr(bytes[x:x+100]), repr(self._waiting[1][x:x+100])) - if bytes == self._waiting[1]: - self._waiting[0].callback(None) - self._waiting = None -@@ -167,11 +167,11 @@ class PTCPTransportTestCase(ConnectedPTCPMixin, unitte - - def gotAddress(results): - (serverSuccess, serverAddress), (clientSuccess, clientAddress) = results -- self.failUnless(serverSuccess) -- self.failUnless(clientSuccess) -+ self.assertTrue(serverSuccess) -+ self.assertTrue(clientSuccess) - -- self.assertEquals(serverAddress[1], serverPort.getHost().port) -- self.assertEquals(clientAddress[1], clientPort.getHost().port) -+ self.assertEqual(serverAddress[1], serverPort.getHost().port) -+ self.assertEqual(clientAddress[1], clientPort.getHost().port) - - def connectionsMade(ignored): - return defer.DeferredList([serverProto.transport.whoami(), clientProto.transport.whoami()]).addCallback(gotAddress) -@@ -228,7 +228,7 @@ class PTCPTransportTestCase(ConnectedPTCPMixin, unitte - ServerProtocol=TestProducerProtocol) - - def disconnected(ignored): -- self.assertEquals( -+ self.assertEqual( - ''.join(clientProto.buffer), - ''.join([chr(n) * serverProto.WRITE_SIZE - for n in range(serverProto.NUM_WRITES)])) -@@ -249,7 +249,7 @@ class PTCPTransportTestCase(ConnectedPTCPMixin, unitte - clientProto.transport.resumeProducing() - - def cbBytes(ignored): -- self.failUnless(resumed) -+ self.assertTrue(resumed) - clientProto.transport.loseConnection() - - def cbConnect(ignored): -@@ -282,7 +282,7 @@ class PTCPTransportTestCase(ConnectedPTCPMixin, unitte - - def cbBytes(ignored): - # print 'Disconnected' -- self.assertEquals( -+ self.assertEqual( - ''.join(clientProto.buffer), - ''.join([chr(n) * serverProto.WRITE_SIZE - for n in range(serverProto.NUM_WRITES)])) diff --git a/net-p2p/py-vertex/pkg-descr b/net-p2p/py-vertex/pkg-descr deleted file mode 100644 index 0d4242a7a471..000000000000 --- a/net-p2p/py-vertex/pkg-descr +++ /dev/null @@ -1,16 +0,0 @@ -Vertex is an implementation of the Q2Q protocol (sort of like P2P, but one -better). There are a few moving parts in Vertex: - - * PTCP: a protocol which is nearly identical to TCP, but which runs over - UDP. This lets Q2Q penetrate most NAT configurations. - * JUICE ([JU]ice [I]s [C]oncurrent [E]vents): a very simple but immensely - flexible protocol which forms the basis of the high-level aspects of Q2Q - * vertex: a command line tool which exposes a few features useful in many - situations (such as registration and authentication) - -The Q2Q network has some decentralized features (there is no one server or -company which can control all Q2Q addresses) and features of centralization -(addresses beneath a particular domain are issued by a server for that domain; -once issued, some activities require the server to be contacted again, while -others do not). Vertex includes an identity server capable of hosting Q2Q -addresses. |