Changeset 2006

Show
Ignore:
Timestamp:
01/06/05 23:52:53 (20 years ago)
Author:
jalet
Message:

Implemented the dropping of priviledges. Beware, beware...

Location:
pykota/trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • pykota/trunk/bin/cupspykota

    r1974 r2006  
    2424# 
    2525# $Log$ 
     26# Revision 1.82  2005/01/06 22:52:53  jalet 
     27# Implemented the dropping of priviledges. Beware, beware... 
     28# 
    2629# Revision 1.81  2004/12/07 16:54:02  jalet 
    2730# Now logs as errors differences between computed and precomputed job's sizes 
     
    613616            # Here we absolutely WANT to remove any filename from the command line ! 
    614617            arguments = [ "Fake this because we are printing a banner" ] + sys.argv[1:6] 
     618             
     619        self.regainPriv()     
     620         
    615621        self.logdebug("Starting real backend %s with args %s" % (realbackend, " ".join(['"%s"' % a for a in ([os.environ["DEVICE_URI"]] + arguments[1:])]))) 
    616622        subprocess = PyKotaPopen4([realbackend] + arguments[1:], bufsize=0, arg0=os.environ["DEVICE_URI"]) 
     
    818824        else :     
    819825            retcode = self.removeJob() 
     826             
     827        self.dropPriv()     
     828         
    820829        return retcode     
    821830     
  • pykota/trunk/NEWS

    r2002 r2006  
    2424    - 1.21alpha17 : 
    2525      
     26        - Now drops priviledges to user 'pykota' when launched as root 
     27          (directly or as a CUPS backend), if such an user exists. 
     28           
    2629        - Fixed PCL3/4/5 parser for some drivers' output. 
    2730         
  • pykota/trunk/pykota/tool.py

    r1977 r2006  
    2222# 
    2323# $Log$ 
     24# Revision 1.147  2005/01/06 22:52:53  jalet 
     25# Implemented the dropping of priviledges. Beware, beware... 
     26# 
    2427# Revision 1.146  2004/12/09 23:03:57  jalet 
    2528# Fixed a bug when pkbanner's output was piped into another command (e.g. gs) 
     
    575578    def __init__(self, lang="", charset=None, doc="PyKota %s (c) 2003-2004 %s" % (version.__version__, version.__author__)) : 
    576579        """Initializes the command line tool.""" 
     580        # did we drop priviledges ? 
     581        self.privdropped = 0 
     582         
    577583        # locale stuff 
    578584        defaultToCLocale = 0 
     
    611617        # try to find the configuration files in user's 'pykota' home directory. 
    612618        try : 
    613             pykotauser = pwd.getpwnam("pykota") 
     619            self.pykotauser = pwd.getpwnam("pykota") 
    614620        except KeyError :     
     621            self.pykotauser = None 
    615622            confdir = "/etc/pykota" 
    616623            missingUser = 1 
    617624        else :     
    618             confdir = pykotauser[5] 
     625            confdir = self.pykotauser[5] 
    619626            missingUser = 0 
    620627             
     
    635642            raise 
    636643             
     644        # now drop priviledge if possible 
     645        self.dropPriv()     
     646         
    637647        # We NEED this here, even when not in an accounting filter/backend     
    638648        self.softwareJobSize = 0 
     
    647657        arguments = " ".join(['"%s"' % arg for arg in sys.argv]) 
    648658        self.logdebug("Command line arguments : %s" % arguments) 
     659         
     660    def dropPriv(self) :     
     661        """Drops priviledges.""" 
     662        uid = os.geteuid() 
     663        if uid : 
     664            try : 
     665                username = pwd.getpwuid(uid)[0] 
     666            except (KeyError, IndexError), msg :     
     667                self.printInfo(_("Strange problem with uid(%s) : %s") % (uid, msg), "warn") 
     668            else : 
     669                self.logdebug(_("Running as user '%s'.") % username) 
     670        else : 
     671            if self.pykotauser is None : 
     672                self.logdebug(_("No user named 'pykota'. Not dropping priviledges.")) 
     673            else :     
     674                try : 
     675                    os.setegid(self.pykotauser[3]) 
     676                    os.seteuid(self.pykotauser[2]) 
     677                except OSError, msg :     
     678                    self.printInfo(_("Impossible to drop priviledges : %s") % msg, "warn") 
     679                else :     
     680                    self.logdebug(_("Priviledges dropped. Now running as user 'pykota'.")) 
     681                    self.privdropped = 1 
     682             
     683    def regainPriv(self) :     
     684        """Drops priviledges.""" 
     685        if self.privdropped : 
     686            try : 
     687                os.seteuid(0) 
     688                os.setegid(0) 
     689            except OSError, msg :     
     690                self.printInfo(_("Impossible to regain priviledges : %s") % msg, "warn") 
     691            else :     
     692                self.logdebug(_("Regained priviledges.")) 
     693                self.privdropped = 0 
    649694         
    650695    def getCharset(self) :