summaryrefslogtreecommitdiffstats
path: root/Lib/netrc.py
diff options
context:
space:
mode:
authorR David Murray <rdmurray@bitdance.com>2013-09-16 17:48:44 (GMT)
committerR David Murray <rdmurray@bitdance.com>2013-09-16 17:48:44 (GMT)
commit4189b67a66afc7a5d4ed9ef39c9f8187d98e7909 (patch)
tree202254f086d26dabc01be2f2abb331cd996f829e /Lib/netrc.py
parent503baf9ecd2cc5fb0bb85cec99c300862c02de85 (diff)
downloadcpython-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.py23
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,