[X2Go-Commits] x2gobroker.git - build-main (branch) updated: 0.0.0.5-11-g51cb597
X2Go dev team
git-admin at x2go.org
Sun May 19 13:04:53 CEST 2013
The branch, build-main has been updated
via 51cb5974db42ea58b28b4b520337fa00a0a80eab (commit)
from 6c69ef04e6fda090552dfb0fd09152b2a8aee96a (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
-----------------------------------------------------------------------
Summary of changes:
etc/broker/x2gobroker-sessionprofiles.conf | 6 ++
etc/x2gobroker.conf | 43 ++++++++++++-
lib/x2gobroker-agent.pl | 86 +++++++++++++++++--------
x2gobroker/agent.py | 93 ++++++++++++++++++++++++++-
x2gobroker/brokers/base_broker.py | 95 +++++++++++++++++++++++++---
x2gobroker/brokers/inifile_broker.py | 13 +++-
x2gobroker/defaults.py | 2 +
x2gobroker/web/plain.py | 4 +-
8 files changed, 299 insertions(+), 43 deletions(-)
The diff of changes is:
diff --git a/etc/broker/x2gobroker-sessionprofiles.conf b/etc/broker/x2gobroker-sessionprofiles.conf
index f3b4e8b..af3dfc2 100644
--- a/etc/broker/x2gobroker-sessionprofiles.conf
+++ b/etc/broker/x2gobroker-sessionprofiles.conf
@@ -92,6 +92,7 @@ acl-groups-deny=ALL
acl-clients-deny=ALL
acl-clients-allow=10.1.0.0/16
acl-any-order=deny-allow
+broker-session-autostart=true
[pool-A-server-B]
user=
@@ -103,6 +104,7 @@ acl-groups-deny=ALL
acl-clients-deny=ALL
acl-clients-allow=10.2.0.0/16
acl-any-order=deny-allow
+broker-session-autostart=true
[pool-A-server-C]
user=
@@ -112,6 +114,7 @@ command=KDE
acl-groups-allow=kde-users,admins
acl-groups-deny=ALL
acl-any-order=deny-allow
+broker-session-autostart=true
##
## EXAMPLE: pool-B (e.g. webserver in the DMZ or on the internet)
@@ -170,3 +173,6 @@ acl-users-deny=ALL
acl-groups-allow=students,admins
acl-groups-deny=ALL
acl-any-order=deny-allow
+# this server pool has a special broker setup for SSH authorized_keys
+broker-session-autostart=true
+broker-authorized-keys=/var/lib/x2gobroker/ssh/%u/authorized_keys
diff --git a/etc/x2gobroker.conf b/etc/x2gobroker.conf
index a1fc81a..70d0906 100644
--- a/etc/x2gobroker.conf
+++ b/etc/x2gobroker.conf
@@ -90,7 +90,48 @@
# detection can be quite CPU intensive on the X2Go Broker server.
#ignore-primary-group-memberships = true
-# default X2Go Broker Agent query mode:
+# X2Go auto-start sessions via X2Go Session Broker
+#
+# Once authenticated against the session
+# broker, the user becomes a trusted user. That is, the X2Go session login can be
+# automatized by a very temporary SSH pub/priv key pair. Prior to the session
+# login the key is generated, after successful session login, the key is dropped
+# immediately.
+#
+# This option can be overridden by the session profile parameter
+# broker-session-autostart=<file-location>
+
+#default-session-autostart=false
+
+# X2Go's authorized_keys file for broker mediated auto-starting sessions
+#
+# For the X2Go auto-login via X2Go Session Broker feature to work thoroughly,
+# the X2Go Session Broker has to place the temporary public SSH key into the
+# user's home directory. It is not recommended to use SSH's default
+# authorized_keys file for this but a separate and X2Go-specific authorized_keys
+# file ($HOME/.x2go/authorized_keys).
+#
+# Of course, the SSH daemon has to be made aware of this. This can be configured
+# in /etc/ssh/sshd_config like this:
+#
+# --- /etc/ssh/sshd_config.no-x2go 2013-03-01 09:57:04.000000000 +0100
+# +++ /etc/ssh/sshd_config 2013-03-01 09:56:57.000000000 +0100
+# @@ -28,7 +28,7 @@
+#
+# RSAAuthentication yes
+# PubkeyAuthentication yes
+# -AuthorizedKeysFile %h/.ssh/authorized_keys
+# +AuthorizedKeysFile %h/.ssh/authorized_keys %h/.x2go/authorized_keys
+#
+# # Don't read the user's ~/.rhosts and ~/.shosts files
+# IgnoreRhosts yes
+#
+# This option can be overridden by the session profile parameter
+# broker-authorized-keys=<file-location>
+
+#default-authorized-keys=%h/.x2go/authorized_keys
+
+# X2Go Broker Agent query mode
#
# The X2Go Broker Agent is needed for multi-server sites configured for
# load balancing. Multi-server sites require a setup that uses the
diff --git a/lib/x2gobroker-agent.pl b/lib/x2gobroker-agent.pl
index 3155837..1b7c06a 100755
--- a/lib/x2gobroker-agent.pl
+++ b/lib/x2gobroker-agent.pl
@@ -22,6 +22,8 @@
use strict;
+use File::Basename;
+
sub InitX2GoUser
{
my ($user, $uidNumber, $gidNumber, $home)=@_;
@@ -49,32 +51,51 @@ sub InitX2GoUser
}
}
-sub CreateKey
+sub AddAuthKey
+{
+ my ($uid, $uidNumber, $gidNumber, $home, $pubkey, $authkeyfile)=@_;
+
+ # rewrite %%, %u and %h in authkeyfile string
+ $authkeyfile =~ s/%u/$uid/;
+ $authkeyfile =~ s/%h/$home/;
+ $authkeyfile =~ s/%%/%/;
+
+ my $authkeydir = dirname($authkeyfile)
+
+ # make sure dir and file for authorized_keys do exist
+ if ( ! -d $authkeydir )
+ {
+ system ("su - $uid -c mkdir -p $authkeydir");
+ }
+ if( ! -e $authkeyfile )
+ {
+ system ("su - $uid -c touch $authkeyfile");
+ }
+ if ( ! system("su - $uid -c cat $authkeyfile | grep $pubkey 1>/dev/null") )
+ {
+ system("su - $uid -c \"echo $pubkey >> $authkeyfile\"");
+ }
+}
+
+sub DelAuthKey
{
- ###
- ### FIXME: This bit of code looks dangerous... My
- ### authorized_keys file is starting to get
- ### scared... (Mike)
- ###
- #my ($uidNumber, $gidNumber, $home)=@_;
- #if ( ! -d "$home/.ssh" )
- #{
- # mkdir ("$home/.ssh", 0700);
- # chown ($uidNumber, $gidNumber, "$home/.ssh");
- #}
- #if( -e "$home/.ssh/authorized_keys" )
- #{
- # unlink("$home/.ssh/authorized_keys");
- #}
- #open my $save_out, ">&STDOUT";
- #close (STDOUT);
- #system "/usr/bin/ssh-keygen", "-t", "dsa", "-N","","-f","$home/.ssh/authorized_keys";
- #open STDOUT, ">&", $save_out;
- #open (F,"<$home/.ssh/authorized_keys");
- #print <F>;
- #close (F);
- #unlink("$home/.ssh/authorized_keys");
- #rename("$home/.ssh/authorized_keys.pub", "$home/.ssh/authorized_keys");
+ my ($uid, $uidNumber, $gidNumber, $home, $pubkey, $authkeyfile)=@_;
+
+ # rewrite %%, %u and %h in authkeyfile string
+ $authkeyfile =~ s/%u/$uid/;
+ $authkeyfile =~ s/%h/$home/;
+ $authkeyfile =~ s/%%/%/;
+
+ my $authkeydir = dirname($authkeyfile)
+
+ if( -e $authkeyfile )
+ {
+ if ( ! system("su - $uid -c cat $authkeyfile | grep $pubkey 1>/dev/null") )
+ {
+ system("su - $uid -c \"cat $authkeyfile.tmp | grep -v $pubkey > $authkeyfile.tmp\"");
+ system("su - $uid -c mv $authkeyfile.tmp $authkeyfile");
+ }
+ }
}
$< = $>;
@@ -150,11 +171,22 @@ if($mode eq 'getservers')
exec ("/bin/su - $uid -c \"x2gogetservers\"");
}
-if($mode eq 'key')
+if($mode eq 'addauthkey')
+{
+ my $pubkey = shift or die;
+ my $authkeyfile = shift or die;
+ InitX2GoUser($uid, $uidNumber, $gidNumber, $home);
+ print "OK\n";
+ AddAuthKey($uid, $uidNumber, $gidNumber, $home, $pubkey, $authkeyfile);
+}
+
+if($mode eq 'delauthkey')
{
+ my $pubkey = shift or die;
+ my $authkeyfile = shift or die;
InitX2GoUser($uid, $uidNumber, $gidNumber, $home);
print "OK\n";
- createKey($uidNumber, $gidNumber, $home);
+ DelAuthKey($uidNumber, $gidNumber, $home);
}
if($mode eq 'suspend')
diff --git a/x2gobroker/agent.py b/x2gobroker/agent.py
index 13dc2af..0c5873a 100644
--- a/x2gobroker/agent.py
+++ b/x2gobroker/agent.py
@@ -21,6 +21,7 @@
import subprocess
import paramiko
+import cStringIO
import x2gobroker._paramiko
x2gobroker._paramiko.monkey_patch_paramiko()
@@ -30,7 +31,7 @@ import x2gobroker.defaults
from x2gobroker.loggers import logger_error
-def call_local_broker_agent(username, mode):
+def call_local_broker_agent(username, mode, cmdline_args=[]):
"""\
Launch X2Go Broker Agent locally and process its output.
@@ -46,6 +47,9 @@ def call_local_broker_agent(username, mode):
'{mode}'.format(mode=mode),
]
+ for cmdline_arg in cmdline_args:
+ cmd_line.append('"{arg}"'.format(arg=cmdline_arg))
+
agent_process = subprocess.Popen(cmd_line,
stdin=None,
stdout=subprocess.PIPE,
@@ -57,7 +61,7 @@ def call_local_broker_agent(username, mode):
if result[0].startswith('OK'):
return [ r for r in result[1:] if r ]
-def call_remote_broker_agent(username, mode, remote_agent):
+def call_remote_broker_agent(username, mode, cmdline_args=[], remote_agent=None):
"""\
Launch remote X2Go Broker Agent via SSH and process its output.
@@ -69,12 +73,18 @@ def call_remote_broker_agent(username, mode, remote_agent):
@type remote_agent: C{dict}
"""
+ if remote_agent is None:
+ logger_error.error('With the SSH agent-query-mode remote agent (hostname, port) has to be specified!')
+
cmd_line = [
'{x2gobroker_agent_binary}'.format(x2gobroker_agent_binary=x2gobroker.defaults.X2GOBROKER_AGENT_CMD),
'{username}'.format(username=username),
'{mode}'.format(mode=mode),
]
+ for cmdline_arg in cmdline_args:
+ cmd_line.append('"{arg}"'.format(arg=cmdline_arg))
+
remote_username = x2gobroker.defaults.X2GOBROKER_AGENT_USER
remote_hostname = remote_agent[u'hostname']
remote_port = int(remote_agent[u'port'])
@@ -147,6 +157,48 @@ def find_busy_servers(username, query_mode='LOCAL', remote_agent=None):
return server_usage
+def add_authorized_key(username, pubkey_hash, authorized_keys_file='%h/.x2go/authorized_keys', query_mode='LOCAL', remote_agent=None):
+ """\
+ Add a public key hash to the user's authorized_keys file.
+
+ @param username: run the query on behalf of this username
+ @type username: C{unicode}
+ @param pubkey_hash: the public key hash as found in SSH authorized_keys files
+ @type pubkey_hash: C{unicode}
+ @param authorized_keys_file: the full path to the remote X2Go server's authorized_keys file
+ @type authorized_keys_file: C{unicode}
+ @param query_mode: query mode used when calling X2Go Broker Agent (C{LOCAL} or C{SSH})
+ @type query_mode: C{unicode}
+ @param remote_agent: information about the remote agent that is to be called.
+ @type remote_agent: C{dict}
+
+ """
+ if query_mode.upper() == u'LOCAL':
+ return call_local_broker_agent(username, mode='addauthkey', cmdline_args=[pubkey_hash, authorized_keys_file, ])
+ else:
+ return call_local_broker_agent(username, mode='addauthkey', cmdline_args=[pubkey_hash, authorized_keys_file, ], remote_agent=remote_agent)
+
+def delete_authorized_key(username, pubkey_hash, authorized_keys_file='%h/.x2go/authorized_keys', query_mode='LOCAL', remote_agent=None):
+ """\
+ Remove a public key hash from the user's authorized_keys file.
+
+ @param username: run the query on behalf of this username
+ @type username: C{unicode}
+ @param pubkey_hash: the public key hash as found in SSH authorized_keys files
+ @type pubkey_hash: C{unicode}
+ @param authorized_keys_file: the full path to the remote X2Go server's authorized_keys file
+ @type authorized_keys_file: C{unicode}
+ @param query_mode: query mode used when calling X2Go Broker Agent (C{LOCAL} or C{SSH})
+ @type query_mode: C{unicode}
+ @param remote_agent: information about the remote agent that is to be called.
+ @type remote_agent: C{dict}
+
+ """
+ if query_mode.upper() == u'LOCAL':
+ return call_local_broker_agent(username, mode='delauthkey', cmdline_args=[pubkey_hash, authorized_keys_file, ])
+ else:
+ return call_local_broker_agent(username, mode='delauthkey', cmdline_args=[pubkey_hash, authorized_keys_file, ], remote_agent=remote_agent)
+
def get_servers(username, query_mode='LOCAL', remote_agent=None):
"""\
Query X2Go Broker Agent for the list of currently used servers.
@@ -166,3 +218,40 @@ def get_servers(username, query_mode='LOCAL', remote_agent=None):
else:
return call_local_broker_agent(username, mode='getservers', remote_agent=remote_agent)
+def genkeypair(username, client_address, key_type='RSA'):
+ """\
+ Generate an SSH pub/priv key pair without writing the private key to file.
+
+ @param username: the key is for this user
+ @type username: C{unicode}
+ @param client_address: the key is only valid for this client
+ @type client_address: C{unicode}
+ @param key_type: either of: RSA, DSA
+ @type key_type: C{unicode}
+
+ """
+ key = None
+ pubkey = None
+ privkey = None
+
+ # generate key pair
+ if unicode(key_type) == u'RSA':
+ key = paramiko.RSAKey.generate(2048)
+ elif unicode(key_type) == u'DSA':
+ key = paramiko.DSSKey.generate(1024)
+
+ if key:
+
+ # assemble the public key
+ if key_type == "RSA":
+ pubkey_type = 'ssh-rsa'
+ elif key_type == "DSA":
+ pubkey_type = 'ssh-dss'
+ pubkey = "from={hostname},no-X11-forwarding,no-pty,no-user-rc {pubkey_type} {pubkey} {username}@{hostname}".format(pubkey=key.get_base64(), pubkey_type=pubkey_type, username=username, hostname=client_address)
+
+ # assemble the private key
+ privkey_obj = cStringIO.StringIO()
+ key.write_private_key(privkey_obj)
+ privkey = privkey_obj.getvalue()
+
+ return (pubkey, privkey)
diff --git a/x2gobroker/brokers/base_broker.py b/x2gobroker/brokers/base_broker.py
index ad3e3e7..c718dc4 100644
--- a/x2gobroker/brokers/base_broker.py
+++ b/x2gobroker/brokers/base_broker.py
@@ -220,7 +220,20 @@ class X2GoBroker(object):
"""\
Get the session profile for profile ID <profile_id>.
- @param profile_id: the ID of a profile, in other words the section name in the configuration file
+ @param profile_id: the ID of a profile
+ @type profile_id: C{unicode}
+
+ @return: a dictionary representing the session profile for ID <profile_id>
+ @rtype: C{dict}
+
+ """
+ return {}
+
+ def get_profile_broker(self, profile_id):
+ """\
+ Get broker-specific session profile options from the session profile with profile ID <profile_id>.
+
+ @param profile_id: the ID of a profile
@type profile_id: C{unicode}
@return: a dictionary representing the session profile for ID <profile_id>
@@ -233,7 +246,7 @@ class X2GoBroker(object):
"""\
Get the ACLs for session profile with profile ID <profile_id>.
- @param profile_id: the ID of a profile, in other words the section name in the configuration file
+ @param profile_id: the ID of a profile
@type profile_id: C{unicode}
@return: a dictionary representing the ACLs for session profile with ID <profile_id>
@@ -419,14 +432,15 @@ class X2GoBroker(object):
"""
_default_auth_mech = "pam"
_auth_mech = ""
- if self.config.has_value('global', 'default-auth-mech'):
- _default_auth_mech = self.config.get_value('global', 'default-auth-mech').lower()
- logger_broker.debug('base_broker.X2GoBroker.get_authentication_mechanism(): found default-auth-mech in global config section: {value}'.format(value=_default_auth_mech))
if self.config.has_value(self.backend_name, 'auth-mech'):
_auth_mech = self.config.get_value(self.backend_name, 'auth-mech').lower()
logger_broker.debug('base_broker.X2GoBroker.get_authentication_mechanism(): found auth-mech in backend config section »{backend}«: {value}. This one has precendence over the default value.'.format(backend=self.backend_name, value=_auth_mech))
+ elif self.config.has_value('global', 'default-auth-mech'):
+ _default_auth_mech = self.config.get_value('global', 'default-auth-mech').lower()
+ logger_broker.debug('base_broker.X2GoBroker.get_authentication_mechanism(): found default-auth-mech in global config section: {value}'.format(value=_default_auth_mech))
+
return unicode(_auth_mech) or unicode(_default_auth_mech)
def get_agent_query_mode(self):
@@ -440,16 +454,64 @@ class X2GoBroker(object):
"""
_default_agent_query_mode = "LOCAL"
_agent_query_mode = ""
- if self.config.has_value('global', 'default-agent-query-mode'):
- _default_agent_query_mode = self.config.get_value('global', 'default-agent-query-mode').lower()
- logger_broker.debug('base_broker.X2GoBroker.get_agent_query_mode(): found default-agent-query-mode in global config section: {value}'.format(value=_default_agent_query_mode))
-
if self.config.has_value(self.backend_name, 'agent-query-mode'):
_agent_query_mode = self.config.get_value(self.backend_name, 'agent-query-mode').lower()
logger_broker.debug('base_broker.X2GoBroker.get_agent_query_mode(): found agent-query-mode in backend config section »{backend}«: {value}. This one has precendence over the default value.'.format(backend=self.backend_name, value=_agent_query_mode))
+ elif self.config.has_value('global', 'default-agent-query-mode'):
+ _default_agent_query_mode = self.config.get_value('global', 'default-agent-query-mode').lower()
+ logger_broker.debug('base_broker.X2GoBroker.get_agent_query_mode(): found default-agent-query-mode in global config section: {value}'.format(value=_default_agent_query_mode))
+
return unicode(_agent_query_mode) or unicode(_default_agent_query_mode)
+ def use_session_autostart(self, profile_id):
+ """\
+ Detect if the given profile is configured to try session
+ auto-starting.
+
+ @return: C{True} to denote that session auto-starting should be attempted
+ @rtype: C{bool}
+
+ """
+ _default_session_autostart = False
+ _session_autostart = ""
+ _profile = self.get_profile_broker(profile_id)
+ if _profile and _profile.has_key(u'broker-session-autostart') and _profile['broker-session-autostart']:
+ _session_autostart = _profile[u'broker-session-autostart']
+ logger_broker.debug('base_broker.X2GoBroker.get_session_autostart(): found broker-session-autostart in session profile with ID {id}: {value}. This one has precendence over the default value.'.format(id=profile_id, value=_session_autostart))
+
+ elif self.config.has_value('global', 'default-session-autostart'):
+ _default_session_autostart = self.config.get_value('global', 'default-session-autostart').lower()
+ logger_broker.debug('base_broker.X2GoBroker.get_session_autostart(): found default-session-autostart in global config section: {value}'.format(value=_default_session_autostart))
+
+ return unicode(_session_autostart) or unicode(_default_session_autostart)
+
+ def get_authorized_keys_file(self, profile_id):
+ """\
+ Get the default location of server-side authorized_keys files used with
+ the X2Go Session Broker.
+
+ The file location can be configured broker-wide. It is also possible to
+ provide a broker-authorized-keys file in session profiles. The latter
+ will override the broker-wide conigured file location.
+
+ @return: authorized_keys location on the remote server
+ @rtype: C{unicode}
+
+ """
+ _default_authorized_keys_file = "%h/.x2go/authorized_keys"
+ _authorized_keys_file = ""
+ _profile = self.get_profile_broker(profile_id)
+ if _profile and _profile.has_key(u'broker-authorized-keys') and _profile['broker-authorized-keys']:
+ _authorized_keys_file = _profile[u'broker-authorized-keys']
+ logger_broker.debug('base_broker.X2GoBroker.get_authorized_keys_file(): found broker-authorized-keys in session profile with ID {id}: {value}. This one has precendence over the default value.'.format(id=profile_id, value=_authorized_keys_file))
+
+ elif self.config.has_value('global', 'default-authorized-keys'):
+ _default_authorized_keys_file = self.config.get_value('global', 'default-authorized-keys').lower()
+ logger_broker.debug('base_broker.X2GoBroker.get_authorized_keys_file(): found default-authorized-keys in global config section: {value}'.format(value=_default_authorized_keys_file))
+
+ return unicode(_authorized_keys_file) or unicode(_default_authorized_keys_file)
+
def get_userdb_service(self):
"""\
Get the name of the backend being used for retrieving user information from the
@@ -767,7 +829,7 @@ class X2GoBroker(object):
'port': profile[u'sshport'],
}
- # do some load balancing if more than one server is configured
+ # find already running sessions and resume the first one found
if len(server_list) >= 2 and username:
session_list = x2gobroker.agent.list_sessions(username=username, query_mode=agent_query_mode, remote_agent=remote_agent)
@@ -782,6 +844,19 @@ class X2GoBroker(object):
'session_info': session_info,
})
+ # session auto-start feature
+ if self.use_session_autostart(profile_id):
+
+ pubkey, privkey = x2gobroker.agent.genkeypair()
+ x2gobroker.agent.add_authorized_key(username=username,
+ pubkey_hash=pubkey,
+ authorized_keys_file=self.get_authorized_keys_file(profile_id),
+ self.getremote_agent,
+ ),
+ selected_session.update({
+ 'authentication_privkey': privkey,
+ })
+
return selected_session
def change_password(self, new='', old=''):
diff --git a/x2gobroker/brokers/inifile_broker.py b/x2gobroker/brokers/inifile_broker.py
index af33bf2..3071a13 100644
--- a/x2gobroker/brokers/inifile_broker.py
+++ b/x2gobroker/brokers/inifile_broker.py
@@ -76,10 +76,22 @@ class X2GoBroker(base.X2GoBroker):
for key in profile.keys():
if key.startswith('acl-'):
del profile[key]
+ if key.startswith('broker-'):
+ del profile[key]
if key == 'default':
del profile[key]
return profile
+ def get_profile_broker(self, profile_id):
+
+ profile = self.session_profiles.get_section(profile_id)
+ for key in profile.keys():
+ if not key.startswith('broker-'):
+ del profile[key]
+ if key.startswith('brokerl-') and (profile[key] == '' or profile[key] == ['']):
+ del profile[key]
+ return profile
+
def get_profile_acls(self, profile_id):
profile = self.session_profiles.get_section(profile_id)
@@ -89,4 +101,3 @@ class X2GoBroker(base.X2GoBroker):
if key.startswith('acl-') and (profile[key] == '' or profile[key] == ['']):
del profile[key]
return profile
-
diff --git a/x2gobroker/defaults.py b/x2gobroker/defaults.py
index cd0dfd7..8274e71 100644
--- a/x2gobroker/defaults.py
+++ b/x2gobroker/defaults.py
@@ -124,6 +124,8 @@ X2GOBROKER_CONFIG_DEFAULTS = {
u'default-user-db': u'libnss',
u'default-group-db': u'libnss',
u'ignore-primary-group-memberships': True,
+ u'default-session-autostart': False,
+ u'default-authorized-keys': u'%h/.x2go/authorized_keys',
u'default-agent-query-mode': u'LOCAL',
},
'zeroconf': {
diff --git a/x2gobroker/web/plain.py b/x2gobroker/web/plain.py
index f7f0f5f..aae3ffe 100644
--- a/x2gobroker/web/plain.py
+++ b/x2gobroker/web/plain.py
@@ -155,8 +155,8 @@ class X2GoBrokerWeb:
if profile_info.has_key('port'):
output += ":{port}".format(port=profile_info['port'])
output += "\n"
- if profile_info.has_key('authentication_key'):
- output += ""
+ if profile_info.has_key('authentication_privkey'):
+ output += profile_info['authentication_privkey']
if profile_info.has_key('session_info'):
output += "SESSION_INFO:"
output += profile_info['session_info'] + "\n"
hooks/post-receive
--
x2gobroker.git (HTTP(S) Session broker for X2Go)
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "x2gobroker.git" (HTTP(S) Session broker for X2Go).
More information about the x2go-commits
mailing list