Ignore:
Timestamp:
Dec 14, 2016, 5:33:02 PM (3 years ago)
Author:
kbut
Message:

Update from upstream

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ubiquity/trunk/fuentes/bin/ubiquity-dm

    r1475 r3069  
    9898class MissingProgramError(EnvironmentError):
    9999    pass
     100
     101
     102class SignalWatcher:
     103    def __init__(self, owner, program,
     104                 interface, object_path,
     105                 signal, expected):
     106        self.owner = owner
     107        self.program = program
     108        self.connection = None
     109        self.interface = interface
     110        self.object_path = object_path
     111        self.signal = signal
     112        self.expected = expected
     113        self.processes = []
     114
     115        from gi.repository import GLib, Gio
     116        owner.drop_privileges()
     117        self.loop = GLib.MainLoop()
     118        Gio.bus_get(Gio.BusType.SESSION, None,
     119                    self.on_got_bus, None)
     120
     121    def signal_timeout(self, user_data):
     122        log("SignalWatcher: signal timed out, continuing with ubiquity-dm")
     123        self.loop.quit()
     124
     125    def on_got_bus(self, source, result, user_data):
     126        try:
     127            from gi.repository import GLib, Gio
     128            self.connection = Gio.bus_get_finish(result)
     129            self.connection.signal_subscribe(None, self.interface,
     130                                             self.signal,
     131                                             self.object_path, None,
     132                                             Gio.DBusSignalFlags.NONE,
     133                                             self.on_signal, None)
     134            self.processes.append(subprocess.Popen(
     135                                  [self.program],
     136                                  stdin=None, stdout=logfile, stderr=logfile))
     137            self.owner.regain_privileges()
     138            GLib.timeout_add_seconds(5, self.signal_timeout, None)
     139        except Exception:
     140            log("failed to ensure xsettings plugin was started:")
     141            log(traceback.format_exc())
     142            self.loop.quit()
     143
     144    def on_signal(self, connection, sender, path, interface, signal, params,
     145                  user_data):
     146        (plugin, ) = params
     147        # log ('on_signal: got %s' % plugin)
     148        if plugin == "xsettings":
     149                self.loop.quit()
     150
     151    def run(self):
     152        self.loop.run()
     153        return self.processes
    100154
    101155
     
    167221    def drop_privileges(self):
    168222        os.setgroups(self.groups)
    169         os.setgid(self.gid)
    170         os.setegid(self.gid)
    171         os.setuid(self.uid)
    172         os.seteuid(self.uid)
     223        os.setresgid(self.gid, self.gid, 0)
     224        os.setresuid(self.uid, self.uid, 0)
     225
     226    def regain_privileges(self):
     227        os.setresuid(0, 0, 0)
     228        os.setresgid(0, 0, 0)
     229        os.setgroups([])
    173230
    174231    def server_preexec(self):
     
    457514
    458515                if osextras.find_on_path(usd):
    459                     extras.append(subprocess.Popen(
    460                         [usd], stdin=null, stdout=logfile, stderr=logfile,
    461                         preexec_fn=self.drop_privileges))
     516                    xsettings = SignalWatcher(self, usd,
     517                                              "org.gnome.SettingsDaemon",
     518                                              "/org/gnome/SettingsDaemon",
     519                                              "PluginActivated",
     520                                              "xsettings")
     521                    # the SignalWatcher will run until the signal is seen...
     522                    extras.extend(xsettings.run())
     523                    # At this point we're sure the usd xsettings plugin is
     524                    # available, we can continue setting up the session.
    462525
    463526                elif osextras.find_on_path(gsd):
Note: See TracChangeset for help on using the changeset viewer.