diff options
author | R David Murray <rdmurray@bitdance.com> | 2013-09-16 17:48:44 (GMT) |
---|---|---|
committer | R David Murray <rdmurray@bitdance.com> | 2013-09-16 17:48:44 (GMT) |
commit | 4189b67a66afc7a5d4ed9ef39c9f8187d98e7909 (patch) | |
tree | 202254f086d26dabc01be2f2abb331cd996f829e /Lib/netrc.py | |
parent | 503baf9ecd2cc5fb0bb85cec99c300862c02de85 (diff) | |
download | cpython-4189b67a66afc7a5d4ed9ef39c9f8187d98e7909.zip cpython-4189b67a66afc7a5d4ed9ef39c9f8187d98e7909.tar.gz cpython-4189b67a66afc7a5d4ed9ef39c9f8187d98e7909.tar.bz2 |
#14984: On POSIX, enforce permissions when reading default .netrc.
Initial patch by Bruno Piguet.
This is implemented as if a useful .netrc file could exist without passwords,
which is possible in the general case; but in fact our netrc implementation
does not support it. Fixing that issue will be an enhancement.
Diffstat (limited to 'Lib/netrc.py')
-rw-r--r-- | Lib/netrc.py | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/Lib/netrc.py b/Lib/netrc.py index 5493d77..0b4eedf 100644 --- a/Lib/netrc.py +++ b/Lib/netrc.py @@ -2,7 +2,7 @@ # Module and documentation by Eric S. Raymond, 21 Dec 1998 -import os, shlex +import os, stat, shlex, pwd __all__ = ["netrc", "NetrcParseError"] @@ -21,6 +21,7 @@ class NetrcParseError(Exception): class netrc: def __init__(self, file=None): + default_netrc = file is None if file is None: try: file = os.path.join(os.environ['HOME'], ".netrc") @@ -77,6 +78,26 @@ class netrc: elif tt == 'account': account = lexer.get_token() elif tt == 'password': + if os.name == 'posix' and default_netrc: + prop = os.fstat(fp.fileno()) + if prop.st_uid != os.getuid(): + try: + fowner = pwd.getpwuid(prop.st_uid)[0] + except KeyError: + fowner = 'uid %s' % prop.st_uid + try: + user = pwd.getpwuid(os.getuid())[0] + except KeyError: + user = 'uid %s ' % os.getuid() + raise NetrcParseError( + ("~/.netrc file owner (%s) does not match" + " current user (%s)") % (fowner, user), + file, lexer.lineno) + if (prop.st_mode & (stat.S_IRWXG | stat.S_IRWXO)): + raise NetrcParseError( + "~/.netrc access too permissive: access" + " permissions must restrict access to only" + " the owner", file, lexer.lineno) password = lexer.get_token() else: raise NetrcParseError("bad follower token %r" % tt, |