X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=src%2FPVE%2FRESTEnvironment.pm;h=b32c452947fdbdbecd6c4a5582718fdf021fa3a2;hp=c2fea2b1f047496d2a83744122fdc9e0b32f1e96;hb=61aca93afb586c57d0135036b763b3aa67968084;hpb=edbb302ec89d0a32b2cbb4f000f910f66d5e8dfc diff --git a/src/PVE/RESTEnvironment.pm b/src/PVE/RESTEnvironment.pm index c2fea2b..b32c452 100644 --- a/src/PVE/RESTEnvironment.pm +++ b/src/PVE/RESTEnvironment.pm @@ -217,6 +217,20 @@ sub get_user { die "user name not set\n"; } +sub set_u2f_challenge { + my ($self, $challenge) = @_; + + $self->{u2f_challenge} = $challenge; +} + +sub get_u2f_challenge { + my ($self, $noerr) = @_; + + return $self->{u2f_challenge} if defined($self->{u2f_challenge}) || $noerr; + + die "no active u2f challenge\n"; +} + sub is_worker { my ($class) = @_; @@ -496,10 +510,12 @@ sub fork_worker { $SIG{CHLD} = $SIG{PIPE} = 'DEFAULT'; $SIG{TTOU} = 'IGNORE'; + my $ppgid; # set session/process group allows to kill the process group if ($sync && -t STDIN) { # some sync'ed workers operate on the tty but setsid sessions lose # the tty, so just create a new pgroup and give it the tty + $ppgid = POSIX::getpgrp() or die "failed to get old pgid: $!\n"; POSIX::setpgid(0, 0) or die "failed to setpgid: $!\n"; POSIX::tcsetpgrp(fileno(STDIN), $$) or die "failed to tcsetpgrp: $!\n"; } else { @@ -592,8 +608,16 @@ sub fork_worker { $exitcode = 0; } POSIX::write($resfh, $msg, length($msg)); - POSIX::close($resfh) if $sync; + + if ($sync) { + POSIX::close($resfh); + if ( -t STDIN) { + POSIX::tcsetpgrp(fileno(STDIN), $ppgid) or + die "failed to tcsetpgrp to parent: $!\n"; + } + } POSIX::_exit($exitcode); + kill(-9, $$); # not really needed, just to be sure } # parent