Advertisement
Guest User

Untitled

a guest
Jun 27th, 2017
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.53 KB | None | 0 0
  1. """
  2. * ufw.io.streams.sock
  3. * ufw stream plugin
  4. provides:
  5.    proto sock (other=None) uses (path if object is None)
  6.    proto unix (server=False) uses path
  7.    proto inet (server=False) uses host, port, path
  8. requires:
  9.    streambase readwrite
  10. """
  11.  
  12. import os
  13. import ssl
  14. import socket
  15. from select import select
  16. from ufw.errors import *
  17. from ufw.core.object import *
  18. from ufw.io.streams.base import *
  19.  
  20. __all__ = ["sock", "inet", "unix"]
  21.  
  22. class sock (readwrite):
  23.     flags = {
  24.         "ioctl":True,
  25.         "secure":True,
  26.         "server":True
  27.     }
  28.     def open(self, other=None):
  29.         self.server = False
  30.         if not other: other = object.get(self.parent.path.path)
  31.         self.stream = other
  32.         self.stream.setblocking(0)
  33.         return self.parent
  34.     def read(self, ln=-1, bufsize=4096, wait=None, rs=''):
  35.         self.opened()
  36.         select([self.stream], [], [])
  37.         if ln >= 0:
  38.             self.opened()
  39.             buf = bytes()
  40.             while len(buf) < ln:
  41.                 try: buf += self.stream.recv(ln)
  42.                 except socket.error: break
  43.         else:
  44.             buf = bytes()
  45.             while True:
  46.                 self.opened()
  47.                 try: add = self.stream.recv(bufsize)
  48.                 except socket.error: add = bytes()
  49.                 buf += add
  50.                 if not wait and not add: break
  51.                 if wait and wait in add: break
  52.                 elif wait:
  53.                     select([self], [], [])
  54.         buf = str(buf)
  55.         self._notnull(buf)
  56.         if wait and wait in buf:
  57.             buf = buf[:buf.find(wait)]
  58.             buf = buf.rstrip(rs)
  59.             return buf + wait
  60.         return buf
  61.     def readline(self):
  62.         return self.read(-1, 1, "\n", "\r\n")
  63.     def write(self, buf):
  64.         self.opened()
  65.         if isinstance(buf, unicode):
  66.             buf = buf.encode("utf-8")
  67.         while buf:
  68.             r, w, x = select([], [self.stream], [], 30)
  69.             if self.stream not in w:
  70.                 self.close()
  71.                 raise io_closed
  72.             sent = self.stream.send(buf)
  73.             buf = buf[sent:]
  74.     def encrypt(self):
  75.         self.opened()
  76.         self.ssl = True
  77.         s = ssl.wrap_socket(
  78.             self.stream,
  79.             server_side=self.server,
  80.             do_handshake_on_connect=False
  81.         )
  82.         ssl_may_fail(s, s.do_handshake)
  83.         self.opened()
  84.         self.stream = s
  85.     def decrypt(self):
  86.         if not self.ssl: return
  87.         self.opened()
  88.         self.ssl = False
  89.         s = ssl_may_fail(self.stream, self.stream.unwrap)
  90.         self.opened()
  91.         self.stream = s
  92.     def listen(self, pint=-1):
  93.         assert self.server
  94.         if pint < 0:
  95.             select([self.stream], [], [])
  96.         else:
  97.             r, w, x = select([self.stream], [], [], pint)
  98.             if self.stream not in r: return None, None
  99.         return self.stream.accept()
  100.     def fileno(self):
  101.         return self.stream.fileno()
  102.  
  103. class unix (sock):
  104.     def __init__(self, *a, **k):
  105.         if not hasattr(socket, "AF_UNIX"):
  106.             raise io_invalid_protocol ("Windows cannot into AF_UNIX")
  107.         super(unix, self).__init__(*a, **k)
  108.     def open(self, server=False):
  109.         self.server = server
  110.         self.stream = socket.socket(socket.AF_UNIX)
  111.         if server:
  112.             self.stream.bind(self.parent.path.path)
  113.             self.stream.listen(5)
  114.         else:
  115.             self.stream.connect(self.parent.path.path)
  116.         self.stream.setblocking(0)
  117.         return self.parent
  118.     def close(self):
  119.         self.opened()
  120.         del self.stream
  121.         if self.server:
  122.             os.unlink(self.parent.path.path)
  123.  
  124. class inet (sock):
  125.     def open(self, server=False):
  126.         self.ssl = False
  127.         self.server = server
  128.         addr = self.parent.path.hostname
  129.         port = self.parent.path.port
  130.         if not addr: addr = ""
  131.         if not port: port = 0
  132.         self.stream = socket.socket(socket.AF_INET)
  133.         if server:
  134.             if addr == "localhost": addr = ""
  135.             self.stream.bind((addr, port))
  136.             self.stream.listen(5)
  137.         else:
  138.             self.stream.connect((addr, port))
  139.         self.stream.setblocking(0)
  140.         return self.parent
  141.  
  142. def ssl_may_fail(s, f, *a, **k):
  143.     while True:
  144.         try: return f(*a, **k)
  145.         except ssl.SSLError as e:
  146.             if e.args[0] == ssl.SSL_ERROR_WANT_READ: select([s],[],[])
  147.             elif e.args[0] == ssl.SSL_ERROR_WANT_WRITE: select([],[s],[])
  148.             else: raise
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement