#-*- coding: utf-8 -*-

# apploader.py
# WelsonJS app loader over gRPC protocol (gRPC proto 3) - Server
# https://github.com/gnh1201/welsonjs

import os
import sys
import win32com
import win32com.client
import pythoncom

sys.path.insert(0, os.path.dirname(__file__))

from concurrent import futures
import logging

import grpc
import WelsonAppLoader_pb2
import WelsonAppLoader_pb2_grpc

# get file path
workingDirectory = os.path.join(os.path.dirname(__file__), '../../..')
print('[*] Working Directory: ' + workingDirectory);

def runApp(appName):
    # Initalization for SubThread
    pythoncom.CoInitialize()

    # load scriptcontrol.js file
    f = open(workingDirectory + "/scriptcontrol.js", 'r')
    payload_code = f.read()

    # load JScript engine
    sc = win32com.client.Dispatch('MSScriptControl.ScriptControl') 
    sc.Language = "JScript"
    sc.AddCode(payload_code);
    sc.Run('setWorkingDirectory', workingDirectory);
    result = sc.Run('run', appName)

    # check a result
    print (result)

    # Return a result
    return result

class WelsonAppLoader(WelsonAppLoader_pb2_grpc.WelsonAppLoaderServicer):
    def Run(self, request, context):
        return WelsonAppLoader_pb2.AppResponse(responseText=runApp(request.appName))

def serve():
    port = "50051"
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=1))  # Only allow 1 worker
    WelsonAppLoader_pb2_grpc.add_WelsonAppLoaderServicer_to_server(WelsonAppLoader(), server)
    server.add_insecure_port("[::]:" + port)
    server.start()
    print("Server started, listening on " + port)
    server.wait_for_termination()

if __name__ == "__main__":
    logging.basicConfig()
    serve()