Skip to content

Commit

Permalink
[win installer] update HKCU instead of HKLM registry if access is den…
Browse files Browse the repository at this point in the history
…ied (closes #8870)
  • Loading branch information
RealyUniqueName committed Nov 26, 2019
1 parent 17f8e89 commit ae2e103
Showing 1 changed file with 31 additions and 13 deletions.
44 changes: 31 additions & 13 deletions extra/WinSetup.hx
Expand Up @@ -10,15 +10,27 @@ enum abstract RegDataType<T>(String) to String {
var REG_SZ:RegDataType<String>;
}

class AccessDenied {
public var message:String;
public function new(msg:String) message = msg;
public function toString() return message;
}

class WinSetup {
static inline var HAXEPATH = 'HAXEPATH';
static inline var NEKO_INSTPATH = 'NEKO_INSTPATH';

static inline var REG_ENVIRONMENT = 'HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment';
static inline var REG_HKLM_ENVIRONMENT = 'HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment';
static inline var REG_HKCU_ENVIRONMENT = 'HKEY_CURRENT_USER\\Environment';

static function main() {
try run()
catch(e:Dynamic) {
try {
try {
run(REG_HKLM_ENVIRONMENT);
} catch(e:AccessDenied) {
run(REG_HKCU_ENVIRONMENT);
}
} catch(e:Dynamic) {
Sys.stderr().writeString(Std.string(e) + '\n');
#if debug
Sys.stderr().writeString(haxe.CallStack.toString(haxe.CallStack.exceptionStack()) + '\n');
Expand All @@ -36,24 +48,24 @@ class WinSetup {
return '%$name%';
}

static function run() {
static function run(regDir:String) {
var haxePath = Sys.getCwd().removeTrailingSlashes();
var addHaxe = '$haxePath\\haxe.exe'.exists();
if(addHaxe) {
setVar(HAXEPATH, REG_SZ, haxePath);
setRegValue(regDir, HAXEPATH, REG_SZ, haxePath);
}

var nekoPath = Path.join([Path.directory(haxePath), 'neko']).replace('/', '\\');
var addNeko = '$nekoPath\\neko.exe'.exists();
if(addNeko) {
setVar(NEKO_INSTPATH, REG_SZ, nekoPath);
setRegValue(regDir, NEKO_INSTPATH, REG_SZ, nekoPath);
}

if(!addHaxe && !addNeko) {
return;
}

var paths = readPath().split(';');
var paths = readPath(regDir).split(';');
addHaxe = paths.indexOf(HAXEPATH.envVar()) < 0 && addHaxe;
if(addHaxe) {
paths.push(HAXEPATH.envVar());
Expand All @@ -63,12 +75,12 @@ class WinSetup {
paths.push(NEKO_INSTPATH.envVar());
}
if(addHaxe || addNeko) {
setVar('path', REG_EXPAND_SZ, paths.join(';'));
setRegValue(regDir, 'path', REG_EXPAND_SZ, paths.join(';'));
}
}

static function readPath():String {
var p = new Process('reg', ['query', REG_ENVIRONMENT, '/v', 'path']);
static function readPath(regDir:String):String {
var p = new Process('reg', ['query', regDir, '/v', 'path']);
if(p.exitCode() != 0) {
var error = p.stderr.readAll().toString();
p.close();
Expand Down Expand Up @@ -103,12 +115,18 @@ class WinSetup {
throw 'Cannot parse a query to reg.exe for PATH value:\n$response';
}

static function setVar<T>(name:String, dataType:RegDataType<T>, value:T) {
var p = new Process('reg', ['add', REG_ENVIRONMENT, '/v', name, '/t', dataType, '/d', '$value', '/f']);
static function setRegValue<T>(regDir:String, name:String, dataType:RegDataType<T>, value:T) {
var p = new Process('reg', ['add', regDir, '/v', name, '/t', dataType, '/d', '$value', '/f']);
if(p.exitCode() != 0) {
var error = p.stderr.readAll().toString();
p.close();
throw 'Cannot set a value for $name via reg.exe:\n$error';
var msg = 'Cannot set a value for $name via reg.exe:\n$error';
if(~/access(.*)denied/i.match(error)) {
throw new AccessDenied(msg);
} else {
throw msg;
}
}
p.close();
}
}

0 comments on commit ae2e103

Please sign in to comment.