# Path: beeswarm/drones/honeypot/capabilities/handlerbase.py
# class HandlerBase(object):
#     def __init__(self, options, workdir):
#         """
#         Base class that all capabilities must inherit from.
# 
#         :param sessions: a dictionary of Session objects.
#         :param options: a dictionary of configuration options.
#         :param workdir: the directory which contains files for this
#                         particular instance of Beeswarm
#         """
#         self.options = options
#         self.sessions = {}
#         if 'users' in options:
#             self.users = options['users']
#         else:
#             self.users = {}
#         # virtual file system shared by all capabilities
#         self.vfsystem = OSFS(os.path.join(workdir, 'data/vfs'))
#         # service port
#         self.port = int(options['port'])
# 
#     def create_session(self, address):
#         protocol = self.__class__.__name__.lower()
#         session = Session(address[0], address[1], protocol, self.users)
#         self.sessions[session.id] = session
#         session.destination_port = self.port
#         logger.debug(
#             'Accepted {0} session on port {1} from {2}:{3}. ({4})'.format(protocol, self.port, address[0],
#                                                                           address[1], str(session.id)))
#         logger.debug('Size of session list for {0}: {1}'.format(protocol, len(self.sessions)))
#         return session
# 
#     def close_session(self, session):
#         logger.debug('Closing sessions')
#         session.end_session()
#         if session.id in self.sessions:
#             del self.sessions[session.id]
#         else:
#             assert False
# 
#     def handle_session(self, socket, address):
#         raise Exception('Do no call base class!')
# 
# Path: beeswarm/drones/honeypot/helpers/common.py
# def send_whole_file(sock_fd, file_fd):
#     offset = 0
#     while True:
#         sent = sendfile(sock_fd, file_fd, offset, 65536)
#         if sent == 0:
#             break
#         offset += sent


import base64
import socket
import logging
from BaseHTTPServer import BaseHTTPRequestHandler
from beeswarm.drones.honeypot.capabilities.handlerbase import HandlerBase
from beeswarm.drones.honeypot.helpers.common import send_whole_file





logger = logging.getLogger(__name__)


class BeeHTTPHandler(BaseHTTPRequestHandler):
    def __init__(self, request, client_address, vfs, server, httpsession, options, users):

        self.vfs = vfs
        self.users = users
        self.current_user = None  # This is set if a login attempt is successful

        # Had to call parent initializer later, because the methods used
        # in BaseHTTPRequestHandler.__init__() call handle_one_request()
        # which calls the do_* methods here. If _banner, _session and _options
        # are not set, we get a bunch of errors (Undefined reference blah blah)

        self._options = options
        if 'banner' in self._options:
            self._banner = self._options['banner']
        else:
            self._banner = 'Microsoft-IIS/5.0'
        self._session = httpsession
        BaseHTTPRequestHandler.__init__(self, request, client_address, server)
        self._session.end_session()

    def do_HEAD(self):

# Path: beeswarm/drones/honeypot/capabilities/handlerbase.py
# class HandlerBase(object):
#     def __init__(self, options, workdir):
#         """
#         Base class that all capabilities must inherit from.
# 
#         :param sessions: a dictionary of Session objects.
#         :param options: a dictionary of configuration options.
#         :param workdir: the directory which contains files for this
#                         particular instance of Beeswarm
#         """
#         self.options = options
#         self.sessions = {}
#         if 'users' in options:
#             self.users = options['users']
#         else:
#             self.users = {}
#         # virtual file system shared by all capabilities
#         self.vfsystem = OSFS(os.path.join(workdir, 'data/vfs'))
#         # service port
#         self.port = int(options['port'])
# 
#     def create_session(self, address):
#         protocol = self.__class__.__name__.lower()
#         session = Session(address[0], address[1], protocol, self.users)
#         self.sessions[session.id] = session
#         session.destination_port = self.port
#         logger.debug(
#             'Accepted {0} session on port {1} from {2}:{3}. ({4})'.format(protocol, self.port, address[0],
#                                                                           address[1], str(session.id)))
#         logger.debug('Size of session list for {0}: {1}'.format(protocol, len(self.sessions)))
#         return session
# 
#     def close_session(self, session):
#         logger.debug('Closing sessions')
#         session.end_session()
#         if session.id in self.sessions:
#             del self.sessions[session.id]
#         else:
#             assert False
# 
#     def handle_session(self, socket, address):
#         raise Exception('Do no call base class!')
# 
# Path: beeswarm/drones/honeypot/helpers/common.py
# def send_whole_file(sock_fd, file_fd):
#     offset = 0
#     while True:
#         sent = sendfile(sock_fd, file_fd, offset, 65536)
#         if sent == 0:
#             break
#         offset += sent


# Path: beeswarm/drones/honeypot/capabilities/http.py
import base64
import socket
import logging
from BaseHTTPServer import BaseHTTPRequestHandler
from beeswarm.drones.honeypot.capabilities.handlerbase import HandlerBase
from beeswarm.drones.honeypot.helpers.common import send_whole_file






logger = logging.getLogger(__name__)


class BeeHTTPHandler(BaseHTTPRequestHandler):
    def __init__(self, request, client_address, vfs, server, httpsession, options, users):

        self.vfs = vfs
        self.users = users
        self.current_user = None  # This is set if a login attempt is successful

        # Had to call parent initializer later, because the methods used
        # in BaseHTTPRequestHandler.__init__() call handle_one_request()
        # which calls the do_* methods here. If _banner, _session and _options
        # are not set, we get a bunch of errors (Undefined reference blah blah)

        self._options = options
        if 'banner' in self._options:
            self._banner = self._options['banner']
        else:
            self._banner = 'Microsoft-IIS/5.0'
        self._session = httpsession
        BaseHTTPRequestHandler.__init__(self, request, client_address, server)
        self._session.end_session()

    def do_HEAD(self):

        self.send_response(200)