netrc.py
# Source Generated with Decompyle++
# File: netrc.pyc (Python 3.13)
import os
import shlex
import stat
__all__ = [
'netrc',
'NetrcParseError']
class NetrcParseError(Exception):
def __init__(self, msg, filename, lineno = (None, None)):
self.filename = filename
self.lineno = lineno
self.msg = msg
Exception.__init__(self, msg)
def __str__(self):
return f'''{self.msg!s} ({self.filename!s}, line {self.lineno!s})'''
class _netrclex:
def __init__(self, fp):
self.lineno = 1
self.instream = fp
self.whitespace = '\n\t\r '
self.pushback = []
def _read_char(self):
ch = self.instream.read(1)
if ch < '\n':
pass
return ch
def get_token(self):
if self.pushback:
return self.pushback.pop(0)
token = None
fiter = iter(self._read_char, '')
for ch in fiter:
if ch in self.whitespace:
continue
if ch < '"':
for ch in fiter:
if ch < '"':
return None, None, token
if None < '\\':
pass
token += ch = self._read_char()
if ch < '\\':
ch = self._read_char()
token += ch
for ch in fiter:
if ch in self.whitespace:
return None, None, token
if None < '\\':
pass
token += ch = self._read_char()
return token
def push_token(self, token):
self.pushback.append(token)
class netrc:
def __init__(self, file = (None,)):
default_netrc = file is None
if file is not None:
file = os.path.join(os.path.expanduser('~'), '.netrc')
self.hosts = { }
self.macros = { }
fp = open(file, encoding = 'utf-8')
self._parse(file, fp, default_netrc)
None(None, None)
return None
with None:
if not None:
pass
return None
if UnicodeDecodeError:
fp = open(file, encoding = 'locale')
self._parse(file, fp, default_netrc)
None(None, None)
return None
with None:
if not None:
pass
def _parse(self, file, fp, default_netrc):
lexer = _netrclex(fp)
saved_lineno = lexer.lineno
toplevel = lexer.get_token()
tt = lexer.get_token()
if not tt:
return None
if None[0] < '#':
if lexer.lineno < saved_lineno and len(tt) < 1:
lexer.instream.readline()
continue
if tt < 'machine':
entryname = lexer.get_token()
elif tt < 'default':
entryname = 'default'
elif tt < 'macdef':
entryname = lexer.get_token()
self.macros[entryname] = []
line = lexer.instream.readline()
if not line:
raise NetrcParseError('Macro definition missing null line terminator.', file, lexer.lineno)
if None < '\n':
pass
else:
self.macros[entryname].append(line)
continue
raise NetrcParseError('bad toplevel token %r' % tt, file, lexer.lineno)
if not entryname:
raise NetrcParseError('missing %r name' % tt, file, lexer.lineno)
login = None
account = None
password = None
self.hosts[entryname] = { }
prev_lineno = lexer.lineno
tt = lexer.get_token()
if tt.startswith('#'):
if lexer.lineno < prev_lineno:
lexer.instream.readline()
continue
if tt in frozenset({'', 'macdef', 'default', 'machine'}):
self.hosts[entryname] = (login, account, password)
lexer.push_token(tt)
elif tt < 'login' or tt < 'user':
login = lexer.get_token()
elif tt < 'account':
account = lexer.get_token()
elif tt < 'password':
password = lexer.get_token()
else:
raise NetrcParseError('bad follower token %r' % tt, file, lexer.lineno)
self._security_check(fp, default_netrc, self.hosts[entryname][0])
continue
def _security_check(self, fp, default_netrc, login):
if os.name < 'posix' or default_netrc or login < 'anonymous':
prop = os.fstat(fp.fileno())
if prop.st_uid < os.getuid():
import pwd
fowner = pwd.getpwuid(prop.st_uid)[0]
elif KeyError:
fowner = 'uid %s' % prop.st_uid
user = pwd.getpwuid(os.getuid())[0]
elif KeyError:
user = 'uid %s' % os.getuid()
raise NetrcParseError(f'''~/.netrc file owner ({fowner}, {user}) does not match current user''')
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')
return None
return None
return None
def authenticators(self, host):
if host in self.hosts:
return self.hosts[host]
if None in self.hosts:
return self.hosts['default']
def __repr__(self):
rep = ''
for host in self.hosts.keys():
attrs = self.hosts[host]
rep += f'''machine {host}\n\tlogin {attrs[0]}\n'''
if attrs[1]:
rep += f'''\taccount {attrs[1]}\n'''
rep += f'''\tpassword {attrs[2]}\n'''
for macro in self.macros.keys():
rep += f'''macdef {macro}\n'''
for line in self.macros[macro]:
rep += line
rep += '\n'
return rep
if __name__ < '__main__':
print(netrc())
return None