This is an automated email from the git hooks/post-receive script. x2go pushed a commit to branch release/4.0.1.x in repository x2goserver. commit cf4ce1f6209260867a17c5fde0e8e14cd318ffb4 Author: Mike Gabriel <mike.gabriel@das-netzwerkteam.de> Date: Mon Nov 17 09:43:36 2014 +0100 Fix cross-user X2Go Desktop Sharing after being broken by implementing clipboard mode feature (and probably other code changes). --- debian/changelog | 2 ++ x2goserver/bin/x2golistdesktops | 17 +++++++++----- x2goserver/bin/x2gostartagent | 40 +++++++++++++++++++++++++++------ x2goserver/lib/x2gosqlitewrapper.pl | 2 +- x2goserver/lib/x2goutils.pm | 2 +- x2goserver/sbin/x2gocleansessions | 11 ++++++++- x2goserver/sbin/x2golistsessions_root | 22 ++++++++++++++++-- 7 files changed, 79 insertions(+), 17 deletions(-) diff --git a/debian/changelog b/debian/changelog index 33fb844..e6edd03 100644 --- a/debian/changelog +++ b/debian/changelog @@ -45,6 +45,8 @@ x2goserver (4.0.1.19-0x2go1) UNRELEASED; urgency=medium - Make SSH agent forwarding work after having reconnected via SSH and having resumed a session. (Fixes: #672). Thanks to Robert Siemer for coming up with that idea. + - Fix cross-user X2Go Desktop Sharing after being broken by implementing + clipboard mode feature (and probably other code changes). * debian/control: + Add D (x2goserver): libfile-which-perl. * debian/x2goserver.docs: diff --git a/x2goserver/bin/x2golistdesktops b/x2goserver/bin/x2golistdesktops index 7c7afa2..78ea8c3 100755 --- a/x2goserver/bin/x2golistdesktops +++ b/x2goserver/bin/x2golistdesktops @@ -85,20 +85,27 @@ for(my $i=0;$i<@outp;$i++) } } -my $outp=`ls -1 /tmp/ | grep x2godesktopsharing_`; +my $outp=`ls -1 /tmp/ | grep x2godesktopsharing_\@*\@:*`; @outp=split("\n","$outp"); for(my $i=0;$i<@outp;$i++) { my @ln=split("\@",@outp[$i]); - if ( @ln[1] ne $uname ) - { - push (@displays, "@ln[1]\@@ln[2]\n"); + if (( -r "/tmp/@outp[$i]" ) and ( -w "/tmp/@outp[$i]" )) { + my @ln=split("\@",@outp[$i]); + if ( @ln[1] ne $uname ) + { + push (@displays, "@ln[1]\@@ln[2]"); + } } } if (@displays) { - print "@displays\n"; + for(my $i=0;$i<@displays;$i++) { + if ( @displays[$i] ) { + print "@displays[$i]\n"; + } + } } # closing syslog closelog; diff --git a/x2goserver/bin/x2gostartagent b/x2goserver/bin/x2gostartagent index 5d9ffb1..dde18cf 100755 --- a/x2goserver/bin/x2gostartagent +++ b/x2goserver/bin/x2gostartagent @@ -60,7 +60,18 @@ fi REMOTE=localhost -X2GO_CLIENT=`echo $SSH_CLIENT | awk '{print $1}'` +# shadow sessions (via x2godesktopsharing) set the X2GO_CLIENT var in the process environment +# so either it is already set or we obtain it from SSH_CLIENT/SSH_CONNECTION +if [ -z "$X2GO_CLIENT" ] && [ -n "$SSH_CLIENT" ]; then + X2GO_CLIENT=`echo $SSH_CLIENT | awk '{print $1}'` +elif [ -z "$X2GO_CLIENT" ] && [ -n "$SSH_CONNECTION" ]; then + X2GO_CLIENT=`echo $SSH_CONNECTION | awk '{print $1}'` +fi +if [ -z "$X2GO_CLIENT" ]; then + echo "The \$X2GO_CLIENT environment variable is not set (due to neither \$SSH_CLIENT nor \$SSH_CONNECTION variable being set). Aborting session startup." + exit -3 +fi + $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "client announced itself as ,,$X2GO_CLIENT''" X2GO_GEOMETRY="$1"; shift @@ -72,10 +83,11 @@ X2GO_KBD_TYPE="$1"; shift X2GO_SET_KBD="$1"; shift X2GO_STYPE="$1"; shift X2GO_CMD="$1"; shift -X2GO_CLIPBOARD="$1"; shift X2GO_RESIZE=1 X2GO_FULLSCREEN=0 +X2GO_CLIPBOARD="" + XAUTHORITY=${XAUTHORITY:-"$HOME/.Xauthority"} @@ -85,16 +97,16 @@ if [ "$X2GO_STYPE" == "S" ]; then SHADOW_USER=`echo $X2GO_CMD |awk '{split($0,a,"XSHAD"); print a[2]}'` SHADOW_DESKTOP=`echo $X2GO_CMD |awk '{split($0,a,"XSHAD"); print a[3]}'` - test -z $1 && { + if [ -z "$1" ]; then # can this line be removed? #echo "suser $SHADOW_USER user $USER " >> /tmp/uagent $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "shadow session requested: mode $SHADOW_MODE, user: $SHADOW_USER, desktop: $SHADOW_DESKTOP" - } || { + else SHADREQ_USER="$1"; shift $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "preparing shadow session request for user $SHADREQ_USER, agent starts for user ${USER}" - } + fi if [ "$SHADOW_USER" != "$USER" ]; then @@ -104,8 +116,12 @@ if [ "$X2GO_STYPE" == "S" ]; then $X2GO_LIB_PATH/x2gosyslog "$0" "debug" "command result is: $OUTPUT" if [ "${OUTPUT:0:4}" == "DENY" ]; then echo "ACCESS DENIED" 1>&2 + DENIAL_REASON="${OUTPUT:5}" + if [ -z "$DENIAL_REASON" ]; then + DENIAL_REASON="the user ,,$SHADOW_USER'' does not seem to have desktop sharing activated" + fi $X2GO_LIB_PATH/x2gosyslog "$0" "err" "ERROR: user $SHADOW_USER denied desktop sharing session" - $X2GO_LIB_PATH/x2gosyslog "$0" "err" "ERROR: reason: for desktop sharing denial ${OUTPUT:5}" + $X2GO_LIB_PATH/x2gosyslog "$0" "err" "ERROR: reason: for desktop sharing denial ${DENIAL_REASON}" exit -1 fi X2GO_COOKIE=`echo $OUTPUT | awk '{print $2}'` @@ -123,6 +139,8 @@ if [ "$X2GO_STYPE" == "S" ]; then echo $OUTPUT | awk '{print $6}' echo $OUTPUT | awk '{print $7}' exit 0 + else + X2GO_CLIPBOARD="$1"; shift fi fi @@ -257,7 +275,15 @@ STATE_FILE="${X2GO_ROOT}/C-${SESSION_NAME}/state" # do not use $TMP or $TEMP here, the session.log file location has to be accessible by root SESSION_LOG="${SESSION_DIR}/session.log" mkdir -p "${SESSION_DIR}" -chmod -f 0700 "${SESSION_DIR}" +if [ "x$X2GO_STYPE" = "xS" ]; then + chmod -f 0710 "${SESSION_DIR}" + if groups "$USER" | grep x2godesktopsharing 1>/dev/null 2>/dev/null; then + $X2GO_LIB_PATH/x2gosyslog "$0" "info" "user ,,$USER'' grants access to ${SESSION_DIR} for group ,,x2godesktopsharing''" + chown :x2godesktopsharing "${SESSION_DIR}" + fi +else + chmod -f 0700 "${SESSION_DIR}" +fi touch "${SESSION_LOG}" chmod -f 0600 "${SESSION_LOG}" diff --git a/x2goserver/lib/x2gosqlitewrapper.pl b/x2goserver/lib/x2gosqlitewrapper.pl index 7352a28..deb0925 100755 --- a/x2goserver/lib/x2gosqlitewrapper.pl +++ b/x2goserver/lib/x2gosqlitewrapper.pl @@ -522,7 +522,7 @@ sub check_user # session id looks like someuser-51-1304005895_stDgnome-session_dp24 # during DB insertsession it only looks like someuser-51-1304005895 my $user = "$sid"; - $user =~ s/$realuser-[0-9]{2,}-[0-9]{10,}.*/$realuser/; + $user =~ s/($realuser-[0-9]{2,}-[0-9]{10,}_st(D|R).*|.*-[0-9]{2,}-[0-9]{10,}_stS(0|1)XSHAD$realuser.*)/$realuser/; $user eq $realuser or die "$realuser is not authorized"; } diff --git a/x2goserver/lib/x2goutils.pm b/x2goserver/lib/x2goutils.pm index 13957c0..a7eb265 100644 --- a/x2goserver/lib/x2goutils.pm +++ b/x2goserver/lib/x2goutils.pm @@ -49,7 +49,7 @@ sub sanitizer { $string =~ s/[^a-zA-Z0-9\_\-\$\.\@]//g; if ($string =~ /^([a-zA-Z0-9\_\-\$\.\@]*)$/) { $string = $1; - if ($string =~ /^([a-zA-Z\_][a-zA-Z0-9\_\-\.\@]{0,47}[\$]?)\-([\d]{2,4})\-([\d]{9,12})\_[a-zA-Z0-9\_\-]*\_dp[\d]{1,2}$/) { + if ($string =~ /^([a-zA-Z\_][a-zA-Z0-9\_\-\.\@]{0,31}[\$]?)\-([\d]{2,4})\-([\d]{9,12})\_[a-zA-Z0-9\_\-\.]*\_dp[\d]{1,2}$/) { if ((length($1) > 0) and (length($1) < 48)){ return $string; } else {return 0;} diff --git a/x2goserver/sbin/x2gocleansessions b/x2goserver/sbin/x2gocleansessions index 8ce3a68..db38e1e 100755 --- a/x2goserver/sbin/x2gocleansessions +++ b/x2goserver/sbin/x2gocleansessions @@ -88,7 +88,16 @@ sub is_running sub get_agent_state { my $sess=@_[0]; - my $user=@_[1]; + my $user; + + if ( $sess =~ m/.*-[0-9]{2,}-[0-9]{10,}_stS(0|1)XSHAD.*XSHADPP.*/ ) { + my $shadow_user = $sess; + $shadow_user =~ s/.*XSHAD(.*)XSHADPP.*/$1/; + $user = $shadow_user; + } else { + $user=@_[1]; + } + my $state; my $stateFile = "/tmp/.x2go-".$user."/C-".$sess."/state"; if (! -e $stateFile ) diff --git a/x2goserver/sbin/x2golistsessions_root b/x2goserver/sbin/x2golistsessions_root index 8f9c06e..3686af3 100755 --- a/x2goserver/sbin/x2golistsessions_root +++ b/x2goserver/sbin/x2golistsessions_root @@ -44,7 +44,16 @@ sub is_suspended sub has_agent_state_file { my $sess=@_[0]; - my $user=@_[1]; + my $user; + + if ( $sess =~ m/.*-[0-9]{2,}-[0-9]{10,}_stS(0|1)XSHAD.*XSHADPP.*/ ) { + my $shadow_user = $sess; + $shadow_user =~ s/.*XSHAD(.*)XSHADPP.*/$1/; + $user = $shadow_user; + } else { + $user=@_[1]; + } + my $stateFile; if ( -d "/tmp-inst/${user}/.x2go-${user}" ) { $stateFile="/tmp-inst/${user}/.x2go-".$user."/C-".$sess."/state"; @@ -61,7 +70,16 @@ sub has_agent_state_file sub get_agent_state { my $sess=@_[0]; - my $user=@_[1]; + my $user; + + if ( $sess =~ m/.*-[0-9]{2,}-[0-9]{10,}_stS(0|1)XSHAD.*XSHADPP.*/ ) { + my $shadow_user = $sess; + $shadow_user =~ s/.*XSHAD(.*)XSHADPP.*/$1/; + $user = $shadow_user; + } else { + $user=@_[1]; + } + my $state; my $stateFile = "/tmp/.x2go-".$user."/C-".$sess."/state"; if (! -e $stateFile ) -- Alioth's /srv/git/_hooks_/post-receive-email on /srv/git/code.x2go.org/x2goserver.git