2012-02-10 16:54:32 +04:00
#
2013-10-28 00:59:46 +04:00
# Copyright (C) 2012-2013 Red Hat, Inc.
2012-02-10 16:54:32 +04:00
# Copyright (C) 2012 Cole Robinson <crobinso@redhat.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301 USA.
#
2013-02-16 23:03:30 +04:00
from gi . repository import GLib
2013-04-16 21:38:19 +04:00
from gi . repository import Gio
2012-05-14 17:24:56 +04:00
2012-02-10 16:54:32 +04:00
import logging
import os
2012-02-10 23:07:51 +04:00
import time
2012-02-10 16:54:32 +04:00
import libvirt
2013-04-13 22:34:52 +04:00
2012-02-10 16:54:32 +04:00
def do_we_have_session ( ) :
pid = os . getpid ( )
try :
2013-04-16 21:38:19 +04:00
bus = Gio . bus_get_sync ( Gio . BusType . SYSTEM , None )
2012-02-10 16:54:32 +04:00
except :
logging . exception ( " Error getting system bus handle " )
2012-07-07 18:39:06 +04:00
return
# Check systemd
try :
2013-04-16 21:38:19 +04:00
manager = Gio . DBusProxy . new_sync ( bus , 0 , None ,
" org.freedesktop.login1 " ,
" /org/freedesktop/login1 " ,
" org.freedesktop.login1.Manager " , None )
ret = manager . GetSessionByPID ( " (u) " , pid )
2012-07-07 18:39:06 +04:00
logging . debug ( " Found login1 session= %s " , ret )
return True
except :
logging . exception ( " Couldn ' t connect to logind " )
2012-02-10 16:54:32 +04:00
2012-07-07 18:39:06 +04:00
return False
2012-02-10 16:54:32 +04:00
2015-04-11 19:08:57 +03:00
def creds_dialog ( conn , creds ) :
2012-02-10 16:54:32 +04:00
"""
Thread safe wrapper for libvirt openAuth user / pass callback
"""
2012-02-10 23:07:51 +04:00
retipc = [ ]
2015-04-11 19:08:57 +03:00
def wrapper ( fn , conn , creds ) :
2012-02-10 23:07:51 +04:00
try :
2015-04-11 19:08:57 +03:00
ret = fn ( conn , creds )
2012-02-10 23:07:51 +04:00
except :
logging . exception ( " Error from creds dialog " )
ret = - 1
retipc . append ( ret )
2015-04-11 19:08:57 +03:00
GLib . idle_add ( wrapper , _creds_dialog_main , conn , creds )
2012-02-10 16:54:32 +04:00
2012-02-10 23:07:51 +04:00
while not retipc :
time . sleep ( .1 )
return retipc [ 0 ]
2012-02-10 16:54:32 +04:00
2015-04-11 19:08:57 +03:00
def _creds_dialog_main ( conn , creds ) :
2012-02-10 16:54:32 +04:00
"""
Libvirt openAuth callback for username / password credentials
"""
2014-04-03 02:39:43 +04:00
from gi . repository import Gtk
2012-02-10 16:54:32 +04:00
2012-05-14 17:24:56 +04:00
dialog = Gtk . Dialog ( " Authentication required " , None , 0 ,
( Gtk . STOCK_CANCEL , Gtk . ResponseType . CANCEL ,
Gtk . STOCK_OK , Gtk . ResponseType . OK ) )
2012-02-10 16:54:32 +04:00
label = [ ]
entry = [ ]
2012-05-14 17:24:56 +04:00
box = Gtk . Table ( 2 , len ( creds ) )
2012-02-10 16:54:32 +04:00
box . set_border_width ( 6 )
box . set_row_spacings ( 6 )
box . set_col_spacings ( 12 )
def _on_ent_activate ( ent ) :
idx = entry . index ( ent )
if idx < len ( entry ) - 1 :
entry [ idx + 1 ] . grab_focus ( )
else :
2012-05-14 17:24:56 +04:00
dialog . response ( Gtk . ResponseType . OK )
2012-02-10 16:54:32 +04:00
row = 0
for cred in creds :
if ( cred [ 0 ] == libvirt . VIR_CRED_AUTHNAME or
cred [ 0 ] == libvirt . VIR_CRED_PASSPHRASE ) :
prompt = cred [ 1 ]
if not prompt . endswith ( " : " ) :
prompt + = " : "
2012-05-14 17:24:56 +04:00
text_label = Gtk . Label ( label = prompt )
2012-02-10 16:54:32 +04:00
text_label . set_alignment ( 0.0 , 0.5 )
label . append ( text_label )
else :
return - 1
2012-05-14 17:24:56 +04:00
ent = Gtk . Entry ( )
2012-02-10 16:54:32 +04:00
if cred [ 0 ] == libvirt . VIR_CRED_PASSPHRASE :
ent . set_visibility ( False )
2015-04-11 19:08:57 +03:00
elif conn . get_uri_username ( ) :
ent . set_text ( conn . get_uri_username ( ) )
2012-02-10 16:54:32 +04:00
ent . connect ( " activate " , _on_ent_activate )
entry . append ( ent )
2015-04-11 19:08:57 +03:00
box . attach ( label [ row ] , 0 , 1 , row , row + 1 ,
Gtk . AttachOptions . FILL , 0 , 0 , 0 )
box . attach ( entry [ row ] , 1 , 2 , row , row + 1 ,
Gtk . AttachOptions . FILL , 0 , 0 , 0 )
2012-02-10 16:54:32 +04:00
row = row + 1
vbox = dialog . get_child ( )
vbox . add ( box )
dialog . show_all ( )
res = dialog . run ( )
dialog . hide ( )
2012-05-14 17:24:56 +04:00
if res == Gtk . ResponseType . OK :
2012-02-10 16:54:32 +04:00
row = 0
for cred in creds :
cred [ 4 ] = entry [ row ] . get_text ( )
row = row + 1
2012-02-10 23:07:51 +04:00
ret = 0
2012-02-10 16:54:32 +04:00
else :
2012-02-10 23:07:51 +04:00
ret = - 1
dialog . destroy ( )
return ret
2012-02-10 16:54:32 +04:00
def acquire_tgt ( ) :
"""
Try to get kerberos ticket if openAuth seems to require it
"""
logging . debug ( " In acquire tgt. " )
try :
2013-04-16 21:38:19 +04:00
bus = Gio . bus_get_sync ( Gio . BusType . SESSION , None )
ka = Gio . DBusProxy . new_sync ( bus , 0 , None ,
" org.gnome.KrbAuthDialog " ,
" /org/gnome/KrbAuthDialog " ,
" org.freedesktop.KrbAuthDialog " , None )
ret = ka . acquireTgt ( " (s) " , " " )
2012-02-10 16:54:32 +04:00
except Exception , e :
logging . info ( " Cannot acquire tgt " + str ( e ) )
ret = False
return ret