# Copyright (c) 2014-2016 Marcello Salvati
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA
#

import logging
import argparse

from core.configwatcher import ConfigWatcher
from core.logger import logger

class Plugin(ConfigWatcher):
    name        = "Generic plugin"
    optname     = "generic"
    tree_info   = []
    desc        = ""
    version     = "0.0"

    def __init__(self, parser):
        '''Passed the options namespace'''
        if self.desc:
            sgroup = parser.add_argument_group(self.name, self.desc)
        else:
            sgroup = parser.add_argument_group(self.name,"Options for the '{}' plugin".format(self.name))

        sgroup.add_argument("--{}".format(self.optname), action="store_true",help="Load plugin '{}'".format(self.name))

        self.options(sgroup)

    def initialize(self, options):
        '''Called if plugin is enabled, passed the options namespace'''
        self.options = options

    def request(self, request):
        '''
            Handles all outgoing requests, hooks connectionMade()
            request object has the following attributes:

            request.headers => headers in dict format
            request.commad  => HTTP method
            request.post    => POST data
            request.uri     => full URL
            request.path    => path
        '''
        pass

    def responseheaders(self, response, request):
        '''
            Handles all response headers, hooks handleEndHeaders()
        '''
        pass

    def responsestatus(self, request, version, code, message):
        '''
            Handles server response HTTP version, code and message
        '''
        return {"request": request, "version": version, "code": code, "message": message}

    def response(self, response, request, data):
        '''
            Handles all non-image responses by default, hooks handleResponse() (See Upsidedownternet for how to get images)  
        '''
        return {'response': response, 'request':request, 'data': data}

    def on_config_change(self):
        """Do something when MITMf detects the config file has been modified"""
        pass

    def options(self, options):
        '''Add your options to the options parser'''
        pass

    def reactor(self, strippingFactory):
        '''This makes it possible to set up another instance of the reactor on a diffrent port, passed the default factory'''
        pass

    def setup_logger(self):
        formatter = logging.Formatter("%(asctime)s [{}] %(message)s".format(self.name), datefmt="%Y-%m-%d %H:%M:%S")
        self.log = logger().setup_logger(self.name, formatter)

        formatter = logging.Formatter("%(asctime)s %(clientip)s [type:%(browser)s-%(browserv)s os:%(clientos)s] [{}] %(message)s".format(self.name), datefmt="%Y-%m-%d %H:%M:%S")
        self.clientlog = logger().setup_logger("{}_{}".format(self.name, "clientlog"), formatter)

    def on_shutdown(self):
        '''This will be called when shutting down'''
        pass
