comparison mercurial/ui.py @ 3537:3b07e223534b

Only read .hg/hgrc files from trusted users/groups The list of trusted users and groups is specified in the [trusted] section of a hgrc; the current user is always trusted; "*" can be used to trust all users/groups. Global hgrc files are always read. On Windows (and other systems that don't have the pwd and grp modules), all .hg/hgrc files are read. This is essentially the same patch that was previously applied as revision 494521a3f142.
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Thu, 26 Oct 2006 19:25:44 +0200
parents c3345b0f2fcd
children 9b52239dc740
comparison
equal deleted inserted replaced
3536:ef80b13df85a 3537:3b07e223534b
37 self.quiet = quiet 37 self.quiet = quiet
38 self.verbose = verbose 38 self.verbose = verbose
39 self.debugflag = debug 39 self.debugflag = debug
40 self.interactive = interactive 40 self.interactive = interactive
41 self.traceback = traceback 41 self.traceback = traceback
42 self.trusted_users = {}
43 self.trusted_groups = {}
42 self.cdata = util.configparser() 44 self.cdata = util.configparser()
43 self.readconfig(util.rcpath()) 45 self.readconfig(util.rcpath())
44 self.updateopts(verbose, debug, quiet, interactive) 46 self.updateopts(verbose, debug, quiet, interactive)
45 else: 47 else:
46 # parentui may point to an ui object which is already a child 48 # parentui may point to an ui object which is already a child
47 self.parentui = parentui.parentui or parentui 49 self.parentui = parentui.parentui or parentui
48 self.readhooks = self.parentui.readhooks[:] 50 self.readhooks = self.parentui.readhooks[:]
51 self.trusted_users = parentui.trusted_users.copy()
52 self.trusted_groups = parentui.trusted_groups.copy()
49 self.cdata = dupconfig(self.parentui.cdata) 53 self.cdata = dupconfig(self.parentui.cdata)
50 if self.parentui.overlay: 54 if self.parentui.overlay:
51 self.overlay = dupconfig(self.parentui.overlay) 55 self.overlay = dupconfig(self.parentui.overlay)
52 56
53 def __getattr__(self, key): 57 def __getattr__(self, key):
80 self.verbose = True 84 self.verbose = True
81 self.quiet = False 85 self.quiet = False
82 elif self.verbose and self.quiet: 86 elif self.verbose and self.quiet:
83 self.quiet = self.verbose = False 87 self.quiet = self.verbose = False
84 88
89 def _is_trusted(self, fp, f, warn=True):
90 tusers = self.trusted_users
91 tgroups = self.trusted_groups
92 if (tusers or tgroups) and '*' not in tusers and '*' not in tgroups:
93 st = util.fstat(fp)
94 user = util.username(st.st_uid)
95 group = util.groupname(st.st_gid)
96 if user not in tusers and group not in tgroups:
97 if warn:
98 self.warn(_('Not reading file %s from untrusted '
99 'user %s, group %s\n') % (f, user, group))
100 return False
101 return True
102
85 def readconfig(self, fn, root=None): 103 def readconfig(self, fn, root=None):
86 if isinstance(fn, basestring): 104 if isinstance(fn, basestring):
87 fn = [fn] 105 fn = [fn]
88 for f in fn: 106 for f in fn:
89 try: 107 try:
90 self.cdata.read(f) 108 fp = open(f)
109 except IOError:
110 continue
111 if not self._is_trusted(fp, f):
112 continue
113 try:
114 self.cdata.readfp(fp, f)
91 except ConfigParser.ParsingError, inst: 115 except ConfigParser.ParsingError, inst:
92 raise util.Abort(_("Failed to parse %s\n%s") % (f, inst)) 116 raise util.Abort(_("Failed to parse %s\n%s") % (f, inst))
93 # override data from config files with data set with ui.setconfig 117 # override data from config files with data set with ui.setconfig
94 if self.overlay: 118 if self.overlay:
95 updateconfig(self.overlay, self.cdata) 119 updateconfig(self.overlay, self.cdata)
141 if name is None or name in ('quiet', 'verbose', 'debug'): 165 if name is None or name in ('quiet', 'verbose', 'debug'):
142 self.verbosity_constraints() 166 self.verbosity_constraints()
143 167
144 if name is None or name == 'interactive': 168 if name is None or name == 'interactive':
145 self.interactive = self.configbool("ui", "interactive", True) 169 self.interactive = self.configbool("ui", "interactive", True)
170
171 # update trust information
172 if section is None or section == 'trusted':
173 user = util.username()
174 if user is not None:
175 self.trusted_users[user] = 1
176 for user in self.configlist('trusted', 'users'):
177 self.trusted_users[user] = 1
178 for group in self.configlist('trusted', 'groups'):
179 self.trusted_groups[group] = 1
146 180
147 def setconfig(self, section, name, value): 181 def setconfig(self, section, name, value):
148 if not self.overlay: 182 if not self.overlay:
149 self.overlay = util.configparser() 183 self.overlay = util.configparser()
150 for cdata in (self.overlay, self.cdata): 184 for cdata in (self.overlay, self.cdata):