# drop_priviledges (from https://github.com/nigelb/Static-UPnP) # Copyright (C) 2016 NigelB # Copyright (C) 2018 Scott Kitterman # # 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. def drop_privileges(milterconfig): import os import grp import pwd import syslog import dkim if os.getuid() != 0: if milterconfig.get('Syslog'): syslog.syslog('drop_privileges: Not running as root. Cannot drop permissions.') return # Figure out if user and group are specified userstr = milterconfig.get('UserID') userlist = userstr.split(':') if len(userlist) == 1: gidname = userlist[0] else: gidname = userlist[1] uidname = userlist[0] # Get the uid/gid from the name running_uid = pwd.getpwnam(uidname).pw_uid running_gid = grp.getgrnam(gidname).gr_gid # Remove group privileges os.setgroups([]) # Try setting the new uid/gid os.setgid(running_gid) os.setuid(running_uid) # Set umask old_umask = os.umask(milterconfig.get('UMask'))