diff options
author | cjihrig <cjihrig@gmail.com> | 2016-04-07 20:45:40 +0300 |
---|---|---|
committer | cjihrig <cjihrig@gmail.com> | 2016-04-13 00:21:29 +0300 |
commit | d6e56fd843895356769774aebe28b0206ea86d35 (patch) | |
tree | f39bbec22b661157f70c0a44050ee006e6678385 /src/node_os.cc | |
parent | aba035fb27b14fe561c45540818be6a2bbb9dc9e (diff) |
os: add userInfo() method
os.userInfo() calls libuv's uv_os_get_passwd() function. It returns
an object containing the current effective user's username, uid,
gid, shell, and home directory. On Windows, the uid and gid are
-1, and the shell is null.
Refs: https://github.com/nodejs/node/issues/5582
PR-URL: https://github.com/nodejs/node/pull/6104
Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src/node_os.cc')
-rw-r--r-- | src/node_os.cc | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/node_os.cc b/src/node_os.cc index f432702792f..9a995b3112f 100644 --- a/src/node_os.cc +++ b/src/node_os.cc @@ -2,6 +2,7 @@ #include "v8.h" #include "env.h" #include "env-inl.h" +#include "string_bytes.h" #include <errno.h> #include <string.h> @@ -32,6 +33,7 @@ using v8::Context; using v8::FunctionCallbackInfo; using v8::Integer; using v8::Local; +using v8::Null; using v8::Number; using v8::Object; using v8::String; @@ -290,6 +292,72 @@ static void GetHomeDirectory(const FunctionCallbackInfo<Value>& args) { } +static void GetUserInfo(const FunctionCallbackInfo<Value>& args) { + Environment* env = Environment::GetCurrent(args); + uv_passwd_t pwd; + enum encoding encoding; + + if (args[0]->IsObject()) { + Local<Object> options = args[0].As<Object>(); + Local<Value> encoding_opt = options->Get(env->encoding_string()); + encoding = ParseEncoding(env->isolate(), encoding_opt, UTF8); + } else { + encoding = UTF8; + } + + const int err = uv_os_get_passwd(&pwd); + + if (err) { + return env->ThrowUVException(err, "uv_os_get_passwd"); + } + + Local<Value> uid = Number::New(env->isolate(), pwd.uid); + Local<Value> gid = Number::New(env->isolate(), pwd.gid); + Local<Value> username = StringBytes::Encode(env->isolate(), + pwd.username, + encoding); + Local<Value> homedir = StringBytes::Encode(env->isolate(), + pwd.homedir, + encoding); + Local<Value> shell; + + if (pwd.shell == NULL) + shell = Null(env->isolate()); + else + shell = StringBytes::Encode(env->isolate(), pwd.shell, encoding); + + uv_os_free_passwd(&pwd); + + if (username.IsEmpty()) { + return env->ThrowUVException(UV_EINVAL, + "uv_os_get_passwd", + "Invalid character encoding for username"); + } + + if (homedir.IsEmpty()) { + return env->ThrowUVException(UV_EINVAL, + "uv_os_get_passwd", + "Invalid character encoding for homedir"); + } + + if (shell.IsEmpty()) { + return env->ThrowUVException(UV_EINVAL, + "uv_os_get_passwd", + "Invalid character encoding for shell"); + } + + Local<Object> entry = Object::New(env->isolate()); + + entry->Set(env->uid_string(), uid); + entry->Set(env->gid_string(), gid); + entry->Set(env->username_string(), username); + entry->Set(env->homedir_string(), homedir); + entry->Set(env->shell_string(), shell); + + args.GetReturnValue().Set(entry); +} + + void Initialize(Local<Object> target, Local<Value> unused, Local<Context> context) { @@ -304,6 +372,7 @@ void Initialize(Local<Object> target, env->SetMethod(target, "getOSRelease", GetOSRelease); env->SetMethod(target, "getInterfaceAddresses", GetInterfaceAddresses); env->SetMethod(target, "getHomeDirectory", GetHomeDirectory); + env->SetMethod(target, "getUserInfo", GetUserInfo); target->Set(FIXED_ONE_BYTE_STRING(env->isolate(), "isBigEndian"), Boolean::New(env->isolate(), IsBigEndian())); } |