From 374a10b729618ce96082fe5f64680f2ae5435221 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Matteo=20=E2=84=B1an?= <SystemRage@protonmail.com>
Date: Tue, 14 May 2019 21:59:34 +0200
Subject: [PATCH] Delete kmsBase.py

---
 py2-kms/kmsBase.py | 331 ---------------------------------------------
 1 file changed, 331 deletions(-)
 delete mode 100644 py2-kms/kmsBase.py

diff --git a/py2-kms/kmsBase.py b/py2-kms/kmsBase.py
deleted file mode 100644
index c3ce92a..0000000
--- a/py2-kms/kmsBase.py
+++ /dev/null
@@ -1,331 +0,0 @@
-#!/usr/bin/env python
-
-import binascii
-import logging
-import os
-import sys
-import time
-import uuid
-
-from structure import Structure
-from kmsDB2Dict import kmsDB2Dict
-import kmsPidGenerator
-import filetimes
-from formatText import justify, shell_message
-
-# sqlite3 is optional
-try:
-	import sqlite3
-except ImportError:
-	pass
-
-logger = logging.getLogger('root')
-
-class UUID(Structure):
-	commonHdr = ()
-	structure = (
-		('raw', '16s'),
-	)
-
-	def get(self):
-		return uuid.UUID(bytes_le=str(self))
-
-class kmsBase:
-        def __init__(self, data, config):
-                self.data = data
-		self.config = config
-		
-	class kmsRequestStruct(Structure):
-		commonHdr = ()
-		structure = (
-			('versionMinor',            '<H'),
-			('versionMajor',            '<H'),
-			('isClientVm',              '<I'),
-			('licenseStatus',           '<I'),
-			('graceTime',               '<I'),
-			('applicationId',           ':', UUID),
-			('skuId',                   ':', UUID),
-			('kmsCountedId' ,           ':', UUID),
-			('clientMachineId',         ':', UUID),
-			('requiredClientCount',     '<I'),
-			('requestTime',             '<Q'),
-			('previousClientMachineId', ':', UUID),
-			('machineName',             'u'),
-			('_mnPad',                  '_-mnPad', '126-len(machineName)'),
-			('mnPad',                   ':'),
-		)
-
-		def getMachineName(self):
-			return self['machineName'].decode('utf-16le')
-
-		def getLicenseStatus(self):
-			return kmsBase.licenseStates[self['licenseStatus']] or "Unknown"
-
-	class kmsResponseStruct(Structure):
-		commonHdr = ()
-		structure = (
-			('versionMinor',         '<H'),
-			('versionMajor',         '<H'),
-			('epidLen',              '<I=len(kmsEpid)+2'),
-			('kmsEpid',              'u'),
-			('clientMachineId',      ':', UUID),
-			('responseTime',         '<Q'),
-			('currentClientCount',   '<I'),
-			('vLActivationInterval', '<I'),
-			('vLRenewalInterval',    '<I'),
-		)
-
-	class GenericRequestHeader(Structure):
-		commonHdr = ()
-		structure = (
-			('bodyLength1',  '<I'),
-			('bodyLength2',  '<I'),
-			('versionMinor', '<H'),
-			('versionMajor', '<H'),
-			('remainder',    '_'),
-		)
-
-	licenseStates = {
-		0 : "Unlicensed",
-		1 : "Activated",
-		2 : "Grace Period",
-		3 : "Out-of-Tolerance Grace Period",
-		4 : "Non-Genuine Grace Period",
-		5 : "Notifications Mode",
-		6 : "Extended Grace Period",
-	}
-
-	licenseStatesEnum = {
-		'unlicensed' : 0,
-		'licensed' : 1,
-		'oobGrace' : 2,
-		'ootGrace' : 3,
-		'nonGenuineGrace' : 4,
-		'notification' : 5,
-		'extendedGrace' : 6
-	}
-
-	errorCodes = {
-		'SL_E_VL_NOT_WINDOWS_SLP' : 0xC004F035,
-		'SL_E_VL_NOT_ENOUGH_COUNT' : 0xC004F038,
-		'SL_E_VL_BINDING_SERVICE_NOT_ENABLED' : 0xC004F039,
-		'SL_E_VL_INFO_PRODUCT_USER_RIGHT' : 0x4004F040,
-		'SL_I_VL_OOB_NO_BINDING_SERVER_REGISTRATION' : 0x4004F041,
-		'SL_E_VL_KEY_MANAGEMENT_SERVICE_ID_MISMATCH' : 0xC004F042,
-		'SL_E_VL_MACHINE_NOT_BOUND' : 0xC004F056
-	}
-
-
-	def getPadding(self, bodyLength):
-                ## https://forums.mydigitallife.info/threads/71213-Source-C-KMS-Server-from-Microsoft-Toolkit?p=1277542&viewfull=1#post1277542
-                return 4 + (((~bodyLength & 3) + 1) & 3)
-
-	def serverLogic(self, kmsRequest):
-		if self.config['sqlite'] and self.config['dbSupport']:
-			self.dbName = 'clients.db'
-			if not os.path.isfile(self.dbName):
-				# Initialize the database.
-				con = None
-				try:
-					con = sqlite3.connect(self.dbName)
-					cur = con.cursor()
-					cur.execute("CREATE TABLE clients(clientMachineId TEXT, machineName TEXT, applicationId TEXT, \
-skuId TEXT, licenseStatus TEXT, lastRequestTime INTEGER, kmsEpid TEXT, requestCount INTEGER)")
-
-				except sqlite3.Error, e:
-                                        logger.error("Error %s:" % e.args[0])
-					sys.exit(1)
-
-				finally:
-					if con:
-						con.commit()
-						con.close()
-
-		shell_message(nshell = 15)
-                logger.debug("KMS Request Bytes: \n%s\n" % justify(binascii.b2a_hex(str(kmsRequest))))
-                logger.debug("KMS Request: \n%s\n" % justify(kmsRequest.dump(print_to_stdout = False)))
-			
-		clientMachineId = kmsRequest['clientMachineId'].get()
-		applicationId = kmsRequest['applicationId'].get()
-		skuId = kmsRequest['skuId'].get()
-		requestDatetime = filetimes.filetime_to_dt(kmsRequest['requestTime'])
-
-		# Localize the request time, if module "tzlocal" is available.
-		try:
-                        from tzlocal import get_localzone
-                        from pytz.exceptions import UnknownTimeZoneError
-                        try:
-                                tz = get_localzone()
-                                local_dt = tz.localize(requestDatetime)
-                        except UnknownTimeZoneError:
-                                logger.warning('Unknown time zone ! Request time not localized.')
-                                local_dt = requestDatetime
-                except ImportError:
-                        logger.warning('Module "tzlocal" not available ! Request time not localized.')
-                        local_dt = requestDatetime
-
-		# Get SkuId, AppId and client threshold.
-		appName, skuName = applicationId, skuId
-		
-		kmsdb = kmsDB2Dict()
-
-                appitems = kmsdb[2]
-                for appitem in appitems:
-                        kmsitems = appitem['KmsItems']
-                        for kmsitem in kmsitems:
-
-                                # Activation threshold.
-                                try:
-                                        count = int(kmsitem['NCountPolicy'])
-                                except KeyError:
-                                        count = 25
-                                
-                                if self.config["CurrentClientCount"] <= count:
-                                        currentClientCount = count + 1
-                                else:
-                                        currentClientCount = self.config["CurrentClientCount"]
-                                
-                                skuitems = kmsitem['SkuItems']
-                                for skuitem in skuitems:
-                                        try:
-                                                if uuid.UUID(skuitem['Id']) == skuId:
-                                                        skuName = skuitem['DisplayName']
-                                                        break
-                                        except IndexError:
-                                                pass
-                                        
-                        if uuid.UUID(appitem['Id']) == applicationId:
-                                appName = appitem['DisplayName']
-                                
-
-		infoDict = {
-			"machineName" : kmsRequest.getMachineName(),
-			"clientMachineId" : str(clientMachineId),
-			"appId" : appName,
-			"skuId" : skuName,
-			"licenseStatus" : kmsRequest.getLicenseStatus(),
-			"requestTime" : int(time.time()),
-			"kmsEpid" : None
-		}
-
-                logger.info("Machine Name: %s" % infoDict["machineName"])
-                logger.info("Client Machine ID: %s" % infoDict["clientMachineId"])
-                logger.info("Application ID: %s" % infoDict["appId"])
-                logger.info("SKU ID: %s" % infoDict["skuId"])
-                logger.info("License Status: %s" % infoDict["licenseStatus"])
-                logger.info("Request Time: %s" % local_dt.strftime('%Y-%m-%d %H:%M:%S %Z (UTC%z)'))
-
-		if self.config['sqlite'] and self.config['dbSupport']:
-			con = None
-			try:
-				con = sqlite3.connect(self.dbName)
-				cur = con.cursor()
-				cur.execute("SELECT * FROM clients WHERE clientMachineId=:clientMachineId;", infoDict)
-				try:
-					data = cur.fetchone()
-					if not data:
-						#print "Inserting row..."
-						cur.execute("INSERT INTO clients (clientMachineId, machineName, applicationId, \
-skuId, licenseStatus, lastRequestTime, requestCount) VALUES (:clientMachineId, :machineName, :appId, :skuId, :licenseStatus, :requestTime, 1);", infoDict)
-					else:
-						#print "Data:", data
-						if data[1] != infoDict["machineName"]:
-							cur.execute("UPDATE clients SET machineName=:machineName WHERE \
-clientMachineId=:clientMachineId;", infoDict)
-						if data[2] != infoDict["appId"]:
-							cur.execute("UPDATE clients SET applicationId=:appId WHERE \
-clientMachineId=:clientMachineId;", infoDict)
-						if data[3] != infoDict["skuId"]:
-							cur.execute("UPDATE clients SET skuId=:skuId WHERE \
-clientMachineId=:clientMachineId;", infoDict)
-						if data[4] != infoDict["licenseStatus"]:
-							cur.execute("UPDATE clients SET licenseStatus=:licenseStatus WHERE \
-clientMachineId=:clientMachineId;", infoDict)
-						if data[5] != infoDict["requestTime"]:
-							cur.execute("UPDATE clients SET lastRequestTime=:requestTime WHERE \
-clientMachineId=:clientMachineId;", infoDict)
-						# Increment requestCount
-						cur.execute("UPDATE clients SET requestCount=requestCount+1 WHERE \
-clientMachineId=:clientMachineId;", infoDict)
-
-				except sqlite3.Error, e:
-                                        logger.error("Error %s:" % e.args[0])
-					
-			except sqlite3.Error, e:
-                                logger.error("Error %s:" % e.args[0])
-				sys.exit(1)
-			finally:
-				if con:
-					con.commit()
-					con.close()
-
-		return self.createKmsResponse(kmsRequest, currentClientCount)
-	
-
-	def createKmsResponse(self, kmsRequest, currentClientCount):
-		response = self.kmsResponseStruct()
-		response['versionMinor'] = kmsRequest['versionMinor']
-		response['versionMajor'] = kmsRequest['versionMajor']
-		
-		if not self.config["epid"]:
-			response["kmsEpid"] = kmsPidGenerator.epidGenerator(kmsRequest['kmsCountedId'].get(), kmsRequest['versionMajor'],
-                                                                            self.config["lcid"]).encode('utf-16le')
-		else:
-			response["kmsEpid"] = self.config["epid"].encode('utf-16le')
-			
-		response['clientMachineId'] = kmsRequest['clientMachineId']
-		response['responseTime'] = kmsRequest['requestTime']
-		response['currentClientCount'] = currentClientCount		
-		response['vLActivationInterval'] = self.config["VLActivationInterval"]
-		response['vLRenewalInterval'] = self.config["VLRenewalInterval"]
-
-		if self.config['sqlite'] and self.config['dbSupport']:
-			con = None
-			try:
-				con = sqlite3.connect(self.dbName)
-				cur = con.cursor()
-				cur.execute("SELECT * FROM clients WHERE clientMachineId=?;", [str(kmsRequest['clientMachineId'].get())])
-				try:
-					data = cur.fetchone()
-					if data[6]:
-						response["kmsEpid"] = data[6].encode('utf-16le')
-					else:
-						cur.execute("UPDATE clients SET kmsEpid=? WHERE clientMachineId=?;",
-                                                            (str(response["kmsEpid"].decode('utf-16le')), str(kmsRequest['clientMachineId'].get())))
-
-				except sqlite3.Error, e:
-                                        logger.error("Error %s:" % e.args[0])
-					
-			except sqlite3.Error, e:
-                                logger.error("Error %s:" % e.args[0])
-                                sys.exit(1)
-			finally:
-				if con:
-					con.commit()
-					con.close()
-
-                logger.info("Server ePID: %s" % response["kmsEpid"].decode('utf-16le').encode('utf-8'))
-                        
-		return response
-
-
-import kmsRequestV4, kmsRequestV5, kmsRequestV6, kmsRequestUnknown
-
-def generateKmsResponseData(data, config):
-	version = kmsBase.GenericRequestHeader(data)['versionMajor']
-	currentDate = time.strftime("%a %b %d %H:%M:%S %Y")
-
-	if version == 4:
-		logger.info("Received V%d request on %s." % (version, currentDate))
-		messagehandler = kmsRequestV4.kmsRequestV4(data, config)	
-	elif version == 5:
-		logger.info("Received V%d request on %s." % (version, currentDate))
-		messagehandler = kmsRequestV5.kmsRequestV5(data, config)
-	elif version == 6:
-		logger.info("Received V%d request on %s." % (version, currentDate))
-		messagehandler = kmsRequestV6.kmsRequestV6(data, config)
-	else:
-		logger.info("Unhandled KMS version V%d." % version)
-		messagehandler = kmsRequestUnknown.kmsRequestUnknown(data, config)
-		
-	return messagehandler.executeRequestLogic()