diff --git a/flake.nix b/flake.nix index cd7c192..8d15180 100644 --- a/flake.nix +++ b/flake.nix @@ -25,10 +25,11 @@ buildInputs = with pkgs.pkgsStatic; [ boost fmt localPackages.zxorm nlohmann_json localPackages.zpp-bits range-v3 ]; nativeBuildInputs = with pkgs; [ cmake pkg-config ]; - postInstall = "cp ${openssh}/bin/ssh-add $out/bin"; + postInstall = "cp ${openssh}/bin/{ssh-add,ssh-keygen} $out/bin"; }; default = hpcstat; - openssh = (pkgs.pkgsStatic.openssh.override { withLdns = false; }).overrideAttrs { doCheck = false; }; + openssh = (pkgs.pkgsStatic.openssh.override { withLdns = false; etcDir = null; }) + .overrideAttrs (prev: { doCheck = false; patches = prev.patches ++ [ ./openssh.patch ];}); }; devShell.x86_64-linux = pkgs.mkShell { diff --git a/openssh.patch b/openssh.patch new file mode 100644 index 0000000..dc1ec76 --- /dev/null +++ b/openssh.patch @@ -0,0 +1,71 @@ +diff --git a/misc.c b/misc.c +index 7a42d4981..9da536b6a 100644 +--- a/misc.c ++++ b/misc.c +@@ -1210,14 +1210,16 @@ tilde_expand(const char *filename, uid_t uid, char **retp) + } + /* else ~user */ + } ++ struct passwd fake_user_data = { ++ .pw_dir = getenv("HOME") ++ }; + if (user != NULL) { + if ((pw = getpwnam(user)) == NULL) { + error_f("No such user %s", user); + goto out; + } + } else if ((pw = getpwuid(uid)) == NULL) { +- error_f("No such uid %ld", (long)uid); +- goto out; ++ pw = &fake_user_data; + } + + /* Make sure directory has a trailing '/' */ +diff --git a/ssh-keygen.c b/ssh-keygen.c +index 97c6d134a..9a89ef07b 100644 +--- a/ssh-keygen.c ++++ b/ssh-keygen.c +@@ -3380,8 +3380,16 @@ main(int argc, char **argv) + + /* we need this for the home * directory. */ + pw = getpwuid(getuid()); +- if (!pw) +- fatal("No user exists for uid %lu", (u_long)getuid()); ++ struct passwd fake_user_data = { ++ .pw_name = "ssh", ++ .pw_passwd = "", ++ .pw_uid = getuid(), ++ .pw_gid = getgid(), ++ .pw_gecos = "", ++ .pw_dir = getenv("HOME"), ++ .pw_shell = getenv("SHELL") ++ }; ++ if (!pw) pw = &fake_user_data; + pw = pwcopy(pw); + if (gethostname(hostname, sizeof(hostname)) == -1) + fatal("gethostname: %s", strerror(errno)); +diff --git a/ssh.c b/ssh.c +index 0019281f4..96c24cf15 100644 +--- a/ssh.c ++++ b/ssh.c +@@ -708,10 +708,16 @@ main(int ac, char **av) + + /* Get user data. */ + pw = getpwuid(getuid()); +- if (!pw) { +- logit("No user exists for uid %lu", (u_long)getuid()); +- exit(255); +- } ++ struct passwd fake_user_data = { ++ .pw_name = "ssh", ++ .pw_passwd = "", ++ .pw_uid = getuid(), ++ .pw_gid = getgid(), ++ .pw_gecos = "", ++ .pw_dir = getenv("HOME"), ++ .pw_shell = getenv("SHELL") ++ }; ++ if (!pw) pw = &fake_user_data; + /* Take a copy of the returned structure. */ + pw = pwcopy(pw); + diff --git a/src/common.cpp b/src/common.cpp index 3e5060a..d0de8fe 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -17,7 +17,7 @@ namespace hpcstat process = std::make_unique (program.string(), bp::args(args), bp::std_out > output, bp::std_err > stderr, bp::std_in < input); input << *stdin; - input.close(); + input.pipe().close(); } else process = std::make_unique (program.string(), bp::args(args), bp::std_out > output, bp::std_err > stderr, bp::std_in < bp::null); diff --git a/src/main.cpp b/src/main.cpp index 2ea3af6..4471181 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -34,7 +34,7 @@ int main(int argc, const char** argv) if (!signature) return 1; data.Signature = *signature; sql::writedb(data); - std::cout << fmt::format("\33[2K\rLogged in as {}.\n", *fp); + std::cout << fmt::format("\33[2K\rLogged in as {}.\n", Keys[*fp].Username); } } else if (args[1] == "logout") diff --git a/src/ssh.cpp b/src/ssh.cpp index 0ad6bf2..49ea70d 100644 --- a/src/ssh.cpp +++ b/src/ssh.cpp @@ -47,7 +47,7 @@ namespace hpcstat::ssh ( std::filesystem::path(*datadir) / "ssh-keygen", { - "-Y", "sign", + "-Y", "sign", "-q", "-f", fmt::format("{}/keys/{}", *datadir, Keys[fingerprint].PubkeyFilename), "-n", "hpcstat@chn.moe", "-" },