Windows: Prefer USERPROFILE over HOMEPATH

HOMEPATH is set to "\WINDOWS\system32" when running per "runas" session.
This directory is not writable by ordinary users, leading to errors with many ruby tools.
Also config files in the home directory are not recognized.

Still keeping HOME at first which is not used by native Windows,
but by ruby specs and by MSYS2 environment.
This commit is contained in:
Lars Kanis 2022-12-18 21:05:54 +01:00 committed by Nobuyoshi Nakada
parent 6a55b4601a
commit d0f5dc9eac
Notes: git 2022-12-24 14:49:11 +00:00
2 changed files with 26 additions and 9 deletions

View File

@ -32,6 +32,23 @@ describe "Dir.home" do
end end
end end
platform_is :windows do
it "retrieves the directory from HOME, USERPROFILE, HOMEDRIVE/HOMEPATH and the WinAPI in that order" do
old_dirs = [ENV.delete('HOME'), ENV.delete('USERPROFILE'), ENV.delete('HOMEDRIVE'), ENV.delete('HOMEPATH')]
Dir.home.should == old_dirs[1].gsub("\\", "/")
ENV['HOMEDRIVE'] = "C:"
ENV['HOMEPATH'] = "\\rubyspec\\home1"
Dir.home.should == "C:/rubyspec/home1"
ENV['USERPROFILE'] = "C:\\rubyspec\\home2"
Dir.home.should == "C:/rubyspec/home2"
ENV['HOME'] = "C:\\rubyspec\\home3"
Dir.home.should == "C:/rubyspec/home3"
ensure
ENV['HOME'], ENV['USERPROFILE'], ENV['HOMEDRIVE'], ENV['HOMEPATH'] = *old_dirs
end
end
describe "when called with the current user name" do describe "when called with the current user name" do
platform_is :solaris do platform_is :solaris do
it "returns the named user's home directory from the user database" do it "returns the named user's home directory from the user database" do

View File

@ -544,7 +544,7 @@ rb_w32_system_tmpdir(WCHAR *path, UINT len)
afterwards with xfree. afterwards with xfree.
Try: Try:
HOME, HOMEDRIVE + HOMEPATH and USERPROFILE environment variables HOME, USERPROFILE, HOMEDRIVE + HOMEPATH environment variables
Special Folders - Profile and Personal Special Folders - Profile and Personal
*/ */
WCHAR * WCHAR *
@ -553,13 +553,17 @@ rb_w32_home_dir(void)
WCHAR *buffer = NULL; WCHAR *buffer = NULL;
size_t buffer_len = MAX_PATH, len = 0; size_t buffer_len = MAX_PATH, len = 0;
enum { enum {
HOME_NONE, ENV_HOME, ENV_DRIVEPATH, ENV_USERPROFILE HOME_NONE, ENV_HOME, ENV_USERPROFILE, ENV_DRIVEPATH
} home_type = HOME_NONE; } home_type = HOME_NONE;
if ((len = GetEnvironmentVariableW(L"HOME", NULL, 0)) != 0) { if ((len = GetEnvironmentVariableW(L"HOME", NULL, 0)) != 0) {
buffer_len = len; buffer_len = len;
home_type = ENV_HOME; home_type = ENV_HOME;
} }
else if ((len = GetEnvironmentVariableW(L"USERPROFILE", NULL, 0)) != 0) {
buffer_len = len;
home_type = ENV_USERPROFILE;
}
else if ((len = GetEnvironmentVariableW(L"HOMEDRIVE", NULL, 0)) != 0) { else if ((len = GetEnvironmentVariableW(L"HOMEDRIVE", NULL, 0)) != 0) {
buffer_len = len; buffer_len = len;
if ((len = GetEnvironmentVariableW(L"HOMEPATH", NULL, 0)) != 0) { if ((len = GetEnvironmentVariableW(L"HOMEPATH", NULL, 0)) != 0) {
@ -567,10 +571,6 @@ rb_w32_home_dir(void)
home_type = ENV_DRIVEPATH; home_type = ENV_DRIVEPATH;
} }
} }
else if ((len = GetEnvironmentVariableW(L"USERPROFILE", NULL, 0)) != 0) {
buffer_len = len;
home_type = ENV_USERPROFILE;
}
/* allocate buffer */ /* allocate buffer */
buffer = ALLOC_N(WCHAR, buffer_len); buffer = ALLOC_N(WCHAR, buffer_len);
@ -579,13 +579,13 @@ rb_w32_home_dir(void)
case ENV_HOME: case ENV_HOME:
GetEnvironmentVariableW(L"HOME", buffer, buffer_len); GetEnvironmentVariableW(L"HOME", buffer, buffer_len);
break; break;
case ENV_USERPROFILE:
GetEnvironmentVariableW(L"USERPROFILE", buffer, buffer_len);
break;
case ENV_DRIVEPATH: case ENV_DRIVEPATH:
len = GetEnvironmentVariableW(L"HOMEDRIVE", buffer, buffer_len); len = GetEnvironmentVariableW(L"HOMEDRIVE", buffer, buffer_len);
GetEnvironmentVariableW(L"HOMEPATH", buffer + len, buffer_len - len); GetEnvironmentVariableW(L"HOMEPATH", buffer + len, buffer_len - len);
break; break;
case ENV_USERPROFILE:
GetEnvironmentVariableW(L"USERPROFILE", buffer, buffer_len);
break;
default: default:
if (!get_special_folder(CSIDL_PROFILE, buffer, buffer_len) && if (!get_special_folder(CSIDL_PROFILE, buffer, buffer_len) &&
!get_special_folder(CSIDL_PERSONAL, buffer, buffer_len)) { !get_special_folder(CSIDL_PERSONAL, buffer, buffer_len)) {