 a17989470a
			
		
	
	
		a17989470a
		
	
	
	
	
		
			
			(c) 2010 Invisible Things Lab Authors: ========= Joanna Rutkowska <joanna@invisiblethingslab.com> Rafal Wojtczuk <rafal@invisiblethingslab.com>
		
			
				
	
	
		
			86 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/python2.6
 | |
| #
 | |
| # The Qubes OS Project, http://www.qubes-os.org
 | |
| #
 | |
| # Copyright (C) 2010  Joanna Rutkowska <joanna@invisiblethingslab.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.
 | |
| #
 | |
| #
 | |
| 
 | |
| import os
 | |
| import daemon
 | |
| from pyinotify import WatchManager, Notifier, ThreadedNotifier, EventsCodes, ProcessEvent
 | |
| import dbus
 | |
| from qubes.qubes import QubesDaemonPidfile
 | |
| 
 | |
| qubes_clipboard_info_file = "/var/run/qubes/qubes_clipboard.bin.source"
 | |
| 
 | |
| def watch_qubes_clipboard():
 | |
| 
 | |
|     def tray_notify(str, timeout = 3000):
 | |
|         notify_object.Notify("Qubes", 0, "dialog-information", "", str, [], [], timeout, dbus_interface="org.freedesktop.Notifications")
 | |
| 
 | |
|     notify_object = dbus.SessionBus().get_object("org.freedesktop.Notifications", "/org/freedesktop/Notifications")
 | |
|     wm = WatchManager()
 | |
|     mask = EventsCodes.OP_FLAGS.get('IN_CLOSE_WRITE')
 | |
| 
 | |
|     if not os.path.exists (qubes_clipboard_info_file):
 | |
|         file = open (qubes_clipboard_info_file, 'w')
 | |
|         file.close()
 | |
| 
 | |
| 
 | |
|     class ClipboardWatcher(ProcessEvent):
 | |
|         def process_IN_CLOSE_WRITE (self, event):
 | |
|             src_info_file = open (qubes_clipboard_info_file, 'r')
 | |
|             src_vmname = src_info_file.readline().strip('\n')
 | |
|             if src_vmname == "":
 | |
|                 tray_notify ("Qubes Clipboard has been copied to the VM and wiped.\n"\
 | |
|                              "<small>Trigger a paste operation (e.g. Ctrl-v) to insert it into an application.</small>" )
 | |
|             else:
 | |
|                 print src_vmname
 | |
|                 tray_notify ("Qubes Clipboard fetched from VM: <b>'{0}'</b>\n"\
 | |
|                              "<small>Press Ctrl-Shift-v to copy this clipboard onto dest VM's clipboard.</small>".format(src_vmname))
 | |
|             src_info_file.close()
 | |
| 
 | |
| 
 | |
|     notifier = Notifier(wm, ClipboardWatcher())
 | |
|     wdd = wm.add_watch(qubes_clipboard_info_file, mask)
 | |
| 
 | |
|     while True:
 | |
|         notifier.process_events()
 | |
|         if notifier.check_events():
 | |
|             notifier.read_events()
 | |
| 
 | |
| 
 | |
| def main():
 | |
|     
 | |
|     lock = QubesDaemonPidfile ("qclipd")
 | |
|     if lock.pidfile_exists():
 | |
|         if lock.pidfile_is_stale():
 | |
|             lock.remove_pidfile()
 | |
|             print "Removed stale pidfile (has the previous daemon instance crashed?)."
 | |
|         else:
 | |
|             exit (0)
 | |
| 
 | |
|     context = daemon.DaemonContext(
 | |
|         working_directory = "/var/run/qubes",
 | |
|         pidfile = lock)
 | |
| 
 | |
|     with context:
 | |
|         watch_qubes_clipboard()
 | |
| 
 | |
| main()
 |