# Wizard Kit: Functions - Activation

import subprocess

from borrowed import acpi
from functions.common import *
from os import environ


# STATIC VARIABLES
SLMGR = r'{}\System32\slmgr.vbs'.format(environ.get('SYSTEMROOT'))


def activate_with_bios():
  """Attempt to activate Windows with a key stored in the BIOS."""
  # Code borrowed from https://github.com/aeruder/get_win8key
  #####################################################
  #script to query windows 8.x OEM key from PC firmware
  #ACPI -> table MSDM -> raw content -> byte offset 56 to end
  #ck, 03-Jan-2014 (christian@korneck.de)
  #####################################################
  bios_key = None
  table = b"MSDM"
  if acpi.FindAcpiTable(table) is True:
    rawtable = acpi.GetAcpiTable(table)
    #http://msdn.microsoft.com/library/windows/hardware/hh673514
    #byte offset 36 from beginning \
    #   = Microsoft 'software licensing data structure' \
    #   / 36 + 20 bytes offset from beginning = Win Key
    bios_key = rawtable[56:len(rawtable)].decode("utf-8")
  if bios_key is None:
    raise BIOSKeyNotFoundError

  # Install Key
  cmd = ['cscript', '//nologo', SLMGR, '/ipk', bios_key]
  subprocess.run(cmd, check=False)
  sleep(5)

  # Attempt activation
  cmd = ['cscript', '//nologo', SLMGR, '/ato']
  subprocess.run(cmd, check=False)
  sleep(5)

  # Check status
  if not windows_is_activated():
    raise Exception('Activation Failed')


def get_activation_string():
  """Get activation status, returns str."""
  act_str = subprocess.run(
    ['cscript', '//nologo', SLMGR, '/xpr'], check=False,
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  act_str = act_str.stdout.decode()
  act_str = act_str.splitlines()
  act_str = act_str[1].strip()
  return act_str


def windows_is_activated():
  """Check if Windows is activated via slmgr.vbs and return bool."""
  activation_string = subprocess.run(
    ['cscript', '//nologo', SLMGR, '/xpr'], check=False,
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
  activation_string = activation_string.stdout.decode()

  return bool(activation_string and 'permanent' in activation_string)


if __name__ == '__main__':
  print("This file is not meant to be called directly.")

# vim: sts=2 sw=2 ts=2
