diff --git a/trytond/netsvc.py b/trytond/netsvc.py deleted file mode 100644 index 5f26746aa6..0000000000 --- a/trytond/netsvc.py +++ /dev/null @@ -1,87 +0,0 @@ -#This file is part of Tryton. The COPYRIGHT file at the top level of -#this repository contains the full copyright notices and license terms. -import threading -import SocketServer -import socket -import logging -import os -import BaseHTTPServer -from trytond.protocols.sslsocket import SSLSocket -from config import CONFIG - - -#-- WebDAV server - -class BaseThreadedHTTPServer(SocketServer.ThreadingMixIn, - BaseHTTPServer.HTTPServer): - - max_children = CONFIG['max_thread'] - - def server_bind(self): - self.socket.setsockopt(socket.SOL_SOCKET, - socket.SO_REUSEADDR, 1) - BaseHTTPServer.HTTPServer.server_bind(self) - - -class SecureThreadedHTTPServer(BaseThreadedHTTPServer): - - def __init__(self, server_address, HandlerClass): - BaseThreadedHTTPServer.__init__(self, server_address, HandlerClass) - self.socket = SSLSocket(socket.socket(self.address_family, - self.socket_type)) - self.server_bind() - self.server_activate() - - -class WebDAVServerThread(threading.Thread): - - def __init__(self, interface, port, secure=False): - from webdavsvc import WebDAVAuthRequestHandler, SecureWebDAVAuthRequestHandler, \ - TrytonDAVInterface - threading.Thread.__init__(self) - self.secure = secure - self.running = False - ipv6 = False - if socket.has_ipv6: - try: - socket.getaddrinfo(interface or None, port, socket.AF_INET6) - ipv6 = True - except: - pass - if secure: - handler_class = SecureWebDAVAuthRequestHandler - server_class = SecureThreadedHTTPServer - if ipv6: - server_class = SecureThreadedHTTPServer6 - else: - handler_class = WebDAVAuthRequestHandler - server_class = BaseThreadedHTTPServer - if ipv6: - server_class = BaseThreadedHTTPServer6 - handler_class.IFACE_CLASS = TrytonDAVInterface(interface, port, secure) - self.server = server_class((interface, port), handler_class) - - def stop(self): - self.running = False - if os.name != 'nt': - if hasattr(socket, 'SHUT_RDWR'): - self.server.socket.shutdown(socket.SHUT_RDWR) - else: - self.server.socket.shutdown(2) - self.server.socket.close() - - def run(self): - self.running = True - while self.running: - self.server.handle_request() - return True - -#--- IPv6 Servers - -class BaseThreadedHTTPServer6(BaseThreadedHTTPServer): - address_family = socket.AF_INET6 - -#--- Secure IPv6 Servers - -class SecureThreadedHTTPServer6(SecureThreadedHTTPServer): - address_family = socket.AF_INET6 diff --git a/trytond/webdavsvc.py b/trytond/protocols/webdav.py similarity index 81% rename from trytond/webdavsvc.py rename to trytond/protocols/webdav.py index 699f55b9fd..42f74b2bcc 100644 --- a/trytond/webdavsvc.py +++ b/trytond/protocols/webdav.py @@ -1,7 +1,18 @@ #This file is part of Tryton. The COPYRIGHT file at the top level of #this repository contains the full copyright notices and license terms. -import urlparse +from trytond.protocols.sslsocket import SSLSocket +from trytond.config import CONFIG +from trytond.security import login +from trytond.version import PACKAGE, VERSION, WEBSITE +from trytond.tools.misc import Cache, LocalDict +from trytond.backend import Database +from trytond.pool import Pool +import threading +import SocketServer import socket +import os +import BaseHTTPServer +import urlparse import base64 import time from DAV import AuthServer, WebDAVServer, iface @@ -9,13 +20,7 @@ from DAV.errors import * from DAV.constants import COLLECTION, OBJECT from DAV.utils import get_uriparentpath, get_urifilename, quote_uri from DAV.davcmd import copyone, copytree, moveone, movetree, delone, deltree -from netsvc import SSLSocket -import security -from version import PACKAGE, VERSION, WEBSITE -from tools.misc import Cache, LocalDict import urllib -from trytond.backend import Database -from trytond.pool import Pool # Local int for multi-thread import sys @@ -54,6 +59,77 @@ if DAV_VERSION == '0.8': WebDAVServer.DAVRequestHandler._config = _Config() +class BaseThreadedHTTPServer(SocketServer.ThreadingMixIn, + BaseHTTPServer.HTTPServer): + + max_children = CONFIG['max_thread'] + + def server_bind(self): + self.socket.setsockopt(socket.SOL_SOCKET, + socket.SO_REUSEADDR, 1) + BaseHTTPServer.HTTPServer.server_bind(self) + + +class SecureThreadedHTTPServer(BaseThreadedHTTPServer): + + def __init__(self, server_address, HandlerClass): + BaseThreadedHTTPServer.__init__(self, server_address, HandlerClass) + self.socket = SSLSocket(socket.socket(self.address_family, + self.socket_type)) + self.server_bind() + self.server_activate() + + +class WebDAVServerThread(threading.Thread): + + def __init__(self, interface, port, secure=False): + threading.Thread.__init__(self) + self.secure = secure + self.running = False + ipv6 = False + if socket.has_ipv6: + try: + socket.getaddrinfo(interface or None, port, socket.AF_INET6) + ipv6 = True + except: + pass + if secure: + handler_class = SecureWebDAVAuthRequestHandler + server_class = SecureThreadedHTTPServer + if ipv6: + server_class = SecureThreadedHTTPServer6 + else: + handler_class = WebDAVAuthRequestHandler + server_class = BaseThreadedHTTPServer + if ipv6: + server_class = BaseThreadedHTTPServer6 + handler_class.IFACE_CLASS = TrytonDAVInterface(interface, port, secure) + self.server = server_class((interface, port), handler_class) + + def stop(self): + self.running = False + if os.name != 'nt': + if hasattr(socket, 'SHUT_RDWR'): + self.server.socket.shutdown(socket.SHUT_RDWR) + else: + self.server.socket.shutdown(2) + self.server.socket.close() + + def run(self): + self.running = True + while self.running: + self.server.handle_request() + return True + + +class BaseThreadedHTTPServer6(BaseThreadedHTTPServer): + address_family = socket.AF_INET6 + + +class SecureThreadedHTTPServer6(SecureThreadedHTTPServer): + address_family = socket.AF_INET6 + + class TrytonDAVInterface(iface.dav_interface): def __init__(self, interface, port, secure=False): @@ -353,7 +429,7 @@ class WebDAVAuthRequestHandler(AuthServer.BufferedAuthRequestHandler, dbname = self.path.split('/', 2)[1] if not dbname: return 1 - USER_ID = security.login(dbname, user, password, cache=False) + USER_ID = login(dbname, user, password, cache=False) Cache.clean(dbname) Cache.resets(dbname) if int(USER_ID): diff --git a/trytond/server.py b/trytond/server.py index e4c0e4893c..5141b3d850 100644 --- a/trytond/server.py +++ b/trytond/server.py @@ -9,7 +9,6 @@ datefmt='%a %b %d %H:%M:%S %Y' logging.basicConfig(level=logging.DEBUG, format=format, datefmt=datefmt) import logging.handlers import sys, os, signal -import netsvc import time from trytond.backend import Database, DatabaseOperationalError from config import CONFIG @@ -157,7 +156,8 @@ class TrytonServer(object): CONFIG['netport'])) if CONFIG['webdav']: - webdavd = netsvc.WebDAVServerThread(CONFIG['interface'], + from trytond.protocols.webdav import WebDAVServerThread + webdavd = WebDAVServerThread(CONFIG['interface'], CONFIG['webdavport'], CONFIG['secure_webdav']) self.logger.info("starting WebDAV%s protocol, port %d" % \ (CONFIG['secure_webdav'] and ' Secure' or '',