Create StemPortPlugin.py
This commit is contained in:
parent
ce4a91b679
commit
8ba684e8c3
1 changed files with 129 additions and 0 deletions
129
plugins/disabled-StemPort/StemPortPlugin.py
Normal file
129
plugins/disabled-StemPort/StemPortPlugin.py
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
import logging
|
||||||
|
import traceback
|
||||||
|
|
||||||
|
import socket
|
||||||
|
import stem
|
||||||
|
from stem import Signal
|
||||||
|
from stem.control import Controller
|
||||||
|
from stem.socket import ControlPort
|
||||||
|
|
||||||
|
from Plugin import PluginManager
|
||||||
|
from Config import config
|
||||||
|
from Debug import Debug
|
||||||
|
|
||||||
|
class PatchedControlPort(ControlPort):
|
||||||
|
def _make_socket(self):
|
||||||
|
try:
|
||||||
|
if "socket_noproxy" in dir(socket): # Socket proxy-patched, use non-proxy one
|
||||||
|
control_socket = socket.socket_noproxy(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
else:
|
||||||
|
control_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
|
||||||
|
# TODO: repeated code - consider making a separate method
|
||||||
|
|
||||||
|
control_socket.connect((self._control_addr, self._control_port))
|
||||||
|
return control_socket
|
||||||
|
except socket.error as exc:
|
||||||
|
raise stem.SocketError(exc)
|
||||||
|
|
||||||
|
def from_port(address = '127.0.0.1', port = 'default'):
|
||||||
|
import stem.connection
|
||||||
|
|
||||||
|
if not stem.util.connection.is_valid_ipv4_address(address):
|
||||||
|
raise ValueError('Invalid IP address: %s' % address)
|
||||||
|
elif port != 'default' and not stem.util.connection.is_valid_port(port):
|
||||||
|
raise ValueError('Invalid port: %s' % port)
|
||||||
|
|
||||||
|
if port == 'default':
|
||||||
|
raise ValueError('Must specify a port')
|
||||||
|
else:
|
||||||
|
control_port = PatchedControlPort(address, port)
|
||||||
|
|
||||||
|
return Controller(control_port)
|
||||||
|
|
||||||
|
|
||||||
|
@PluginManager.registerTo("TorManager")
|
||||||
|
class TorManagerPlugin(object):
|
||||||
|
|
||||||
|
def connectController(self):
|
||||||
|
self.log.info("Authenticate using Stem... %s:%s" % (self.ip, self.port))
|
||||||
|
|
||||||
|
try:
|
||||||
|
with self.lock:
|
||||||
|
if config.tor_password:
|
||||||
|
controller = from_port(port=self.port, password=config.tor_password)
|
||||||
|
else:
|
||||||
|
controller = from_port(port=self.port)
|
||||||
|
controller.authenticate()
|
||||||
|
self.controller = controller
|
||||||
|
self.status = u"Connected via Stem"
|
||||||
|
except Exception, err:
|
||||||
|
print("\n")
|
||||||
|
traceback.print_exc()
|
||||||
|
print("\n")
|
||||||
|
|
||||||
|
self.controller = None
|
||||||
|
self.status = u"Error (%s)" % err
|
||||||
|
self.log.error("Tor stem connect error: %s" % Debug.formatException(err))
|
||||||
|
|
||||||
|
return self.controller
|
||||||
|
|
||||||
|
|
||||||
|
def disconnect(self):
|
||||||
|
self.controller.close()
|
||||||
|
self.controller = None
|
||||||
|
|
||||||
|
|
||||||
|
def resetCircuits(self):
|
||||||
|
try:
|
||||||
|
self.controller.signal(Signal.NEWNYM)
|
||||||
|
except Exception, err:
|
||||||
|
self.status = u"Stem reset circuits error (%s)" % err
|
||||||
|
self.log.error("Stem reset circuits error: %s" % err)
|
||||||
|
|
||||||
|
|
||||||
|
def makeOnionAndKey(self):
|
||||||
|
try:
|
||||||
|
service = self.controller.create_ephemeral_hidden_service(
|
||||||
|
{self.fileserver_port: self.fileserver_port},
|
||||||
|
await_publication = True
|
||||||
|
)
|
||||||
|
if service.private_key_type != "RSA1024":
|
||||||
|
raise Exception("ZeroNet doesn't support crypto " + service.private_key_type)
|
||||||
|
return (service.service_id, service.private_key)
|
||||||
|
|
||||||
|
except Exception, err:
|
||||||
|
self.status = u"AddOnion error (stem)"
|
||||||
|
self.log.error("Failed to create hidden service with Stem: " + err)
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def delOnion(self, address):
|
||||||
|
try:
|
||||||
|
self.controller.remove_ephemeral_hidden_service(address)
|
||||||
|
return True
|
||||||
|
except Exception, err:
|
||||||
|
self.status = u"DelOnion error (stem)"
|
||||||
|
self.log.error("Stem delOnion error: %s" % err)
|
||||||
|
self.disconnect() # Why?
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
def request(self, cmd):
|
||||||
|
with self.lock:
|
||||||
|
if not self.enabled:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
self.log.debug("[WARNING] StemPort self.request should not be called")
|
||||||
|
return ""
|
||||||
|
|
||||||
|
def send(self, cmd, conn=None):
|
||||||
|
self.log.debug("[WARNING] StemPort self.send should not be called")
|
||||||
|
return ""
|
||||||
|
|
||||||
|
def createSocket(self, onion, port):
|
||||||
|
if not self.enabled:
|
||||||
|
return False
|
||||||
|
|
||||||
|
self.debug.log("[WARNING] StemPort createSocket should not be called")
|
||||||
|
return False
|
Loading…
Reference in a new issue